From 05d63c2c1870aed6a05d9b176f09da9e017fb0b2 Mon Sep 17 00:00:00 2001 From: Daven Quinn Date: Wed, 17 Jan 2024 01:26:02 -0600 Subject: [PATCH 1/4] remove workspace configuration --- package.json | 3 - yarn.lock | 682 +++------------------------------------------------ 2 files changed, 32 insertions(+), 653 deletions(-) diff --git a/package.json b/package.json index f0f974d9..9b6e4451 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,6 @@ "macrostrat", "macrostratigraphy" ], - "workspaces": [ - "./v2" - ], "contributors": [ { "name": "John J Czaplewski" diff --git a/yarn.lock b/yarn.lock index f11225ee..2f5cbe25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -190,25 +190,6 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:2": - version: 2.1.1 - resolution: "agent-base@npm:2.1.1" - dependencies: - extend: "npm:~3.0.0" - semver: "npm:~5.0.1" - checksum: 26c7f5f787e79e9595880572cdce72b611675c640881271c95ae8f19e6da07f310319d5cdb8839c446235f1f65a088a625c0fdf9b3f29c9e4eb6eccb113dd420 - languageName: node - linkType: hard - -"agent-base@npm:4, agent-base@npm:^4.1.0, agent-base@npm:^4.2.0, agent-base@npm:^4.3.0": - version: 4.3.0 - resolution: "agent-base@npm:4.3.0" - dependencies: - es6-promisify: "npm:^5.0.0" - checksum: a618d4e4ca7c0c2023b2664346570773455c501a930718764f65016a8a9eea6d2ab5ba54255589e46de529bab4026a088523dce17f94e34ba385af1f644febe1 - languageName: node - linkType: hard - "agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": version: 7.1.0 resolution: "agent-base@npm:7.1.0" @@ -333,15 +314,6 @@ __metadata: languageName: node linkType: hard -"ast-types@npm:0.x.x": - version: 0.16.1 - resolution: "ast-types@npm:0.16.1" - dependencies: - tslib: "npm:^2.0.1" - checksum: abcc49e42eb921a7ebc013d5bec1154651fb6dbc3f497541d488859e681256901b2990b954d530ba0da4d0851271d484f7057d5eff5e07cb73e8b10909f711bf - languageName: node - linkType: hard - "async@npm:1.5.2": version: 1.5.2 resolution: "async@npm:1.5.2" @@ -356,15 +328,6 @@ __metadata: languageName: node linkType: hard -"async@npm:~2.6.0": - version: 2.6.4 - resolution: "async@npm:2.6.4" - dependencies: - lodash: "npm:^4.17.14" - checksum: 0ebb3273ef96513389520adc88e0d3c45e523d03653cc9b66f5c46f4239444294899bfd13d2b569e7dbfde7da2235c35cf5fd3ece9524f935d41bbe4efccdad0 - languageName: node - linkType: hard - "async@npm:~3.2.0": version: 3.2.5 resolution: "async@npm:3.2.5" @@ -498,16 +461,6 @@ __metadata: languageName: node linkType: hard -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 - languageName: node - linkType: hard - "brace-expansion@npm:^2.0.1": version: 2.0.1 resolution: "brace-expansion@npm:2.0.1" @@ -644,23 +597,6 @@ __metadata: languageName: node linkType: hard -"cli@npm:~1.0.0": - version: 1.0.1 - resolution: "cli@npm:1.0.1" - dependencies: - exit: "npm:0.1.2" - glob: "npm:^7.1.1" - checksum: 12e406248386ebcf5351c28b0c94ae0392245c3534ebd4bb67423e1999daf8d898705f654eb70738d9870997d981aef3929d2db3aba3ea95a24380092a94b786 - languageName: node - linkType: hard - -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 - languageName: node - linkType: hard - "code-point-at@npm:^1.0.0": version: 1.1.0 resolution: "code-point-at@npm:1.1.0" @@ -746,13 +682,6 @@ __metadata: languageName: node linkType: hard -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - "concat-stream@npm:~1.2.1": version: 1.2.1 resolution: "concat-stream@npm:1.2.1" @@ -785,15 +714,6 @@ __metadata: languageName: node linkType: hard -"console-browserify@npm:1.1.x": - version: 1.1.0 - resolution: "console-browserify@npm:1.1.0" - dependencies: - date-now: "npm:^0.1.4" - checksum: 5d130bcb251bba45d50a857348a63356e9d0d0f268210b65928e0c8420b4d7442a87b547d6bd3d71e7439fe04902e9e211f77eac48795635f767350568b383f5 - languageName: node - linkType: hard - "console-control-strings@npm:^1.0.0, console-control-strings@npm:~1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" @@ -955,20 +875,6 @@ __metadata: languageName: node linkType: hard -"data-uri-to-buffer@npm:1": - version: 1.2.0 - resolution: "data-uri-to-buffer@npm:1.2.0" - checksum: 08d72cf3c6feae1b836f6f55d96d1ca22459b701c25a0954915d57897a20d0631511c0bfb1d730c913615a841665b2be52aeb9ab3cc23e4873ca3dc7a6282ca4 - languageName: node - linkType: hard - -"date-now@npm:^0.1.4": - version: 0.1.4 - resolution: "date-now@npm:0.1.4" - checksum: 0e0a04d91deac395dfabc6f279b1bb7fbc66816552104b8dc5a7a5c32340a79eb2e2a27c83a20b6a46c0737dd2c55bf92aa44321911ba1f03adad413ad70ee3e - languageName: node - linkType: hard - "dbgeo@npm:^1.0.1": version: 1.1.0 resolution: "dbgeo@npm:1.1.0" @@ -980,15 +886,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:2, debug@npm:2.6.9": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: "npm:2.0.0" - checksum: 121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 - languageName: node - linkType: hard - "debug@npm:2.0.0": version: 2.0.0 resolution: "debug@npm:2.0.0" @@ -998,12 +895,12 @@ __metadata: languageName: node linkType: hard -"debug@npm:3.1.0, debug@npm:~3.1.0": - version: 3.1.0 - resolution: "debug@npm:3.1.0" +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" dependencies: ms: "npm:2.0.0" - checksum: 5bff34a352d7b2eaa31886eeaf2ee534b5461ec0548315b2f9f80bd1d2533cab7df1fa52e130ce27bc31c3945fbffb0fc72baacdceb274b95ce853db89254ea4 + checksum: 121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 languageName: node linkType: hard @@ -1019,15 +916,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a - languageName: node - linkType: hard - "debug@npm:~1.0.1": version: 1.0.5 resolution: "debug@npm:1.0.5" @@ -1055,17 +943,6 @@ __metadata: languageName: node linkType: hard -"degenerator@npm:^1.0.4": - version: 1.0.4 - resolution: "degenerator@npm:1.0.4" - dependencies: - ast-types: "npm:0.x.x" - escodegen: "npm:1.x.x" - esprima: "npm:3.x.x" - checksum: 3fc7fd0c94e51a8d37d8c51bcee2d5f3090dc4c33db84195a4513a2e6b8363428050ccfb49c96a157958fd6dc35ac76daf08fe365d7dca42b4b4383845e4844e - languageName: node - linkType: hard - "delayed-stream@npm:0.0.5": version: 0.0.5 resolution: "delayed-stream@npm:0.0.5" @@ -1115,49 +992,6 @@ __metadata: languageName: node linkType: hard -"dom-serializer@npm:0": - version: 0.2.2 - resolution: "dom-serializer@npm:0.2.2" - dependencies: - domelementtype: "npm:^2.0.1" - entities: "npm:^2.0.0" - checksum: 5cb595fb77e1a23eca56742f47631e6f4af66ce1982c7ed28b3d0ef21f1f50304c067adc29d3eaf824c572be022cee88627d0ac9b929408f24e923f3c7bed37b - languageName: node - linkType: hard - -"domelementtype@npm:1": - version: 1.3.1 - resolution: "domelementtype@npm:1.3.1" - checksum: 6d4f5761060a21eaf3c96545501e9d188745c7e1c31b8d141bf15d8748feeadba868f4ea32877751b8678b286fb1afbe6ae905ca3fb8f0214d8322e482cdbec0 - languageName: node - linkType: hard - -"domelementtype@npm:^2.0.1": - version: 2.3.0 - resolution: "domelementtype@npm:2.3.0" - checksum: 686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 - languageName: node - linkType: hard - -"domhandler@npm:2.3": - version: 2.3.0 - resolution: "domhandler@npm:2.3.0" - dependencies: - domelementtype: "npm:1" - checksum: f434a1c08392821751b85081fd8ff11b17d7fd6e5da59335af87ee038b816be24d35a12f45d85034e3e137158beb031d5a3df21fcd05a7dd4490e2f01a6d0e82 - languageName: node - linkType: hard - -"domutils@npm:1.5": - version: 1.5.1 - resolution: "domutils@npm:1.5.1" - dependencies: - dom-serializer: "npm:0" - domelementtype: "npm:1" - checksum: 8707a18c974be54d33fd846d174d523ddf4955b2fcc1ec713cbe6ff490f60da22106b153fea6269332477eb81dc1a25a83f5b2afaf78b6dc9e2161fd7b80f7ba - languageName: node - linkType: hard - "double-ended-queue@npm:^2.1.0-0": version: 2.1.0-0 resolution: "double-ended-queue@npm:2.1.0-0" @@ -1228,20 +1062,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:1.0": - version: 1.0.0 - resolution: "entities@npm:1.0.0" - checksum: fd382add860bab507c942a054ef98445028bf988d16f53cbae24c70533c280d4ea116a5bc6308f6ca66901818faf4f495316f9873c6337af7cffaaf3859da407 - languageName: node - linkType: hard - -"entities@npm:^2.0.0": - version: 2.2.0 - resolution: "entities@npm:2.2.0" - checksum: 7fba6af1f116300d2ba1c5673fc218af1961b20908638391b4e1e6d5850314ee2ac3ec22d741b3a8060479911c99305164aed19b6254bde75e7e6b1b2c3f3aa3 - languageName: node - linkType: hard - "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -1256,22 +1076,6 @@ __metadata: languageName: node linkType: hard -"es6-promise@npm:^4.0.3": - version: 4.2.8 - resolution: "es6-promise@npm:4.2.8" - checksum: 2373d9c5e9a93bdd9f9ed32ff5cb6dd3dd785368d1c21e9bbbfd07d16345b3774ae260f2bd24c8f836a6903f432b4151e7816a7fa8891ccb4e1a55a028ec42c3 - languageName: node - linkType: hard - -"es6-promisify@npm:^5.0.0": - version: 5.0.0 - resolution: "es6-promisify@npm:5.0.0" - dependencies: - es6-promise: "npm:^4.0.3" - checksum: 23284c6a733cbf7842ec98f41eac742c9f288a78753c4fe46652bae826446ced7615b9e8a5c5f121a08812b1cd478ea58630f3e1c3d70835bd5dcd69c7cd75c9 - languageName: node - linkType: hard - "escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" @@ -1293,25 +1097,6 @@ __metadata: languageName: node linkType: hard -"escodegen@npm:1.x.x": - version: 1.14.3 - resolution: "escodegen@npm:1.14.3" - dependencies: - esprima: "npm:^4.0.1" - estraverse: "npm:^4.2.0" - esutils: "npm:^2.0.2" - optionator: "npm:^0.8.1" - source-map: "npm:~0.6.1" - dependenciesMeta: - source-map: - optional: true - bin: - escodegen: bin/escodegen.js - esgenerate: bin/esgenerate.js - checksum: 30d337803e8f44308c90267bf6192399e4b44792497c77a7506b68ab802ba6a48ebbe1ce77b219aba13dfd2de5f5e1c267e35be1ed87b2a9c3315e8b283e302a - languageName: node - linkType: hard - "escodegen@npm:^2.1.0": version: 2.1.0 resolution: "escodegen@npm:2.1.0" @@ -1349,7 +1134,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:3.x.x, esprima@npm:^3.1.3": +"esprima@npm:^3.1.3": version: 3.1.3 resolution: "esprima@npm:3.1.3" bin: @@ -1414,13 +1199,6 @@ __metadata: languageName: node linkType: hard -"exit@npm:0.1.2, exit@npm:0.1.x": - version: 0.1.2 - resolution: "exit@npm:0.1.2" - checksum: 71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989 - languageName: node - linkType: hard - "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -1467,13 +1245,6 @@ __metadata: languageName: node linkType: hard -"extend@npm:3, extend@npm:~3.0.0, extend@npm:~3.0.2": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: 73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 - languageName: node - linkType: hard - "extend@npm:~1.2.1": version: 1.2.1 resolution: "extend@npm:1.2.1" @@ -1481,6 +1252,13 @@ __metadata: languageName: node linkType: hard +"extend@npm:~3.0.2": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: 73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 + languageName: node + linkType: hard + "extent@npm:0.2.0": version: 0.2.0 resolution: "extent@npm:0.2.0" @@ -1533,7 +1311,7 @@ __metadata: languageName: node linkType: hard -"file-uri-to-path@npm:1, file-uri-to-path@npm:1.0.0": +"file-uri-to-path@npm:1.0.0": version: 1.0.0 resolution: "file-uri-to-path@npm:1.0.0" checksum: 3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519 @@ -1597,7 +1375,7 @@ __metadata: languageName: node linkType: hard -"form-data@npm:~2.3.0, form-data@npm:~2.3.2": +"form-data@npm:~2.3.2": version: 2.3.3 resolution: "form-data@npm:2.3.3" dependencies: @@ -1647,23 +1425,6 @@ __metadata: languageName: node linkType: hard -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 - languageName: node - linkType: hard - -"ftp@npm:~0.3.10": - version: 0.3.10 - resolution: "ftp@npm:0.3.10" - dependencies: - readable-stream: "npm:1.1.x" - xregexp: "npm:2.0.0" - checksum: bd541fc3e34796cb6fd9749312d4336779ded1edc4b4b82441c211a998da19b8f22a80101685ca128e40ccd33faa9429c22bfd638e2ae1c3b8f1b2f91c2ed719 - languageName: node - linkType: hard - "function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" @@ -1777,20 +1538,6 @@ __metadata: languageName: node linkType: hard -"get-uri@npm:^2.0.0": - version: 2.0.4 - resolution: "get-uri@npm:2.0.4" - dependencies: - data-uri-to-buffer: "npm:1" - debug: "npm:2" - extend: "npm:~3.0.2" - file-uri-to-path: "npm:1" - ftp: "npm:~0.3.10" - readable-stream: "npm:2" - checksum: af4e3bd09d736843ab306e97df162897ed154c8c45bdf2fd105b89dba2d58f526db5b88351a51b1d02eca715df10b128471ad3738c1977046ebb53f855978a3b - languageName: node - linkType: hard - "getpass@npm:^0.1.1": version: 0.1.7 resolution: "getpass@npm:0.1.7" @@ -1826,20 +1573,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.1": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe - languageName: node - linkType: hard - "gopd@npm:^1.0.1": version: 1.0.1 resolution: "gopd@npm:1.0.1" @@ -1940,19 +1673,6 @@ __metadata: languageName: node linkType: hard -"htmlparser2@npm:3.8.x": - version: 3.8.3 - resolution: "htmlparser2@npm:3.8.3" - dependencies: - domelementtype: "npm:1" - domhandler: "npm:2.3" - domutils: "npm:1.5" - entities: "npm:1.0" - readable-stream: "npm:1.1" - checksum: 253a673976c1e2c2b8429e45830a5a89c3f23bb6dd34f5958aefbb104a8caf1268515b535277714deb034d894aa0bd315e901cbf2ec906e8ed0d1e49b2d73b3e - languageName: node - linkType: hard - "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -1973,27 +1693,6 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:1": - version: 1.0.0 - resolution: "http-proxy-agent@npm:1.0.0" - dependencies: - agent-base: "npm:2" - debug: "npm:2" - extend: "npm:3" - checksum: 3862d5b67f1769819612578e753c9f4507b70633903f4580ecf62e065b6d30c04ace35b500ca99e822f68019a7e91e4a685e6231c1d5ec3acf10eb71b165358d - languageName: node - linkType: hard - -"http-proxy-agent@npm:^2.1.0": - version: 2.1.0 - resolution: "http-proxy-agent@npm:2.1.0" - dependencies: - agent-base: "npm:4" - debug: "npm:3.1.0" - checksum: 526294de33953bacb21b883d8bbc01a82e1e9f5a721785345dd538b15b62c7a5d4080b729eb3177ad15d842f931f44002431d5cf9b036cc8cea4bfb5ec172228 - languageName: node - linkType: hard - "http-proxy-agent@npm:^7.0.0": version: 7.0.0 resolution: "http-proxy-agent@npm:7.0.0" @@ -2022,27 +1721,6 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:1": - version: 1.0.0 - resolution: "https-proxy-agent@npm:1.0.0" - dependencies: - agent-base: "npm:2" - debug: "npm:2" - extend: "npm:3" - checksum: 37591c9768a3dfb6dfa08089e676dd941cadf5d9974c34801265e0af916e057e7366faef3fbfef2cd7309079b46c8d3d5ae7ea5fe2fa9b4131a46d059e2339a8 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^2.2.1": - version: 2.2.4 - resolution: "https-proxy-agent@npm:2.2.4" - dependencies: - agent-base: "npm:^4.3.0" - debug: "npm:^3.1.0" - checksum: 4bdde8fcd9ea0adc4a77282de2b4f9e27955e0441425af0f27f0fe01006946b80eaee6749e08e838d350c06ed2ebd5d11347d3beb88c45eacb0667e27276cdad - languageName: node - linkType: hard - "https-proxy-agent@npm:^7.0.1": version: 7.0.2 resolution: "https-proxy-agent@npm:7.0.2" @@ -2108,30 +1786,6 @@ __metadata: languageName: node linkType: hard -"inflection@npm:~1.12.0": - version: 1.12.0 - resolution: "inflection@npm:1.12.0" - checksum: a5e92f4399f879a4cd92f30c13af6a8a0f4e793073f0e82599d12d9e4200c011348c3cd4e8b1894c774f896e697db78fa04babe754492d2cb00c2d27b3edaa2b - languageName: node - linkType: hard - -"inflection@npm:~1.3.0": - version: 1.3.8 - resolution: "inflection@npm:1.3.8" - checksum: d1226f3e0e351e9282c657909856224d9e1660c6e0c76fabb942e54994d9fb7db237e050f0d54b9e290d527f0d467c94b8dabf75e5252a14805571f873c13670 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 - languageName: node - linkType: hard - "inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:~2.0.1, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" @@ -2139,13 +1793,6 @@ __metadata: languageName: node linkType: hard -"ip@npm:^1.1.4, ip@npm:^1.1.5": - version: 1.1.8 - resolution: "ip@npm:1.1.8" - checksum: ab32a5ecfa678d4c158c1381c4c6744fce89a1d793e1b6635ba79d0753c069030b672d765887b6fff55670c711dfa47475895e5d6013efbbcf04687c51cb8db9 - languageName: node - linkType: hard - "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" @@ -2192,13 +1839,6 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^1.1.0": - version: 1.1.0 - resolution: "is-stream@npm:1.1.0" - checksum: b8ae7971e78d2e8488d15f804229c6eed7ed36a28f8807a1815938771f4adff0e705218b7dab968270433f67103e4fef98062a0beea55d64835f705ee72c7002 - languageName: node - linkType: hard - "is-typedarray@npm:~1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" @@ -2287,23 +1927,6 @@ __metadata: languageName: node linkType: hard -"jshint@npm:^2.9.2": - version: 2.13.6 - resolution: "jshint@npm:2.13.6" - dependencies: - cli: "npm:~1.0.0" - console-browserify: "npm:1.1.x" - exit: "npm:0.1.x" - htmlparser2: "npm:3.8.x" - lodash: "npm:~4.17.21" - minimatch: "npm:~3.0.2" - strip-json-comments: "npm:1.0.x" - bin: - jshint: bin/jshint - checksum: ce2db8c705a7b93ffe2957fcbc6aa9dd95d37a6cd9c58643033d99157d0ca68ef559d74b29033ae14967db38650efb67d9423d0ed010543265dc8300c8218e0f - languageName: node - linkType: hard - "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -2374,14 +1997,14 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.14, lodash@npm:~4.17.20, lodash@npm:~4.17.21": +"lodash@npm:~4.17.20": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c languageName: node linkType: hard -"lru-cache@npm:2, lru-cache@npm:^2.7.0": +"lru-cache@npm:2": version: 2.7.3 resolution: "lru-cache@npm:2.7.3" checksum: 699702a9e374fd48cb507c55ecf655409337b3f6356a78e620e64e34c675bd988377fd4e3bb1db6e05a03b10e1758ba55877ca90a01c8d7ab2bea05cc49190d8 @@ -2404,13 +2027,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:~2.6.5": - version: 2.6.5 - resolution: "lru-cache@npm:2.6.5" - checksum: f628a14b24018cd23f525ab3dd52e738bf8e90b8022cd3b10e9d12d00a94d851b08a2f0ff4b946722774ea3798bfa5a3932b0ef698326cc161814de67988cb59 - languageName: node - linkType: hard - "macrostrat-api@workspace:.": version: 0.0.0-use.local resolution: "macrostrat-api@workspace:." @@ -2427,13 +2043,9 @@ __metadata: filesize-parser: "npm:^1.3.0" geojson-precision: "npm:^0.4.0" image-size: "npm:^0.5.0" - jshint: "npm:^2.9.2" - lru-cache: "npm:^2.7.0" - mailgun-js: "npm:^0.14.2" mapshaper: "npm:^0.3.20" memory-cache: "npm:^0.1.4" microtime: "npm:^3.0.0" - mkdirp: "npm:^0.5.1" mocha: "npm:^1.21.4" multiline: "npm:^1.0.2" mysql: "npm:2.7.x" @@ -2467,23 +2079,6 @@ __metadata: languageName: node linkType: hard -"mailgun-js@npm:^0.14.2": - version: 0.14.2 - resolution: "mailgun-js@npm:0.14.2" - dependencies: - async: "npm:~2.6.0" - debug: "npm:~3.1.0" - form-data: "npm:~2.3.0" - inflection: "npm:~1.12.0" - is-stream: "npm:^1.1.0" - path-proxy: "npm:~1.0.0" - promisify-call: "npm:^2.0.2" - proxy-agent: "npm:~2.1.0" - tsscmp: "npm:~1.0.0" - checksum: fc19c6f594f2be6395863367c0ae822ac63a13b7fde12301368a2aa222924e6286ecb6396036a4ae6a457d7ca0680407e83468e25976a9784276e6607d8638c0 - languageName: node - linkType: hard - "make-fetch-happen@npm:^13.0.0": version: 13.0.0 resolution: "make-fetch-happen@npm:13.0.0" @@ -2622,15 +2217,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.1.1": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 - languageName: node - linkType: hard - "minimatch@npm:^9.0.1": version: 9.0.3 resolution: "minimatch@npm:9.0.3" @@ -2650,15 +2236,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:~3.0.2": - version: 3.0.8 - resolution: "minimatch@npm:3.0.8" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 72b226f452dcfb5075255f53534cb83fc25565b909e79b9be4fad463d735cb1084827f7013ff41d050e77ee6e474408c6073473edd2fb72c2fd630cfb0acc6ad - languageName: node - linkType: hard - "minimist@npm:0.0.5": version: 0.0.5 resolution: "minimist@npm:0.0.5" @@ -2680,7 +2257,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.1.3, minimist@npm:^1.2.6": +"minimist@npm:^1.1.3": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -2803,17 +2380,6 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.1": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: "npm:^1.2.6" - bin: - mkdirp: bin/cmd.js - checksum: e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 - languageName: node - linkType: hard - "mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -2876,7 +2442,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.1.1": +"ms@npm:2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 @@ -2919,13 +2485,6 @@ __metadata: languageName: node linkType: hard -"netmask@npm:^1.0.6": - version: 1.0.6 - resolution: "netmask@npm:1.0.6" - checksum: 79d9a7e1b2081c39cc68c1c26e177d7c78544a5d5e896f0908f5eaadcdfa6663f71b740613f771067ec233c829894a6471267cd24a10038f01dfac94d2908c64 - languageName: node - linkType: hard - "node-addon-api@npm:^5.0.0": version: 5.1.0 resolution: "node-addon-api@npm:5.1.0" @@ -3042,15 +2601,6 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 - languageName: node - linkType: hard - "one-time@npm:0.0.x": version: 0.0.4 resolution: "one-time@npm:0.0.4" @@ -3107,35 +2657,6 @@ __metadata: languageName: node linkType: hard -"pac-proxy-agent@npm:^2.0.0": - version: 2.0.2 - resolution: "pac-proxy-agent@npm:2.0.2" - dependencies: - agent-base: "npm:^4.2.0" - debug: "npm:^3.1.0" - get-uri: "npm:^2.0.0" - http-proxy-agent: "npm:^2.1.0" - https-proxy-agent: "npm:^2.2.1" - pac-resolver: "npm:^3.0.0" - raw-body: "npm:^2.2.0" - socks-proxy-agent: "npm:^3.0.0" - checksum: a5934f384548afb880c152bd2540639f5bd4913da393e564bc08df919a378094cee0b480322d481ee3f167f03deea05cdbecceee08879e3591b204a1620c459d - languageName: node - linkType: hard - -"pac-resolver@npm:^3.0.0": - version: 3.0.0 - resolution: "pac-resolver@npm:3.0.0" - dependencies: - co: "npm:^4.6.0" - degenerator: "npm:^1.0.4" - ip: "npm:^1.1.5" - netmask: "npm:^1.0.6" - thunkify: "npm:^2.1.2" - checksum: 67d7a538c53f2cd53d0a0f3289eec92992fa61fae086ecda53b144af81b99fed570a86c66dfbe6c9c6428cb1c980fa10d6d31bc457b5c36f1548b029077dd999 - languageName: node - linkType: hard - "packet-reader@npm:1.0.0": version: 1.0.0 resolution: "packet-reader@npm:1.0.0" @@ -3150,13 +2671,6 @@ __metadata: languageName: node linkType: hard -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -3171,15 +2685,6 @@ __metadata: languageName: node linkType: hard -"path-proxy@npm:~1.0.0": - version: 1.0.0 - resolution: "path-proxy@npm:1.0.0" - dependencies: - inflection: "npm:~1.3.0" - checksum: 38423449d82d2a170fae0b730a5151ca1fbe1a282b64c39bbf5f030d65165ff9d4253e09ccdbd15fd3f95b53644d8c6ceffd638ce4692df3da3ea306da498e88 - languageName: node - linkType: hard - "path-scurry@npm:^1.10.1": version: 1.10.1 resolution: "path-scurry@npm:1.10.1" @@ -3395,15 +2900,6 @@ __metadata: languageName: node linkType: hard -"promisify-call@npm:^2.0.2": - version: 2.0.4 - resolution: "promisify-call@npm:2.0.4" - dependencies: - with-callback: "npm:^1.0.2" - checksum: a7aeaf950a9cd05ddb47cf89044e996e4ddc3f706702458f2556cc3db23d93cd53c056fc0f1aa40b7e470735bbdec07f0fd8c5ecaced3ba15a40b6188d1ec43b - languageName: node - linkType: hard - "proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" @@ -3414,22 +2910,6 @@ __metadata: languageName: node linkType: hard -"proxy-agent@npm:~2.1.0": - version: 2.1.0 - resolution: "proxy-agent@npm:2.1.0" - dependencies: - agent-base: "npm:2" - debug: "npm:2" - extend: "npm:3" - http-proxy-agent: "npm:1" - https-proxy-agent: "npm:1" - lru-cache: "npm:~2.6.5" - pac-proxy-agent: "npm:^2.0.0" - socks-proxy-agent: "npm:2" - checksum: 5bb0f119595a6dce9995ff2567dbc0082ea884df1ead55a7a6528d2757c213454c1f2e801dfc3c8535d0db2933b00e477d0d462ba54b1fa4ab9857a259e40acc - languageName: node - linkType: hard - "psl@npm:^1.1.28": version: 1.9.0 resolution: "psl@npm:1.9.0" @@ -3499,7 +2979,7 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.5.2, raw-body@npm:^2.2.0": +"raw-body@npm:2.5.2": version: 2.5.2 resolution: "raw-body@npm:2.5.2" dependencies: @@ -3542,19 +3022,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:1.1, readable-stream@npm:1.1.x, readable-stream@npm:~1.1.13": - version: 1.1.14 - resolution: "readable-stream@npm:1.1.14" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.1" - isarray: "npm:0.0.1" - string_decoder: "npm:~0.10.x" - checksum: b7f41b16b305103d598e3c8964fa30d52d6e0b5d9fdad567588964521691c24b279c7a8bb71f11927c3613acf355bac72d8396885a43d50425b2caafd49bc83d - languageName: node - linkType: hard - -"readable-stream@npm:2, readable-stream@npm:^2.0.2, readable-stream@npm:^2.0.6, readable-stream@npm:^2.2.2, readable-stream@npm:~2.3.3, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.2, readable-stream@npm:^2.0.6, readable-stream@npm:^2.2.2, readable-stream@npm:~2.3.3, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -3569,6 +3037,18 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:~1.1.13": + version: 1.1.14 + resolution: "readable-stream@npm:1.1.14" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.1" + isarray: "npm:0.0.1" + string_decoder: "npm:~0.10.x" + checksum: b7f41b16b305103d598e3c8964fa30d52d6e0b5d9fdad567588964521691c24b279c7a8bb71f11927c3613acf355bac72d8396885a43d50425b2caafd49bc83d + languageName: node + linkType: hard + "readable-stream@npm:~2.0.0": version: 2.0.6 resolution: "readable-stream@npm:2.0.6" @@ -3751,15 +3231,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:~5.0.1": - version: 5.0.3 - resolution: "semver@npm:5.0.3" - bin: - semver: ./bin/semver - checksum: a8e0704b0f093e6970635a332c91569e87ba57731b4530bb37fc2145cc578d77abd8570c938b84d5ae9f0a4368bb5b71e64a0ccaaab54dd4c5b9769098dbd2f8 - languageName: node - linkType: hard - "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -3939,13 +3410,6 @@ __metadata: languageName: node linkType: hard -"smart-buffer@npm:^1.0.13": - version: 1.1.15 - resolution: "smart-buffer@npm:1.1.15" - checksum: a18747ce19b2eac27e2573abf0f2b375393c63b7945dc80e0a789bcdab0e9ee64bc8191518af46b90a93b4b2a5c4e7a322b50ba7b7314a852df26dd90e6a0f1d - languageName: node - linkType: hard - "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -3953,27 +3417,6 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:2": - version: 2.1.1 - resolution: "socks-proxy-agent@npm:2.1.1" - dependencies: - agent-base: "npm:2" - extend: "npm:3" - socks: "npm:~1.1.5" - checksum: e25585a607bf1f1bf32ee93e768afee4c5ca7f443d32cd3c9e5eeb01e46bdb9f48aa9adf4321a9bf61016de79824fafdb57debfbae9513207b17bc2c468a6a1b - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^3.0.0": - version: 3.0.1 - resolution: "socks-proxy-agent@npm:3.0.1" - dependencies: - agent-base: "npm:^4.1.0" - socks: "npm:^1.1.10" - checksum: a39cf14b937df5f9124b1ee7ee8bc2ae19122c97cb8bb772c2446d6ccb7f1cf6224b9e4fa3ed7927615c4dfb867eef8e7046e5f0c853b32019e53d7d599efde2 - languageName: node - linkType: hard - "socks-proxy-agent@npm:^8.0.1": version: 8.0.2 resolution: "socks-proxy-agent@npm:8.0.2" @@ -3985,16 +3428,6 @@ __metadata: languageName: node linkType: hard -"socks@npm:^1.1.10, socks@npm:~1.1.5": - version: 1.1.10 - resolution: "socks@npm:1.1.10" - dependencies: - ip: "npm:^1.1.4" - smart-buffer: "npm:^1.0.13" - checksum: 8ef5d87ece715baf9d66fb545e07862ebc6304ea819844b49316e95c39cd9a9082629d447214da8cd09ddf6230949aea02cf8252c47510e8d636c40a6d19a6df - languageName: node - linkType: hard - "socks@npm:^2.7.1": version: 2.7.1 resolution: "socks@npm:2.7.1" @@ -4190,15 +3623,6 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:1.0.x": - version: 1.0.4 - resolution: "strip-json-comments@npm:1.0.4" - bin: - strip-json-comments: cli.js - checksum: 8388f352771ea508977f519758cc725670710e388ca24333bf61c7aaf073f40d99961b6b802432787ea5e5e2bf7dcbca9c391d6d7c5774f17495bf567ba08df4 - languageName: node - linkType: hard - "superagent@npm:0.19.0": version: 0.19.0 resolution: "superagent@npm:0.19.0" @@ -4275,13 +3699,6 @@ __metadata: languageName: node linkType: hard -"thunkify@npm:^2.1.2": - version: 2.1.2 - resolution: "thunkify@npm:2.1.2" - checksum: ad961d8322843a3d262935f8508e65b5f478dc37dbf31a1ad7292949921d27996af44485b0e8c7aaa00e0b901c87690da66f6297c1569fae1709cfb9476b716e - languageName: node - linkType: hard - "tick-tock@npm:1.0.x": version: 1.0.0 resolution: "tick-tock@npm:1.0.0" @@ -4379,20 +3796,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb - languageName: node - linkType: hard - -"tsscmp@npm:~1.0.0": - version: 1.0.6 - resolution: "tsscmp@npm:1.0.6" - checksum: 2f79a9455e7e3e8071995f98cdf3487ccfc91b760bec21a9abb4d90519557eafaa37246e87c92fa8bf3fef8fd30cfd0cc3c4212bb929baa9fb62494bfa4d24b2 - languageName: node - linkType: hard - "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -4673,13 +4076,6 @@ __metadata: languageName: node linkType: hard -"with-callback@npm:^1.0.2": - version: 1.0.2 - resolution: "with-callback@npm:1.0.2" - checksum: 9edf039294ac524e0a096d4ef763ede22c421f581750eeeb4b245486b11ace21a75c7cf495a500e70fbfb0cf3a8fa3f311a5cc88cae580db5dd4527a330a70b4 - languageName: node - linkType: hard - "wkx@npm:~0.2.0": version: 0.2.0 resolution: "wkx@npm:0.2.0" @@ -4723,20 +4119,6 @@ __metadata: languageName: node linkType: hard -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 - languageName: node - linkType: hard - -"xregexp@npm:2.0.0": - version: 2.0.0 - resolution: "xregexp@npm:2.0.0" - checksum: 0a5f9134fad3f4d5bffce55eb8e4f00a20e29ad4d0355bf5579e7c5a386355d39e896d4bc941b4b19ea4a04f388980f05ef96cf33574961ba82416ffae78ad65 - languageName: node - linkType: hard - "xtend@npm:^4.0.0, xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" From a47e64bbbb3653a38d395bb014f560a02fe80a38 Mon Sep 17 00:00:00 2001 From: Daven Quinn Date: Wed, 17 Jan 2024 02:42:44 -0600 Subject: [PATCH 2/4] Change everything to TypeScript --- .dockerignore | 2 +- .gitignore | 6 +- ...tials.example.js => credentials.example.ts | 2 +- package.json | 9 +- server.js => server.ts | 2 +- tsconfig.json | 6 + v2/{age_model.js => age_model.ts} | 0 v2/{api.js => api.ts} | 0 v2/{boundaries.js => boundaries.ts} | 0 ...wellTileServer.js => burwellTileServer.ts} | 0 v2/carto/{index.js => index.ts} | 0 v2/carto/{small.js => small.ts} | 0 v2/{catchall.js => catchall.ts} | 0 ...che-refresh.js => column-cache-refresh.ts} | 0 v2/{columns.js => columns.ts} | 0 ...ials.example.js => credentials.example.ts} | 0 v2/{credentials.js => credentials.ts} | 2 +- .../{autocomplete.js => autocomplete.ts} | 2 +- v2/definitions/{columns.js => columns.ts} | 0 v2/definitions/{define.js => define.ts} | 0 .../{drilling_sites.js => drilling_sites.ts} | 0 v2/definitions/{econs.js => econs.ts} | 0 .../{environments.js => environments.ts} | 0 .../{grainsizes.js => grainsizes.ts} | 0 v2/definitions/{groups.js => groups.ts} | 0 v2/definitions/{index.js => index.ts} | 0 v2/definitions/{intervals.js => intervals.ts} | 0 v2/definitions/{languages.js => languages.ts} | 0 .../{lithologies.js => lithologies.ts} | 0 ..._attributes.js => lithology_attributes.ts} | 0 ...ment_sources.js => measurement_sources.ts} | 0 .../{measurements.js => measurements.ts} | 0 v2/definitions/{minerals.js => minerals.ts} | 0 v2/definitions/{plates.js => plates.ts} | 0 v2/definitions/{projects.js => projects.ts} | 0 v2/definitions/{refs.js => refs.ts} | 0 v2/definitions/{sources.js => sources.ts} | 0 ...ame_concepts.js => strat_name_concepts.ts} | 0 .../{strat_names.js => strat_names.ts} | 0 .../{structures.js => structures.ts} | 0 .../{timescales.js => timescales.ts} | 0 v2/{defs.js => defs.ts} | 0 v2/editing/{editing.js => editing.ts} | 0 v2/editing/{map.js => map.ts} | 0 v2/editing/{map_update.js => map_update.ts} | 0 v2/editing/{section.js => section.ts} | 0 .../{units_update.js => units_update.ts} | 0 v2/{elevation.js => elevation.ts} | 0 v2/{eodp.js => eodp.ts} | 0 v2/{fossils.js => fossils.ts} | 0 ...s_burwell.js => geologic_units_burwell.ts} | 0 ...nd.js => geologic_units_burwell_legend.ts} | 0 ...by.js => geologic_units_burwell_nearby.ts} | 0 ...ts.js => geologic_units_burwell_points.ts} | 0 ...c_units_gmna.js => geologic_units_gmna.ts} | 0 ...c_units_gmus.js => geologic_units_gmus.ts} | 0 v2/grids/{index.js => index.ts} | 0 v2/grids/{latitude.js => latitude.ts} | 0 v2/grids/{lithologies.js => lithologies.ts} | 0 v2/grids/{longitude.js => longitude.ts} | 0 v2/{hex_summary.js => hex_summary.ts} | 0 v2/{hex_summary_max.js => hex_summary_max.ts} | 0 v2/{hillshade.js => hillshade.ts} | 0 v2/{hillshadeCache.js => hillshadeCache.ts} | 0 v2/{index.js => index.ts} | 2 +- v2/{larkin.js => larkin.ts} | 21 +- v2/{measurements.js => measurements.ts} | 0 v2/{meta.js => meta.ts} | 0 .../{autocomplete.js => autocomplete.ts} | 0 v2/mobile/{dashboard.js => dashboard.ts} | 0 ...l_collections.js => fossil_collections.ts} | 0 v2/mobile/{index.js => index.ts} | 0 .../{macro_summary.js => macro_summary.ts} | 0 v2/mobile/{map_filter.js => map_filter.ts} | 0 v2/mobile/{map_query.js => map_query.ts} | 0 .../{map_query_v2.js => map_query_v2.ts} | 0 v2/mobile/{point.js => point.ts} | 0 .../{point_details.js => point_details.ts} | 0 v2/{paleogeography.js => paleogeography.ts} | 0 v2/{places.js => places.ts} | 0 v2/{root.js => root.ts} | 0 v2/{sections.js => sections.ts} | 0 v2/{stats.js => stats.ts} | 0 v2/test/{settings.js => settings.ts} | 0 v2/test/{test.js => test.ts} | 0 .../{carto_small.js => carto_small.ts} | 0 v2/test/v2Tests/{columns.js => columns.ts} | 0 v2/test/v2Tests/{defs.js => defs.ts} | 0 .../{defs_columns.js => defs_columns.ts} | 0 .../v2Tests/{defs_econs.js => defs_econs.ts} | 0 ...s_environments.js => defs_environments.ts} | 0 .../{defs_groups.js => defs_groups.ts} | 0 .../{defs_intervals.js => defs_intervals.ts} | 0 ...efs_lithologies.js => defs_lithologies.ts} | 0 ...ibutes.js => defs_lithology_attributes.ts} | 0 ...s_measurements.js => defs_measurements.ts} | 0 .../{defs_minerals.js => defs_minerals.ts} | 0 .../{defs_plates.js => defs_plates.ts} | 0 .../{defs_projects.js => defs_projects.ts} | 0 .../v2Tests/{defs_refs.js => defs_refs.ts} | 0 .../{defs_sources.js => defs_sources.ts} | 0 ...oncepts.js => defs_strat_name_concepts.ts} | 0 ...efs_strat_names.js => defs_strat_names.ts} | 0 ...{defs_structures.js => defs_structures.ts} | 0 ...{defs_timescales.js => defs_timescales.ts} | 0 v2/test/v2Tests/{fossils.js => fossils.ts} | 0 ...s_burwell.js => geologic_units_burwell.ts} | 0 ...c_units_gmna.js => geologic_units_gmna.ts} | 0 ...c_units_gmus.js => geologic_units_gmus.ts} | 0 v2/test/v2Tests/{index.js => index.ts} | 0 ...cos_test_cases.js => mancos_test_cases.ts} | 0 ...ctions.js => mobile_fossil_collections.ts} | 0 ...cro_summary.js => mobile_macro_summary.ts} | 0 ...obile_map_query.js => mobile_map_query.ts} | 0 .../{mobile_point.js => mobile_point.ts} | 0 ...int_details.js => mobile_point_details.ts} | 0 .../{paleogeography.js => paleogeography.ts} | 0 v2/test/v2Tests/{root.js => root.ts} | 0 v2/test/v2Tests/{sections.js => sections.ts} | 0 v2/test/v2Tests/{stats.js => stats.ts} | 0 v2/test/v2Tests/{tiles.js => tiles.ts} | 0 v2/test/v2Tests/{units.js => units.ts} | 0 v2/test/{validators.js => validators.ts} | 0 v2/{units.js => units.ts} | 0 yarn.lock | 196 ++++++++++++++++++ 125 files changed, 220 insertions(+), 30 deletions(-) rename credentials.example.js => credentials.example.ts (98%) rename server.js => server.ts (97%) create mode 100644 tsconfig.json rename v2/{age_model.js => age_model.ts} (100%) rename v2/{api.js => api.ts} (100%) rename v2/{boundaries.js => boundaries.ts} (100%) rename v2/{burwellTileServer.js => burwellTileServer.ts} (100%) rename v2/carto/{index.js => index.ts} (100%) rename v2/carto/{small.js => small.ts} (100%) rename v2/{catchall.js => catchall.ts} (100%) rename v2/{column-cache-refresh.js => column-cache-refresh.ts} (100%) rename v2/{columns.js => columns.ts} (100%) rename v2/{credentials.example.js => credentials.example.ts} (100%) rename v2/{credentials.js => credentials.ts} (90%) rename v2/definitions/{autocomplete.js => autocomplete.ts} (98%) rename v2/definitions/{columns.js => columns.ts} (100%) rename v2/definitions/{define.js => define.ts} (100%) rename v2/definitions/{drilling_sites.js => drilling_sites.ts} (100%) rename v2/definitions/{econs.js => econs.ts} (100%) rename v2/definitions/{environments.js => environments.ts} (100%) rename v2/definitions/{grainsizes.js => grainsizes.ts} (100%) rename v2/definitions/{groups.js => groups.ts} (100%) rename v2/definitions/{index.js => index.ts} (100%) rename v2/definitions/{intervals.js => intervals.ts} (100%) rename v2/definitions/{languages.js => languages.ts} (100%) rename v2/definitions/{lithologies.js => lithologies.ts} (100%) rename v2/definitions/{lithology_attributes.js => lithology_attributes.ts} (100%) rename v2/definitions/{measurement_sources.js => measurement_sources.ts} (100%) rename v2/definitions/{measurements.js => measurements.ts} (100%) rename v2/definitions/{minerals.js => minerals.ts} (100%) rename v2/definitions/{plates.js => plates.ts} (100%) rename v2/definitions/{projects.js => projects.ts} (100%) rename v2/definitions/{refs.js => refs.ts} (100%) rename v2/definitions/{sources.js => sources.ts} (100%) rename v2/definitions/{strat_name_concepts.js => strat_name_concepts.ts} (100%) rename v2/definitions/{strat_names.js => strat_names.ts} (100%) rename v2/definitions/{structures.js => structures.ts} (100%) rename v2/definitions/{timescales.js => timescales.ts} (100%) rename v2/{defs.js => defs.ts} (100%) rename v2/editing/{editing.js => editing.ts} (100%) rename v2/editing/{map.js => map.ts} (100%) rename v2/editing/{map_update.js => map_update.ts} (100%) rename v2/editing/{section.js => section.ts} (100%) rename v2/editing/{units_update.js => units_update.ts} (100%) rename v2/{elevation.js => elevation.ts} (100%) rename v2/{eodp.js => eodp.ts} (100%) rename v2/{fossils.js => fossils.ts} (100%) rename v2/{geologic_units_burwell.js => geologic_units_burwell.ts} (100%) rename v2/{geologic_units_burwell_legend.js => geologic_units_burwell_legend.ts} (100%) rename v2/{geologic_units_burwell_nearby.js => geologic_units_burwell_nearby.ts} (100%) rename v2/{geologic_units_burwell_points.js => geologic_units_burwell_points.ts} (100%) rename v2/{geologic_units_gmna.js => geologic_units_gmna.ts} (100%) rename v2/{geologic_units_gmus.js => geologic_units_gmus.ts} (100%) rename v2/grids/{index.js => index.ts} (100%) rename v2/grids/{latitude.js => latitude.ts} (100%) rename v2/grids/{lithologies.js => lithologies.ts} (100%) rename v2/grids/{longitude.js => longitude.ts} (100%) rename v2/{hex_summary.js => hex_summary.ts} (100%) rename v2/{hex_summary_max.js => hex_summary_max.ts} (100%) rename v2/{hillshade.js => hillshade.ts} (100%) rename v2/{hillshadeCache.js => hillshadeCache.ts} (100%) rename v2/{index.js => index.ts} (99%) rename v2/{larkin.js => larkin.ts} (97%) rename v2/{measurements.js => measurements.ts} (100%) rename v2/{meta.js => meta.ts} (100%) rename v2/mobile/{autocomplete.js => autocomplete.ts} (100%) rename v2/mobile/{dashboard.js => dashboard.ts} (100%) rename v2/mobile/{fossil_collections.js => fossil_collections.ts} (100%) rename v2/mobile/{index.js => index.ts} (100%) rename v2/mobile/{macro_summary.js => macro_summary.ts} (100%) rename v2/mobile/{map_filter.js => map_filter.ts} (100%) rename v2/mobile/{map_query.js => map_query.ts} (100%) rename v2/mobile/{map_query_v2.js => map_query_v2.ts} (100%) rename v2/mobile/{point.js => point.ts} (100%) rename v2/mobile/{point_details.js => point_details.ts} (100%) rename v2/{paleogeography.js => paleogeography.ts} (100%) rename v2/{places.js => places.ts} (100%) rename v2/{root.js => root.ts} (100%) rename v2/{sections.js => sections.ts} (100%) rename v2/{stats.js => stats.ts} (100%) rename v2/test/{settings.js => settings.ts} (100%) rename v2/test/{test.js => test.ts} (100%) rename v2/test/v2Tests/{carto_small.js => carto_small.ts} (100%) rename v2/test/v2Tests/{columns.js => columns.ts} (100%) rename v2/test/v2Tests/{defs.js => defs.ts} (100%) rename v2/test/v2Tests/{defs_columns.js => defs_columns.ts} (100%) rename v2/test/v2Tests/{defs_econs.js => defs_econs.ts} (100%) rename v2/test/v2Tests/{defs_environments.js => defs_environments.ts} (100%) rename v2/test/v2Tests/{defs_groups.js => defs_groups.ts} (100%) rename v2/test/v2Tests/{defs_intervals.js => defs_intervals.ts} (100%) rename v2/test/v2Tests/{defs_lithologies.js => defs_lithologies.ts} (100%) rename v2/test/v2Tests/{defs_lithology_attributes.js => defs_lithology_attributes.ts} (100%) rename v2/test/v2Tests/{defs_measurements.js => defs_measurements.ts} (100%) rename v2/test/v2Tests/{defs_minerals.js => defs_minerals.ts} (100%) rename v2/test/v2Tests/{defs_plates.js => defs_plates.ts} (100%) rename v2/test/v2Tests/{defs_projects.js => defs_projects.ts} (100%) rename v2/test/v2Tests/{defs_refs.js => defs_refs.ts} (100%) rename v2/test/v2Tests/{defs_sources.js => defs_sources.ts} (100%) rename v2/test/v2Tests/{defs_strat_name_concepts.js => defs_strat_name_concepts.ts} (100%) rename v2/test/v2Tests/{defs_strat_names.js => defs_strat_names.ts} (100%) rename v2/test/v2Tests/{defs_structures.js => defs_structures.ts} (100%) rename v2/test/v2Tests/{defs_timescales.js => defs_timescales.ts} (100%) rename v2/test/v2Tests/{fossils.js => fossils.ts} (100%) rename v2/test/v2Tests/{geologic_units_burwell.js => geologic_units_burwell.ts} (100%) rename v2/test/v2Tests/{geologic_units_gmna.js => geologic_units_gmna.ts} (100%) rename v2/test/v2Tests/{geologic_units_gmus.js => geologic_units_gmus.ts} (100%) rename v2/test/v2Tests/{index.js => index.ts} (100%) rename v2/test/v2Tests/{mancos_test_cases.js => mancos_test_cases.ts} (100%) rename v2/test/v2Tests/{mobile_fossil_collections.js => mobile_fossil_collections.ts} (100%) rename v2/test/v2Tests/{mobile_macro_summary.js => mobile_macro_summary.ts} (100%) rename v2/test/v2Tests/{mobile_map_query.js => mobile_map_query.ts} (100%) rename v2/test/v2Tests/{mobile_point.js => mobile_point.ts} (100%) rename v2/test/v2Tests/{mobile_point_details.js => mobile_point_details.ts} (100%) rename v2/test/v2Tests/{paleogeography.js => paleogeography.ts} (100%) rename v2/test/v2Tests/{root.js => root.ts} (100%) rename v2/test/v2Tests/{sections.js => sections.ts} (100%) rename v2/test/v2Tests/{stats.js => stats.ts} (100%) rename v2/test/v2Tests/{tiles.js => tiles.ts} (100%) rename v2/test/v2Tests/{units.js => units.ts} (100%) rename v2/test/{validators.js => validators.ts} (100%) rename v2/{units.js => units.ts} (100%) diff --git a/.dockerignore b/.dockerignore index cae7a0eb..a70e4542 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,2 @@ node_modules -credentials.js +credentials.ts diff --git a/.gitignore b/.gitignore index dce7a090..e24bf4d3 100755 --- a/.gitignore +++ b/.gitignore @@ -14,9 +14,9 @@ v1/npm-debug.log v1/utilities/scripts/credentials.py -credentials.js -!v1/credentials.js -!v2/credentials.js +credentials.ts +!v1/credentials.ts +!v2/credentials.ts v2/utilities/scripts/credentials.py .DS_Store diff --git a/credentials.example.js b/credentials.example.ts similarity index 98% rename from credentials.example.js rename to credentials.example.ts index b243d09e..1487c437 100644 --- a/credentials.example.js +++ b/credentials.example.ts @@ -1,4 +1,4 @@ -// A file mirroring this structure should be placed at /code/credentials.js +// A file mirroring this structure should be placed at /code/credentials.ts // in the Docker container. exports.mysql = { diff --git a/package.json b/package.json index 9b6e4451..8f030bf7 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,10 @@ "url": "https://github.com/UW-Macrostrat/macrostrat-api.git" }, "scripts": { - "start": "node server.js", + "start": "ts-node --transpileOnly server.ts", "test": "mocha ./v2", - "defs": "node ./v2/utilities/validateDefs.js", - "build-defs": "node ./v2/utilities/getOutputFields.js", + "defs": "ts-node --transpileOnly ./v2/utilities/validateDefs.ts", + "build-defs": "ts-node --transpileOnly ./v2/utilities/getOutputFields.ts", "build-changes": "grip ./v2/CHANGELOG.md --export ./v2/changes.html" }, "keywords": [ @@ -34,6 +34,7 @@ "@mapbox/polyline": "^0.2.0", "@turf/buffer": "^4.6.1", "@turf/envelope": "^4.6.0", + "@types/node": "^20.11.5", "async": "1.5.2", "body-parser": "^1.6.3", "brute-force-equal-area": "git+https://github.com/UW-Macrostrat/brute-force-equal-area.git", @@ -55,10 +56,12 @@ "tilestrata": "^2.0.1", "tilestrata-dependency": "^0.4.0", "topojson": "^1.6.19", + "ts-node": "^10.9.2", "turf-area": "^1.1.1", "turf-buffer": "^1.0.4", "turf-point": "^0.1.6", "turf-voronoi": "git+https://github.com/Turfjs/turf-voronoi.git", + "typescript": "^5.3.3", "underscore": "^1.8.3", "universal-analytics": "^0.4.6", "wellknown": "^0.3.0" diff --git a/server.js b/server.ts similarity index 97% rename from server.js rename to server.ts index edb4582a..17d3f468 100755 --- a/server.js +++ b/server.ts @@ -47,7 +47,7 @@ app.use("/", v2); app.set("json spaces", 2); -app.port = process.argv[2] || 5000; +app.port = process.argv[2] || 5550; app.start = function() { app.listen(app.port, function() { diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..e86aca0a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "moduleResolution": "NodeNext", + "module": "NodeNext" + } +} \ No newline at end of file diff --git a/v2/age_model.js b/v2/age_model.ts similarity index 100% rename from v2/age_model.js rename to v2/age_model.ts diff --git a/v2/api.js b/v2/api.ts similarity index 100% rename from v2/api.js rename to v2/api.ts diff --git a/v2/boundaries.js b/v2/boundaries.ts similarity index 100% rename from v2/boundaries.js rename to v2/boundaries.ts diff --git a/v2/burwellTileServer.js b/v2/burwellTileServer.ts similarity index 100% rename from v2/burwellTileServer.js rename to v2/burwellTileServer.ts diff --git a/v2/carto/index.js b/v2/carto/index.ts similarity index 100% rename from v2/carto/index.js rename to v2/carto/index.ts diff --git a/v2/carto/small.js b/v2/carto/small.ts similarity index 100% rename from v2/carto/small.js rename to v2/carto/small.ts diff --git a/v2/catchall.js b/v2/catchall.ts similarity index 100% rename from v2/catchall.js rename to v2/catchall.ts diff --git a/v2/column-cache-refresh.js b/v2/column-cache-refresh.ts similarity index 100% rename from v2/column-cache-refresh.js rename to v2/column-cache-refresh.ts diff --git a/v2/columns.js b/v2/columns.ts similarity index 100% rename from v2/columns.js rename to v2/columns.ts diff --git a/v2/credentials.example.js b/v2/credentials.example.ts similarity index 100% rename from v2/credentials.example.js rename to v2/credentials.example.ts diff --git a/v2/credentials.js b/v2/credentials.ts similarity index 90% rename from v2/credentials.js rename to v2/credentials.ts index ad4aaba6..83b91dea 100644 --- a/v2/credentials.js +++ b/v2/credentials.ts @@ -1,4 +1,4 @@ -const { mysql, pg, redis, cacheRefreshKey, postgresDatabases = {} } = require("../credentials.js"); +const { mysql, pg, redis, cacheRefreshKey, postgresDatabases = {} } = require("../credentials.ts"); exports.mysql = mysql; diff --git a/v2/definitions/autocomplete.js b/v2/definitions/autocomplete.ts similarity index 98% rename from v2/definitions/autocomplete.js rename to v2/definitions/autocomplete.ts index 786cf1ed..f5789a2c 100644 --- a/v2/definitions/autocomplete.js +++ b/v2/definitions/autocomplete.ts @@ -10,7 +10,7 @@ LEFT JOIN intervals ON intervals.id = strat_names_meta.interval_id; */ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"), _ = require("underscore"); module.exports = function(req, res, next) { diff --git a/v2/definitions/columns.js b/v2/definitions/columns.ts similarity index 100% rename from v2/definitions/columns.js rename to v2/definitions/columns.ts diff --git a/v2/definitions/define.js b/v2/definitions/define.ts similarity index 100% rename from v2/definitions/define.js rename to v2/definitions/define.ts diff --git a/v2/definitions/drilling_sites.js b/v2/definitions/drilling_sites.ts similarity index 100% rename from v2/definitions/drilling_sites.js rename to v2/definitions/drilling_sites.ts diff --git a/v2/definitions/econs.js b/v2/definitions/econs.ts similarity index 100% rename from v2/definitions/econs.js rename to v2/definitions/econs.ts diff --git a/v2/definitions/environments.js b/v2/definitions/environments.ts similarity index 100% rename from v2/definitions/environments.js rename to v2/definitions/environments.ts diff --git a/v2/definitions/grainsizes.js b/v2/definitions/grainsizes.ts similarity index 100% rename from v2/definitions/grainsizes.js rename to v2/definitions/grainsizes.ts diff --git a/v2/definitions/groups.js b/v2/definitions/groups.ts similarity index 100% rename from v2/definitions/groups.js rename to v2/definitions/groups.ts diff --git a/v2/definitions/index.js b/v2/definitions/index.ts similarity index 100% rename from v2/definitions/index.js rename to v2/definitions/index.ts diff --git a/v2/definitions/intervals.js b/v2/definitions/intervals.ts similarity index 100% rename from v2/definitions/intervals.js rename to v2/definitions/intervals.ts diff --git a/v2/definitions/languages.js b/v2/definitions/languages.ts similarity index 100% rename from v2/definitions/languages.js rename to v2/definitions/languages.ts diff --git a/v2/definitions/lithologies.js b/v2/definitions/lithologies.ts similarity index 100% rename from v2/definitions/lithologies.js rename to v2/definitions/lithologies.ts diff --git a/v2/definitions/lithology_attributes.js b/v2/definitions/lithology_attributes.ts similarity index 100% rename from v2/definitions/lithology_attributes.js rename to v2/definitions/lithology_attributes.ts diff --git a/v2/definitions/measurement_sources.js b/v2/definitions/measurement_sources.ts similarity index 100% rename from v2/definitions/measurement_sources.js rename to v2/definitions/measurement_sources.ts diff --git a/v2/definitions/measurements.js b/v2/definitions/measurements.ts similarity index 100% rename from v2/definitions/measurements.js rename to v2/definitions/measurements.ts diff --git a/v2/definitions/minerals.js b/v2/definitions/minerals.ts similarity index 100% rename from v2/definitions/minerals.js rename to v2/definitions/minerals.ts diff --git a/v2/definitions/plates.js b/v2/definitions/plates.ts similarity index 100% rename from v2/definitions/plates.js rename to v2/definitions/plates.ts diff --git a/v2/definitions/projects.js b/v2/definitions/projects.ts similarity index 100% rename from v2/definitions/projects.js rename to v2/definitions/projects.ts diff --git a/v2/definitions/refs.js b/v2/definitions/refs.ts similarity index 100% rename from v2/definitions/refs.js rename to v2/definitions/refs.ts diff --git a/v2/definitions/sources.js b/v2/definitions/sources.ts similarity index 100% rename from v2/definitions/sources.js rename to v2/definitions/sources.ts diff --git a/v2/definitions/strat_name_concepts.js b/v2/definitions/strat_name_concepts.ts similarity index 100% rename from v2/definitions/strat_name_concepts.js rename to v2/definitions/strat_name_concepts.ts diff --git a/v2/definitions/strat_names.js b/v2/definitions/strat_names.ts similarity index 100% rename from v2/definitions/strat_names.js rename to v2/definitions/strat_names.ts diff --git a/v2/definitions/structures.js b/v2/definitions/structures.ts similarity index 100% rename from v2/definitions/structures.js rename to v2/definitions/structures.ts diff --git a/v2/definitions/timescales.js b/v2/definitions/timescales.ts similarity index 100% rename from v2/definitions/timescales.js rename to v2/definitions/timescales.ts diff --git a/v2/defs.js b/v2/defs.ts similarity index 100% rename from v2/defs.js rename to v2/defs.ts diff --git a/v2/editing/editing.js b/v2/editing/editing.ts similarity index 100% rename from v2/editing/editing.js rename to v2/editing/editing.ts diff --git a/v2/editing/map.js b/v2/editing/map.ts similarity index 100% rename from v2/editing/map.js rename to v2/editing/map.ts diff --git a/v2/editing/map_update.js b/v2/editing/map_update.ts similarity index 100% rename from v2/editing/map_update.js rename to v2/editing/map_update.ts diff --git a/v2/editing/section.js b/v2/editing/section.ts similarity index 100% rename from v2/editing/section.js rename to v2/editing/section.ts diff --git a/v2/editing/units_update.js b/v2/editing/units_update.ts similarity index 100% rename from v2/editing/units_update.js rename to v2/editing/units_update.ts diff --git a/v2/elevation.js b/v2/elevation.ts similarity index 100% rename from v2/elevation.js rename to v2/elevation.ts diff --git a/v2/eodp.js b/v2/eodp.ts similarity index 100% rename from v2/eodp.js rename to v2/eodp.ts diff --git a/v2/fossils.js b/v2/fossils.ts similarity index 100% rename from v2/fossils.js rename to v2/fossils.ts diff --git a/v2/geologic_units_burwell.js b/v2/geologic_units_burwell.ts similarity index 100% rename from v2/geologic_units_burwell.js rename to v2/geologic_units_burwell.ts diff --git a/v2/geologic_units_burwell_legend.js b/v2/geologic_units_burwell_legend.ts similarity index 100% rename from v2/geologic_units_burwell_legend.js rename to v2/geologic_units_burwell_legend.ts diff --git a/v2/geologic_units_burwell_nearby.js b/v2/geologic_units_burwell_nearby.ts similarity index 100% rename from v2/geologic_units_burwell_nearby.js rename to v2/geologic_units_burwell_nearby.ts diff --git a/v2/geologic_units_burwell_points.js b/v2/geologic_units_burwell_points.ts similarity index 100% rename from v2/geologic_units_burwell_points.js rename to v2/geologic_units_burwell_points.ts diff --git a/v2/geologic_units_gmna.js b/v2/geologic_units_gmna.ts similarity index 100% rename from v2/geologic_units_gmna.js rename to v2/geologic_units_gmna.ts diff --git a/v2/geologic_units_gmus.js b/v2/geologic_units_gmus.ts similarity index 100% rename from v2/geologic_units_gmus.js rename to v2/geologic_units_gmus.ts diff --git a/v2/grids/index.js b/v2/grids/index.ts similarity index 100% rename from v2/grids/index.js rename to v2/grids/index.ts diff --git a/v2/grids/latitude.js b/v2/grids/latitude.ts similarity index 100% rename from v2/grids/latitude.js rename to v2/grids/latitude.ts diff --git a/v2/grids/lithologies.js b/v2/grids/lithologies.ts similarity index 100% rename from v2/grids/lithologies.js rename to v2/grids/lithologies.ts diff --git a/v2/grids/longitude.js b/v2/grids/longitude.ts similarity index 100% rename from v2/grids/longitude.js rename to v2/grids/longitude.ts diff --git a/v2/hex_summary.js b/v2/hex_summary.ts similarity index 100% rename from v2/hex_summary.js rename to v2/hex_summary.ts diff --git a/v2/hex_summary_max.js b/v2/hex_summary_max.ts similarity index 100% rename from v2/hex_summary_max.js rename to v2/hex_summary_max.ts diff --git a/v2/hillshade.js b/v2/hillshade.ts similarity index 100% rename from v2/hillshade.js rename to v2/hillshade.ts diff --git a/v2/hillshadeCache.js b/v2/hillshadeCache.ts similarity index 100% rename from v2/hillshadeCache.js rename to v2/hillshadeCache.ts diff --git a/v2/index.js b/v2/index.ts similarity index 99% rename from v2/index.js rename to v2/index.ts index 8c08cf46..bc93df3f 100644 --- a/v2/index.js +++ b/v2/index.ts @@ -99,7 +99,7 @@ api.route("/age_model") .get(require("./age_model")); api.route("/eodp") - .get(require("./eodp.js")); + .get(require("./eodp")); //api.route("/hillshade") // .get(require("./hillshade")); diff --git a/v2/larkin.js b/v2/larkin.ts similarity index 97% rename from v2/larkin.js rename to v2/larkin.ts index c3dc7376..dfb34388 100644 --- a/v2/larkin.js +++ b/v2/larkin.ts @@ -9,7 +9,7 @@ var mysql = require("mysql"), http = require("http"), portscanner = require("portscanner"); -const { Client } = require('pg'); +const { Client, Pool } = require('pg'); let clientRegistry = {} function getPGClient(db) { @@ -37,15 +37,11 @@ function getPGClient(db) { larkin.queryPg = function (db, sql, params, callback) { -<<<<<<< HEAD - /* We've reworked this connection flow substantially for modern Postgres bindings */ - const client = getPGClient(db); -======= const nameMapping = credentials.postgresDatabases ?? {} const dbName = nameMapping[db] ?? db - const pool = new pg.Pool({connectionString: credentials.pg.connectionString}); + const pool = new Pool({connectionString: credentials.pg.connectionString}); pool.connect(function(err, client, done) { if (err) { @@ -60,19 +56,8 @@ function getPGClient(db) { } else { callback(null, result); } ->>>>>>> main - - try { - client.connect() - } catch (error) { - console.error('error connecting to postgres', err) - return callback(error) - } - client.query(sql, params, (err, result) => { - if (err) { - return callback(err); + }); } - callback(null, result); }); }; diff --git a/v2/measurements.js b/v2/measurements.ts similarity index 100% rename from v2/measurements.js rename to v2/measurements.ts diff --git a/v2/meta.js b/v2/meta.ts similarity index 100% rename from v2/meta.js rename to v2/meta.ts diff --git a/v2/mobile/autocomplete.js b/v2/mobile/autocomplete.ts similarity index 100% rename from v2/mobile/autocomplete.js rename to v2/mobile/autocomplete.ts diff --git a/v2/mobile/dashboard.js b/v2/mobile/dashboard.ts similarity index 100% rename from v2/mobile/dashboard.js rename to v2/mobile/dashboard.ts diff --git a/v2/mobile/fossil_collections.js b/v2/mobile/fossil_collections.ts similarity index 100% rename from v2/mobile/fossil_collections.js rename to v2/mobile/fossil_collections.ts diff --git a/v2/mobile/index.js b/v2/mobile/index.ts similarity index 100% rename from v2/mobile/index.js rename to v2/mobile/index.ts diff --git a/v2/mobile/macro_summary.js b/v2/mobile/macro_summary.ts similarity index 100% rename from v2/mobile/macro_summary.js rename to v2/mobile/macro_summary.ts diff --git a/v2/mobile/map_filter.js b/v2/mobile/map_filter.ts similarity index 100% rename from v2/mobile/map_filter.js rename to v2/mobile/map_filter.ts diff --git a/v2/mobile/map_query.js b/v2/mobile/map_query.ts similarity index 100% rename from v2/mobile/map_query.js rename to v2/mobile/map_query.ts diff --git a/v2/mobile/map_query_v2.js b/v2/mobile/map_query_v2.ts similarity index 100% rename from v2/mobile/map_query_v2.js rename to v2/mobile/map_query_v2.ts diff --git a/v2/mobile/point.js b/v2/mobile/point.ts similarity index 100% rename from v2/mobile/point.js rename to v2/mobile/point.ts diff --git a/v2/mobile/point_details.js b/v2/mobile/point_details.ts similarity index 100% rename from v2/mobile/point_details.js rename to v2/mobile/point_details.ts diff --git a/v2/paleogeography.js b/v2/paleogeography.ts similarity index 100% rename from v2/paleogeography.js rename to v2/paleogeography.ts diff --git a/v2/places.js b/v2/places.ts similarity index 100% rename from v2/places.js rename to v2/places.ts diff --git a/v2/root.js b/v2/root.ts similarity index 100% rename from v2/root.js rename to v2/root.ts diff --git a/v2/sections.js b/v2/sections.ts similarity index 100% rename from v2/sections.js rename to v2/sections.ts diff --git a/v2/stats.js b/v2/stats.ts similarity index 100% rename from v2/stats.js rename to v2/stats.ts diff --git a/v2/test/settings.js b/v2/test/settings.ts similarity index 100% rename from v2/test/settings.js rename to v2/test/settings.ts diff --git a/v2/test/test.js b/v2/test/test.ts similarity index 100% rename from v2/test/test.js rename to v2/test/test.ts diff --git a/v2/test/v2Tests/carto_small.js b/v2/test/v2Tests/carto_small.ts similarity index 100% rename from v2/test/v2Tests/carto_small.js rename to v2/test/v2Tests/carto_small.ts diff --git a/v2/test/v2Tests/columns.js b/v2/test/v2Tests/columns.ts similarity index 100% rename from v2/test/v2Tests/columns.js rename to v2/test/v2Tests/columns.ts diff --git a/v2/test/v2Tests/defs.js b/v2/test/v2Tests/defs.ts similarity index 100% rename from v2/test/v2Tests/defs.js rename to v2/test/v2Tests/defs.ts diff --git a/v2/test/v2Tests/defs_columns.js b/v2/test/v2Tests/defs_columns.ts similarity index 100% rename from v2/test/v2Tests/defs_columns.js rename to v2/test/v2Tests/defs_columns.ts diff --git a/v2/test/v2Tests/defs_econs.js b/v2/test/v2Tests/defs_econs.ts similarity index 100% rename from v2/test/v2Tests/defs_econs.js rename to v2/test/v2Tests/defs_econs.ts diff --git a/v2/test/v2Tests/defs_environments.js b/v2/test/v2Tests/defs_environments.ts similarity index 100% rename from v2/test/v2Tests/defs_environments.js rename to v2/test/v2Tests/defs_environments.ts diff --git a/v2/test/v2Tests/defs_groups.js b/v2/test/v2Tests/defs_groups.ts similarity index 100% rename from v2/test/v2Tests/defs_groups.js rename to v2/test/v2Tests/defs_groups.ts diff --git a/v2/test/v2Tests/defs_intervals.js b/v2/test/v2Tests/defs_intervals.ts similarity index 100% rename from v2/test/v2Tests/defs_intervals.js rename to v2/test/v2Tests/defs_intervals.ts diff --git a/v2/test/v2Tests/defs_lithologies.js b/v2/test/v2Tests/defs_lithologies.ts similarity index 100% rename from v2/test/v2Tests/defs_lithologies.js rename to v2/test/v2Tests/defs_lithologies.ts diff --git a/v2/test/v2Tests/defs_lithology_attributes.js b/v2/test/v2Tests/defs_lithology_attributes.ts similarity index 100% rename from v2/test/v2Tests/defs_lithology_attributes.js rename to v2/test/v2Tests/defs_lithology_attributes.ts diff --git a/v2/test/v2Tests/defs_measurements.js b/v2/test/v2Tests/defs_measurements.ts similarity index 100% rename from v2/test/v2Tests/defs_measurements.js rename to v2/test/v2Tests/defs_measurements.ts diff --git a/v2/test/v2Tests/defs_minerals.js b/v2/test/v2Tests/defs_minerals.ts similarity index 100% rename from v2/test/v2Tests/defs_minerals.js rename to v2/test/v2Tests/defs_minerals.ts diff --git a/v2/test/v2Tests/defs_plates.js b/v2/test/v2Tests/defs_plates.ts similarity index 100% rename from v2/test/v2Tests/defs_plates.js rename to v2/test/v2Tests/defs_plates.ts diff --git a/v2/test/v2Tests/defs_projects.js b/v2/test/v2Tests/defs_projects.ts similarity index 100% rename from v2/test/v2Tests/defs_projects.js rename to v2/test/v2Tests/defs_projects.ts diff --git a/v2/test/v2Tests/defs_refs.js b/v2/test/v2Tests/defs_refs.ts similarity index 100% rename from v2/test/v2Tests/defs_refs.js rename to v2/test/v2Tests/defs_refs.ts diff --git a/v2/test/v2Tests/defs_sources.js b/v2/test/v2Tests/defs_sources.ts similarity index 100% rename from v2/test/v2Tests/defs_sources.js rename to v2/test/v2Tests/defs_sources.ts diff --git a/v2/test/v2Tests/defs_strat_name_concepts.js b/v2/test/v2Tests/defs_strat_name_concepts.ts similarity index 100% rename from v2/test/v2Tests/defs_strat_name_concepts.js rename to v2/test/v2Tests/defs_strat_name_concepts.ts diff --git a/v2/test/v2Tests/defs_strat_names.js b/v2/test/v2Tests/defs_strat_names.ts similarity index 100% rename from v2/test/v2Tests/defs_strat_names.js rename to v2/test/v2Tests/defs_strat_names.ts diff --git a/v2/test/v2Tests/defs_structures.js b/v2/test/v2Tests/defs_structures.ts similarity index 100% rename from v2/test/v2Tests/defs_structures.js rename to v2/test/v2Tests/defs_structures.ts diff --git a/v2/test/v2Tests/defs_timescales.js b/v2/test/v2Tests/defs_timescales.ts similarity index 100% rename from v2/test/v2Tests/defs_timescales.js rename to v2/test/v2Tests/defs_timescales.ts diff --git a/v2/test/v2Tests/fossils.js b/v2/test/v2Tests/fossils.ts similarity index 100% rename from v2/test/v2Tests/fossils.js rename to v2/test/v2Tests/fossils.ts diff --git a/v2/test/v2Tests/geologic_units_burwell.js b/v2/test/v2Tests/geologic_units_burwell.ts similarity index 100% rename from v2/test/v2Tests/geologic_units_burwell.js rename to v2/test/v2Tests/geologic_units_burwell.ts diff --git a/v2/test/v2Tests/geologic_units_gmna.js b/v2/test/v2Tests/geologic_units_gmna.ts similarity index 100% rename from v2/test/v2Tests/geologic_units_gmna.js rename to v2/test/v2Tests/geologic_units_gmna.ts diff --git a/v2/test/v2Tests/geologic_units_gmus.js b/v2/test/v2Tests/geologic_units_gmus.ts similarity index 100% rename from v2/test/v2Tests/geologic_units_gmus.js rename to v2/test/v2Tests/geologic_units_gmus.ts diff --git a/v2/test/v2Tests/index.js b/v2/test/v2Tests/index.ts similarity index 100% rename from v2/test/v2Tests/index.js rename to v2/test/v2Tests/index.ts diff --git a/v2/test/v2Tests/mancos_test_cases.js b/v2/test/v2Tests/mancos_test_cases.ts similarity index 100% rename from v2/test/v2Tests/mancos_test_cases.js rename to v2/test/v2Tests/mancos_test_cases.ts diff --git a/v2/test/v2Tests/mobile_fossil_collections.js b/v2/test/v2Tests/mobile_fossil_collections.ts similarity index 100% rename from v2/test/v2Tests/mobile_fossil_collections.js rename to v2/test/v2Tests/mobile_fossil_collections.ts diff --git a/v2/test/v2Tests/mobile_macro_summary.js b/v2/test/v2Tests/mobile_macro_summary.ts similarity index 100% rename from v2/test/v2Tests/mobile_macro_summary.js rename to v2/test/v2Tests/mobile_macro_summary.ts diff --git a/v2/test/v2Tests/mobile_map_query.js b/v2/test/v2Tests/mobile_map_query.ts similarity index 100% rename from v2/test/v2Tests/mobile_map_query.js rename to v2/test/v2Tests/mobile_map_query.ts diff --git a/v2/test/v2Tests/mobile_point.js b/v2/test/v2Tests/mobile_point.ts similarity index 100% rename from v2/test/v2Tests/mobile_point.js rename to v2/test/v2Tests/mobile_point.ts diff --git a/v2/test/v2Tests/mobile_point_details.js b/v2/test/v2Tests/mobile_point_details.ts similarity index 100% rename from v2/test/v2Tests/mobile_point_details.js rename to v2/test/v2Tests/mobile_point_details.ts diff --git a/v2/test/v2Tests/paleogeography.js b/v2/test/v2Tests/paleogeography.ts similarity index 100% rename from v2/test/v2Tests/paleogeography.js rename to v2/test/v2Tests/paleogeography.ts diff --git a/v2/test/v2Tests/root.js b/v2/test/v2Tests/root.ts similarity index 100% rename from v2/test/v2Tests/root.js rename to v2/test/v2Tests/root.ts diff --git a/v2/test/v2Tests/sections.js b/v2/test/v2Tests/sections.ts similarity index 100% rename from v2/test/v2Tests/sections.js rename to v2/test/v2Tests/sections.ts diff --git a/v2/test/v2Tests/stats.js b/v2/test/v2Tests/stats.ts similarity index 100% rename from v2/test/v2Tests/stats.js rename to v2/test/v2Tests/stats.ts diff --git a/v2/test/v2Tests/tiles.js b/v2/test/v2Tests/tiles.ts similarity index 100% rename from v2/test/v2Tests/tiles.js rename to v2/test/v2Tests/tiles.ts diff --git a/v2/test/v2Tests/units.js b/v2/test/v2Tests/units.ts similarity index 100% rename from v2/test/v2Tests/units.js rename to v2/test/v2Tests/units.ts diff --git a/v2/test/validators.js b/v2/test/validators.ts similarity index 100% rename from v2/test/validators.js rename to v2/test/validators.ts diff --git a/v2/units.js b/v2/units.ts similarity index 100% rename from v2/units.js rename to v2/units.ts diff --git a/yarn.lock b/yarn.lock index 2f5cbe25..2c2711ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,15 @@ __metadata: version: 8 cacheKey: 10c0 +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -19,6 +28,30 @@ __metadata: languageName: node linkType: hard +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: 0dbc9e29bc640bbbdc5b9876d2859c69042bfcf1423c1e6421bcca53e826660bff4e41c7d4bcb8dbea696404231a6f902f76ba41835d049e20f2dd6cffb713bf + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: 0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + "@mapbox/polyline@npm:^0.2.0": version: 0.2.0 resolution: "@mapbox/polyline@npm:0.2.0" @@ -57,6 +90,34 @@ __metadata: languageName: node linkType: hard +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: c176a2c1e1b16be120c328300ea910df15fb9a5277010116d26818272341a11483c5a80059389d04edacf6fd2d03d4687ad3660870fdd1cc0b7109e160adb220 + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + "@turf/bbox-polygon@npm:^4.7.3": version: 4.7.3 resolution: "@turf/bbox-polygon@npm:4.7.3" @@ -164,6 +225,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^20.11.5": + version: 20.11.5 + resolution: "@types/node@npm:20.11.5" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 6d18cec852f5cfbed3ec42b5c01c026e7a3f9da540d6e3d6738d4cee9979fb308cf27b6df7ba40a6553e7bc82e678f0ef53ba6e6ad52e5b86bd97b7783c2a42c + languageName: node + linkType: hard + "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -181,6 +251,13 @@ __metadata: languageName: node linkType: hard +"acorn-walk@npm:^8.1.1": + version: 8.3.2 + resolution: "acorn-walk@npm:8.3.2" + checksum: 7e2a8dad5480df7f872569b9dccff2f3da7e65f5353686b1d6032ab9f4ddf6e3a2cb83a9b52cf50b1497fd522154dda92f0abf7153290cc79cd14721ff121e52 + languageName: node + linkType: hard + "acorn@npm:^7.1.1": version: 7.4.1 resolution: "acorn@npm:7.4.1" @@ -190,6 +267,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.4.1": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" + bin: + acorn: bin/acorn + checksum: 3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 + languageName: node + linkType: hard + "agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": version: 7.1.0 resolution: "agent-base@npm:7.1.0" @@ -291,6 +377,13 @@ __metadata: languageName: node linkType: hard +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -779,6 +872,13 @@ __metadata: languageName: node linkType: hard +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.0": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -992,6 +1092,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + "double-ended-queue@npm:^2.1.0-0": version: 2.1.0-0 resolution: "double-ended-queue@npm:2.1.0-0" @@ -2034,6 +2141,7 @@ __metadata: "@mapbox/polyline": "npm:^0.2.0" "@turf/buffer": "npm:^4.6.1" "@turf/envelope": "npm:^4.6.0" + "@types/node": "npm:^20.11.5" async: "npm:1.5.2" body-parser: "npm:^1.6.3" brute-force-equal-area: "git+https://github.com/UW-Macrostrat/brute-force-equal-area.git" @@ -2059,10 +2167,12 @@ __metadata: tilestrata: "npm:^2.0.1" tilestrata-dependency: "npm:^0.4.0" topojson: "npm:^1.6.19" + ts-node: "npm:^10.9.2" turf-area: "npm:^1.1.1" turf-buffer: "npm:^1.0.4" turf-point: "npm:^0.1.6" turf-voronoi: "git+https://github.com/Turfjs/turf-voronoi.git" + typescript: "npm:^5.3.3" underscore: "npm:^1.8.3" universal-analytics: "npm:^0.4.6" validator: "npm:^3.34.0" @@ -2079,6 +2189,13 @@ __metadata: languageName: node linkType: hard +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + "make-fetch-happen@npm:^13.0.0": version: 13.0.0 resolution: "make-fetch-happen@npm:13.0.0" @@ -3796,6 +3913,44 @@ __metadata: languageName: node linkType: hard +"ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 + languageName: node + linkType: hard + "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -3910,6 +4065,26 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: e33cef99d82573624fc0f854a2980322714986bc35b9cb4d1ce736ed182aeab78e2cb32b385efa493b2a976ef52c53e20d6c6918312353a91850e2b76f1ea44f + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.3.3#optional!builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 1d0a5f4ce496c42caa9a30e659c467c5686eae15d54b027ee7866744952547f1be1262f2d40de911618c242b510029d51d43ff605dba8fb740ec85ca2d3f9500 + languageName: node + linkType: hard + "underscore@npm:^1.8.3": version: 1.13.6 resolution: "underscore@npm:1.13.6" @@ -3917,6 +4092,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -3994,6 +4176,13 @@ __metadata: languageName: node linkType: hard +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + "validator@npm:^3.34.0": version: 3.43.0 resolution: "validator@npm:3.43.0" @@ -4132,3 +4321,10 @@ __metadata: checksum: 2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a languageName: node linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard From b156cb60e65794b8c4abea6eb7fc6dc768ca5c29 Mon Sep 17 00:00:00 2001 From: Daven Quinn Date: Wed, 17 Jan 2024 02:59:39 -0600 Subject: [PATCH 3/4] Remove all MySQL comfiguration, but not yet porting routes --- v2/index.ts | 3 --- v2/larkin.ts | 41 ++++------------------------------------- 2 files changed, 4 insertions(+), 40 deletions(-) diff --git a/v2/index.ts b/v2/index.ts index bc93df3f..c932f4be 100644 --- a/v2/index.ts +++ b/v2/index.ts @@ -1,9 +1,6 @@ var api = require("./api"), larkin = require("./larkin"); -// Establish a connection to the database -larkin.connectMySQL(); - // Set up the column and unit cache larkin.setupCache(); diff --git a/v2/larkin.ts b/v2/larkin.ts index dfb34388..5c05cfea 100644 --- a/v2/larkin.ts +++ b/v2/larkin.ts @@ -1,5 +1,4 @@ -var mysql = require("mysql"), - async = require("async"), +var async = require("async"), _ = require("underscore"), credentials = require("./credentials"), csv = require("csv-express"), @@ -23,19 +22,6 @@ function getPGClient(db) { (function() { var larkin = {}; - larkin.connectMySQL = function() { - // Non-blocking FTW - this.pool = mysql.createPool(credentials.mysql); - - // Verify a connection has been made - this.pool.getConnection(function(error, connection) { - if (error) { - throw new Error("Unable to connect to MySQL. Please check your credentials"); - }; - }); - }; - - larkin.queryPg = function (db, sql, params, callback) { const nameMapping = credentials.postgresDatabases ?? {} @@ -78,28 +64,8 @@ function getPGClient(db) { larkin.query = function(sql, params, callback) { // See if the query is using :named_parameters or positional ? - if (sql.indexOf(':') > -1 && Object.keys(params).length > 0) { - var newQuery = larkin.toUnnamed(sql, params); - sql = newQuery[0]; - params = newQuery[1]; - } - - this.pool.getConnection(function(err, connection) { - var query = connection.query(sql, params, function(error, result) { - // Remove the connection - connection.destroy(); - if (error) { - if (callback) { - callback(error); - } else { - this.error(res, next, "Error retrieving from MySQL.", error); - } - } else { - callback(null, result); - } - }.bind(this)); - //console.log(query.sql) - }.bind(this)); + const error = new Error("MySQL connections are now invalid. Please update this route to use Postgres instead.") + callback(error) }; larkin.sendImage = function(req, res, next, data, isCached) { @@ -526,6 +492,7 @@ function getPGClient(db) { }); res.on("end", function() { + var result = JSON.parse(body).success.data; var cols = _.groupBy(result, function(d) { From 633b3d02c31d6eba8fac7d0afc212c1ffd6b2fc2 Mon Sep 17 00:00:00 2001 From: Daven Quinn Date: Wed, 17 Jan 2024 03:03:18 -0600 Subject: [PATCH 4/4] Format codebase with prettier --- .github/workflows/build-dev.yaml | 23 +- .github/workflows/build-prod.yaml | 21 +- .vscode/settings.json | 6 +- NOTES.md | 5 +- README.md | 90 +- credentials.example.ts | 37 +- package.json | 6 +- server.ts | 67 +- tsconfig.json | 6 +- v2/CHANGELOG.md | 366 +- v2/README.md | 65 +- v2/age_model.ts | 153 +- v2/api.ts | 31 +- v2/boundaries.ts | 66 +- v2/burwellTileServer.ts | 82 +- v2/carto/index.ts | 21 +- v2/carto/small.ts | 269 +- v2/catchall.ts | 4 +- v2/changes.html | 28038 ++++++++++++++++- v2/column-cache-refresh.ts | 20 +- v2/columns.ts | 443 +- v2/credentials.example.ts | 30 +- v2/credentials.ts | 10 +- v2/definitions/autocomplete.ts | 91 +- v2/definitions/columns.ts | 131 +- v2/definitions/define.ts | 118 +- v2/definitions/drilling_sites.ts | 125 +- v2/definitions/econs.ts | 47 +- v2/definitions/environments.ts | 41 +- v2/definitions/grainsizes.ts | 69 +- v2/definitions/groups.ts | 33 +- v2/definitions/index.ts | 169 +- v2/definitions/intervals.ts | 74 +- v2/definitions/languages.ts | 44 +- v2/definitions/lithologies.ts | 78 +- v2/definitions/lithology_attributes.ts | 34 +- v2/definitions/measurement_sources.ts | 56 +- v2/definitions/measurements.ts | 44 +- v2/definitions/minerals.ts | 54 +- v2/definitions/plates.ts | 32 +- v2/definitions/projects.ts | 43 +- v2/definitions/refs.ts | 34 +- v2/definitions/sources.ts | 151 +- v2/definitions/strat_name_concepts.ts | 52 +- v2/definitions/strat_names.ts | 109 +- v2/definitions/structures.ts | 88 +- v2/definitions/timescales.ts | 32 +- v2/defs.ts | 4443 ++- v2/editing/editing.ts | 22 +- v2/editing/map.ts | 71 +- v2/editing/map_update.ts | 72 +- v2/editing/section.ts | 22 +- v2/editing/units_update.ts | 38 +- v2/elevation.ts | 136 +- v2/eodp.ts | 157 +- v2/fossils.ts | 304 +- v2/geologic_units_burwell.ts | 346 +- v2/geologic_units_burwell_legend.ts | 463 +- v2/geologic_units_burwell_nearby.ts | 273 +- v2/geologic_units_burwell_points.ts | 177 +- v2/geologic_units_gmna.ts | 162 +- v2/geologic_units_gmus.ts | 414 +- v2/grids/index.ts | 27 +- v2/grids/latitude.ts | 48 +- v2/grids/lithologies.ts | 274 +- v2/grids/longitude.ts | 48 +- v2/hex_summary.ts | 71 +- v2/hex_summary_max.ts | 47 +- v2/hillshade.ts | 180 +- v2/hillshadeCache.ts | 86 +- v2/index.ts | 124 +- v2/larkin.ts | 796 +- v2/measurements.ts | 290 +- v2/meta.ts | 57 +- v2/mobile/autocomplete.ts | 169 +- v2/mobile/dashboard.ts | 161 +- v2/mobile/fossil_collections.ts | 45 +- v2/mobile/index.ts | 44 +- v2/mobile/macro_summary.ts | 783 +- v2/mobile/map_filter.ts | 62 +- v2/mobile/map_query.ts | 660 +- v2/mobile/map_query_v2.ts | 518 +- v2/mobile/point.ts | 208 +- v2/mobile/point_details.ts | 378 +- v2/paleogeography.ts | 131 +- v2/places.ts | 170 +- v2/root.ts | 36 +- v2/sections.ts | 259 +- v2/stats.ts | 41 +- v2/test/settings.ts | 8 +- v2/test/test.ts | 2 +- v2/test/v2Tests/carto_small.ts | 33 +- v2/test/v2Tests/columns.ts | 62 +- v2/test/v2Tests/defs.ts | 16 +- v2/test/v2Tests/defs_columns.ts | 58 +- v2/test/v2Tests/defs_econs.ts | 42 +- v2/test/v2Tests/defs_environments.ts | 42 +- v2/test/v2Tests/defs_groups.ts | 26 +- v2/test/v2Tests/defs_intervals.ts | 40 +- v2/test/v2Tests/defs_lithologies.ts | 56 +- v2/test/v2Tests/defs_lithology_attributes.ts | 48 +- v2/test/v2Tests/defs_measurements.ts | 54 +- v2/test/v2Tests/defs_minerals.ts | 37 +- v2/test/v2Tests/defs_plates.ts | 24 +- v2/test/v2Tests/defs_projects.ts | 24 +- v2/test/v2Tests/defs_refs.ts | 36 +- v2/test/v2Tests/defs_sources.ts | 52 +- v2/test/v2Tests/defs_strat_name_concepts.ts | 24 +- v2/test/v2Tests/defs_strat_names.ts | 48 +- v2/test/v2Tests/defs_structures.ts | 50 +- v2/test/v2Tests/defs_timescales.ts | 27 +- v2/test/v2Tests/fossils.ts | 50 +- v2/test/v2Tests/geologic_units_burwell.ts | 56 +- v2/test/v2Tests/geologic_units_gmna.ts | 39 +- v2/test/v2Tests/geologic_units_gmus.ts | 84 +- v2/test/v2Tests/index.ts | 6 +- v2/test/v2Tests/mancos_test_cases.ts | 113 +- v2/test/v2Tests/mobile_fossil_collections.ts | 26 +- v2/test/v2Tests/mobile_macro_summary.ts | 28 +- v2/test/v2Tests/mobile_map_query.ts | 122 +- v2/test/v2Tests/mobile_point.ts | 16 +- v2/test/v2Tests/mobile_point_details.ts | 34 +- v2/test/v2Tests/paleogeography.ts | 28 +- v2/test/v2Tests/root.ts | 12 +- v2/test/v2Tests/sections.ts | 24 +- v2/test/v2Tests/stats.ts | 20 +- v2/test/v2Tests/tiles.ts | 21 +- v2/test/v2Tests/units.ts | 231 +- v2/test/validators.ts | 37 +- v2/units.ts | 861 +- yarn.lock | 10 + 131 files changed, 38027 insertions(+), 9021 deletions(-) diff --git a/.github/workflows/build-dev.yaml b/.github/workflows/build-dev.yaml index 2ecc2cfa..23aad627 100644 --- a/.github/workflows/build-dev.yaml +++ b/.github/workflows/build-dev.yaml @@ -3,21 +3,19 @@ name: Build Development on: push: tags: - - v[0-9]+.[0-9]+.[0-9]+-** # Semver Pre-Release + - v[0-9]+.[0-9]+.[0-9]+-** # Semver Pre-Release pull_request: - branches: [ main ] + branches: [main] jobs: docker: runs-on: ubuntu-latest steps: - - - name: Checkout + - name: Checkout uses: actions/checkout@v3 - with: - submodules: 'recursive' - - - name: Docker meta + with: + submodules: "recursive" + - name: Docker meta id: meta uses: docker/metadata-action@v4 with: @@ -28,19 +26,16 @@ jobs: type=raw,value={{tag}}-{{date 'YYYYMMDDHHmmss'}} type=raw,value=latest-itb-{{date 'YYYYMMDDHHmmss'}} type=raw,value=sha-{{sha}} - - - name: Set up Docker Buildx + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - - - name: Login to OSG DockerHub + - name: Login to OSG DockerHub uses: docker/login-action@v2 with: registry: hub.opensciencegrid.org username: ${{ vars.HARBOR_CLI_NAME }} password: ${{ secrets.HARBOR_CLI_SECRET }} - - - name: Build and push + - name: Build and push uses: docker/build-push-action@v3 with: context: . diff --git a/.github/workflows/build-prod.yaml b/.github/workflows/build-prod.yaml index 64eeead9..a3dd124f 100644 --- a/.github/workflows/build-prod.yaml +++ b/.github/workflows/build-prod.yaml @@ -3,19 +3,17 @@ name: Build Production on: push: tags: - - v[0-9]+.[0-9]+.[0-9]+ # Semver Release + - v[0-9]+.[0-9]+.[0-9]+ # Semver Release jobs: docker: runs-on: ubuntu-latest steps: - - - name: Checkout + - name: Checkout uses: actions/checkout@v3 - with: - submodules: 'recursive' - - - name: Docker meta + with: + submodules: "recursive" + - name: Docker meta id: meta uses: docker/metadata-action@v4 with: @@ -24,18 +22,15 @@ jobs: type=semver,pattern={{version}} type=raw,value=latest,enable={{is_default_branch}} type=raw,value=sha-{{sha}} - - - name: Set up Docker Buildx + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - - - name: Login to OSG DockerHub + - name: Login to OSG DockerHub uses: docker/login-action@v2 with: registry: hub.opensciencegrid.org username: ${{ vars.HARBOR_CLI_NAME }} password: ${{ secrets.HARBOR_CLI_SECRET }} - - - name: Build and push + - name: Build and push uses: docker/build-push-action@v3 with: context: . diff --git a/.vscode/settings.json b/.vscode/settings.json index 2897dedf..f0cc0252 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,7 +4,7 @@ "/**", "/node_modules/**", "/v1/node_modules/**", - "/v2/node_modules/**", + "/v2/node_modules/**" ] - }, -} \ No newline at end of file + } +} diff --git a/NOTES.md b/NOTES.md index 41199196..8f3a92f0 100644 --- a/NOTES.md +++ b/NOTES.md @@ -11,6 +11,7 @@ ## Debugging with VS Code -- Added [VSCode debugger configuration](https://code.visualstudio.com/docs/nodejs/nodejs-debugging) +- Added + [VSCode debugger configuration](https://code.visualstudio.com/docs/nodejs/nodejs-debugging) - Enable 'Auto attach' in the VSCode configuration -- Run `npm start` *in VS Code's integrated terminal*. +- Run `npm start` _in VS Code's integrated terminal_. diff --git a/README.md b/README.md index 3c2682ff..6511c20d 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,88 @@ # Macrostrat API + The API for SCIENCE ## About -The Macrostrat API provides diverse macrostratigraphic and geologic data in a concise, queryable format. + +The Macrostrat API provides diverse macrostratigraphic and geologic data in a +concise, queryable format. ## Prerequisites + #### Software -MariaDB, PostgreSQL, Nodejs, Python, and [Macrostrat CLI](https://github.com/UW-Macrostrat/utils) are required. Redis is optional. When the API starts requests for all columns and all units are cached. If Redis is available it will be used, otherwise they are cached in the application memory. + +MariaDB, PostgreSQL, Nodejs, Python, and +[Macrostrat CLI](https://github.com/UW-Macrostrat/utils) are required. Redis is +optional. When the API starts requests for all columns and all units are cached. +If Redis is available it will be used, otherwise they are cached in the +application memory. #### Data -The following databases must be in place: -+ MariaDB - macrostrat -+ Postgres - burwell, alice, wof, elevation + +The following databases must be in place: + +- MariaDB - macrostrat +- Postgres - burwell, alice, wof, elevation ## Setup First clone the repo: -```` + +``` git clone https://github.com/UW-Macrostrat/macrostrat-api.git cd macrostrat-api -```` +``` Next, install dependencies: -```` + +``` npm install -```` -NOTE: Postgres connections are completely broken in node v14 and v15 (as of 2021-03-16). Use node v12! +``` + +NOTE: Postgres connections are completely broken in node v14 and v15 (as of +2021-03-16). Use node v12! -This will also run the script `postinstall.sh` which copies credentials files into place. +This will also run the script `postinstall.sh` which copies credentials files +into place. -For `v1/credentials.js` fill in your MariaDB and PostgreSQL user information. Do the same for `v2/credentials.js`, but also update the port for Redis if necessary, and follow the inline instructions for generating a cache refresh key. The cache refresh key is used as a secret parameter to programmatically refresh the column cache, such as in situations in which the underlying data has been changed (editing, adding, etc). +For `v1/credentials.js` fill in your MariaDB and PostgreSQL user information. Do +the same for `v2/credentials.js`, but also update the port for Redis if +necessary, and follow the inline instructions for generating a cache refresh +key. The cache refresh key is used as a secret parameter to programmatically +refresh the column cache, such as in situations in which the underlying data has +been changed (editing, adding, etc). ## Running -To start the API simply run `node server.js` which will start a process on port 5050. Note that the default port was changed from 5000 to 5050 to avoid a port conflict introduced in recent versions of commonly used OSs. To use a different port, you can specify it during startup as so: `node server.js 5151`. + +To start the API simply run `node server.js` which will start a process on +port 5050. Note that the default port was changed from 5000 to 5050 to avoid a +port conflict introduced in recent versions of commonly used OSs. To use a +different port, you can specify it during startup as so: `node server.js 5151`. For production use `pm2` is recommended. To start as a single process: -```` + +``` pm2 start server.js --name macrostrat-api -```` +``` or, to start in a load balanced mode with two processes: -```` -pm2 start server.js --name macrostrat-api -i 2 -```` -For more information about managing processes with pm2 see the [Macrostrat Wiki](https://github.com/UW-Macrostrat/lab/wiki/Nodejs-based-application-management) +``` +pm2 start server.js --name macrostrat-api -i 2 +``` +For more information about managing processes with pm2 see the +[Macrostrat Wiki](https://github.com/UW-Macrostrat/lab/wiki/Nodejs-based-application-management) ## Other useful things #### Caching + The Macrostrat API caches three specific request responses: - + All columns with geometry (`/columns?all&format=geojson_bare`) - + All columns without geometry (`/columns?all`) - + The summary of all units used in the response of the above routes + +- All columns with geometry (`/columns?all&format=geojson_bare`) +- All columns without geometry (`/columns?all`) +- The summary of all units used in the response of the above routes To refresh this cache without restarting the API you can make an HTTP GET request to `/api/v2/columns/refresh-cache?cacheRefreshKey=` @@ -64,19 +93,22 @@ This is primarily used by scripts in the Macrostrat CLI to ensure that the API is reporting the most recent data after columns have been added, removed, or otherwise edited. - - ### Test -```` -npm test -```` +``` +npm test +``` ### Organization -Each version of the API functions as a self-contained module, and therefore has its own ````package.json```` and dependencies. + +Each version of the API functions as a self-contained module, and therefore has +its own `package.json` and dependencies. ### Authors -[John J Czaplewski](https://github.com/jczaplew) and [Shanan E Peters](http://strata.geoglogy.wisc.edu) + +[John J Czaplewski](https://github.com/jczaplew) and +[Shanan E Peters](http://strata.geoglogy.wisc.edu) ### License + CC0 for all code unique to this API. diff --git a/credentials.example.ts b/credentials.example.ts index 1487c437..65dd7b6b 100644 --- a/credentials.example.ts +++ b/credentials.example.ts @@ -2,32 +2,31 @@ // in the Docker container. exports.mysql = { - host : 'localhost', - user : 'user', - password : 'password', - database : 'macrostrat', - socketPath: '/tmp/mysql.sock' -// socketPath: '/var/tmp/mariadb.sock' -} + host: "localhost", + user: "user", + password: "password", + database: "macrostrat", + socketPath: "/tmp/mysql.sock", + // socketPath: '/var/tmp/mariadb.sock' +}; exports.pg = { - host : 'localhost', - port : '5432', - user : 'postgres', - password : '' -} + host: "localhost", + port: "5432", + user: "postgres", + password: "", +}; exports.postgresDatabases = { - burwell: 'burwell', - geomacro: 'geomacro', -} - + burwell: "burwell", + geomacro: "geomacro", +}; // This is the default Redis port // NOTE: Redis is not configured at the moment exports.redis = { - port: 6379 -} + port: 6379, +}; // Generate a hash by running: node -e "console.log(require('uuid/v4')())" -exports.cacheRefreshKey = 'put-hash-here' +exports.cacheRefreshKey = "put-hash-here"; diff --git a/package.json b/package.json index 8f030bf7..553aa74c 100644 --- a/package.json +++ b/package.json @@ -69,9 +69,13 @@ "devDependencies": { "mocha": "^1.21.4", "node-uuid": "^1.4.3", + "prettier": "^3.2.3", "should": "^4.0.4", "supertest": "^0.14.0", "validator": "^3.34.0" }, - "packageManager": "yarn@4.0.2" + "packageManager": "yarn@4.0.2", + "prettier": { + "proseWrap": "always" + } } diff --git a/server.ts b/server.ts index 17d3f468..3427b5bc 100755 --- a/server.ts +++ b/server.ts @@ -1,43 +1,49 @@ var express = require("express"), - bodyParser = require("body-parser"), - //v1 = require("./v1"), - v2 = require("./v2"), - defs = require("./v2/defs"), - app = express(); - -var ua = require('universal-analytics'); - -ua('UA-75785431-1', null, {}, { - dh: 'https://macrostrat.org/api' -}); - -app.use(function(req, res, next) { + bodyParser = require("body-parser"), + //v1 = require("./v1"), + v2 = require("./v2"), + defs = require("./v2/defs"), + app = express(); + +var ua = require("universal-analytics"); + +ua( + "UA-75785431-1", + null, + {}, + { + dh: "https://macrostrat.org/api", + }, +); + +app.use(function (req, res, next) { // Ignore requests from the status server if (req.query && req.query.skip) { - return next() + return next(); } - var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; - var visitor = ua('UA-75785431-1', { https: true }); - - visitor.pageview({ - dp: req.originalUrl, - uip: ip || '0.0.0.0', - an: (req.query && req.query.referrer) ? req.query.referrer : '', - av: (req.query && req.query.version) ? req.query.version : '' - }).send(); + var ip = req.headers["x-forwarded-for"] || req.connection.remoteAddress; + var visitor = ua("UA-75785431-1", { https: true }); + + visitor + .pageview({ + dp: req.originalUrl, + uip: ip || "0.0.0.0", + an: req.query && req.query.referrer ? req.query.referrer : "", + av: req.query && req.query.version ? req.query.version : "", + }) + .send(); next(); }); - // parse application/x-www-form-urlencoded -app.use(bodyParser.urlencoded({ extended: false })) +app.use(bodyParser.urlencoded({ extended: false })); // parse application/json -app.use(bodyParser.json()) +app.use(bodyParser.json()); // parse application/vnd.api+json as json -app.use(bodyParser.json({ type: "application/vnd.api+json" })) +app.use(bodyParser.json({ type: "application/vnd.api+json" })); // Load and prefix all routes with /api and appropriate version app.use("/v2", v2); @@ -49,15 +55,14 @@ app.set("json spaces", 2); app.port = process.argv[2] || 5550; -app.start = function() { - app.listen(app.port, function() { +app.start = function () { + app.listen(app.port, function () { console.log("Listening on port " + app.port); }); -} +}; if (!module.parent) { app.start(); } - module.exports = app; diff --git a/tsconfig.json b/tsconfig.json index e86aca0a..e97755f7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { "moduleResolution": "NodeNext", - "module": "NodeNext" - } -} \ No newline at end of file + "module": "NodeNext", + }, +} diff --git a/v2/CHANGELOG.md b/v2/CHANGELOG.md index 2184ea1c..ee6d008a 100644 --- a/v2/CHANGELOG.md +++ b/v2/CHANGELOG.md @@ -1,258 +1,280 @@ # Macrostrat API v2 Changelog ## tl;dr -+ Added ````?sample```` to every route (except ````/mobile````), which returns 5 records. -+ The input and output parameter ````id```` no longer exists. All identifiers are now descriptive, for example ````unit_id````, ````col_id````, and ````econ_id````. -+ Numerous routes have been removed (````column````, ````unit_contacts````, ````pbdb_report````, ````section_stats````, ````geologic_units/map````, ````geologic_units/intersection```` and ````geologic_units````) -+ Every route outputs JSON by default -+ ````columns```` and ````sections```` are summaries of the data returned by ````units```` -+ ````lith````, ````environ```` and ````econ```` have been refactored to return valid JSON instead of pipe-delimited strings - +- Added `?sample` to every route (except `/mobile`), which returns 5 records. +- The input and output parameter `id` no longer exists. All identifiers are now + descriptive, for example `unit_id`, `col_id`, and `econ_id`. +- Numerous routes have been removed (`column`, `unit_contacts`, `pbdb_report`, + `section_stats`, `geologic_units/map`, `geologic_units/intersection` and + `geologic_units`) +- Every route outputs JSON by default +- `columns` and `sections` are summaries of the data returned by `units` +- `lith`, `environ` and `econ` have been refactored to return valid JSON instead + of pipe-delimited strings ## /column -*Removed* - use ````/columns```` and ````/units```` instead. +_Removed_ - use `/columns` and `/units` instead. ## /columns -+ This route has been reworked so that it is almost identical to units, but groups by and summarizes columns -+ Format of lithology fields in CSV output has changed. Instead of "name proportion|name proportion" it is now "name - proportion|name - proportion" -+ Added ability to query to ````environ_id````, ````econ_id````, ````econ````, ````econ_type````, and ````econ_class```` -+ Changes to output fields - -| old | old example | new | new example | -|------------------|--------------|---------------|---------------------| -| units | [1,2,3] | *Removed* | *Removed* | -| lith_max_thick | 1219 | *Removed* | *Removed* | -| lith_min_thick | 1001 | *Removed* | *Removed* | -| pbdb_occs | 9342 | *Removed* | *Removed* | -| lith_types | ["carbonate"] | lith_type | [{"type": "carbonate", "prop": 1}] | -| sections | [2,3,4] | *Removed* | *Removed* | -| area | 43242.2 | col_area | 43242.2 | -| *N/A* | *N/A* | group_col_id | 2.1 | -| *N/A* | *N/A* | environ | [{class: "marine", type: "siliciclastic", name: "submarine fan", environ_id: 37}] | -| lith | "shale 0.1250| siltstone 0.1250|" | lith | [{atts: [ ], name: "sandstone", prop: 0.1667, lith_id: 10, type: "siliciclastic", class: "sedimentary" }] | -| *N/A* | *N/A* | econ | [{type: "hydrocarbon", name: "oil reservoir", econ_id: 4, class: "energy"}]| - - - -+ Default short and long response fields changed: -| old short | new short | -|--------------------------|----------------| -| col_id, area, units, max_thick, min_thick, lith_max_thick, lith_min_thick, lith_types | col_id, col_name, col_group, col_group_id, col_area, project_id | - -| old long (in addition to short) | new long (in addition to short) | -|---------------------------------|-----------------------------------| -| col_name, col_group, col_group_id, b_age, t_age, sections, pbdb_collections, pbdb_occs | max_thick, min_thick, b_age, t_age, pbdb_collections, lith, environ, econ | +- This route has been reworked so that it is almost identical to units, but + groups by and summarizes columns +- Format of lithology fields in CSV output has changed. Instead of "name + proportion|name proportion" it is now "name - proportion|name - proportion" +- Added ability to query to `environ_id`, `econ_id`, `econ`, `econ_type`, and + `econ_class` +- Changes to output fields + +| old | old example | new | new example | +| -------------- | ------------- | ---------------- | --------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------------------------------------------------- | +| units | [1,2,3] | _Removed_ | _Removed_ | +| lith_max_thick | 1219 | _Removed_ | _Removed_ | +| lith_min_thick | 1001 | _Removed_ | _Removed_ | +| pbdb_occs | 9342 | _Removed_ | _Removed_ | +| lith_types | ["carbonate"] | lith_type | [{"type": "carbonate", "prop": 1}] | +| sections | [2,3,4] | _Removed_ | _Removed_ | +| area | 43242.2 | col_area | 43242.2 | +| _N/A_ | _N/A_ | group_col_id | 2.1 | +| _N/A_ | _N/A_ | environ | [{class: "marine", type: "siliciclastic", name: "submarine fan", environ_id: 37}] | +| lith | "shale 0.1250 | siltstone 0.1250 | " | lith | [{atts: [ ], name: "sandstone", prop: 0.1667, lith_id: 10, type: "siliciclastic", class: "sedimentary" }] | +| _N/A_ | _N/A_ | econ | [{type: "hydrocarbon", name: "oil reservoir", econ_id: 4, class: "energy"}] | + +- Default short and long response fields changed: | old short | new short | + |--------------------------|----------------| | col_id, area, units, + max_thick, min_thick, lith_max_thick, lith_min_thick, lith_types | col_id, + col_name, col_group, col_group_id, col_area, project_id | + +| old long (in addition to short) | new long (in addition to short) | +| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| col_name, col_group, col_group_id, b_age, t_age, sections, pbdb_collections, pbdb_occs | max_thick, min_thick, b_age, t_age, pbdb_collections, lith, environ, econ | ## /sections -+ Input and output parameters have changed to be identical to those of ````units````. See changes made to that route for more details. -+ Major conceptual change - now dynamically computes packages based on query (thus multiple objects may share a ````section_id````), where a package is a temporally gap bound section of units. +- Input and output parameters have changed to be identical to those of `units`. + See changes made to that route for more details. +- Major conceptual change - now dynamically computes packages based on query + (thus multiple objects may share a `section_id`), where a package is a + temporally gap bound section of units. ## /section_stats -*Removed* - use ````/sections```` instead. +_Removed_ - use `/sections` instead. ## /fossils -+ Default output is now JSON instead of GeoJSON -+ Added CSV output -+ Changes to output field names: - -| old | new | -|------------|------------| -| collection_no | cltn_id | -| occ | pbdb_occs | -| *N/A* | cltn_name | +- Default output is now JSON instead of GeoJSON +- Added CSV output +- Changes to output field names: +| old | new | +| ------------- | --------- | +| collection_no | cltn_id | +| occ | pbdb_occs | +| _N/A_ | cltn_name | ## /units -+ Format of lithology fields in CSV output has changed. Instead of "name proportion|name proportion" it is now "name - proportion|name - proportion" -+ Empty output fields now return empty strings or arrays instead of NULLs, except strat_name_id -+ Added ability to query to ````lith_id````, ````environ_id````, ````econ_id````, ````econ````, ````econ_type````, ````econ_class````, and ````cltn_id```` (PBDB collection number) -+ Changes to input parameter names and output fields: - -| old | new | -|------------|------------| -| id | unit_id | -| strat_id | strat_name_id | -| u_color | *Removed* | -| pbdb | pbdb_collections | -| LO_h | *Removed* | -| FO_h | *Removed* | -| position_bottom | *Removed* | -| t_interval | t_int_id | -| b_interval | b_int_id | -| LO_interval | t_int_name | -| FO_interval | b_int_name | -| LO_age | t_int_age | -| FO_age | b_int_age | -| *N/A* | econ[] | -| strat_name | unit_name | -| *N/A* | econ | -| *N/A* | measure | - - - - -+ Changes to the format of output fields: - -| old | new | -|------------|------------| -| lith (string), lith_class (string), lith_type (string) | lith (array of objects) | -| environ (string), environ_class (string), environ_type (string) | environ (array of objects) | - +- Format of lithology fields in CSV output has changed. Instead of "name + proportion|name proportion" it is now "name - proportion|name - proportion" +- Empty output fields now return empty strings or arrays instead of NULLs, + except strat_name_id +- Added ability to query to `lith_id`, `environ_id`, `econ_id`, `econ`, + `econ_type`, `econ_class`, and `cltn_id` (PBDB collection number) +- Changes to input parameter names and output fields: + +| old | new | +| --------------- | ---------------- | +| id | unit_id | +| strat_id | strat_name_id | +| u_color | _Removed_ | +| pbdb | pbdb_collections | +| LO_h | _Removed_ | +| FO_h | _Removed_ | +| position_bottom | _Removed_ | +| t_interval | t_int_id | +| b_interval | b_int_id | +| LO_interval | t_int_name | +| FO_interval | b_int_name | +| LO_age | t_int_age | +| FO_age | b_int_age | +| _N/A_ | econ[] | +| strat_name | unit_name | +| _N/A_ | econ | +| _N/A_ | measure | + +- Changes to the format of output fields: + +| old | new | +| --------------------------------------------------------------- | -------------------------- | +| lith (string), lith_class (string), lith_type (string) | lith (array of objects) | +| environ (string), environ_class (string), environ_type (string) | environ (array of objects) | ## /unit_contacts -*Removed* - use ````/units```` instead. +_Removed_ - use `/units` instead. ## /pbdb_report -*Removed* +_Removed_ ## /defs/lithologies -+ input and output parameter ````id```` is now ````lith_id```` -+ Multiple input ````lith_id```` now accepted -+ Removed ````lith```` prefix from all fields except ````lith_id```` +- input and output parameter `id` is now `lith_id` +- Multiple input `lith_id` now accepted +- Removed `lith` prefix from all fields except `lith_id` ## /defs/lithology_attributes -+ input and output parameter ````id```` is now ````lith_att_id```` -+ Multiple input ````lith_att_id```` now accepted -+ + Removed ````lith_att```` prefix from all fields except ````lith_att_id```` +- input and output parameter `id` is now `lith_att_id` +- Multiple input `lith_att_id` now accepted +- - Removed `lith_att` prefix from all fields except `lith_att_id` ## /defs/columns -+ input parameters ````col_id```` and ````col_group_id```` now accept multiple ids +- input parameters `col_id` and `col_group_id` now accept multiple ids ## /defs/environments -+ input and output parameter ````id```` is now ````environ_id```` -+ + Removed ````environ```` prefix from all fields except ````environ_id```` + +- input and output parameter `id` is now `environ_id` +- - Removed `environ` prefix from all fields except `environ_id` ## /defs/econs -+ New route for finding economic definitions +- New route for finding economic definitions ## /defs/intervals -+ Can now specify a ````name```` query parameter -+ Changes to input and output parameters: -| old | new | -|----------|---------| -| id | int_id | -| late_age | t_age | -| early_age| b_age | -| type | int_type | -| timescale_id | timescales| -+ Instead of ````timescale_id```` returning an array of ````timescale_id````s, ````timescales```` returns an array of objects, where each object has a ````timescale_id```` and ````name````. +- Can now specify a `name` query parameter +- Changes to input and output parameters: +| old | new | +| ------------ | ---------- | +| id | int_id | +| late_age | t_age | +| early_age | b_age | +| type | int_type | +| timescale_id | timescales | + +- Instead of `timescale_id` returning an array of `timescale_id`s, `timescales` + returns an array of objects, where each object has a `timescale_id` and + `name`. ## /defs/strat_names -+ parameter ````id```` is now ````strat_name_id```` -+ parameter ````name```` is now ````strat_name```` -+ parameter ````name_like```` is now ````strat_name_like```` -+ parameter ````early_age```` is now ````b_age```` -+ parameter ````late_age```` is now ````t_age```` -+ The ````rank```` parameter can be used with ````strat_name````, ````strat_name_like````, ````strat_name_id````, and ````all```` -+ By default, requesting a ````strat_name```` or ````strat_name_id```` will only return the matching name. Previously this would also return all associated children -+ A parameter ````rule```` was added. To return a strat name and all associated children, use ````rule=down````, and to return the entire hierarchy of a given strat name use ````rule=all````. +- parameter `id` is now `strat_name_id` +- parameter `name` is now `strat_name` +- parameter `name_like` is now `strat_name_like` +- parameter `early_age` is now `b_age` +- parameter `late_age` is now `t_age` +- The `rank` parameter can be used with `strat_name`, `strat_name_like`, + `strat_name_id`, and `all` +- By default, requesting a `strat_name` or `strat_name_id` will only return the + matching name. Previously this would also return all associated children +- A parameter `rule` was added. To return a strat name and all associated + children, use `rule=down`, and to return the entire hierarchy of a given strat + name use `rule=all`. ## /defs/measurements -+ input and output parameter ````id```` is now ````measure_id```` -+ Removed ````measurement```` prefix from all fields except ````measure_id```` + +- input and output parameter `id` is now `measure_id` +- Removed `measurement` prefix from all fields except `measure_id` ## /defs/projects -+ Output paramter ````id```` is now ````project_id```` +- Output paramter `id` is now `project_id` ## /defs/timescales -+ Output paramter ````id```` is now ````timescale_id```` +- Output paramter `id` is now `timescale_id` ## /defs/refs -+ Route added for fetching reference definitions. +- Route added for fetching reference definitions. ## /geologic_units/map -*Removed* - use ````/geologic_units/gmus```` and ````/geologic_units/gmna```` instead. +_Removed_ - use `/geologic_units/gmus` and `/geologic_units/gmna` instead. ## /geologic_units/intersection -*Removed* - use ````/geologic_units/gmus```` and ````/geologic_units/gmna```` instead. +_Removed_ - use `/geologic_units/gmus` and `/geologic_units/gmna` instead. ## /geologic_units -*Removed* - use ````/geologic_units/gmus```` and ````/geologic_units/gmna```` instead. - +_Removed_ - use `/geologic_units/gmus` and `/geologic_units/gmna` instead. ## /geologic_units/gmna (formerly /geologic_units?type=gmna) -+ Added CSV output -+ Added input variable ````shape````, which accepts a valid WKT polygon. If used, a ````buffer```` in km2 can also be specified. -+ Output parameter names and data types have changed: - -| old | new | -|---|---| -| min_age | t_interval | -| age_top (string) | t_age (float) | -| max_age | b_interval | -| age_bottom (string) | b_age (float) | -| interval_name | containing_interval | -| *N/A* | color | -| lithology | lith | -| *N/A* | lith_type | -| *N/A* | lith_class | -| *N/A* | gid | - - - -The following output fields have been added: -````lith_type````, ````lith_class````, and ````gid```` - +- Added CSV output +- Added input variable `shape`, which accepts a valid WKT polygon. If used, a + `buffer` in km2 can also be specified. +- Output parameter names and data types have changed: + +| old | new | +| ------------------- | ------------------- | +| min_age | t_interval | +| age_top (string) | t_age (float) | +| max_age | b_interval | +| age_bottom (string) | b_age (float) | +| interval_name | containing_interval | +| _N/A_ | color | +| lithology | lith | +| _N/A_ | lith_type | +| _N/A_ | lith_class | +| _N/A_ | gid | + +The following output fields have been added: `lith_type`, `lith_class`, and +`gid` ## /geologic_units/gmus (formerly /geologic_units?type=gmus) -+ Added CSV output -+ Added input variable ````shape````, which accepts a valid WKT polygon. If used, a ````buffer```` in km2 can also be specified. -+ Input value ````unit_name```` is now ````search```` -+ Added input variable ````strat_name_id````, which allows direct querying of Macrostrat stratigraphic names that have been matched to GMUS. Example ````/api/v2/geologic_units/gmus?strat_name_id=1,2,3```` -+ Added input variable ````unit_id````, which allows direct querying of GMUS units matched to Macrostrat units. -+ Adding ````adjacents=true```` now allowed when specifying a gid -+ Improved the handling of ````adjacents=true```` when specifying a latitude and longitude -+ Output parameter names and data types have changed: - -| old | new | -|---|---| -| lith1, lith2, lith3, lith4, lith5 (strings) | lithology (array) | -| rt1, rt2, rt2 (strings) | rocktype (array) | -| min_age | t_int_id | -| age_top (string) | t_age (float) | -| max_age | b_int_id | -| age_bottom (string) | b_age (float) | -| unit_age | containing_interval | -| *N/A* | color | + +- Added CSV output +- Added input variable `shape`, which accepts a valid WKT polygon. If used, a + `buffer` in km2 can also be specified. +- Input value `unit_name` is now `search` +- Added input variable `strat_name_id`, which allows direct querying of + Macrostrat stratigraphic names that have been matched to GMUS. Example + `/api/v2/geologic_units/gmus?strat_name_id=1,2,3` +- Added input variable `unit_id`, which allows direct querying of GMUS units + matched to Macrostrat units. +- Adding `adjacents=true` now allowed when specifying a gid +- Improved the handling of `adjacents=true` when specifying a latitude and + longitude +- Output parameter names and data types have changed: + +| old | new | +| ------------------------------------------- | ------------------- | +| lith1, lith2, lith3, lith4, lith5 (strings) | lithology (array) | +| rt1, rt2, rt2 (strings) | rocktype (array) | +| min_age | t_int_id | +| age_top (string) | t_age (float) | +| max_age | b_int_id | +| age_bottom (string) | b_age (float) | +| unit_age | containing_interval | +| _N/A_ | color | ## /geologic_units/burwell -+ New route for returning homogenized map data. Includes the data contained in ````/geologic_units/gmna```` and ````/geologic_units/gmus````, along with many additional sources. +- New route for returning homogenized map data. Includes the data contained in + `/geologic_units/gmna` and `/geologic_units/gmus`, along with many additional + sources. ## /paleogeography -+ Renamed ````plateid```` to ````plate_id```` + +- Renamed `plateid` to `plate_id` ## /mobile/fossils -+ Changed output ````id```` to ````cltn_id```` -+ Changed output ````name```` to ````cltn_name```` +- Changed output `id` to `cltn_id` +- Changed output `name` to `cltn_name` ## /mobile/point_details -+ Under ````gmus````, ````rocktype1````, ````rocktype2````, and ````rocktype3```` have been collapsed into ````rocktype````, which is an array -+ Under ````column````, ````id```` has been renamed ````col_id```` -+ Under ````units````, ````id```` has been renamed ````unit_id````, and ````pbdb```` has been renamed ````pbdb_cltns````, and ````lith```` is now an array of objects, with each object having a ````type```` and ````prop````, or proportion. - +- Under `gmus`, `rocktype1`, `rocktype2`, and `rocktype3` have been collapsed + into `rocktype`, which is an array +- Under `column`, `id` has been renamed `col_id` +- Under `units`, `id` has been renamed `unit_id`, and `pbdb` has been renamed + `pbdb_cltns`, and `lith` is now an array of objects, with each object having a + `type` and `prop`, or proportion. diff --git a/v2/README.md b/v2/README.md index 59c7bac0..23265f05 100644 --- a/v2/README.md +++ b/v2/README.md @@ -1,73 +1,96 @@ # Macrostrat API V2 ## General structure -Each route has it's own file. ````api.js```` creates the Express.js router, and the logic of each route is mapped to its URL in ````index.js````, which allows you to ````require()```` each version of the API. +Each route has it's own file. `api.js` creates the Express.js router, and the +logic of each route is mapped to its URL in `index.js`, which allows you to +`require()` each version of the API. ## Common tasks -Test - ````npm test```` -Build output fields and check for missing definitions - ````npm run-script build-defs```` -Build ````changes.html````, the rendered version of ````CHANGELOG.md```` - ````npm run-script build-changes```` -Validate definitions file - ````npm run-script defs```` +Test - `npm test` Build output fields and check for missing definitions - +`npm run-script build-defs` Build `changes.html`, the rendered version of +`CHANGELOG.md` - `npm run-script build-changes` +Validate definitions file - `npm run-script defs` ## larkin.js -Larkin is a collection of reusable conviniences and utilities used in every route. +Larkin is a collection of reusable conviniences and utilities used in every +route. ### .connectMySQL -Called once when the API is started - creates a connection to MySQL using the credentials supplied in ````credentials.js````. +Called once when the API is started - creates a connection to MySQL using the +credentials supplied in `credentials.js`. ### .queryPg(database, sql, parameters, callback, send, res, format) -Runs a query on a Postgres database given a ````database````, ````sql````, ````parameters````, and a ````callback````. Can optionally directly send the data given ````send````, a boolean, ````res````, and a desired ouput ````format````. Unlike MySQL, node-pg does not create a pool to draw connections from, but rather creates a new connection for each query. +Runs a query on a Postgres database given a `database`, `sql`, `parameters`, and +a `callback`. Can optionally directly send the data given `send`, a boolean, +`res`, and a desired ouput `format`. Unlike MySQL, node-pg does not create a +pool to draw connections from, but rather creates a new connection for each +query. ### .query(sql, parameters, callback, send, res, format) -Runs a query on a database (supplied in ````credentials.js````) using the supplied parameters. As with ````.queryPg````, result can be directly sent to the client if ````send````, ````res````, and ````format```` are supplied. +Runs a query on a database (supplied in `credentials.js`) using the supplied +parameters. As with `.queryPg`, result can be directly sent to the client if +`send`, `res`, and `format` are supplied. ### .sendData(data, res, format) -Sends ````data```` to the client with an encoding specified for ````format````. +Sends `data` to the client with an encoding specified for `format`. ### .sendCompact(data, res, format) -Same as ````.sendData````, but removes all whitespace from the response for an ugly, but compact response. Ideal for routes that always return large amounts of data, such as those that return geographic data. +Same as `.sendData`, but removes all whitespace from the response for an ugly, +but compact response. Ideal for routes that always return large amounts of data, +such as those that return geographic data. ### .sendBare(data, res) -Same as ````.sendCompact````, but removes the response wrapper (````{"success": {....}}````). Used for formats ````geojson_bare```` and ````topojson_bare```` to increase interoperability with other tools and utilities such as QGIS. +Same as `.sendCompact`, but removes the response wrapper +(`{"success": {....}}`). Used for formats `geojson_bare` and `topojson_bare` to +increase interoperability with other tools and utilities such as QGIS. ### .info(request, res) -Given a request, return a definition of the route to the client. Used for the base of all routes, i.e. ````/units````. +Given a request, return a definition of the route to the client. Used for the +base of all routes, i.e. `/units`. ### .error(req, res, next, message, code) -Return an error and route definition to the client with an optional ````message```` and error code. Used when bad requests are made, usually with unknown or unusable parameters. +Return an error and route definition to the client with an optional `message` +and error code. Used when bad requests are made, usually with unknown or +unusable parameters. ### .log(type, messsage) -Simply log something to the console. A convinience for ````console.log````. +Simply log something to the console. A convinience for `console.log`. ### .defineFields(route, callback) -Fetches and returns all field definitions for a given route. Always called by ````.defineRoute````. +Fetches and returns all field definitions for a given route. Always called by +`.defineRoute`. ### .defineRoute(route, callback) -Forms a definition response for a given route. Fetches all field defintions using ````.defineFields````. Usually called by ````.error````. +Forms a definition response for a given route. Fetches all field defintions +using `.defineFields`. Usually called by `.error`. ### .getOutputFormat(requestedFormat) -Given a requested format, simply maps ````geojson_bare```` to ````geojson````, ````topojson_bare```` to ````topojson````, and ````geojson```` and ````topojson```` to ````geojson````. +Given a requested format, simply maps `geojson_bare` to `geojson`, +`topojson_bare` to `topojson`, and `geojson` and `topojson` to `geojson`. ### .jsonifyPipes(data, data_type) -Takes a pipe-delimited field and turns it into a JSON array, with an optional ````data_type````, which can be "integers", "floats", or "strings". Defaults to "strings". -```` +Takes a pipe-delimited field and turns it into a JSON array, with an optional +`data_type`, which can be "integers", "floats", or "strings". Defaults to +"strings". + +``` var output = "54|1|98"; output = larkin.jsonifyPipes(output, "numeric"); @@ -79,4 +102,4 @@ var someStrings = "carbonate|marine|shallow subtidal"; someStrings = larkin.jsonifyPipes(someStrings); --> someStrings now equals ["carbonate", "marine", "shallow subtidal"] -```` +``` diff --git a/v2/age_model.ts b/v2/age_model.ts index 06708a9c..153474ae 100644 --- a/v2/age_model.ts +++ b/v2/age_model.ts @@ -1,43 +1,51 @@ -var api = require('./api') -var dbgeo = require('dbgeo') -var larkin = require('./larkin') +var api = require("./api"); +var dbgeo = require("dbgeo"); +var larkin = require("./larkin"); // need to fix bug to allow both col_id and measurement type parameters at same time -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } else if (req.query.section_id || req.query.col_id) { - } else { - return larkin.error(req, res, next, "Invalid Parameters. You must specify a section_id(s) or a col_id(s)."); - } + } else { + return larkin.error( + req, + res, + next, + "Invalid Parameters. You must specify a section_id(s) or a col_id(s).", + ); + } - var where = [] - var params = [] - var limit = '' - var geo = (req.query.format && api.acceptedFormats.geo[req.query.format]) ? true : false; + var where = []; + var params = []; + var limit = ""; + var geo = + req.query.format && api.acceptedFormats.geo[req.query.format] + ? true + : false; if (req.query.col_id) { - where.push("units_sections.col_id IN (:col_id)") - params["col_id"] = larkin.parseMultipleIds(req.query.col_id); + where.push("units_sections.col_id IN (:col_id)"); + params["col_id"] = larkin.parseMultipleIds(req.query.col_id); } if (req.query.section_id) { - where.push("units_sections.section_id IN (:section_id)") - params["section_id"] = larkin.parseMultipleIds(req.query.section_id); + where.push("units_sections.section_id IN (:section_id)"); + params["section_id"] = larkin.parseMultipleIds(req.query.section_id); } if (where.length) { - where = 'WHERE ' + where.join(' AND ') + where = "WHERE " + where.join(" AND "); } else { - where = '' - limit = 'LIMIT 10' + where = ""; + limit = "LIMIT 10"; } - if (req.query.hasOwnProperty('sample')) { - limit = 'LIMIT 10' + if (req.query.hasOwnProperty("sample")) { + limit = "LIMIT 10"; } - var select=` + var select = ` unit_boundaries.id AS boundary_id, units_sections.col_id, units_sections.section_id, @@ -52,10 +60,9 @@ module.exports = function(req, res, next) { boundary_position, unit_boundaries.unit_id as unit_below, unit_id_2 as unit_above, - unit_boundaries.ref_id ` + unit_boundaries.ref_id `; - - var sql=`SELECT + var sql = `SELECT ${select} FROM unit_boundaries JOIN units_sections USING (section_id) @@ -63,42 +70,66 @@ module.exports = function(req, res, next) { ${where} GROUP BY unit_boundaries.id ${limit} - ` - //console.log(sql) + `; + //console.log(sql) - var format = (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json"; + var format = api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json"; - larkin.query(sql, params, function(error, response) { - if (error) { - larkin.error(req, res, next, error); - } else { - if (geo) { - dbgeo.parse(response, { - "outputFormat": larkin.getOutputFormat(req.query.format), - "geometryColumn": ["lng", "lat"], - "geometryType": "ll" - }, function(error, response) { - if (error) { - larkin.error(req, res, next, "Something went wrong"); - } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: "refs" - }, { - data: response - }); - } - } - ); - } else { larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : 'json', - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'ref_id' - }, { - data: response - }) - } - } - }) -} + larkin.query(sql, params, function (error, response) { + if (error) { + larkin.error(req, res, next, error); + } else { + if (geo) { + dbgeo.parse( + response, + { + outputFormat: larkin.getOutputFormat(req.query.format), + geometryColumn: ["lng", "lat"], + geometryType: "ll", + }, + function (error, response) { + if (error) { + larkin.error(req, res, next, "Something went wrong"); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + refs: "refs", + }, + { + data: response, + }, + ); + } + }, + ); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + refs: "ref_id", + }, + { + data: response, + }, + ); + } + } + }); +}; diff --git a/v2/api.ts b/v2/api.ts index 01c1eda6..311fb5c1 100644 --- a/v2/api.ts +++ b/v2/api.ts @@ -3,9 +3,12 @@ var burwellTileServer = require("./burwellTileServer"); var api = express.Router(); -api.use(function(req, res, next) { +api.use(function (req, res, next) { res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); + res.header( + "Access-Control-Allow-Headers", + "Origin, X-Requested-With, Content-Type, Accept", + ); res.header("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS"); next(); }); @@ -14,20 +17,20 @@ api.use(function(req, res, next) { api.use(burwellTileServer); api.acceptedFormats = { - "standard": { - "json": true, - "csv": true + standard: { + json: true, + csv: true, }, - "geo": { - "geojson": true, - "topojson": true, - "geojson_bare": true, - "topojson_bare": true + geo: { + geojson: true, + topojson: true, + geojson_bare: true, + topojson_bare: true, + }, + bare: { + geojson_bare: true, + topojson_bare: true, }, - "bare": { - "geojson_bare": true, - "topojson_bare": true - } }; api.version = 2; diff --git a/v2/boundaries.ts b/v2/boundaries.ts index cce6d129..f9fd60ec 100644 --- a/v2/boundaries.ts +++ b/v2/boundaries.ts @@ -1,5 +1,5 @@ -const larkin = require('./larkin') -const dbgeo = require('dbgeo') +const larkin = require("./larkin"); +const dbgeo = require("dbgeo"); module.exports = (req, res, next) => { if (Object.keys(req.query).length < 1) { @@ -7,35 +7,49 @@ module.exports = (req, res, next) => { } if (!req.query.boundary_id) { - return larkin.error(req, res, next) + return larkin.error(req, res, next); } - req.query.boundary_id = req.query.boundary_id.split(',') + req.query.boundary_id = req.query.boundary_id.split(","); - larkin.queryPg('burwell', ` + larkin.queryPg( + "burwell", + ` SELECT boundary_id, geom FROM geologic_boundaries.boundaries WHERE boundary_id = ANY($1) - `, [ req.query.boundary_id ], (error, result) => { - if (error || !result) { - return larkin.error(req, res, next) - } - - dbgeo.parse(result.rows, { - outputFormat: 'geojson', - precision: 4 - }, (error, result) => { - if (error) { - return larkin.error(req, res, next) + `, + [req.query.boundary_id], + (error, result) => { + if (error || !result) { + return larkin.error(req, res, next); } - larkin.sendData(req, res, next, { - format: 'json', - bare: true, - compact: true - }, { - data: result - }) - }) - }) + dbgeo.parse( + result.rows, + { + outputFormat: "geojson", + precision: 4, + }, + (error, result) => { + if (error) { + return larkin.error(req, res, next); + } -} + larkin.sendData( + req, + res, + next, + { + format: "json", + bare: true, + compact: true, + }, + { + data: result, + }, + ); + }, + ); + }, + ); +}; diff --git a/v2/burwellTileServer.ts b/v2/burwellTileServer.ts index 60a33246..a3e2c51e 100644 --- a/v2/burwellTileServer.ts +++ b/v2/burwellTileServer.ts @@ -1,64 +1,60 @@ -const tilestrata = require('tilestrata') -const http = require('http') -const fs = require('fs') +const tilestrata = require("tilestrata"); +const http = require("http"); +const fs = require("fs"); // Proxy all tile requests to the new tileserver const passThrough = { init: (server, callback) => { - callback() + callback(); }, reqhook: (server, tile, req, res, callback) => { let options = { - hostname: 'localhost', + hostname: "localhost", port: 5555, - path: `/carto/${tile.z}/${tile.x}/${tile.y}.png${req._parsedUrl.search || ''}`, + path: `/carto/${tile.z}/${tile.x}/${tile.y}.png${req._parsedUrl.search || ""}`, headers: { - referer: req.headers.referer || '' + referer: req.headers.referer || "", }, - } + }; let tileReq = http.get(options, (response) => { if (!response) { - fs.readFile(__dirname + '/default@2x.png', (error, buffer) => { - res.set('Content-Type', 'image/png') - res.end(buffer) - }) + fs.readFile(__dirname + "/default@2x.png", (error, buffer) => { + res.set("Content-Type", "image/png"); + res.end(buffer); + }); } - let headers = response.headers + let headers = response.headers; res.set({ - 'Content-Type': 'image/png', - 'content-length': headers['content-length'], - 'access-control-allow-origin': '*', - 'Cache-Control': headers['cache-control'], - 'etag': headers['etag'], - 'expires': headers['expires'], - 'strict-transport-security': headers['strict-transport-security'], - 'X-Powered-By': 'Tilestrata' - }) - response.pipe(res) - }) - - tileReq.on('error', (error) => { - fs.readFile(__dirname + '/default@2x.png', (error, buffer) => { - res.set('Content-Type', 'image/png') - res.end(buffer) - }) - }) - } - -} + "Content-Type": "image/png", + "content-length": headers["content-length"], + "access-control-allow-origin": "*", + "Cache-Control": headers["cache-control"], + etag: headers["etag"], + expires: headers["expires"], + "strict-transport-security": headers["strict-transport-security"], + "X-Powered-By": "Tilestrata", + }); + response.pipe(res); + }); + + tileReq.on("error", (error) => { + fs.readFile(__dirname + "/default@2x.png", (error, buffer) => { + res.set("Content-Type", "image/png"); + res.end(buffer); + }); + }); + }, +}; module.exports = tilestrata.middleware({ - prefix: '/maps/burwell', - server: (function() { + prefix: "/maps/burwell", + server: (function () { var strata = tilestrata(); - strata.layer('emphasized') - .route('tile.png') - .use(passThrough) - - return strata + strata.layer("emphasized").route("tile.png").use(passThrough); - }()) -}) + return strata; + })(), +}); diff --git a/v2/carto/index.ts b/v2/carto/index.ts index d61adadf..94f1d6c4 100644 --- a/v2/carto/index.ts +++ b/v2/carto/index.ts @@ -2,19 +2,16 @@ var express = require("express"); var carto = express.Router(); var larkin = require("../larkin"); -carto.route("/") - .get(function(req, res, next) { - larkin.defineCategory("carto", function(error, routes) { - res.json({ - "success": routes - }); +carto.route("/").get(function (req, res, next) { + larkin.defineCategory("carto", function (error, routes) { + res.json({ + success: routes, }); - } -); - -carto.route("/small") - .get(function(req, res, next) { - require("./small")(req, res, next); }); +}); + +carto.route("/small").get(function (req, res, next) { + require("./small")(req, res, next); +}); module.exports = carto; diff --git a/v2/carto/small.ts b/v2/carto/small.ts index 6a7a5738..bba4828d 100644 --- a/v2/carto/small.ts +++ b/v2/carto/small.ts @@ -5,7 +5,7 @@ var gp = require("geojson-precision"); var mapshaper = require("mapshaper"); var larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { larkin.info(req, res, next); } else { @@ -18,85 +18,91 @@ module.exports = function(req, res, next, cb) { var pre = ""; // Process the parameters - async.parallel([ - - // Lat/lng - function(callback) { - if (req.query.lat && req.query.lng) { - req.query.lng = larkin.normalizeLng(req.query.lng); - where.push("ST_Intersects(s1.geom, ST_GeomFromText($1, 4326))"); - params.push("POINT(" + req.query.lng + " " + req.query.lat + ")"); - } - callback(null); - }, - - // shape - function(callback) { - if (req.query.shape) { - // Validate geometry and geometry area - larkin.queryPg("burwell", "SELECT ST_Area($1::geography)/1000000 area", [req.query.shape], function(error, result) { - if (error) return callback("Invalid geometry passed"); - - if (result.rows[0].area > 100000000) { - return callback("Geometry too large"); - } - - pre = ` + async.parallel( + [ + // Lat/lng + function (callback) { + if (req.query.lat && req.query.lng) { + req.query.lng = larkin.normalizeLng(req.query.lng); + where.push("ST_Intersects(s1.geom, ST_GeomFromText($1, 4326))"); + params.push("POINT(" + req.query.lng + " " + req.query.lat + ")"); + } + callback(null); + }, + + // shape + function (callback) { + if (req.query.shape) { + // Validate geometry and geometry area + larkin.queryPg( + "burwell", + "SELECT ST_Area($1::geography)/1000000 area", + [req.query.shape], + function (error, result) { + if (error) return callback("Invalid geometry passed"); + + if (result.rows[0].area > 100000000) { + return callback("Geometry too large"); + } + + pre = ` WITH shape AS ( SELECT ST_GeomFromText($1) AS buffer ) `; - params.push(('SRID=4326;' + req.query.shape)); + params.push("SRID=4326;" + req.query.shape); + callback(null); + }, + ); + } else { callback(null); - }); + } + }, + ], + function (error) { + if (error) { + return larkin.error(req, res, next, error); + } + // If no valid parameters passed, return an Error + if (where.length < 1 && !("sample" in req.query) && pre.length < 1) { + if (cb) return cb("No valid parameters passed"); + return larkin.error(req, res, next, "No valid parameters passed"); + } + + if (where.length > 0) { + where = " WHERE " + where.join(" AND "); } else { - callback(null); + where = ""; } - } - - ], function(error) { - if (error) { - return larkin.error(req, res, next, error); - } - // If no valid parameters passed, return an Error - if (where.length < 1 && !("sample" in req.query) && pre.length < 1) { - if (cb) return cb("No valid parameters passed"); - return larkin.error(req, res, next, "No valid parameters passed"); - } - - if (where.length > 0) { - where = " WHERE " + where.join(" AND "); - } else { - where = ""; - } - - var limit = ("sample" in req.query) ? " LIMIT 5" : ""; - - var sql = pre + " SELECT s1.map_id, s1.scale, s1.source_id, name, strat_name, age, lith, descrip, comments, best_age_top, best_age_bottom, t_interval AS t_int, b_interval AS b_int, color"; - var join = ""; - - // Modify the query if geometry is being requested - if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - if (req.query.shape) { - sql += `, + + var limit = "sample" in req.query ? " LIMIT 5" : ""; + + var sql = + pre + + " SELECT s1.map_id, s1.scale, s1.source_id, name, strat_name, age, lith, descrip, comments, best_age_top, best_age_bottom, t_interval AS t_int, b_interval AS b_int, color"; + var join = ""; + + // Modify the query if geometry is being requested + if (req.query.format && api.acceptedFormats.geo[req.query.format]) { + if (req.query.shape) { + sql += `, CASE WHEN ST_Within(s1.geom, shape.buffer) THEN ST_AsGeoJSON(s1.geom) ELSE ST_AsGeoJSON(ST_Multi(ST_Intersection(s1.geom, shape.buffer))) END AS geometry `; - join = ` + join = ` JOIN shape ON ST_Intersects(s1.geom, shape.buffer) `; - - } else { - sql += ", ST_AsGeoJSON(geom) geometry"; + } else { + sql += ", ST_AsGeoJSON(geom) geometry"; + } } - } - sql += ` + sql += ` FROM carto_new.small s1 LEFT JOIN ( SELECT * FROM maps.tiny @@ -111,62 +117,87 @@ module.exports = function(req, res, next, cb) { ${join} ${where} ${limit} - ` - // console.log(sql) - - larkin.queryPg("burwell", sql, params, function(error, result) { - if (error) { - if (cb) return cb(error); - return larkin.error(req, res, next, error); - } - - // Requesting geographic data - if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - // Convert the db response to a proper FeatureCollection - dbgeo.parse(result.rows, { - "geometryColumn": "geometry", - "geometryType": "geojson", - "outputFormat": larkin.getOutputFormat(req.query.format) - }, function(error, result) { - if (error) { - if (cb) return cb(error); - larkin.error(req, res, next, error); - } else { - // Trim precision if GeoJSON - if (larkin.getOutputFormat(req.query.format) === "geojson") { - result = gp(result, 5); - } - - - // Simplify the output! - mapshaper.applyCommands("-simplify 14% visvalingam weighted", result, function(error, data) { - if (cb) return cb(null, result); - - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'source_id' - }, { - data: (data) ? JSON.parse(data) : result - }); - }); - - } - }); - } else { - // Not requesting geographic data - if (cb) return cb(null, result.rows); - - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true, - refs: 'source_id' - }, { - data: result.rows - }); - } - }); - }); + `; + // console.log(sql) + + larkin.queryPg("burwell", sql, params, function (error, result) { + if (error) { + if (cb) return cb(error); + return larkin.error(req, res, next, error); + } + + // Requesting geographic data + if (req.query.format && api.acceptedFormats.geo[req.query.format]) { + // Convert the db response to a proper FeatureCollection + dbgeo.parse( + result.rows, + { + geometryColumn: "geometry", + geometryType: "geojson", + outputFormat: larkin.getOutputFormat(req.query.format), + }, + function (error, result) { + if (error) { + if (cb) return cb(error); + larkin.error(req, res, next, error); + } else { + // Trim precision if GeoJSON + if (larkin.getOutputFormat(req.query.format) === "geojson") { + result = gp(result, 5); + } + + // Simplify the output! + mapshaper.applyCommands( + "-simplify 14% visvalingam weighted", + result, + function (error, data) { + if (cb) return cb(null, result); + + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + refs: "source_id", + }, + { + data: data ? JSON.parse(data) : result, + }, + ); + }, + ); + } + }, + ); + } else { + // Not requesting geographic data + if (cb) return cb(null, result.rows); + + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + compact: true, + refs: "source_id", + }, + { + data: result.rows, + }, + ); + } + }); + }, + ); } -} +}; diff --git a/v2/catchall.ts b/v2/catchall.ts index e908f3b0..13f17e6d 100644 --- a/v2/catchall.ts +++ b/v2/catchall.ts @@ -1,5 +1,5 @@ -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { var err = new Error(); err.status = 404; next(err); -} +}; diff --git a/v2/changes.html b/v2/changes.html index 678005f4..d448264d 100644 --- a/v2/changes.html +++ b/v2/changes.html @@ -1,701 +1,27361 @@ - + - - - CHANGELOG.md - Grip - + + + CHANGELOG.md - Grip + - - - -
-
-
-
- - -
-
- + /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ + html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-size-adjust: 100%; + } + body { + margin: 0; + } + article, + aside, + details, + figcaption, + figure, + footer, + header, + hgroup, + main, + menu, + nav, + section, + summary { + display: block; + } + audio, + canvas, + progress, + video { + display: inline-block; + vertical-align: baseline; + } + audio:not([controls]) { + display: none; + height: 0; + } + [hidden], + template { + display: none; + } + a { + background-color: transparent; + } + a:active, + a:hover { + outline: 0; + } + abbr[title] { + border-bottom: 1px dotted; + } + b, + strong { + font-weight: bold; + } + dfn { + font-style: italic; + } + h1 { + font-size: 2em; + margin: 0.67em 0; + } + mark { + background: #ff0; + color: #000; + } + small { + font-size: 80%; + } + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + sup { + top: -0.5em; + } + sub { + bottom: -0.25em; + } + img { + border: 0; + } + svg:not(:root) { + overflow: hidden; + } + figure { + margin: 1em 40px; + } + hr { + box-sizing: content-box; + height: 0; + } + pre { + overflow: auto; + } + code, + kbd, + pre, + samp { + font-family: monospace, monospace; + font-size: 1em; + } + button, + input, + optgroup, + select, + textarea { + color: inherit; + font: inherit; + margin: 0; + } + button { + overflow: visible; + } + button, + select { + text-transform: none; + } + button, + html input[type="button"], + input[type="reset"], + input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; + } + button[disabled], + html input[disabled] { + cursor: default; + } + button::-moz-focus-inner, + input::-moz-focus-inner { + border: 0; + padding: 0; + } + input { + line-height: normal; + } + input[type="checkbox"], + input[type="radio"] { + box-sizing: border-box; + padding: 0; + } + input[type="number"]::-webkit-inner-spin-button, + input[type="number"]::-webkit-outer-spin-button { + height: auto; + } + input[type="search"] { + -webkit-appearance: textfield; + box-sizing: content-box; + } + input[type="search"]::-webkit-search-cancel-button, + input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; + } + legend { + border: 0; + padding: 0; + } + textarea { + overflow: auto; + } + optgroup { + font-weight: bold; + } + table { + border-collapse: collapse; + border-spacing: 0; + } + td, + th { + padding: 0; + } + * { + box-sizing: border-box; + } + input, + select, + textarea, + button { + font: + 13px/1.4 Helvetica, + arial, + nimbussansl, + liberationsans, + freesans, + clean, + sans-serif, + "Segoe UI Emoji", + "Segoe UI Symbol"; + } + body { + font: + 13px/1.4 Helvetica, + arial, + nimbussansl, + liberationsans, + freesans, + clean, + sans-serif, + "Segoe UI Emoji", + "Segoe UI Symbol"; + color: #333; + background-color: #fff; + } + a { + color: #4078c0; + text-decoration: none; + } + a:hover, + a:active { + text-decoration: underline; + } + hr, + .rule { + height: 0; + margin: 15px 0; + overflow: hidden; + background: transparent; + border: 0; + border-bottom: 1px solid #ddd; + } + hr:before, + .rule:before { + display: table; + content: ""; + } + hr:after, + .rule:after { + display: table; + clear: both; + content: ""; + } + h1, + h2, + h3, + h4, + h5, + h6 { + margin-top: 15px; + margin-bottom: 15px; + line-height: 1.1; + } + h1 { + font-size: 30px; + } + h2 { + font-size: 21px; + } + h3 { + font-size: 16px; + } + h4 { + font-size: 14px; + } + h5 { + font-size: 12px; + } + h6 { + font-size: 11px; + } + small { + font-size: 90%; + } + blockquote { + margin: 0; + } + .lead { + margin-bottom: 30px; + font-size: 20px; + font-weight: 300; + color: #555; + } + .text-muted { + color: #767676; + } + .text-danger { + color: #bd2c00; + } + .text-emphasized { + font-weight: bold; + color: #333; + } + ul, + ol { + padding: 0; + margin-top: 0; + margin-bottom: 0; + } + ol ol, + ul ol { + list-style-type: lower-roman; + } + ul ul ol, + ul ol ol, + ol ul ol, + ol ol ol { + list-style-type: lower-alpha; + } + dd { + margin-left: 0; + } + tt, + code { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; + } + pre { + margin-top: 0; + margin-bottom: 0; + font: + 12px Consolas, + "Liberation Mono", + Menlo, + Courier, + monospace; + } + .container { + width: 980px; + margin-right: auto; + margin-left: auto; + } + .container:before { + display: table; + content: ""; + } + .container:after { + display: table; + clear: both; + content: ""; + } + .columns { + margin-right: -10px; + margin-left: -10px; + } + .columns:before { + display: table; + content: ""; + } + .columns:after { + display: table; + clear: both; + content: ""; + } + .column { + float: left; + padding-right: 10px; + padding-left: 10px; + } + .one-third { + width: 33.333333%; + } + .two-thirds { + width: 66.666667%; + } + .one-fourth { + width: 25%; + } + .one-half { + width: 50%; + } + .three-fourths { + width: 75%; + } + .one-fifth { + width: 20%; + } + .four-fifths { + width: 80%; + } + .single-column { + padding-right: 10px; + padding-left: 10px; + } + .table-column { + display: table-cell; + width: 1%; + padding-right: 10px; + padding-left: 10px; + vertical-align: top; + } + fieldset { + padding: 0; + margin: 0; + border: 0; + } + label { + font-size: 13px; + font-weight: bold; + } + .form-control, + input[type="text"], + input[type="password"], + input[type="email"], + input[type="number"], + input[type="tel"], + input[type="url"], + textarea { + min-height: 34px; + padding: 7px 8px; + font-size: 13px; + color: #333; + vertical-align: middle; + background-color: #fff; + background-repeat: no-repeat; + background-position: right center; + border: 1px solid #ccc; + border-radius: 3px; + outline: none; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); + } + .form-control.focus, + .form-control:focus, + input[type="text"].focus, + input[type="text"]:focus, + .focused .drag-and-drop, + input[type="password"].focus, + input[type="password"]:focus, + input[type="email"].focus, + input[type="email"]:focus, + input[type="number"].focus, + input[type="number"]:focus, + input[type="tel"].focus, + input[type="tel"]:focus, + input[type="url"].focus, + input[type="url"]:focus, + textarea.focus, + textarea:focus { + border-color: #51a7e8; + box-shadow: + inset 0 1px 2px rgba(0, 0, 0, 0.075), + 0 0 5px rgba(81, 167, 232, 0.5); + } + input.input-contrast, + .input-contrast { + background-color: #fafafa; + } + input.input-contrast:focus, + .input-contrast:focus { + background-color: #fff; + } + ::-webkit-input-placeholder { + color: #aaa; + } + ::-moz-placeholder { + color: #aaa; + } + :-ms-input-placeholder { + color: #aaa; + } + ::placeholder { + color: #aaa; + } + input.input-mini { + min-height: 26px; + padding-top: 4px; + padding-bottom: 4px; + font-size: 12px; + } + input.input-large { + padding: 6px 10px; + font-size: 16px; + } + .input-block { + display: block; + width: 100%; + } + .input-monospace { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + } + dl.form { + margin: 15px 0; + } + dl.form input[type="text"], + dl.form input[type="password"], + dl.form input[type="email"], + dl.form input[type="url"], + dl.form textarea { + background-color: #fafafa; + } + dl.form input[type="text"]:focus, + dl.form .focused .drag-and-drop, + .focused dl.form .drag-and-drop, + dl.form input[type="password"]:focus, + dl.form input[type="email"]:focus, + dl.form input[type="url"]:focus, + dl.form textarea:focus { + background-color: #fff; + } + dl.form > dt { + margin: 0 0 6px; + } + dl.form > dt label { + position: relative; + } + dl.form.flattened > dt { + float: left; + margin: 0; + line-height: 32px; + } + dl.form.flattened > dd { + line-height: 32px; + } + dl.form > dd input[type="text"], + dl.form > dd input[type="password"], + dl.form > dd input[type="email"], + dl.form > dd input[type="url"] { + width: 440px; + max-width: 100%; + margin-right: 5px; + background-position-x: 98%; + } + dl.form > dd input.shorter { + width: 130px; + } + dl.form > dd input.short { + width: 250px; + } + dl.form > dd input.long { + width: 100%; + } + dl.form > dd textarea { + width: 100%; + height: 200px; + min-height: 200px; + } + dl.form > dd textarea.short { + height: 50px; + min-height: 50px; + } + dl.form > dd h4 { + margin: 4px 0 0; + } + dl.form > dd h4.is-error { + color: #bd2c00; + } + dl.form > dd h4.is-success { + color: #6cc644; + } + dl.form > dd h4 + p.note { + margin-top: 0; + } + dl.form.required > dt > label:after { + padding-left: 5px; + color: #9f1006; + content: "*"; + } + dl.form .success, + dl.form .error, + dl.form .indicator { + display: none; + font-size: 12px; + font-weight: bold; + } + dl.form.loading { + opacity: 0.5; + } + dl.form.loading .indicator { + display: inline; + } + dl.form.loading .spinner { + display: inline-block; + vertical-align: middle; + } + dl.form.successful .success { + display: inline; + color: #390; + } + dl.form.errored > dt label { + color: #900; + } + dl.form.errored .error { + display: inline; + color: #900; + } + dl.form.errored dd.error, + dl.form.errored dd.warning { + display: inline-block; + padding: 5px; + font-size: 11px; + color: #494620; + background: #f7ea57; + border: 1px solid #c0b536; + border-top-color: #fff; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + dl.form.warn .warning { + display: inline; + color: #900; + } + dl.form.warn dd.warning { + display: inline-block; + padding: 5px; + font-size: 11px; + color: #494620; + background: #f7ea57; + border: 1px solid #c0b536; + border-top-color: #fff; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + dl.form .form-note { + display: inline-block; + padding: 5px; + margin-top: -1px; + font-size: 11px; + color: #494620; + background: #f7ea57; + border: 1px solid #c0b536; + border-top-color: #fff; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + .note { + min-height: 17px; + margin: 4px 0 2px; + font-size: 12px; + color: #767676; + } + .note .spinner { + margin-right: 3px; + vertical-align: middle; + } + .form-checkbox { + padding-left: 20px; + margin: 15px 0; + vertical-align: middle; + } + .form-checkbox label em.highlight { + position: relative; + left: -4px; + padding: 2px 4px; + font-style: normal; + background: #fffbdc; + border-radius: 3px; + } + .form-checkbox input[type="checkbox"], + .form-checkbox input[type="radio"] { + float: left; + margin: 2px 0 0 -20px; + vertical-align: middle; + } + .form-checkbox .note { + display: block; + margin: 0; + font-size: 12px; + font-weight: normal; + color: #666; + } + .hfields { + margin: 15px 0; + } + .hfields:before { + display: table; + content: ""; + } + .hfields:after { + display: table; + clear: both; + content: ""; + } + .hfields dl.form { + float: left; + margin: 0 30px 0 0; + } + .hfields dl.form > dt label { + display: inline-block; + margin: 5px 0 0; + color: #666; + } + .hfields dl.form > dt img { + position: relative; + top: -2px; + } + .hfields .btn { + float: left; + margin: 28px 25px 0 -20px; + } + .hfields select { + margin-top: 5px; + } + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + margin: 0; + -webkit-appearance: none; + } + .input-group { + display: table; + } + .input-group input { + position: relative; + width: 100%; + } + .input-group input:focus { + z-index: 2; + } + .input-group input[type="text"] + .btn { + margin-left: 0; + } + .input-group.inline { + display: inline-table; + } + .input-group input, + .input-group-button { + display: table-cell; + } + .input-group-button { + width: 1%; + vertical-align: middle; + } + .input-group input:first-child, + .input-group-button:first-child .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .input-group-button:first-child .btn { + margin-right: -1px; + } + .input-group input:last-child, + .input-group-button:last-child .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .input-group-button:last-child .btn { + margin-left: -1px; + } + .form-actions:before { + display: table; + content: ""; + } + .form-actions:after { + display: table; + clear: both; + content: ""; + } + .form-actions .btn { + float: right; + } + .form-actions .btn + .btn { + margin-right: 5px; + } + .form-warning { + padding: 8px 10px; + margin: 10px 0; + font-size: 14px; + color: #333; + background: #ffffe2; + border: 1px solid #e7e4c2; + border-radius: 4px; + } + .form-warning p { + margin: 0; + line-height: 1.5; + } + .form-warning strong { + color: #000; + } + .form-warning a { + font-weight: bold; + } + .status-indicator { + font: normal normal 16px/1 "octicons"; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; + margin-left: 5px; + } + .status-indicator-success:before { + color: #6cc644; + content: "\f03a"; + } + .status-indicator-failed:before { + color: #bd2c00; + content: "\f02d"; + } + .flash-messages { + margin-top: 15px; + margin-bottom: 15px; + } + .flash, + .flash-global { + position: relative; + font-size: 14px; + line-height: 1.6; + color: #246; + background-color: #e2eef9; + border: solid 1px #bac6d3; + } + .flash.flash-warn, + .flash-global.flash-warn { + color: #4c4a42; + background-color: #fff9ea; + border-color: #dfd8c2; + } + .flash.flash-error, + .flash-global.flash-error { + color: #911; + background-color: #fcdede; + border-color: #d2b2b2; + } + .flash .flash-close, + .flash-global .flash-close { + float: right; + padding: 17px; + margin-top: -15px; + margin-right: -15px; + margin-left: 20px; + color: inherit; + text-decoration: none; + cursor: pointer; + opacity: 0.6; + } + .flash .flash-close:hover, + .flash-global .flash-close:hover { + opacity: 1; + } + .flash p:last-child, + .flash-global p:last-child { + margin-bottom: 0; + } + .flash .flash-action, + .flash-global .flash-action { + float: right; + margin-top: -4px; + margin-left: 20px; + } + .flash a, + .flash-global a { + font-weight: bold; + } + .flash { + padding: 15px; + border-radius: 3px; + } + .flash + .flash { + margin-top: 5px; + } + .flash-with-icon { + padding-left: 40px; + } + .flash-with-icon > .octicon { + float: left; + margin-top: 3px; + margin-left: -25px; + } + .flash-global { + padding: 10px; + margin-top: -1px; + border-width: 1px 0; + } + .flash-global h2, + .flash-global p { + margin-top: 0; + margin-bottom: 0; + font-size: 14px; + line-height: 1.4; + } + .flash-global .flash-action { + margin-top: 5px; + } + .flash-title { + margin-top: 0; + margin-bottom: 5px; + } + .avatar { + display: inline-block; + overflow: hidden; + line-height: 1; + vertical-align: middle; + border-radius: 3px; + } + .avatar-small { + border-radius: 2px; + } + .avatar-link { + float: left; + line-height: 1; + } + .avatar-group-item { + display: inline-block; + margin-bottom: 3px; + } + .avatar-parent-child { + position: relative; + } + .avatar-child { + position: absolute; + right: -15%; + bottom: -9%; + border-radius: 2px; + box-shadow: -2px -2px 0 rgba(255, 255, 255, 0.8); + } + .blankslate { + position: relative; + padding: 30px; + text-align: center; + background-color: #fafafa; + border: 1px solid #e5e5e5; + border-radius: 3px; + box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.05); + } + .blankslate.clean-background { + background: none; + border: 0; + box-shadow: none; + } + .blankslate.capped { + border-radius: 0 0 3px 3px; + } + .blankslate.spacious { + padding: 100px 60px 120px; + } + .blankslate.has-fixed-width { + width: 485px; + margin: 0 auto; + } + .blankslate.large-format h3 { + margin: 0.75em 0; + font-size: 20px; + } + .blankslate.large-format p { + font-size: 16px; + } + .blankslate.large-format p.has-fixed-width { + width: 540px; + margin: 0 auto; + text-align: left; + } + .blankslate.large-format .mega-octicon { + width: 40px; + height: 40px; + font-size: 40px; + color: #aaa; + } + .blankslate.large-format .octicon-inbox { + font-size: 48px; + line-height: 40px; + } + .blankslate code { + padding: 2px 5px 3px; + font-size: 14px; + background: #fff; + border: 1px solid #eee; + border-radius: 3px; + } + .blankslate > .mega-octicon { + color: #aaa; + } + .blankslate .mega-octicon + .mega-octicon { + margin-left: 10px; + } + .tabnav + .blankslate { + margin-top: 20px; + } + .blankslate .context-loader.large-format-loader { + padding-top: 50px; + } + .counter { + display: inline-block; + padding: 2px 5px; + font-size: 11px; + font-weight: bold; + line-height: 1; + color: #666; + background-color: #eee; + border-radius: 20px; + } + .btn { + position: relative; + display: inline-block; + padding: 6px 12px; + font-size: 13px; + font-weight: bold; + line-height: 20px; + color: #333; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + background-color: #eee; + background-image: -webkit-linear-gradient(#fcfcfc, #eee); + background-image: linear-gradient(#fcfcfc, #eee); + border: 1px solid #d5d5d5; + border-radius: 3px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-appearance: none; + } + .btn i { + font-style: normal; + font-weight: 500; + opacity: 0.6; + } + .btn .octicon { + vertical-align: text-top; + } + .btn .counter { + text-shadow: none; + background-color: #e5e5e5; + } + .btn:focus { + text-decoration: none; + border-color: #51a7e8; + outline: none; + box-shadow: 0 0 5px rgba(81, 167, 232, 0.5); + } + .btn:focus:hover, + .btn.selected:focus { + border-color: #51a7e8; + } + .btn:hover, + .btn:active, + .btn.zeroclipboard-is-hover, + .btn.zeroclipboard-is-active { + text-decoration: none; + background-color: #ddd; + background-image: -webkit-linear-gradient(#eee, #ddd); + background-image: linear-gradient(#eee, #ddd); + border-color: #ccc; + } + .btn:active, + .btn.selected, + .btn.zeroclipboard-is-active { + background-color: #dcdcdc; + background-image: none; + border-color: #b5b5b5; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); + } + .btn.selected:hover { + background-color: #cfcfcf; + } + .btn:disabled, + .btn:disabled:hover, + .btn.disabled, + .btn.disabled:hover { + color: rgba(102, 102, 102, 0.5); + cursor: default; + background-color: rgba(229, 229, 229, 0.5); + background-image: none; + border-color: rgba(197, 197, 197, 0.5); + box-shadow: none; + } + .btn-primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.15); + background-color: #60b044; + background-image: -webkit-linear-gradient(#8add6d, #60b044); + background-image: linear-gradient(#8add6d, #60b044); + border-color: #5ca941; + } + .btn-primary .counter { + color: #60b044; + background-color: #fff; + } + .btn-primary:hover { + color: #fff; + background-color: #569e3d; + background-image: -webkit-linear-gradient(#79d858, #569e3d); + background-image: linear-gradient(#79d858, #569e3d); + border-color: #4a993e; + } + .btn-primary:active, + .btn-primary.selected { + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.15); + background-color: #569e3d; + background-image: none; + border-color: #418737; + } + .btn-primary.selected:hover { + background-color: #4c8b36; + } + .btn-primary:disabled, + .btn-primary:disabled:hover, + .btn-primary.disabled, + .btn-primary.disabled:hover { + color: #fefefe; + background-color: #add39f; + background-image: -webkit-linear-gradient(#c3ecb4, #add39f); + background-image: linear-gradient(#c3ecb4, #add39f); + border-color: #b9dcac #b9dcac #a7c89b; + } + .btn-danger { + color: #900; + } + .btn-danger:hover { + color: #fff; + background-color: #b33630; + background-image: -webkit-linear-gradient(#dc5f59, #b33630); + background-image: linear-gradient(#dc5f59, #b33630); + border-color: #cd504a; + } + .btn-danger:active, + .btn-danger.selected { + color: #fff; + background-color: #b33630; + background-image: none; + border-color: #9f312c; + } + .btn-danger.selected:hover { + background-color: #9f302b; + } + .btn-danger:disabled, + .btn-danger:disabled:hover, + .btn-danger.disabled, + .btn-danger.disabled:hover { + color: #cb7f7f; + background-color: #efefef; + background-image: -webkit-linear-gradient(#fefefe, #efefef); + background-image: linear-gradient(#fefefe, #efefef); + border-color: #e1e1e1; + } + .btn-danger:hover .counter, + .btn-danger:active .counter, + .btn-danger.selected .counter { + color: #b33630; + background-color: #fff; + } + .btn-outline { + color: #4078c0; + background-color: #fff; + background-image: none; + border: 1px solid #e5e5e5; + } + .btn-outline .counter { + background-color: #eee; + } + .btn-outline:hover, + .btn-outline:active, + .btn-outline.selected, + .btn-outline.zeroclipboard-is-hover, + .btn-outline.zeroclipboard-is-active { + color: #fff; + background-color: #4078c0; + background-image: none; + border-color: #4078c0; + } + .btn-outline:hover .counter, + .btn-outline:active .counter, + .btn-outline.selected .counter, + .btn-outline.zeroclipboard-is-hover .counter, + .btn-outline.zeroclipboard-is-active .counter { + color: #4078c0; + background-color: #fff; + } + .btn-outline.selected:hover { + background-color: #396cad; + } + .btn-outline:disabled, + .btn-outline:disabled:hover, + .btn-outline.disabled, + .btn-outline.disabled:hover { + color: #767676; + background-color: #fff; + background-image: none; + border-color: #e5e5e5; + } + .btn-with-count { + float: left; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .btn-sm { + padding: 2px 10px; + } + .hidden-text-expander { + display: block; + } + .hidden-text-expander.inline { + position: relative; + top: -1px; + display: inline-block; + margin-left: 5px; + line-height: 0; + } + .hidden-text-expander a { + display: inline-block; + height: 12px; + padding: 0 5px; + font-size: 12px; + font-weight: bold; + line-height: 6px; + color: #555; + text-decoration: none; + vertical-align: middle; + background: #ddd; + border-radius: 1px; + } + .hidden-text-expander a:hover { + text-decoration: none; + background-color: #ccc; + } + .hidden-text-expander a:active { + color: #fff; + background-color: #4183c4; + } + .social-count { + float: left; + padding: 2px 7px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #333; + vertical-align: middle; + background-color: #fff; + border: 1px solid #ddd; + border-left: 0; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + } + .social-count:hover, + .social-count:active { + text-decoration: none; + } + .social-count:hover { + color: #4078c0; + cursor: pointer; + } + .btn-block { + display: block; + width: 100%; + text-align: center; + } + .btn-group { + display: inline-block; + vertical-align: middle; + } + .btn-group:before { + display: table; + content: ""; + } + .btn-group:after { + display: table; + clear: both; + content: ""; + } + .btn-group .btn { + position: relative; + float: left; + } + .btn-group .btn:not(:first-child):not(:last-child) { + border-radius: 0; + } + .btn-group .btn:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .btn-group .btn:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .btn-group .btn:hover, + .btn-group .btn:active, + .btn-group .btn.selected { + z-index: 2; + } + .btn-group .btn:focus { + z-index: 3; + } + .btn-group .btn + .btn { + margin-left: -1px; + } + .btn-group .btn + .button_to, + .btn-group .button_to + .btn, + .btn-group .button_to + .button_to { + margin-left: -1px; + } + .btn-group .button_to { + float: left; + } + .btn-group .button_to .btn { + border-radius: 0; + } + .btn-group .button_to:first-child .btn { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + } + .btn-group .button_to:last-child .btn { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + } + .btn-group + .btn-group, + .btn-group + .btn { + margin-left: 5px; + } + .btn-link { + display: inline-block; + padding: 0; + font-size: inherit; + color: #4078c0; + white-space: nowrap; + cursor: pointer; + background-color: transparent; + border: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-appearance: none; + } + .btn-link:hover, + .btn-link:focus { + text-decoration: underline; + } + .btn-link:focus { + outline: none; + } + .menu { + margin-bottom: 15px; + list-style: none; + background-color: #fff; + border: 1px solid #d8d8d8; + border-radius: 3px; + } + .menu-item { + position: relative; + display: block; + padding: 8px 10px; + text-shadow: 0 1px 0 #fff; + border-bottom: 1px solid #eee; + } + .menu-item:first-child { + border-top: 0; + border-top-right-radius: 2px; + border-top-left-radius: 2px; + } + .menu-item:first-child:before { + border-top-left-radius: 2px; + } + .menu-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; + } + .menu-item:last-child:before { + border-bottom-left-radius: 2px; + } + .menu-item:hover { + text-decoration: none; + background-color: #f9f9f9; + } + .menu-item.selected { + font-weight: bold; + color: #222; + cursor: default; + background-color: #fff; + } + .menu-item.selected:before { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 2px; + content: ""; + background-color: #d26911; + } + .menu-item .octicon { + margin-right: 5px; + width: 16px; + color: #333; + text-align: center; + } + .menu-item .counter { + float: right; + margin-left: 5px; + } + .menu-item .menu-warning { + float: right; + color: #d26911; + } + .menu-item .avatar { + float: left; + margin-right: 5px; + } + .menu-item.alert .counter { + color: #bd2c00; + } + .menu-heading { + display: block; + padding: 8px 10px; + margin-top: 0; + margin-bottom: 0; + font-size: 13px; + font-weight: bold; + line-height: 20px; + color: #555; + background-color: #f7f7f7; + border-bottom: 1px solid #eee; + } + .menu-heading:hover { + text-decoration: none; + } + .menu-heading:first-child { + border-top-right-radius: 2px; + border-top-left-radius: 2px; + } + .menu-heading:last-child { + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; + border-bottom: 0; + } + .tabnav { + margin-top: 0; + margin-bottom: 15px; + border-bottom: 1px solid #ddd; + } + .tabnav .counter { + margin-left: 5px; + } + .tabnav-tabs { + margin-bottom: -1px; + } + .tabnav-tab { + display: inline-block; + padding: 8px 12px; + font-size: 14px; + line-height: 20px; + color: #666; + text-decoration: none; + border: 1px solid transparent; + border-bottom: 0; + } + .tabnav-tab.selected { + color: #333; + background-color: #fff; + border-color: #ddd; + border-radius: 3px 3px 0 0; + } + .tabnav-tab:hover { + text-decoration: none; + } + .tabnav-extra { + display: inline-block; + padding-top: 10px; + margin-left: 10px; + font-size: 12px; + color: #666; + } + .tabnav-extra > .octicon { + margin-right: 2px; + } + a.tabnav-extra:hover { + color: #4078c0; + text-decoration: none; + } + .tabnav-btn { + margin-left: 10px; + } + .filter-list { + list-style-type: none; + } + .filter-list.small .filter-item { + padding: 4px 10px; + margin: 0 0 2px; + font-size: 12px; + } + .filter-list.pjax-active .filter-item { + color: #767676; + background-color: transparent; + } + .filter-list.pjax-active .filter-item.pjax-active { + color: #fff; + background-color: #4078c0; + } + .filter-item { + position: relative; + display: block; + padding: 8px 10px; + margin-bottom: 5px; + overflow: hidden; + font-size: 14px; + color: #767676; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer; + border-radius: 3px; + } + .filter-item:hover { + text-decoration: none; + background-color: #eee; + } + .filter-item.selected { + color: #fff; + background-color: #4078c0; + } + .filter-item.selected .octicon-remove-close { + float: right; + opacity: 0.8; + } + .filter-item .count { + float: right; + font-weight: bold; + } + .filter-item .bar { + position: absolute; + top: 2px; + right: 0; + bottom: 2px; + z-index: -1; + display: inline-block; + background-color: #f1f1f1; + } + .state { + display: inline-block; + padding: 4px 8px; + font-weight: bold; + line-height: 20px; + color: #fff; + text-align: center; + border-radius: 3px; + background-color: #999; + } + .state-open, + .state-proposed, + .state-reopened { + background-color: #6cc644; + } + .state-merged { + background-color: #6e5494; + } + .state-closed { + background-color: #bd2c00; + } + .state-renamed { + background-color: #fffa5d; + } + .tooltipped { + position: relative; + } + .tooltipped:after { + position: absolute; + z-index: 1000000; + display: none; + padding: 5px 8px; + font: + normal normal 11px/1.5 Helvetica, + arial, + nimbussansl, + liberationsans, + freesans, + clean, + sans-serif, + "Segoe UI Emoji", + "Segoe UI Symbol"; + color: #fff; + text-align: center; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-wrap: break-word; + white-space: pre; + pointer-events: none; + content: attr(aria-label); + background: rgba(0, 0, 0, 0.8); + border-radius: 3px; + -webkit-font-smoothing: subpixel-antialiased; + } + .tooltipped:before { + position: absolute; + z-index: 1000001; + display: none; + width: 0; + height: 0; + color: rgba(0, 0, 0, 0.8); + pointer-events: none; + content: ""; + border: 5px solid transparent; + } + .tooltipped:hover:before, + .tooltipped:hover:after, + .tooltipped:active:before, + .tooltipped:active:after, + .tooltipped:focus:before, + .tooltipped:focus:after { + display: inline-block; + text-decoration: none; + } + .tooltipped-multiline:hover:after, + .tooltipped-multiline:active:after, + .tooltipped-multiline:focus:after { + display: table-cell; + } + .tooltipped-s:after, + .tooltipped-se:after, + .tooltipped-sw:after { + top: 100%; + right: 50%; + margin-top: 5px; + } + .tooltipped-s:before, + .tooltipped-se:before, + .tooltipped-sw:before { + top: auto; + right: 50%; + bottom: -5px; + margin-right: -5px; + border-bottom-color: rgba(0, 0, 0, 0.8); + } + .tooltipped-se:after { + right: auto; + left: 50%; + margin-left: -15px; + } + .tooltipped-sw:after { + margin-right: -15px; + } + .tooltipped-n:after, + .tooltipped-ne:after, + .tooltipped-nw:after { + right: 50%; + bottom: 100%; + margin-bottom: 5px; + } + .tooltipped-n:before, + .tooltipped-ne:before, + .tooltipped-nw:before { + top: -5px; + right: 50%; + bottom: auto; + margin-right: -5px; + border-top-color: rgba(0, 0, 0, 0.8); + } + .tooltipped-ne:after { + right: auto; + left: 50%; + margin-left: -15px; + } + .tooltipped-nw:after { + margin-right: -15px; + } + .tooltipped-s:after, + .tooltipped-n:after { + -webkit-transform: translateX(50%); + -ms-transform: translateX(50%); + transform: translateX(50%); + } + .tooltipped-w:after { + right: 100%; + bottom: 50%; + margin-right: 5px; + -webkit-transform: translateY(50%); + -ms-transform: translateY(50%); + transform: translateY(50%); + } + .tooltipped-w:before { + top: 50%; + bottom: 50%; + left: -5px; + margin-top: -5px; + border-left-color: rgba(0, 0, 0, 0.8); + } + .tooltipped-e:after { + bottom: 50%; + left: 100%; + margin-left: 5px; + -webkit-transform: translateY(50%); + -ms-transform: translateY(50%); + transform: translateY(50%); + } + .tooltipped-e:before { + top: 50%; + right: -5px; + bottom: 50%; + margin-top: -5px; + border-right-color: rgba(0, 0, 0, 0.8); + } + .tooltipped-multiline:after { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 250px; + word-break: break-word; + word-wrap: normal; + white-space: pre-line; + border-collapse: separate; + } + .tooltipped-multiline.tooltipped-s:after, + .tooltipped-multiline.tooltipped-n:after { + right: auto; + left: 50%; + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + transform: translateX(-50%); + } + .tooltipped-multiline.tooltipped-w:after, + .tooltipped-multiline.tooltipped-e:after { + right: 100%; + } + @media screen and (min-width: 0\0) { + .tooltipped-multiline:after { + width: 250px; + } + } + .tooltipped-sticky:before, + .tooltipped-sticky:after { + display: inline-block; + } + .tooltipped-sticky.tooltipped-multiline:after { + display: table-cell; + } + .fullscreen-overlay-enabled.dark-theme .tooltipped:after { + color: #000; + background: rgba(255, 255, 255, 0.8); + } + .fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-s:before, + .fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-se:before, + .fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-sw:before { + border-bottom-color: rgba(255, 255, 255, 0.8); + } + .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-n:before, + .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-ne:before, + .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-nw:before { + border-top-color: rgba(255, 255, 255, 0.8); + } + .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-e:before { + border-right-color: rgba(255, 255, 255, 0.8); + } + .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-w:before { + border-left-color: rgba(255, 255, 255, 0.8); + } + .flex-table { + display: table; + } + .flex-table-item { + display: table-cell; + width: 1%; + white-space: nowrap; + vertical-align: middle; + } + .flex-table-item-primary { + width: 99%; + } + .css-truncate.css-truncate-target, + .css-truncate .css-truncate-target { + display: inline-block; + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + } + .css-truncate.expandable.zeroclipboard-is-hover .css-truncate-target, + .css-truncate.expandable.zeroclipboard-is-hover.css-truncate-target, + .css-truncate.expandable:hover .css-truncate-target, + .css-truncate.expandable:hover.css-truncate-target { + max-width: 10000px !important; + } + .sunken-menu { + position: relative; + padding-top: 15px; + padding-bottom: 15px; + background-image: -webkit-linear-gradient(left, #f6f6f6 0%, #fff 8px); + background-image: linear-gradient(to right, #f6f6f6 0%, #fff 8px); + box-shadow: inset 1px 0 0 #eee; + } + .sunken-menu:before, + .sunken-menu:after { + position: absolute; + left: 0; + width: 100%; + height: 15px; + content: ""; + background-color: transparent; + } + .sunken-menu:before { + top: 0; + background-color: transparent; + background-image: -webkit-linear-gradient(#fff, rgba(255, 255, 255, 0)); + background-image: linear-gradient(#fff, rgba(255, 255, 255, 0)); + } + .sunken-menu:after { + bottom: 0; + background-color: transparent; + background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0), #fff); + background-image: linear-gradient(rgba(255, 255, 255, 0), #fff); + } + .sunken-menu-separator { + position: relative; + height: 5px; + margin: 8px 0 6px 1px; + background-image: -webkit-radial-gradient( + farthest-side at left top, + #f4f4f4, + rgba(244, 244, 244, 0) + ); + background-image: radial-gradient( + farthest-side at left top, + #f4f4f4, + rgba(244, 244, 244, 0) + ); + } + .sunken-menu-separator:before { + position: absolute; + top: 0; + width: 100%; + height: 1px; + content: ""; + background-image: -webkit-linear-gradient(left, #eee 70%, #fff 100%); + background-image: linear-gradient(to right, #eee 70%, #fff 100%); + border-top: 1px solid #eee\9; + } + .sunken-menu-group { + list-style-type: none; + } + .sunken-menu-item { + display: block; + padding: 8px 10px; + margin-top: 5px; + margin-bottom: 5px; + border: 1px solid transparent; + outline: 0; + } + .sunken-menu-item .counter { + position: absolute; + top: 8px; + right: 10px; + } + .sunken-menu-item .octicon { + left: -1px; + width: 16px; + color: #999; + text-align: center; + } + .sunken-menu-item .mini-loader { + position: absolute; + top: 9px; + left: 11px; + display: none; + } + .sunken-menu-item:focus, + .sunken-menu-item:hover { + text-decoration: none; + box-shadow: inset 2px 0 0 #ccc; + } + .sunken-menu-item:focus .octicon, + .sunken-menu-item:hover .octicon { + color: #333; + } + .sunken-menu-item.selected { + font-weight: bold; + color: #333; + background-color: #fff; + border-color: #eee #eee #eee transparent; + border-radius: 0 3px 3px 0; + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.05); + } + .sunken-menu-item.selected:after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 3px; + content: ""; + background-color: #d26911; + border-radius: 0 3px 3px 0; + } + .sunken-menu-item.selected .octicon { + color: #333; + } + .sunken-menu-item.is-loading .mini-loader { + display: inline-block; + -webkit-animation: mini-nav-loader, 0.4s, forwards; + animation: mini-nav-loader, 0.4s, forwards; + } + .sunken-menu-item.is-loading .octicon { + color: #fff; + } + @-webkit-keyframes mini-nav-loader { + 0%, + 90% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @keyframes mini-nav-loader { + 0%, + 90% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @font-face { + font-family: "octicons"; + src: + url(data:font/eot;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGNvbnRlbnQ9ImRlZmF1bHQtc3JjICdub25lJzsgc2NyaXB0LXNyYyAnc2VsZic7IHN0eWxlLXNyYyAndW5zYWZlLWlubGluZSc7IGltZy1zcmMgZGF0YTo7IGNvbm5lY3Qtc3JjICdzZWxmJyI+CiAgICA8dGl0bGU+UGFnZSBub3QgZm91bmQgJm1pZGRvdDsgR2l0SHViPC90aXRsZT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+CiAgICAgIGJvZHkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWYxZjE7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICAgIGJvZHksCiAgICAgIGlucHV0LAogICAgICBidXR0b24gewogICAgICAgIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgICB9CiAgICAgIC5jb250YWluZXIgeyBtYXJnaW46IDMwcHggYXV0byA0MHB4IGF1dG87IHdpZHRoOiA4MDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB9CgogICAgICBhIHsgY29sb3I6ICM0MTgzYzQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KICAgICAgYTpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CgogICAgICBoMyB7IGNvbG9yOiAjNjY2OyB9CiAgICAgIHVsIHsgbGlzdC1zdHlsZTogbm9uZTsgcGFkZGluZzogMjVweCAwOyB9CiAgICAgIGxpIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgICAgbWFyZ2luOiAxMHB4IDUwcHggMTBweCAwcHg7CiAgICAgIH0KICAgICAgaW5wdXRbdHlwZT10ZXh0XSwKICAgICAgaW5wdXRbdHlwZT1wYXNzd29yZF0gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiA3cHggOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgY29sb3I6ICMzMzM7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0IGNlbnRlcjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwwLjA3NSk7CiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZS1pbjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZS1pbjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CiAgICAgIC5idG4gewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIGNvbG9yOiAjMzMzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRTsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgjRkNGQ0ZDLCAjRUVFKTsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoI0ZDRkNGQywgI0VFRSk7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgfQoKICAgICAgLmJ0bjpmb2N1cywKICAgICAgaW5wdXRbdHlwZT10ZXh0XTpmb2N1cywKICAgICAgaW5wdXRbdHlwZT1wYXNzd29yZF06Zm9jdXMgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBib3JkZXItY29sb3I6ICM1MWE3ZTg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgNXB4IHJnYmEoODEsIDE2NywgMjMyLCAwLjUpOwogICAgICB9CgogICAgICAuYnRuOmhvdmVyLAogICAgICAuYnRuOmFjdGl2ZSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoI2VlZSwgI2RkZCk7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCNlZWUsICNkZGQpOwogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKICAgICAgICBib3JkZXItY29sb3I6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5idG46YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkY2RjOwogICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjYjViNWI1OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTUpOwogICAgICB9CgogICAgICAjYXV0aCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB6LWluZGV4OiA1MDsKICAgICAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTMsOTUsMTIwLC40KTsKICAgICAgICBwYWRkaW5nOiA3cHggMTBweDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMTBweDsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMHB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgM3B4IDAgcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgICNhdXRoIGgxLCAjYXV0aCBwLCAjYXV0aCBsYWJlbCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuYXV0aC1mb3JtLWJvZHkgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQogICAgICAjYXV0aCBpbnB1dFt0eXBlPXRleHRdLAogICAgICAjYXV0aCBpbnB1dFt0eXBlPXBhc3N3b3JkXSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgd2lkdGg6IDE3NXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogOXB4OwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OwogICAgICB9CiAgICAgICNhdXRoIGlucHV0W3R5cGU9dGV4dF06Zm9jdXMsCiAgICAgICNhdXRoIGlucHV0W3R5cGU9cGFzc3dvcmRdOmZvY3VzIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSgyNTUsMjU1LDI1NSwuNSk7CiAgICAgIH0KICAgICAgI2F1dGggLmJ0biB7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICB9CiAgICAgICNhdXRoIC5idG46Zm9jdXMgewogICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSgyNTUsMjU1LDI1NSwuNSk7CiAgICAgIH0KICAgICAgbGFiZWxbZm9yPXNlYXJjaF0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgI3NlYXJjaCBsYWJlbCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDIwMDsKICAgICAgICBwYWRkaW5nOiA1cHggMDsKICAgICAgfQogICAgICAjc2VhcmNoIGlucHV0W3R5cGU9dGV4dF0gewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICB3aWR0aDogNzA1cHg7CiAgICAgIH0KICAgICAgI3NlYXJjaCAuYnRuIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICAgIHdpZHRoOiA5MHB4OwogICAgICB9CiAgICAgIC5sb2dvIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW4tdG9wOiAzNXB4OyB9CiAgICAgIC5sb2dvLWltZy0yeCB7IGRpc3BsYXk6IG5vbmU7IH0KICAgICAgQG1lZGlhCiAgICAgIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICBtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLAogICAgICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzogMi8xKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICAgICAgIG1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLAogICAgICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgICAgICAgICAgICBtaW4tcmVzb2x1dGlvbjogMTkyZHBpKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICAgICAgICAgICAgICAgbWluLXJlc29sdXRpb246IDJkcHB4KSB7CiAgICAgICAgLmxvZ28taW1nLTF4IHsgZGlzcGxheTogbm9uZTsgfQogICAgICAgIC5sb2dvLWltZy0yeCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgfQogICAgICB9CiAgICAgICNzdWdnZXN0aW9ucyB7CiAgICAgICAgbWFyZ2luLXRvcDogMzVweDsKICAgICAgICBjb2xvcjogI2NjYzsKICAgICAgfQogICAgICAjc3VnZ2VzdGlvbnMgYSB7CiAgICAgICAgY29sb3I6ICM2NjY2NjY7CiAgICAgICAgZm9udC13ZWlnaHQ6IDIwMDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luOiAwIDEwcHg7CiAgICAgIH0KCiAgICAgICNwYXJhbGxheF93cmFwcGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLWluOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLWluOwogICAgICB9CiAgICAgICNwYXJhbGxheF9maWVsZCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgaGVpZ2h0OiAzNzBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfZmllbGQgI3BhcmFsbGF4X2JnIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAtMjBweDsKICAgICAgICBsZWZ0OiAtMjBweDsKICAgICAgICB3aWR0aDogMTEwJTsKICAgICAgICBoZWlnaHQ6IDQyNXB4OwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgd2lkdGg6IDk0MHB4OwogICAgICAgIGhlaWdodDogMzcwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiBpbWcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9lcnJvcl90ZXh0IHsKICAgICAgICB0b3A6IDcycHg7CiAgICAgICAgbGVmdDogNzJweDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9vY3RvY2F0IHsKICAgICAgICB0b3A6IDk0cHg7CiAgICAgICAgbGVmdDogMzU2cHg7CiAgICAgICAgei1pbmRleDogOTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9zcGVlZGVyIHsKICAgICAgICB0b3A6IDE1MHB4OwogICAgICAgIGxlZnQ6IDQzMnB4OwogICAgICAgIHotaW5kZXg6IDg7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiAjcGFyYWxsYXhfb2N0b2NhdHNoYWRvdyB7CiAgICAgICAgdG9wOiAyOTdweDsKICAgICAgICBsZWZ0OiAzNzFweDsKICAgICAgICB6LWluZGV4OiA3OwogICAgICB9CiAgICAgICNwYXJhbGxheF9pbGx1c3RyYXRpb24gI3BhcmFsbGF4X3NwZWVkZXJzaGFkb3cgewogICAgICAgIHRvcDogMjYzcHg7CiAgICAgICAgbGVmdDogNDQycHg7CiAgICAgICAgei1pbmRleDogNjsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9idWlsZGluZ18xIHsKICAgICAgICB0b3A6IDczcHg7CiAgICAgICAgbGVmdDogNDY3cHg7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9idWlsZGluZ18yIHsKICAgICAgICB0b3A6IDExM3B4OwogICAgICAgIGxlZnQ6IDc2MnB4OwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgoKICAgIDxkaXYgaWQ9InBhcmFsbGF4X3dyYXBwZXIiPgogICAgICA8ZGl2IGlkPSJwYXJhbGxheF9maWVsZCI+CiAgICAgICAgPGltZyBhbHQ9IiIgY2xhc3M9ImpzLXBsYXhpZnkiIGRhdGEtaW52ZXJ0PSJ0cnVlIiBkYXRhLXhyYW5nZT0iMCIgZGF0YS15cmFuZ2U9IjIwIiBoZWlnaHQ9IjQxNSIgaWQ9InBhcmFsbGF4X2JnIiB3aWR0aD0iOTQwIgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQWdBQVpBQmtBQUQvN0FBUlJIVmphM2tBQVFBRUFBQUFVQUFBLys0QURrRmtiMkpsQUdUQUFBQUFBZi9iQUlRQUFnSUNBZ0lDQWdJQ0FnTUNBZ0lEQkFNQ0FnTUVCUVFFQkFRRUJRWUZCUVVGQlFVR0JnY0hDQWNIQmdrSkNnb0pDUXdNREF3TURBd01EQXdNREF3TURBRURBd01GQkFVSkJnWUpEUXNKQ3cwUERnNE9EZzhQREF3TURBd1BEd3dNREF3TURBOE1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd00vOEFBRVFnQm53T3NBd0VSQUFJUkFRTVJBZi9FQUxZQUFBTUJBUUVCQVFBQUFBQUFBQUFBQUFFQ0F3QUVCUVlJQVFFQkFRRUJBUUFBQUFBQUFBQUFBQUFBQVFJREJBY1FBQUVEQXdNQ0F3VUdCQUVHQ3dnQ0F3RUFFU0V4QWhKQlVXRnhnWkdoQS9DeHdTSVQwZUh4TWdRRlFnWUhGMUppMGlQVEZCVnlncExDTTJPRGt5UWxOYUt5VTZPek5FVlZjMFJVcEJZUkFRRUFBUUVEQ2dRRUJRVUJBUUFBQUFBUkFRSURVd1FoTVpIUmtxTFNCUllYUVZMaUJxRkNRd2ZoZ2hSa0ZWRVNZaE16Y1lILzJnQU1Bd0VBQWhFREVRQS9BUG10K0tMNmZIeU13RHU5U3FsVUZ0QlJBeklsTUJzSGRWREMxVU9CMjRRcGdORlloOFVGQmFmYWlKVEFDcFBaVkR0QTBReVlXbEVwaGJNcWh4YVVRNHRQZFVweGJQZElsTTNaV0pjbkZzMFFNTEZTbkZ2a2dZVzBWaUNMVlVweFlvVXdzQ3FHQUhaQTJKUU5naVV3dENzS1p1RWhSeEtJT0JWREN5VURZYnBFbzRxcFRZaUVCeDRTQnNVSUlzS3NCd1FFV29VY1ZZZzRxUlJ4NFZUT0J4NFNBNG9yWWNJZzRJTmlnT0tGSEJGbzRIWkV6bHNPRXdaYkRoQ2pod3BWSERvbFBpMkFSRyttRmFOZ0ZBY0FsR3dDVWJFYkJBY1JzaHl0aWcyUENpaGlxWWJCS2NyWUlOZ29vWUJFWTJLNE01REJRYkJGREU5VUkySjJSUXg0VWdHSVZnR0NnR0NLQjlORG5ENmFJMzB5cGxjQmdkbEZwY0ZVREJSV1BwcUxrdjAwU2hncEZwY09FVXVLWk1CanVFZ1hFS1pYQmNPRUFOdkNpMHB0NFZDbTE5VkZwVFlVS1RBNkptR01nYkRzNmk4eFRZWjl5aGdoczNESXVTL1RVS1EySXVRTmdVQ0gwNnFMVXpZVUF4bWtKbGNGTnFrQ1k3UWk0NVNHeXVudVJZUWc2NjZxQlRiMzJTS1EydHA0SUFiZENvcERidUhLR01seFBDaWtObGVFcWx4RGNxSTQycXk2T2VWQU50U2ltYngyUkRNVG90SW9BM1E2b0dBOEVUSmhhNjBpZ3RVS2ZFbGlkVlVPQTVnTWlVMkpRcW1JOEVETS9Lc1RPVGkwN2VDcVU0dFpXRk5pcmhGQU5WSVV3dFZpVXdDb1lXcXBWQmFvVXd0VlEyUEREZEF3dDNRTUxBT1VRemNLNHdHQUtzUXdzUU9MT0VEWUpoTW14UWhoWXFSc0ZVTmdnWVc4S0xqSTRoVklMSkRtTmlxRGloUnhSS09IQ0ZNTERzZ09IS0lPQ0tPQ0lPQ0dSd1VVY0ZVNUJ4VUsyS3BZT0NRcllIWkFjT0VLT0hDbk1jdVJ3T3lzSzJCUTVXd1JHd1VhYkJWR3dRSEJCc0ZGYkJWR3dLaXRod2dHSENEWWNKbGNaRDZaMlFvL1RRLzNCZ2hXK21WS0I5TW9WdnBwUnNDZ0dQQ2l0andnMklRREVJQmdFVU1BaHpoZ2lsd0tHQXg3S1FvWThJQmp3Z0dDQVlGWld3TUNpMHVCUkNteENnYkZGTGdQeFFMOU1iS0tHSENCY09HNktSUU5xUTVpR3hGTGdtVEJUYXBGSWJVVXBzNFFMaHdtY0xqSkRhUm9wQXBzZWFJdEw5TlFJYkRxb3BEWU82QmZwaFRLNEliT1BCUlU4V2h1NkJjWmhSUzR0MlVVcHRlRXF4TTJtcjkwQ0cyQ2lrTnAyZDFDRk5xZ1hFN0lPRUNCSFJkSE9tQWJwb3FoZ1BGVVVBNDZJaDJsWEFjVzdVM1JEZ2EwNFZRNEd5QnhhL3hST2M0REtvZkdWUTR0bjdFUlFXalpXSWNXL2VpbkZwMVZTbUZ0RlVVRnBTTFRDejhWV1RpMVFPTFVEQ3gxVU1MUUZZaHhic0VEQzFBNHNWU21GZ1FwOFVPVWNWVU5nZGtoVGl3b1VSWWRsVU1MQ25NYzVzUHdRTjlORW80QkNtd0Njb0l0R3lBaTNoQTJPeUZnNHBDamdpWnlZV0haSVVjRlFjRVFjQWl3UmFFU05pRVVjUnNnTGNKQm1WaVpIRXBqQm5MWWxGYkVwakJrY1NwQ3RpVlFjRHNvRDlNb045TXFsYjZaM1VvUDB6dWxHK21kMHlZeVAweWhXK253b1ZzT0ZTaGg3TW9vNEZFREZJVnNVaXRpa0daU0dNZ3lvemNLQVk4SU5paWhnZ0dDaFF3NVZLMzB3b29mVEc2STMwK3FMUXc0VUF4YlIwQU5vMlRsVnNVU0ZOaUx5Z2JFQzRJcFRhaXRodzZoQzRwQURaeDNVVXVCVkMvVEtsVU1EdW9GTm5aRkxnRXFGTmcyVVVwc1VVaHRiUWRVaWxOb0tnUTJJcERZb0ZJM3FpbHdmcWdRMm5aUlNtMkpVaTBoc1U1em1JZlRLVlNHMzhGRkliUEZSVXpZUHZRSmRiNGxSU1k2TWdCdDZsUnBOalJDRkkxMVVNRUlkbzdJdUU4ZkJCNXJUMTFYYkRnb0J4QXFVRkFQUFJBNHQ0VkZBTm9iVlZLY0JFT0xVUTR0VkljV3loektDeHFqaFhuVG1VRm8wQ3NRNHRkQlFXdHlyRXprd3QvRlVPTFVpWnlvTFJzeUpUaTNoREdUQ3k0NktwVGl6ZEE0dDJWU25IcGxBNDlPanp3cWhoWVB2UU9MT0ZVUGh1RVF3c0d5RlBpMmlZNVZ6eUdGdkNzUXd0NFFvNG9oc1VCeFFoc1VpamdpR3c0VmhuSnNOV1VEWUJFRVdoVUhIaElEandtTUdSeEtRbzRGQVJZcVFjRVFmcG9wc0FwUnNBcWc0RFpBY09FTURod2dPUENGYkZBY1hRYkU3SURpVU9Sc1VnMlBzeURZb05pVUsySlFIRTdJVnNUc2ZCQ3RnZGxGSEFvbERDNUZvL1RLSTJDaTViQlVyWThJZ1lqWlJSeC95VWcyUENSUXhHeVRJR0FRYkJJWURBSkFNQnNtVEFZY0tSYTMwK0VLSDB5aTVENmR5RFlKem5NR0ExVVVNQWlVRDZZVXFoOVBoQXVIQ0tHS2dCdFJTNDhJa0tiUXB5cUJzN3BWS2JPQ2dVMkhaQXVISGRGREFySzBwOU5BaHNSU215c0tCVDZZMlVxNXdRK253b3BEWndnWEhjS0tRMklFTnFLVTJoUlV6WndVQ0d3N0lFTm1yTEs0SWJFcXBtd3FMU20xU0xTR3p4MlV5cVdDQUcwS0ZUTm8yMFJhbWJXUlFZZmVvUjVZQUhETHRLNVV3QzFHVkJhM3hRcHdGV2FvTFRzZ3BiWStpRlVGaDBGVlRKeFlVU3FDemRWRkJZN1NxaWc5TUN0VVRPVGl3S29vTEFoVkJhTnU2RlBiWndybE1LQ3hRcHhhT3FzUTR0T3lxR0ZpQjhlRllIRmhWUXc5TkVPTEFnWVc4S3dQZ2diQUltVEMxQTJQRElvNEtvY1dkMEtZV0loc0FnSXNHeXFHRnZDTHlHd0tJSTlNb1UzMDkwb1Awd2xEQ3diSURpTmxjSmtjZXlBNG9EaW5NZkVSWWdPQ0E0QkFjQWhXd1NnNGNJZzRjSURpcU5od29vNGxCc1VRY0VHd1JSd1NwbHNGRmJGV0ZvNGxBTVNvRGlxWWJGQnNWSVZzZUZSc1Rzb280blpCc09FQXhWR3dDbEd3Q1ViQUpTTjlNSU45TUlOOVBaU3JBdzRSZVVNRVF1Q0RZS05TaGdxZ0cwN0tLMkhDQVlJQjlOUUQ2ZktpME1FQXdRREFiSXVNbHdHeWlnYkJzZ1hBS0lHQ0tVMnFSUzRxWlhCY0VvVTJjSlZMZ2RrTUZOaDJRS2JGRklmVEc2S1hCUXhraHNDZ1UyRFpGcEQ2WVVVaHRHb1Vpa05qb0pteFFJYlVYQkRZNmN5ODZSdFFJYlB4V1dvUTI5MURDWnNHaU5jaERieDNVRXpaM1FJYkRzb3BEWjk2aWx3UXJ5UmJ4Qzc0Y0txTFFKMVFQanRDcVpVRnBaRXpsVVdwQlFXNjZxcGs0dDRWZ2NXa3E0VEtvczNSRkJhOUtLb2NXYWxVVUZ2RUlLQ3p1aUtDM2hJaHhhckVPTENxSEZxdU1HVGkwbEVPTENxSEZpSlRpdzZCVkREMHlnZjZhVXB4WndvVXdzS3FVdzlOREdWQjZTVU1MQXFoaGFORkZNTGRGWXlPQlNGTmdxRGlFRE5zRUJZcENqaVZVRVdFb1hKc0VCd0tRbzRjSmd5YkFvRGdVcURnbEJ3U2c0SlFjRUJ3NFFIQkFjVUJ4U0ZiQklEaWtLd3M0U0djamh3a0sySEFRSEE3QUlEZ1VXdGdkMFNqaHlnMkNVYkJCc2VGT2RlWWNUc2h5dGlka0d4NklnWUlyWW9OaHdpdGh3VkViQTdGVWI2WlVxeHZwOUVBK255cFZiNmFVRDZhVWJCQ3Rnbk9jelk4SUJqd2hBeFVxeHNVQXdRREJDbCtud3lOY2pmVEtJWEFxS0dCUmNaREFLQWZUNVVBK21xRlBwalpSYVhCQU1PRWhTNHFLVTJxS1UySUVOcWtVcHRLQlRhZ1EyS21DR3cwV2N0RU5oMlNITVUrbWRrQ213N0taWENac1VpNElmVDVRcFRadXBuRFdNcG14U0NaOVBoS3FaczRVQ0czaEZJYk95S25pUTdxWlhDWnRkUVR1c0tLbWJkR1VWTTJLS1hFN0lQSlllSzdZY09RNHRjcWl3dG9vR0Z2REJhd3lxTGV5Q2x0cDdiS3BoVzIxK2RrRkJhdFl3emxRV0ZDcUN6UmtTNE9MRlVxb3NRVUZpdURLZ3NUQ1p5b0xPRlVPTE9FS2NXRFpYQms0dDRWakp4WWdjV2dhSVU0dEd5SVlXdWhuQnhad3FoeFlnWVc4T2dZV25aQTJCMlZUNG5IcDdwVUhCQ213UU1MQ3FVUjZhSlREMHdnWVdEWlV3T0kyVWdaaWtCeEtzQndLSWJCRkhCUU1MZUZZbGJEaE1HY213T3lmRStBNEZDamdoeWpnbEJ3UWpZSURod2hCeDRWQnc0Q0RZcUtPSlFiQkV3T0tLMkJRbzRGQ3RnZGtLT0IyUXJZS0ZIQkNoOU5Vby9UVUszMHlsQXdRSERoQnNDaEF4S2hHeFQ0ck9Sc1RzZzJKMlFiRTdJTmlkbEJzZUVVTVVHeFNMUXdVR3dDRmJDMUNoZ0V5WUREZ0tEWW9GeE95SzJKUURIaEFEYWhDNEJBRFlpd3VIQ21jbU1CZ2RrYURBN0ltQXc0VWlsUHBwQ2x3U0xTL1RRS2ZUVUMvVEd5UUQ2WTJVeXVDSDB4c2lrTmhDaGdwdFVVaHM0UlNHMUFodFJTR3poUUlmVEtLUTJIYnVvcWQxaWlwbXdxWnlFTmlMaktaOU1LS21iTmxGVE52Q0ttYk9GQWhDbWNLbmRhZndVVkkyb1NsYjNVMFVpdkdGcTcxd3FndFZSWVc4Smd5Y1d1emFxb3RiYVB2VlJRV3BneW9MVldjckMxa0RpM3VpS0MxV0lvTFZZWnlwYmJSRXFvdE5LcThoeW5GcFZRNHNLcUhGaEtxS2owMUtIRmlCeFlnY2VtRVNtRm9FTXFoeFp3cUhGaUJ4WndrUy9Bd3RWaUhGcVl3b2kxV0liQkF3c0NwbkJzUnNvUWNTZEZjcGd3c0taTVpOOU1vRytueWdPQ2xEWUtvT0FRTmdOa3ljbzQ4SVp3T0tFSEVvbzQ3SlVnNG9vNDhPcWc0Y0tBNG9EandnT0tKeXRpclNEaW9zYkZTTFJ4Q3FRY1JzaG5EWThJUWNlRXdSc1VpOHpZb1FXUWpZOElrdzJQQlJjeHNUc29zSEhoQnNUc2xTRGlnR0NBNGhGYkVLRFloRWpOd2d6Y0ljN053aXMzQ0FNZzJLRFloUURIc2l3TVVHd1FnZlRPeUFZSFpSYUdCN29OZ3FCaHlwRmJBS0lHQTJSUXdHeVF1V3c0UlNteFJjRk5xSURLcURicVVnWWhDQWJPRVVoc095Wk1GdzdLS0JzS0JmcDhzb3BUNmZzRW9VMktLUTJjS0JUWU5rTVpoRFp3b3ZPUTJNaWtOcWl3aHNVRXpheXFrTnFpeE0yY0lFTm5DeTBtYk9GQk0rbVNpcG16ZFJVelorS2hVallpODVEWUNwVlN1dENLbWJSUmxCUEVQUlppMTR3Qzd1Q290TVF0TXFDMG5SVXExdHFGVkZsRmNKbFMyeWlxSzIyZGdsUlVXRFh3UkZiYkJzbVRHVkJZQm8vQzBpZ3M0VlJVV0pFVUZxc0RpMUV5b0xGVTVUaTNaSUhGaW9vTEcwU0ljV0hRS3dPUFRLWU1udzZLcGt3c1JLY1dJR0hwcTBPUFRDSWZFRFJTZ3R3cVF3dFJEQ3hSVEN4S1F3dFZRY1V5WU1MZUVJSXRlZ1ZEWUhaUmVRUllxbE5naVVSWUVLT0k1U2c0alpBY1JzaEJ4UWdpMUZnNHBnemhzVUJ4Q0lJdEhWRkhEaEVvaXc3SlJzT0FsQndLVlJ3NVJLMkEzU2c0RGxRbzRqWlZLMkkyVXl1R1liS296RFpSV2JoQVc0UVpnaThyTWlNeUsySVZSbUNpdGoxUUhIaEJzRkl0YjZaNFZoV3c2SVZqNmFGYkJJVU1Bb3JZQlZHdzRDQVluWlJXWWhFWmxNWVhJTWhHWUpCc2VFV3RnK25pb0I5UGhER1FQcCtPaUtIMHlvdEtiTnlnR0NEWWhRZ1lEWkFEWU5rQXdRS2JObEdpWW9BeUFZaFFMaHdxRndPeWpSVFp3b3BUWWRVUXVDS1UrbXNxbWZUVm9VMjdxS1EyQlFxWnM0VXl1TWtOcWlrTnZDR01wRzFGSWJYU0Nac0tpcEczaFJVemFwRlROaEZGRlNObkhaUVR1c2VWT1plZEkyNkl1RXpaQ0xoUEZTTFhqaTNSZDNuVkZ2WldDZ3QyVnhoTXEyMnF4RnJiVUZSWXlyT2NxMjJjSUsyMkxUS2dzVkZSNmFDZ3NWUlVXVVJLY1dCRVVGbkNxS2l6aEE0dENFT0xTVlVPTEFnY1dyVVEyQ21ES2c5UGhWTGc0c1FOaHdpbXhLVkREMHpxaG5KaDZZM1JENEJDbUZnNm9sSEViT25LcHNlRVF3c1ZJYkJBY1VCeFFnaTFET0RZOEZDRGdkbFFjRUJ3VXdaTUxGU3RnRktEZ0ZVb2kwZFVLT0EyVW9PSEFRcHNWVWJIbFJSeFFqWXFvMklVV0RpRlNOaUVnekRaUlJ4NFZRY2VFSTJKMlNLT0pTRFlwQnNlVUJ4Q1F5MklTR0J4R3ltZVE1Mng0U0RNaGpETWl4bUNKQlpBTVFnT0kyUld3NFVHd1ZHdzVVbzJHNVNnWUhkQnNFbzJIRHFWUXhHeURZQlJXd0dnQ3FCZ29vWUlCaWl4c1NoR1k3SVFNZUVHdzRVQXdTaGZwbFJRUHBvWXlIMHdoUzRCVC80di93QkRBYktLR0kyUURBSWxLYkVVcHRVVXVLQlRhaWxOZ1JDR3hGeFNtd3FGSWJPRVVoc1VDbjA5bEY1RXpaM1JTR3hSVXo2YW1Wd21iRkFoc0NMeXBteEZTTm9VQ0d3S0xoRTJ0MFVhVE5tcUNKdFpSVXphNmlvbTFGSmlvcnhyYk4xNkhuV0ZqNlFyaEZSYTJpQ3R0bkNJdUxXcFZYQ1pVdHMxVlJZV3Fvb0xWVVZGdkNvb0xEc2xSVVdIWkVxZ3NLQ2dzVlRLZ3NWRkJZNkljV0FLMUZCWndnY2Vud2xJb0xGVXprMktKRGkxS1F3c1FNTEVEaTNoRU1MZUVYUElZV0haVkRZSGRBdzlOTTVNR3c1UkRDd0lEaUZRUllnT0lRTmloUnhSS09LR0J4N29jNXNVR3g1VklPTzZnMklRTUxlRlFjVHNrR3hPeWtYQWl3cWc0RXBBZnBuZEFjT1VSdnBoRkhBSURnRXBHRm9UQmtjZUVJMlBDRFloQm1DTERNaEdZN0tVSEU3SWxiRXBWd09KU25NMkNVck1FcEF3R3lVZzREWktOZ05rcEJ4NFF3R0tpdGlOMEkySVFiSGxDTmlnMkpUSTJCMENISTJKVUd4Uld4UkF4Q2l4c0J5ZzJBUWJCVElHUENaTUFRZ0RJb1l5aDhBd1FERlJZR0o2cW96RlFBMm91QzRncUxuRUEySVlBK21pVXA5TXFaYXhrTUNpRXhVeTFnTVFnVTJBcUJUWWlreFFLYmU2QlRhaWtObkNaTUVOaFVqUkRidXBCTTJKQWwxaENpcG0zaFRPRlR1OU5Gd21iRkZUUHBxQ1JzUmNaVE5pTFVyckZGU3V0R3FtVlN1czJVWENKdFV5cE1aVUhqQ3dydTRLaXh0VmFtVnJiTjBGaGFleXVFeXRiWU5sVVZ0dGZvZ3RiYnd0TXFDMVVWRnFJcUxVUlFXcW1WQlp3aVJTMnc3S29xTEcwUkRpd2xVcWx2cHFsVUZpSmFZV29oeFlvcHhZRlVOaU5naUdBVmhUQzA3SVU0c1FNTGVFUTJQQ0FzaXdjVlVoc1ZRd3M0aFFIRGhYbVRuTmdmOEFDZ1lXSGdJRGdkMFFjRVVjQWtCRm8wZFdBNGNJR0ZuQ0FpMUVqQzNlVVVjUkNFSEhoQVdRYkU3S1ZSeE95ckk0bFNxMktVSEZLTmg0cFNqaU5sS0RpTmtvMkEyVEJrY2VBZ09KNklOaW9OaXFOanlnMktBNGxNbUd4S2xWc1NsQnhQQVJLMkI0U2pZOHFWV3g3cFJzRTVUa0hEaFVyWWdhS0x6aGlOa0xCWWJLMUF4NVFiR0VvR0pSV3hLWEJ5c3hTa0RIaEtSc1VLMkNGWTI3S0xXeFFiRW9BMVZGRERnSkNoam95TEdZZUNobkRZOElrQmhzaEFJN3FMQU52Q29VMkZGd0JzT3lrS1hFcEZERklSc2VGSUZOaUJUNmZDQkQ2YW1Xc0JncWxLYkZsU214Q2tObkNqVktiR1JLVTJoRGxJYkVWTTJiS0tRMjdvcWQxaWdrYlc1VEs0VE5xZ2tiU0ZscE0ydWlvbTFTcWxkYjRKbGNZU3V0UXdqZGF5aXBYV0tMVXNTbzFYa0MzWU91enpxMjJIWlZGN2JDZWlHRnJiR1ZTcWl6bFhDWld0c0dpdUV5cmJZclVWRmcyUkZyYkJzaUtpM1pYR0RLZ3RWUlVXb21UZ0t3VXRzVlRLZ3RSREMxQ0hGcUdUaTNoMFE0dEowVndad1lXSFpBNDlNOU9GUlFXZmVpR3dDUW80cW9ZV1NnWVdEWjBXbUZpcUNMZUZBK0pWUWNlVUlPS2l3V1ZnT0oyS0VIQTdLNXlZd2JCQWNRcFNEakt0UWNKcXMyTGFPQ3RTdGdBZDFDbXhHeVVIR0tKUnNkNFVVY1R1aVVjUXFNdzZvQ3lJTGNJUUFPRkdzNEhFN0lDTFNxallvc0hIbEVqQzBhcUxHeENFSEVJUm1HeUVaZ2dMSU15RVpvU0hNekpCbVFnc2hHYUhVV05pVXlSc1VTTmlnMkowUll6SFpDTWJUc2d6SFpDQmp3b3JBSmd5eklrWmtpaXlad015VEl6VFJBTVVBeFNyR3hNcGdnWW5aQnNlRlViQkl0YkJDNEtiUEJSYUdIS2N4enRpZGxVREZsRmJGUWJFZE9VeVlERkFwc1VYQlRiM1JTa0lBeWl3ckltY1FwdDRVVWh0UlNtMDdJRU5xa1VwdFVPWWhzUUppVkdpRzNoVUliT0ZLcVpzSVFJYmV5Z2tiRkdzWlNOaWhValp3cGxVcnJWRlR1dDRVVkUyc2lwWFdxS2diVzZLVllUQ2FwU1BGdHRYVnhYRnFvdGJhckU1MWhidXJobkt0dHJyVVJhMnp1bElyYlp3cWkxdGhSRmhZZWdWd2lnc1Z3WlZGaVJNcUQwMVVVRmdDQ2d0VlJRV2NJSEZvMlZqSnhhVWdjV1VSVGl4RWg4VlVGdUVpbUZoMlZRd3NRT0xEOXlGTUxEOTZGTmh5bFEyQVF3TEJBY2VGUVJZb3VUQzBCS2tNQWRFcEdaS0N5bFdDeWN5YzRpM2hVSEVxRkhGS2dpM1JBY2ZKRmc0OHFvMk81UWJFS0xCeENFWmhzZ0xEWkFVTUFneUtJQlJHeE95UmFPSlZSc1NvRGlVR3hRSEZLTmg3QkN0Z3BSc0VXNUVXb05pQkxvbktPTUlZYkZGYkdBaDhXYmRCaGFrS3pGQm1QM0tOTXhWUnNTR1JXWkVabE1yaG1QUkFjWUtxTmlOZ2dHQVJXd2RRbzRiSzFBTmgyVVZtYlJXcEdaUldZS1FCa0dJRG9ZdzJJVkF4NVVVR0txTTNDRUJrVU1lNlVBMitDaTRManloQXhPM2RBR0tpdGlpQmg5enFMbkpUYjJTaFRZaS83aTRxTFF4Q0lYQUtLUTJLQlRZaWtOcUVLYlZCTTJwVmladFJjRU5xZ21iTmthd2tiV1VpMU0ycUNOMXFLa2JWRlJ1dFVoVXJyVkZSdXRSVWJyVkZxV01xTlBJdHRvdXpndUxSc3JoRjdiZFdXc1laeXNMZUVGcmJZUk1yVzJxNFJhMjFWRlJhcmhNcWkwN0trVUZuQ0N3czNDdkl5Y1dub2dwYjZaUXpsUVdKaE1uRnJxbk1vTEVvb0xCc2lIeEd5SEtJdDRWU0hGcm9waGIyUkRpM2hWQkZxWXlad1lXaENHYmhBY1RzcUd3UW9pMUNpTFNhcVVOalJLRGdpVWNWS0RpRUJ4R2dRRmtCWlV4aG1Rak53aXdVU01oQnhPcUsySlFIRW9YQTRvallwUWNmSkFjUWhobVVvT1BEb0Rqd2cySjJRSEVvUmhhZGtNdGlka0d4S2lqZ1ZZTmlVTVliRTdvUnNESG1nMkJLYzV6RGdVR3dKUUhBOElOaDBRSEIwbzJKNnBSc2VFb3d0NFRCbHNmSkNNeGZWU3JHNmhWSXpCUlFZYklNQUVNc3dRWnZGRkRFb1ZtS0RNVVZtUWpOQ0ViRWJLVWdZZUNEWWRHUURFcFJtUVpsQ3MzZEFNUnNsR3dqM0lCaWxJRGJxa0RIWlF3R1BDTHlGeEVvb0cxbEFGWWdFQ2l5cFRhZ1UyK3hSYVFoRktSd3BGS2JVaUVOdlpSYW1iV1JhUWhRSmRiMlVpMU0yOEtpWkNnbWJlRVZFMnFOWVRJVUViclVWSzYxU0toZGFvSlhCUlVMclVWTnBRcnlyYlYwYzE3YkZhTDIydXJ6TXJDd0lsWHRzZFV5c0xkbGNNNVd0dHBFcW9yYmFxUlcyMUJVV3NpS0MxMVV5cGJZaGxRVzhLcGhRV0haRVV0c1AzcW9jV0lHRnBLQng2WTNRUGdOVlVwOEFoZ1JZTm5RTXdWUVc3S0tMS29ZQTZJZzRsU3JqQmdPNlVnNGxBUmFoa1dSRFkwS0VIRkNOaXFvNHFGYkhoREFpMUtaSEZBUllFd1p5TEFHaUlLVWpNZ0l0SlFIRkNEaHVxTmlvc2JFSkFSYWhrV1FacFpBV0tISXpJRGlnemRZUXJBSVpGa0diVGJWQ015QXNoQWI4RVVVU00zM0lyTjk2SXlLM3NVR2tGUWpONElSbVJXODBJTElrWnRFcWkzSFpLakFKVElZNnFMV3dFb1ZzQnVVR3dDRnl3czJUQm1oaWRrUm0wb2k1dzJpRVpnZ0RJTVFtVEFNVzl5aThqTTJpSzNaVkFiVlJRTnZLQVluc2tLQ0l5UVp1NmtVR0NVZ1k3S2hUc3lBTjl5RkJwYXFLVEhsQXJNcEZDRVFEYU5GQWh0UmFRanlSYVZsQ0ZOcUNkMXFpcGtLS1FnRkRtU3V0VVZNaEZUdXQvRkRDTjFzcUxqS1pDS2hkYW9xVndVRUxncEdrYnJWRndqaWg4SG5XMjhMb3hsZTIwN0tzcjIyRktpOXRoVkZoWm9sUmEyeFdwbGEyd0tvcmJZTmxVcXd0QTBWVG41MUJhbUV5c0xRQWlIQVZGTGJWVXlvTGVPaWdabFE0dC9CVWh4Yjl3UkRZb21NSEZ1eUtZV3FvT082Qmhic2lHRmlVRVdpWVpTcmtjVUJZT2dJdEtxUTJJMUtFRUFiZEZGaklHYmhWQkZwUXkyS0tMSWtGa0J3T3lBNEZBY0FoekNMUnNoekRqOTZpaXlxTXlVRnVFR1pCbVJZTFZTSXpkMEdZS2pNa0c4dGxGYmhBVlJwUVpDTXlETXBneXpiU2hCWktSbThFVm1hcVZPZG04RUdiVlRtVzBXR3F0Um0vQlJXYmhLQ3gyVlJtVUkzZEZaQ0NoR1JJeklyTXBCdWlvM1ZRWkFLYUtLeW9LSUVhcUt6QlZBTnZMS0tCQlFCajlxcU1nQ2k1WmtLRFZRQlVaUlFaOUVBYlpDQTFYUUJJQXlrR0lIWkFHMUN0UXBHNkJTS3NpNHlCdDdJRU5yZmNwRm9JRk5xZ1FpdkdpTFNFZmdpMGpLTGtodFFUTnFoVXlGSXFkMXFDUkZZVWFTSVFSdXRVWEdVaUZGUnV0VEs0UXVDeXFGd1NLbTBySzhyZ3RIQzZZdzU1V3RDcVpYdEN1RVh0dGhET0Y3YllXbVhUWjZIcTNCN2ZUdXVCL2lBTExPZHBweHo1dzFqWjZzODJNdW4wL3dCSCtwdmZEOVA2dDdWQXNKK0N6bmlObnA1OVdPbkRXTmh0TlhOcHowWmRObjdkK3V1TFcvby9YdUpvQjZkeis1WXp4bXh4aS83OVBUaGNjSnRzNW4relYwWmROdjdUKzVhL3QzNm4vdXIvQUxGai9JY052TkhheDF0LzBQRWJ2VjJjOVRwSDdIKzhRMzdSK3NPMytnOVQvTldmOHJ3bSswZHJUMXRmNHppOTFyN09lcDBXZnk5KyszaDdQMlg5ZmNON2YwM3FuL21yR2ZPZUIwOCszMmVQNTlQVzFqeWpqZFhMalliVHNhdXAwV2Z5MSsva2dmN2ovWGg5VCtuOVFEeE5xbWZQT0F4K3ZzKzNwNjF4NU54K2VUL28yblkxZFM0L2xiK1l0UDJUOWIxK2pmOEFZcy81L3dBdjMrejdXR3NlUmNmdU5mWnl2Wi9LUDh5WEJ4K3kvcXUvcGwvQmM4L2NYbDJQMTlIUzZZKzMvTU0vbzYraGYwLzVPL21XOHNQMmI5UUN6emFMWDhTRm5WOXplVzQvWDA5SzZmdHp6SFA2T3BVZnlYL00vd0QrbjlhT2JmOEFPV2ZWSGxtKzAvajFOZW1mTXR6cS9Eclgvd0QrRi9tcXYrNkwrL3FlbC9uckhxM3l2Zlk2TlhVM2o3Vjh5M09lblQxcTJmeUYvTmwvNWYyZy93REc5YjBSNFA2Z1dkWDNoNVZwL1c3dXZ3dGFmdFB6UFA2UGUwOWEzOXYvQU9iZi93QlQxLzAvNmY4QTFpejZ5OHAzM2QxK0ZmU1BtbTU3Mmp4Sy93QnUvd0NiR0gvbDFrNmZXOUwvQURsejlhK1ZielBaMWRUcDZPOHozZU8xcDZ6Mi93Qk92NXBOMkovUStuYnZjZlc5Tmg0WEVxWis5dks4WTVOcG5zNnVveDltK1o1L0pqdGFldGIrMi84QU5Bai9BR2IwQi8yMXF4NjM4c3orYlYyY3Vub3p6TDVkUGF3cFovVFgrWjczZjAvMDFoMEI5WUgzQXJPcjc1OHN4OGRXZjVXdFAyVjVqbjRhY2Z6SEg5TXY1bllISDlLeC93Q3RwLzdLejY4OHQvNTluK0sraVBNUCtQVC9BQVhIOUx2NWloL1YvUkFtdHA5VzV4NFdGWXo5L3dEbDJQaHRPemp4TitodVB6OGRIVG5xTmIvUy93RG1Fa2Y2YjlDSmJJK3JmOFBUZFRQN2dlWFkvTHRPakhpWEgyTHgrZmpzK25QaFVIOUxQNWdmL3dDOC9id0puNm5xdEgvWkxuN2hlWC9KdGVqVDQzVDBIeDN6N1BwMWVGUzMrbGY3NFRkbit1L1FXZ05TNzFibmYvc3dwcS9jUGdmaHM5cDBhZkZsZFAyRnh2eDE3UHAxZUZUKzFYN3lCLzZoK2lQUStwL21MUHVId2U3Mm5kNjJzL1lQR2J6UjN1b3cvcFgrN3Y4QU4rNC9vN1JvUjlRdi93Q3dGTS91SndudzJXdnU5YTQrd2VMK08wMGQ3cVYvdFQrNW1uN24rbWl2eTMrOW1XUGNUaHQxcjZjTmUzL0U3M1IwWkVmMHAvY2lRLzdwK21BSnFMYnlaVXorNG5EYnJYMDRYSDJCeEc5MDlHVmgvU2o5WFQvZkhvLzkxZC9uTEh1THNkenE3V09wdjIvMjIrMDlHZXRoL1NuOVdmOEE4dDZMN2ZTdSsxUGNYWTduVjA0NmoyKzIyKzA5R2V0YTMrbEhybi84MVlOeDlBeC84eGMvY2JSdU05cjZYVDIrMTcvSForcGovU24xbkEvMzFZUVlmNkJyL3dCNG51Tm8zR2UxOUo3ZmE5L2pzL1VzUDZUWE1IL2ZRQ2FqL1pvSC93QTBMR2YzSHhlVGgrLzlEZVAyOXpPWGlPNTlUZjJtSkxmNysxbi9BTUxwL3dCOHA3ai9BTnYzL29QYjMrNDduMW5zL3BQWTUrcCsvWE5vMzZZVysvMVNzNnYzSHo4T0g3LzB0YWYyOXg4ZHYzUHFQL2FqMFhQL0FKM2ZWdjhBb0IvckZuM0cxN2pIYXo0V3ZiN1J2ODluNmhIOUovUmRqKzkrcEd2K3pqL1dKN2phOXhqdGZTdnQ5bzMrZXo5VEQray9vQmlmM3U4aU1oOUFEenpLWi9jYmFmRFlZN1dlbzl2dG52OEFQWi9pcC9hajlHLy9BS3Q2MVA4QTRWdjJySHVMdHR6cDZjOVRmdC9zZDlxNk1kWWorbEg2TjJQN3Y2NGYvcTdmdFQzRzIyNTA5T2VvOXY4QVk3N1YwWTZ3UDlLdjBRTEg5NDljUi84QUN0ZjNwN2piYmM2ZW5QVWUzK3gzMnJveDFyZjJxL2JQL3dCbitxZHRyUGN5NSs0dkU3clIwNWI5QWNQdmRYUmhqL1NyOXJIL0FPVC9BRlZXZkd6N0ZQY1RpZDFvNmNyNkE0YmU2K2pEZjJwL2EyLzlVL1V2d0xOT3llNG5FN3JSK1BXZWdPSDN1cm93cGIvU3o5bXhlNzl3L1czWGF0OU1lV0JXTS91SHhsNU5ucys5MXQ0K3dlRW5MdE5mZDZoL3RaK3luLzhBdi9yWGZmMDkyL3dLZTRmR2J2Wjk3eEw2QzRUZWErNzFCL2F6OWxsdjNEOWFTS1Q2ZitZcjdoOFp1OW4zdkVub0xoTjVyN3ZVSi9wWit5bW43aCt0ZUlmMDlmOEFpSjdoOFp1OW4zdkVlZ2VFM212dTlRZjJ0L1ppVy8yLzlhK2srbjMvQUlFOXcrTjNlejczV2VnZUUzbXZ1OVFuK2x2N0xiWDl3L1dlUHA5LzRGUGNQamQzcys5NGowRHdtODE5M3FFLzBzL1pSUDhBdkQ5YVFlZlQxLzRpZTRmR2J2Wjk3eEw2QjRUZWErNzFCL2EvOWxrSDlmOEFyUTM4VCttM0JteFgzRDQzZDdQdmVKUFFQQ2J6WDNlcFgrMTM3QkFQNno5ZUNRNy9BRlBTOTMwdml1ZWYzQzQvNU5uMGF2RzM2QzRINTlwMDZmQzM5ci81ZmRqK3MvY0FZTGZVOUwvVXFlNFhtSHliTG8xZU5mUVhBL1B0T25UNFcvdGYvTHpUK3MvY0dQOEExbnBjZjlTbnVEeC95YkxvMWVNOUJjRDgrMDZkUGhFZjB0L1lDeC8ydjl3RDArZjB2OVVudUZ4L3liTG8xZU05QmNEOCswNmRQaGIrMS84QUw3RnYxZjdpZiswOUwvVko3aGNmOG15Nk5YalBRWEEvUHRPblQ0Uy8ydS9ZV1A4QTR6OWYwUHFlbC9xazl3ZVArVFo5R3J4bm9QZ2ZuMm5UcDhKdjdYL3kreFArMS91TWY5WjZYK3FUM0I0LzVObDBhdkd2b1BnZm4yblRwOExmMnY4QTVmOEEvd0RML2NIbkgvU2VscC8yU2U0UEgvSnN1alY0ejBId1B6N1RwMCtFbDM5THYyTmhqK3UvWFdscGUvMGk5S2Y2TUxXbjl3dU8rT3oyZlJxOFRPcjdDNEw0YTlwMDZmQ0g5clAyYi84QVlmcmVDL3ArN0JYM0Q0emQ3UHZlSm4wRndtODE5M3FBL3dCTHYyYlQ5ZjhBckNXa1A2ZGYrUXI3aDhadTluM3ZFZWd1RTNtdnU5VGYydS9abS84QXYvMXp5Q3g5UC9NVDNDNHpkN1B2ZUk5QmNKdk5mZDZtL3RkK3pNVC9BTGYrdE9vbjAvOEFNMVQzRDR6ZDdQdmVJOUJjSnZOZmQ2bS90ZCt5cy84QXQvNjNrUDZmK1pLZTRmR2J2Wjk3eEo2QzRUZWErNzFOL2E3OWxqL3gvd0N0OGZUbzMvQVQzRDR6ZDdQdmVKZlFYQ2J6WDNlb1A3WGZzOGYrUC9Xa3M3ZyttM25ZbnVGeG03MmZlNnowRndtODE5M3FLZjZXZnRidVAzUDlXTFpZWTJFKzVieCs0bkZmSFphUHg2Mk0vWVBEZkRhNi93QU9vdjhBYTM5cnIvdlQ5U3hEZ0czMHg4RmZjVGlkMW82Y3A2QjRiZTZ1akFEK2xuN2FXLzhBTlAxTGsvNGJObjJUM0U0bmRhT25KNkI0ZmU2dWpBWGYwci9RUDh2N3Qrb0FPaDlPd24zaGJ4KzR1M25Mc2RQVGxuUDJCc0x5YmJWMFlKL2F2OUVJL3dCNyt1Ly9BUEZhM3ZWOXhkdHVkUFRucVQwQnNkOXE2TWRZaitsWDZLUC9BRGIxd1RwOU8ySTZwN2k3YmM2ZW5QVWVnTmp2dFhSanJKZi9BRXAvVHY4QUorOCtyYUcvaTlHMHoveXd0YWYzRjJrNWRoanRaNm1OWDdmN084bTJ6MmNkYVkvcFY2SkQvd0MrNytmOUFDMy9BTXhYM0YxN2pIYXo0VTl2OUcvejJmcU4vYWowQ1A4QTF5L3A5QWY2eFBjWFh1TWRyNlQyL3dCRy93QTluNms3djZVMkZoWisrRUE2bjlPQy9UL1NCYXgrNDJyNDhQMy9BS2NzNS9iN0h3Mi9jK29wL3BRUVAvWGYvd0RWK3oxbHIzSC9BTGZ2L1F6N2ZmM0hjK3NwL3BVWmI5K24rRUg5S2E3ZjlLcmo5eHY3ZnY4QTBIdDkvY2R6NmlmMnE5YVAvT3JPZjlBZjlZdCs0dWpjWjdYMHNlMyt2ZjQ3UDFFL3RYNnBwKzllblIvK2hMZisrcjdpNk54bnRmU250L3IzK096OVNYOXEvd0JaUC9tL291UCtydSsxYjl4Tmp1ZFhUanFZOUFiWGZhZWpQVzM5cXYxcGR2M2YwSUxIL1IzYWY4WlBjVFk3blYwNDZqMEJ0dDlwNk05YUovcGIrNXYvQU9wZnB1dU4vd0JpNmU0ZkRiclgrREhvSGlON3AvRVA3WGZ1TE9mM1A5TU9jYi9leWU0WERiclgwNFBRUEU3M1IwWlMvdGQrOEVPUDEvNlBIU2ZVL3dBeGI5d3VEM2UwN3ZXeDZDNHZlYU85MUIvYTM5NWRoK3YvQUVRMHI2bitZbnVGd2U3Mm5kNnowSHhlODBkN3FTdS9waCsvQjIvV2ZvQ0IvbCtxRC84QVM1VzhmdUR3SHgwYlRvMCtKeno5aWNiam0xN1BwMWVFRC9TLzkvRnBQKzAvdDVPdG85VDFYLzhBcEs0L2NIeS9QNU5wMGFmRW1mc1Rqdm4yZlRxOEtYOXNmNWhML3dDbC9SUWYvaTMvQU9yWFQxOTVkL3B0T2pIaVo5RGNmL3JvNmM5U1YvOEFUWCtZN2FIOUplQlUyK3FZOGJRdGFmdnp5N1B6NC9sL2l4cSt5UE1NZkpuL0FQZjRGUDhBVGY4QW1RUTM2YXJmOUx2L0FNVlgxMTViL3dBK3ovRlBSWG1IL0RwL2dnZjZlZnpNSC84QUQramN6dVI2dHE2ZXQvTGZtMWRuTEdmc3p6SDVkUGF3VzcrbmY4emluNlgwcnovaEhyV2ZFaGF4OTcrV1ovUG5zNVp6OW0rWlkvSmp0WVNQOVB2NXBnSDlCWngvcHZUL0FNNWI5YStWN3pQWjFkVFBvL3pQZDQ3V25yU3Uva0grYWdXSDdhTDRxUFg5QnA2M2hheDk1ZVZaeC82eitYWDRXYy9hUG1lTS93RGwzdFBpU3Uva0wrYXdELzVTWXEzcmVnZkw2aTFqN3c4cXp5ZjkzZDErRk0vYWZtZU9YL3E3Mmp4SW4rU1A1cEgvQU9JdkgvYWVsL25yZnF6eXZmWTZOWFV4Nlc4eTNPZW5UMW8zZnliL0FETUNSZCswZXE5dXhzUG1MbHJIM1I1Wm5sLzd0UDQ5VEdmdHJ6SEdmL0hWK0hXbGYvS0g4eVdzL3dDeit1WG93Qjl4VzlQM041YnEvWDAvajFNNSszUE1kUDZPcjhPdHpuK1ZQNWpmL3dCSC9WZjhoYTlSK1hiL0FFZEtlbi9NTnpxNkVUL0xQOHdpdjdMK3MvN20vd0N4Yi96M2wrLzBkckRIK0Q0L2NhK3psRy8rWFAzNjA0bjlrL1hFN0Q5UDZoOTFxMWp6dmdNL3I3UHQ2ZXRuUGszSFkvUTJuWjFkVG52L0FHRDk4dEQzZnMzNjYwYm45UDZvL3dDYXRZODQ0TFBKamI3UHQ2ZXRuUGxQRzQ1OWp0T3hxNm5PZjJiOTNZay90WDZ3QVZQMFBVL3pWci9LY0pubTIyanRhZXRuL0c4Vmo5TFgyYzlUbXUvYXYzR2YvTC8xUC9kWC9ZdC8xL0RielQyc2RiUDlEeEc3MWRuUFU1aitoL1dBbi93bnJCb0krbmRIa3Q0NHZZNTV0ZW5wd3huaGR0OGRHcm95NTcvMHZyMmxyL1E5UzA3RzBqNExXTnZzODQ1TldPbkRPZGp0TVo1ZE9laHkrcDZWOWpaMlhXdnVHVzlPckdybXpoTTZjNDU4T2U0SWlGd1JVYmdzcmhGcFNLL1NQcC90SDdWYmM5djdaK2x0MGowZlRIL05Yd1BWNWp4V2NjdTExNS9tejF2dVdueS9odFBOczlIWngxTzMwdjJ6OXZ0dUJ0L1EvcDdUTWowN0Eza3NaNDdpTTRtZHBxNmM5YmVPRDJHTTNHalQwWWR0bjZIOUlHUCt5ZWk0bTM1QTc2YUxubml0cm44K3JweTNqaHRsajh1T2pEdXQvVCtqSCtpc2ZYNVJIa3VmL2JyL0FOYzlMZU5scC8weDBPdTIxbUIyZ3JtNk9teTBnQjQyVUhSYmJwWGJRcUtyYmFkU1dmeVFWdHRQeXRYUUg3a3F1aTIxNFp2YjdWQllXNkNBK3lnc0xUREdLTWdZU1NCMlpXQnhhUVEwZys5S0tnTVJYN0ZBNHRKZmh3N29IdEZPNm1Rek9IRWcxS0tZV3NRR2cxNm9oc1hJTnhJWi9Qa0lLTUJBa25UMkNnQXRZZjRoQVlRdzFWb2NBZ00wN2pud1VVV053STNpVkJtSWdIeDA3S2tHU0NScng1NklDQWJ0R0dnTW9wbWNBOFFTZ0dGekNrU09xQXV4ZDZqV1BhcUFzUU5SUWN6cWdPSk83UTRNZmVnYkZxQnh4NG9BUnBJQjFvemZnZ1lXOGttZWlET1RJcHFaRmFVUWJnQ0JUelFZM1VBTHlCNHBFRWs2czRsaHY4RVVDUUhZc2RIb2dJb0E4eDI4VUFEZzhieE82RFBkc2VkTmUvdlFHanZvSUNBQTNrQmhXcGtvTUJRMWN4dHRWQTBuRVFmRGtJTVFaZXZmUktNYklORE9wMzI4VW9BQURoOUErbW4ySlFSYXpBa1BvWTNwVktOak1XaHRlbmRLQTM1ZFhOUS90b2dhSkxrQm5HeWdOQTgwbCtVQUF0ZjhvSkJnZEVHMG0xMk1hb01RSUxWWUViYWhBYmJRQkFqVTBRYkVQM21Vb1hFQzF6OHplUGVxVWFIaTBCaTdvTXdBeUwyaXNRZTZvTjF1alBQSVVvd1ozaVRYbW5LRFlnTnVkZHRkRUFZdzRsNUkwVkdhMzhwM2dQeWcySmdPWnA0YXBSbW1wQjFKMkhnbENzWEV5S0U3TWRPeUFrQjhYNVowR3dKMTQ1U2pNeGlsUzBzZ3djbHd4RWpKdWlBbVJJQmZSQUlOMFYxWW9NQ0FETDhuVkFvSkRCM1BqRlZVYTNFVWUycmluZEE1TGNiOTFGQVRJR013Z1c0QVBKY0F0dHNxakFOSWdPZmw2MWVxaWppREp0cno5cUJUYUdEZ3dYTUE3blJBSjFxTFhKUUM0T1RFYXRKUWFnR3cwTzdvTmlCSURrNm9FeGhyYXY4QWw5L3VWR2E0RURGNGtqUi93VUFaMkpreSt5QUFYVUpqTFNlYThJakFFaDIwOW9RaFFjclM0eC93elBpVVFYRndKQTJjdXlLVWk2USs3T2lBYmFXa1lrQ05RZUZRcGRpekVNVkZUeG1yVHJ2MVZRT0NLVkNLVEdQbEJFZmxaS2laQlpoT3cwZnFxRXhMa3kwZ1dvSjNEWWN5VlFwZnNOUzJrRklKM1dCd0RNMVVDWFdrMDBoMEhOalc3V1c5Z3RDVndjR0R1NkNPSFZ2dFJJaDZsb2M3dElmZE1JaGRiVVUyOEZSeStwWlpkYTF3RjFwMHVEaGF4bk9NM0NaeGpQTzVMLzAzb1haQStqWmMvd0NZWWd2NUxwamJhOGMyclBTeG5aYU04K01kRGp2L0FFUDZNdjhBK0Y5RmpYL1IyMDhGdkhGYmJINTlYVGx6L3B0bG44bW5vdzVQOTJmdHp0L3NINmZyOUt4dmN1bjlkeEc4MWRyUFd4L1JiRGQ2ZXpqcVZzdGVlMUY1YzVlcDFXVzYxM1VvNjdSdzdlOVFYdEJndjNTcTZiTGE2NktWWFJZS1U0RlZFWHRtSWNlM3hSVmhiRTBlVXFyMlcxSmdOVlNpb3RlZ2FEOWlsRjdRU1F4alErOVNpZ0JOSWtzRlE0a01KSnB0MVNpZ3RlQ0dJa3FVTmF3dGNTR2pzcUtXNnpOMUFkblVvWmhhQVRTSEk0VUZNV2MwcVNaanpTcWJXS2dPaUd4QmNFeThOVktDQTVoMjVIbTdLVU93TEVpU2xVSkltTFNXMCtLQWdOMEZSYkhWV3FObzAyMDYwU2pZQUM0Znd1NXRTaG1IeW5rbDlqNUpVTlVHQlNYNGJoS29XdmlBUmoxaUVCeGwzYzZoMlNoamFDTVNab1NmYVVvTGw2U05RMnFERVUxdEtVWW1oSUxFeGJxZ3dMZks4Qmc0R3ZWQUJKRC9BSm5MZElTZ3V6eUFSK1k3T2d3eWVhSFR0d2xCME1NUlVIeVVvemFBVVp3ZnNWb0lINXBZWEZ4NUtVQ2tNZVdsS00xcHRtWEx0MFNoclJhUnU0aUpsTTVCTHlCNGs5MUtBTWlCVVJWV2pQSURBN2pUM0tBdmtkUmkxRHVnelNEQTZWU2dNVGpxMVcyU2pDUmJMQTE1NnBRSEFMU0RiRHpzcU5hQzFYY05JU2hxR2JtZm55VW9RQ0xpeExuODJ5dEJMWXYrTG9DQXhjZ2d0RFVDVVlrQ2hkNUpQc0VHY2NBdzRkOVdTalFEOG9acHVhT3lVWVFBNWdNQnV4UVlOcEVSdjI2SlFURGg2YTAvRlFZVUFFUFY2OWtvV3BEYUJ5Ulh3cm9xREw0NnM4Q0ZLTjhyZ3N4QWdmWXFNK29nYm1sZnZRQzU1QUxpNGJWcVlLQXZxRFdRVHB1VUJFbHhCb3gwOEZLTSt1VFFRNkFTSkU4RWl1eW9Ja0VEU0FlenVvQStwdDZBNzlTcU0xUTh2SHM2VUtCYmFBRHQ1cFJyZ0RMdUJyMVRHUmlOUXpEWG9FbzBnYm1BSmg5VmFBd2VrdE4ycVViS3QxTGVZRlVCdEpPTVBBYytLQkhEczVCdVoycDQ5a1F3b0hMUE1kUWxVSFlnQXlYT081ZmRBUTVjYTZIVGdoS05VTnFQNFovRktBd2M1U2VSSHU1U2pHMDF0TlM1Sm4zSlFKMGMrK2ZzUUFFMElQVTZEUkFwWWw2ODhKUU1hTVNBREk1NnBRc3V4M24zcFJtRk12eTFsNnBSaHZMYWpVY01vZ0hrTytuNHBRRERoNTl2ZVVvRkpZbmJsMWFGT0pobUxvRXVacE5EQlFJYlNIMlNoQ3h5RnI3RStaVnFFYmNNL3dDWS9pbEVyclE1M2VvOFZhRUlEZ2tzWmNPL1pLSnMvd0FwRlBibE1oU0JJSVo2ZE95bEViclhtUnF6VlZvamVIZG5mZWlvaGVDWERkRXhrUkxQZHhwK0NJNTdyWklacFZvNXZVQUVzejZGWEdVYzkvc1ZhT2U4YUhzRVJ6NEYrMVZhT2V4NEtLNjdBdzgyS2c2Yk5uclRkQjBXbW14cW9yb3NCZ1ZJMVVIVGFUdTcwQVVWYTBVMGFqVFFxbUY3Y2lXbloxRmRGdVRidW9MV3ZUMjZxQ2drdlU2RDI2S2lrd0IzSFZRUGFEQW1KMjhVRkFOS1cyd3lCZ0dEVVBuS2dwYlYyY0UrY29waHViV0lMMnZ4dWlLeVI4djJkVVVYWU9UQUU3K1NnWVpQQmRCaGJ1Y3F3ZkJBUVFiUUNXRFNIMjZvTTBzMU5Ib0dRRUVXM1FJYjgzRUt3TzVOZkF4UFZSV0pKM0owY0tqRVE0aHhCTEFkVVF3L01KK2FVVVNTU3dKR2hjYklBNWR5WWtBZThlU0l4L2l1Y2tpb1BEb0M1TWhpTitSc2lzTGk3Q20zVFJJRGJveEpEQ1Bib3BrQUM1cTAvTStpQXVEcWFTMUprSUgzYVR4MVVBTkFDV0dwOW9BUVk2eXgzYjdOVlFYazVVRE1YVUdkeGROYWJJRkJKQUFJZVpZZUtvWndaeTJrYmZpb0JrWHhCTHZ0NGxJTUtraU1RMlNBZ2xvTHZyOWlBRnkvekFHNm9JZGlnTGtrblIzZnArQ0FBMmc3UHZXRUd5dUlBYW9JNFNBbGdXWnpKWmtHa05vR0p4cktFWW00aUMrZ0xmWWczRnBGcDFqNElRQUN6RUIyRGEwNm9RSDFCckxpdjJxd2EwMExPNGZXdWlCaVhpNVFaeUdEalJ3S29BTWdXZ3N6ZFB1UU54dDJIYnhRS2IySUJKRVZhTzFVZ3hKSmpVVjBRWjNJMEpMa0lOa1E0RGNrb0NYTlpod1c4WVFZWEVtcnNIaElOK1YycnFneExPeHEycUFaUVFmbEJqcDJRWTNIK0VaWmZsRVU3cEFYTkR6M0QwUVp5U01nNUkyUUFFaHhIVGIzSUMrUmVRZjhUZmFnRnhKYTBGcm1mM0pnWUdrbVdEa2JkZXFEWEZpQ2JxQUVEcDRLZ3UxQzMycURFbGhMQTFKajdFQXV5L2h0a01BUm9xR3E4Y053VkF1dW1SRk5ZVkNrTURjQ1llSWpWQ01aT2dOTFNQRkFKQWk0c1pCNnFnNjlJSStDQUZ5SGYvZ3pycDVvUURlUkRsOStVZ0ZRd0RBd2RDNkpERnJ0OW5vaWc0TEFNV21aUUFCLzRnOVdHcUVMZGtNZ1F3b1NPVVJuSWcxbHRpaWxhbFROQVcrelZFYlI3YUNDQ1ZCaTVmVW1nTkVBWTh1UkwwOGtBTlFDSlBIdHVvRmk0U2EwSjUyVklSeUFXUFNkZTBxb1M0RWdzNzY5K2lLUXcwdFRiNERoRUJ3UVFhME82S21RUkR6N29xNnFKM09OWFBDQ1ZSTUVlMnFvVWlLbmt1Z2tRV3BOMnlnZ2NnVExnNktpRnhMN0FWUVF1ZDlpeDlxTFNaUzlRUFdEN2JKZ2MxKzFEVkVjdDRKbnc2TFFoYy8yQkVjLzhYeGJ5VkhONmVtcjZxanJzSDJyTkhTS0FWbG0xVVYwMjBmUVUwNFJYVFlKYWgwUG1wUjBXT0dlZDMwM1VGcllxNEJaTTVWYXdUcVRLRG90QTFocWFVV1ZXdERHdlZFVmVuU0RLQmdDMnhmcWxWUUNndGhwTG1maWxSWEVHbFdZdHpWU3FlME43dndRVXRjTkRVZ1RDQmd4N1U1NVFFQWtuNXVROVZBYlhjM00rZ1pCVThRZEI4RkJ2emFFZ2x1eW8zeWhpTmZCaXFvZm5tb2FJOHBUbUdycCthcE1hNklLRUdDQUhNTWRlaUJuZHFGdDJvb01UMlozdVpBS0VtcEZHMGo3a29MYXRRNkpRb09WWG1oTk9pb2I1aWRIMTJQQ2x3Q0dZUm80TllOZkpLTXdOcmtQUHUxT3lVT1RUUjlDb0E4RnJYZlQ3ZXJvQXprUzlyd0NQc1ZvemxzZ1BscWR5b0RMN3pUaEFDWEpkbVppTlVCbzB1Q2FjSUI4cEZwdVlqZjIzUUJpZDMzSDJRclF6Z2dFT1cwOC9jb01LRnRLZmNnQUpJcVNTUk5PVUJiSXUwRFdQQktCeUJKMGFvSjhFb05XZjVoQlpBQVp4ZHJXWnVxQXcxcDM3NklGYTRzd0xHaEVNNm9ZUER1SWtTOHFBaHpJYWxVR3hhTWZDUHhTakMyQXhadllKUmdDQ0FBM1BSQmlLUERHbWhLQm1jT3hiK0RSQU1RV0JPWEIreEtNUmFRd2RuZWlERzBPd0JvR1AzaEJpTFFJTWhnSDk5RUF1QmN0Um5jaDZWUUEyczRtVG8zVHFsR2E0VjFodnZRRWc3RnBMYWRrQWtFT0dZUXhIZEJzZnpBQnkwOWRuU2pINW5rd1pIeGhBT0NESFZLQzl1Z2dVSUZFQXVJQkRna3RHdEhRRW1TUEVHblB2UUE0a2k1NHEreXRCakpqWGFXWlFZc0hmMytiMVFDUmFBQ01qQXVQanFsQnE3R0dnMWZwS0RDVEFMUHpWdFhRRW5qNVRVKzlBQS95a0dsU1dqaEFJcVNTTHFrVUNBc0FKUHlpQ0s5RW9QOEE3MHNEMVFBa2lOTlNmZ3lBRXZCR3NidlZBR0RNYlFDekVobnI4VmFNYlJvTm1xKy9zeVVKVVFZR2s5MWFHT2dxU1hyM1VBZHlBWGx0bFJvdU1PQVgwanVnTk5LQ2lsQUJKQllFQWVNS2pNN3c1RXpBMWRRSmNHZDM2VkRkT1VBbWtHd0NkVW94aDNOQkRhRHgzUUtEUnlkQXdPdFVRRDh4TDlSVWNJQTBRWVA1WTIrOUFwRVFBR3A5bWlEWEJ0Q3pHUlZBalBvUkVVWmxSSWdmbU1FT2xDT2RmUFFSVkJPNmgwSTBLb2tTNFBFT3lJV2F6QmdGQks3K0lDb05kMEVyZzBWOTZLNTc3ZmxJaDFxb2hjV1pnMmsvWW1CRzZzenlsUnpYQUV3NVpVYzk0RjNMSFRsVWM5MERkcWhFUllaTnFxamxzRGZGQjEyZ1BTZENvcTl0V0x5ZllJT3EzckgzcVpWMDJ3SG82bVIwV3dRNHFvdUZyQUg1ZmVxRG90dExEVjlOZ29MMjFPKzBxS29CRFVJOXRWVVBhQmsybnVVVlFPeGt6QTY4S2l3ZVhrbUZrT0psM1l6d2djRUI3clpHeUNnRDlEN2JJSGdFdTRlVUdETVM3MmlCdm9nYU1uSUxVT29oUUcyak9BQm9rVXdNZ2Jud1pBdG9KSWt5STVIWlVVMGtoekRiKzNSQVhyb2Q3ZkZRYlVHWkdtc2ZjcUNYRE16dFVxQlFITWdQTDg2VVZHSmNDb0x3Z1lXT0pBaUcyZnJ3cFJoYkRqNVMwQm9sQTdhMUJVQUZ4TGFCcGYyMVFBTzdzU0RMTzgrM0NCZ3dlR0FGVVVEVzZmOEFoRmtSc1F6UVlITC9BSElNWERTUUtVZjdVRFNBQTdlMElwSUlwU0JSajd3cWc3Z3lLL1lvTVRKeEVDa3h1RUJvU0QvRjdNaWppWW1wZDQzUkRZd1pvYUJGREVkRHYwOGtRd0UwSWJlWDJSUWNRUUg0N0ZFQmpBQVpnSURmZWdZdVdGdlY5RHFnRGFsMzIxWW9DYTArVm43bEJua2JFc2RrVnJLQ1k3U2RVeWhTUVE0cVF3YXJxZzBlR0EwWlFFRXlKQjhXUUFCeFB6Uzg3b01KRGdraG81UGlnSjFKY3RJQVFLd2dIWFNubDNRTmk4L21MdTJqOFFnRGh4SWgzRDZsQmhWelBoeFJCb2NNQzVBb0dlaW8xcFlNWHBPdkNnSXRoNjNmd3ZvMmlBUUpMeCtZMUNBd1lBWUNHNVFBdVRJb2UrNkEydHpNZ2Rhb0VZd3pER3M3ZEZRU1FTMFpNOVBlb0NMUURvRytLS1VDR0l4SllOS3FNUTVBTjJNU0EwTW9EaVJKbHBMNmRFQUZwQmt5SGNOeThGQUNhYXVXQTNiOEVCaWdFZUNLUndTUVd5R2xkV1ZRVGthZFlMbFFiVTFxMnlBMXJOcGpZb3JPVElHdmlpQVdxTGd6Z2x1eUFzSUlqWWpYcWdHVTRNRFNPZGhUWkFmbGh4NzJicDNRQnpEd1N3ZjR5RUdBeUV3WkJJalZBdU5OSWIyWldnT1B6RWtSeTNaVVp3WGF0M1NmZW9CSUhYY3VGUWVDQ3hsNm9BU1JwMGF2RGlFR05vMEdzalNabFFUSllnVkxVZGpLb3hyL0FKVFMvc0hRWTFMR3VvVVFwZGdMWGhqY0tJTVFLa0E5ZEVDRVYvdzZnL2NxRnVBbG5BdUtCQ05vbHFhN29KM0hYeExJRUlKZWhjVmZSVVR1REVuVTYrM1JCSFV1ZW5LQlFETGwyVEtZU1lWRTkwVkM0VE92d1ZSekdDd29YY0R3VkVTTmkwUENJamZSNjhLNEhMY0hCam9mWXE0SE5kVWh2RkJKamszbWpMazlQRm5BNURhcldSMTJlK2l6bFY3ZHhYUW9ycnRIR3lnNkxTSnUzK0NtUmExaHlOS2ZCRmRGZ2gzQU8raWc2QUdCMVlleFJWN2F3WVVEaHBBN29tRGkwd3dxYXZ1bFZjQUdHcFQ0S1VNSGU0MEdzb0xXZ1hPTjZqb2dhVDhyaHhYd1FNOVR3N01VRE04bWVtNlVQU2dEWXNRWXB1b0c2M0FPSjJkRllIV0hQOFBDRERRVk9nb1B1UVVoM2w3YWo3SFFBT1FBUTJ4Z3dxQ1hPckEvbDRPaWcxYW1tdkowSVFBT2JpOFhBMEc3Q1ZRd0FHVXRqK1lLVU96UGMwMEE2cVZRMUp1RGJieWlNS3NHY0IyYWZGQW9PcERsbmNhc2ZpZ2Y4MEdXcU5FQUZHREVFZGtWb3BONFB4UkdJZ01CREcwYklNYlM0TGR0QWxHWUY5OUJYeEZFb05odXUwWURTcVpEQUVSMEhQVkF1Skx4SUVQdUtIVkF3QUFFRWsxOFBCQmlRWEZEYlB0MlFFZ2tDQVJVZ3oxWm5RRjJJY2hoN1VRQmc3aXByZDA2cFJoaTF0UThPWU1ib0dhR25YM29wWEdJTkRpKzZJMXJVTFBieStwQ1pDdXdoNE9ueEJWRGdzdy9DYUtBUVdNYmdBUFB2UWFrRUJoK1p0Z05PaUE2dVFlQWVtaUtYOHhJZlNXUkRFUFNDQUdRQnlDejVDNlFISFJBSERQU1p1alhka0JxQjdFOTBDdEJ0Tno4KzhxaHBuVWpUUit5Z0labmNBZVVJTmt6aXJrc1hRS045bmR1ZFlRWnF1R3lZQnhwUmtCRU1mNGpYUjI2SU5FT1dOQ2FPZzM4TWtBRVQzM1FBdzRINVdJTE4zUVlseVNOOFJ6eDVvRC9BSk9wZDd0dGlneE1rdXdERGhCbU10QTAxNFFEVS93bmV0WDVRTkJobzhrVXJzWHh0eUlqZnVpR0ZYQmZZYU1nQWNtUnkwb01RQ1habzIvQkJzWGtING9wV3VmY0VzUTRoRUtiVExtUUdmaEtDNEppNzVSTS9lZ3pPeGw0ZjR5T2lEY0Z0dlowVUFMYVBzQWRSOWlJMHZjNEJJaW1pQm1GYUV2S0tVa1dzSFBNN3dpTUF4eURNWkozU2dPUkRFa09BTmExaEF4eGVXTTdvSmtFRFVROTBLMENvYTMrR0lmZ2NxalFIWUVONEFxQWt2cklnZHdneElvYm5yd2dCdEJ1THUvajk2QkFEYVFOOVBqdWd3YzNGOU9yRkJwQmpTczlVQ3pMaVRReW9pY1d1eExXajh1M1ZhRzZGaVJRb0V1YWJTVzJISGdnUXVZZHRlNkNWd0FNMEpvZ1FnMEpQbXJSTWlDYXNnam8yb01nRlZNa3VEaHpXamxSVUxpR3ViVVA5cXVFYzl3WUZvMUFLQ0JET1NYYVNxSVhCb1p0dkJFYzE0RHlRVHd0RGx2RnZtZEZSSmk3K2JLTXVPdzlDcm5DdW15NkJxVklPcXdqWXkwK2FLNkxDOGlQUFJTRHFzdTFhQ0ZtQzFwQlBjUHFGWXJvOU15ME85T2lrRjdidEFLMUNtY0t2WmNLMERNa0RPNWlIb1BZSUtXa0VrVlllZEVIUURpQ2FuUUtRTmFUVjRhZGZaMUlLaTVzdEJRSDNwQTlwTEdqczc5ZWlRWXlHeEllcCt4VVVFUEZhNkR1czVHYzFrblcwSDRTckEyV3B0YktvUENSUmVoSTdEY29IQnR0QUJiWUJJR3lGQkpQMkpBcHV5WVl0cHQyaElOa0hjbXNXbnJza0JOemlRWmhoeWtCQjFMaHRBRytHcWdkMkxnZ0FicUtVWFVhMW0vTUEzaDRxeEJ5QWNzVzJmbnF5a1ZuMUlBMmMwVlJzbU54bTVxSkJzZ0h0bzVqZndTQVNhMU1iSGRCc3FBV2dFSHoxU0E1Um83UVhpU2tHeUIyWVQ4VWltbGhrU0tleEtSREF0TEdmdGhTREc0TzV0SWVjdGZjckJudWNtUzRZU2cyVEQ1akpnRGs3S1FESUQ1V2JRZ3pHenF3SE5zaXpCbmd4cWZOSUJrMXJDalNhKzNpa0I1M2tuZEJqY1pOdHVRTzMycEFjaGJTMmRCcnlwRkM0aHc0QmVBVEd2S3VFQzY0bWdvL3kxTkV4Z0EzQ3RkWmFPVWdkNU1BdFE2OTFGSzh1enZyb1ExZk5WR0JKdUp4Z0QyaEFjaUFUb3pnRXBBTXlERWdod1k4VWd3WnpCM3RuUW9ObU1RS0VWbVFrQnlZZ3NKaHpIWmlrR2VlZWRnVVZoZVNCY1lCbC9ibElBQ0EvVUZoQ0lOdHpuOHJPS1BEZEVneHVnbDRNQnArMUlHTWlqRlJTa3k1RUdDNkl4dTRMNm5SV0RaQ2Zta2lOUWtHQmdERVpFRHlicWtHTnhGQXphN2U1SUM0Y0h3TDFVaWdiZzlHWXhNVW9yRURMVVFRS2M5MGdkM1lIdnlvcFhlQUc2ZTlFWVhSK1ZnSGZYc3JBY2dDSERsb2V2dEtrVmpjV2RnK2x2d1NJQXVrSFJtRFVxckJpU2FUYnFEcS9LQXdEU2J0SVp4S2lnNHVmR0c3RjFVQTBMUTFDL2VpUUtjaERlRTdjSUZCR05vTFhDMDhGL0ZBUWFTeHRqNElNU3doM2NrRGt4OFVCZlJnKysyenFSUXlJZURkcmI3NnF3SEwrS2dBbjJaSUZCRFhSMkJKUkFjbHZsY0RVUDhBRklHZUNHWjdpd0ZVQkYrcEVOOHMxOFZJcENDR0xjTWFOcXFoY2dEcThselIyQ3NCek5vMEZlaVFDNjlqc0FhcEFRU1I0dWVhSUZkeVNDQ1F3cktRSmtBOE5wZDREWklBYnNpd3JhWFNBVzNPTGlJZHBKKzVUT0VZM0Fzd1lrdjVKQWo2V2dFVFF0UmFnVzR5ekZtMU5WSUV1SUFIeXRvd1NDWnVsM2d3Q2tDWEVzSEhVZFZjQ054dUlJZzdFUXJCTjhuaUMwS0NkOXpBRzdWbUtzRXJyZzcwY0pqQTV5VEQxYVZSelhHV2JqYVBCV0lqZGRYYzBEcEVjMTEwdFdycXdjdHhNblg0S3dRbW5kK1ZVY2RraVJHbHcrQ0k2clhiZmQxS3JvczNaNkhaa3F1cXc2YUNHVW82TFpBWnJ0SVVIVGEzeWs3cFdsN0RBZU42N2FLQzlzVm5VbjRLVVhEL0FEdFZTZ2hqY0hCM2YzSzBXdHBJbHFkVktLaUF4WmdZUFRsU2lvSUFGSE5BZ0laZ0JJMUc3cTBWcXdJRHY4cWxEUHJvVFRkQTdzSGFPZkhsUU1EUGFUenNpZ0JpOFBOUE4xYUN4ZVMrcHFQaWxGYUJuSWxTaFhKbkZ3RE82b0ltQmM3eWZKS01hTmFXZ3kreVVDNEdCM0JuUjlFeGtPZEFBd1ptRlhVbzJSQk9SalRmM29EYkpOTnZDdnZVb0FjRUI2VkFhT1hoV2hxQURzNmlzSGU2SzBQc3lVTFNsb0JrbDU3cTFCK1l0TU4zVW96dk52VnQ2TXFOOHNHM3Q4V1NoclJMWEI2a09wVk51d2VyQUZoMENVQ2FnZ2dSYTMybFdvTE5xNElabTBHaVZRR0krWXlHY0ZrcUMvWnkvd0J4VVVRN2swYy9kS1VBUFVPWm8rNlVFUEJvR3A4QWxBQkpBT2hGWG5vZ0lBSWExZ0tnaWpwUmdhdUcwYngxUVpoVUFUOFVvVUhaM1BCZmZWVkdCaHgrWWhBMW9MRVhUdnQ1cVp5cFNYdWNiZmxKYlhaVkJhRy9LSm1nOEVvQkQzQjVMT0IxU2d0L0VCSkx1ZkJTalBiTHlKY3ZzZ3dnMU56T1hqVHdWcWpsR1RBdjdCUUxhMnpCbUlJMDZxMUdEOTR5OEVvMmpFRTNTQUN6OFRSS01TQVlEQncramFPZ0lFRnFiQm1QYWlsQkJkeVkwS0tUUWdHWlBzVmFoaXpBRXVUUXhLZ0F1T1JKb05hY2pSVUVjVFRWaTZnMHM5WmVzSlJ0aVRpRExLMEFzNUJBWXRSS01BS3l4a2tKUXdPaGd0VGhSUUJEM2dpVCtiOFZVWTNBSG5icW9CQWd3S0RyVjlsYUM3Z0VnVFEwZFJRTE5BZGdJZDQ0VnFNVHFZWjVFMFFFd1dKY0hRNi9CQnBiNW8zSTgxS0M4Z2paanhzaWdRN2lBbENBaDIySmN1MCtLQmRnQWZsN04wVnFHN0V0N1Y3cUtBYVgvS2V5VkdJZDdpQzRwMjBWb0lic0tNTjFLcFM0TkdENGc5MFJucHFOT3N6NUtobkpJZ2lIZFJRZlV5N1AwUUFBR1lKRStUVlZxRUdSTCtmRzBPclFRemdURWg1U2hRWXVCMWo3dXlCNjBlM2luS2lsRHNRNGpRVFhSVkV3YU0xSmhBU1dCaHF5Z1FPR0xQRW5reVZNNVJtZVNRWG9kZXlVSWRTN2lySGxXaGJtTEF5UVpQWktGTGRDOG12WjBvbGNBUVcxTmErS1VUdUZJa2UxVmNaRTdpYmlSdnA5NkNVd3c3SUVQQkhCU2lGeGRtZGdTNFZ3T2U4aDNCbWFLb2hjWElpbXFvamNTVEJZaW80UkhOZEJvdzFLVWNsOURDMVJKNXJHNzZvamp0MW1xcU9xMmV4aFJYVFkwR3JzeWl1bXc2TWU2ZzZMWGFRNWFDbVIwV3p6S2pTOW1wbUM3K1NndmJwYzJyUFJNaTl0U0FTWE92S2dlMldMMTNwMlFWdGVkZjhBRUVGUVEyeDBQM0tCd1NSTnJBMWxCUzJMY1RNUitDQ28za0NnMTk2RE9CL0V3QjZvS09DeDBtTnBxc2pXczROc2JSdktxNEIzRkdNRVBNUFhkVU1IQTNMVTIrQ0I1WWdVME11b0NSazBzMG44Q2d3cEJlMC9taDVRRVVyeGtSMlpCc2dHZXV3MFBzVWltQm9DYW1DLzJxQWwyWjIzQmxoMVFhYUZtdUFHT2oxS0F2RnBBamM2QkJqYzJySG1pUUJnQ0IzTStDQlE1TENMQ3hEQkVZQnF4RWNJSEpodFJYU3FLVjVJeVl0QTBSQkVFVUVtVVU0a1d1VE5iZ2QwUVhiWEozSWJZb29Ha0Y3YUVsRUZ5RGJrZFB4UWE2QVlJZVNhb285OVkrQ0JXRG1IZ09LZFNpRGFRSUdtaE81UlFEeTRkcEIxazBRWm5ZbHlkUlhaRVkxdDJCY0h6bEFab1FRNXJzaWd4TEVWZzFpbXFJTkk4L3ZSU3M0dGRpQlFEeThFUVRiSS93QVdwWkFRd2M5d05lcFBLS0R1UVdja005c3hyNW9qTnJVR0JFQUlyR0t6T2orTElneFI4Vy9LSDE5aWl0OHphZ2lHSm5yeWd6aDJBSlpwMHFnQVlnaXI2Nm4ycWlNYXpTZUJSMEduRWtDb2pwMlJXQSthVEJwNzBCSmNaQXRGQnFnQk5vb1NDN3RVb2pFU1cwMkFyb0VCRHVjUXdFTkNLQWt3Q0FlR1krd1JHY2xzWG80Z0lwcEduQjE2SUFHTldOcG1KZnZ3aUFBNzFCb3huZXFEQzdvUVB6RGQrRWdJSHpRd0FEQUlvU0xvbi9KZHkzTDhvR01EOG9veGVBM21nQUJ0Wnk0Y05ETWlGY000bDZtUU9kRURHZEJhd2g5T2lLQmd0V1lJMzI4RVJtSVlQUVNOQjRvQytoZDl4Q0t4TU5UVDRJSW5ndmlISTl0MFEwaDJMMmlEMFJXWUFoeXdPanMyeURPSUFrRDJqc2dMaVRVR3VxQWFtTVdFYWxBUVdBQmsvZWdFQ3NSSmhFWm5GdTdPYlR5Z3dxNHRZbXQzUjRSUUlJQW1nbXBSQ1FhQmpQbG9GUXBZUER3SEQ3YU15b1lUV2Q2VVpRSFNKZUNTSitDS0JhMjBnSHJOSDNSRXlLU2RSa1BOQWZsWjNkeS9YUkF2ekNJYmlpSUJNY0NSMGxBaGVBQUhOUTIzNHFoYmcwdExWKzlCTzZBMVhMa2RFQzNZbGh2TEJRUk5HcnJ2UlVJUTFSbHozOFZSRVRzNW9kMENFbHdmTHpRUXVJWjJudXJoRWJ5SDJKUHhSWE5kdnpFTFNJMzhBR0tLWVJ6WHM4enMvbXFPWDFCV3J3N0tpR3VQbDhWVWNmcG1udEpUS09xMDBBTE5WUlhSYVdIYU95VlhYYnFBM0Rickk2YlphSElTaTFydVExR2I3VXF1aTJlRzBVcXVnRjZnL2Vwa1ZEZ2drbHpvbEZRU3hZNlFWQlFFT0c0WUNrNnBSVUd2QjdoMEZBSkxWMENnZTB1QmI0N2V4U2lnTG1qdzRTaGlDTXBMbVVvYXlEV0E1ZFRPUXhlTGQ0YmJsS0dKTVBIZEdnWUFia3lUOTZ0UVJjS1RNQTdUb3lCbW9HRE81OXhZSlF3Wm4vaTFyN2xLb09CaXdZYnFvMVdZNndSdnFsR3QrVzVuWUVsZ21jaHhjQU1oSUdnOXBXVk1YTUF0OEVvVnlDSUkwQXI0N0tvelUwYlQzYmJLVWJRTU9kQ0ExS0pWRU9CRWh0SVNqQjl3U0dGZmJkS0ZwYXpqTFFzUUNQWXExQmN1N1VQbDcxRll4RzRxQTlHMlNobk1HUzlTUEJLTUxueGNPMVhyd2xEWlBQNVdEZ0ZBZG5xYW5WS05RQUFzZllwUU1vTlEwYyswb01HR3VSREVxb01rMGdST3FsVnVUWFVhcFFSekpKcFZrb1c2NXJhYWFTeXFNYVRCNk9XMVVVZnlpNlhJTGo3MG96aTE2VFE3dHVnem5RNk05VUcxTGVESlJpUkJhWXIxKzlLQTRJQk9veUo4enlsUUdZQzFtYXBOQ3JRUVJXUXhFNytLaWllV0lNSGRLQTV0QmVXbVJTT0ZRUVFIRDR0UFJRQUVoN1pKMys5QVNJSWZZVUh1U2dGbmtFYjdkVW8zNVFSK1lBc3pQWFJLTXpubXBIVHYwU2dpb05RQkIzZnFsQlptY3ZTdmdsQWF1NU1kNGRLQUhBK1puZW85L21yUVE4QWpjbmhTalVEaU8xVDVwUm9kekV0YTJxVUVWcElnRktBQWVtNDZwUUN3cmNmbUJsS01DY20wUDVuanVGUWNwbHdYWmxBQ0NYSU5Rd0lLVUVWWi93RGhCS053UXhJbEFBekM3RmdIYnVsUVgzaVpQR2lLVW5FT0JJNWo3RW9YV1RRaUtwUWRpWEFkQUdJQTRFc1BjbEJreEJaNnp3bENzUWJvR0xUTmQvY3JVRTRnZk5JQVlrNmdLVlNuOHh1eWEzVWZGbGFoaVNTdzZqMmJoUlJJRGl1NENVWWJtbFFVb1hJaVNHQTNoVUt4Y3U5elVTakFHQUtEbjIwU2hRdy95ZDIrUGlyVU0yTUJnS2txVlFGd2U0dkZGUUxpSGZtVktKa3dibUo0QktxRE1GMmg3a29YOHR4aUttNTZBcVZBdUlCYkZ1RXdGbUNISklyd3JRcElQUStFcFJPNlRzeno3MG9TNG11bzltUVNKRGdidjh3bnpDb2lUb1BieFNoWEJnQ2RRZ2pjMDZnUTRWb25jV05PakpqSTViaVE1RkdyVlVSdUpmdFRXVmFqbnZERjlOdnhTbzVyMkxzUnFGUnpYbmpoV2lML0FETS90VktqaHNOQTc5RlIxV0ZoNHFEcHRpNmhQdHlvcnF0SjNiUlFkRnBBbVozUWRGcEZCektpcldOb2VvS21WZE5taGM5VDdsTWkxaDBZaHBQUGdvS2FNMUZROXJzQURJRlVGckNiZ0RYY0prT0dhM0ZuZU5VRlFSRlNlZUZrTUM3Q2owSTNDb29DQ0hxQUJUZFFNNTBKSm9mZWltY0VadXdVUm90ZWFsM0tLSWZUb2FrZTlVRTVNQ0ppbXFLZDd1aHF4KzVBUXdCYlFoajdGQmdSb0lKZW01UVlFalZ3RDdoS0F2UXM3d2VPRUd0ZzFrZ0ZNZ1BhV05BOGthdHgyU0lwUjNsNkFVOGxGQnlDWmNPU1JxZ3pOK1lPSHFVQmR5eGdzOEgzS0FBa0M2cFl3VHFYVkJNbDNBSFh4b2dEUVFDS0Z3N1VkL01vQTlDeDBacTlLb2hqU0RwRE1vckJqTE0xVUFBYTRrUTVvNm9iSWtCeTVxYlQ3Y0lNQ1R5RFJCaGRXSXAyMlFPTHJYZ2dhZGgrS2cwRm5Ja0JoOEZRSitaeUJzZGtHK1V1Q0tubVMyNkROQmUwUitYYUVCaXBJNmtLREZqQnFhY1ByS29ITGZMY1g0UUY2L0syb29GQU5DR0FKMDl6cWdpNE9YT3hIZmhTQUc2VFhqVFRkVUgrSFJ3MkxvTUdvRFVUOEdRQm9MRUJqWHcxUWFIRG1zekh0VkFmbURiRGZSQUl1SUxtRFNtcURTU0FaTFNXUVlYV3VXRWhtZndTQXRKSUFKRmE4SUF4THpMU0FJcFRaQVM3T1N4R3ZUaVVCSUpZMHE1aHg3MUF0c0NKR2cyNTNWR01TekE3VjVFSU5CTWRlcHI4RUdCdW5JRXRJQVpBZFhxNWZTSXFnRlJjelRvS251Z3hKazIxWjNhRDBRWnpMQ0trYmxrQ2s2UlB5eDdGRU9LSFEzYisyaWlnNEllTmlRL3VRQVh3QUM1YVJ1cU5sVndBSDhVQ202NEFrZUk1MWhBWG5sbjY5MUFvcEJEYXY0UDBWR0prU0hHaitLRGJ3SzFHL1FvQTVjVmo4emVWRUIvNHJnVTQzNVFFdVFHTldKUDJLQUMxdHpqSWZUb3FNNUkwSU1jSURITmFOT3lnVnc1RGdCNGJnS2hRV2RnUzB0MTRWRy9pM3U0S0FYQWdFaHdBUHphdHFpRzRhQTBuaEZBRnc4VUxIYnVnREFPQWNYbktpSVZ5U1JRRXNaazhlU0FSdFVPWDdvck5JZVJzaUJKMWxtMW9vRnlBY0ZxTzRub3JBdFhraDBRTGlBd2NEYUVDRWlDd2FpQkhZT0pmMktDUmVYa2lmRjFvVHV1N21qbjdrRWJtb2VIT2lER21qMVpRYzVnVXltaW9sY0R4eDhWUnozR3JTL3ZWSFBkY0pCb0tPaUkzM09DOEFWWlZITGZRaWRoN0ZVYzE5MHR0VklJc2MzaXF0UndXWEFibHlxT3F5NEV1enlvUjAyM05KcFJSWFRaZjdleFJYVFpmRDhRb1IwVzNDbmtvTDIzaHhxUVZGWDlPOE96NktDd3VBa09ZZ0lLaTd0Vm0zUWg4M1k3bW00UVd0dkowK1U5RkZoN1M0OHNmd1ZwRDIzTTRwdkg0cVpGUVJXYmhSUWg4Mkx1L0ZQZWhGTXJmR3ZocWdFTzJMN0lRd0l1SWJhbjNxY3hEWk9XYldQTkJueXBHNWFIblFxMVJ5SElQUmtHRjRZUkJiWVEzM0lSVE4yK2JFN2NuM29NYmlDWW5wNElNYnFRekFFQ0QyQ0FPR1lGalFnVmhDTnZwdG9aYnpRaG5iSUN1aFFqWmt3ekJvSUZGSURrTGhVaDlOWWxDR2UyU1o2OVZDTTRxQTFEQ0VBMzJ1NVljL0JVRjZQYVcyanpVR2NuZ25WQ01TQXhla3YwcWhBZGdEaTIxdXgrOVVqTTBoejVKU0M0bHh5VEZWQ01UUWdGM253OGtJQmFwSkdwUGJSVWpBZzVQYitid0xoQ0RreGVyVnBEZmFvQm1RSU1FUzlDcVF4dkFFaGdEVGRsQU1pU2FqVXQwOEZTRG1MV2YrSTdvUXd2RWo1bWhvVVdCbmJvQ3hrOHVpUnN4cFV5MzRLa1kzZ2sxQkZXZ3lnWTNENWhicUtId29vUWNnNThrV0Z5dG5YWExxaVFjcldkMkVzU1dRZ0EyM00rOEZDQ0xuRTJrQnRkMEFvUXdrUmE0anlWSXh1WUYzSU1FN3VvTmtKZTJha0RoVVlnQVVhZEQ1aFNrWjdSYWJkYXhvNnBBTndhSGNib1EyVnRzeTdValQ4VkZqWlduc1EvdEtKQzVUMGNBMXIzbFVqWjJBc0hCUHZRZ1puVVFaSlkrRVZRRWVwYkwydTVnMWNCUURJRVltMDFCWXREeXFSc3dkQzVwN1ZVSXh2dEJOckJ5STgraW9OMThBaWorOVFoY3dhdkViY2hDRmUwdXpIUUg0S2tFWFB1SEpaMEJCSmFPaFB3VUlMdzVsdG9qeFJZUjdTUkQ2WTkyVlF6aHkvQkZ1cWhBQkFERmlIcFNCOTZwQmNRY2QyYWpLQlhjVUljMUhUVlVna2dSQkR3RG95RUM2NzVYQjZqUVIwUWEwL0tTQVRCMDhxb1E3aDVNajJvb3NJRGF4TzRENitleXFSczNKWit0S0pBcElsaXhNeWVteW9CSllmeEhVY2FvUXd1bVFSUmdnVUVnVE5hZFpRaGlhdlI1VUlSeGFhOHNBL2RXa1kzQWhuSXhpcUVLYm5aZ1FYa2dmYWdEdk5zQTFDVUFYR0lmaWhVUU1tK1lUSHpTaEFMR1dKZXJLa0M2OFd1UzhTZ21TRDgweUphQWhFM3JjUTRFalJVaE1uT3JBeFZBdVlFVUFyc2dpYncxSGJUbXNPaEV5UUduMktxUk80Z2FPemJPaEVpWCthUStua2hFTHJ3QzVnbG05eW9oZGRvQ1J6cXFJbTRUMVJFTDdnSEwxb2c1YnlKNnkzaXRFY3B1Z3pLcUl2OEFNK3IxYmxCNTl1bWoxVlIxV1I0MVVWMVdYTUE3cURvdHUxQnBKVVYwV2tSTk5kMEhWYWZ4NVVWVUVrQjRmeVVGN2JwQTMyZUVWY0Z6V0RwUmxCYTB5S0hidW9LaGhJMUtBdTdpaDJRVnRMU0lmWDJLQ29aalU2RUlHQnBNYUhaQTl2eXM1cVhsUlRod3hZUkxCQTRJSkVpM1VQdHNnTTJ6VVZQUkE3aWpEcnhvcEFRZE9JQktnSUJFR2hOSzZLMFl5MFRvVlZHcm1mOEFKKzN6VUJGMUNYSXVMcWhnWEpZTVJUU0RSUUFCZ3dEdTg2ZVNvTE14cnp2c2dZQ2VqK2FnVXdYSjBZbWs4cWdBQ0E0Sk1HZHArS0Jzc1NOSDh0MUlHeUxRSDYwU0RDaG94cDAwRElDVG93TVQ4RkFBS3pxOFJYb2cwUVJxZFBZSU1BRDh3Y1pQQkc5VUIyTFBzRHVnTEdMcUhVSU1HQStVUnVLYm9GL016aDNoOTkwQnRCNVk5aW1SaUFXQi9objdFQUphbElmcU4yUUVrRWdnaUgxUUFtVFVrVWQrM0ZVQm5RVlBRZDBBMUJKRGswOW1RR2RpVFNmZWdBQklvMTNzK253UVlPenNhMDEzMFFZT1JjL3pBME9qSUN3Sitad1E3ejhVR0w2Rm9xZ0J1ZCtLRHk1UUFISWhqQWVXMTZxaDV0R3ptQlRzb01Td0Rqa0JBcHUvTVNUREV0cDBLQS9NNWFBSzhlOUFBN3NYSFBVOGJvQ0NkUVNhQTZ4OXFBRUNUL0NZYlJBSEIrVXlZWjllNm8xdnpPRDhzdUJyS0JpNExHWG9HcXlnQmN0TWd0YVhaejJRRWtzQ05OWVFiSnhGQVdZaElNQk5wTGtqWDNvQWFzWlA4UTA4VUJJRHllUUNIaEJ1TVh0TzBvQk4wQWdqeFFGNjdTekZrRzVrUDlyb0FaYmZTTlc1RUlDU0FhMTFoQUFIajVXZU53Mi9SQnR3NC95bTJsQVh1Y0VNQUlQWHlRYXBJWWh4SXFnRjJ4cTJ6cGdZRUV5QklodGxSaGNEVC9qYTlsSUZGdzBBbHpsM2Z1ckJtTVBKcTdJTS9EdnAwTkVBZWgvTnNYMVZHNWJyYjBRRG4rRTE5bVFHNE9RMTJMRk1ERTBBSlBNMTJkUUtYdWgySG1xRkFkaE9Pcjc5MEFJdHJVZGtHQkpGck9keitLbVVyRXZhWERsbklRS1MzekNaRW9BQTVCZWRCc0ZRamlKRmREN2tBTHVHb0hjb0ptNlFBV0d2TElFSmloQUduc1ZSTXVMaUhyVGRFS1NCSGlUc2RIUlVTUTlRUUlBNkloU1c2RGJoQkkzY3p1Z2lTR014TGFLaUYxem1BWTNWRXJqbzVlUm9pWmM5eFoyMGxVYzl4Qk1VNFZ3T2U0MDNWUnpYa1MzY2JvaUx6NXFqZ3RPblJCZXk0a2JFVkdpbzY3TG1qdXNqb3RJTEVEcHNvdUhSYmRYbnlRZE50d2lYR2lpdWl3OU5uMlVGUTNqQlNxdmFRd08yL3ZVRmdRMENuaENDMWhhdEFwVk80L2hseUE5VVF6ajhwYUtPZ3NMbkczdHNvcHcwNmxxNmNLMFBrek5NY3FCaFVsaE5UOEVvZk5pN3ZRY3FCeGRRT3p0S0RCcnF5VFVLaDhtWUNtcnFEQWlTOHZBQ0J5OUFJT3RlNmxDN3N4RlIxNVZvWVhVYnpFQWFvcmJrVERJQUhCTE9BSjlnclE0dUFFdUorYloxQVhCL2lySU5ENW9OakRsbm1hOUVvYVNKY1JYWW9NU0FkQnVnRUF4SnFUK0oxU2pPeEp1TGhvQjRRQVEybEF3UWIvSmN0RWpjVlpBNzBZQUFhcUFQYlZoQlk3aFVaeUhBTHZEdFZBd1l1QTh1NTFoUUZ5RzY4ajdrQUVDSGN2RzBJTWJycDFhUzJ6L2NuSUN3RVVsNkpRcEJjYzBFanFsQmFUQWN3RDdjSlFkZEpHKy91UUNrcytNamZtVW9ZdURWcXYwUUQvSjBMNGlsUE5CaC9raG5sNFRPUUFOQ1B5MFNqZktBMVlEYjhJTS96T3hjQ2o4NklOUU1TSWdQd2xETzdmTE1BNjFRTFYyaTRRNC9CS0RTQXcwM2hLQVhhanpBNDdwUnQ3V1l1WFBIZ2dERUF6aVNmSFJLR2NRMVFXOFVHTXNkejhQTktBeGt0aytoNFNnaCtESHk5VzBRYVpMdHNOOW42b0JOU1dMZ003SU5Sd1QzNUNERUV5Qk5DRDFkS0RqYUgwSURrOGVTVWFRR01Bc1BIb2xHNW9icXY3a0FBSUpFRUhzeVVGZ3pNNVlreEQwU2dBMm5yMTFRRTBCRWRlVW9BTnBiajhvaGtERW5ScDFxRUFpMTI2alp4Q1VBazFjV3RSQm9CSkoxbG5RRElPL2pvZ1VremtLR0NIM3F5b0xnbVhnd2d4M2RwZC93U2dHQ0hhNE1hOFYwUWFvWUVGNTM4MEdGVHJGZFgzU2dPN2hvZVZRWW1wcUJQS2dQVWh4VG9sQ0c3Y0F2US9CQURjNWswTFIwUUtYckFBM1BnVmFNNHFMaHJQdmpzcFJuWUFnSEUxWktqQUJpQVNDN1AxVW9WOFM0RDZlU29CTEZ5Y1FnV0FUUnorWDhGUUxyZ1lJY0IvbXFnbVNERnRBWVFLWnEyM2hzbENFbTQxSGNVVlFEV3JrMUtWVXJpS1VxeVVTeWtoMmJyUFJFSzdTUHcrS0NkMTJvQW9XQ0NkeFo5WkdTWVZDNjRTZTdxb2lkeitDdEVMcmlUQkIzTG9qbnV1RTdFczZvaGZkQkloNVZITVNRL2xzcXk1N3lKMDJUQWcvei9CVWNOaDRRWHROUEpCMDJFd2VuWlFkTmhnUEhmVlFkTnBBUFdxaXIySGJTb2hUS3VpMHNYTkc5aWd1QzdSRlhVRlJjWGQySDhJNVNLdGFXN1NWQmVkTkpvaXFBZzY3T1ZCVEtIWnVhcGdFWFdrUzgxNit3VmlLNUFzOGlmSlJUdkRsMjh3Z2NsZy9MaEJuWWh4TkdGT0I1cUlybHZ3NVVVNzY2R3BwQ0FpNm00Z2JGVUVraWEvQkFUQk5HOW5VREM0RVZKL3doSUNDU1M0Qkd5RERRdTRCbnJ5b0NLbHV4M0d2dlZXaTVjK0tEQ1dKQUhQZEFQbVlzZm1GRENCOG1saFN1K3lBNVczRHNlblpBV2FQNFdrL1lnd2MxWU5CRys2QldNQXQ5amJLZ2h2NGd3RkNXOEZCcXRRY0VWVkJjeTFKRHFETzRKQi81TWxCcXNZUHR6c2d3TmFPd0JDQXVZY1RvREtBR2dkeTd4MlFITXVBZC9sMzdza0dkeVlZaitKL2k3b0M0ZHJZMGNxQWd5UkxNNTlnZ3dMaTRzdzBQeFFIUVBhelNpaFp3WURVa2RreWc2SEVoejRQOTZCVGFDSGZrTkhTU2dKY0NBS2RIWkFkUTVyUUlBenVEU2hMb01aZmlhODhJQ1NXWWFRUitLQU0ybnpYVlFHQ0tWMUUwL0JCbWlvSTI1cTZBQXp3SzhOUHhRWXhXQmQwcUtJR0pMZ2luaWdTTFdNVjZ0dktjNDBrTUxXREdXbWlBaGk1QlltaDBJQ0FBN3dhdElkQXpRUXdtcGFFQXR0YTBqTFdYSHdUSXhGemsxZURPaUFGOURzTzlKUU01REE2KzNLQlhCY2JRRzM3SU5rQ0NSMGZ2eXlRR0NHYWdRS1N3ZHZtMXVIMnF3TG1DekVndUdId1NBNUZ0WHJNVDdCSUFST1FMajdXUWFRWEdzSHNnWWtpR2ZreFJBcEFMeVhhRzZvQzhFZzVUSDJJTUJVblF1NDBRRWlXTXgwUUJqTEFRN2FzZ0RTUzdobTMxUUEzaDNGcjdublpBUVRvOGpYUkFsSEVBbVNkMEJjU05SdE9pQlhCTWwybHVxRFN6ZzhudWlESWR1Zzh0bEFscEEveVFHZy9lZzF6bWRxR2txZ1ZaMzNZb0ZsM2JhV1ZBeStVa1BxK21wUUtiaUp1MW8wbFFMazQxM1FUZGlTK1IyL0ZVSzhUZEFpT3lvVTNFRGlrd2dtU2FhYjBRSmsrc1ZKVmdRelNZVW9XKzZ2Uk1ZRXJqRWxpYXFqbnV1WVZab0lDSWhkY0RyM1Z4Z0pkY3p5eDFDSWhjVzQ0VkhOZGRyb0toVVF1SWVqSWlGOXc2N2xWSExmU1FxT2R5K1hrcU9HeTduV1FxT3EwOWhxc2k5bHpCbkdxRHB0TE4xb29PcTB2clBDaXJlbVNkWisxRlh0dUlEYndvTDIzTy93QVVGeGQ5NmlxQW1SUXNKUVd0dTdjeHBFcUN3TUFFMTBLQ3R0emFuL2cvY29LUWFBa0V5bUZGOFdEeDJWNTBPTGdYYmVnNTFoUlRpNFFLRFVHZVVGRGNkMkVVVEFZT09wbGxBUm9DV2VrN0lIekRaYWE4NklDTHRUcFRpdWlCN1RNZ3Z2djJVQkZETW1vTS9ZcUNRUVB6TnNYWkFjajBpcHBLa0JZVVljOUhRRmpjQjhWQVFXbW02QU94ZlE3MDk2b0lMNnNHWU43MFd0cUN6Tkxpbk82QW1BU0ttc0ZBUVRPTndKWjJRWVhYVVBFY2RrQkpOSmYvQUJCQVJkVG5Xbmlnd0ZkcnZFK0tBbVdtTjZVOEVHbXBvSkc2QmNtSUpETUtoV0JneGY1WjZWZFFaMlpxKzI3SUEvWXdDTzJpQVFaSW02Z2QvRFJBMHMzOEpFRWExUWFYaldqelNxREYySnFXM3AzUUYydUVzL21VQUZ3ZG4vS1lGYTBRWVBwZTRhb3JYb2d6dTVvYlk2SUE1dEpZTytuWGxBMlJZdnREbElDREEvaWp5VUN1UTdBdUFkS2txZ2d0UU5hUHlvTm5RczdhVVpJR3lZQ0lBYmhsSUJrWEpZRWF2VldCWWdFQmlhQ0E2QTZIVTA2ZEVHeWdRQ0drVDdrZ0dRa1UzSjI1bElDRHE4Vy9tMjltUUI2M0EwQkh0Q0JnYm50ZmFCOXFEWkd0V2dKQWx4T2haenI0cGdGeUhxLytJSU5xTGlBeHFlbXFEQUY5Q2RmWjBHL0xPanlOdVVHSm83UitaQUdNT0FZbzZERmhPbThJQ1FNcE10RG9NU0FETzduVWNvRG8waGhFSUFBWVA1dUQ3RkFBSW1uTU9nSkxNV2E3UnpYdWdWL3pFdEFtS3NnSnVERndSSGFFQ0VtaGNrMUlEODZxakVzOXpuYTRpTklVR0pvTFE1R3NJTUlma01idnhRTFVFQUlnZ3NkUnNpczRyVnFzOVFvZ2t0SkxDU2dtYmgzWjNWZ0dSNERsdG0yVmcwWkVFbWp2OEhRSzdIckRqZXFBRXVQbG9XSU1vQVNDWjFxZ1EzUkJ4MytNb0ZKRlM1WWE5VUNrM1B0YTFGUXB1R2djdlRUMmxBaHUvd0FwN2g3VVFUdUkrd2NEUkVUZVR1U0NEMXA1cWdFdERObHA3QlFJYnBJSis1QkkzQU5NcWlWMXp4cTBvSTNYU2RlRlJFbHBFYVA5cUlqZGRKSlBib3FPZTY2UUhmYjRLaUZ4aG43ZkZCSzY1aHA5aUk1YjdoNzRWUnpYM0h1YWhVUm5ieVZSNTl0N056UkkwNmJMeEduVlNEb3R1R3JkMUVkRmwvQ0s2YkxtYlhkVEpGN2I5ZDRQMktSVjdiNVNDOXQ0RDlhN3FSVjdibWY1b09zQkJZWHVKQm80VUZMYjdSRHpza1ZXeTVnMjFQZW1jRVh0dUJFdWQzbFFoaGZRMDl0a2dxTGd3ZGpvKzZoRE84ZzlPcXBEQWwzQWQ2TzZrQnlBaDMybVhRUGJjSGNmbFBzSVFWekJJY2N1WW9nSnV4cFRWSUdCQWwyTFVVaEQ1TThFaHZKUld6cTBuWTZLd0cyOEF2YnRJNVJEL1UxYUQybElyV3NSQkxtcExWWkVobkRTSEFOU2dJdUxnTVEzUlNLd3ZHMU5qTWNKQmhjRHF6eTlFaUdCZC9tbnozVVdCazlCMmI4S3FqUjh4cXgvTFFleklHeUJrU3dFNlIxUVlseVhqZjNJb2x0V2NDVDl5RWJLSEFMa0pCamM1MXRwSVNEQytjWnBCUHM2REc5bk9tNDFrS2tObUhZQ1FJSHRSUWdpNEVTT0k2SU5rQUxtRDl0WDJTRENoZm41UndoR01FeWVBSGhDTkdvSkxGMElQeWdEeEhDRVk2alFVSG5DRUQ1WEFZOEFSeWhHZHEwcFQzb0M0Y0RXbmF2ZElCRU5VQ0RxaEJCRHMwTlJDQ0M4MGZWQ0ZGd2Y4eExRd1NBQW1mbFlHQXFHb055TlQwM1VJQXVkNCtWMmhJakF1TmJuQW43a1ZoYzRseSt1amVhUUVtQkUrSlFiSnREb2tHY094UExkU2d4a0hWNmdCQ01DemxqTWthbEJubGk1YitKQUhja2FWWThvUmhOcmgySWpWdk4wSUphakc0OG9SamNHcEZTeVFDUVhENmh6WDJkQ05sQUJNNzhnS3dIVVNXTSs3b29SdHVCMFFqQzRGbjFNRHpsSUJrQXhkdUlRZ1pTUUFTOEVhT3lFYjZqbUpGRWdHUkl1WU1YMS9GQU0rWDJTRFBvV0lFWTdKQXVUT1N6RVFQdVNCd2JRQnFiWTVRS2IzRkMvdHV5UkdGeGlDSmNxQVpTMGdiYU4zUWJJVURsbVlpbmtrQXpBbXJucUt3a0NtOEc0TlV2TE9yRVlYR2hIQXFFZ1YySDVRK3NkbFJzN0pHclVTREcrWmFScHVvcGNpeGhoV0ZVaGN3U0dwbzBhSUZ5RzdXcy9aRmhjc1dreFVVU0lWNmdURWoyS3BHeWJuY29zVE53QUxVMk82SkNaYXN3SmZRSUZKSmQ0WXdnVTNCM1lsaitiWlVUTjQ3NitOVkFsMXhBcVE4a21WWUozM0VBdEoxTy9aQ0kzWGhwcXpFaFdDWnVFUzVyMVFTSkZyc0hPdnQzVG5SRzYrV2ZwYnVyRVF1dm1uZElJWDNrUnhYN2xSQzY0U1Ryb2lPZSs4U0dmVmxjWUVMNzViaGlxT2E2NE9UcndxaVAxQTlmYnFrVjV3dTFXaDBXWEdObEIwMmw5WlV5TDJIc2c2QmM3Q25LaXVpMjU2Ky95UVhzTlF6Z3lvTFczR3J1OGh0VVZlMjZYSm5RZEZCWVhrVWtpb1FXRnpnT0s2Y0tCM0FZYWlRaXEyMzFhU0Q3a2lyVzN2cjgya0tDb05OQ0RSUU1DVHBUUVFDZ3BsTVFCTGU5UVBrWUwxWnVWVU01NjZHRkNqTzdpbktLSXVNQjIyWlVPQzFRd29GQlJ4MGM2b01ianlXWVI1cEF3TXZNbVZCc3RUdDE0UVBrQng1ZFVCQlk4RW4yNklHeU13MVBNN0lEbEUxRVBLQm9QSm9VQUFNZndzMUQ1SUdtMmhqV0VBQkxpR0FNSUd5ckRFRG5WU0RGbWNTYUJBYU1JSERJTS9MT3c2KzlGWnY0ZEgyU2pWdUxpSG1mZ2xHY0IzY1FTd1BjKzlVTTRkaEVPNTJDaXN4SUVrYW9CcGN3b3hBVlJ0S0VEUWRlaURFa0VnWFN6c2U2QTUxQU1jZUtRRUVrQnJwYmlpS1VHSWFEWGtvaGpjWkRzMHVneElGczFxZ1ozSkRIdklSUXUwSWpRbHBDSU9RWTg2ZkZSUy9MRDZ1NnFHTE14SUQ2OVVBY01KWWFGQm5BNWlFR3l4MklQNXFvQTRCTTBKblpCZ2JkYmdXZkkwOXFvR2UwQWFBYWo0cUtEZ1VrRWd2M1ZHY0Nza2wvR2lJeldrQjlOZHVpVUFGNEpxR2VKWkFjclkyZXJOS0RYRUFjR0FQdVFMaytqeTJxREVrc1l0R3AxOW5RYk5nNUxBRmdQaHFneE56U1hMVjIrNUZhUkpPVGtEYnRDSUZ4bHRScjNRWUQvQUJHbnQ1b0dZUS9ZYUJSU3RSdEQ1YUtnWEFEZ0dvMFJCY1hNNTVrVDBVRzlpRFJLQStySVZ1QWU1cWdCWm5ZZk5xSW9VUmhBY2wzcktET0JxWU5hSUE0SU9xb1hLNHNLeExPL2drREJpSEJpam9GSkV2QUJGZVVDdmJUUVJYMjNRQTNuYkdRMnRLcEFDWkxuaGg1SUZ5WUVpMmp0UGlnQUphSEhYcG9nVncrcGQzT3lCY3RYRnBxT1NyQnJpUXhxYU9VQ1B0OHVxb25reEFGUlRYaEFNaVlxMVRzaFFkbUR0eCtLSUUwZ2tNQWdtYm1ocGFuQVJTRWg5ekxvRXl0TkNYSmRCSTNGb2lWUk0zNmduVS9ja1JFa2loZDZLaERlTis2UVJKYUlHd1ZSQzY2U01wMlFRSkZYSExLaVJKQlluMkNJNTc3bmRxMEtEbnZ1TWpmZFZFTHJ0M080Q281N3l3YUdkTUNPZXJuZFVlZGJmcERhS282UVcrS2l1bXk2ayt3VXlyb3N1Z0FhS0lzTHFEeVFkRnQza2l1aTI0MDAxVUY3Ym45dmVvS2kvdVVWWVhtTjlIaFFYRi9uK0tpcVczT3dCWVJEYUlpZ0pxTzN3Q1ZWTGJpR085Um9FeUtXK3BUbWg2N0tLcm5FMFFQYmNkejdlS2dwYmVYWWpycktCOGpCbG05dFZLR0JFUzU0VnFRenhzODdJTUxqQWN0VGFpQnhjZXAzRzBxS2JJbG1MdjdRclFSZThRSGtlS2dZRU1TSHRhZzJLQXVYQUZESSs1QStXbTBGUUVYbDRNZnhlQ0E1RUF3UWFsdmdnTnBvQTl0WjBRRVhFZnhPZWRVQk44dmk1R2hxZzJSdDhZYm1WUVJYWXVYZWEwVW9ZRWwyREFCdGtHeWJ0UTcrd1FZRWdraVFUSVFISmhNYXVnTnBCMzdzYXFBNUNSNGtSN1VSUmMxY0Z6SEtBT3dpU0lBcDJsQmlYZGl4TzJyb0RxR1p6MG9sQUpkNWQrTmtwUkJsN3BhUVNsR0pZa20xM0VuNFVTZ2s3bjdJcTVaS0JsSWhpWCs1Q2pBSWZSMlNnRmhxWllNRmFvQmlYRW00eWFRbFF3dURPS2VYZFJXSmJiTFFkVlJnZHRhSDNsa0JkOGdJTFVLZ1dqMFBFRHhaV28xV0FjdHI0UWlzekJ5UG1ZVDdPbFJpWEw2TithaURHSzZiNzZKUVhPaHJweS9WRlo1Z3ZFQUlBWkVOME9nSGRFWXdiYVRBQVFHT3BHaWxWbkRCaS9UN2tRQ1JNenE5YUpSaVNIT3I2ZkdxVUF0VXR3WGJvclFTK2trR2FhOGxTak96REVqYmZ4U2pGKys5SCsxS0FDVHIyYmZkS0NTV3FIQTEreEtNWEpabmZWMG9HVlM0Y0g4VVFwT2pHUHQ0Vkd5YVdaaEhSQWNpOGtQN1VVVW9OYXZwQ3FNYmlIWVNmZ2cwV3V3WXNLSlFOUHpaZTFPNlVMa0RvMHd4WlViTXV4RUNIMWhRWWtzSmQ5VUM1TkFaMmxqNG9vWlhQMTBLSVUzbVppcjhEWlVLYndLdjRtRUdKZUFRQWE5MEFOd3RrelBVeWdVM0VNd2MwU2hNN2dhU2R1cW9CdUpJMjFNaFFKY1pwOENxZ1NIbGhvTk5VQ3V6R216c0dTa0tiNS81eUtRM2tQdEpMb0VKSjFxZ1EzR04vTlVUTi96QVVRU041WXM3MUtvbWJ4cVhlbmRFcWQxenpvSzhJSW02bXBHcXFJRzRzUzVCbm9xSlhYbWRqdkNHY28zWE81MENJaGRmdUtLam51dloyTTBWRVRkcThvaUY5MVpvZzU3N21Id1ZWelpsMVVjTnQxUGVxam9zdUxCNFVGN0xtZzkwVjAyMzkxRmRGdDlDN2NxUkY3Ym1adkZCVzIvUUlyb3N2MU1kMU00RnhjMVRHZzFVRlJjeFB2UlZCZHMxWjdJTDIzdVBlOExJcUx0ak9wZjNvS2k0R2xSdUhSVGczTnZ1RkZVRjVZYWNPa0ZCYzFTZXFDZ3ZlamthKzlBNHZwM2I3RkF3dklveEd5UU9Mb0xEN1VEZ3hvOVN5aVFSZGtONWYyZEFYSkJxUi9DVlF6L0t3SFVjS0tZWGlLRHA3a0J5Ymx3WVFOazlEd1NnSXVjM0IzRjN0c2dNRG9LRFpBenpSMzJVQmR4VjliWFFFWENTWmVUdFJBUmZXZys1QVhBQjVZUjhhb0d0dU5ScWFiZFhSUkZ4cS9HNkFndTNpQ0VHQmFXTGJEMkNJT1Z0WHFZWkJvSk8zbWd3SUlZTkhLQXM1SWQvYmhBWGNtaDJDa1ZnOXN0eWV5SU84VFEzSXBRZmxOejFkMis5V0laMkFCcnVTcEZadzRKMGNNa0FCQTRBYUoxN0lHY0F1YXZDQUFqemVqSDRJRGtKWXVBSFo1OTZET0pKWXRKUWI1UTRkbjM1UVlFVmd5d0tnMEVFL3dBT3JWVlJpQzVnRUFmbEZVVXdiam5yUlFMcUM3QVZKOFZRWG5XS2pmelVHeDI3aXFBQnhXMlpvcU03blkwT2lCWERFTzFLbmRFTUxnenU3T1QzbElyTU1lZmVVQU53dEprbHFwRUdIcUc4VDdrVXJ1eGR1QVlSQmNhUzFCOEVBeU5kTlFka2d3TXphemx3TmVxUldmV2pWT3pCa0FGMFl0M1pFQUUzTngycUtxakFNMHZvVzJIUkFTQlhZeDJSUWNGaS9JTzRSQUJBTVB1MUVDNUZ6ZFY5TlBqb2dMazFZWEZuOXlBRXVKcnBzNkFaQjNmVFl2Q0JjZ05Ob0hDRFpYQm9lYWZnZ0dRQUlPakJBajJtR1pqdnZvcURrYUFNYWxTREVsNW5ZS2hDZWRLOEhsQUNSRVFVQ205K2p2SEhWQXVRTGhtQ0JYTk5RWktBVm9STlVSaVJBTE1OQ2dVM05yVVNQd1FoRGVKQkRhVENSU1hYdVNKY0t3SWJoOHhpTkVDbStSOHpjSUptOGlrQTEvRkJJM0VocXVxRXljZ1BvVVJNM0FTT2pjcWlkMTNMa29pUnVEdFRqelZFVGVld1FSTnoxOFJ5cWlSdmg5Qm9FRVRlckJ6MzNseTMySmdRdU83Y3FvbGZjUjk2RG12dWFXVndybXV1QkpvcWhNa1N2TXR2YjRLanBzdW9QRlFkQXVjTnFsRjdiMmlqS0s2YmIrL1JSVjdiMzZpcWlMVzNNMHBSWVhlM0tLdGJmUWJLQzF2cUQ3Vys5QllYQ0pwK1lLS29McWNHUXlVVnR2cHlKK0tDNHVkZ2VxelZVRjdrelQ4VURpNTNjTlBpZ3BsTCtXNlZUajFIUHRSUVA5UVBhL1lHc29IRjhoeTducjVvS0crQXo4dEtBNWtOVW5iMkNDZ3VucHlvSHlvTnBVb0l1MGgrTnVWYVF6dkZPcURXeDkzeFJEWkY5aXpzb3RFWHMxUGRQUlVFWE9Ia1RRNnFVSEtBWEJHOUZhRGtMV2VZOCtFb2NYQjkzTlcxQ2xHZWdkK2ZmQ0JzeUJQbitDRFpWZ2dvTWJnOW9pR2hBMmJzTW5OUTZneExnNURIWHNsRE8ycysycVZSRE1kQ2FzbEFjU3gwRWF5bFE0dUQxQm1UMVNxRjF4RTdPd05VUXprUzNzVXFnNEhRQ0xod2xRMlEzYzZIcjBSUWZhZndTb0k0b041N0pWQVhXZ0V3d3F5cUREa3dXcnA1OUZLckMwNUVnNytLVkdiRUFWSGlsR2tmTXhKYjViZGU2S3ppMTMxMUVWVG5CZVhjQVVCUEhWQmlhZ0ZydUNnQmRnSGNtbnhTb010QjRhaVZSZDlTZ3prMUlIZDBDZ212RGpTT1VRU1NTOVdFalVKUmdmZUtsRkJta3M5VXFNWWw2VUZFcWk4VVl0ck05RUFpQnRMTWxRZG5Qd1NnRWlndVl2UjM5bVNqRWlCRFVLVlFCaUNlVzlpbFJuQkRDWHF5VUFrLzRYNFBYZEtEbE14dTFKU3FEbDMwRkQxU2daeUhkQUhET1RSeS9LVkFKSHlpSWlVcWdDS05YUktqT1RiU3UrcVZRTjdDMFAzZlJFRElYRnc1YWlLR1k2TXFnRjNHMXVoMTJRQnp1eno4S0ZBRGNLQWRpRmFCa0cwblhSS0JkZG83VWJWU2dDNWdCTDdKUXVSRW5TczdwUXQxSmx0RDlxdU1qTzBtSTlwVUtYZ2dkVmFrYkt1KzZWWVRLbXdlcFVvVStwclI2RUtpWkx5STRKUUtibUJQRVA1cTBJYjJGVHc2VVROd0pNajdpZ21iM0xBUE92a3FGdUprdWxDWFhnTXc3SWhEZkkvRHlRU043Wkh3S29qZGV3YXJiS29sZDZnMyt4Qk0zUnY1b0kzWE00QmQ1Q3RSem03bzZ0RWpmSTAyUVJ1dmQyMTFSRUxyaFFGdG00Vm9oZGQzVlZ6MzNEZnNsUkM2NEI1blpXb2xuejdPZzg0RUtvdlplSVNLNmJUVHlXUmUyNEVRYW9xMXR3ZmRRWHR2Y3hwQ1JWN2I5NE9xZ3VMcTBQS0lzTG5JVVZTMi9rTnVndUx4QkJISTBVZ3NMb28vVW9LQzZoWjlsRlV0dm94ZGdnc0x4RXp0WFJSVkFkak9oMFFVRjdORWJCQlFId0NnTHlHcjdlOUZVRndBMjFJNFFPTGdEejhLb0tmVW9RSE9wQ2tEQTAzWmtEZ2dpWVFFWEE4Ykhva0Q1TlV1OUFkMUJRWGJsem95Z3d1Z1Zlam1vVkRPd2tsZ0tvQzRNMElxK2lJTGg1OE4wV3R3UzVad2d6d0JRR1NVREV2VXhzZk5BNHZvQVdod0ZGRVhGcXRvOWFLb3p2ZDQ5VVVSY0RMdHh1aU1HY01YYlFjSUdlNW8xM1VVUVRWaTdSN1FneHVGQnJvZmZDUWFDSzVjZVNJUE1BN09pbWR5Wm5WdFlVQWZVQlZCZGpPc3ZxRkZGeFg4enh2RW9ObHFXR3o2ZVNBdUoyS0JYSHpHbTU2OVZRUTRZTzVJamhBWEVmTTBuVlFaM2NDNE03MVZERW1RNDZlYWdXS3RGU1hWQkJwTTA4RkJwb1M3N29OSll2MEpMSUJPVE83YUtnOFNOajVLRGFTV2doL2VnR1JhQysra0RkVkJkMkl1SUdpaWpsTzdlS0FHV1l1QU9FQWc2aUJMYm9Oa0tndUliU1VBZDdpZHVYUUhLMEJtWWVYZEFvdTNHL2k2RFoxZmFRMnFxTmJkUnFDUVRVcGxSRndMYjhlMnFnUVh0clRXT2lzUmkwQUdwbmZaRmJJUzlOVWdBSXVCYUpuV1U1Z0FhanJIZ2tBZTZyeExOOTZvQklnUmFaZDBRTXBJMkZXUU1idFBCbEZJN1Y2QW1lNnFGSkJhcGI0ZEVBSkR5SE50RUdjbGhUY0JBamhvWnp0N0JBUWU0aVVLV0FRUEdLNklnRWd3dzZmZENBRWgrdTNqNW9zQndBUkkyMFFJYnBjM1RvZEVDbTRFRXM0M29rQzVCMjNvVlFsMTRkaVdxZ0J1RElJbS9hTjlhOUZZRkpCY21XM1FJOUQ0a2xFS2J3SkpaMGhVemVDM05GWUltN1hmVHA0SWladUlHNUtvbmRkTEFzWUpSVTdpNEwrM2lpSlhYQVFJTlJ2c3FpSnYwUGJaSUkzWGlwTGJCVVNOd0w3SUlHNGdFUDNWNTBTdUxjc2lvWFhiOUZSejNYQjJIc0VSRzY0TldsVlJ6M1hVWXp1cmhFY2tIbTIzazYwV21WN2JpV2U3UlJWN2J6dlJJcm90OVE3dHVwQjBXM25lQW9LMjNrYW9MMitvWW10Q0tLUnBhMzFEWExTZ1VGaGZ1VVJjWGRTVkZVelAzb0syK29RV2VLQkJZZW9abnVGQlVYblV4b2dvTHp2RXNvdFZGeGlTNXFVRkI2aElJQm5SOWV5a1UzMURMRnl6d2lLNTNkWmtvcW4xQ2FIaFNCODZkVURDN0lzOEVJR3pKaXZhUE5GcGhlWGNrU2Zkd2dlMzFDN2d4U050RkJRZXBjN2t1S01VREM0NG1XSVFFM2tobitLQnhkY0IrWnBVQitvYUFqbUhTQmhjTlRPb1FISzV2ekE3Z29Rd0lJbGgyM1NrTTlXdXFkTjBCK1orRUF5Y055elFnd3ZMVERpWjBRSEl2VjBCenVabmJvZ1AxS3RBUUhNdCtZRjZuUkEyWkFreUpNSUFMbWRvWnlnWTNOQUpmUW9NTGk1dWNjb01DMUNIMUh4UUVYRnFscExrb0NMak5yOVI3MEJ5dUx0Qk5TRkZESzRPNWNING9ObGNBekRWMFFSZmN3RHpzaXRrNW1LUDBRTmxERXRGVkFNaUpMa25UUlZDNWtFQnRlTkVnYk9URWFrd2tVQVdNRm5EeDdrQnlySWZhSTJVZ3oxa0YzNnFnNUU5RkJzbmVRVzhmQkF1UkxFMU5GUmpjejEzTktJTmxyVnZnZ0l2Skw4VlNBQzgxSGM2Y3BBYzdnV2htaElGRjJMa0NUcWlCbVhZNjZNUFB4VmdJdnVJcVFkV0hYcXBCaGRjd1p3SGRpZ0RtSkk0WjlGUm5JaklPS09nMlJxSm1HWlJReUpkcERDUGdxaGN5U1NhVkgzSU5uY0hMa1BOSDdJQm1SSnZIS0tHUmR6RHM2SVhNdzRnMURhYUlNTDdnSUxnR2pJQTl6QnpXb0xlYURBbG0ycXlEWkVqYWRQd1FBbHhXa002RGZVZ1lsMEM1bDVJY0NSQ0JjMlo3aHVnWE80dklEMThFQU41ZzVid2tDNUVQS0JEZVphSE9vVkNpODF5alJreUUrcGNTUzhHaFFUTnpsZ1hkVUEzazFKYm5WQXBKSDhURFpLaEQ2ak52cTI2UXFaOVM1ZzViWm1kV0JUZmNBUGJ3UVRQcWVmbWlKbjFDSnkzVmdtYjdtbTd2UkJNK29YSTl5RlNONTBMYmxWRTdyejAzKzlCRzcxYnZhaXNFcnJ5NGt4cWdsZGZxTklRUnV2OFZVUnU5UWpXRVZFMzNLb2hkZlYwRWJyelI0VlJ6M1huZnlWRUxyeVhEOUZSSEl2OGRVUjU5dHkxbEY3YnQ2N0tLdmJmMjRVRnJiajFSVjdiK1doUWRGdC9sb3BCYTIvWXUraWtWYTI2amQwRnJiNTM0VVZZWHlCWFdxUVdGKzVmaFFWeWh3UU9VRkxiNHIzMFFVdHZZekZPaUN0dDUzRFBCVUZoNmxKMGRsSUhGdzFadFVXcUFrU0tJR0YraDluUlZjd2RaMGRRT0w2c2VVRDVVbnVnZTMxSmNsZ3BCUUU4ZTVRTUxnWEdvMFZCZm8yb1JUWkZvOXZGQTR2SjFhVklHejUzWThvQ0x5dzIzUU83aVoyWkFSY1RVaHpIZElEazhhYmFKQTR1WTlWQVRlUThNQnNpbUYrTENVUWNycWpYeVFISUdvZjRJTUxnSGR5ZnRRTVFETUI0ZEJnSGN2SGdnMmcwWmh1Z2FYaDZxS1hMU3JDYUVxb0pJbzRab2J6UUZ6UUVHN2RBSGQvbHJ0N2JJTmxxMnJvSHpjUDNxb3JabVJvQlRoVUZ5NG5xaU5NSHgwS0FpOTRBZ2VTZzJSZG5lWE5mYlJWUU54MUlhcUlPV25pTlVBRzdEaEtHRjAwb2FxS0J1cnJ1T2lxTVNXZ0NQWUlDKzRvWFFLNUcyNVFGNkZqQjFRWi95aUFVQUJ1dEh4SHZRRis1TkFVVURleEZOMjZvZzVORGRrVUNURE9RL3NVUU0zSmx5UEpGRElqZmZyNElnT1dZMENEWkdEUWlIcWdEblFRMm5rZ3preVBmQ0FPV2FTVDJRRXc1Y3NkbEFIRHc0NHB3cUJVTUlmN0daQWZ5dVcycDFSUXlPek5RSWdaVmo3WlFESmdDM1JwUUEzbU5XOXFLS1hJbG5BWXZKbFZBTjBjYXdnUTNSOHhmcXFBYnJuQkZQWjBnVjJJYW1yb0ZON3UxTjBBenJ1ZFRyN2tDWlZqc0tJRnlOUnV3UFZVSTVsdmxxN29nRzdsNlFLb1VtY2MxbElGdXZBR2dHenBBaHVNc2ZGVUlib0FwV2lCTHJtRVIwNFFTdXYwVlFtVGpjSUptK3BCZEVwRGZOZWdRU3V2QWVxb2xkY1gyNStDQ1YxNm9uZGN4RG1VRWlleUNOMTh3YTdLd1J1disxQkkzTTUwMlZSRzY4cEVjOTE3bDFvUXZ2OGxSRzY2citLSWpkY3lDT1UxbFZIQ0M5REt0VlVYdFhkRWRGdC80S0t2YmUvWlFWdHUxQjdJTDIzd2ZNS0t0YmRNSUwyMzdkbGtXRjZpcVczS2l3dkxnOHFLdUx4dXlncGJlNDhLSUtaQ0FUWFJBOXQ5UEJCVVhtSkVRU29LaSthbDJoQlFYbmJ6VUZjeDMyUlRDNllyVW9IeUw4VVowRGkrc3RPek1vcDhnOHhvdzJvZ1llcE5XZWpoRVVGek04ajRxS2Y2bXJraHFwQS8xQlV3YUJBUmRHb05JUU5sVjlhTkZORW9Ma2F5QktLWVhYVXFEVkF4OVFCdUtieXBBYzMxTDdqWkE0djFwMVFObnQxYWlBNXZVTzN2UUVYQXc0ZlVIMkNBNXhYdU5GQTJZRllCcG9nSXZvZFVCellFN1VsMEJGN2dFZU5hb0d5M1BmOEZGYk55ZGtRUjZna3g0aFVBbHBNK2RFQnlEd0VCQkZYYnNvTURrNG5lWTltVkdlMEVPV2ZkQm5EU1lLQW5zNEtnTTBvU2FlOUJuTHM1MUNvd094NElVR2ZUVFJBQVMwbm5zcUdjN3ZxZTZpZzVhb0xPZ09SazAyQmhFREtQdEgycWpaSFFucHFvTTh0bDJIaXlBRnlLMXE2bzJScFJ5OVpHaUF2TXpJVUdMeTBvb09DZHk2SXhMN2RFQXJRZ0RhcW9KTm9jOHpDZ0JJbGoyWjBvMlFxOFZsVld5RnNtQzZpQmJjSW9IMFRJR1pyNEtqSDFHTW1xZ1VYVmtIOEt4dXFwVGVIZ2pseWlOazNWM2RBTTdtdTl6VjNRS2J5Q0piZzY4b0JucTRBMzhsUURkekFRREtocEVxQmNoR1dncUZRbjFEVXhMVDVJQmRjQnF3NHAwUUxrWVlkUnhvcUE5eGwyNFU1QXB1WWttYXkreXFVdVpyUjZiUnlnWDZuZHlnWDZqTzZCRGNha29FeTJMa1ZWQ1pQd3pPTkVDRytoMW9nUzY2NGlyS29RM2FIczIzWkFoOVNmZVVSTStvVzVWRWplQUt3UHdRVHV2THh1NUxvSkcrdTVWQ0c2WlBtZ21iL05CRzYvYnNORlJHNzFEMm51Z2tiMEVUYzNEaFZFYnJ3L0lWUkc2NTVNa2FxOHdqZjZua21CQzY2SlZSRzY5a2dqZGVxSlpvT0syNUVXRndLaXFXM0ZVV3R1Q2d2YmZ5cEJhMjRhRkJXMjl2Y29xOXQ0KzVCYTI5bWVpa0ZyYnRCM1VWVVhDSmRDcWk2TmtWVzIra3pzb0tpL1NyNmFJS2krbXU2Z2NYTUlMSUtDN3F4MlFVRjd3Q2dvTHdRT04xQlFlb05Jb1NrRGk5d3pPeWdwa0g2L0JGTmJjK3JFbVVEWmtQWGNzZ2Nlb1F6OXdpbkY0TldmbFFQbFNmc0NBaTZyVk9uM0ZBNHZBR2cyNktRUGxWaVlDQnhjRHArS2dPUUhRR1NnTDFZNjFWcW1OL05kMUNpTG9aK3U2QmhkWHlDQTVsaUdxZ1lYOHQwUU5uSXJ3U2lnTGhMMUZTRVEyVHdZMmxBY2hSMk4wRkFSZTdUcTZnT1lvUUowS1FGeVF6UVpxaW1GNzl0VWdHZTFkZFVnSjlSbTJTRFpnenJQVHVrUVJlZGV4OW5SUnlBTDZEcHlvQ2J5Uk5DelFndzlSdWVJcWcyVDZTRFJWQnpJY3VHTWVDaWdMd1hMOXc5RlVINmprc1lDSzJldEVHeTNycCtDSUp2Rlk0VVVCZkFkbnBzcWpaTStyQkJqY1dZbnVvTm1LUVBoeXFvRzlvbzc3K0tJMzFLQUd0YUlvaTQvTkpJT2lnR1dtcG1OVUM1QjRwVXVxQzlwNDNEcUJjNWR3VzNvcU5tZCtFUmpmcU81YlpJb1pjRXZVTWlCbEVrUkwxU0FQSkxoeVdQVkFEY0hreU9GUUxpNWZiUk1EWkFQTkhsMFVEZlE3S0JmcWZORURVS29COVNoZXFLWE1WQjA5NklCdml1dmRBanhOV1k5MVJqY3dFUFNRZ0J1NHJDZ1hObWU1dmlxaFRjOUtlL2hBdjFHaHp5VWdRMzZDdkcvZElGTjJnTDlTNm9YSUFvRU44TlNZNkt3SWJ4cFhoQWg5Ui9scDE4RWlVaHV0MU9xRktiMmwzNVFKZDZsWmtIb2lKM1hoaEx2QVZ4Z1R1OVJ0ZXpvSm00Q1FXVkNaYTcxTElKbTRPN3VReUNkMTRWZ2tiNnp6S0NWMS9iUjNRU3V1cWRkMVJJM0JFVHU5UVRxUm9rRUxyNnRxcWlOMTZvamRjN3owUVJOMi9aVkVicis3cXdSdXZFcEJDNjVVSTQ0VGxSeFczQlVXdElVRmhjR1FPQzNJUVh0dUc2aXEyM2FvTFczRHJ3b0tpN3dSVnJiMUJlMjRSd29xb3ZiM3VpS2krQUhVZ3JiZEZVVlFYczJoU0tvTG04RkJVWHUyNFFWRjFQSUtDZ3UwZWdyMFFPNTdJR0Y3YXVnZTIvZG1yN0ZNaW92Qmd5TmxBK2ZNR2lRT1BVa2lWQTR1NWNVOEVVMlV1Tm9LRk01MUE5dEVVK1JqVTdvR0Y0MExNYUJBMlRhdVJwUkE0dUVCMmFoK3hRTUw1SmVOdkJBd3ZMOERYM3FRTWJoVjVRTUw5YTZwQTJSWlFFWHdLODhvR3lGWHBWQUgxck5TZmJaVmFKdTNKWi9naFRpN1dwVUFGMjRiZVhWZ2JKOWU2Z09iT08reUJzZzVMdngwUlJGekJoQmFXUkF5Z2gyZUoxQ0JoY3pEd2ZSRkUzaG9JZnhJUkdGd2d4eWdPb1lNd1p2dlFESjIwNklHZTA2dDRoUUFrRmhXWlpVRTNhRXhNS0F1MDFJMUtvQXVrUys4b00rcjlkblFZRUFrZzhNNkt3Z0VPVzFSR2R5NExBYzFRWUZuQU1qbEJpZjhyU2JuQVFZa2J0TEhsQmdROEUreFJRZHEzYXlpTTRBYUdhaURQRUIrc29BOEhRQnk0NklCa0dveG9FQnp0ckRTL0xvQWJvRGtCdGtVTWdLTzVVUUhha0hZMFZBeUVtcDBDREc3WXNaUVROMUtuelZCeWxsQU05QWFVTmRGWVVNalN2M0lBN1VMVi9GRUFsenY5bWlBRzdWakdpZ1hMVmhxN1RWVURQVWQrNkJUZWRRUGdrQzVHdFR1VUNtL2xtZ1R1ckFtUUxBblJBcHY4cENvVTN0U2VuM0lGTjhnSUVjMTFiVkVLUzFOV2hBcHVBZVdKMVFJZlVML0FCUkV6Y0tFdG82c0NHNEViOG9KbTlqd2RWUk0zT09xQlRjWjBtT2lCTXgzQ0Nadk1oK2pxd1N1dmw5a3dKbSt1dktRU053STNWNWdodSs4SWxTdXVoaVVFYnZVKzVXSWpkZlh6VmdqZGU3OElKRzUxU3BYWFNpSTNYT2doZGZLc0VpU2EwVlJPNjZ1cUNiL0FESXJoQjVWUlVYY29MVzNVOTZndGJjb3FnTzBxaWd1UkZyYndvcTF0L2lvS2k0SFdsVUZiYjI5ektMVmJiMEZSZDVJTFczdzFWQllYMEhtb3B4Y1BCQlFYUytwUlZMYjVyUlFVRitsU0I3a0ZSZURMMFVENTYrQ0J4Yyt3ZEtLWkg3MERDN1YyWlFQYmZUVlVQbU4vYnNvSEY0ZGhFZFVENTdrY0VLQnhmVjQ0UlRaQ0pvZ1lFVm9hSVV6MGNUeWdZWDlqc29waGVBTnh2OEFpcUNMdzRZMGRBK1lrY1FGSUNMcnFrMTZvR0Y0M0dqSUd5ZXBmL0NvRG13N29HeUI2L2FnT2VzMSsxQXc5UVRxZFFwQnNnekVQcVVEWlBMOU9xQWd3SE5VQUJOU1J5RUJjVFFkS3BWYkpuMWhVb2cwbHdFQUYyd0xtb1FwZ1hyMkpVR3pCblFVZEFUY3phYythRFpGaWZBZmc2QTVNQkFCS0FaYVRSZ2dZWGdnTVliWFpJQm56MEJRRVgwbWFrZkZCaGU0WWdFYklCbUNaTHZRTXlBNWc2c0RvZ1UzTVF4alp2aWdJdmloSENRYkpvQlpBdVpGRHJxWFZHTnpzQ1J5UHhVR3lsdkJCc25janVnMlhMTnNnR1hnS3NnQXVPN2xrS0dUYXdOU0ZTczRocUVxRFpRSjdCRUxrSVBtcUFTNE9qRm8yVUdQcU53RWd4dUxON1NnUTNralk2S2daaDl4b1VDbTVuMktCVGZVdlVDRlFNb0lmZ2xBcHZFa0h3UUtTQjR3Z1hQc1FxQm1UWHAyVUN2K0NxRU53Y3VTNDBRcFRjSk5TVUNtK3JWUkM1YVAwS0JEZlhyS29UTVVKZEJQNmp2elVxaFRkWFZCUEtvMHA0b0VONURaSHVnVTNzSGV1cUNadllUVFVvSm0vd0M1VVNON2paQk0zUHIxS29RMzFjb2xUdXZHL1JCRzcxSG9xaVJ2VmdsZGVCVHNnamtTNkJEY0J5aUkzWE9xSTNYcWlGMTNkVkV5V1FUdXVlaUNOMXhaMFZOOVhWUnhpNS90UkZBVVZVWEtLc0w0UVZGNTBVRlJjL0NCeGNSMFJGYmJxYW9xd3ZLZ3JiZm83cUNvdWtOQ0NndkxUb2lyVzNxQjdiOUVGaGZEYXJLcVczOG9LQzlCUVhTN3FLY1h2WFJCUVh2ckFUbUZNd0pLQ2d2MTNVZ2NYdDk2QnhkRHUycUJoZFZBNHVOT3lCaDZuTktsUU9MK1dtVUQ1cEEyVDBMN3VvcGhlMHYwUU9McTZiblhaQXd2ZUQwWkFYQU1TZ1lGeU9KUW81RUVCeFBpaWlMeURXRURtL1YrRkFmcVE3OUdWQnpxQnJIUlFNTHpEbVhraElObVQycUJ1a0Q1SFF2T3lnT2JmYWdPWnBNMFlvQWIzNkJVUG1MUVM5Qlhvb05rOUQxS0JzeXdrZzZHcURmVTJralIwZ09iM0NXR2lEWjZhTlJBYzMrSUtESDFHcVdtcVFiTHZLUU5rRFh3VWd3SWFaMVpJQWJpSFlxamZVM0xKQ3NibmdkRUd5dEk5d2RCbmtiQnBRSElOQVBRcVFESXQ3Z3JBTW5kbUZEeXlRQTN0UXVkdUVnYkwzdW9CbTdpSzZLd0Erb3hEcEFQcU5EaGpxZ0dmTmRVQXpGQ3hCcFZCdnFFVktCY3lYUFlGQU1qTXZjZ3pqd3BXRUF5SUZZQVpBdWJhejFWZ0dRUHhTQlRlOHdZZDlrZ0J2YWtFNm9Gekk0NFFETHpxcUZOMnBobEFDZVlWUU1nOWVHUW9HOERYelFJZlVvTit5QkRlK3VxQlRjYWFJaFRld0xUdXJBaHYvQkFwdlBkRlR5TTFtSVZRaEkxS0JjaFB6UTlFQ20vU2lDWnZjbXFRSWZVWi9lZ21idXAxVkNHOHM1N29KbTdzRlJNMytLSlVqZnlxSm05NjY2SUozWHowU0NWMSttaXNSSzY1VVROeUlsZGZ5Z2tidWVGUkUzOHBCSTNFbXFvUzY1a0VycmtFYnIxUkc2NTBRanlxT0lYZUswS1czMFV5TFczcGtWRjFGbFZCY1ZSUVh3b3F0dHlDb3U4VkVpZ3VRVUYxUElvVlVYZmVpcTIzK2VwVUZSZTRIS2tGQmZ4S0NndW95TFZMYjlWTXFwYjZtK21xUVVGK3RGQlFYbnBORWdvTDlTem9IeTViWlJUaTVtOFVGQmVmQkE0OVNka0RpODc5MUJRWDhkRUJGdzAyb2xEQzU5ZXlCOGpMUzJpZ0l2WnRocVZRNHZNVmhSVC9VN2JJZ2oxTmFuN1VnY1gxVWdiSTZtbEVVMlo5dDBCRjVuVUdxQnMyRDZsQWNoSW1FRFpRL0tnT1ErS0ZFWEZoUWdxcXdKZnVvRG1mSlVObTNiaFFiT200RDlFREQxRzZoQWM5a0JQcWVTUWJOajNiVklEbUIzMDgwZ0F2ZmJubElHelBRSkFYZ0NkcXFERzRrSFRzckJoZnNleWcyVW1hNmZhZzJmK1VPVWdPVGJ4US9ha0F5dXE4YWhCdnFhbWxkRWhXemJWZ0tRa0JGMEJrQXpxMGI4SU5uTWsvWTZzR054TFNSdWtBemh5VEtRQTNNWTJvNkE1UHFWQXVlclVvT3FzR0Y3YVVnbElCbVF3ZWxkRUFQcURkdEhTQWZVT3pqVkFNL0RRQUlCa2RDeklGRjFOQlYxUnNqcnFvVWh1YXBOdk82cVZzbUJJTmQzUXJHNE1kRkFwOVNPMHFoVGZRNm9GTjVBREVnK0tJVTNCMFV1WW9OS3F3TDlUVklGTjRFVkhYNzBRbWZMY2ZhZ1Uzd1pndlJVTGRjWjVUQVhLSlBjSUZ6QW9YUlNtOW45cW9oVGVKOTZLbWIzUkV6ZnUvQnFxRU4wbC9GQW1iOG9FTit5SWtiMzdLaVo5U0tzZ25kZFhmZFVJYnVTZ21idkxSVkttYjZnSUpYWCtDUkVycjlsUkkzK1NvbWJ0YUlpWnVRU04zRW9KbTlWVWplZ2tiaWZzVlJNM0JCSzY5RVR6bXFvNUFWUlVYSUhGMVBlb0tpOEpCWVhLUU9DaXFXM0lLQzc3bEJZWHFLb0x0WFJGQmR5Z2NYSUsyMzdhcVpWUzIvNzBGUmYrS2dwYmVkL0ZCUVhqd1JhY1hhK2FCeGYwNktLb1BWaXZWSUtXM3hWbEJRWCtYdlNCeGZ2UlFPTHRhSUh5b1FZSlJUZlVQMnBCVDZqdE5WQVJlT1ExVUZCZHpVU2ltRjZJWVhnOXRFRGk1cUhwc29vNWJ0eXFnaTVta3NDZ1lYdzcxVURDOXp1UWdiNmxmSW9HK3B6T2lSUnpjZE5rZ1lYQXRvMGhFTUxpb3JDOTZSelFxb2I2bGFCOUgxVVVjMzZJRG5RL0JBY3cxUTJxQWk4TUhrb0RsdVowUWJJTXo5a0t3TE9INklVY2lSVnJrQkJZTUNHUUhJN3dvdEUzeWVLb0JrWWFkRUJ5SUFNY25nSU5sTFFnd3Z1NENEWm5YeFFiTXVBRDFsQU1ycXZ6Q29PUnA1cUFaTkQxUUY0K0NBWlZEVjJoQnNnWXExQXFCbGNYN1FkMFNoa2RUMVFyWjZka2kxc3RUNG9sYkpRb1pDWWQ2aUZRTXh2MVFBM2huRTZvQjlSb2pwOXFBWnV3OEFRZzMxR01tU2dYTUJ0VHFnUStyV1dDc1J2cWFlU1FLYjJMa0RxaWdmVUViVjZJRnprNjhJaE16d05tUURPdW5SVUxrL2ZSUlN1eE9pcUFieHYzVUM1NmVhcWxOK3RBaUVOMjVIT3FCVGVLYm9wRGV6ejVxb1EzNnBBbVRQUFVvRk4zZm1FRXplREd1cXFGTi9MdFJTQ1J2Zm56VkNHL2xCTTM4cXdJYjlVUk0zdHFxbFROOVVFN3I1clRSTVlFcnI5YUtpZDEvS0NadjdLd1ROMzRvaVp1YlZCTTM3VlZWTTNwQkUzT3FoQ1ZCTTNLb2ticFFTTnlvVEpVY3dMb2huUVZGeWlxQzVCUVhxQ3R0eUNndUJVVlFYTWdvTDBWUVhJS0M5UVVGMnlpUTR1Vm9vTGxLcDdiMkFiVFJCUzIvZndRVUYxTjFCUVhzMnFVVXR2ZG4xVVZRWDh2dUVENW5aRk9MK1hVRGkvelFVRnczNUtCeGZPL0NnY1g3dytxQnhmQUxkUWdZWEU2c2ltRnpJR3pZYmNsQTR2cktCaGZRS0JoZFBXblpBOXQ4UXdHdXpLS2JQZW1wS0lPVG9wc3BkK3lWQnlBRlhaRk5rWk5FcUFMdzBFOU82b2JKaTd6cW9waGUweHdnSnY2OVVRVGZIdlNxYjZnRzhCUUg2aFBYVk9RTjlRYlJ1Z09ZYXZKUURLWExIbDVRRVhqUWs2Ym9nbThoZ0poRkhJUFZ5Z3c5U2plT3FCczRyMFVDNVZNRGNoVUVlcFNTNDBkQWMzbC9idXBRUjZoNFlvQUx5d2IyWktEbWRJU2pabHlhN0lNYnlBUGlnR2NUVTBsQnM2N2psQU02c1FTcU5tWUhMQkFENm1oTG1wUFJCc3oyMENnMlpWQU40RE9aMEhDQVpna3oxbEF1ZVNJT2FLWE45ZXljZ0dhQlI2Z0kzODFRUHFOOFVRQmZGWlJTbS9VU0NnWElRMjZxQWJpZXFsQUpETVM2dEdOd09wNTZLVUtieEZRMnFvR1pPclRLaWxONEtJWDZtanNxcERlQVBnaUVONDA4VlFwdkwxcG9vRnlKMVY1QWh1QmsxMlFBM2dNaUVONW5WQWh2bmRBaHY0VkV6NmpvSm0vdG9nUTNuUlVJYjkwU2tONnRSTTNvSm04Ym9KbTlVVE43OG9FTjNLQ1p1MjhVcUVOeXBFemZ5aXBHNVVUTjZDWkxvaVp1UkU3cjFSSTNjb0ptNzdncUptNVVJL0tnNXdWVVVGeWdaQStVSkZVRjFGQTR1L0ZVVnR1VXpnVkZ5aXFBb0dGeENDZ3ZCVVZRWGNvS0M0YjlsQlFYY3BBNHVvaUhGMzNvSEZ5aXFDK2t1ZDBEaStzdWdvTHFTb0tDOHRWQTR2ZXRVVTR2NTgxQ25GemU5MFU0dSs4SUcrcFJJS0QxS2JDcnBBMllDZ29MMkZVREMrUnJ5cEEyVDBxRURDN2xrVTJYdmhBMmZLQWk2dm1nY1hzL0tpbUY2SU9jbWFJR0Y0cVBCa0REMUJSNlFVaW16VUd6cDVsVkJGd3A0SW92czhJQ0R6NElObHNRZGtEQzR0dXlnMmJieG9pTm5Bbng0UlJ5TlhaNmpsQWN1ZWlEWlJXaUE1dzdnOEZBUmUrcUFaeTJUN2gwQnpuM3lndzlUUjJPM0NBL1VKYlZJalo3bDNvaXNiL0FNQWcyWkZVQnk1WUlGemZVYXpzZzMxSzY4SURuejVvQjlSNGVRZ3h2TzdJRXpWaURtVklyRzQ3c2dHZmlrQXo3dVlWaUJsUi9KUld5WmdHQTBLQVpXaldORlFEY1RxZVFnMmRXN0ZBTTY2YnBBdWV3NkpBdWUvdlFLYjlhd2cyWTNaQWh1SEhLcUZQcUFjZEVnVTM2U1dDUUxuMlFEUGxrS1EzRDdWU2hteWdUUGRWQ205aXpvRnpyNXVnbm1PaDNWQ20vdWdRMytWRUV6ZDd0VlVLYm5jT2hTRzlwUVROL3dCcUlRM29KbThWVkNHL2FFRXllVlFodTVRSWJpaUprb3NJYjlrZ21icHE2b21iMEV5WFpWQ1pBSUptOUVTTjBLaVpQWlVJYm9VRXlYVndFSlJNbHk0N29PY09xSEJLWkRnbmxRVWRBd0tLY0U4b0tBbllxQ2xwS0NnSm1DeUNnSjJLaW5IZ1VEZ25aRlBhVHNncUNkQW9IQk94VUZBU2RFRGduWXFJY0V6QkNvWnpzb3AzdTJQS0NnTjJ4UU9EY05EeWdvRGRzZmdvSEJ1R2poQTR1Tkdvb3BnVFZpZ1p6czZCZ1RFRkZVQnUyZlpBd3V1L3dsQTJSMlFPRGREQThxQmdidGlnWUc0YUU3b0hCdTBIVlFFa3hDS1lFN1ZRRjdwZ29DQ2Vhb0M5MUdLQndiNWEzdWlpOXdxQ2RuUUZ6RUZFRitQSkE3M2FncUt6M2FnOElqRWw1RG5SMVE3M01ZVVVBYjVnOTBRMlYyeDZJclBkc1VRU1N6RVA3ZFVWbnVtSjdvalB4Q0F1ZEIwMlJXYzYybEJuWjZ4eHdnem5RUnFPRVFYTE14UldjN0ZRQjNvNDZiS296bjcwVVgyQjZoUUJ6dCtDcUE1YWlET1JwVkJnYnR1aklBU2EzQXRzVVZudUZBZUVHeXVNQUZ0VUFKdWVpQUUzYkVuUkFIdWNCa0FlN1lvQTkyMXlCWHVZd2lBNUdoOEZSc3Jxc1pVaWtOMTBRZkIxUUNUc1cxcWlGT1QwbEFEbEZVQ3ZjOGdsQUhPZ0tCU2JobzZJVjd0QkhDb0JOMnlCQ2Jub2U2QmNycGcrQ0JDYm5vVlFoTjJvSUtCQ2Jtb1VDdWR2SkVLU2RrQ0c0aUdKN0toQ1RzaUZKT3hSVTN1YWhib2dRbS9ZcW9rU2RwVEFWenNxRUpPeEtJVWs2Q09GQk56c3FwQ1RNRkJNazdGVVRKT2dLcUVKT3FLUWxFSVNaZ29KRW5aVkV5VHNVQ0VuYnVpcGtuWTlWVUlYUUlUd2lFSlBMb0ZubFVmLzJRPT0iPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0icGFyYWxsYXhfaWxsdXN0cmF0aW9uIj4KICAgICAgICA8ZGl2IGlkPSJhdXRoIj48L2Rpdj4KCiAgICAgICAgPGltZyBhbHQ9IjQwNCAmbGRxdW87VGhpcyBpcyBub3QgdGhlIHdlYiBwYWdlIHlvdSBhcmUgbG9va2luZyBmb3ImcmRxdW87IiBjbGFzcz0ianMtcGxheGlmeSIgZGF0YS14cmFuZ2U9IjIwIiBkYXRhLXlyYW5nZT0iMTAiIGhlaWdodD0iMjQ5IiBpZD0icGFyYWxsYXhfZXJyb3JfdGV4dCIgd2lkdGg9IjI3MSIKICAgICAgICBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBUThBQUFENUNBTUFBQUFPVFVDOEFBQUFBM05DU1ZRSUNBamI0VS9nQUFBQkRsQk1WRVgvLy8vTXpNekZ4Y1VBQUFDMnRyYVRrNU1BQUFEVzF0Yk16TXk3dTd1dnI2OW1abVpVVkZST1RrNEFBQURXMXRiTXpNeVptWmxDUWtMVzF0WnJhMnRtWm1iVzF0YkZ4Y1d2cjYrRmhZWGUzdDdXMXRhMnRyYVptWm5lM3Q3VzF0YkZ4Y1dscGFYZTN0NjJ0cmF2cjYvbTV1YmUzdDdNek16RnhjVzd1N3ZtNXViZTN0N016TXp2NysvbTV1YmUzdDdXMXRidjcrL201dWJlM3Q3MzkvZng5UGJ2OHZUdjcrL201dWIvLy8vMzkvZng5UGJ2OHZUdjcrL2o2ZTNpNk96ZjVlalYzK1RVM3VIUjIrREgxTnZHMDluRjBkZTZ5ZEs2eWRHM3hzK3N2Y2VkdEw2UnFMV0VuYTEwbEtWcGlweG1pWnhiZ0pOYWZwUlFkWXhLYzR0Q2E0TTlhb00yWW5zeVlYb3dYWGpGcTBOL0FBQUFXblJTVGxNQUVSRVJJaUlpTXpNek16TXpNek5FUkVSRVZWVlZabVptWm5kM2QzZUlpSWlJbVptWnFxcXFxcXE3dTd2TXpNek0zZDNkN3U3dTd1Ny8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy85SDJCOVZBQUFBQ1hCSVdYTUFBQXNTQUFBTEVnSFMzWDc4QUFBQUhIUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkdhWEpsZDI5eWEzTWdRMU0wQnJMVG9BQUFJQUJKUkVGVWVKenRYWTFqRTdlU1R4NTN2TndYM09HV3V4Y083c2lEZDd4Y29ZUVhycFZDYVFOckIrdzRNU0h4N3Y3Ly84aHA5RGt6R3EyOXRnbTBSUzNZdTVZME16L05qRWJTN0xLMTlkbktZTEFYeTJEdytmajRBc3JPZzZjdnRkYktGdi94OHRtRG5jL05WNi95bUxEdnY2NGd3czdlSWU4b2xQL2JXNkcveHlwamJDVysrcFpEN1docW5XZ2Y5TzVsOEN5MjFoSWtUM3Riem1HQ1E0Y3UrL1BWdXd3aTk5cjlnWTlIdDI3MTZtVG5XUnhJam9VTzk1NzFHOXRCcmgyNk4xOHJsSDFKZ0R1M2J2YnA0OEVoYXB3cFIwQkVQMWlCTDAzKzlPUnJsUkxOeGY4SDVmbXRXemVXNzJIN3dMT2VHWXBtM3crMmUvQ0YyZ2ZON2NmWFNtWFhFeVFEKzdDUFd0NCt3TG9odUE1MDcrQjJMNzVNZDlpcjllTnJ0ZkpVNFB1SFd6M1U4dmFoYjRqVlEyZDkrbkwwcjB0Miswem9vQmRmcTVWdEJvZWwvbDBQdGR3NTFKbllOQUJodi8zajBueng5cm9QWHl1V0J5b3JXbjI3dkZwdUgzVHJBd25PckFMOStQZDkrQ0xkOWVCcjFjTEZzUnozVU11blNlcmdsTW1OQkVXTWNiNWZuaStLOGpXWXl3NGRCdmZSWTVMZkZiUXJWeEoyL2VmbCtNcmMwVFVFSDN1U0hNdFA4dHRvVW94V3ppZFo5TVZOWS9xZmUvQ0ZzTHltNE1NVGpYUjdUUElobGtOVGk5YmNUTUxrRXl2cTV3djdUL0ZkV2dOY1EvQnhPeEx6MmduOEx6L0ozMWFDZlpCQVJpdHVMUGJxVHdzN0ZzS1lhd2crOXRNd1JERjZlSzNvOURTMUVpbzh2dlM2OG1JQmhYMmhtMnZ3cGtrdEVlSGxKL2tkMnBJRzEzUWhFKzNKZjN6VFRlSXdqejE2QlVVcmxyc3FtcjZPSXZ4cGFiVmtvNWhrZi9Iay92MXY3OXkvLzlmdmo1U1NWRWMvN3h6cXV4S1V5L08xY25sS0NMcS9sdzgrdGc4UnowZ0ZucHV3S1pRN1Q0NXlaUUdJN25UMS9BelZEQTM3QkVVcmxtM05sZHFVdnk2dGxydXNwWGNPZndJY2J0NjhZWHE1Y2VQR3pXOStqTXFIcXovcUVHNDcxa0xyN3VYNVdybGt3UlNRWDM2U2YwWWJJamhJRC8vMG85TUlPdWw4MzZIOHU3algvbnl0WEE3b3hHZ3Z2bDk2R0xiRlNBemdZQjM4d3hISEhNcWRNcGtEYWx5MjFmSjhyVngyc2pGUWZTYjVYV2xSKzEwT0I2ek5VSXdXTEtkc01IamFpdVVhZ284OXNrVHc2cjY4MTlySDJoR2l6enZpTUI0S0EvNjhLTjhlcmhZd3ZJYmc0NldneGowbStiRDlqWnd5YkZCSWJEK2dBdnJ3cWtUb0pkSGIzbnl0V200blU0a1RvbDUra2lkYUhZYXhzRUd4alNFUGE1MXZDd04rbTY1MWJNTWVmSzFjOW9saTlBMCs4dG5XZkJTYkg4UnFTZFJIQlFsSmxIZDl3UWVPMWVNS3RNY2svMWpsNWJ2U0tENWdKcUN0YlMza0s1WnJDRDVZVE96S3Q4c1B3d0Z1NmR2Zkx6VWZVRUxXRUY3SUl0NVZQQkl6Mzc3NTlPcnhGT1BnbCtWOUp2bER0QzRKcS9weXpNVDB3MTdLbFo5RnhGTE5hd2crdG5NR2UyM0lTZnZmUDVUWjl0dTBlQzVTZHlRODJINi93L3dhTmdwMzA2U0FSbXg1dFJ5RVlReGUwdnovdHpMYnovZ1N4alM0TDlXVzFoRFhFWHhrKytxcTN5bmxYY3F4L1hoU3htT1A2NkxCOGFGVSt3QVBrdTdQMTRwbEJ3a1RTNTlKZmc4MzlkK2VsSWN4VGpESS96NFJwTnpKdURMQVhVUHc4WURSQmJYdnRTRzNGNlJEckJlbkYyTmVLUGdJVVphRXh3T01tUThUcjJXalVEUHVWTTlKbnF4QmZXZGRlS2lzNkw4SjFWK3lSWkh1eTlkcTVYWWtHdU5GbU9SdlVkN1RtT1k5SFBDRnNRSjdLL0s5dzR3QS9oTHd1RTNzeFAwZkZ3R0RiRDRVK0ZxdDRPQXlyTUhqSkUvSDBvSW00SUg0RHFWckhKWGl1NGFTZmp4bUNFUEorRUxUL0liZzJEckVSaG8ySklMWFFuZ0VEY2tkR29OTXUxcGxQSVJjQ0NFZ080eFZVcWdpOGFVaXhZM0FjVGRLa2Z5OWpzSGxBSlBVZnVSbFBPaElkbkhINjhKVmhzZGQ5SFBjNVVaOGtTQUdNTnNRSHZ0VUZFc2tUZko0SEx5Q0NIamt4dHlKUjR3MXUrcW5wVzN5cDR3dmVoaXdHVHkyR1YrMjcvdXhiejRYMk4ycERJLzRLL1lmWlpxNU84M3Jid2NZOEJFdzVZc0dhaHZDWXplUVJYaWpTWDZRaGRZTC9JY3ZQM1p4ZHhERFdGM0VZemZocThNNkFQTkZJeDR0NnUwcWhlOWZ3N3oySkRuREFWRkpaK2tTSHByYWdGbkFkK0tSYUlXdnZQNkJVbndnRk9HTE1DM3I3UXBsaHcyVC9mSk42bnFRRDVPRUJ3L24xSXV1TVBKQWNLaXMxeENqSk1nMFNaRmllTWpqdEVLaHNicWovZ0xGeElQa3pUd29YZmFTcEZ5RUI1SkQxRHE4NjV3d1JueUY0Q0NodFJFOFVGNTRIR0M4d3pBSWFDVCtjcnJJVHNLZkpmRW85bnFJZnNxQ0Q4U1hLdmF3VXJuTmFaTGdZeXZvaDE0V2o4amtNbmgwOUhvYmo0TDIzb253UmRSV2J3cVB2d2ltVDNZWXdsWlA1emd3VE9IcmowdnBoMHJ5MEY3L2dyQU5jeEhuaXp2NlRlQWg1WnJjeHgzemRVSlhQQmFtUlN0QUZ4NXAwRXNvbzBjQ2d0dksrU0ptdXBINTlpNFRGZ2pUSFlaQmlrMENkMHZFSDFxSXZ6TThGSmx3U2E5M1NXZFpVTFNWeFlrYm1sLzJNNUQ1YWVBQWpidXYxakhmcGpIdmpBWnlXWmcwaEM5ZmNyNVE2ODNnc1UxbGNGZmZrSDZ4dmVpU1hyTEFlYUUxYTlLcCs0YnI1L3Y5bXVkbkQzQnp2U0U4ZHZrWXFPdzBjTUM0RXVrZWFMTE1XTGo2RnBMSVNEeTdpK25wSWw5MGtiRUJQS1RudXRqeHhnQU5vaXJSVGNkenFmS2Z5dHpSMDI4bkR6bWVlRWI2Yzk4NFh6bWthK1BCYzAyeVNYNUwzT3NzNElHeTlrMWtMeCtva0Q1VFRLem9mbUhpQ3htaXdCZkwyMXdiRDVxSjRRby8zcUR6V29IdUhobEpWKzZYOThjR3ZLN1M1SGppQVY4Y1NueHBydG5ycitjT2tyVkVxSGtxRW83WC9aR3lnQWRIVmNrSEtrRmVWRTNINmdtUEE3U3M4YlN6dkhHMjd0NUVQSFpiWlVOditIcnlQM3U0NEFRTUhhcTRuOUlUbzdzSXRGRDN1ekllZXlvNm1xZ3BqeEllYUY4OWtaWDV3Z1FGdnZxVnh5aEd4eWV2dWZlUHpLUFpUYW4wVFBFZ3lSV2JkQ3hnbnRLWldibWdPRlovek9RVVJzMnh6RzRITFY3MUxRRTRWcytmRHNYaXlaLy9FU1hZWnI5YmgxckdnejN1Wk52ZFNlcDBxUG8rRVJCL0FycUlyMzZsUkNialFIeW9SMk9QS1QyQlhFb0o4NFIxK3FPdE03eEJmdTZFSW92VkNQa09UOTZOUi9KSTJEZXg0QkZUUXh2L21zd2dCeVIwY3BYRUUzc29BK0xFM1FVT3g3Q0lKT0JpU0JBY2tzSHFsZkVRaGtCQ3ZxUStpTzVqVWwzN0diSkE5ekdlckh4ZjMxRThKTExTWTRxNUIxR2RNMzAzSHBxUW92TWJCcU9nUFlqdWJtQXZhWTh4Z1FKYkI3eFBwZkQwRXN3cGZ4Q0M4c1BRMlFBZXBNdUM5aEd1S1h1SUxzdlVjSjArbEIwSW1VNmpzOEY0UkpuNVRrT0dURjcwbW5pUXJzUXBKaVhDSm9QSS9GWjhMaHM1K3hleXdlekhucE5NSk5tc0pDK2Y1UXJzciswLzhIUWxreEk1STNUM2NRY0J2L3NTWDJLQy9uTWNXM2FRbENjNlAxTGgxR1J0L1NEZW1kRkN6T0M2bk81ZGFUeC8rQmVCNmdHdkIwUWZVanh5QXcyTTRBaVNNUmZQUXpabEwxUWlhYWFob0dHNllzYW0rajVuYkorNDNOQWpXYnhtNUhETnNyVzR2OWZ4SDN4R3lHYVR5SVV3SXpDNlQ4VVo0ZnUveStDUVpnU2FZb3VyOU5OWWQ3MmVmbVJpY3RpbGlTZW5lemY3M2FxMDNzVVU3NUxFenFUNWRQRksrU3FyQklVbGxZM1lDK0l4VjJpUkFUWU9oM2lJVUl2RC9RZUR3ZmJXWUxDNy8xTHg0bnVpVzRFUzNjQ1NzREdabFUzZ1FVZStBQVN1b2prZWU3eUZTajVQc3orc1BLRjdQV20yRUhoWVFwWFhpOGRTZUNGTlpvcW9oRUo4Y2orTzMrNVE0bGlZV2dDek8zUW5SK0FoM2xsbTFEWTB2eXhTQ2NVSGlOSGRVMW9FTmN2ell2UWcyK1JtQjE4bC9vcnJtVlh4Mk5xNnRiamN6L2xLUHhLNjJ5Rkd6YlV0Z1NISmVTZmI2RnVlTHh5TUZmajZoSGc0Y1VwMEh5U042ckhhZ0l4anZ0QlpraS9XNS9wNExGRUdTVGNUM1VMZGJOOHJBdEdCem90YksrMEQ1M25DbThvL1hVQlhVeU5WSGVmb095bWlZR0dUOEZvWTM2ZitkclhoSEpCTml1NXgybVFaVU1HVTZqcm5JTWZ5R01UeWZ2WERGWjlYNE9jTjE0Z0hWL1lPdXYrVjBDUEJXWEhMNzlGcTFzTE95ZlRDRStPTmxRR202RVRyb3Z1L1VXYkJaZVNtOTN4bDV6ZEliSVUrcnhNUExGY24zZjltMlJNWklsaG5IcTArRnd4b1o5ZG9MOW51WVRmZC84d0RydmdkZXlGbGR6MVdmdGdwenlPL1JqeW9oQXZvL3RzTFVUdThlaWVUZWZIdE9wRUM5cWNML2Z3R3l3QVQxVXVOdzQwLy8xQ3dHSFQxdzZQMUFxZUlSd0xrdXZTRHZWaG9DYm8zSC8zUWZRcnMwRmpud2NBc3YvQ0xuRzlEdVhIcjRYTytSRTRmengrdUgxVVB5TlBkMStrLzZCQXZTL2VHV1dJOGVaR3Y4Rjg4dWIrUk5jWWdHNmJyd1dONzhPLzNXVm1TN28yYlJ1bzc5eDgraWVYaC9UdCt3WFZ6N1JYWDZueXRXMjdraTh1bG05NjhtVGUrdVQ0WTYvSzFKdUdzOUd4K001YWVUVDhwWDEvTDEvSzFmQzFmeTlmeXRYd3QxMS91N2grRUpXWmFqWlJLY1p1TFhQRTlMNzU1SkhjdG5LelJSVjg2Wk1ySWtab0ZLcUhhd2Y3ZE1obzc0dkVJMnRkQXR6QUxQZmIvR085c1dTdDJRcmtnUDVmMjFmSXVSSFpkODRNL0Z1QjRVTXBncEwwSzI4RFpqY0s1SS82cWhidWNTSkk3MjJMSis0NlZrZjRzbDJndi83dE1meUhObHN0RDRBSWdIYzZyZEhVZ1E1WDN6WDlQbkhJQ1RFM0VSTHZBMTJNQmpudUJGQjZVa3VKMmZjbzBBK2VFVGZJNHJrQ0hDYkZPQ2orcnlpamV5K0Q0dzB0Y0Z6ZkFuUWpqTE9pOXJBMXMxR1haU2s5b3hOL0pienEvNlc4a3ZhSTJMb2xseW1IMkQzZnR5aU1rZVlMb1p2aXdTcFJFbHlQN2w0N0VYc1FPR2krRVZFYUc4SmJqejY5Mk9SNzdHWS9jaFJXc3YrU3hzaXBGYjdoaWtrd2FyK1dqQXFYRXFWeXJmWTRITVpmclVOR29ZaDF5TUFYOGhMUDhTNDVIbHR2MUsxSDBqSlhDRDVSOW5kM2hlQkRZYUtPYzh5ekJGWjFsRnhoa1BXWDZSUXdnNDVrMlh5WWxPMVlrZlhLV2toZ1pIbGkySlZJNGtmVDljdnp6V3l6SHY2Q0FDL3J0SWltQmdkUEs0TE9FaDhoTnJvY0lEVVcvZHFnMGo1UlZBa0ZKUXN1Q1VsMVBGcEFOdXhnRHN6N2p1RXQ0Y014aUR3SXBGWlUxdDNic09SWU5uc3duSlVnRzRST3RCNHYya2xEeEY3K1BJRlhXRHpxaVJTZUVuUXYra1EwQVlpeTIvVkk5YjQ0SE53cnhJdDM5amJuZDhueTdzSy9QYmVxVWNsbVRXTFZ1aFJUd3dKMmpZUlY2U1NRa05vZzEvRnBza0s5d0VXT2Z4bUZSbm9oRW9zSWx3eWNrWlowclVFSE01WlVveHZwZWpzZVhzTEFxTnRHa0hURWxvbE5ZdTRqMVVuM1VpdGluK2JqSDhQak5ydFVFL2pBWHNkOTdYRC9rTWN0TVdFZU9DU2VValFJWXhBUGtQNlRMQXY5WWxFelk1TkNFRUwzQUswYjNYb2FIUUZnTGQ5TTE3L1NUN3Z0U3VvSUtaSklyaVgyaGxzb0E2Yk1XUk9KazlXVmlqTFRFUzV3bGxsQjF2bGdwb1lrSUJ0RksrTnRheUdRaVlhS0d2N3M5czNzSUR6dzJSSm01QUw5bHlPNWgvY2duSWNvV01aR3lHUkxPdWdYbkZscTAxV1JGdVIrazdLMFpydDNEOFhwWng1ajNVR3JXdG0wOXlXdkppaXJKSm9PWnlkdmhvZzBQVFRQWnJJdjJKcE94U0JmbUlIM1ROUGJ2dW1uUEhSN3RCSGVwRzNTRHg3bVRwbTBFQ0phS2M0ZUdJaHNLUitlOHFlRXJ0d2x5UmJHS0pEdmkzSHRrUFNmcGtLRnNnR2d0SGpYOE5kUHFkRzd3bVpDS3BzcWtvSm1BUjczcVlWTmxPazQvYUdER2dYQjZCVU9BMVUwU3NxeTFxVEpSd1h0aHZVK3NrN2pSbVlVRFZBTUFhV1pXZk1zVzhqa053d1BiMktRQm1WYnpPVU9qQmxoeno1TlNBTW5OKzV4NzZSK1F5T3ZhTW12YWQ2TnFhbENwcW1GYnorQkhvekpVUHlhVHlVZ1UyTnlvekk5Ri81VHJKckh1a1VFZVY1OGx1NHdteXJSUy9wb0U0N3REck1LQXpyZXBwdjliR3p6TUhhUDB3RmdUOEtnbkNiK3lQaFpNVU9BYkR5RGFQWmt3UEpDZk1wb3pJZjVnSXd1TWd6OTBQS3B2djc0ZFZRcVVIaFJYdlIyK2dYdkpuMzdpelRLS2g3Wit5c3RuckhjaVUxdGpzOHpBVVg2bGhxOWtSVEdNTlVrZzYxL04vMmZXU01ERkJEN0hIMXJyZjl2UTY4ZzZZM3Z4MDNUdWZtdEMzekJUWGI0L016M04zdnZleHhlMnlzWFlOS2w4WDYybk8vT08zWTZGYy9OTmMxWjVQcUZsM2M2blIxanNmZ3M5Z0dNcnE4YSsyNDRtYmUxRmhQOHRHRERqdEdPNG5yVjJzQ3hzVnQ3YTJwanRvckl6TlhUeTA3eUdPUnVFQ1AyZjIxNHN0czNZRWdNOXRMWEFHS3JXLys0Wk9mZDBiZHpoZkR4MDUxdENQQUJONTYrU0FQMEN2b050dEg0UlhMOU9uVnJGalZVTVlTZEVQZi9aWEo1K2JKeURmUTFRMkNGc2d3bS9PWWVaQ2ZDWXRoYW8ybUFYdURpOWJCTWlyNkdEMExQNTgxcTltVjM2emx6OTAxbkF3MXc0OVlDNlY5RHlaNjk2NXM0VWpTT1RxSFB0YUxVRHZkQWFmUVlZSW5nVEhBaUEvNWhXMVFpR3hQa1JONTVnVmZWa1dJMThaVWZjbXBvcHhsZytqRVpWRlZ5QzlqMDFaNlBocVF0ZzFNVEFPYW1HSTFCSGUyMDZmb3VZQTJtUDNKV0JkV3A2bXpTK3BkR09pYm0rTVBna2EwQjJRZHgvWmk5S0JUaEtyeGlodFVIMGRGVkhHL1poaHd0SWJLMGphMEJOYWg2Z05MS2N3cWZSK3JTcU5BMGdvdEcxaTY1QURYVUVHUEJ4eWhHS0YxNGoydDZmQk5SUDI5U2kxK1pUZ0dPTDIwcEVFSGZuNTVjd3FqNzhzcDh3dmJRdU9IcHY5T044OG9hT2k0dkhsTG93bjlPVG55Zy9NR3RxSkg5UUhtK0Evam9acWg4SUhYaFFDUTlENWVjeHhFa1hIQVFWL1NyREJkMk5jRWd2Z09lZVY2ZEF3T05SVzU4R1dtMmIrM0ZUSDYwdi9EaXRVT3N3Y21NYjc3ZXp5VSt4VzZXOXhWbGNWRkJESFRVd3FxVWZwTVl1NGxURXdhdW10dmJTWE5iV2Y0eGQvV0FsbWd5UEh5VHNOM1R5SGNSZWttSFJUenUvTkdrS05WSUVYUTMrSTB5Q3gzTTc3VFROYVdwdW13TE5xZk9HOWVYYmhIYmpwZUw2RWZ4SmRLWU9FRGNRa1NTNk5iRjlKM2RhTUF5ZHdNVUZ3U0g5Z3pYY2dJSWhZeW5zbkJmaU1xL2VTcjgrdmJRUkEweUNIcnhKWGZ2WlpueG1KNDcyTW5vNEhWWWhBWThRYk1DS1FPTjR6QTBNV2loNGp4dVJnOG1tYWVjaEhNbEdsaFd5VU1Cd0xQZHE0T0FFN0IwZHpDUG9oNDRCcTZrZGpkanJPSm1xaHhPRFYzc1NxUVhMOHl2bTVEOGEyR0hSQVo4dzMwV0N5VVNiT3JZOG14eW44Y3lsQ0IvRTJjSmZCeVRuY3FubWRCTWp4RVRlbnlZLzE3UjJmWFBheGhqVUwzMnNBSFp0L0twTlB0RjVJT3RIbkFWRy9haTlQNjA5V2MrOVZSdlBRKzFzdHFudDN0VFkxS3hVcjBRcDVYc20ya0hPbzFBbGhJeTFsOVlIM1ZvaDhhUDZoc1ZFMjE0Tmh5WUlhSnQ1SEFUVHRIWXVZbDZaM3liQkVkcmZXelJ6bTNzbnhxOU9UYVdwb2ZBT3BEUVVwcVBocThEWXBlbjRwRHEycFB6VTYzazR1bXJyRCsrcWtTSHhTMUwyYUpmSU56SkFtSGJ3Vjg2S3FJN1BJZks3UEhWM2JGVFpuQitmZnJUemhiMWh0SGQyYkpYWVJmTGcxU3g2eDNaMzBUUlY0WmUycmwvN25rOXQvRGw3QzA2bnJhR0R5eGo2V2lmejZzcGVWSDZRSUY1ckcwY1M0dnFaNDhFcTNzU3ZaMEpJVkJwWmVtSCtvdHBCNGc5ZHlBbWFPQjg1Y3ovTldydkdxTTdkNnNxR1gvRDcwQnFRMjBtN2ZPWFpHYlcyOXN4T29hM2JlaHdySHpXNytMdXBaaTdJcnd4OFZ6NWNueDliZnNZMkNCOEdSbDVCRUFOOHpCeTAxY3pOWjhEWTFHMXFPang2SExGdjVYaHd6ZUNRVEp3a00rWHhnSVZrTTVxNXUzYkx5REpuN1FiRTk0dE02R1prV1lSdEU3ZVlNMEg3aVFySzdOY2p3NWxkaUZpeGY1bk9UYTM1OUxVblBUeHpQWHVyUGdKL1BQTTgxQzN3QUUydHJDZG5qbzlKYmhOSXJtekFPUjZTUWlqMW0wc0RVdEtLSHo0elBBcDhKaWhJUDh6MXl1VDV6MXFwenFWbHpqL1YxcXdHOG84cTlxMEt1eDJwbGlhTjNaOGlIdVVtY3NINGVZSEZLbDBkRUxFTHM2STRMbW9UVHdOWkRycnc2TklybmFURy9XWkNhTVF0WlZtVEZwOTA0N1hjYzViWlVmQWZuOGQ0dndDUUJUd0lCaDFEUTZ4RFJVWkY2MDRWTWkwVisxNU9qaTdtd3QyZUU0Rm9MenI3RzBtVjlwU1EwV3IwUHlZU3g2dkxxUEY0Nm5RbjQ0TDRDQzdYaHZJSkN2NkRtOVh2Sm1FcXQ1Y3YxclFGYWJEeXJ1WS8rVUIzMkl2UTFXOC9KaXZOTDd4RFptYWE2aUluUEhTeE8xUFFKWlpUQXRlaVRlazRIcEl1NWZmRUxnUnlVdnl4QVNiY3VkUFNURVFOU0c1RmszN2phSVJoWUo0TTgxSWN3d1ZYU3JRWDdCd0NPZmExczB0M3QycmRXaGNKeTFvSGZTWDB4RDQxbGIxb29sSlhVbmNaN3FRczBJOTh4WitiWE9JNURxRjZOUTJiWXNpYmtEYlV2VVphbXZkSGUxYVJOMmFMdEZlRjFMbFlnNG5xcnVYNWRuM3ZEM3Q5UlBTTmVQOEk0U2ViNWlVOEV2L1Vpa3Z5U090UHZPWE1EWG1kOVdlSG1OamZTRXpLekJPdUMzZ0lyZGhRTEl5QjhGNTRjU0N4QWlHMWNBU3dVcE9oU2ZUOFhjR0VOV25yNnlNRnk3Z0k1QXJ6TFdJbzlnSmYzTGxHcTN4eWdiSnBoazRUeGhmMnlNTm5YUGhOUlhNZDlncmRwRlBEanRubHFhdGs4OURhNXVLOXB6bStDUGtPN2N4M2FUcS84bDBxdHhGbS9oL2FMY1c2R1dxN2hRYmJZRmZUbjVYYnF6Ujl4aTFIREYyR0VBV3hoQWRIbWhhN04yamtkM3VUTFJ3OXdaYXY5cnVJY0h0KzVQU2pkcnVuelVXUXB2STNBTWdQOXFiYkdBeWJ2dnJVbldGYVJNNTlsellENU9xVmw4UEpXOE5tTGZSajVEMmFOMzVuZW43a2NrOHNYbzZWS2d3OGMwbE1OSHlaejdlaXNRVFhmejZITVorcDJWVmIxL09aTnA5Tk16K0hYSTNXN1JXMzlSUklRbzZDRmJYMm0rdktiYTdiSGRWMFFGUDdWakM0cjYwUXRnL1l2VGRkK2ozeUppUnhLTHYxRHB2NWRpdisvRmhCSG9rZkc2aDAraEhVdzI2MHcxYjlNVk9PSmVMbGtqL0ZiZ0ViMmxIcmpvZ24vbk5zUG8rVVBiSnJKcU5oUEd3Qi96RWNqZExoQ3pTSFU0QlJOWHgvYVV3R3JvMjRObkVrSFU5Q3VzZlVuNGJDMGZla2dpU09lSDZqbEsvcmo3aTF1bXJiaTJvVURubDB5QzBBZzZaSjA5S3NLTmhPSWY1UVdZTXc2WnkxN1puNUJwWnVQdFdaKzRobmk2YytMblc1R3k2VktLcHNPTnlIVEJtNFZUYzRZVE5NU2Y0WVg0ZFVrZE53VEtjOEhnNlhab0x4Q1NsdDRWQ3NhVU91SFMyTDVvWGNYaGlXQkVOdGp3S05RcnkyVm51a2ptcW5KbzZmMXluandndWpnM0FLZzRieUpmUXY0Mm5BbzNWSC94RTF3QWU2YkZFU0IwdjBDRWVjOFFpVkp1ZHdJRFNQZGpPa2N2M0EwN2o3Um1iK1YvYTQzbWE2TldOdHpVVTdJZHBMWi81ajVmWEM0WkVTQ0RFZTdtWTF2WFRXNzQ3dm00YlZhai9HL0lDQWg4Vk8yMVFScmFPZXhMUGVodURCaEZpaVpQcXhjSkkrQTgvMXdjNjNaOHBaajNMQ05OWS9UdjExVFVVUEY4R1k0Qm9PMGV6OFJJN3ovVkJiZTNHdWNocDdjSGpZczJGNmFEeXAzYmx3U0ZhSy9vTkZJbmhCdFF3ZUZBREo1WXhoYWpQc25CdGhYcmROR3hJY1c1ZHhNWFQxZy9FYlhHcU1oNWZZYXNMWVRqZnpzOWFtTThTc1JZZWFUUVVBSmJ5S1NSemVCV08vNFhEUkxvTk9wZnN4S2FWdmRDZjZEeVV2aFZ3NUFrOXFCUG5Ga0o1Wkp4TGtQNXU4d2FMYlhLY0pkb1plV1lLbk5ENzVhdncyNkhoVWVmOXBVODNPSnNjS2p6RlBNY1ArMURhdWZVNUkwQnVkWWtsU2RQZ3QrQlYvdnh5UDhkYXgxWm5WWXJDVnhuN2FNcmJoVWFJYitET1JZbktHWWJLWndZRjlUT3ZRUG5samJNYitUV29LMTNDb1Rabnd1YjRqckIvT0JOMnpENURqcVNIMjg4a29YYm9nUmZveUh0SmtIYStzbXJmdjFJa05KSjI1NkZjbU1QdHdZZ0tCcXZvNStIdnovUXcvRzJSSDNzUWtBQ1JrUzF3MTdlVkpOUnFGcEEySXcwNnFhdXBuNDU5TUlIN3gzblF5Z2lRT3o0ZHBjekdzeHZNd2owRGM4YTZxM3MzOUpEUzNmWXpuRFhyb1FwU2pzRXJyaUQvNDBJUnlCSFB0M05LTzV1SzAyNGFLd01kYm40RUFsL09VVkRscFE2NzdGVFE3YTVxd1hHa2cxanoxMlEyd0FQQnpSdVBTQUpKb1V4K2ROODZ2K3NHeGY4WXd6MDFkdkEvNTJ5NCtWVWxCY2dDQ2gwMUZubTh4Rk5UOC9BelRnTXVIeU9CTWhTNm5YaGhnZmxTN3JCQ1lNZCtrM2lBUHo5Ni9zcHdlejEzT0NQeGREMDAzMHdCSTY0VzM0WDBRM1haek5QY3dlM3V4VFBpWUhpcTgrdUFCZ2R1anlGd09SR0dUTXNPRHpDNUszQU1Hd3paTFVzaXdSNUdCT2psemtnRWVyWmZzWW5JVVc3dU1aZU1BNHMzak00OEkySkh0MlNlUGhPeTBkMmRPb1NheEMvVWFVa0l1VTNLNEhuOEFkYmdZZS82T3BtYU44M0ZpMTArVlNzTWI0d2cwM3BuV0NQYUM5N0VvTm5rbm12V28wemxOUGlBcU9kbmlYRzV2aGV3MFRDOWp4SzFUNGgwZWR2b3dTaWUyY3RQZy9zRCtWZlNucExiWUZIMVEvNXN0Q3NKM2tteXBSZDYwajA0RXJFanRKbnZJVlJvQ09mS1NSZXVZWDNSV1g1NXd1TnpDYU9Pdm1nUWo0UWZ1NS9WRjQ1WjU0WGZTb1NmMDNxY2NwbDdRUURHbDVjT0g3MmR3U2ZIWXVwdnIxTlRRcnhFUDRzZ1NyYmRtYmgyZU5YVXp6dHNHbVY3Qm5ENmVRNUFzd1o4TVdkSXdZc3JjZ29yMklpRzZBVVZ4KzBFZlR3dVdBRThyK2tuNklqVEMvSHZZUjM0RHpabExGa1NzcXlpeS95Q0NyQXQ1K0Q1MHdzNm9yOFFBK2d6RGl5TWtDUGZaSS9zZ1dPMm4xNHdWZmlHd25CUlk4TmxMNCtFdTF6a3BxRndzTnN0bENGek5JRzN5UW80ckF5SDdHQjBzRzRsMDZZcjVMQ2J4UXRlL0FBOUZ0VUlMUGdVelcvcmtsOGozY0MwT0d3NlNMbVlqSUJ3NHluUjE3RHBRMFpwWHRSUTc4TUJLbTgxTGd1c1FHQ244SkRzaFdsdXZrRnhSRFlkSFVxV2NENGxyU3l6SFEvU0ZuSGpHZmE0SnJ2TElMay9rU1JQZGRMYTBuaStjUUNnLzVEOXpSYU1XbFkxTUtSNWJXc0V5K3BHTS9XdG9sMTVDRmNwUlpROG5pSWRyMDhxNFFBVXhwOXl6Zy9FSUtsYnJxOTlDL0NISXJmT21Rb2RDTGZYbW9vN0xzdzc5ZXZ1aFNkVmNyUWE5d21LaGZybEhiazBKUzVZVjlNdVdRdnhCKzhqWUozeGxQNlJMdUdaQktUZS9jQjAyWEZXWXZOaHJaekt3TmYwYjFnSW5FWVNWRDRJRlBLUmhadTNwY0dWM2tkdlg2U2xKSGF0SmZmT0hTZUd0R1JVeTJVVkJjM2pZTU54RVVqQWNrSjBSU2UzOWhmTXQ3YUNJa3NCaWNITllVRFNiTWx4aXRTNFNIYjlaMk1VMVlscDBZOVdnYXFJRGMwVThaR2RCdVZ0cVRwejRSL1FEeGFJOHlLeW84U01XUGgyZUhwSFMvRkp3UDFxNWZhL21nM3NxMHE0bUp0TjU2eDhUZEVrUE5rTWhPZ1o0WXhBMC9YbHFkMyt1cG5ZM0ZEWjJYRUxFYTE4TjVoZS9Qd2I3MExWN2hCU2kvSG95K2RpMmwrRzVJdGZTbll2NythUnlDUkJ1eWg1L3NKdE1GM2F2Q3RZQUgwL2dUQU1PSktSUkp2Y1c2a2RvRklDM0hiczlUZTFlY1dRNEQrbUVFL2Rhb2JhNU9vb2pGUXpiN3ZUWkkzdDRCNFUrbXZzOXROcnVwY0plWWcxNCtFeTg4NloxSnl0MjFlTTNUUzlzTHNrdjg1QW4wVFFSajladkV5cllUNnI5dml6Z09mUGYyYlFmaEtNMnMrRDVseHdXcFZ1L0FleGVTWEhzeVRWMmorOTFHMW1aeGtnOG5LeE82L2llcnFuMkc4Tk9MdGlMOVFlOVozWjc5TncrSXVqa2VlTnpPU3hKdTRpYnRxbWN2M0Y2L25aMjZaL2YwNy9VZm1mYktOQXY3aWxGOTl3YW51YlNLRE1aQzNnd3Y0UmFRTXJDY0RTSjV3aHdVSGh4VXMzaE9OKytibUpVVlI5Y2tvUFhEei9md29uQUVESWlYUHJDdksxdG9zSUhlK2tUQWV5bTlJZGRGWUVZQUFBSEFrbEVRVlJYdG0wYm5rU0ZYZm41dURxNTlIa1BjNXZpTUJyNkl3WHY3VUVyM2xwZ2JkckVxSW9zQXVobm8ycU8zOUdSaVJrbVBpa2VvMkF3SCtnWHFBa1BHeFRxYzRnZXdzdTBJRlNNQVcxNHVOMmZSQWZIRnc1YVhhS0NkZ2VPUm1rYXY5cVA4YW4yRklMaDZTYTg5Y0MvVDBJUjJGTm1ZeHZ4Z0FjWTdXczNpRnZPbkt1c0gxMW5sYjZSUzBJSWVMalg0UVJzM0kvTkJmSWZEY1hETWQ3NEJBNTBhdHRPamM2ZitUZWNoSk00N1U5N3phZC85QitOT3dyWXdHMEhkWExycGRZZGJlcWExRk5SbzdLenlpNy9rUU1ZZ2hlYm85QWtQT0t6NjI0RUw1MnBqMFAxK01hUDFqOWQ3Z0VnOEVDMTJwNzBwNlA4Rm10Z1JNNy9BQjJGcDlzZG9aamdHVGZ4K1JHdnZSbllDcENrd2RlZGVMQzJxVXhiOTZxZUJtbHorQTFrcSszUDAwUXBaRHcwNlNTK1FWeEM0cDM3dE9rUzZjQzJRZlpTSjBHMWUwdUl3Y0VmOVFlempQWmk4ZGJPQVdtVkZrSWxuY2MrdFJ5ZjZnUUpmcHdGRW1DYWVuNFd6NHNkSHpwTUpWRG1LRU1ocGJsNEFNTGhmb1A5aDI5N0ZaL0V0c1BiSUl0RXdJYWhpSy8xc24vZzRYWExxMzFEUUtxbmxjT1B6Q1FLSzRYQ1UwYVhmcVJXcVo4THcvTDRPREZGRWw1QUpwZWhnRHF4L2czVTI1MjhCL0ZpSW9zUFQwRGZ4ekhHU1BpaDFCcXZBVEZsS3J4UHd2S0gvYWt6NEpBcVV0Zml1eDRqSEdUUVJUdzRscWlYSnI1SWdWazNGRGhjcnJoZUJuRW9BRkVxK0RuQ0JMb1UzaFhpSzJpTk5RZytMLzJwTVRybjF0UmU2Z1NvVG9TVFlHRjhNemxMLy81TEFDRGZnSjdYSnZxdGhwVi94WStOQmx0ZngyVW9uSmk1ZjFTOWpwYnQzOXFoSVNoNVA2eE9ya3k4b3B5aW5ReXI5eUZSd2ZsRGlOSzhTMDBVVXY0bE9BWUZyK002TlN5MGJIN3gvdlM5Y1VQVHlyNGxvN0ZIVnVIbzJ3Z3ptNTJmWmlJUlJHUjdLZWZTbjdtNDBEcUsyVEhFcHpWa3o4WUp0NEYxQnhvUmQrZ0M2YlhqSnFZbTJNVFZlRm1QbFk3VnpQcW52am9OYjgwNGZ3c1VHc2p3UHZadjJkQW1YbzhCL0NSdytpYVNzZnJqNDFGNFM0Wjd5OXY1T0tnTU92cUxQZ1FaVVVrL2tHV1I4MkQzanFUV0JlMFZyQnRncmprUHZidWtoNURNcHYxYjlsd01OM1huRGJWWGdHbkk5WURMb1Z1U25LdWZQanFlengxWWxYdmxvVUZtbUU0cmpxL0NraVQ2QmY4eVB5dnMyeXUvRUpqREMzUGdMWUJOZXRPVGUwMEhkaUgwQ0VXS3gyaU1FckYwRFk3UHJtSUdTbVgzUFFubzd5QWpxS25qYXlhcUlDaW94QVVzTFM1Q2lnUms3N2Z0aHpIME8zTEozZWN1S1dTbTNZdG40VjBma0JsbEJuc0duK2JMRE1ibzUrbGxFL01nZE1URHZyOVloNVd6WFRpN2xQZndkaUh0V0NYYVFVUmNLbjlNcjdMMXYxVEovUm5wUU5ybWlOVTBpMC96VGpwSWFuNG4wRm13UDVidkpKUG9kaG14dVhxV3VGN3Mram43TFU4UjI4VFIyWUw0UTdZYmdVaHlNY2xMYVNKRUJDYTRwNUxrSkVSZ2NLS3I5eTJjdG9oS0x6Sk8yUytOTU1kajNVR1RHVmh6MEZpMW8yb0VLWWIyTFVzTWRHSnFPYUU0VTJCK1NCSDBvOXNCRjh6a09wOTJnd2V0N0h4NkVvUXE5ODEvVDV4eUF1NTdJZjdJdWVuaDZNcGxEVWZuZjRYUHlrMDE3VmhzdmQ3TEF4Yk5Md3o2SE51QzNtUURySVhia2ZGK3gwZERtRURuMCtPY0h1NDU4YWZUbll3TElwQVd6eXMvdTd6aHQwOGhMeVpGdkk5dkllcUhaQ21NamFBdE9xdVRsVGlaa0lOWDNCRFpReEhqRExpOFd2WXp1eUU1UHE3L09SNWZoSXNJdjNKd051RWlNb1hFWlZFOGh0R1hSZ2dOdGNvZ2xFVEhWWmlDWjBxVDZpWVNDYnBscEJSWVRvWWxhSGN4UHMxUGFnVHF1TW9YTnl0bjZwWHBHdTRrL0Y2SVA2UWVjV015YUtLN2lUOFNtNURHSkJjSm81QTZrUlVpVmlCYXF2aGxnVkwyazRoSEhMb3ZmRElvU3NWdlNKakk3Y3Y2a1ErZ1FFcm85SE9zWmFRcmRLTUlIVWRHUG05QUhQN2EvM1hPM2xaVThLZWZTMTBGMGpxL3F6R2U4VlBIYW91Y0JMNU82bHJ3SDB4MWRXaVVnNUZxZG9Lem1VQko4MTgrVGVCYzhoOVVmM3N0RVhPaklQVVFTT1Z4RlAyVkJLdXNEQVNPZ28xUXl3cTNPdU14MytBTDIvN0FYemE5L1ZGOFA4enYxRndXdkIrWE1aV3pUVzBuMU1TVitZRGtOLzJOQkRxRm4yc0F1ZDl0Y1d5b2FJZ3FLWHJwZlVxL3Mwa1dGY0ZlZUNjYVM1c2pKSnFwYkNVNkRtcVhGK0lDc2k0RWNoc01BRGtlaDc4cjc1blQ1WGk4RERVazNTcGE2K2VOb1FUY2MyWlVSQ2ZxQ1ZFbzkrY2x4Mk5ma2QrVElrcktLc3VBVFNwSktxeTN4ZENBQzBhMXRUekF5emtKaWtHdUwvc2NqMTNjeVcvU0lpS3Mwakp0bCtQeGh4OG9rVUwvekg1K0t6NzNjSnZqc1hVUGs4R0tJSTZReEFiWjRoRFlWVkZpeWp4cVJnWE4xK1g0Z285ZGgxRnI0V2ZQc3J0OUw0TmphK3V4S0NSaHRVamhWNzVyK0ZpQVkydHI3MWVtNUVteEVMQVpHVzdIakNCYzdZbHdiRzM5OGVCVDd1akxHdWZIWGtLUWQ1MVkwZlNHUXRDRSs1aytvSnFVeXNGT0FRNXdJdnNIdmhGQ3BJdEpURExqUUJBeE9JL1NhSEpnQ3RxRGZsOXZwanQ0SnJtT3JhMy9CNzJMOTlDQ3JGSDNBQUFBQUVsRlRrU3VRbUNDIj4KCiAgICAgICAgPGltZyBhbHQ9IiIgY2xhc3M9ImpzLXBsYXhpZnkiIGRhdGEteHJhbmdlPSIxMCIgZGF0YS15cmFuZ2U9IjEwIiBoZWlnaHQ9IjIzMCIgaWQ9InBhcmFsbGF4X29jdG9jYXQiIHdpZHRoPSIxODgiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUx3QUFBRG1DQU1BQUFCWWdoOElBQUFBQTNOQ1NWUUlDQWpiNFUvZ0FBQUJnRkJNVkVYLy8vOVNPQ3hTT2pIL3dwOEFBQUQrd0o0SUNBaFdQakwvN3RETVFqai8vLy82NjgzNHZadVptWm1WY2wrYmRtTjdLQ0l4SVJyMzkvZFVRanBSUzBuRlFqaEtNaWhwdGFWUVJVRXpKeUF5SXg0NktTRjhMU2RBS3lKU09DeFVRanFjaW5jUUVCQlNPakZTT2pIenA0dFNPQ3oveHFaU09qRmtURUJVUWpwU09qRzdxSlAvK1BRcEhocFNPakZTT2pIODcrano0Y1JxVVVSRE1TbFRTVVJRUlVGVVFqci8xci8vMGJBYUVnOVVRanFIWkZMLzU5bk9URU5UU1VSU09DeU5mR29qR2hkZFYwd3BLU25HbDN5V2xKS1VoM2Q0WWxNNU9Ua1FFQkRlejdmTHZLV2RqNGh6VzB4SVFqLzA1K2JicDRuV1psWlRTVVJUU1VSU09qRlNPakhvMTd5TWduNStiRndaTFNsV1BqTDM1OHYvNHNMNXc2WFd4S3lKY21GM1ZrWWhGeEl6TXpQODZNeW5uSWkxakhSWG1Zd2hJU0VZR0JoU09Dd0lDQWo1MHJ2ZWhuK1NibHFSTUNsV1BqSUlDQWdBQUFDTFpXSkFhMkkyWFZSUlMwa1FFQkJVUWpwTE9DL3h0NWJscXFXdmhuQk5oM3NwUkQ0SUNBaFdQakttTk5vekFBQUFnSFJTVGxNQS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1JCSC8vLzhpLy8vLy8vL3Vadi8vZDRqLzNmK3EvMVdaLy8vL1pydi8vLy8vSWpOMy8vLy9NLy8vL3pQTS8vOFJNLy8vLy84UmlQLy8vLzhSLy8vL0VVVE03di8vLy8rNy8vLy8vLy8vL3lMLy8vLy9SR2E3M2YvLy8vK3E3dTcvLy84aWQ1bXEvLy8vLy8rcTdrRkNOa3dBQUFBSmNFaFpjd0FBQ3hJQUFBc1NBZExkZnZ3QUFBQWNkRVZZZEZOdlpuUjNZWEpsQUVGa2IySmxJRVpwY21WM2IzSnJjeUJEVXpRR3N0T2dBQUFnQUVsRVFWUjRuTVZkaDBQVXlCbzMyVTJDN2dMQzB2dkNvemNCUVJFYkZsVFVzL2ZlRmZYT2UvcTg0b24vK3B2Mmxaa2ttNngzbkNOdVN6TDV6VGUvcjh6TWwyVFhyc1RTTnJueTIvejgrUEJnWlgveUR2OWU2VHA2clhLb25nTUdQVjBpK1RJK2VYV25nR1dVcnNtcEd4ckd0MnU1RHhyeGZJUGVsMysrZDJ5d2JRY3hKcGEyeW04REhpdDVoVjlCNkpHdlAvcStQMTQ1c2FOZ3JkSldtY0tlVi9MenZCczV4WGZkczR0b2dVRHZmUnY1bC9oZitjM1h2Yzc2My9OV2NoM2I1YkZqdE9oTkIzampSM2NZOTY1ZGh6VE43YUowTDVmbzU3Q3hyUEh3NFZoK3pma2U1SUxudm9OWi8rQkgzbVNlR3Fib0NIVjhSRTJSLzY5WGRnajU4b2lsb1Q3RExZWG9YODlUeVhYZWJNWjdVSjBka1g3WDhDakt5UGZRVGtBelZFdnk4R1lBbSt6cm82RVpSS0pqZFhtTmJPUnpvd3l0ejg3bWE4bHJFSGw0ZytxSkdndTFpQytSYWRlYmZ3eisxY0ZqRnNVUmJveTZ2MmRYMXVhenVwU1JqRWhod2ZDTGplUC9xMTFOMS81cmxjcmN5c3J3c1BpclhEdlVsZFRyUjFldUUrcUlSRVp2K3F6cSswQU84Tmhsa1cxcmZPZ0ZLQ054T0czN0QxVUdWNmJ1amxyNkFvd2J1RHMrUEN5YWRIVC8vN3IyTDFlR3gydHBsbmlOZkx1YTJ1SlM1NDk0eCtHSmdVTklJZkYvWU81YVY5ZitydjlWS3BYSmxlSDVlWTkzbXBhWWo4ZXlob0FzWEJFREp5UEVqaFVxOWN1MmN5ZTRjRDJmTk1DY3pvL1lSZ01qQWw3eVF5TW1SZFlraGc5Kzg0MVk5QWtpNHFrUG5OZTFER2Z6QmlwVFZVZStMU1BlRWo4bXVpU2MvQVBnc3drUitiVFZ3R2ZIUnNTdDhaemd0VHg1OGYwRWtGWUE0a01mZU1nQWppcExoZFJoWEdsanhNcWhzVlNsajVKeXordlp0YnFpZHJodkgrZmk5VzBoY1owQW1nS2tiRGQxdzFZb0ZoZERrMkk4OWxKdGN4SnVFS3Z2MFU1NENoOTBoZmFsbXJzeXdZUFBxRk1xaG1ldWdRTklZQWQ5MTlMRUZRZmE3aGdxTDQrNWVXUEFjVExiQ21UTzZydW5CcnZJZE15U09qZGMwbHNUSzJON00vbjVhQno4d1V6d3Z4am9sdEx3dnVVQThJdyttVURlSU9ncWlFODg2Z1ZxVEJTRHpGdkRPbW9rRS93VU94VDV3ZXFKdUEwbVlZR1p0KzJGaFlQMmp6eFh4M2xYeFE2RW83TnQ1VWltQUJ5end0VFNKY0kvN09QbU04R3Y2RFBxSVFCUjFSbFNnaEh5bmY5T2cwbXFyTGVpeU5wT1crTEthelhURzgwRVArZDlCeHYvcGM3SUJEOXA2NXJqQ0puVmlmY0kyODFxVklvQXFBTkFhMkpuVVI4cFVNdjBVcFAvZ0lUaWRBVkUzeGVTbWJjbzAwdFZvRVpYQms3MDdYUERZZ1RJeEJ3ZnhpbDRWRWVFUitCWGxFbGlIQ1ZLNXRSTFJWY1ZBUUlLOWhnelZBTXRFMmsxeStCS0hramJjckFveW5vc2NwcW1Ec2djZkZZU3RGM2h3TkExNWhrNUVOdi9wRWlROUNTdUVqeTJjV1B5elBpZ0F0WDczajhSeCtJM05pTGpmVmpYVURCekFxSHlmU01GUUtIdHZ3bGNDQVZZRm1wRkZBL2h1QXpzM2pFL1pnWTNrMTdteklFdG5pUnI2TE9UK2d3eXR6czhtc2lhT1REVlpZSWYvSHNHZ2NCMTlNN096dmJNenZiMkxuRlFmMGVqTWtleHc0WWhrVk9ISlpVNEdpWk5lV0QzYWxnc0Z1Vi9YY0xxNnV4c1Arc0p2VitkVVY1bVdEbHV3ZFhIbWJsT1YzSStCYmtlMEVTZXQzODFEQlZ5ODZZL3FQZlYyU1VHQ1d2a05kZVllL2t0Qy93M3U3VStWcFUzSE8rdm9yak5hMGcveU5hczl6bzlsanNBbXNyQWZwVVlFVmNmUDNXRWhudDByQlpENG91V1BtT1A3b0p3MXFuYU1nRHA5aUlyb0ovMFlxajUycFNYRVRyMGhpUnMwd2dqZjZZRFlyT0dYMi9va0RYWCt1WnZEZVdla0pCcmMwZkE3eUFCNU9YT0w3V3hML3VzTXMvdVNTOXordkVKeDZzbHIxK2dQN0FOZ2o5aGk2bFpLMlVFNHZiTmVRd0szcDZNMVpIcjN6T2ZZbmJyV05YY0NGa0RHTnZKOElTNkZGZnptQzdxZXkvRFZnN2Jwc21aRnZhc0xXNi9kQmhJdG4xbjFLY09nUzFWZ3UwbFRBc245RXVOdUJLWE1kVng5UVZjSFNIeUJHWE54QjlTTTRoSXhXcUhaOVdlR1l3UHBBK21qakZ2bVdOVVJ1QWpJWGN1YWk1aDNnS3VzK3BMVlZVVjJUT3pIdGdDNm1nUGJFV3F6c0k0Sk5tQzg0cE01WXp4VmNhWGtDTW5OVFdjS2xwN1BzRWVKSGJXbk1GS0M0dEhJMHZlcUp3V3Z5M3ppUnI4eEdKTEdCWkR1eE5DQ3pPM205MGNvRTlTdDZUR1lIMUxUb0tva0RsSGNXaUdaQTZ6ZTdqVVVjUUVXUGNBM3hpaVZpdzVYakdpWmtUMitmUSt5UmJuR0lQc2s4ZzU1MU9XamZxTGFHakl0SWVFRCtuRDJvWEtMYndWcUE2eGtweGZuQXRKY3dqWE9FbVlOREFlQU1KRWFrR1dheGlHWW9RcUpOYURGamdkZ3ZKZmhaUHlLWFVmeGM5N1dHRkowdGszY1U0WXM1TzFNclhPOFZoNmk4eXhnalh1ZCtYL1dhKys4V1o4VGJQTHBZZzFNY083MHQ3UGw2UXB1a1krM283NFJnclYrcGxjNHFiTytzMVBaUDJJNVVvVFVLYk9tSVkyR081VTR5eXhyQ1Z5QzJpQ2hMZDB6Z0NKVVBpdXAyb2JZTnBDcjM1MnJETnJDWkhMT013ZDY2em5INmJKTCs1WXRzTDRIUzgxUEZTSFk4UHI4VkRVakY2c1A4OGF5emNIL0c4MldES1l4aVJhTFdHS0ZEMEp3YnlFWU5LdElJenN1bXRzUW15aXNmYlk0eVNtbEdsQmU5S3lUZHZBaEJrTkhNWWtXN01Pem5XU2Q0enI5aGVyQTlTeFZaU0lFMVJ4Sm1PeFIrS1YrQTVjeHVtdWU5VUpIVUh3SVJOMnlCbFNMUExBbWY2djI1aDVTK0kyd2c0dXB4emtlWmRnT3dBY09TWXJLa2FWUmJOTys0UldpNHM5eGdQV0h1QWJLTmFVcTdQdW5SMFJlSHJFOElSQnlSOFJBR0xMcElaNHdoelJJWjhFNllwdnRzUWQxd1ZmZTllcVJYZkg4SENlQTZFc0RRbXRIYXJXckczdGRUMit0amFJcGk4aUk1VWo4V1BXUmt5eG8rTlJRNk1BamdyenFFRVRKL2Y0amFYWC9zSis5K3FZaGE4NjhpVk91eUZCbmtGaHNZNUJJU1A5RFdwaXFubWlMVGgzdVdReEpDU1ZaR3BxaFExeHZsaTdyRnZXM0ljR2VBbHpseU9jOGd4dS90WFZKNHp0Rm4ydG9BQ0J1d2FVTjBzZnUrVGxYVHM4WmxsNVpCTjJFeGxFczAxckEzTzM0R1hxTUlnTUxtK0NLVldyajNuWDI2R2wrSXpnVjNnREUybGo5NmY1MElPNlo0bWYyRzNQc1RMVjRPYUlZVmN4RGp0NXJSa01IRS9kTlh2V21iZXhhZ1BsY3JTTk8rZ0U5bysxaVRmOENXTXFuVHhwUVIwMWRvRGcxWkhEMHpHN3ZyNys1RWx2OXlweHgyNkFMVlpzQjlCc3ZidTNXNVRlSGhaeGRqakdNWFdLZXBEMDlYdFdGeDgzaWRMOEpRZ0toWUw4Zi9uVWw2YTFDYjkzTlRYRVhPK2RXRnhyZW5IcXNqaWdYTkJGSGxrb24ybytvMHhYT0p0MzVYblkxbGVHUFZkU3hQdm01cWJtNWxNSUlkQkFWRE9hUlRNV0p5WW11cnVYeE92RTR2dW1KZ2tad0Fid1Y5YmZ5bVZ4OEl2RjNxb1lqVFBSK2JGMVFvSUJBY0pnRFc3Z0lwbnBPdXJWcUZuSXZibjVjbEFBSVJJeThSSUU1VUFMMlB3WUJId1hMWEE0ckN4MkR5NkxqcHlZdGJoaHdiSFk0TjAxNENHNXlXZCtEQTJMYmJLWTVwd1J5QVg4c2pvNWh4WW9vQUhyQ2ZsZDdRZHRvUTFtTDdHaFhHNldQSXpRb0hsa3MrRUw4enNRM2N4bkNkbjhaRTlBTkVub1RWKytTOGp5Qi9rYVlCUGx0eStTaDQvalFtYlVJWVVZWU1ZbVRpcldYMnlLQ2VkMEl5bjNwdVpUZFBJQWNBY0diRUR0Z0VZRThLRWNBT3ZoaUVMaGhhenhNU3BjWkRzZTBtRDl5WUNIRGttWVdJcjVCaHdwckNuc3paZUo3VUVaVlJIQUJoWjFBdDRqdkZteXFlTHJLVW1iTlVPUXpOUUJqZjBxNElhSUlOY0NuVVF1L2l6cEVvWHhVNWtvWG1hUUEvTUYyeXJmTHdzdGFsN0xteHpEUmlJeGdERVBpL1dwMm9XdGtkaS9sSmtjT1pJQTJnVG9BN0pFbGw2dzk4dFNqUjV6dmhKTDRwT09Hdnl5aHpUelBCWjMxVFErYTVJMFRjYkthekRFZys4MFBoSzhVbGd1ODFUalk4ZVVhWXZtVUFkRU5ZcjV6ZHBRWHRZaUxKUEhJV3hhSzdVcEl0cG9zNGlrS2tPdktjbUx2bHkwdEszR1pEMzVLRTRuN2xiVDh2a25tamN1bkQ1OStzS0JNYkowWkdvTVNSUzhNdmRjQmJTUEpPK3haNGYzemV3N2ZNQklmaUp2cEtMQkQxdSt4L25DcTJBdTRsR2pLdWYzN0RtTXhDMERTNmhJeDE5R20xSkFFcUZxQnc4Tzd6Rmw1djVscVVXUjU4N1FlZWgwTlhadEdRZnNhRDZ4QVI3MG1sM2ZhUTErVTU3MFlBR1FNeU9KT2hwSVM0N093R0NXUHluemVHQm1ENVZOU1VTU0Y1b09VRWhyUm0rVW9nUEhyR2ZsU2l4cTdJMlg5bWowRWhHejhtUUhVZURnbnJTT0dwVW9IMmdGNFBMRDVtbWhTTlRWcUdaSm50TjdBK0R0K01VV3MyVTZZY010QTE2ZmUrWmdHUXdPTit2TTJhSWhSV0twYjIvM2NPeXRtNDJubTk4RGFKT0VRR2Qxa3RKTStzb1VwMG0rY1BnMFVsNlZmZHdPWWhjNFVRMXBMUVFHWXpNU2RXc3I0TjlzYkx5d1JoSk1ENGRsTWRNSFUzVmZyYUpaYyt2V2VlajF3NEdLdUl5UUEzSkk1UUxpUlp1UGpuZWZPWHptOEQzRnY0ZWkwalA2RE5tSllZTW8rWHc5aFJzRWEwNy90Mi92M3ZZamw2WHdCSVl4c05XZ2tHWEY3TUFRUEVEV1kwZ2dsRlZEdi9SdXR5aFgvdHl6NTd3QXYxakxRQ3VRNXFjSzBRYmhNUUduajkyRjFQdjY5dmIxeVpNZVZudzliQTFJSE90WXBrMzBVOWtJL3UyUjNlMjcyOFhmbFVzU3ZEWDhUOHcrTUIyeVRBcHI5UTk4QWVmbUt2dkZ4Z3Q5RXZ6UDRyUzdqNmdlMy9NQXVleEVPUmc1QkdBcVRXaWd0Zld0Rkh1NytuOUZjbEZKcmZZa3F3Wm1KaXRYb0RVKzV4VTM3ODVTMWExR1FSbFJmdDZ0T2x3SjhCazYxZ0FNZW9BQlFZRTFSemRBY0Y1NXAwdEgybmRqV1JOc3RFUllLNW5DTEM5TVFtUHlPdWJHL3dyS0NQRG12SDlxZ3dNYWlreUh1RXUvQlhZL0ZNWmFwYmE4MjgzSzNsdU50d3hiZkR5cFJRS0NCUU9waW1mRDlPdytpckhwekdrbCtMNmZ6VGsxY2Nhc3lGSkx2VXlpTjNTU2JTdXJqY28vTFpncWxCamErL29hajF1U0kybmpiK0F6SWQyc3kwR1o1V1p2L1hjdnNhWWRSSCtnVGplckZGMElYdXFxYWNIZXZsdG51SXJWY3JPUXBYakM3cGRhQ1JlcUVzUDR2Y2pXSzlyVUIrUTcwUnRwdTE3R3lKMmFzRSt3Wm9hVFJvRGZ1emJCQkFnc1RVeSt3U251VWM5aU9sOWNVUzlhYnlBbC92WnBqYjJQVkUzeVpsK2dHY0hzREhBR2dtWWFyWWdQcldCcWRwUGs5L1pSb0dMbU00Q3MzRWZLRjF3RS80MHppL1ZVY3BMUWhWc1NPZGdhZGVxM1VvcDFqVHZLWTVJMWYzTHc3VDhMNjZ0UG5wZ2tCTzhhelJ5QVgwbGU2VFBIYW91Sk9ac1QydGIwRWVVTjZhMlF2WXoySEExT3dkZ2kzYTZETXBxeGJNM3VuNFZNbUhUVHZJeGV5c05VczBIV291VENmTmh4QVg0dkdFclQ0WmUxdVVHaWF5TVBnSU1nWVpRdVk0UFdLMGgzQmo3MS9CNHovRFREUGVuRldvZUFZeEhTNmNZMXkxREs4azRpR2VPaEw0MEkyYnhJbVVYSHlyOWVvZllyOEgxOVhzTHlrMGJqczk0US94bDRKL2lrVnRqWGJJaS9pY2JHdFQ1UzEzWUVMeVZQWVFEWFZnako0TE5xd3dFWkExL1p6WXNDYjNtWEd1dVNGVWFieUVHZU9tby8zaWc1YjdORzBFYUU1UTkwT0NtUmxRTWlpWTdweXdGVENFdnlSQnlnallQZnBZNytHZk0rUnJ6OHlRYW5OZmcrcHE2Z3NKcnVBY0VHd2NOYm1mQUhVbUgzdkd0WGRiUWo1eDBNMUFEZitzbkhvRkxsSkhLbU9NZFlsNjlPeUVHSWxEeUxwNVNwM0ROREZwMEZZd1VkaENIdGNSaUlwcEp6WHByS3lMTForTW0xbUNENUV5NXl6Mk42bzE5Z2RIVmJnSmRPcXM5aTZ6N2xwR2oyQ2RsZVkzVEZuSlJsS25QYURsZ01QTW9DVHdQY2p1cFkxc0Z4R1hNLzNzdU5mTHNNRDFybGNJUmlBSEswTENBMkxUQTd5UWJQSElGWVhvSHYyL3ZZWXhFQU45QkFYdndkY2crR0xlU3M2UW5aS2hzUy9IOHBOR2czbEc5dFBWQW9HSU1lbEdIcUdDZHNpUHpvdzNSZzFzNnFrWUZaam13Vi9RSzVsYU5PLzdndFlOK2paZ24rZE4vUG5QSkg5a2tjWTl5a2E2N1huQ3c3SU1lKzkxai90UXZ3all0NTcvbGd4aUxMakNLOGo4REc4Tm42eGFZTFN2U1d1djRwc2U4TGtPaDhBTWhNUFU0YTZPMFAxQ2p3SFpQODdqNDlHTEZ3cDgzV3Q1R2haREdiK2NETWt4bjN5cldLaTAyS040MVhFSDI3SGdhMjNnZWdFQld6UGlEcmlmNjNFT2lBL3RJUmh2NjlHZ2JHNW11b05jeGxHdGJjUU01WTNJcHdmL2I3V3JQaXpmbExSMURSMURpcVZVYzJBYkMrQU85bFdqRXJ3ekRMYkhxclpwdmVIa0ZYZlVYTzIxeTBVNUlZMDYzNFlDQmhFSmk4ZGtibGZYUFRrSnFpdkFUTzhjb2xQZlhCK1pKajdVemFuSDFxeXVmdEVRMjkvZDNNVGVsRUxLTmlKUjN3MUlKUkNPWmpXc3A2QUdNaS9WVXVoNmdweXRiV1ArVkpqL3pacXFjWkh6Q241QXhXQTdRN2FDZTFJaC9VazN6NzNzbHVsSk5PbDBUVkZ6eHlrNVJkRTdzeTM5eDhBdkNDUCtXK09EYXNra3ZlRzQzbkJYYXBvM3FTVHBiN1phSzJrWE9PWWRWaG1LUzh0S0JtdWxzRmVMT3NRMXpSbjl4aDFSVGFtaG90ZENJMnRRSjRZVk5LVzRzY0psckxJTytDQ1J3MVEvNjRjdVZkT1VpTDJNWm1jSlpWdFVHQUg1TFR4Tmo1NmN2ditnNlFjMmxKWE1RWTFCSmZyM28zTDhDa3RDa3pZOFpyd3VvMnlQcy95ZzM4b1hrQ0l4TFVZQk9kVVYydGpSZEUvYnFYVTBkeVdzUjZJUFc3TFdqUEdsQ1JwelkxdmxlcmFBOW10T2lOM0dZT2toZFNiaFlib0MzcUZZZ05iRjhid0pRZlRuSHZtWmJWTC9yVytTMnpqWnQwT0Q5Z2R3eE5JWHZnMVNKV3lacGFPRmI5VFp4NXdKY1BBbVMwZURjZTJPUldJSEF6Y1N4M2VkdHE1S0FjM1F1NVBMcVd4M0R2Ti9wYXo4VkZheEw3QzNIU1p6TkdaRFBQSHFTdlYyb1BkTVdlTjZEUVUzNGZPd3pxTTNPZzhFWFNjczJ6QVpNTnBCa2xYMThzWlM1WW9Cc2lldlloVmozZW9oVE5LVGt5R2p1Z0Z5REhUSTVCT1dBZVZ2dWtRa0U3Ly8rd0Jkb3lDQjRHNXVYQzJMM0QrL2J0Ty94Vy9QUkZKaCs4Wis3ZXg3UTNicjU5NzRhMmxHODRVQ3MyYzM3V2NZYTE2cDJkUkNOTStKRjNWb2dBNDFpbUFEakEra1BsTTZ4aC82ZExkQndHMzdac1BXZ2NxUWxmRjMwdlJIT0tKaUN6NTRRaEtDZ1hhSkVoNEc4QnplZ3J5amROY0NGYWFXVUV5ZHdydDIwMHhoR0xMS3dQNVZlWkZIZktHdTRGeUhPVktHYVliYWR1NVZzcE9hVXpuUkxqRWpDRXBnMHc1VlRKRlpGQkRaR21UWUxOemgrUkJlVnlFQis1QkM5VXdvckxXVGNpMDJoeCtEMFNEMnJBTkxvOTRxdk1zaTlKazc0RjZuMG0xOFQxSE56SFRPS3JqMzk4a1p4WnpMR2VJMGVwZE5YRkwzeExRbWN4NytYTDJLeVp0Rk1CS2dlc0VSaExJcU1wbkFGVEJIb0xSY0MvTENqemZwSG82Y2pmZzFCRmF5Qy9rUDBYYUo1dnROT1N1T1hjZkcraXVla1BOSXJrbGdKUVQ2c2RScndCYWJLaFR4bTlydnpwanhkTk9rc29aMHF3ZFVIdk1QVkw5ZzBhSGplOXNNanlYVWtIcExSSzdNM05rT0NVblhRZ2dubjc4cm9LVC9CektFUzNUakU3bkduK0kxdXE1Zi9ZeFJqTG9JQ0hRT2NJc1RlZjRaQk5UT0xreWJCRVAvZXV6bTFUZGR3VDZQR0xyRWk5RUJ6WmJaY3JhUXViUXV4ckVkcEF5N3R5N0tDOWZ1SmRibzVldDlpQmVCT0k0eTJlc2dDWVRxRFdDT0xFd050TzJFeUxqRDA0dFhHYngxWnVQQk16SDJsMzZLbU1NdFRXTVc2cWtCZE5Iemg0Y0d3TXdjUlRoWUlZYlFwT3F0RFl3ZnZQSGw2NHpkSW4rUWxTVTRWU2IwbzFPY3BhR3lYVVNTSVlLcFVhU3MvdXl6YVFjV1EyVThjMmhhRGdhSzl4V0FjUFBHc29MVHkvSGRVUjBzb2RCbXJkeXV6UWVBYmgwQVpjZk5qUUlCb2d5clA3YjJVTFRGQ3YrVkJtZmNCVVFRZkVCKy9MdzBybkgvR0FDczdvMnovWUNwQndGMnFyZEExYU42T3VrWmc1ZEs5QmdSYzRSQ2NjT0RoR3VvdHFISkFGTlUxNWNPQ1pPdXJtRUUxazVMejcySHoySFdaMzdkcS9jZ3lPWm5Md3VTaVVPWnFZTG1ua3NvaDMxUUJ5cE5DTU11UE4ySDNkWDZYcFJXWmNjdDJCOTVmY0QwMW91ell5Q2p5c3NTcDY1cUZDWXBvZ1B5eThIVXRmMXptb29aY2FOcy9FUElrZENUQXg2WThqZWFUT0cxQVpHV1dWSmRQeDBhYkNyTml2Y0pWSzl3K094UlJVZm41d0g3VGt1ZVZIczI5b01ULzVYUTg2dVRvNU5aQ1JnWE44czRHS3dpYng0MGpKMkZEQmRkTTNEVGZQUU12Skd0WllxUit2OVlpV24xNXZGWXZGN1hPdmZrclpvVXMyZ0ovUDllQUF2MlJlNVB2RHhUQU1aK1dWUk4zcWNxckZCZWlnOHhNV1NmQlRVbDdoOVpYbEZGQ0dIRnY2TXFBNzFlSzVrNmw3N1I4Y1Q3UDZzZ0czendOb01FQU5EWnNYcTNoMTFPbzBkc29RNzBMTHlqc3oyNk1qbFV5eVBGWFhNWDN0N094OEdSYTMwdUh2MnJVOE9KK2VoSFJ4V2hIZTZvS2JpK1lTdTZWTitHbmhERStuNGROMFhEU2o0NE9IOGowT1owdGVpdlZSZ085Y0Y2M1lmbHByM3hQTDh2a083aVNnRnRiaTgzdEdIMEg0cFlacGRSdVEyL2RLMkJ6T1A1K1R4THhkbnhvOG1pYnd0bGVmWHpuU1BhbDY5dXZIVDFWOWZkN3JqTWFlV0I0K1p0a0M0STRYRGQxVU5wOHA3MEpVREMvb1BoRmZiMDZreitQZXVEc3lXS241V0lXVEgwUXZWcmZQV2orK3BxdEFxMTgvZlEyMzB6U1hOYUF5UE0vSVE3Sjc5TEFCN2I3VzBOdlRhSW9XRnAyOVZac0g1a2ZtS29rUHc3RExVNG53WmVkZld6YjZwOXR3QmVKTFJmM3R6SXBVMlYrWm00SWtLYnA1NDhWcFF4SGRBUXYzOE9POWkxeFgvQTZ2NDgxd0piL3ZPU2RCL3RYWitaY0w3N1c1a2xWczYveExFRDkzamJzcTNmMzk2a3BLV3VXL1NOSnYyRndBTTFScTJFQ3BkL1QzOXJSMHR4ekxycDZWRHhKZ1ZZajN6aXRueThsZnRmQ3JkNVI5TzVlL3ptR0JvcVZuaWU3RUoxNm1TeXJnRVRaOWdUVDRQQ0p2NmU1cGtVZlZCZjZzdnM2eit2R3Y2cGE3N2VrV3V3TkFtS20xVk5wYVJPa1IvM283MFA1Rnp6WG02UVVUTWNpbVhOVFkrOFh1M2QwdHZUMDl2YjMxZ0QrSjE4aUh4WmhGUEx0bGNOLzUrUExqblYvUEpsV1FXTHlPcGFYZWJ0bUVsbjY0RkhmaXViUTYwd3ZBSHZFM0xUZDE5TGIwdHZUMzYzNWlXVzY1d05PVndYSFJQdjJWbExhem1wdjJKNHk5NjFqcTcrbnBWdUlYanY3UmRNTzk2WnNsNW5UUGVGR0hFRGUyVCtyc3R6b2VqSGV5YUs3Zy8vZzFTU2VmZmxCM1QvdjZzdlBscDdEb2FrVmE2VUpQSXh2UUsrR0x4a3hzYkU0LzFMelhwbWJUOS9vbGNxTVdacDB4KzNiNFdGNlpVT09PME5nWTZlVjJmaCtPbnRGOEQzekRxNnlNUkVVRDVJM0pqZzlObDByTTJ3NTE5QnVkdHNaSDJZOVJzTUdIb1Foa1BoV1RkdmhNZHgrYkZkNGpWNmZlUmVRWTdTd0pDWjhaV21nb29laExEUk1kc04zMytNMHZjend3aDRNdkZvWGtQNFdKYm5RYmlGV1ZnaG5OTVFUb1NoNExkVXdNYlVLQUxCdHdrM2NPamlUbFgxNzA1OHdGL2VITHpqdkZSSE55Vm5tQ1l2V1R1ck9ZL3lZYi9RaERZd0VjT2cvalc5bUlhUjRXUUVDbTNxTjh6UGtKYjVwUXZSTVdrd01ZUmZ2aStsZHpwc3lIWTNTNTRrU1FHOU1zUGk1dE9Pa3kxRTQvR3M4enhqdEhOK0lRLzFKMjJsWWEyd1B4WHRZOW1NYzlZSytiQUhEOHVSbjJxYitMMUNueGxNM1I3QURuRmR4a1JybXBKR3NqeTFsRkxUcFY3VTZkOHdpMVQ4U1IrSTlmS0ZGWTB4QkJFSms4L1o1RmZCbTlHQ3Y0c2ZOT21CcTlmQlk3ckxMQnhuaU5JYzBobStZY2tIOTh5TXpRcUJrbWE3ZUUwZXBvelljUnZxSTdtaWhMbVRyZSswbHluc080bm1ydmx3ZHFYSXozYU9nZURrdFVVRlpqQ0N3M3phYytrNkR0ZFpIaXJyOVNmSlFwbi9GbWRFQ0dsQm5DeVJ0OCtzSitFYlFadW9kemdXQnNPTHZpQ1JxamMwbm42ZnA5bHQ5NjVpOFJzdGVJR24rQ2V5dVJiRzRNeHNabko0N2VUWkdoa2YxeDRhVndOdWU1TFEwRG1ld1BOT1ROb0RXbTZwTFRYaTE0S3huWmhqdWZ3bDlyV2FkelZhdENmYnBqZzhTZXRxTnpkelB2UzNCOENDZlNSSERBMm1nY0ZHdUpNVk4wMXJ0M2Y1bWZQMmJVdXNwdk95UGZhb2JyWjZzcCtVUHlxWVZUZCs4eUdSSUprQWpRNW8waGJXblVpUHc0cDd6UGVvR1R6alFmaDVYS21QbzlHTEdZTytoczFYWUwyNzVWcHg4L0s3RWs5ZFlRR3hmQXhvdHkyL0ZnZWJ0QTFMN09iZ3Yxc2ZOak1TdmNuUU4zQXhZOFY2b2o2YUFhVFEwOWh6a3lJZmt6S0dXZjE4S1F1N1pJWDlZaUtucENsQkdXNW1QbStQb2EwN3VFQXY0bUxrYjJQUnFhMWdOQVZTNnkvU3dyd3oyYkpSdWNlYTJHY0JNeEVVOTJaZy94S3JhRTY3anhQMnlKdkl0RDAraGVHeG9XYzJVcVc1VkJYOUJOLys1MHZyeVQ3cDlzOEo3RlBxczVJS2NheXpHUGhzN1RNS3BoSXNlVmI5QUZ6bnc2VEFub1diSHNpWUdLblN6MFhjcTJNYlRKUmxJVGVYS2I0WVRXdlE4OXhmYnFSekdzRG5OTnlWUjg1d3ptbERVeXd0MkdSVVBTUndIOGtxc2hiRS9BN2RRRlk2MStKWGs1S1ZBdGhwK3pzV3ZhL0IwejZma1hoNTRqYVVRVG9ycDdEbXhjdnhuNmllRlRtR3N5cVlMU2NLa040dmFkYzFnV1JKYmJROU13QXBURlVSd3pBblJhaE42Sjk4T3NZdnVucjJINElWTlhFYnpQcW9qWllIWW0wRGE3QWRIeG9ZY1V6cGNhdklTSFA4UU9ZbUUrMXVoM2YrejhxaDFyemhrcW5sS1BwK0Q4Wk9kbHZHRzRSR1N6VUNxUmwzTEFNazhWVzFsM2JxZjg5YS9PcjhMWWJQVjAxd1crRG5QbVdjdURzcWl3REdmTEZ1cHVQRHFwcng4Rlk3YTZXM3BhY2owL1h0K0puaEg3ZXg2UCtjZ2FCQzQ0MlQramxYRXIrNGNkeUd1Uzc5VndxNldscDZlbHBTWG5jK3NQZVNoUXJLck94MHMrZW00bVBoUnRGdmgyWDkzbTgrcktRSUxWeHgvd3Q5RVdPYU1zWjNGekxrTWM1VFhGSEQrZTBJaU10WU1jLyszbnVDQWlHbkRUcXN3MzJYbVYzM01rbFBXMlNPUnlRai9uSXZneUliY3BrU2dxNHIzaGtQeDI4VGtBTDhINDJ5Ty9EZmZkdXpvM3lxckJhdms5Y2Z1NzFUcEVkMjlMUHV6MmcxNWNvTGFtcFpnOWIrSzVnYTcrTnMyK0FQQUdvK2dVbW42M1BpTjV0WFFoL25LQ3Yyb2Ria2RudnZVci91UnFuWCtCcHZvYU5IaVBVWVNmclczUXBJZHBFam5YMS9XM2RIZjN5S1dMTnpuQjd3SWczRm5ENlhQNnJvMlNXWkZWaVFobWh3aHFjTTYzUEpYcXU1YUV2aXJPNTU0TUg3VVUzcEdINnRyUnFia1J6NFBvM3MyQkZhcXljWS9aK2ZNa1dvMHNwbnh0bUY4RjlSbFY2bWd4SmFlbGxMZnI4UUdaYlg4MUo4MEV5NHBYNDVLTlJ3dTRsRjhTNEowbDh5VExzVHdGRHN1YStWU2tGOFltTDNaNDJDYzM1dVFZeDBFR1hUVWNvM2Q3MHhCZXZrN2JQUE5USGtmZU5ubU05Z05oOUN0VFdjZXlaOXUzQkkrblFZM1E5Rk9iUjFFWmNnZStMV0pnSnBjRmJTUHIrNmxaTkYwajN6eG04Y1dIcFo1ZUdSelVzWEE0aDhuL1ZpNzd3TERWMzE0Tnp4dWRaNXgvcnBDd25Ja2FjY3FKeWV0V1N6dWtsK3Jwem85ZDNjK1BlUjlkZm5kMUJzUU5wTEJPT20xUy9tQzJ6OU9TMElGU2JUbTJUWTU3YVBtOS9sNWhMZk12dk1teWY0VGpqcno1dWZqeW1zVXI4Sjd3dzNPVXU1enRjNnhYSnBZVEZVZ05FMzZxdTdlK0xBVlp1aVpYeHVkRkdWbEp5ZDlCTWpCOVJQT3p3VkxPTm54MjJZRjh5MzZXdWp4L1pYQllBQmdmbnF3ekxURlhJVkVtV0tmYm1GWFdVRHJ1aHUzWmp5UGY4Vkx6cnVPTDkzQ0N1L1RJOHozN3BzYy9Hcm94bFdrWmV2N05CcHp0TzhOYXA2L1V6cmU2dnFQZ2FUQVVjL3UxSWY4QUFBTUpTVVJCVkF1ZTl4QUZiN0pWK0hSaGJtZS9VK1VxNXpnS0hIK0IzRExCK1FsdWFkUmU5U1NyN0VqWmIxd1hCbE1RVXVvZmhpaExkQUoraDltcU9oSW1kcWgwR1VoV0IrQXFrLzhJeDRFTmxPVU1DbDVIcnNyT2xLUGN2anZncExtaCtYa1BvbFFNdHdheXE5L1pjZzNEMXNSTXp3aW0rMHIzYUJ1YXBqcHluSGFrMEh3c3lOT2l0UWNSdlp6NThOd0xhR3BkdVBLdmdLKzFKQVcyc3FTbmJZQk42SUIvdExtWjlOeGlSemZuUVY5dkpoalV6RWQ2N3p6NCtGUUZLOU13ZmJDUXNIcndvNk1ibEx5NzdtR1dhbzZmbHdtdHBYc1BONUl1eC9tdXEwRCt1YUtuOFowbjlESnV5S1FCdWZCNEx1UzRvZnhnalYyMjBmaUkwT0JjRDBNTjNrbkUwUHo1d1JwN0ZHZTRtU0ZobVllellSSEFKOHhlWlR5UWZLZkxDaE96ajF5bkpzaXNBWm1HZHk3czl5Q21KUEhmeUt4L0o4dityR2ZScmhaRGxZWjNydGpMWUtQZDJZbXhYZTR5WGp1Y1Y0OWVWUWxWcjJXeW9CM095NitEV1NmWXdiSWNaYkRHRjZ4UktSb25aYzVhZk1Yejk2d3o3R0I1dytjN2pPS2lVa3FrL1pDVWRMYTR5anNFUzc0cm9YYWtEQkNEdVgwa2RQS2h0M3JkZHl0a3Y1T3ovWUZEUVRNbmxKNmNXQzBXZjlXN2ZpNTIyQ01XWGFacW4yRG55c210ZFVjOXpUc0dBaDJDTlNiUjRXbXh4OEp0RlAwSERVak95b3pqZmt1TUtGbFkwcGN1Q2k1TTJWNzEyTElJa0NkOXJuZ255OU10OHh4aks1eVBlRHM4UHl4U3l1L0pzTVBzWUYzVytDTWloTFl0OHdTOTlhWDByQzBSbFgyZ0xQZHpUNnplTVZyN0kwai9pajBIZnJWN3lTT2Z5bXg1YU9VUXRtMzFKeWoxandEL0ZCTjd3NjF6SjNlMUhWcTV6cW12c3NsNlVWdk5NV0VIN1FHTi9TR0I1ZFBQMjl2YjV6Ni9Qb204YURzME1zQWIwQkc2VjBlZUZOR1pNeGdjL1lGZXlpbXdHaVpMVHhoUFpUdjU2MncvYjU4MzlZUEhVblk1Rjg3Mjl2ZjNkOHZNcW9SMHNLZGJRa1ZhV3BiNis1ZjZ1MGQraUpsTUwwOHhZVG5sVXZLZnp0RXpRT3U0N1BOZkthL2h3YW9mVWpNSVQyN2g5ZmovSnJJYzViUE9idi8xZGEycnNFOXVtMVQrZncxV3Z2TFR0dUJMalZzbm1ITDIxZmFIOEVQZXl5WnJsZjhEYmdKNFN6dUp0TG9BQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSIxNTYiIGlkPSJwYXJhbGxheF9zcGVlZGVyIiB3aWR0aD0iNDQwIgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFiZ0FBQUNjQ0FNQUFBQTZYazRWQUFBQUEzTkNTVlFJQ0FqYjRVL2dBQUFEQUZCTVZFWC8vLzlObWNDVGZtdVVlMk9RZDJLTWRXR0djRnFFYlZxRWExSk5tY0NiaEd1Y2YyaWJoR3VjZjJpVWUyTkhoYWlRZDJLZmluRkptOGFqaFd1YmhHdWNmMmlEZVcyUWQyS0JkbXVNY2xxS2JsbHpZRXhKbThhamhXdWJoR3VjZjJpTWNscUtibGxKbmN0RW5NdWJoR3VjZjJpY2ZXS1FkMkpDaGF4Sm5jdEVuTXVqaFd1YmhHdWVnV1djZjJpUWQyS2poV3ViaEd1ZWdXV2NmMmlVZTJPTWNscUtibGxJb2RHamhXdWJoR3VlZ1dXVWUyT01jbHBFcE5kQm9OT25pbXVqaFd1ZWdXV1VlMk04aXJpTWNscHNXa2hEcDkybGpYT25pbXVqaFd1bGhHU2VnV1djZldLVWUyTTRpNzZWZUYyVWMxbU1jbHFPYjFOQ3ErRkRwOTJ0alhDbmltdWpoV3VsaEdReWk4V01jbHBQcmR4THJOMUNxK0ZBcXVNOXF1TS9xT092a0c4N3BlQ3RqWEN0akd1bmltdXFoMm8ybjl1amhXdXJoR1NsaEdRMmx0S2NmV0l2a3RBdmpzMHlpOFVxaThzdGljV1VjMW1UY1ZScFVrSmtVVUZhcmRWVHJkaFBxTlN2a0creWozQ3RqR3V0aVdlbmltdXFoMnFyaEdTZWdXV2NmV0l5aThVeGlMK1VjMW05cG9xOXBJYTFuWUpncmROaXJOQmFyZFZxcXNlem1uMndtWDVhcXRDVm5aV3RsWHEwazNOYXBNeFRwcytzazNhMGtXNnlqM0N2a0crempteW1rWFpUb3NpdGpHdWxqWE5TbmNPdGlXZFFtNytuaW11cWgycWZpbkZObWNDcmhHU2Nobk9qaFd0UWxyeDVqcEdsaEdTYmhHdVVoSFdlZ1dXbWZtR2NmMmlNZ25pVmdXMmlmRjJjZldLVGZtdElqclZDakxTY2VsdVVlMk9EZm5oQWlMZVZlRjJQZW1SNmVucVFkMkk3aDdxWmRGbENoYXlVYzFtTWRXRTZoYlowZVh3Nmc2K1RjVlNNY2xxT2IxTTZnS2FHY0ZwcWRYMktibG1NYTFPRWJWcGhjNEdFYTFKZWNYK0VhRTR5ZWFLRFprOThhRlNEWkV3eGRKNVJiWUY1WkZKN1lrc3djSloxWVU5RGFvTjVYa2x6WUV3dWJKTjBYRWtwYXBNNVpZRnpXVU5zV2toclYwTXpZWDh0WDM1cFVrSm9VajVrVVVFcFhIMWpUenhnVGo5aFREcGJTanBSUWpaU1FqTk1Qek5MUERGSE9TMUNPREJFTnl4QU5DczlOQzg2TUNvM0xTZ3dLU2t0Snljdkp5VXJKQ1IvN2k0d0FBQUJBSFJTVGxNQUVSRVJFUkVSRVJFaUlpSXpNek16TTBSRVJFUkVSRVJFUkVSRVZWVlZWVlZWWm1abVptWm1abmQzZDNkM2QzZUlpSWlJaUlpSW1abVptWm1acXFxcXFxcXFxcXFxdTd1N3U3dTd1N3U3dTd1N3U4ek16TXpNek16TTNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDd1N3U3dTd1N3U3dTd1N3U3dTd1Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9XQlZWbGdBQUFBbHdTRmx6QUFBTEVnQUFDeElCMHQxKy9BQUFBQngwUlZoMFUyOW1kSGRoY21VQVFXUnZZbVVnUm1seVpYZHZjbXR6SUVOVE5BYXkwNkFBQUNBQVNVUkJWSGljN1owTFlGdGwyY2U3RFM4TXhzZGdFMFZ3b094VFVXRnNNSENJQ0tLdVhKU2JPb0cweFNHS2pHME9BYm1vM053WUtEYlluS1drQmpzR210b09FeVhJR05SVXZyVk9Pa3RwQ3kyakk1aG1UYnV5cERsalkwM3A5N3ozOXozbkpNMmxKSVBtYVpxY2U4NTVmK2YvWE41emtwU1VIQkIyME96WmN4YWNzdUNVUmFXbHBZdGdZUGJzYVlYZXBhS2xzdW1mV0hCTzZROSs1TEt5SDVSK2ZrYWg5NjlvWnB0eDBqbmYvWVVsTWNsK2ZzSGNRdTluMGJoTm5iT2c5QWUxNHpFanRzRno1N2tmS1BRT0Z3MTB0bUI4bVFtcjlTQzc4OHdpdW9MYTFMbm5aQUFOREdQekJOcGZXSFY0b2ZkOTh0cU1MeTdKQ0JyajlrSTBGdFAxZ1lXRjN2OUphVlBubHY0OFUyclVUd1pqY1YyUDYvSG84WVUraU1sbnM4NjVQWE5xTHBjYmM5UDFXRHlPNEExL3ZOREhNY25zODlaRjJ2aUd1TFdEMlBTOSsvZnBNZEJjb1k5a1V0bWNMRnlrQU9jSFh2cklXQ0l4c2djR3ZsYm9nNWxFZGtyVzJMRGdRcm9PM01iR1JzY1NlOEJaRnZwb0pvL056WjRiaW5CK1NFdjJBYld4eE5qWTI4Q3dLTGs4MmZUTXFqYkZVRXJaQXdFT21DRkxqQUc0M1lVK29NbGlwZGx6UTU2eWZsaVB2NFg4SkxiOVFLNllXT2JGRHN1Qkd3TFhvc2VHRXdrYzRaQzdMUHJLZk5sWGN1Q0dRdHgyUGI0SGdDVkdzYnNjM2F2ck54WDZrQ2FIM1pFanVLR1l2bzg1U25qWkg0OFZTN2w4MkNkeTRJWnprMWg4K08zUlVVSU5uT1hJY0Z6L2NLRVBhakxZb2x6QWJZQmlJSzdIOWljZ24wd2tjSXdiZ1JxOG1KM2t3YzdQQlJ5Nm1oT1A2WWdicVFiQVl2RjRNVHZKZzJYYlI4bkF0VUg1alpKS3ltNXNiRTh4cmN5TFpkOUxTY0MxQXpod2thT2pPTVNOam8zdTBlTS9MZlJCVFFiTG9kc0VnK3ZTNDNHZVVpS0w2M29SWEI0c0YyNElYQWRVM0tTRVN5Undjcm0zQ0M0dmxrc1pSMXhsVEI5RDVGaUdzbmU0Q0M0ZmxxdXJiSVAwSDRVNDVpNkxNUzVQOW9NY3diWG8rdkE3Vkd5amtGNG05c1NLNVVBKzdMczVndHVFeWdHVW1JeWk3a29BRnl1V0EzbXhuSHBPMFBYdm1CNGZTWkRycU9nYXdUdmdPb3MzNmVYQmNyajhUZTd3aWc3cisra2xuVEhjNWFYSGkxMWVlYkNwYVg0NndNbzJJSEI5cUI3QTFIQUh5djZZSGl2ME1VME95L2pPWldINEh1WTJkT2ZDS0hhVHlHSHVMZDY3a0NlYmt5TTR2eDZMN1VkT2NoVGpBMDlaekUzeVkxa1hCQnZJcHowRzlmaGVFdDhnc3h5SngyUEZFSmNmbTVVbE56Zmg1dW1BQXVBZDdDZEg4YldCNGdYd2ZObm5zd05IdVhtOHd6SFVlWUp2R0JvcDNpdVVUNXVUVGI4WEU1ekgwd09KNUg3YzMvVU91cE81ZU9OQy91eVF6UHRQYWprM2oyOFlkTFlmRmQ5NzQ3RllVWEI1dFRuWFpxczNzRllBRjl1N2Z4OFVCdnFiaFQ2U1NXZHpNbEtkUjdGZVFCWkRINC9UbzhXVU12ODI0NHZweHJwYWo4R0N5RnZHOWZodzhST3BoYkZaWDBuajVpRVROckRtYUZ5UDZUODl1dEFITUlsdCtuaGZ1bUNCRFZtZzQ0cGM1WGJFRWNkODhwT2ZPdkhFWS81blFvNWtFdHFNazBwWnN1SjJqNnMyYkhlZGUxUU9iempsaU05KytYSmJ1UTJzdkx6TVp2dis1ZC84Nm1lSytMS3pHU2VkOGQxZnVPdkJFSmphMmcwR1ZBME45Y1E4bmp0em9YYndNYWQvM1ZaZVZsRnVRMzlsdHZJS2dHZXpWZnp3aHU5OTlUTVRkemlUekE2cFQ4dE96bkx6VXdCYVdYazUxaG9nS3dPMWxZUGtrT29xeXN0L3VITGxpbThXMldWbjZZRzdLSnROVC9uVWx5OUQya0xra01qSzhUOTZZSVl3OFAzbEs1ZXYvTWxYaXo0ekM3c3pMWEMrakwvRzYrRFBuZ1dneWl1UXZJakdzS3NrbytYRWIxYllnTnhLWUZlVVhlWjJWM3FTKzNSR0d6MzR4SzhqalZFK2pCaVdIRmFiamZoS0NIYVlIS0Q3WGhGZGhyWnN3bjNsbEUrZVZVWjRsU0UwRlFoaEJYREM0UTNUb3krWTdROVhJbmRaUkpleHBRbnVyblMzZDh6cGx3RXM3QnJMeWxoY294NFNNY1RScmdLbGwvaGhLNytCU0E3c204VllsNEZkbEI2NCt1UFMyZGpCbjcwY3lheU0wcXF3RVY2a0FFQVNoRUVtTjF6VUFkc2Zyc1MyWXZueUlycE03Tncwd1gxci9FMGRjMVlGSlNJbElyWUtDaEVxT1F5THVrcVV0WlJoak11cDRsWWdmbDk5OTQvNGZXSm5wZ2x1UEY4NTVjVEx5MW40UXVrSGZpWWUwa1lyT1JiZ3lzcUk2cERuQkExZXY1SW1LUGpsZTBYUnBXZW5wZ211UG1YZnlSRmZ2cXlzekNhbEhzUmI0amdHY01yS0tGUThCWGQ3b1FFY0EyM2ZCMmpMbDlNNFZ4UmR1blp5dXVET1RicUpLWkQ4WTF3b2FGV2dCQktSdys2eXJJSm5rallxUDZaTEV1R1EwMXhPOVVhRXQ3d291clRzdUhUQkpmT1ZSNXgrR2U3S3dqS2lBSm5Dc01PMHNYNHV0RVNGalVSQWxyNmdseHVvMUpqa1ZxNHNWZ2JqMitIcGdyUDJsY2VjSlVveUJLK3NERFJIMGVBWVYwYjdUaWdtaEJRWEF3d3R6TDJCUWFNVlhkRmRwbU1mU0J2Y21hWjFwM3pxNjFoVVJHaTQ0SzZ3VVhWVmtIU2tnbDRXb0I2eWpGSXVzNG1jeFhiOWNsbHY1TFhvTHNlMXRNRXRNNnc0NWNUTEtMUUtrb2lVRVFHVjJjcElueGF1cnl0UXRDdkRBaU9kelRhTVdzNWtybWZFaEsrRTRxQkliaHhMczdNU1RQblZnWU5Qdjd5aW9seEtPQ29xU0Q5eUdWVldXVVVaODZGb0hndHlWSS9rRWdIcHg3eCtwV3lNM2srSzVGTGJzclRCblNwV091SXMyZ1ZpWTMwZzViUjJveTgybEZyQ0U0dHZtRm9GelZmb2FyUmlLTCtlc2xwQmFuQWE3MWFzS0tZb0tTM2RQcS82K2p1L3NmanF4WXUvQVk4cnI3cktScHFmeUFrbEpUYkd5TVpreHk4SDJPakZieVk5UkJHVkRUU0p1VjZJalNDRWttQUZHaXlTUzJGSFhwZzJ1SHFId3c2UDN6NXczMzMzcmIwUDIvMFAzbnpMTGJkY2VTVnd2S3FDd1NLbEFldEhyaUJkSmxEUzJmQUY4REpTZnVNMGhYUm0za0QxUnZ1K2xtTnlhTGpvTFNXYmV1U1JKOHliZC9ZM0ZpKzkrdXBiSFdDdTlNRzVHRGJHRFFiSTBGcnlkUDk5OTk5eTh5MVhYWGtsOHBJNGtKSCtTaFlKY1RKakl4a2xtbDJCVTlBYmxxK2dsY0J5MG9leWtqT2M3T1NtSDNuc3ZIbUxGMTk5dGQxaHg2cEJUMWcvRHZ1NjlNRjVLRFpyVzRzZWE4a0wxZVA5OTkrQ0JJa2RLN3BxWU9QWHcySENWVDhqOXJ2bi92blBwLytKN0xsN25ydm5ucnZ2UmdHT09zMFZVd3JkZElXd21ad1dBc1NJMlNrd0IrRm5kNlFQN2s4UFNDcFRFS240MWlyall2VCsrNUZqdlFYQit0MUQrTzkzRHozMHU0Zi96MkQvQUlMM2dQWldyRmkrOG51RmJzUTgycUhIemp0ajhiZVhFbFlVbDRPK0NHeVlKbmxlNTNyY016NjF1ai85OGRHSERJZ1FsTFgzU1FUWHFrOEdwR3VWbGRlQ0lHKysrZWFmUFl6VmhvQXArUDU1ejkzSWQwNkNQcFRwcythZHZYanBiVVJWNU9GZ0drUEk3T1NaRGlpaWd5RU4zUXViR3Rzamp6eHNBbmVmdGU0azUybXBQUm51NzU5ODhtbGtUejczOUhQRUNFZFEzajNnTmQvSHFlWDBtVURzYWhHMnFER3g4UWVoU0wwbDA1NkQrbEV5NG5SWjh3TnNqejc2eUtPUENCSnJpZHBNek5aSzJoUC8wb0pyK1dRNitpaUNCZy9LNzJreSt2VFR6OEhqdVh2dXZ1ZVVZMmNlT2JYUWJUekJOdk56b0RFSHA4SndNQ3AyaWFQaU0rMks0dGdDd3FGcVRsZHRyU0NJc0QyQ0h3OGFTQmx3eUFxalUzNFA5dWpmL3Zia2svLzRGOWpMcjc3NitxdncvL3F1WGJ2NjBYLy9xNisrOGNhckw3Lzgwci8rQlo3eWFjazR4aitSbmJ4MTZkSnZMMTU4OXJ4NW56dnl5RU1MM2ZEWjI2RW5uRUZFWm1mZVQwUXdPL09RZHNGTWNZc083aTBaWDdHK1FZeWFjOTF2SDNnWURBRjQrT0VIZWZKb1lRL0JJbzhBb2ljUkl1RHpPbkRaUlFtUlZ6SU9MM1FTZm1XemliMyt4aHN2di93eWJBQjg1Wk5QSXhVK1dhMkVhWHBtYWt1WExsMjhlUEc4ZWZObUhqbnJ2U0hJWStjdFhxcGxyeVo4MkZ5T1FxdXl4NVJXZ2dMQVdrMFBBaVlDNmFYWFgzLzFEUzZoWFl4VnY0UmtKNW5XVDZmdEZLQVlXdkxZU2NaMjloUEkvZjJ2di9IeVMvOHdPblR4SWc3aFZzenhqSG56VHBnNTg4QVQ1UFRQbmIxVWFtYTczUzZVaFllWnBwVE0wVzZYRGxFa0sweGhLajA1ZDdFN2Z2c0F6ZjN4ODROSVVCalU2d1JMdndHQUVCWGoxcy9JOUROOTliT0Yrdmx5UW9Ga25aMFNVVFNyeHM0OWlKM3RvOTB1T3hoNlJNTFgzTVlkNjh4Wk13c0xiZFlaMzduVklVaklzbENIcFFNeHpaTlRTV1ZkMVNoSlVtNC85UHRIUVZndjBialVMMkJoRnFMTm1YSVVwTklJVnlERmh0ZnRaNjRURDRMU0VMVitCaDB2dXZQdjhvN1p4ZW1tK2hHTFF4QmgzcjUwNlRYRXNSNDdhK2IwUEZJNzRleGJ4YTZySHMzWS9sa2ZtK3dsMFdEbEEzLzgyNzllZWxWUUVHSVJVdXMzamxCZjJNOEljVHE3K3Z1NWgreG43SVJ6WlZ2WTJTLzVVWmp3eWhQS3ljWU9nejNieGY0cWgyYm5oKzR3SEI0KzRsdVhYdk1kSXNoWjcyS21jOEozYmpNaGtvNUJzSkdreE9jcGFZakttcnRNYVl4dXBHRkx4eXU3V0NPSzV0L0oxZE5QZlJwVHhpN2gzdEJpbkFpUlVqK2x2NU9LcVI4dkw5Rmx1UHZsYytTL3J6ei9aNFZGMHZNMTJXbk1ZcjdLVlRsdThuTE5OZC9HQWZMWUNjUjR3cTM0UFp6YU9nMVNQQ2ZZT3Z5SEh1cmVhckpEWkpPVVk1R3l5V1FIRFlzNHV3WUczdVIrRVRmeVR0elMvWFNjUWxCZElzMDRjRnJCVlNQQU14K2ExdG53MzlkZWZQNEppR3lhZVQvRmVTYWEzcTdSZzlQVWs1VEhmcWxWRFBRMTg5bWdYWE1OYVBGejJTTThhTmFjQmZOTHgvK0psWFhybk1vYmMzQ21STkh1a0p1Q0hhM2lXUENydStIdm0xOTg4YlhYZHJJRzMwWGhHWEozUHFGZlRrcjZXWDdaVDVVbGdweEVxSitubUV4bS9idGVlKzJWLy94Nzg1L1h5K2VabEN1UmZkYzBBMFhwU0JVSHc0U2xISnJaVXB6MDRFN25uWkFKdjBQbXppLzlVWVpmNCtUa1NHU0hyL0ZwbXZGSU5iSFBWdWNwMmN5Nnh4NzcrK1ovdi9qS2EvL2w2Y1JPcGlwR1pLZWd3dEpHbGorcXBDWFBTSlQxR3RoLy9nT3NOai94MkdNMWJFK1p1K1k3SXl2UExyR1JUa0kxZ3NrRE1tSk5MQ3U1VDZVL1YyNGtOdUhXNzV4eHdyZ0p6YlE1aTc2YjlUZk9POFdiU3lDTWc2bGR2MmF4UERtODlZODlzZmw1TEVTTENFYkpxSlUxTDgvNkVTS1EwNHZ3dDNuejVyOC9CcHpVZDlBTWI2Y0pvWEVCR1JLUmlUeEJaVjlrNTQxajUrMWhSL1Era2J6T24xWjZlN2JRR0x0eGt4Rk5ucWJ4cHFFdVUxcURQOFFXTkxhb0hhU0k3SW5OMlA3OUl0aC9udDhzMjUvSkV1dG9HMDlJK0xFWW5vQXowckFDTzExVTc0bUhyem5qV0V0dXMzTDZkUWVqN095RzNTdG91RkQySjcwY1NScGxPNjBSQWNublhoNU9Vc1VkM0hhMm1kMGhFOEhONWZHNHlmc3FJU0FYMDZ6R05IbFVTNzU0VWhQN1pMMkNsbVR1K0p1M214WXg3NlF5VDFPejEvSGU0Zll6Vko5NVVFNC85VWFOZkZsSjByZCs3N1pXTWt0OUhIenpGcGJ5YkRabTMyd0NYZW1jYVJLNEJibGpxL1Y0TmdWM3Z4bHBjNWwzeGRNV2pBU0RiVzJCVFI0UDNSVkZsZFFQcGRFTTVpTXpLazZUanBjcDFIeE9hSnJHNkpwbUd0NVNuYS9KMjArOXIxYmVRbU5IcWlVN1lEWkxTN1o1MTEzaUp0T3B0K2VLamZ6NDh6RDZtcnVoeDFuYjBMZHlkWVlqa2NnZ3N2QWd2RzRQdHIyd2FaT25WbXBYdHErYWVUK1ZjYW54akFldkpXdE9hV3VhdVRrMGVVOE5ydGc4UVRPK3AzbFhOWFZjMnJabVZydFlTdDE1dmhHTGhUMWU3N0pES0xoVGN0YWJ4MU0vcE1kajZHdnVZbEczY2hTMUlVU0wvaU9BRVVJd01oZ085bXhyM3VUenVPVEQxNVRETll2VHlEZEpITFFVaE9WcHJwbHd5VnN3bjByRzA4VklqNnVldjU5MUVMQU1DV3hOdW1NV083ekJDM2JYeHdpNFhDTWM2SzFoS0s3SDBkZUJna1hrMDhVVkhDUnFHeVRrQnRVUk10NFg3R3hyM2xUdmNScE9UK1dvTmU1bmt1aEtvczNlMy9JVTUrcE9HaHMxOGFKdVdqa3ROT05xeVp5bzdLS3RkdHpCZHNpd2t2d21aTGJiZzdoNWZYZGh6YzNJblpzbkNGNXllTy8rdC9mcUlMdUFkTHAxRXJWRkpHSlljYXFGdzFTVU95QVVnaC8xV0o5dXBwYVFYWXdtUFpTbVZaYXhFSmdzRzR0MXBWaHBjcUxLdUh5T0pUdTFsTVhWelJuMlFWa0Q3NFlMcVBud0E3emxSS1Fta0U2MklMR05KQkpqby90aXczcFV2R005OTVNVWtFQW1DekdzOGtTWWc3MFlZYTN4SUNRMXBtMUpwV1dZYXhrMURVc1k5aUZQSHNHSnRlWkQwQWc3OU4xMEYrUUlEaHhsRkFRM2duK2RiMnh2VEIvMjh4M1lnV0JRZGxSNEVZYUdxMDlhSkRMSWwyVm93OXQ3MmxvZ0ZMcU5CNWk1V1lVNGMxaTBqbmJHWlkyNlVNNEY2OEEyL3VsbXBWU25pemhJckRUMjZsdVdlNGp6NEYvczF2R1A0TURmTzVDZ0JCMU9oeE5kK3ZFUkJtRU9qS21LNUptUlNGaVNHUStDaW12RkkyRTBJOUxYMndFbEJRcUZFQXpoQ2Yyajk4SG1RUDAyZUk0R1l4cWVqbHNYejlYd1hDZHVHNmZHMWlEcjQxRUh6L1RKSnRFS2JDazh4b2Z4ZHVtR05iUWY4RS8zUkNOSHpkNExUM1RRdDNHUTllSE5ISnFUN2FlRDc0cURIb0htWkhzQTcrSnliL0RJdEJnN0dQV1g1UGdqdERqQ1JmWDRIdng3WWFPZ3VyM3g0U2c1R3MzWm8vakVTQVFESTdBaXhoU0ZUbGkvdXJLcTdxbm16dTE5SWd1bE5NTmNxMEVhQ3AyczJmRVR2S0dHR3dDL29vZkdrQkkyRHJLVVJocWRya2VhM2tIYmt6V3lnNTRKR21sYzBwNmFwdkUzYy9MVjZUSjhGbjNGQU9oMHlwVHRINTZKQnpVSG0rdWdlNDduSTJJTkFJcVQ4c3BEZVBpREpkTnpFeHhFdUVBOHB1OVBFR3lKTWZUalJSNXlXcm9pSEpoSUlTTmNjZUZCaVIrREcxNzlLMmEvcm55c3JtbnI5aUNUWTRSdFNRcVB3UjVhRlRvMVJsRnFmaWRtQ1ZQZGJ0S3hVMXVMdjFBWUVkQTByamlObmZnYVdZVzFONXFERnlWTGFGakRnZ1BYajFDbVJyWkgvekJxSFAzNE9hU3g5M0x5M1NVS1JqTmRlRGNiYUJqemNXSStpUjNSbnZkYk9TZVYwQm9oU0NYeGI3eVJYK21MeFdQTjVKaDlTaWFpSnBiZ1A4T0RFZVl6S1dDVXV6VDl5bVJyS212cW5tM3EzcTZBeCt1RnVWejdlbWtvRko1TmFoZlM0QzVYTFhJUStPQWJHaHBnY0lNYmd5UnVqdW1PdGpyRlorSFpOS296Nmxlb3BqUUhWNy9HM3RSQmg1bWJwTjZRc1VhRHlHdWhnc29qcUppY296UWRtLzlMSHl3cG1aMHp1T0c0L3ZZWStUMU1rRnhpVHp6ZVEwN1RabzZFaVN2Q0JRTTVpUVZOVlhJbVcxMVpUZDBvQzMvQ0NRK0c2WmFETzlwd0tGekhHNHNwVWFPTjZGd0hiWVcrdkZzNnB4V1FHaGVYeHM4REloWGlqa1dvcEdHTWgxbzBtM3BGVFV6aXorUUZvY0kvYU5JZ3dUQ1lUd2xxc3AvMDNmdTFENkZxSURkdzhQNEI5Q08wQkJ2NlJkUEVQbDBQa3Azc01URGg0U3lNSlNPcmpTWWhhS0F1T1RoaHY2bXNxMnZhaGdpbXlFcEpLSHpjNDJTdWprcEY0NjJwMGRNZG5jVmVuOThQRC9LRTI0eVN4SnJVbUhTRnB5U25BWTF2WEhsYzd3Nk52Uk1XRlJhN3g5dmdoYTJqOE9YemUvRjc0WGRGNFF4UFJxUGtCWFlBVDBaTElmUGlXWDUvSUJ5TlJtLzZXa25Kb1RtQmcvTzJKeDdYcWRydzcyTHVIOVozazBNSWNoOUl1aW1Gb3hzY3BNRXF6Q1FYNFpsa2R6cmdKRGU2dnE2cG1icFI2b1M1dnJuZ2Q2QlE2RWVoa0hvcExoSHVVZUZZYWlFbGFFRDgvRGpHK01rRHM0UVdxd2YvS2tSSmNpQ2FiUEM0NVNCbmN5MFJOSlkwT1EvODlJeEFvM0NPd0F2ZXNzL3I1M014Rmk5N04zSUtJWDQrcER5MElwN1hHaVgyOFpLcHVZSUx4WFFkYVcwTWdRUFZqY1QxS0RtTU1NdjZPWmNJQzBrUlhnZEVCREl5TWJ3bUkzS0tHMjNxN0E3ejgwTktlYmdNdzVETk5BZDhIcGRUVS9NRWpldUY1Z2dVbWRmSFd0elB6MzBpU1Qrb3grdWhoa0tVd0lObUMxNWVDWXlFaWVxYUFQSDVEQ3Q2cVJyUmFsNnlMaHFuM0c3NjBVZExTbks2aUFyZ2R1djZQbExEb1Y5V1RDUkdZbkVDempXK3VnWUZXTjRQSFU3TFY2YXdTdXhHdTRNc2FFcHhWUFROaEVOQlZCVTJlRmdTSWpKM3JrSk0wR3ZRZ1U4MHZnL0poZzF5S0lxNmlJL3pLdE1saU9vYVJGMkNxOStyTElIODVKc0lXKy9QcTZvK1VsS1MrUys4U2ZZSDlEdnJVQXlNa2JRU1FseGlSSThQWTlkZWk1dUtGRzVTZnduSlRTSmNacVppd1NLdnpNNllHeFZCa0o4NHNnc1hWU0VqcHdubmgveWhHNWRWdkFWOTdNWG44M25sZGxiYW15emtsU1p6TGZuOE5NREpNUXhzeTViV2pxNVFLTlM3UlZHbWRGSU1BTGJCK3FwcURHNVJMdUE4bm5vOXBvOGthRmFKZERlaXg0YnhJZGRLWjdrZ0kvVjI4VlJDMGwzR1FTNGRRMjcwbWFiTzdXRlpkUkpLMnNFekdFSTlwQUVFMGNVVEdtRnVpSUZlcVVVNUdDOXpwRjRmMXlTV0tJNVJmS1pmV285THFiR2xwYTJqTjlRM01CQ1ZySzlSQnVkbFRyWU5jZnRERmJLUDVGakllVHorT1BvRld2SWI2eWpHamUxbk1jNXRLdDlFeVIxSjBZUjlFdzVPR0xqUnZ6WnZ3OTB5VE8yRFFvOWg1dFlSeGlENDBoY0NVQnA2NUR3RzVPZHBJSkhJSjNQdythUWtVUUxEdkoxd2dUQVEyTkxhMWhNTVJSUllpdTBPc0szSjRYSUk1dFJWTVhEWi8rb3pCcmRKQjNDSUdqVndsUmdjSENUdnBzS3VFa3VLOVpod1RHRUZIQzRJQmxOVWNoTm12d1kzMnJ5MU81aG1QMm9RVllkRWpJK3Z3LzIrakFkcFZ0bmorYWxIVkVZRExWdmEyanQ2Z3dNRGcwbHB5VFlrVGdwYU8zaDlLRE5wUTlUQVZVSnlVakkzSjNBQlhZOFRZZ2tzdThTK21ENklQMSt3TGlnSEZCYmh3aUxTS1dtN3BMbnMwc29zYlhWbFRkMHp6WjNkOU00SzRTRlNYb01LN3RnUkRvV0NvWjZ1OXZhdXJxNzJMUzNZQWkwdGFLZ1ZUMjF2NzRBbEJzSURRMm1od2hZT2QzZnYySTJHZ2dwM1REQUVrMnVJNERDNGt0S3N1Ymt4T0ozK3lEcVIzRnU2SGlhZXBZMERrL3ExaE9ESXFSM21DM0hMS3poaEtCdEZDUHVVTWw2eGlESWpmUjdqcUN2YzE5bloxTFN4am9pcHFxWVBUUTM0alFaQWU2amdzS3NzbVpyMWxSMm9CdnpjVlNad25FdnMxZlVlQXE1WnVFQng3RGlmNUVrbVRUSERnOEtyRmd5Y3NOVzRva0Q1cUZvS3lyNEN4bmJuaEtzdjNObTl0Zm1wdWhwQ0FqOVZvMGQxVlUwa0trdU94cmd0TUxHK1NsWmN5VUhabGdSUWV2cjBlSHdFWlpPNGlJTW5HSDhCdTBxbmgzaEdjdkJoZXV6aE1PMGV4ZzNBVWdFbDJTdzRPTW5XUUVKYTE0eHJDdE5scGl6QURZV0QzWjFOejI2c1l3Q3FxcXVycXhnM3pxOE9MZHRvRUZ3N1RLdG1DMzJFM3VtVlpVMkFPZzJHNC9IOVk3aXpDenZNZDNROVZrK3pzSkFJWkpsSUx4L0pTUmIyYTRpR2YyMXU2dXp1RHBMZFRpOTJRYkFNZG5kdmEyNzZ5OGFhS2l1clZoUkhucnBoeFM0RHVKNW9OTVJYK2lpN3VYSk9OaDBvdUVNdUd0ZmZSbGQwVUl3RHliMGRpdzI3TUxaMXpnQmh4WHQ5RGZBaTVwTVlCLzVDRTByTGZsTlpXZDNjM0x3Vk9NS2pHeVFKMXRkSlJqcWJrZjIxRGxCVlc4SVNlcFA0U1NTUjVNSit0Ym9QMFp4U0JWZHkwS0xhVExtUjMxcVA2UEY5WXdsQ0xqR2EyS1BId3F6dWNmV1JleWpEQ2pSRHpJK1EyeXdIbWZZR093dk5KRzJyRkhxUkJTVEVROUZVcTU1UTRhWElycnFhRFVHVWUxTUpjbjUvT0JwOWxpOHV3SldVSEpKcGRrbjZWM3NnT3hrbFBTZWpvNG1SZUZ4djRSWHJKdDREcVdabXhreHRrTVZCTlBoc29YbWtiWlVLcW1TaU11akplcjVocExvdGFzb3JvVngvaWk4Z2d5c3BPYlEwRTlYUjN4SGVRbS9OR3h0RlllNnR1QjV6ZzZ0MDRUOW5qem1uNW4wV3ZIS1RYQ2x5bHpXRjVwRzIvVG9GQW10V3htbUtwMlNJMGVCR0FOZXVnb09RdXBFdi9wRVMxYVovTWUxWVJ4eWx4OU13SEl1L1JZcUIwYkVSUGE2SE1ESVU1MXhPZDFCS0dkWGJZdVhZaHk4ZTBKS3U3d0ROVFN4c2pXVmlVVzN3bjlWOGpxVlo2N1Vhd1BXWXdEM082WDYweEdRbnBkY0Z4cmg1UEdFZDkxYmlwSEtmUGh6M3cxd24wMXh0ajBnOXBLd2tIREZtS254a2E2RnhwRzlya29DUS9LT0liWUtuaFhPVVFpQmRCSUpjeUZSLzEvSGxqSXJETnZ1YzhXVW4vWFozUUkvcGUwbVFHOUZqY1o2YVVORUZRcGxWNGI4cE5JNzBiWTJrTExOcXBGa3A1SlpNc1VHVVZob1Z4K3Z2S2d2RlladGJtdnAyUzQ5c1EvSGgyRjdNRFgzU3lpdHp3NitlUUd0UFVIQktmVjExVzZGcFpHQ3JqZm95WkkxeWRpa0daWXJKWTE2bkNSd2tKejYreldUZ1NrcW16VjJTTkZPcFZiaDVBc1Bvc3dQNzk2RlB5T2tkTkw0eGJsaDI2TW5qYjI3ZndhK2Ewa3R3MGpWT0lyMitBNm5iWkR4YmJmUnpDaVZscHRFOVdrM21yTkc2VzlrVkFtNFJsRldPcHpoc1UrZGVZT1V6RGRnODZNTTZzUmhvRGYwUFhTdWs2dVJQMHNyZVFGdFBrTitqWi9yZ3puc25wVVJHMjluZ0w0MWNrdmpNcE02MUdxRnJpa1lqS2pnb3dMZnlwVktDUTNiWW9pVkt1NXVwZ2RWREVSNEhmeG1QNy80UWFIWDIvSytjZnkxbTVoVGtPRUE4VUwrcHBXUEh3Q0N2dlhHTmpvZjZ1cHZxYWlvTFRTUk5xMDRKd3BSWnNtbXFSSzNCUHh1TjdsYkI5VWFqdlh6SmNjRWh3MTlkVTJ2TmpKSUw2ZGhQM3ZSaHNkYU1PUXZPWDJJWktUbERqeS9RMXRzbmtrb3A3UVIrZjFsL3dQT1RrRlFyLzlWR21Wa2xNY1pDZ05VTmVQcFRKbGZaQlNqNXNtbUJRM2I0eWVjdXV6TTVPVThnK09iUVR6OXVzZUxza3hhZGYrM3RqSlpUNVlkSDNRMkIxbzRkMWxjdGQzUTNienlBK1pseG1BYXFpYUpTZFZrYWM5TWs0RnFndEh1Y0xaQTJPRUp2enFublhyaXMzZ3Jjc25NLy9ZRVVhMDZmdmVBclM2NU5sdXdRK1cxcWJ0dk9MenVIeFUyMFdIL05mMTFmZWVCVjVnWUptWUJZakZqWEQ5VkdLVlk5WThvcUc2T3N6eXRqY05TbUhuWHlxV2RlZE5GRlM1WXRXM2JoaFJlZWUrcW5qMG9GVGJKRDU4NC8vOXFVaFVadFBTUXZJVG55RGJJTUpuekE4VnVka3BHeC9EWkJOYVV1OGtBekpDZmtpbHdqR0g1Rk5UblRaRmJnY3JXRFpuOEIzS2NiMzVaUEh2aGpFQzc4NnNJVEdqYTF0QVVIa25TMUFMK25EZ2grcXcyZ1V2aERRMGxuNG16cWF0bUdlMDRhR1RZWVFCZmtvbitnQzFqMm5PVEpEcGt6L3h4d24yNlpvTnNsUnR3dWp6L1EzcU4rWkZXNnFTamMzVlJnZnF0RlA1YXNubXFKa2dyTFdJMVhzOFZGV3NMbWRrTU9TWkFoZVBnMUVCVlg1QXFpT05VT216dS85TG83WEl3VzBoOG5SMTdxSVhrSlJuamF5ZEJSUHdyNVo2SDg1eG9qR2N2eUxidTZIUHhpTytGRndEV1NTaTY2bml4MEFJQWpObTMyRjg0NS96b21OK0k3M1c1SmdLNEdYMHQ3TDc4TmsydVAzZjVYQ1AydGtSbytSVVdYYXRTNEFUWmVBNHhhbU9BSU5uOGp1bDFvQU4vL1VKMW1VcEUzZytMdmdpVy9JQUVQQnowS2tzblF0UUdTbDQ3Z29Dby82Wk1JZmR2enlNOXdQUzRKUG5OdkpSczBDRlFlaGFSeWQyTWpDWERrQlEzMUluTDFWVlhyVHk0MHFDUTJDNHEvNis1d3M2QW5RaDgxVnoxRVAvekJWSjZ5eU5WN2VEQzhQUi8rczlJb2x0eDd1dGpnZHBSVU1tcCtEakJFNzBDNnFkQ0VVdHIwV1NSN2NibGtaakpDMUhNV0ZCOEVaeGRzaFJSQmYzWHZIajg1d3pDd1M1N3NKNkduR3ZLVVBZMkNHbjlsNUQ0OGZ2TVYzR2I4Ny96emwvelNyWmdjQXQwYmNNYzE3MjhSdDByVEVCZ0piOS82ekx2QWI3V3hBa2lqSXlYTkhwV3R3R2FMWDBCakNQMk43ZWhtMmVqQWh3cE5KWDFEeGQ5MWJwNXVHczNsYnZBSE9ucjZlTjFBMDdvb0VRQUFBOFJKUkVGVW5TYnZCNFVSekcvaXJodXBGOENOOTJsWmljM1VVV2xaTklEZ2RxTitFOFpLR0VhNXBiV3I2OTVDMDhqWWNQRjNuU0k3ZzNrRFVMdXJuK0NTN3Y5RC85MWJuNTBRZnIreFZvdWdLS0JRVENaOVZWZkpycGJYQ3VqREEyMkNtOEJIS3ZIR3hvc0x6U0ZibXpGMy92ay8vcVdiZGJxWS9XZXREOXpuRHJWMnB4VThZN2c5UjM1cXYwbVZyQ0FMUEVtRVo2b1ZBRzROWkNib1loemxKRVU0THJ5UEZScEFiallOWFhyNHNkdGwxaDZiQU82enJUYzBHR0YzL3B1ejBPejVyVEUzZmVhWDNjeGc2N2JpS05ZcUtDbmtzUHErVk9pV254ZzdiTTU4VnZ3bE1lRFgyaUg4Sjc1cUcrR0ZJTHI3SmJ4OVcxTmRYV1VtZHlwVmpwTWJWbGNwTHROQ1h2SnlWWTl2Yk43V3pUOUlFbXhNWWU4VGJzeG16d1g1M1pHTUhmYWZLUDcxaXZLUGZBa1ZjNkcwZ3UvdWhCS2ladndjZEUxeUlBWnhXZmMrOHo2U2pVMWJ1NE9HRDl1Rmt6SGIxTmg0NzNHRmJ1bDN4YWJOUnNWZlV2bmhtdEM3Q2ZMUFlNUjQxVTg4WTE4YTdON2FuRUtFbFFZQVNkbndDOXRxcmxsVDkyeHo5NDZ3NVNkOGVwT3I3VjcwUFY3dlk1c3haMzZwc2Znem1SY2lJTXBBa3hZUXBDZ01iN2NRNFJvRElha0xLL1VIUGVxZWFtN3I3ck1HRm8zdUhncjF0Z2VTWXp2dC9ZMk5HMlF2cGRlTmc4L3Q5bmdEcmUyOXdRSDZOUXpTaDR2b3pXanNRMzVVaEtEQzFWWlNzK3E3SWhOcjZrQmZXN3UzSitNRkpYVW8yTlBla2lxeU5kNTczbkdGYnM4ODJ5RnpGdkRpTDdVRXZZRkFlMGVROUtKRkZPVXBWNVRRNTcvRFlRaUhuYzNOejJ6Y1dMZXhybTY5aks1bTQwWTA5ZG1tcG0wQXF5L1ZSMWNId3FHdTl0YVV3TEN0T3UvNFFqZGp3UXlLdnd0K1BKNzdGQWkzNEsrM0dHUTNVU2hmK0pmYng3OHBzSjZPMWkzakU4UFFQdjBlNnVKNnQyemE3QzhzdXVESDZlRkQ1c01xSkFnanBDRE01UXNYQmdkQ3ZWMnR5YU9Za2RuRnB4MDNTY0phbW9iN3p0S1VIMU9oTDRBdUJnYkRHWHh4Q2JYZGtZRlFxS2VuTlhVUVUrMWVZUFpldUFoUUdKdWRnZnRrdGdGMTlMYTJkM1gxaGtLaG9hSElrQm5rME1EQVVBVEQ2dXBxVFNPQ0dYVjJhWkZaV29hS3Y5SjAzV2REOGdadlNUTm9KYmQ3cnpqdjVQZDRSMlFCN0RCMDQ4UTQvRFo0YzBTVEZObXFTeFllWDVSWkxuWVl1TTlrNFMrRjNMSzJWVmVjdC9CanhiUnh3Z3lGdnlYWGJuZ1g1YmJxaWtzV0huZDRvWS96L1dvSHpaNUxIZWhFWVFzQXNOTk9QcnFvc2Z6WXRLT09YN2p3MGt1dnVIRlZWclJ1dlBHS1M4NWJlTnJ4UnhlcnNnTGE0VWNmdC9DMDh5NjU1TktMVjkxNDQ2cFZOOTVyb0lTbXd1UFNpeSsrK0x5RkM0LzdXTkVkSHRqMndUd204djhQa20rckZzS1NuQ1lBQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSI0OSIgaWQ9InBhcmFsbGF4X29jdG9jYXRzaGFkb3ciIHdpZHRoPSIxNjYiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUtZQUFBQXhDQVlBQUFCUTY5S01BQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBSFhSSlJFRlVlTnFFWFcvRWJsZDJYMnUvcnhCQ0NDRWs3a2pkdW5WSjNYSEhNQlZDS29SVXhqQzBPcWFVb2ZwaFZOTXZqYUUxTmJTRzlrdERDYUg2SVJLbFk5SVpNem9hdlZxOXhGeXVpVVl1SVNibWFvaUdFQzdoMmF2cm5MMzNXcisxOWo1dmJqeDV6L09jYy9iWlorKzExNS9mK3JQNWg2LzhLUlVTb3Yyai8yY21rVUlzUXN4VmYyWDl6OC9wLy9aanBxci9GZjF2dTZiWU5WczcyL2Z0NjNiOWRuNzhmdnhQcjRmMjJ0VU1iYlluQ3Y1Zis1SDdWN1hmaGF2ZHNiOEh6KzF0L2RQWGcyczU5RS83OGJqMjR5SG96d1A2dVdMdFRuMXJ6eHBOY1c4RjI5N0hwTjN6a2Q3N3dSalBiWnkxdlZ0OHdmajRlN1J4RW1KcnVaM244Sjc3SExIc2ZhejdQZHM4bkdqZC83TDNqdE1jNWZGcXYwai9mK2wzbnZiMjkrdTJCcXIzbzlKWmVDYis4M1BGeGluVDJUa1NwUTBDaVQwQUwyYkJBYWRPMFAxMkZuaEFoUW55aVdGY0FQdGdTeWZHVXlDcWNSd0hVR3dpOXVQK1BLU3BRSlRjKzBGMFRTKzZUOXU1MWs5ZDFkL3YxOU1QYXg4dTlRbDhSSzk1ZFBSenZGZUJkNlcwUkdMZllFSmdNZGpRd0tRakFXNUV1V2p2TTIzajdmNHU5N1NQNzJ4OTFIN2QwWFkrMWQvdTZuVWY2dC8zOWZQeGVQYTR2eEdKejBWZTZJUEkyM3pVTnA4N3c1SERkMnlMV1B5ZXJXOWp6TWNZZFJvWVJMZS9HOGNXZlF5cTB3bWN0Ym5YcytkRXJiSDJVclc5bUZCcWRMeHJlN0h4NHJTdjFOaUI4RUw3WCs3RFVvRzRxUk9XMktwcUU5R3VMWDNnQ05vYUszUGlvcFd2YWJ1WGRZQTJqblpKZjd1c253ZFo2bFg5Zm4vbUxzaWxrWUJzcExkK0NSS0tEdE5HdkFjVDE4YkE3eStoemNGZGF1ajNpcHZBK2Z1MGpldjJPOWNuVVJMeHhOSGtqcmIzcVI3ZjFxNThvdjI4b3ovZTFvLys1VTlvakoxMFJycU5iU2ZPSVJIYXU1WEFkSERoc2ZXeDJvSnEwck96Qys2MDBOc1M1aFhmUDNqZlFiQmovTnJ4K1dESkJBL2Z4Ym10S0dnV3VBRnlPT25rNTlkdTk1NXMrZ2EzYk53WVdYZ1RxVTRnUGtBTTUvWExBNTN3dGdtNzNNWHFaVDExZGJ4SUhBRHhRVGNGSUl2Zmcwa1FpU0t4Q1B4V1lMV0xjY3BHYUZuOGNUcy8xSXh0OFhkT2cyME1GU0F1RXBRMG9ENXhYUkh5bFQ1LzE4ZFAvdTcxbzQxQTlWaTVMcjNkaUpYZTArbDlmNGhqSnd6dlUxYUpkc25XSlp4SkNLazJya1ZBZlBNSk9SbjBCK2NKVlNkSmROTytuODlDYXJCWWdjRnRFeXpzZWhIRGd3ZGhqNGtiMzIyRjJjbzdXVmVOYTNBUTBQZnJQVi9leEswZVg5UGpLM3I2aWg0L3doUUhQYWdaL2JtMTY3WmIzMG9pZk83M2NoS3AyRjdrcDlYR2IzQUhUbUp4ZlBmM2RYSEhTVVhhM2wzcWdnakx6STJqeEdtaWVmU0JnbUtEMTFXekQ0RFJQTncvVDBaOVZUN1RlOTdXRnQ3Wk9PNm1KdWd6YnFxT2VIZHJ0cGcrSy9acERJQVRJVkd3SVV6bjdHTSsrbCtNNkpGSVY1elo3Wlh6cUdRM3BUbm9LNW45Q2lXaTRERFpxR3lqaWlCR05HRXlMK3NUdjZKL3Y2d0Q5cVErKzVxTHg1b20yWFVtVnhFcWlOOUJURGg0dGROOVZ4Rm9WaEdPREswcVRVUzVxR1BqNWlVWUlETHh1YVVCMDNWZTE1VFhLa0lrSU5CTlJTWVZZVEFRQnIzOXlPQUExYUNwQ3lUWHV3VHk5bG51YW1zMzliRnY2WHZlMVBsN1M5ditqS3lmTWkwY05MU2tjOXJLcFM4YmxJRElFR1F5VG9QT0tNQXhaWWlseE1aZG9RYzJUclhUOTFDdTJZd1lYQTF1dFpsQmRFa0g5Rms5ZmtaUFA5VldzeVJyMXBWM1JzNktrejRXa0pSbStVc1d5MlRpUEM0d0RoTTU4QURUczZWenArMWRWQ1M1dU91TGR1ZHVUV1NaQVNhekpqV3JOVFVZT24zSldMOTlvbDE5R2h5SGtvNHROczZuUk1BMUVPV1JKQWdMUlNaeCtxZys0K3Y2OSt2TzJlb04vZk9tMHNBTnBZc2JVUUx1bkFiRXY0dDg3M3ZpakRJbVdwYnF5K2pUZWVZWXd3Z3g4UUFLNlhpRlFid0ZwZ0dObTQzYjdGYWM4UDM2OUdmMWwyZTF2WTBZSDBjOXc1OVJUQk1Nbkt5LzdEVFFYYW8xRWMxR0RoVzR5TkNOQmlHMVNSTVlxQUVaRFU1OE1vcGlVRVZzZ0x2UlFHaXh5N3pxTXhkR0x1bXdpNHRBdkg4c2VKNHNlRFp1UHhsTlhDZWRsRzNSTkNob3lkbEZBcGQzaHNSSlJPOE01S21Pa214R2xoS24vRXgvKzRGTytBZlVSZnhZOGdXTUt6R3BCdStVRmh3bHpJWEhtUHpySzMreWQycUlMVnhKamxOeTRwVEZST1BpMzRQNlVXTGszOVZybm0xNjQ0RzRDdmpuNkJ4YS9BaHI5SUUzTEZXZ1Q3UTBIUEE1SkZHM0MvQVVjT1c5ZmNQanVDK3l1dEFCNHhKemlLdE1YSG1Gc1Y2TVY5TG5Zb0daSTA4R0UwZmkyL3UxVUIyaVlSTFJ6QmtXaTFxNHFpSzNsUG04b1hUd2VrY0JKZ09uMFpNYndmNCtiS3BqWGppTlVYUXVXUkFLb0dJY3gxNFNNU2V1SmxZNnBkK25MV3dpNEVmNitULzl2S2JOZjIyRGF6Z0pOd0h3WVhDM2FwTlpBeFkzcnEyN3lDWXdBQ1N0T0o2bXE0bGJKNklzTmh5ZWlxZ0VpUlBsZ0s0eWlENzBKRlFUU29kZlJodnRXaHVmZ05HS0xXNlhIRUlPNGZqa25NSzdiZThraTNmRk1SMVFEU0lKTnRZU05lSG1BS0VnRGJ1MUI2cUZKRWVJWXhyNmpPdEtOOS9WbzNmMXZkN1ZHLzlDZjM0a001RnFSdEFwTUxaQlI3ekEwY3Y4b2h3VUprNFF5c1pCZHF1OE5YaFZ6Lyt0SHYxS2lmaWY5Y3JudElObmJUVVVJQTZmUm9SdlVMeGxDTDBORG9EMUltQ0UwTVFwODZTeGlhV0l6NDFuN2xJQytrRUpxNlBrNVhEQ09adTlQZUJ3YVAwZCtwUHJrTnQ5dTZyQlpLSjhxQVp1NGZPRU9HQ2ZkK0I2WVpBeTl0aUE3UUlTS0hNbE5LaWtqNFZyNEZHMVFJWlNrNDNDNElYYklienY2anY5cjU3NWtmYjNlVzMvakFHcmRwWXlveEI1SGtybVprSUlpNVRKRXVzNm40cHEray85OVgvMDJ3dDZ4OFBqSlp1SG9CSEcxcUhva2NBbitjdjdaSkJOL0pqWWVkVktHT0JoaU93dkw1endYSm00cWtGYUUrR1VsWVVBZXB1akNTNVI2bVQ0QkJDY3grS1M3ZzBaK0o1TSttR0ZzVjRCMHlpdW14SjExdCtKRTljY0FMZ0VhQnk1Wi9LaGRjbFlnbXdiaXc3UmgvSGV0UzlTSmdGZHYwdVpzdi95bkg3L29SNzhTajkvM3RVN3dHUTVvUlZPZVVObkxkRXQ1UDVRRjNGdDBIcW52cWJIUDlmam4yellXTlBkc3A0bnk1Y2IvbmRKQk9DY2s0TlAxMFFTMWJDV01xRU5RaEZ5ZlFXSkRQdld4R2l5QWhQV2xya3VUKzREV0xqTWFmSTRFcDVJSVA3Mkd4OW9pcklVMWNpaEtTeWowOFFOd3dJV3dKK2gzd1BPaStPTGNCOVAzajBqUmx1Y0N3L1lXRVExNlBjcTF1V3Y5Vm0vMU9QdjZlZWhScmhBSDRLU1IweE5LcEpXVTJTaTNKd2ZWSi9TU2ZxRi92QXZPaURYMGRlWkRRb1RLdjNseG9BTktDcU1uUlRVanBLb2tBalZMQ1pURUJGQVg3RE00bUpYOHJrbUpadDJ6dEltaVEzdGRJSndXSC9sWmhzTHpSZmJ5aVhIMFgwTGhDb1RzSFFDN0ErZEZ5VXMzb3YvUmE5ZHZzZFVEVWxjRnFRV3d6ZzU3bHducjltOGFLTEh4eGVqUEtqSDM5RTJmNm5IMzlFcjdnc0wzNHpHamhKdmhxSUVuVTFzY0FmRjYvRS82ZC8vMEZOUDRFQXpHQmhvVU5pQWN5T28zUnZCYkNLREdOcVkzSWtVakJhaWk5eDFLU0FDM0dlVGlBWGdPZDdUSjBqNjhoRTJ2ekhDVG5zYmxaZEdDK0sxSmhvbENNWDJUb3QzalJZdUVtb0ZSa0VBK1pBYkZZaXhqak5TbGo1cHpvaUNTSUNKb2dSeGwzU2MzMW5kQ1I0dktSY3VscTYvUHFEdGZrOWIvb1VlUHkxSnZSb0xZRGZHU3dleGF4OGMrTGZCUGUvcVRkL00rRnp1R0JJVXVwZDRRQmFTRlcraGdZSm00bmJDaUJ3MERvcGNzRkpsTm1qTTJpMEw3aDZORnVwZ3RYUmRhRmpSUEhTZnJNUUxIUmd0RXRRTjdpTFM5Tk91YzV0eFZoUEt3QUpQS1JPVVJsVERtS0FxRXoxTVVSa3FhUTU1SVlWRU9BVFlCRGR0Sm5zSTk0dkJpVjJDMllJVHBLRXJldnp2K3RtWTN2MFVFSjd1VmgzY3hGMXZkS1l2dkZuYXIyMUtxK0RERjlZd0FzQlpEK1J1ZVhMUWc2SnhzZXVJM1lJWEMrSHFBOFJzdjgrRFV2cEU4MlFocjFad3NVQ0ZEcCt3VFA0YUJNUUhzRis0Z2daWnpjK1BRUnpSdU1DRktvRUxEaVBCaUZQRXhzaDFWdTZPTFFGLzlDa1lIMGdvd2JnVW4xZ0dDR2kyQVNDVWNBb1ZGQXQrR2YxcWM3QkdVZmY1WWo1OHh2Q21ZVWdrUUlqZjFOLytXNDhlUnpSa041eHhZQnYxMHI5cHgxN3dsVjJKK1poRkl4ZU1rek5IeEdUUGljRVNZTUVQZzJyWHlZU0RjaDV4UUEvT0NNSEM0L2tzVXg4SHNhVFZDOXdJcFlaQWdHL2tRdWExWVVyaFl0Rm5mWVFEY3VKMlBKQ01qbXk0M2RHNXRrbWpPb0V0UVRYaEdnS29hWEcxdjNPWmRWM2hwVmNwRVAwQ3ZXQ2hTWitQcWdNQkU0bVN1Y1hKOHM4M1l4cXg4UUlpWWxPRVh0dGsvK1FQaFZXK0RNdGFLTkZFQ3d1WjZ4enltemlkcldJR2tJb0JsQy9pTHJka3lTSFJzT0Z6RURDd0lQSUJKcmRyYURLY2dvdlRydVBKNmw2cERvTWIranZXSlpGNERPclF5WWZmMklGMk44YkVQSFJIdk1JNWVwYlhrb0p4T0NFeGNzaCsydHlKaFNOR3cwb09SVDVpbzQzREMzanUrdXl4UExRNVovVDRpVEZIWmF4SS9mSHY5YkxuK2NDcndsUVBRQnNCT0tsTUNySkhITkVVc0NDVFNCMUdVMG5HR0UycnVoa3RaY2s1M0pNaWh2VTFZRHQ2b1hZeHpUWEVSTmJnYVNtZ2owWVlTWUtUZ0JlK2JiZHFrWU9oZmo1RXAwTnFqUmdOK0o2OFArQmdFRm5BYlk0TEI4ZUF5SXlMZGtKRG8yc2dETFBUcFNZbTRvdGZtQTd1b2FCYkJqeFVWbEtYSDlSelAya1FFelVjVXovUDZSUCtlT1ZuSmdoMEZTcVREakh5ZW9iK1ZRaDBydUZlV29TSnhaVUt4Ris1cDF5Y0FWSDAvQldKb1dQTXg2a1BBNnB5TmFNdXBOWGN6dkRJQ0VST0ZRZzh5Smp2YWxGUThqMnZJSzloSGFOSHJIQkVBbnpjeE5KUFVBSjRueTUyUXF3SkJyMTdZdnAra0F5OEZ1M29LZzdwSVp4dzRKd0hab0U1ZFVKR3V2UjlWRC9mTjZWSFQzNS90bmpqaW13Nms0dGY0eklRcDRjdXlNQlpoaCtPVUdjU0VEbVFWOVFuQjFNdUJuUlJ1SVpCbU1RaWNEYWM5SFZVVFlaV1N2Q0VUTzY3QUI5RlhRdDFOZ2JERFkyZjRIT25NaTNRaTRJMENDSjNNRVNSODZJTDNKNFhpNmFBYTdtRTlCRktJTHhRREV5T1RvdVlSc0lINFhWMXdtT1J1TXUwY1BwWS9MN080MVhWMk1xVDJ3R0twekhCV2RRVWlCVWMxbGlNcHU2K1pDYWJuTEVpbklBbDVJNkVTYWdkR3NrcmRRRmRETmJuOEVaTUNFTzFvWUtvcVFDR1MxYzlnaCtZS1dXNmxCRDBJQkJ3RXFMSUplS3JBOHZNcVJZWEdaRVZVWWJSdG94WXpBT0RKeGhvaDdhenFVY3QyYXNhcG13NVNVQXdqa0pJUURXeUt4TTlWWU43ZW44YXZTeEJlSFRDVElBVm4rbDB2ckNKOHFkWFdYYVNwQUFucmpqRVUrQjZUSlloeHdzOUNPK3Zwb1ZoM2t0dlIyZ0t0MFZJQTFNSlBEeU9BbWZ4MUdHRzNKK3NtTmQrTG9iSG9ZK2Nla3pxeXYzYUhBZ1lyZVRJeEQ1cHdpWnlPYmdQSTllUXZwQ0hZV2NLVlJ0RWlqSDVDNnM0aEwzTlZvQjUzcExVQVJIcWdTMHNocUc2Sk9Dc0FCaXp3RWcwUkIzY0dEMGRMRWhlcW1LdFgvVFUxdEtqQ0l3TzYwK296UHBJV3BVbGVvbjY2ajREaHNZZ3Rrb1l4SUh3eDJpV05VQWRYWHVZb1RpLzg3REdNVHJibFhhMGtOMlRVMm4yRzgvSWhFd2lpMU44SThJNkl5OS93ejFrNGFVSnJ0UVJyWldNbFBZN1QvN3NISnpoekVJbVJ3Y3RKRjVXS1JBWlFJZUk0N3B1ZTdRRlZ3SU43TThVWGlJVVk0Rm1hSW9odW1weXNyQmMyczdjYzVZNi9MWFZRTjA1VnE1T0NyR3N1RnZ0VnFaZFh4ZURFWFV5ZzBrQW9FYVlKSHNZT0JDTDY2Nm1pekdIRUxoY2hJQlRUR1ZXOG1uU3EwcFNYV1Rwb25Oc3NpMFF4R2lERmM2Y2dpQm0zVEpQZGt4eW04UEhQREdRSnlTRUpuRU1EQ1lrOW9uNXJFT29Zc2RuQnh3bU5pcW5FRXVheHlUZ29VekJlSzIweWxPU2UxdExkN0lvREg1WUJFTlpEdnlnTWhGZDAwRnBBWlBVb0VzWnB6US90UVJ2aFVmUnRHK3I1SzNoZVhBaUxTbW5CYWFocFh3QUI1OXoxVjEzcW9rYjFnVnhISnN0d2N1VEMwdDAxUUQxK0dpZzBOS3pGU2UvVEFzaTYrRFp5a1pHZ0ZGZ3FJZWlSUE81bFJDbVZ6Q29PenNlRW9RMWhlUUZGMm1PK2R6UHZiMjVKTi9RenlrbXQ4TUUxNWtiMm91a1VQb1FnVDZ0Uk5Ea1dBNzBUZFRsWkdFZzFQQnNFeWtTTGRBUk1MdGFaRjVsUkE2TUVJKzBsamtNZDlidUpHTzNuQUxEWk9tRkdmNnJhYUZCcXNISWFYSzBJaytrV0tUOHlndEV5VUFKK2ZFaUlmR05sOGxodERTeThsZ01ITnRENldUMk5NRWlZNkhsSW9QRis0UE5KWGxYcjN6Vk5id09KWERQQWw2QXd6a2tYa0p1SkMvMURQZkVzTG5kREJMcWY5dDFFZlFPRTh3Y244MjBkdkVsSDNXZW1CeVVhOG8vV084ZWg4bG1xWEtvOHROVWxaR1VoekdGQWI3SmdiR21ja1J1dlBMNVoxR09vSGtzNVZPWDZrQU1wY3NxQjAvb2gwaVprWUs5cnlYRUlPUUkxYUgrRGFjSDZybGlLRUQxOGV0cE00VXFSRkNZZExtcm4zOG9IWXA0VWJ2MWlRV2hjZzBCbkVleEtBTjBqMGFEeHpmbWdTaGMzWjJYQ0I0ajJkMXJRd0dmTkhFbTRIT1dOVlN5QXNESFJFd0JJVXlnVjFNZ01GTVJoR0lGRHNJUVBqbTJNQk4zWmx5SVVtQml4WFRFSSt3MUJ6ckVzUkNRSmlWeDdiVWJOQ2FycGNKY1JsU25HTUZhWktuS1lGa3V0OWFsRzMrelk0SXhka0dDZC9FdjllaGVhWjRPM3FqMDk3U1ZVeURHWHZTcUJwZVlFK3hZS1NzOVloWjk0bVZTd0NzMElvaFFSQ0RjNEFPVzZ4d05tQ2JwVVFFdmpGWXJvZ1p6d08vczk4WGdWV0lKRVRzSWkrQXpzOVZxWVdzeUE4cWxRemg0UGNKMkdOMnpjdUxsc1hCcFVxa1oxOFVqMWkvd2hSOUJUZHlEcUJtOGVSVEU4TUU5NHBtdEF6cGNNYlFKZEdkK1hiKzkwaUxZTzNhbEYvOVViL2xXY1BqM3FPc2Nzem5udXBTbEFuK1JSd05EOXpPWHlHQjRuaGpVcTNMTTVzcHF4WFNObGRYcVB2Mmtrd3BhclpPQzdnbHQ0b0JTNDVJMGNhYTE0Wmlpckxyb3g1eWk0T1NRRkEzS3ZERFlvaFRJa05GY1gya1ZrRmlnN3pFcWpKZEZDMm5DVEVNL0pZWUZvb1FBeDhWUGRaeit3Q3J1alVpZVBtSC9xRTE5VmY5K0duT1RlZUhTdXdqZ1BacUVFNlNUWnRGQ0VFZklNRHdlZW85cHJyUUlXaTFKSDh2NkdocHlrb3lpb1F0aDFtQko1UVRYNytlRTZQQlZqVkZJaDhaVzlxSFBzWTNaU1BHK1k5YW9XRFpweEVoZEpZb2l0QUNhd2xOWW54ekdiSHFrZllseGxSTks0dVpkQ1hDUnF4dUVNWnN2NjExS2QrV3pZVVM3NjZGUHV0NzJobjc1b242NzR3K1dvQU11Z3dGQy9VT1ovS1VDbFRjcUZHd0s0REhYVUozRGM1TTc4VXNTSzZrM1BtbGQ3MDFjQ2d1MW9ndldqS0tlckZZV2FicXJYSEswSFpEQXhsVzVYdWRNbEY1T1JWS09lM1poVnN4UURNYU9lUDlxQXJMRjFaVG90NVlKYlZnRklzOVNxcHF3ODRVdlNWMGJlVjExR2RtVURPZU5FUDlvKyt3MWt0QmpOUFNCV0FTRzN0T0x2NlMzdjBUSjlJK0ZCR1RoKzNRT0pMM3kxNHdYUWpHRHJtTmxRd1g5NlR5NXNPVEFrdlQ0MFYzdEVPZkV3ZklGeDVLSDMwWGNycUFGeW5XcFRvUVVaSmJrYXo0T3B2V3lNMEpFY3dYUEtaNFNLamVYN001RXp4a3VQT1IwUFp3dVJNaUh5blYxQ2ZPRWNMcFIra1djSStmd1A1UnlHVnhmTE03YjJ0NXY2YTh2MTBYWVhNSHFiZ1VTa2JUcHJVN050emZ1cWQ5dm9kVVlTYTFNOVgxR09MMTNQb0xESlZRbFBwbVN2WFJCR3RqTWsvaEZ2QzRiTHpGQ2ZvWk5SckRzV3I5bElvUTR1blhxaXpKWHpTaEx3NjFDcUZlTWJjVndQQXJ1em1FVW9MSGkrZXErUUtaQ1kwdHhtcnhabFNGU1BwWmx6RlkvTFdKTVRTWHBYaTB2V3NZSGttc0Yrdk1uZWs3cGlyK283ZDFhNi9CbTFBS1lYRG5VQ3RLL3QvWDdsN1ROYitueCt3THBvYUVLY2NpQmNVQTJleE1RM2tCclBJckRYZ1p3Q2J0d0NNbnlHTVcxcVZVUE1nZkRYOGxHVUZtNktFc290bFdXVlRNUVpMYUEzWklKTVZ1MWZLSGxqRjZ0WWtoR09Zd3BDQjR3ekNFZnFTakIxWmc1ZVZtWU5yd0tUNE40MFFvdXpFSUhOYVh1NlQwcWdlazM5TnhMV1FVUWtCUzlkSTJBL2lhQUw2Ykt1S0ptUE11djZ6WGYwTS9iRnZMR3ZQUnlJTHV2SWRLY0puMXFQdytGNVVVOEdXemxKMFk0QldNQ1Y1bWNobkpJV2FhWURnaHJDcTVnQmk3TzRLVTZDd012SEhWcjlLNll3MERtd050UnlHcE85cWNMQzFtTjlPb1NVaHhtdzJ5a2ZYRHdaSlZrekNSSk1USkVWeUZxVkpZNlBYcjVTaysycXpFQWFLc2IvM2Q2L0FYYUpiQjh1RUpnUXZTVmlGYzN5QkFRQjkrcHBUaWNkTEJmMWNaK1U4OTlWZi8rZUg2TDJadFFGcGw0cHUrTVFnUUlzYkRRc3A1UlRpUGdkYUtWNzY0QVFzYnl6VG1sN3A1QXh3V1BTdTlDdFRxZ0o3aCtSaWxXTlpBeTF3aDRwY1hMeVRJZFpXMWcxb1ZYS0cyNmNJampTbEFGZUJVdE5SWGxMWWVlc3BuVCtyUDZtTHl2N2J5b3YzOUJmL3N6bmZDUDF1OVhRckV5WTFvclIvdDRaWGNOOGlyNjZBMXQ2SGYwODFoRDYrbXVUQllqUVRCcUxLczNlek1xQW5CelFEQ1VkMkdvRUxlSzJjUWtxMXh6VXJvMTdjU0FwZjlRSjBaSFpZVzZQMld4SU5aUlF2bTNraXJtb1RQaUtHNTFSYVN4ZWtxTktRMVFvakhqdUJHeU85SjdFUWlWQ2ZESFJSMWRqM3M3OTdUOVYvWGRmbHVQZjAwL2Y2TjNmanhxajFZcE0zS0JCaElqQjJaWnhBbENTV3ZHVW9GNXZacHY4NiswazQvcEdHdUgrS1crM1Vjb3BKcnh1YnFvOGxaVDlkMHdnVHlYdkE2UVRvcmlXYTlxMThIY3VsMkJ4UFVnKzFOUzZVU2FkTWZNSFpGN0UwUjNZeHByc2ZGeC8vL0tFVEJsYVk2WVJxRUF1ZTI2bnZEazBvM3Y4bmtJaDFpY2FKZ0xKaWpGTXlBZityR2UrMFA5KzVqT3lUZjA3NXU1Zk04dXNZcUFQbDNBem9CMG1ENG01NE1JUmhLV0tmcGNsM0YrVnN4MTFCM0NnV1I2VXgvMHBoNS9XKy81aWw3M1BPMFZQYlpLd2dSaDJWSE1GRENPNW5BMVlQbGpoV0dtWHhZL0hSdk0raVpQVmRPSWlNcjBuYUNRL1VVdXZKSktVMDh1emVIT2t6VU1odmdwNXBLdnRtMFprZ2FUMW9TeVRRQnpaUVZwUzBBbmlOWWJLZVM4bjJ5eEx6WlMrRlRiM0tvS3Y2cWY3ZThuSVQ1WGVMNUgxczZXcVVMeUtIV04rVHBXbzFjNDFWeDN3OFlKZU0wcHdGSzlxZDl1Nm5OZTFDK1BzK3gxMTUvUnlYcGFaK3lob2R2WjlodWhBb1dYcmVaRlRYZXpCbVVPZ3NWd0x5eFN0ZHBWTFJlNGN0QkpsdGFvOVZOaUJRNi9NdTRneDFJRHI1dHdYeWpZZ3J1Ym9hakVldXQ4WUNralYxNVZSSEVWQzdCWGNlNXF4YjRnaDZ1a0tubDY2b2IrZGtQbjdJYmU5K2FxMm5JTFdSUzNJV1JkMHR1M0E2RlVqdFVqdHM2RE5jUlE0OUlha25rc1dMb3E0MG45WTRlak9MaG0xR3d3MDh2NnJKZjdpdGgyUzNoR3I5MjJUdm1LM3Z4SXFFQkJFVitNOVNucjV4UytkMTA0aHJDaGpobExaNlBJQ3Z2dmJLS25GdkJJK1NQMnlTcXU4aVFYVzRKWFlwMTVTamxBalpnTDFFSVhkem55a2RTb3FYNjdFMFRjY1EyNU9oWWZxeUd2UCswKzhwbU84VnM2eHNwYzZMK1VVRGJSL0tuSFhBN083ZmhDMXFzdFM3WDNrUmMwWmR4ZXZHcjE4SVNkRDBnanVza3FiS3gwbXYza2tOOHRZRHhVaTRxR1BRL1ozV0xnK2JtbEUzRExWNXRjMG1lcDZEL3RoTXB0cTQvN1VQRnVlU1Z0MFJTS29zcDM1NklBYnNmdDZ2Sk9EbklvT24wSGo3UEEwVU1FZTFBNWVCS1YrZnVxVGpvdkFrMkNHSjVDNldUSmdZSzZJbGoyV255anFMMm1hbDBRN243OWUzcThnZDBiSWQ3VXVYbXJRQlFZNXVnekJLOFlrU1VKR25lMU9NcmhndkhtV1YwNFI5K3pWVHdiN0x2VXhYWWhmZFZJbVh4dEJTeHN0TkJ0WlVJTjhJM2JpQVhSeWdjNk1SOW9wMTRIVHJodE5EcDJRWHRDajYvcXM3YmpoOTFUQlFWSDVTeFpuNm5pbWZSbmhueHBEczRCT3RqaFlTN2RTb3N0V2xMd2hLRUJkUXJhaUhucnRORHQzQi9kSkdMMDBkZXdEMmVGRWdzbGJENUxNNngxU3dudGpyYXdFZUsyUzlxZGZhcy9hcXR2cUQxamJuTHRTbFBuc0pBWXh3VjJ2R2NsaFkxYWd3NDhrbWxBTlRoZjU2K3dCUXZQSzMrT1pGbHRKSVMrYnR2TDBLSnR5SFFST2hqczVtWGFOdkxrbjdYQjVoRjhzSlVTVVFMbGE3VC9wU3ZLVFM5ejI5THZBTGp0SlppRnB2eWt1QmxWM0draEt1WjFPZGk0elNEUnZMOU8zSzJDUFI5ZmVITHhWdFR0a284QXR5Z3B5NkJrR2p0RGZLeHR2S2ZYYmZ0SnZyTnhRejNlQ1BDOURCMEpHRUFDVy9leFpIZElYVWloYm4xVTNtTkhpbTJvUllFSWM5bDBOUDd5QnF3RjFJcnp3NENNdkx2c0FsNndqakp1UnJyZXdKTUJFckdrTllzY2t1Q1VtMk9pQ2JhZjNpeEFlWXYyM2JzbzQzVFh1OWk2b2hkdld6bGYyam1zMEVPNktCN1hDZGlxMlYwTjI2ZUVSU1VoY0pqSjl3TWFCV0ZYYmtPY2tDaHF4U1k5TUFDSkFEY3N4a25mZy81OTJLRzVMU1R4amo3MHBML2Y3cnowSGIzL0h2Y2RlU1VSQkc3a2xiZklzMXBSWThGVVY0dFdVZmtoRWtuRTNKelp0UnZGOXd6bTA3U1ZDaE51eUhxZU8zN0VBYWNCQTBLa3NCSGRhYkVwRXkwZ0U0YWE3TEtNSE1xYktnMEQ2M2hIWGJyVmphaGJCT2dDYzNhZjdlKzViUk45MXRVRElHTFRxUjdRNHl0amIwVi9KNzRlWXdsaTV0KzgwWkxoZmgvb2J4OVJUSWY5V0x2NFBxZ2tXOGR1OXpiZTBmUDM5SjZkMk9JMjNkeTJaazVxQzZjTTB6R2NkZXowMXQ4dDY4RWVoVVMydDZXNVpJVmdON1lLMFU0bnBlRXpZeWZIYUUxVWsyeUJqQmpZTk85akQ4Ly9GMkFBRHAvOS9rR0I4V01BQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSI3NSIgaWQ9InBhcmFsbGF4X3NwZWVkZXJzaGFkb3ciIHdpZHRoPSI0MzAiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWE0QUFBQkxDQU1BQUFBZjFaTXRBQUFBQTNOQ1NWUUlDQWpiNFUvZ0FBQUFYVkJNVkVYLy8vK3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3ZGMHF2QUFBQUgzUlNUbE1BRVJFaUlqTXpSRVJWVldabWQzZUlpSm1acXFxN3U4ek0zZDN1N3YvLzZxYXVOd0FBQUFsd1NGbHpBQUFMRWdBQUN4SUIwdDErL0FBQUFCeDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdSbWx5WlhkdmNtdHpJRU5UTkFheTA2QUFBQW5oU1VSQlZIaWM3VjJMbXFvNERGNk9nK2dnZzRoWWtXbmUvekdYVzlza2pkZFJBVFZuOXhzdWJVbi9QMG5URnZXLy84WW1RUmpPdzBabVEydnlFU3J6TUlyakpNdHlwZlpLS2QwSnRQKzFSNkNWMm03U1ZSZ01yZXA3U2hCR3F6ak5za0lwME9aZngxRlBVVTlZeXhXZ0MycWJycUtQd3oxRGFwSnFKOXFxQSthRXlkRTdZTmxycEN5eWVCa08zYUdYbEo2azBnS1B2YVVuZ1I5aW5tUUcyNnVseW42VzgwK0l2SWVFaTFXNlZiOE1ZaHo2dWxQQUJJQWR0RnlVaEo1TFJwdzdxMVNleHVIWDBCMmVwc3lpT04xMHpnUU9WdWhvY0R5QjQwWFRzb1FWZHhjMHZVbVpiVVR0c2pqNmhNZ0xaYlpNc24zcHNBVUxQcUN3Wm5JSFlMeHdocWdMTWtaZGV6eDA2blpnUzVhZkxQS29CR0c4M2lyTWhBaHZqN0JGR1RDTnpNZnVRSGUxeitvUStXRU5TUkRGV1ZFNm1HejJCZ3c4N1lZcGZJdTVDcTFBWXFWMExoODYwanZqVVBrNi91VCtZWnk1UEFJWWR2akVPWXI5dzExT0lOY2QyMVJFdUllemtqUFRnM0wzcnJsL3c1UmcweDVDSkNhU2dPYVZodjQvVXdFNFdaZ2MyNURna1p4Yy9ydzI5MytiRURsYnBzckhTSk5CeTJWOEdIU3dUUEdabE1VZmdKNWpkbmdOTy9naFduQkFGZjNZWGV0eS81Y09rVkZhVkFqaHYxazViY0FNTkF4L0MrL3BPSGZrQnZacXBwUWxmSjlucXhmTS9jT2ZBbzlCR0JCLzNRRUF4VHpBUmJrNzRJdm5TR0dqa3o5QUlzVklUVWRTejcwZkZzcGlrN3pNd0JhdVM5SmZCZ1YzSEo4Ym9JWEl1RWFKZXNUc21kd2t4ZEg2Y1d0aGxjclNWZmh2YUx6L0lrRlNlcEdOZ21DdDlrUm9rb0toVUJ4TVdPU1hKV3Z3SFJMY3JBekZQVHF4NEEvRi9tYUNndHFtOFdLU2kxcHhSYnZKd2REWWtydDRpWGwwdG81YXNLRk5ZQi9EVEk4QUdRVFJoWTl5SkVnZXArb1lnOUEvQ2lhNDdwOWFxM3ZXWW9Udk84d3hqNjA5b1VNNmthUGVUMHpORytza216eW9MSm5JdW45QklSZkJCczJqSlBBb3BVV0lIU3JtS1RSbFFIRDcxTkFabk9oRWFGeXkrYWQ3TUtuc25kZ0lZSlg3clhQLzFjaHoveUF0d1RBZ0dqYWNRTlJIa2NRcGkvbWdxeDNlYmE4NDROQ3N0Y3F6TVM5cXpkZkg0M3dQQ1RkNDdtOElRT3RVUW5oRGYxempBZ21lSmw1TW93OEFYSStWRXVic2lPa1RNNWR1M1g5b2Nud0pGRU4zdW83aExzcytmME9tV2FsTk1xWjEvK1doOXhVZklBcSt0RXRQTUFlVGNYa1dUc0gyREVCd3NiNGlNQ1dHRzJQMytWRHYvSVRMT0E1Yk53K2lCRzAzV3AxSHRhM2wrd2JUNTZtWnBLcHovKzluaFVpemV6VzFwSTBiQXE4SzNGWFJlclBVQVVsd2M2NlRSN1lZeXYwbStYNW83aDhzOCtyZEk5cTlEYkJxdGtibmp3aVJTZlh5SnQvdjBTQ1dIcmFyUmh1b0I3Yk5mUWUyaU1NQTRzbWpGdWs4cDdFVkhhaVRULzN2bWZ1dkt2Y1VvNEMxR1Jxa1NDRkJoRGlJSFFCMTNNT0NzM3pmMVNUVUgxTm5pQlhPU21WL3ovMW5XeEJVQWsydWd0LzNYcWxEc2NuVzhTcit5USttZjZkRG1wUTVZclBRdEFWM2pWS1BFZWE4R2Fma1BrakdYeERyT3ZDdEhsSUhIS1dtSld5TnVIZWtxKzE1MWF6N1I3ZXYrNGY1Q1RyQS9lTjBxSXphU3AzKzUrcERCM29tNlNlUSsvWEFWdHk2b2QwU2hycHhTUWlvVWprY2g2dE1XWFZ4eU9GcDVkODJPVFF2N2VkNzlqbENieTZPSGlmTVZYN2V0ZVphcWh0ZVp2MUtLOWN3Q0ozR3VybCtxbTJ5a0RLZmVjTVpTSFVkWUlKQlRuNTRjbld1dGMxbVEvdWE5LzJEMVVFTURqaGZRRWdpMWFwaXM1STRDK08wK05WY2VPN1Bua2x5TXdNT2lGemErd2dySVAvTFJvZXB0WWJqdVl4dnM0eDlxakhXaGt3cnVCcG5sbFgzbDYvN0wvSktFd0VTSm80bzJKMFVSeDR4KzI3ZW8vcWsrNllTZFVyQ0syN2xzRXVYNTBrTDRyMmtxR3ZUbVRwWHR6elI3R3laN3BnbGNCallrZ1c2WjNwNTFMaE5iZUR6YlRTTU9HMmw5UnZVaW4zMFVhTkNqZldxRVh2eEl4UUFVWVhwaHFvNFBydWJWWkZHNTk3M0NkY1ZnZS9pTk81Y2t0Tnc1dDdXMGROSzQ0Q3JwUEZ6aWVzQmFSV1hwU1Q2VHlCS0dWV0wrRndhOHMyREl2VW5pclNWaTNMU0p0ay9NSTIxZnVYMVEvZGdVdGs3UVZHQSsxOTJOaXhHR2ZFeHdiSUpyUFhmNGhLMkhHZWw5cHNrclR0b0dTYjZEVVBrOXZ3N2tPNmxVQU9ORDY5VGYzZnQ0a3J2WjJPUFJkNU5VaHg1TlhKVVFBSEFaWWtHUjc4eHFpZjJBMXVtV2w0QTZTeXhNMTdhUzYvMzZ4dVh3dnBKdFd0eFBQTlhlNDM2aDlPQW9JdkxQR1M1SmIwSXoxbFNzTTV6YTZ5bG1OOUdWaS96ZUtPY2x0aHRHSVFHUCtZeHZqY3k5NklPNkFsSFY3UGlkSUJqMW91dENjOUN1R0swcXFBTVVwbEVFL1BVNUVJMC95MjcxSU5Ram5EYTNtVnZZQjVuZTVMaEhJY1hhOElpamxTdm0yZ2p6SVVneDdEQjBBa2dYekdrdStCSXlwSVFJdmZQazh0aHJnZWE5a05EZnJBbzRudHV2OVdUNmwzMWlZV2kyY0h1T2l6REpLL0F0VjlQNC9MdlI3eVc4UFh0SnRVT1g2YTlTNzBRQTd5RHBOZnNqTlFBeWdLN2lRL1I4NnpoRUhkOTRNY1Byd2Q3RmlWWnNmOHRsY29lK3dtYmVsSk4vUGtOczNlOHdORWVMUjZJOXoza1h6OUJrK2Zsem41SndOUWttQkxFa0c4QlJXZ1M4L0xWMEh4Y0lzR2k0UXpiS3dpOWNYMTlrY1JDVTdvYnVXVHVOUTVwRjBJd0JSNnlPTTd6bTZUNDA2YTI5aG1TWFdHbFFIdHh3a1JEMTdGYUp2WkJ3U0JhZFJNMFJoTVBnc0J1WTVJYzlJSS80Vk1BQjVudnpqSURCR3RERmtKZUtBN0dMWDMxOFRPYVl2blErTjhrWWNQWmk0WTdvcFExeHU1dk5kNFBLNTJWOWh0WlNQTHg2dW5JYnpRMDVuOFZzK3RKaHlhTmd5QVpSRHpVZ0I5cXFiaUh1Q21QNHFRL29qR0QrT3Zrc1JyaFI4cHVrWTR6OEx1TUZ4ZUlQN0RVZ3hrOUQ1VThOZ0k5bE1Pd01FTTJuSm53aGg2QWZaZTJZc2tzSnBabW5KYXZmbEk5dGdnbU5PVlVFb3Z4ME4wMmZOSDJ5ZFRrYTVsc1M5NXZma3dBQkkwelAxTEVSOThDeUNvNHQ4R09SNFpLWVA1MTNWSm5tVXo2QzFwT1NyOVQ3VnhLc0hKNVZDTG9NdFlHbkpJWHIraFpWQUs3ZU9XeklTMFZza3dCeE9zYXgwcmtQWTk4RTArbEU4N2VyNU4vVWJMQlg3ODR0VUdzekpmaithVDZzOFIrWlNZSGE1UnI3a2F6UTM3WGJjU0pTYk1RNGd3Zk5FY1JrVEw0cmtxNVRhTDM4eXBmbWxmMjZmdVRCajl2ckdLUTB2eEE0Z2VUYkR4SHMvMWo0a2ErRXJYOFh2U205VHZKekU3UU9IQW5Vell2NDZDSDNtalZrZXd6akhoa2MyVzFlZWZ3ZDFLYU4wSituNXJoYVZRUFVJbFd5andaK3o3eDhESmJycmVsSld1Z2phK3FTQmVmZ2VwaXFTZG8yNUtuMEJ4bDdHeTBHTTdCaWZ1UlZyeFFDVDFUbjRIcUptbGVKU2EvWk1DSExreUEyNFp5V1I4amtLVXd3RzYzMGUrbGxtd0hrSy92TkM4NXVveUwzdHRzZm81RDM3RTBuYmhWVldTckY5a0pHWU1FaTUvTzBlU0UwQVk5N0RoNEg4MmJHcmpLOVh6cUUvd2VJdVlIZWY0Mk9GbXBtbSswZU4xRjliRkl1R3krSjRSNkY4dElUcThyZHIvZzhTSHFtVElMNDJSVDdCa3BKMWZtSzFWa1NUeU43OGgrVlFuQ01JN1Q1a2Vlelc4OEExNXAwa3J0c213ZHg0dFBLakZPbWZVL29QNDhML29mZUZpRjk2cEU1dVFBQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLWludmVydD0idHJ1ZSIgZGF0YS14cmFuZ2U9IjUwIiBkYXRhLXlyYW5nZT0iMjAiIGhlaWdodD0iMTIzIiBpZD0icGFyYWxsYXhfYnVpbGRpbmdfMSIgd2lkdGg9IjMwNCIKICAgICAgICBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBVEFBQUFCN0NBTUFBQURFelN6YUFBQUFBM05DU1ZRSUNBamI0VS9nQUFBQmdGQk1WRVgvLy8vanlaejAyS1cycEh2ZHhadTJwWUxueTVmdjFxV0ZlbDdWdTRPbG1uYXNuSHV5bjN1S2ZtTGV4WmJWdnBTRWUyTGt4NVRzMjdMU3VJWEdzNHZGc0lyWnhKYnMwYUxQdkpPNnA0UHAyckhselozV3ZZM1B1bzdkeTZEYXlhSE90b1Rkd1pKdWFGdkpzbjZsbFhQdzFLQzJvM2ZXeFozRXJZU29tbnVla20vSHNvU2VrbStBZG1Lb21udWNqbTNPdFl2bjE3R2Nqbk9sbFhPNnA0UEtzSWpTdUl0N2MyTzhySVdFZkdtU2gzT05nMlYxY0dHVWluVHQwSnlkazNGemJHSFB1bzdrejZHSmYydm4xcTNxMWFUZno2bWFqbm0ycEh1eW4zdTJwWUt5bjN2UHVvN3MwYUxPdFl2U3dKbThySVczbFhLbGxYcTlxNG5keFp2VnZwVGV4WmJQdW83U3VJWEVyWVI3YzJOMWNHR0VlMktvbW51MnBZTFB2SlBHczR2V3ZZM091SkY4ZFdtTmdteHliRnVPaEhHNnA0T3NuSHZPdUpHc25IdUVlMkxGcm4zR3M0dkhzb1RGc0lxNnA0TzJwWUxLc0lpMnBZTFp4SmEycFlMYXlhSFp4SmJHczR1c25IdmJ2NCt2bkhhbGtHNkpmMnQvZVd4OGRXbDBYcVJHQUFBQWdIUlNUbE1BLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9FYnYvLzNmLy8vLy8vMFFpZC8vLy95SkU3di8vSXU0aVJQOGlSUC8vRWN6L00vLy8veUozZDRpcXU4emQvLy8vZDRpcXUrN3U3dTRSRVNKRW1hck0zZjhpTXpORVZYZUltWm1xdTd1N3U3dk16TjNkN3U3dTd2Ly8veEVSRWRxVlVFWUFBQUFKY0VoWmN3QUFDeElBQUFzU0FkTGRmdndBQUFBY2RFVllkRk52Wm5SM1lYSmxBRUZrYjJKbElFWnBjbVYzYjNKcmN5QkRVelFHc3RPZ0FBQVVyVWxFUVZSNG5PMWRDME1UVnhiZU1ETk9yR1FtRVVnSUVDQ0tpb29GUWVVaEtqNjJpSSt1aW1odGk2OTJwYmkyZHEyUDJ0YjJyKzk5bmNlOU13TkpWSUpkRGlUenpHVHVOOS81em5mdmpQaVBmMno3K1BlK2RwL0JweFgvUHYyZmRwL0NweFU3Z0RVWk80QTFHVHVBTlJrN2dEVVpUMDcvY252bzljcjZhcnRQNUJPSnRkZVg5dlpkR2h3Nk5QaHlCN0xONDkzMXZYMTcrL29rWWtPRGh4N3NPTEpONGkrSmw0cExnNE5EZzBQbkY5cDlSdHM3Rmd5LytqUmlJaThmdFB1VXRuZXNIOStyRVpPVFFZblkwRnE3ejJrN3grTHh2WDBDc3IzSEpXcDdMdzBOSFJvYWZMMGpZOW14THNYcmVCKzhTWUlORHUyVXl1eDRMUlgvZU4veDR6b3Z2NUJKT2JpallwbXg4SVdLUXhEL1V2R20zYWUxYmVQaTA4ZVBlM3NmUHliQXVsWGNtbS8zbVczWFdKUnFMME9ML3Q0dmhOc1hzYVA2V2ZGT2FyNHFreXI2dmhoUzVyWGRwN1dOUXp2V1BxbjRFckVoSmZvcjdUNnJiUnkzZGJlb1Q3UHNrbUNYaU12dFBxdHRISXQzWjVUSDF6RXpNeWc1OWxlN3oybzd4eTl2dGR4TDFDNjllaVVCK3orMFlkUHozODNOM2JweTVjcjk4em9ldlhuMDhNV0xodzkvdWk5V1h2bGhibTU2M2xUQ3AyK1BIemQ0OVEyK2ZTVTAvL1dmN1QzNUxZejVpM08zN2orL0cwZCtmNlZEUnRqQjQ4RFpYUmhSVkIrNCsrTFpsYW4vdnRXZVFpQTJPSFJDTU96L29tTzA3K0t0cHovL0drY2NKd09XbklRSVhNaEJVM0cwODdVd1grVnlMTU9ySHZyYjR6VTlkK3ZxcjdGZlFSNkZPQTBKcnBCdHJSQm1KUWxZS2U3VkVmZDYxZDd6N1c3UXg0eUx0NjUyeDlFRkN3Nzg3V0FRaHJBTmFIZFdveVhpWk9ldU9GWm9pZmUvTTJBQ3JJbHlQNGZLMHF6UUFzekJUc1ZaU01sZEtodDdkVXIybGt1UGxpZmIzYmdQSGZ1ZVBQMDE3dWRjQ20zTlNnQVUycHd6ZXRhL3EzN3k5ejl1MW5vMVhESWw0N0pLMVVmTHMrMXU1QWVMZldldTFuSkpUaVVCeVFpMjQ4bWJOMi8rY1dTOHBzQ1NxSFVLaG1FZHZiYjJkK2lEUDdrYTUxSmFqeUpGVzBLaVY4ajNnZmV3NCtiTjA0WDhrWkZpcjRKTE1jeUxKNGFwZ3BZZUxYM2FtRTMvY0xjZldzdFN6eVdYcFY4bUt1S0g1dFRQcVQveStYeHhaQ1N2ODlHa3BHRGRLSE1kcGZPZmY3S1l6VDNNSVFxaXZUTDZSZVQ2YzM0dUoxOStWSTVVbENPL1hDN3J1YWhzVmtMb1JiRzJIQWpBOGdLd1dGVkltWkpDOUNmeXAvKzRlYW9rZ2pBYmEzZlRXNG1sTi8wQ0h3bU1iTEl2TVJMUnJ5R3JYS2lZQ0NtSVVxRjBhV3BacjlPN1ZUcUwrYUlDVE9kanI3SVZFOFY4L3ZUUlU4T25aQXlJK08yM2VuM2dwelB0Ym45ejhjMXlKTEM1WVBCSTJDcWVpRXpWY0UwWTBocW1ZcldpWWxqUjFFamx3K0p1U2J2Q3lNMEJ5YTFTVkJjeDhOdkF3S2xmcjN3NnFmbm5BeHVWa0wwNzFzc1cvelF6d1hlUEM1Q1N2ZHFJcVpRVXdpWWd1K2wwb1hhVjZqOTkzMjRrR29wM3QxTWtQY05OaElsZFdla01rK2oxL3k0QjAvb1Y2NjVSdDhJclh5d011NGdKek81T3RSdU5UV1B4dHAxMllYcmJRdzVrQXNUVWFxcHoydmVVaHZWcUoyWVlKcU00a0FSTXhOM3RYVFFuYjNkWXFtT2xtcHVTaEFxNWU3ZGJhZStoWnZxcld2QmxwYXdTWUwvYjNOcUZSWFBnaDRWMnc1SVZiaks2VFU3alhqcVYwdVlSTi9IUi9raHJXUFdHQVd3OEpTRXhUdDFxTnpLcDhmVTZCNEw3MURDUllra2k0YjU4eDFRZ1lYSkIrTG1lN25KdC9QZmZSK3RaV0JtZTNkMkdMbU10Z3oxcFRVL3RTYnBrU294a3NKVGxIKy9ueU5Cc3lWb2RmYm5OS3ViaTlmVFdaOWdFenNNVWtCdnBtQk51TG1DcEhDdkY5N2VSK3YrMW5pTHBZZUtkVlFJcUF3eXBrUDI2NEc3a2UyM0FTalF0V2V1M1QxNnVkVGpoakVNa1lIVFV5QUVvbVl3dVFubzMzSElneWE5U0d1ZEtQeSswR3lvWjM5ek9VcGN0STkxWk8vc2NxckUxMjRGa3F5NFRuSXFYWms1ZHNuUWt3bkprWVVlWTJtbWk3UzVDbVhKV3Y5SnV2TmFiWVVJbVhwU2NJYTFKOE5ISlZYYklzd1RKWnFDOWFLdjIvK2tVeDdUSXFuN3BwVEFNelM5aG1Wa3pRL2lFVUxIRzQ4M0Y5dUcxYUxFanpTV2tOM2R6MnhCYXRpdjFjeGJkZU42QjRDZTFUQzlHYlRQK2E4NTFwaHpNVXFXTkFOcHdVNWlHRzd2MWU1WmdLU1ZkckZVTkJLTDMyNE9YSzE4ZGlaYWxBb2F5bGxZTzRJQ3BSeUVTODR4VnJ3TU42RmVKb0h2ZURyeHV1MjFKWDNBMGpGZEdPNSt6SW5UZFJrakFJZVFWQ1lhVmlDbHdzVTF0a0g0dTk2SFRQSnNQRGQ4eFNsc2JncFl4eEJoVXVHb2pacVZoK09VV0k3Wnd2ZGxDMWtpa3BHaURDbG5aTUNQYmo5akM5UTVLbEE2U25TeXJHdHFrMlNCck0zSE0zazBpMkl5dkFNUzJFckRydkFFV1BEWldZV3FYS2RsNlc4U2RMWGlFUkZiVGx4NXdpRlJ5WjBySlFaOHRmTzVuSmRVMldMTU5EMmRaWmM5ZGtiZ01XUjNPL21UZWxaS29zWGs1ZWJaVmVEMUlSU2l4emlaRWtoZnBhTHQxMUQ1MGF1a0lTZk5UMUtyRS9ZUzlmV2xyOEZwSEliWXFZb2U3MkVBa2lMWGhBYks3VFdHR1RtM2l6VXBiTW5peHVrR3IycFdYWndHZUp2T3k5TTNIeCt2ckNseGVjRUo0dVpNNEpueFRZdE9HNHhqcGtUUXBZUlplbThhamp3L1lTNnQxV1VtWkRWdVdscjFQeWExWVFLWEtsYk1kTjM1bzRYODNPVG01cUYrTGs0dmk5NEZzYzBVenJGTHBxQnlvSEJDaEhzUlJzK3E5b2xhbzFXcnhRbjlGUHNxakhuY1NjenJVWEw5NkJrcjlWdnB6NnNrZTlTdGZ0ZEhSSHZFalE3NVAxQjdYTW1MaXBJanVreXBPMVFic2tNdTEyc0FwTlZlRGRYVVR2OTMvUEJIdm8yeDM5R05LZnM0M3ozVHBpSHhjOXRXUG52aStmdTdMTE90ZGM3NTUyTWxzTVFjMEc5VkNCQnZNanZvdzNZSG5lWUg2a1ZNdkNBSTl4UlZxUmk4RmFxdjVBRzQwbjhDOXZJQXRzYjBET0thYS92YzlDSWJ0ODFsakpUQnEyV2VJcVhiNmdLMEZwOCtPa3NzaG1yQS9BazFJcWpVOTBIWUxNWThCRWNEcWdCcXROdW9WZ0tqQnh1eWw4ZlZjbElNQVZnVFYxZ0ZiVlcyTFdFdW9QWnhqUkF6ZWJwK3Y4M01NS0FNWDRzZVppdEVUMkt6d0dJVVlnelJBUWNCSjR4QU9ZQ0pzR01TR3VNQTA4Vjc5cm1YQTFvRXUyQTVmRTB5dWlOZ200Z2pTaU5DVk9aY2pVdm8rN2FjVFVyT1c0YXBlUFl4YzFDVE9FVnhET3pFK0p2S1A3NUZJVklUZTg2cHpMUU8yQW5ReVZNRWtndVRFek5JVEJ5ZGI1d0JnSDVJUjNoRndIek1lR0JaUTR6QmxIQkNSVlFSTWdHQVJEQ2lHc0FyejBPUGZJSCtxclk5aDN3R1FHSGx5dk0wY0gyc2YxbllIU1ZVSFVPc2lKek1SVWw4Q1psT0JwVTFnc1Fiekx5RFpJOUFzaE5rbXlFcllrYVpYVzhYclhSSXF5QjRmMVJwMmlhalpGZ2NwQi9GZ3pnSmxOVjBMc1REcU1YVm5PSGdXbVl4aWVkMnhMTjM5Rnk1YytPYy9MM1EyRVB4SStpSWdBMSsxQ3RpYWFWd0U0c1BVektJVUppM0RnU2tWMEkzQTlzRlNSRmcrdUQ5UjRJOXlEbkdTRWFFZ3djVE1LTU0rK216ejZPVElzd29pWDlWV0J4ZlhjMWJ3a3NqNVpuUEZLWGRzUWRkYktyRGlveEVEaytpcmR4aEZxQ3pORGl6QXdFVUZWZlo5RFFFRy9vVGxJeXhVVy8ySFN5dGNXVnl3SW5qTGdmTmtkQUlVcktRakFHR0dYRVlTM053b1NoSkxRS3ZJc1RaNlhrUlhzVUdHc1hyQ0RpUlZ2MVd2ZjRkemh6a0kzNGZjaW9ocUpya2lxS2pRZnF5cm1JYyt3NVR2QXBscElCNWxaUTVkdU9YdTBWTElhVXgrc1p5RjBzakluczdPUFllQllXZ28wUFNhTC9tOE5id20yK2hhdGVnMzQxb25rS1crWmxnaEwzL3krVUtob0ovbGwyODlQZDNkQVdOWXdyV3FMMml4YzdSR09xUml3NTZmRFNxbEYyTEYwRFM5Uzh4aW00eXcxNDNHZW42bVB4TjBHNUgwZ1dFRkNWQ2hXRENQcGVjVmVnS3ZIZzJZWFgzUm0rbWNiQTJ3ZFpzd0taVWZDSmRqc3dsbHN2Wml0Y0JVWUYwSkNGM2dtMy9EOGhCTzVhZmVIeWoyRGZnR0h3RXI1UFZ2b2FpSUprRVRnSFV6d0FKK0JUeGpPUGJzQ1JaYUFtd2x1OXVTVWdrQkYySVZkS05BNmVqanZzTkxOayt3M2ZCWW9qQVB3UzBGY0VLK1JYaGRrR0g1b2tSSlo2YUNySUNBZmJZbk5ZeEhhKzBSNHNoUXdFMHFuNnNWNVJWQVFJempDUEhFWTNYUlpoNGIySkNBVVEvYVVJcjhHSXhSR05tUnJhemplVENHNlhUVVVpYkoxdFBkMCsyZE96SSt2b2Y2U3VqLzFjRVVZQzExamladDdteEZid2c3OWpLcUhyVkFad3FQdzJaeUdLa3hFWmZyY1ZtODFlUHg4WE5IamlpdDE2QVZKYmtBTUsxaGFmVENZM2xQV3dGc1RaLzd4eDZVeU16dXdFMlVUbWIzU2F1eE5IVERJYUpZTTZ4ZzRNb1gxVC9mVXBCSmhnVWpSODZkMjdOQmRudmVMNjBBdHU1elZDUjBBSjdWWk00bEg2eUVSYStjYjYxaXhaRjlYbS9qVjZjS0hXMkxhQzdEYUZLTjYzRWMxK1UvNmowaUNBWU0wMEFCY0VyRFJrUjBCakF5Wm5jYzNxTno5REtqSVZUaElOOCt6b0IxcDQwSjhndzZOYXhmcm1aMDUwaitjK2Q0UkRGTU9RbXNsSG5ETUZZbHMyMUw5VmdMZ1BuQXE1eWw1QnVaYytJZVM5eUlPR1hMSUI0Y1A4QTFYMmdZWG4zbzcyV2JjN2tpZ290bFJMOEExbFZxbUhZVk9pV2g4dzE5THh5OHhpOXNwWE8wU1BiYm1IczBBMXh6eUkrQjRyTUVCY09tSWZGcE4vc29ORnlCbjVBcHllMUVBQllWUnZCeFhOQkRBR080a0FZd0pWMG1LdzNUR0dBZWFWWnlJTEtWTXJtMk5lYUJWMXVkN1VDMnFtc2VyQnprSzB4ckorQ0NRTmNvVHk2c3FCMS9nYnBHSGg2YWtSZ2RTd3RqaUE5UXB5SnFsYVZkRENsWDVwM3NvcExnSThjNG9GWTZBNlJPUWJUSFVDR0IwS1NKbjI0NEVUS3UrbFVnM1djTXM4QnlSM2RQTkEvWVN3V1VzZ05SQW9hY0dlV3plRWRvK2g4Q2JEaDV5QnAzOUJWS0c3WnpGTDQ3QWx0aE9wQUYyYVBVbUZGZjBnWWJxNlJSZ09iTDVEZlVDamFxaDB5aGhqbnRsYU9DUG1xV2JSckFuMXJKcllzQ0x3WjZuNGhyZW9BTVl6N2ZJMExvalhBQjJHZ0YybjJkblhrckpiRkE4dEVLdmFyYTlEOS9XSDJmbTlZNUJpaXlEemZaR1pneGRCSEZWb3BzNUFHUUoyVlRUNEJoRXFJaTJWYzVkTUZzQlJOQUdtcER2V3o2cjZ0Y2RyT3dkVEZLSElnTjNXYmZSbzhTbDUyUHIzbzRKTWFVZThDY0VURk1ld28xV0ZIRXZpU2xwQWJIdHNTNnM5WFpkT2Zvd1pia0hmSFY1MGpLdHlnajd4anBpSHQ2N1lUQkd6Vk1tMVVZckZDQVFVcGFsaGo3WHVCV1d1Z2MzU0U4R0ZKSWdjaEhzNEQreW14a3lZdU9BY29IcGFYUGR1WVpEeCtOWXA2Q09ETEtSdzBEdDdzVTFPWGZOZUlEaUlVQzJIeGpYaFZnUjhibGFBVkxTTkl4R0diem1oMUQvSG9yeVpSamx0ZkFGL25SUm9NVUxqV1VJZ1ZWK1ZlZzZxSkhLYnVTNHdVMTVKbzNCc3gweFVuRGlFeFlVdmczQnRQTkFiWktOc0hwMVdROGEyT3prVGpqcy9KcVB1NHIwSWg4Wk80Wnhjb3hvUUVrby9zNmFQeFpZUWprblNOMUdIRDZoYUlleWpkanJtcE1IMnpGWnk3MDFnVUltdTRjWFVZZ0dDNk1BclNJS1dZVHhnS09TcUNWM3l4ZDJmNkdmeEhJRms3UVVTUU51bWxuTFZMZXNZd2FWdEFXalByZmFqeE04bStQM1h0WHM1eGhuVTEyamxZd25TS0dGcnVGaEd6enVWVFpYVXVyU2pEalFYaG55SjJjbEFFaVp3RHhzRFdJWVE5bFRKVHI1VGl1MThiSDVmQU9xTDJpbWV2RFByTlQvREEvak1yd0pqdEhkelp2VVFwWkxDaDg0SlhaRWU5aHlrMTBRNU0rYlBVVmNsR2FVZ1g4U1RBaUdJQTZxaGptMnpkQndMMFdkRjlTMklwejU0Nm9JZXJBS2lsWWVmVmJjNTJqZHpsTFYzQWtZUXVMWmdTQXBJcC9vZ3FvZmFyeVR5Nlg2d09DWWVmT1FmY1JpU1lMSmU4YUJVejN2VVRSYks1enRJcVhIMHBqaTJNMENDSVNVbS9hL0dHeE9Na3diczJoQ0Zoak5PWUJDK3A4bXh0SGFNUmtTdmJnZUJqZEMyWjlWUVNzcWM3Uk9qU1hld25PSzF2RGsyUTAyOTVqcExhTXpvc0t2MmtlalZrd0Y2czJsTlgzUUpYRVRJUkJub0xWbDJRcFNDTWlXSWliSzVNckNmWGE2SllyeVJZZzVUTXEwdWRoSDh0UjRFZDRKVldBTWZJNHQxelo2SUtIS0tyT2tiNU1obUZGNkVrV2pLMG9KQVlRdmN3aHQrWWVzTGhqVGgxeWl6K0daTGlUczBJN0FhWmlob1pjd1FpYlJwN0pLeU8xUERLWUFKQ3pBTWxreGhBamxwSkY4Sy9DaXhYWmJiWk85bm5pTDlvNnNhcVpCeXplTmV6SHVVdGdFbTdoeUtZR3pRaHh6N1l0ZGZCY3JoLzNzTVB0Y1lxcDE2ZzZFTHZ6YllpRk9xYXFKR21ZeHlNZ0xxdWNiQUt3dFZiZEppVWxGZ2lHTDdNVzdFaDJDY1o2RXZNaEYzU1pTYmVKUWlkZlZYVUVkUHIwTElyV3NYeVJqN2hDa21OdXN1eVh4MnJpNlhONDlKRHlDYVZuUzRaMjVEUnVibWpINkpqS0RFcEphMmduUmNQb3RrQ0FhZ2JhV0gzU09HQXJRQzVVR2R2R0VvbG81a00vWlJkam5ySGJiVXpDR0xsWW9Zc1p3L0o0N3hzSGVxek90M1ZrcWk2STRzOVRVOThmVzJnTU1Hd1pFY25wTzNMS1djbklMWWI1SEthbWhxZXgrK2N4RlVIa0Zaa01yQVpjZmtUVTVCR29MNmtGckFEUG8rUnQwYmNQeCs1RUtiSldSN3QyNys3cTZ2cHEvLzZEbDZmR3ZwL2R4TW0rbTV5Y1dsdGJXMTlmUDcreThxYmNlQzc1U0R6Y2FKZEtGRWZmdlNqRVlsOHdqQ1NNeWo0alFtb3VuWlFmNWs4Z0Z0SHZxeUVlQXN3aG1JeHF0WHBDeEwzUm84TWl1Z1JlS3N4VUxBdnNMaDlzbEhmN1ppY25WOWZXbHBmWEgxdzcvN0ljV2RYelF6K0lJbVpqM3JtelBCbmhseGpvRjJVeTUrY3NXMEVQb2hTdHUwWlZGU2RtWm1hT0hqMDZmSFM0YTNoNE55Q0VXQ0ZhRm5MeVRXSW5lWGVzOFI3VS9Qems2dXJxNWVYbEI5ZXVuWmQvM2gyS0oyWVZLUmRMTjdZT0lhTzkwYWJrWW9TS095YVFMdEovckFMYUN6REFsTllyaHAwV01UNCtQakx5ZG1ibTNyMGJYdlhHcUtRUUE2SkxUYnJNYkZjU3BpNXJ4WmY3OXo4N2VGQ1FUYkN0Q2Nqc1dKaWUvbDRndUx5OC9QemF0YnNDd1RKUE1TYUtEclBVY3ZMV1VVeUp4d3lFdzZqa3JTUDV2SURXTUltUGlCT0NQNHBBWFRZQ0xuMEFMVVJQd2dZN3ZKQUFYVDQ0TmpVMmUyd3pMV3M1OW4wM1B6MDN0YnAwWmZuWmo5Zk8xK0pZa0xDSnpuc2NFSGNDcHNocEQxaWdBTTJjdURjOFVUdFZsU0FaM2VGNGRObE02ZXB5bVFPeGYvLytLd2NQTG8yTmpSMmJiZDkvenpJOVAzMXg3c3phMHRMeTh4OS9yQTMwcWpUMlVlUWdNWTNkSDhCRVROcDlCVSsxK2tvbzBEMnBRRUtnaDVFWXU1MlVTZ2xMenJzMFFETER4a1F0UFBaMTJ3RGFMUFo5TnoxNzVzemMwdExTc3grZmYxbXJEY1NnaEpKK05WNGJnMnFnQ0NRVldpZllicmZOa0VwZHU1MVVBMTFpYTc0eUVpUUFPamE3QlgrSzRXUEYvUFQ4azdrenQzNVl1di96ODRjOUoxN05uSGgxVCtOakFOTE1BZjUwdWNnNERDSUpBbzBlbS9xMmRZM2U3akhib055a3BacklzUHNITHdzSm1qbzIyOHF6aEo5azdPT0psckJERnBoS295OGZYQk5GN05qc3QrMCs4YmJGVjFrOEVoTDBrOUpvNlJ1LzNiNGF2ZFd4SC9sbEpFaGsyT3kzZjFzSmV2OFFKbWhNYUhTN1Q2T0IrQitDL0tPcjBoNHBkQUFBQUFCSlJVNUVya0pnZ2c9PSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLWludmVydD0idHJ1ZSIgZGF0YS14cmFuZ2U9Ijc1IiBkYXRhLXlyYW5nZT0iMzAiIGhlaWdodD0iNTAiIGlkPSJwYXJhbGxheF9idWlsZGluZ18yIiB3aWR0aD0iMTE2IgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIUUFBQUF5Q0FNQUFBQzZSUTlrQUFBQUEzTkNTVlFJQ0FqYjRVL2dBQUFCZ0ZCTVZFWC8vLy9reVptMXBJRGV4cHI3M3Fxbm1uYWxsbkdubW5uMzNhcWpsWG4xMmFuc3pwaTdwNFBVdlpQdTFhWFB1bzZ0bTN6cjBhTGZ4WmJOdDR4eGJXT1VpbTZ5bjNsN2MyTnNhRjIrcklTdG0zeW9tNEMybzN2MjJLU3puVytybklHZWpHdXFsbTNaeEpaeGJXTjBiRnZVdlpQdjBKdm56WjJNZm1QQXJZcTdwNFBYdm83UXU1TEZzb3ErcklSc2FXRHgwNTdFcllLem5YQ3NtbktGZTJxb200Q1BnV1NNaEczUXU1S2NrM09sbG5HamxYbDdjMk56Y0dlSmYyMTdjMk9KZjIzRnNvcVVpbTYrcklTY2szUEFyWXAvZVdsL2VHV2ZrbnJHc0l6QXJZckdzSXljazNQTnQ0elh2bzY3cDRQcjBhTFF1NUs3cDRPbWsyemZ4WmJaeEpiRXJZTDEyYW51MWFXd20yNzUzS2ZtemFIbnk1YU1nM04vZVdtZmtucWFqbm1VaVhTTWhHMk1nM09ybklHamxYbVVpbTZVaVhTTWhHMkVlR04vZUdXMXBJQ2FqSE9GZTJyR3NJeTdwNE9WaG1lK3JJU3RtM3lubW5tZWpHdVVpbTZWaG1mVXZaUFF1NUxOdDR6ZXhwclB1bzdHc0l5N3A0T3luM21tazJ3Ky9NVjBBQUFBZ0hSU1RsTUEvLy8vLy8vLy8vLy8vLy8vLy8vL1JQLy8veUozL3lJUjd2OUUvLy8vUkhlNy94RWl1Ly8vUkhmdS8vLy8veEgvLy8vL0lqTkVWYXFxek13UkVTSXpWWGVJdTh6ZElpSXpabVozZDRpWnFydTd1N3ZNM2QzdTd1Ny8vLzhSRVNJaUlpSWlNek16TXpNek0wUkVSRlZWVldabVptWm1abmQzZDRpSWlJaUlpT21hcjFjQUFBQUpjRWhaY3dBQUN4SUFBQXNTQWRMZGZ2d0FBQUFjZEVWWWRGTnZablIzWVhKbEFFRmtiMkpsSUVacGNtVjNiM0pyY3lCRFV6UUdzdE9nQUFBRnpVbEVRVlJZaGVXWGgzc2FSeERGdlN6SEhRc2N6VUVLQ0ZWa2lJTktGRVcyNVJaRmNWd2pKRnZOVHUrOTkrcC9QZk5tQ3dmY3hZb3NmOG4zWmNCM2dqdnY3OTdzbTlubDFLbEh4TnlqYm5nQ01mN1Uvd1U2OTI5QWwvNUw2WDNucTQzZjV1ZC91ZjNacFNjQVJYcC9HQi82OHExZkQ0SUhZWFA1VEM3M2VtNzMxcHNuRFlYUzlkTURYNzI5blZaQm1rSXBWYzRoWHIxODh0Q0xBOUNmQWlJcWZ0TS8xV3dUZGE5MG90QzVJZWlsYmFoa29ZQUc5T2N5aXoxSjZKRFNOdzQxS2cwd3ZSVE9UVkMzSGd2endjYkc3WkpyZm9OS0x4OHFUbXM2SUJ4VCtjUHlZMUp2SHFnbXhyaGxQcFBTcTU0cm0yMVd5RnlYWkR6R0dWQy9PU2J5OGpZUDFLUkJkcTlZNkRudmdybjhjd0FDWlJjKzRya2xVOEZYSVp2NHh2R2cyMHFMZUVEVVBTNTc2a2puZkFOOUQ1Y1VweFpZZmVKc2E2bTd4MkorQ1NJa0JDRlYvWmFGV3FWYlNydEk2ZHdxN1NqT0RjOXE3bGlGYzJEbXl6dzZFdHhQNzFJakRLa2RORlV6UkRUNXRrREJVVW9iT0xkM1ZORDQ2dXJxalFaaTZtWVlsc3ZsMThvSVFiRTNUMUVSVWtpRXdFbmdqSU9zZHJ2ZGdyUXgreXpIdDZjNXh1aWwzd2xiZ0JKR0VHWTBHazg0aFA0aytpZGgrUHhuUG5Xa0dJdUgydEcwQUl2UVdBc1hScUZSaXkrT3hreUUyb0dseWQrd1BQMUlmZUU2d1NlaDlCL25tS0I1c1pqSlpqTmVER3VoNmxQVWs2QlRGaVZkSXFXRldxUjBhdnNaWjJnMW02RlhETFJZb1F1WnpFUVNWRVNzYVUvbWk3SnlFZXBUd0UwK1ZSQmFhWUZHem1ZbllxQ3loa3UxMVBVRTl6cnZHSjNXUkVLRzZIRksyVFZGVnlhZFUxUXJad0dWa0VORHgwQVhBYTBuS0cxRWpDUDdKNkdoS3RyZmJjOExTS25RMEJyeVc0K0RWbW0yczM2eWV3Y3Q1R1pYaXRCMkhUUjJkRUR1OFJHb1dNVFFNVTRxaWdJbTFmdTdraEd1VEkxNzlKR2dRZGd1dDh0NDYwNFZtUFF5VkVwMlVpWU9Xc2tpVXE4a3VGZEdLbFZFZkNwSWFhQXF2dWQ3bnVmalFFZHU5VENTVG04QlJvcHhVbEdJT2wzSzFCSkxwbDkrSXRKOTZIT1pVbG9obEllaTgvbHNvTkxNcWN3Z1JpZVZvSGxVVXoxSnFlMHh3cHJXYVE5cC9tYVpDSlVzTlRCR2trOXpla1VkL3ZWam9MS0t4L0VUNW5UQXZKRmxSREEwWGRFd3BCWUgzaHhGb0lzWWV0UkpSWW5NMDVWazkwYTdqc3N1bDB3NlBXczFjblk5TGhxNGw2R0NlMUoyMUVta3RNS040OU1FYUg5RmtXNE4wVThDYU1WbVZ4OEhvSFFYZWhMYTNZaFMxRERGRi9GejZ0cXNOR0RoSE1WUWRxNXYwRjZnVE1tWTlGYllTU005cVlnbEFkQVhFK2JVcmN2V1NxNFhjM3AxWGkwM01FcDVUbkZYSGUxaHhMN2tYcm1BSkx5VWxONzR6b0Qwa3F4WnJkVFRaY29sbzFKZG8xU3drMkpXTnlndDRIRmVUb1FLbDFqaFZsTDhVUTQ0dld3aTB5SzRIMGJjSzZxWk9DZVJVdlFra2pyOE05T2sxNVZMWkxYV1NUYnUxUnExWE94M0F6dW51SkY3MG9pVGloaXNqaVhvYWdLMHZ6RnhENkMxYS9mYUt1VVU4N0xqb0xnNTFrbVlVM0VXVW1PZFZMSXJkdjlnOWk1VXAwclhxZS9BbnUxSVRpbnB5WTQyd2lKRzdRRWE2NlRTWU9lTEZLd1E1WFNrSStsNXhaSWU5TjFMdCtmMUdqWVlWWXh5SG5NYTY2UkdaRjltNTlXdXFyVEthQ01abWI1THIxT0tIb3V4UjVYU1poM0dqblhTRkV0c2kzYTd1TEN3c05pMVdua1JWMWhsVEhLMVlHeGJWQlRLcS9XSWs0cWNySXZ3V0p5VHBsZ2RwcXJLZVluMmYxWnFTbFJuMStlZmlZQmVNMFlTZXQ4MzVLUWlwNjBIYUp5VHVHUWtWa2tOalc3UnNIT29HQnNacmRpdDhNYnNtcTVUR2Ura0lydWlsOVNUU3Z3ZjAwNnBiVW5PU0VhaWJRN1lLRm1sMm01NWJCNkduRlRreDk1Qm9jWTVTZGNwdWx2VjJzNzFDbHVuRnVyYk9lMEt1Vzk2citteDJXRW9IbWNXTlpPZG1aNWU2MXh2UmFGTHErL1NyOFR6RkgvODJidDd0L2NNeCs4N08vUXpjZmZ3OEhCUE55VGRnUDIrZS9lTlVpa0szTzVxRTRpYWlmeHppT3J6aUpXVnlaVkp4UHJNdyttdk81KzBZanRqVWx6NTZNT1BYNkI0Ly9OU28vSGRuVHZmOXpZM04zdTkvZlgxOVh2MzdrOWk2SlhKK3pNY0Y2WTVmdXgwMXRZNmE1MVdxelhXY3JTL0FHU2hqNW5vR3JaTUFBQUFBRWxGVGtTdVFtQ0MiPgogICAgICA8L2Rpdj4KCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8Zm9ybSBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIGlkPSJzZWFyY2giIGFjdGlvbj0iL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxsYWJlbCBmb3I9InNlYXJjaCI+RmluZCBjb2RlLCBwcm9qZWN0cywgYW5kIHBlb3BsZSBvbiBHaXRIdWI6PC9sYWJlbD4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSI+CgogICAgICAgIDxpbnB1dCBjbGFzcz0iYnRuIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPgogICAgICA8L2Zvcm0+CgogICAgICA8ZGl2IGlkPSJzdWdnZXN0aW9ucyI+CiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvbnRhY3QiPkNvbnRhY3QgU3VwcG9ydDwvYT4gJm1kYXNoOwogICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vc3RhdHVzLmdpdGh1Yi5jb20iPkdpdEh1YiBTdGF0dXM8L2E+ICZtZGFzaDsKICAgICAgICA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2dpdGh1YnN0YXR1cyI+QGdpdGh1YnN0YXR1czwvYT4KICAgICAgPC9kaXY+CgogICAgICA8YSBocmVmPSIvIiBjbGFzcz0ibG9nbyBsb2dvLWltZy0xeCI+CiAgICAgICAgPGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHRpdGxlPSIiIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVJwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1RXRmphVzUwYjNOb0tTSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZNVFpDUkRZM1JFSXpSakF4TVVVeVFVUXpSRUl4UXpSRU5VRkZOVU01TmlJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk1UWkNSRFkzUlVJelJqQXhNVVV5UVVRelJFSXhRelJFTlVGRk5VTTVOaUkrSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2tVeE5rSkVOamRDUWpOR01ERXhSVEpCUkRORVFqRkRORVExUVVVMVF6azJJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1V4TmtKRU5qZERRak5HTURFeFJUSkJSRE5FUWpGRE5FUTFRVVUxUXprMklpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtTTTlNQ0FBQUErNUpSRUZVZU5yRVYxMUlrMUVZM3M0K2RkT3AyOVE1YjBvcENnS0Zzb0tvaTVLZzZDSWh1d2k2ekxKTG9ZTG9wcTRxc0tLZ2k0aTZDWUlvVS9xNWlEQUtzNnN5b1M3NklSV3R5SitwN2NkdDdzZjFQR09EK2UwYzNkeWdBeC82N1p6elBNOTUvODc3R1lkSFJnM1pqTVhGeGVwUUtOUzZzTEN3SnhxTk51RnBpTWZqVnM0WmpVYS9wbW1qZUQ2VmxKUzhOcHZOVDRRUTdteHdqU3NKaUVRaW0vMSsvOWxnTUhnSXI1b2h1eEcxV0N3OVZxdjFjbEZSMGRDcUJPREVsVjZ2OTBvZ0VEakdkWWJWalhocGFlbmRpb3FLMDdDSVI3WkFxRTQ5UFQwOUJQTDJQTWdUQnlRR3NZaVpsUUQ0dU1YdGRyK0p4V0lOaGdJTlloR1QyTXNLZ01ybTJkblpYZ1JYaGFIQWc1akVKb2RVQUh4dXg0THVkSEpFOVJkRWRBK2kzSnV6N2JHSGU0bWhFOUZOcmd3QkNMaXJNRlY5T2toNWVmbEZoOFBSNW5LNW5EYWJyUjJCTkpsS08wVDM1K0xpNG40Ky9KKy9KUUN4aG11NWgzdUpvWE5IUGJtV1pBSE1zaFdCOGw1L2lwcWFtbWFBZjB6UEREeDFPTlYzdnVyZGlkcXdBUUwrcEVjOHNMY0FlMUNDdlEzWUh4SVc4UGw4NXhTV05DMWhBRERJdjBySUUvbzRKMGsza3d3NHhTbHdJaGNxM0VGRk9tN0tOL2hVR09Ra3QwQ0ZhNVdwTkpsTXZ4QkV6L0lWUUF4Zy9aUlpsOXdpSEE2M3lEWWllTTdEbkxQNUNpQUdzQzdJNXNndFlLSkdXZTJBOHNlRnFnRkpySmpFUFkxQ24zcEo4LzlXMWU1VldzRkRURW1GckJjb0RoWkpFUWtYdWhJQ015S3BqaGFocU4yMWhSWUFUS2ZVT2xEbWt5Z3JSNG80QzBWT0xHSktyT0lUS0I0amlqemRYeWdCS2l4eUM1VERRZG5rL1B6OHFSdzZvT1dHbHNUS0dPUVc2T0g2RkJXc3llUHhkT1hMVGd4aXllYklMWkNqeitHTGdNSUtuWE56YzQ5WU1sY1JkSFhjU3d4RlZnVEluUWhDOUczM1VoTm9KTHVxcTZ0MzQ1cDl5M2VVeThPVGs1UGpBSHVJOXVvNGIwN0ZCYU9oc3UwQTRVbmMrVDFUVTFOajNLc1NTRTV5SjY1anFGMkREZDhRcVdZbUFacklNMlZsWlRkblptYjZBYnBkVjlWNmVjOXpuZjVRN0hqWXVtZFJFMEpPcDNNaml0TzRTRmErY1p6OFVtcWUzVENiU0x2ZGZrUi9rV0RkTlFsNUludVRjeXNPY3BGVDM1WnJiQnh4NHAzSkFIbFpWVlcxRC82MzRWUnQrRnZMQmdLL3Y1TFY5V1MrMTB4TVRFd3RSdzdYdnFPTCtlMlE4VjNBWUlPSUFYUTI2L2hlV1ZuWkNWZmN5S0hnMkNCZ1RwbVBtallNOGwyNEd5YVVIeWFJaDdYd2ZSOUVyRThxSG9EZm4yTFROQVZDMEhYNk1GY0JJUDhCaSs2RjZjZFcvRElDa0FOUmZ4OTlmRVlGUTdOcGg1aS91UWlBMjE0Z25vN0srZ3VoYWlLZzlnQzYyK004ZVI3WHNCc1lKNGlsYW02MEZiN3I3dUFqOHdGeXV3TTFvSU9XZ2ZtRHk2UlhFRVF6Sk1QZTIzRFhyVlM3cnR5RDNEZjh6L0ZQZ0FFQXpXVTVLdTU5WkFVQUFBQUFTVVZPUks1Q1lJST0iPgogICAgICA8L2E+CgogICAgICA8YSBocmVmPSIvIiBjbGFzcz0ibG9nbyBsb2dvLWltZy0yeCI+CiAgICAgICAgPGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHRpdGxlPSIiIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVJwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1RXRmphVzUwYjNOb0tTSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEVRVU0xUWtVeFJVSTBNVU14TVVVeVFVUXpSRUl4UXpSRU5VRkZOVU01TmlJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRVFVTTFRa1V4UmtJME1VTXhNVVV5UVVRelJFSXhRelJFTlVGRk5VTTVOaUkrSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2tVeE5rSkVOamRHUWpOR01ERXhSVEpCUkRORVFqRkRORVExUVVVMVF6azJJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1V4TmtKRU5qZ3dRak5HTURFeFJUSkJSRE5FUWpGRE5FUTFRVVUxUXprMklpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtoZlBSYVFBQUI2bEpSRUZVZU5yc1cybU1FMlVZYm9kdHQrMjIyMnUzNVFoZW9DQ1lHQlFsaWdJSmdrWkpOUHpnaWdvYVRFajhBZEZFTWZBRGZ5QUJrZ1dpaVdjaWVLNFMrUU9pSEFZVWoyaE1OS2dZbEV1anBOdHR1OXZ0dGJ2ZHcrY2hVMUs2TTUzNXB0M3ViSENTeWV6UitiNzNlYjczK3Q3dnJmWHN1Zk9XNGJ6Nit2b205L2IyM292bk5OdzM0YjV4WUdBZ09EZzQ2TWJ0NG1lc1Ztc1dkMXFTcEhoZFhkMmZ1UC9BZmNwdXQ1L0E4OHh3eW1jZEJnTHFlbnA2RnVSeXVXVjR6dS92NzU5UXlXQmp4b3o1dDc2Ky9ndW4wOW1LNXhGeWFrb0NBUFNhVENhek5wdk5Qb1lWYmg2TzFZS0dSRjB1MTNzTkRRMjdRTXpmcGlBQUtqMGxuVTYvZ0JWZkFaVzJXV3B3d1Z6eTBJZ1AzRzczRnBqSTZSRWhBR0E5cVZScUExYjltVm9CVnlJQzJ0RGk4WGcyNCtkVXpRaUFiUy9zN094OEcyby8zbUtDQytadzBlZnpQUUVmY1ZqWXJBUlgzZGJWMWJVdEhvOGZNZ3Q0MmYrTXAweVVUVlFiZFdzQUhWc2lrZGlIa0hhUHhjUVhRdWZYZ1VCZ01SeG1lOVUwQUF4Zkg0dkZ2ak03ZUY2VWtiSlM1cW9Rd0VRR0E1N0FjNUpsbEZ5VVZaWjVja1VFZ01WeHNLMmpsU1l6SStRWEpzaXlqek5FQUp5SkF6Yi9LUWE0MWpKS0w4cE9ETVFpVEVBeW1YdzVuOC9QMElqRDNiaDdSZ29nNTlhYW54aUlSVFZ2Vi9vajB0bkhjYS9XTXJWd09Ed0IzcmFUR3h6a0JnL2duWlZhcEZWNjJXeTJuNUFPNzBITS81d2JKMFFuWHlRU2FWUERJdU5aelkwVjNudEhNd3hpd0hBMEdqMk5wN2VjSUJEZ2FEQVlYS0NRSk0xRGhyZ0ozbmh1bGNQYmw4ajRObUhlNDZYL2c2MGZ3YnozYWV3amtxRlFhQXFlYldVMUFPcXlRd3Q4SWQ2cUVITWM5N3p1N3U3RkdHc243SEFpVnVvc1Z3N1AzNUMxbmNjZGdTQ3hvcDFkSGVac3dtZkhNbnhCbzZaVGsrak44ZGwvdkY3dldvZkRzYStNTE45b0VVQk14T2IzKzFlb0VzQlZ3NlptdWE0OXI4WW1oQUtEaUVQY013QnN4TWlxUStpeHpQRnhaeXFScFhBUkcvWU9yMU9iRkowZ1Vza1hCYmFtY1IxT0ttTVV2RHhIUkF1OC9MbVkzakZMTVVwRnF6OUh4RzY1c21ZSmR5S3lFQ094RGlFQWUvcDFnakYyb29uaXZaQXN4VmdsMmRhYTRFUVdDVzZKNTVxRkFGRlppSldZTHhOUXkycU9TVXpHUnN5WENVREllbGl3QUhFTzRXU2xXUUJSRm9aYWtYY0ttQ1hteVhBS3MwVmU5dmw4cTQyV29JWXBKVTRoVjNoS2NOczhtOWdsN3AveFE3M2VGNWtCNGo1bU5yV21USlJOd0F6cWlWMUN4alZUWkNJa0VxK1oxYlpGWlNOMkNlbm1WQUZWeTRQbHo4eEtBR1dqakFLRms2bENCTURSL01KakxMTVNRTm00M3hBaVFLVGFBKzkvd2V3aERqTCtKVkkxa2tUU1NPVGNLYk1Ud1BxRVNBb3Q2ZG42RnIxZ0h3VkpqdTZJUnV5aUJ5UHVVVUJBZzVER2tBZ0JteGx2ZGdJRUs5Z0Rrb2hkWS9CSm80Q0FHMFI4bWlSU3NHQUJrZ1ZRczRLWHUwOThJZ1VYU1NSc0ZBb0taaVZBVkRZMldVaWlQVGpZUmk0MUt3R2lzckdzTHRsc3RoOEZpd256MmZCa1F2V2ZSdGxFM2lGMnlXNjMveUNhY1haMWRXMDJHd0d5VEZhUmQ0aWRKbkNLSFJhQ3hZUkhvRzVMVEtUNlN5aVRvUDFmSkhibUFZUFlSUjBVblpRdE1uQTZzMHpnK0daQmx0MEdkbzdFUEhncEUzUTZuWjhZeUxoYzhYajhNSmgvYUtUQVkrNUZQQUtITEU3UmR3dVlKWm1Od3p5Q01rQkNZeUtST0pCTUpsOUIvUFhYQ2pqbUNtRE9WekgzZmlQcE9iRVdHcW9LZTRFQmw4djFobHFzZEx2ZDIzbWt4SE05cGM5a01wbW5vOUhvZVRpaTdld2JIRVpQUHgxenRMUzF0VjNBbkd1TWppTmp2YlFGdUh3NnpEbzVCeTdkVFBBUU5CZ01MclJhclRrU2xzMW1ud1Q3dXdwOXZpcng5UXpiVy9IdVYvajVkL2IrNmpuaUtsbGxQOGxrZU9OSkRrK2RxOUdzUVRuQzRmQjFoZU8wSzQ3SHdlN1dkRHI5bkFLZ1h3T0J3SEkrQzQ1SHRqMWQ2c2Q0MjlUVU5FY21VZGMrUFJhTEhjdm44N2RYVzR1Z3pkc2FHeHVmTDk0TkZ2OXppMUo3R1ZiaGx2YjJkbmFKM1NWcnhmYytuMitOVHNaNy9INy9NcjNnNVhkU0lIeUpTSDFQWis3ZlRveWwyK0VycWlsZ1o0TmFMWUI5Z29WR2FIalI5M0h2MVpyVTRYRHNGVDIwa0gzUE9iemJXazBDZ0cxamFjVklVbkFRYjlGK1ZleHlMTXprcGNMdjBJSlY3QUhRSU9DQVVZSHg3djVxZ1NjbVlIdFRxU0F5WkxFSlRLMjJCaWU0aXEzeHNxcG00U0FmOUhxOWEyRG5KNHVMSzNTRVVMY2RSdnAzaTN6SHlTcXBmaWN4RWRzUWMxTnJsWVhYdlIrTzdxQVNTZXpYQitoMVN1VW9tZ2c5TEw4QlVvVjQ3NDlFSW9sS2grRWlxV21xVkVabERnSGtzMnB4SHc3eFRxVVF3OUo1TmNBWE9LMTBBR0lvWjZabGk2Slk2WjFRNDYxS29aNE5pS0xIYXJXK0tEc3hsRFVQSFo1elBRWnFVVkRQSnNUcWI1bjltYWxicEFoOEMyWFhETGw2MitXWklERlJVbE5WT2l3ZW5jbk5VM2FRRWtMK2NETVNvTHZabzJmUUI3QUpzc05BdUZ1dm9ybERWVmtrZzJJODcram8ySzJRQVZwaERyZnlWaUs1VnF0TzM0T2theFhDcCs3ZHJkREJDQWR1Ym02ZWlkWCsyV3dxVDVrb213aDRZUUxrK0g0YUU5M2g4WGcyZ3ZIZWtRWk9HU2dMWlRMeURUTEo0THg5L0taV0tCU2FpblQ0SXkzRnFRQmZuVVpSNDJQS1FGa3NCcjlRS1ZYQ1B1c0QzT2lBL1JrUTVrUDhxVi9KbDFXeXdBcC82K2RjbVBNMnpMMVVyVWFoZTRKcWZuV1dLWEl1bDN1VWJmUDhuakFGTFcxT0ZyM2dkRnRaNzJjTkgrUHRRVDcvYnJXK05YcUpBSGgweTlWOC9VL0ExVTdBZndJTUFEN21TM3BDYnVXSkFBQUFBRWxGVGtTdVFtQ0MiPgogICAgICA8L2E+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvX2Vycm9yLmpzIj48L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K) + format("embedded-opentype"), + url(data:font/woff;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGNvbnRlbnQ9ImRlZmF1bHQtc3JjICdub25lJzsgc2NyaXB0LXNyYyAnc2VsZic7IHN0eWxlLXNyYyAndW5zYWZlLWlubGluZSc7IGltZy1zcmMgZGF0YTo7IGNvbm5lY3Qtc3JjICdzZWxmJyI+CiAgICA8dGl0bGU+UGFnZSBub3QgZm91bmQgJm1pZGRvdDsgR2l0SHViPC90aXRsZT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+CiAgICAgIGJvZHkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWYxZjE7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICAgIGJvZHksCiAgICAgIGlucHV0LAogICAgICBidXR0b24gewogICAgICAgIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgICB9CiAgICAgIC5jb250YWluZXIgeyBtYXJnaW46IDMwcHggYXV0byA0MHB4IGF1dG87IHdpZHRoOiA4MDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB9CgogICAgICBhIHsgY29sb3I6ICM0MTgzYzQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KICAgICAgYTpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CgogICAgICBoMyB7IGNvbG9yOiAjNjY2OyB9CiAgICAgIHVsIHsgbGlzdC1zdHlsZTogbm9uZTsgcGFkZGluZzogMjVweCAwOyB9CiAgICAgIGxpIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgICAgbWFyZ2luOiAxMHB4IDUwcHggMTBweCAwcHg7CiAgICAgIH0KICAgICAgaW5wdXRbdHlwZT10ZXh0XSwKICAgICAgaW5wdXRbdHlwZT1wYXNzd29yZF0gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiA3cHggOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgY29sb3I6ICMzMzM7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0IGNlbnRlcjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwwLjA3NSk7CiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZS1pbjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZS1pbjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CiAgICAgIC5idG4gewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIGNvbG9yOiAjMzMzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRTsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgjRkNGQ0ZDLCAjRUVFKTsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoI0ZDRkNGQywgI0VFRSk7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgfQoKICAgICAgLmJ0bjpmb2N1cywKICAgICAgaW5wdXRbdHlwZT10ZXh0XTpmb2N1cywKICAgICAgaW5wdXRbdHlwZT1wYXNzd29yZF06Zm9jdXMgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBib3JkZXItY29sb3I6ICM1MWE3ZTg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgNXB4IHJnYmEoODEsIDE2NywgMjMyLCAwLjUpOwogICAgICB9CgogICAgICAuYnRuOmhvdmVyLAogICAgICAuYnRuOmFjdGl2ZSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoI2VlZSwgI2RkZCk7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCNlZWUsICNkZGQpOwogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKICAgICAgICBib3JkZXItY29sb3I6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5idG46YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkY2RjOwogICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjYjViNWI1OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTUpOwogICAgICB9CgogICAgICAjYXV0aCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB6LWluZGV4OiA1MDsKICAgICAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTMsOTUsMTIwLC40KTsKICAgICAgICBwYWRkaW5nOiA3cHggMTBweDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMTBweDsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMHB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgM3B4IDAgcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgICNhdXRoIGgxLCAjYXV0aCBwLCAjYXV0aCBsYWJlbCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuYXV0aC1mb3JtLWJvZHkgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQogICAgICAjYXV0aCBpbnB1dFt0eXBlPXRleHRdLAogICAgICAjYXV0aCBpbnB1dFt0eXBlPXBhc3N3b3JkXSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgd2lkdGg6IDE3NXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogOXB4OwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OwogICAgICB9CiAgICAgICNhdXRoIGlucHV0W3R5cGU9dGV4dF06Zm9jdXMsCiAgICAgICNhdXRoIGlucHV0W3R5cGU9cGFzc3dvcmRdOmZvY3VzIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSgyNTUsMjU1LDI1NSwuNSk7CiAgICAgIH0KICAgICAgI2F1dGggLmJ0biB7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICB9CiAgICAgICNhdXRoIC5idG46Zm9jdXMgewogICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSgyNTUsMjU1LDI1NSwuNSk7CiAgICAgIH0KICAgICAgbGFiZWxbZm9yPXNlYXJjaF0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgI3NlYXJjaCBsYWJlbCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDIwMDsKICAgICAgICBwYWRkaW5nOiA1cHggMDsKICAgICAgfQogICAgICAjc2VhcmNoIGlucHV0W3R5cGU9dGV4dF0gewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICB3aWR0aDogNzA1cHg7CiAgICAgIH0KICAgICAgI3NlYXJjaCAuYnRuIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICAgIHdpZHRoOiA5MHB4OwogICAgICB9CiAgICAgIC5sb2dvIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW4tdG9wOiAzNXB4OyB9CiAgICAgIC5sb2dvLWltZy0yeCB7IGRpc3BsYXk6IG5vbmU7IH0KICAgICAgQG1lZGlhCiAgICAgIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICBtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLAogICAgICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzogMi8xKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICAgICAgIG1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLAogICAgICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgICAgICAgICAgICBtaW4tcmVzb2x1dGlvbjogMTkyZHBpKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICAgICAgICAgICAgICAgbWluLXJlc29sdXRpb246IDJkcHB4KSB7CiAgICAgICAgLmxvZ28taW1nLTF4IHsgZGlzcGxheTogbm9uZTsgfQogICAgICAgIC5sb2dvLWltZy0yeCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgfQogICAgICB9CiAgICAgICNzdWdnZXN0aW9ucyB7CiAgICAgICAgbWFyZ2luLXRvcDogMzVweDsKICAgICAgICBjb2xvcjogI2NjYzsKICAgICAgfQogICAgICAjc3VnZ2VzdGlvbnMgYSB7CiAgICAgICAgY29sb3I6ICM2NjY2NjY7CiAgICAgICAgZm9udC13ZWlnaHQ6IDIwMDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luOiAwIDEwcHg7CiAgICAgIH0KCiAgICAgICNwYXJhbGxheF93cmFwcGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLWluOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLWluOwogICAgICB9CiAgICAgICNwYXJhbGxheF9maWVsZCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgaGVpZ2h0OiAzNzBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfZmllbGQgI3BhcmFsbGF4X2JnIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAtMjBweDsKICAgICAgICBsZWZ0OiAtMjBweDsKICAgICAgICB3aWR0aDogMTEwJTsKICAgICAgICBoZWlnaHQ6IDQyNXB4OwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgd2lkdGg6IDk0MHB4OwogICAgICAgIGhlaWdodDogMzcwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiBpbWcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9lcnJvcl90ZXh0IHsKICAgICAgICB0b3A6IDcycHg7CiAgICAgICAgbGVmdDogNzJweDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9vY3RvY2F0IHsKICAgICAgICB0b3A6IDk0cHg7CiAgICAgICAgbGVmdDogMzU2cHg7CiAgICAgICAgei1pbmRleDogOTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9zcGVlZGVyIHsKICAgICAgICB0b3A6IDE1MHB4OwogICAgICAgIGxlZnQ6IDQzMnB4OwogICAgICAgIHotaW5kZXg6IDg7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiAjcGFyYWxsYXhfb2N0b2NhdHNoYWRvdyB7CiAgICAgICAgdG9wOiAyOTdweDsKICAgICAgICBsZWZ0OiAzNzFweDsKICAgICAgICB6LWluZGV4OiA3OwogICAgICB9CiAgICAgICNwYXJhbGxheF9pbGx1c3RyYXRpb24gI3BhcmFsbGF4X3NwZWVkZXJzaGFkb3cgewogICAgICAgIHRvcDogMjYzcHg7CiAgICAgICAgbGVmdDogNDQycHg7CiAgICAgICAgei1pbmRleDogNjsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9idWlsZGluZ18xIHsKICAgICAgICB0b3A6IDczcHg7CiAgICAgICAgbGVmdDogNDY3cHg7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9idWlsZGluZ18yIHsKICAgICAgICB0b3A6IDExM3B4OwogICAgICAgIGxlZnQ6IDc2MnB4OwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgoKICAgIDxkaXYgaWQ9InBhcmFsbGF4X3dyYXBwZXIiPgogICAgICA8ZGl2IGlkPSJwYXJhbGxheF9maWVsZCI+CiAgICAgICAgPGltZyBhbHQ9IiIgY2xhc3M9ImpzLXBsYXhpZnkiIGRhdGEtaW52ZXJ0PSJ0cnVlIiBkYXRhLXhyYW5nZT0iMCIgZGF0YS15cmFuZ2U9IjIwIiBoZWlnaHQ9IjQxNSIgaWQ9InBhcmFsbGF4X2JnIiB3aWR0aD0iOTQwIgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQWdBQVpBQmtBQUQvN0FBUlJIVmphM2tBQVFBRUFBQUFVQUFBLys0QURrRmtiMkpsQUdUQUFBQUFBZi9iQUlRQUFnSUNBZ0lDQWdJQ0FnTUNBZ0lEQkFNQ0FnTUVCUVFFQkFRRUJRWUZCUVVGQlFVR0JnY0hDQWNIQmdrSkNnb0pDUXdNREF3TURBd01EQXdNREF3TURBRURBd01GQkFVSkJnWUpEUXNKQ3cwUERnNE9EZzhQREF3TURBd1BEd3dNREF3TURBOE1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd00vOEFBRVFnQm53T3NBd0VSQUFJUkFRTVJBZi9FQUxZQUFBTUJBUUVCQVFBQUFBQUFBQUFBQUFFQ0F3QUVCUVlJQVFFQkFRRUJBUUFBQUFBQUFBQUFBQUFBQVFJREJBY1FBQUVEQXdNQ0F3VUdCQUVHQ3dnQ0F3RUFFU0V4QWhKQlVXRnhnWkdoQS9DeHdTSVQwZUh4TWdRRlFnWUhGMUppMGlQVEZCVnlncExDTTJPRGt5UWxOYUt5VTZPek5FVlZjMFJVcEJZUkFRRUFBUUVEQ2dRRUJRVUJBUUFBQUFBUkFRSURVd1FoTVpIUmtxTFNCUllYUVZMaUJxRkNRd2ZoZ2hSa0ZWRVNZaE16Y1lILzJnQU1Bd0VBQWhFREVRQS9BUG10K0tMNmZIeU13RHU5U3FsVUZ0QlJBeklsTUJzSGRWREMxVU9CMjRRcGdORlloOFVGQmFmYWlKVEFDcFBaVkR0QTBReVlXbEVwaGJNcWh4YVVRNHRQZFVweGJQZElsTTNaV0pjbkZzMFFNTEZTbkZ2a2dZVzBWaUNMVlVweFlvVXdzQ3FHQUhaQTJKUU5naVV3dENzS1p1RWhSeEtJT0JWREN5VURZYnBFbzRxcFRZaUVCeDRTQnNVSUlzS3NCd1FFV29VY1ZZZzRxUlJ4NFZUT0J4NFNBNG9yWWNJZzRJTmlnT0tGSEJGbzRIWkV6bHNPRXdaYkRoQ2pod3BWSERvbFBpMkFSRyttRmFOZ0ZBY0FsR3dDVWJFYkJBY1JzaHl0aWcyUENpaGlxWWJCS2NyWUlOZ29vWUJFWTJLNE01REJRYkJGREU5VUkySjJSUXg0VWdHSVZnR0NnR0NLQjlORG5ENmFJMzB5cGxjQmdkbEZwY0ZVREJSV1BwcUxrdjAwU2hncEZwY09FVXVLWk1CanVFZ1hFS1pYQmNPRUFOdkNpMHB0NFZDbTE5VkZwVFlVS1RBNkptR01nYkRzNmk4eFRZWjl5aGdoczNESXVTL1RVS1EySXVRTmdVQ0gwNnFMVXpZVUF4bWtKbGNGTnFrQ1k3UWk0NVNHeXVudVJZUWc2NjZxQlRiMzJTS1EydHA0SUFiZENvcERidUhLR01seFBDaWtObGVFcWx4RGNxSTQycXk2T2VWQU50U2ltYngyUkRNVG90SW9BM1E2b0dBOEVUSmhhNjBpZ3RVS2ZFbGlkVlVPQTVnTWlVMkpRcW1JOEVETS9Lc1RPVGkwN2VDcVU0dFpXRk5pcmhGQU5WSVV3dFZpVXdDb1lXcXBWQmFvVXd0VlEyUEREZEF3dDNRTUxBT1VRemNLNHdHQUtzUXdzUU9MT0VEWUpoTW14UWhoWXFSc0ZVTmdnWVc4S0xqSTRoVklMSkRtTmlxRGloUnhSS09IQ0ZNTERzZ09IS0lPQ0tPQ0lPQ0dSd1VVY0ZVNUJ4VUsyS3BZT0NRcllIWkFjT0VLT0hDbk1jdVJ3T3lzSzJCUTVXd1JHd1VhYkJWR3dRSEJCc0ZGYkJWR3dLaXRod2dHSENEWWNKbGNaRDZaMlFvL1RRLzNCZ2hXK21WS0I5TW9WdnBwUnNDZ0dQQ2l0andnMklRREVJQmdFVU1BaHpoZ2lsd0tHQXg3S1FvWThJQmp3Z0dDQVlGWld3TUNpMHVCUkNteENnYkZGTGdQeFFMOU1iS0tHSENCY09HNktSUU5xUTVpR3hGTGdtVEJUYXBGSWJVVXBzNFFMaHdtY0xqSkRhUm9wQXBzZWFJdEw5TlFJYkRxb3BEWU82QmZwaFRLNEliT1BCUlU4V2h1NkJjWmhSUzR0MlVVcHRlRXF4TTJtcjkwQ0cyQ2lrTnAyZDFDRk5xZ1hFN0lPRUNCSFJkSE9tQWJwb3FoZ1BGVVVBNDZJaDJsWEFjVzdVM1JEZ2EwNFZRNEd5QnhhL3hST2M0REtvZkdWUTR0bjdFUlFXalpXSWNXL2VpbkZwMVZTbUZ0RlVVRnBTTFRDejhWV1RpMVFPTFVEQ3gxVU1MUUZZaHhic0VEQzFBNHNWU21GZ1FwOFVPVWNWVU5nZGtoVGl3b1VSWWRsVU1MQ25NYzVzUHdRTjlORW80QkNtd0Njb0l0R3lBaTNoQTJPeUZnNHBDamdpWnlZV0haSVVjRlFjRVFjQWl3UmFFU05pRVVjUnNnTGNKQm1WaVpIRXBqQm5MWWxGYkVwakJrY1NwQ3RpVlFjRHNvRDlNb045TXFsYjZaM1VvUDB6dWxHK21kMHlZeVAweWhXK253b1ZzT0ZTaGg3TW9vNEZFREZJVnNVaXRpa0daU0dNZ3lvemNLQVk4SU5paWhnZ0dDaFF3NVZLMzB3b29mVEc2STMwK3FMUXc0VUF4YlIwQU5vMlRsVnNVU0ZOaUx5Z2JFQzRJcFRhaXRodzZoQzRwQURaeDNVVXVCVkMvVEtsVU1EdW9GTm5aRkxnRXFGTmcyVVVwc1VVaHRiUWRVaWxOb0tnUTJJcERZb0ZJM3FpbHdmcWdRMm5aUlNtMkpVaTBoc1U1em1JZlRLVlNHMzhGRkliUEZSVXpZUHZRSmRiNGxSU1k2TWdCdDZsUnBOalJDRkkxMVVNRUlkbzdJdUU4ZkJCNXJUMTFYYkRnb0J4QXFVRkFQUFJBNHQ0VkZBTm9iVlZLY0JFT0xVUTR0VkljV3loektDeHFqaFhuVG1VRm8wQ3NRNHRkQlFXdHlyRXprd3QvRlVPTFVpWnlvTFJzeUpUaTNoREdUQ3k0NktwVGl6ZEE0dDJWU25IcGxBNDlPanp3cWhoWVB2UU9MT0ZVUGh1RVF3c0d5RlBpMmlZNVZ6eUdGdkNzUXd0NFFvNG9oc1VCeFFoc1VpamdpR3c0VmhuSnNOV1VEWUJFRVdoVUhIaElEandtTUdSeEtRbzRGQVJZcVFjRVFmcG9wc0FwUnNBcWc0RFpBY09FTURod2dPUENGYkZBY1hRYkU3SURpVU9Sc1VnMlBzeURZb05pVUsySlFIRTdJVnNUc2ZCQ3RnZGxGSEFvbERDNUZvL1RLSTJDaTViQlVyWThJZ1lqWlJSeC95VWcyUENSUXhHeVRJR0FRYkJJWURBSkFNQnNtVEFZY0tSYTMwK0VLSDB5aTVENmR5RFlKem5NR0ExVVVNQWlVRDZZVXFoOVBoQXVIQ0tHS2dCdFJTNDhJa0tiUXB5cUJzN3BWS2JPQ2dVMkhaQXVISGRGREFySzBwOU5BaHNSU215c0tCVDZZMlVxNXdRK253b3BEWndnWEhjS0tRMklFTnFLVTJoUlV6WndVQ0d3N0lFTm1yTEs0SWJFcXBtd3FMU20xU0xTR3p4MlV5cVdDQUcwS0ZUTm8yMFJhbWJXUlFZZmVvUjVZQUhETHRLNVV3QzFHVkJhM3hRcHdGV2FvTFRzZ3BiWStpRlVGaDBGVlRKeFlVU3FDemRWRkJZN1NxaWc5TUN0VVRPVGl3S29vTEFoVkJhTnU2RlBiWndybE1LQ3hRcHhhT3FzUTR0T3lxR0ZpQjhlRllIRmhWUXc5TkVPTEFnWVc4S3dQZ2diQUltVEMxQTJQRElvNEtvY1dkMEtZV0loc0FnSXNHeXFHRnZDTHlHd0tJSTlNb1UzMDkwb1Awd2xEQ3diSURpTmxjSmtjZXlBNG9EaW5NZkVSWWdPQ0E0QkFjQWhXd1NnNGNJZzRjSURpcU5od29vNGxCc1VRY0VHd1JSd1NwbHNGRmJGV0ZvNGxBTVNvRGlxWWJGQnNWSVZzZUZSc1Rzb280blpCc09FQXhWR3dDbEd3Q1ViQUpTTjlNSU45TUlOOVBaU3JBdzRSZVVNRVF1Q0RZS05TaGdxZ0cwN0tLMkhDQVlJQjlOUUQ2ZktpME1FQXdRREFiSXVNbHdHeWlnYkJzZ1hBS0lHQ0tVMnFSUzRxWlhCY0VvVTJjSlZMZ2RrTUZOaDJRS2JGRklmVEc2S1hCUXhraHNDZ1UyRFpGcEQ2WVVVaHRHb1Vpa05qb0pteFFJYlVYQkRZNmN5ODZSdFFJYlB4V1dvUTI5MURDWnNHaU5jaERieDNVRXpaM1FJYkRzb3BEWjk2aWx3UXJ5UmJ4Qzc0Y0txTFFKMVFQanRDcVpVRnBaRXpsVVdwQlFXNjZxcGs0dDRWZ2NXa3E0VEtvczNSRkJhOUtLb2NXYWxVVUZ2RUlLQ3p1aUtDM2hJaHhhckVPTENxSEZxdU1HVGkwbEVPTENxSEZpSlRpdzZCVkREMHlnZjZhVXB4WndvVXdzS3FVdzlOREdWQjZTVU1MQXFoaGFORkZNTGRGWXlPQlNGTmdxRGlFRE5zRUJZcENqaVZVRVdFb1hKc0VCd0tRbzRjSmd5YkFvRGdVcURnbEJ3U2c0SlFjRUJ3NFFIQkFjVUJ4U0ZiQklEaWtLd3M0U0djamh3a0sySEFRSEE3QUlEZ1VXdGdkMFNqaHlnMkNVYkJCc2VGT2RlWWNUc2h5dGlka0d4NklnWUlyWW9OaHdpdGh3VkViQTdGVWI2WlVxeHZwOUVBK255cFZiNmFVRDZhVWJCQ3Rnbk9jelk4SUJqd2hBeFVxeHNVQXdRREJDbCtud3lOY2pmVEtJWEFxS0dCUmNaREFLQWZUNVVBK21xRlBwalpSYVhCQU1PRWhTNHFLVTJxS1UySUVOcWtVcHRLQlRhZ1EyS21DR3cwV2N0RU5oMlNITVUrbWRrQ213N0taWENac1VpNElmVDVRcFRadXBuRFdNcG14U0NaOVBoS3FaczRVQ0czaEZJYk95S25pUTdxWlhDWnRkUVR1c0tLbWJkR1VWTTJLS1hFN0lQSlllSzdZY09RNHRjcWl3dG9vR0Z2REJhd3lxTGV5Q2x0cDdiS3BoVzIxK2RrRkJhdFl3emxRV0ZDcUN6UmtTNE9MRlVxb3NRVUZpdURLZ3NUQ1p5b0xPRlVPTE9FS2NXRFpYQms0dDRWakp4WWdjV2dhSVU0dEd5SVlXdWhuQnhad3FoeFlnWVc4T2dZV25aQTJCMlZUNG5IcDdwVUhCQ213UU1MQ3FVUjZhSlREMHdnWVdEWlV3T0kyVWdaaWtCeEtzQndLSWJCRkhCUU1MZUZZbGJEaE1HY213T3lmRStBNEZDamdoeWpnbEJ3UWpZSURod2hCeDRWQnc0Q0RZcUtPSlFiQkV3T0tLMkJRbzRGQ3RnZGtLT0IyUXJZS0ZIQkNoOU5Vby9UVUszMHlsQXdRSERoQnNDaEF4S2hHeFQ0ck9Sc1RzZzJKMlFiRTdJTmlkbEJzZUVVTVVHeFNMUXdVR3dDRmJDMUNoZ0V5WUREZ0tEWW9GeE95SzJKUURIaEFEYWhDNEJBRFlpd3VIQ21jbU1CZ2RrYURBN0ltQXc0VWlsUHBwQ2x3U0xTL1RRS2ZUVUMvVEd5UUQ2WTJVeXVDSDB4c2lrTmhDaGdwdFVVaHM0UlNHMUFodFJTR3poUUlmVEtLUTJIYnVvcWQxaWlwbXdxWnlFTmlMaktaOU1LS21iTmxGVE52Q0ttYk9GQWhDbWNLbmRhZndVVkkyb1NsYjNVMFVpdkdGcTcxd3FndFZSWVc4Smd5Y1d1emFxb3RiYVB2VlJRV3BneW9MVldjckMxa0RpM3VpS0MxV0lvTFZZWnlwYmJSRXFvdE5LcThoeW5GcFZRNHNLcUhGaEtxS2owMUtIRmlCeFlnY2VtRVNtRm9FTXFoeFp3cUhGaUJ4WndrUy9Bd3RWaUhGcVl3b2kxV0liQkF3c0NwbkJzUnNvUWNTZEZjcGd3c0taTVpOOU1vRytueWdPQ2xEWUtvT0FRTmdOa3ljbzQ4SVp3T0tFSEVvbzQ3SlVnNG9vNDhPcWc0Y0tBNG9EandnT0tKeXRpclNEaW9zYkZTTFJ4Q3FRY1JzaG5EWThJUWNlRXdSc1VpOHpZb1FXUWpZOElrdzJQQlJjeHNUc29zSEhoQnNUc2xTRGlnR0NBNGhGYkVLRFloRWpOd2d6Y0ljN053aXMzQ0FNZzJLRFloUURIc2l3TVVHd1FnZlRPeUFZSFpSYUdCN29OZ3FCaHlwRmJBS0lHQTJSUXdHeVF1V3c0UlNteFJjRk5xSURLcURicVVnWWhDQWJPRVVoc095Wk1GdzdLS0JzS0JmcDhzb3BUNmZzRW9VMktLUTJjS0JUWU5rTVpoRFp3b3ZPUTJNaWtOcWl3aHNVRXpheXFrTnFpeE0yY0lFTm5DeTBtYk9GQk0rbVNpcG16ZFJVelorS2hVallpODVEWUNwVlN1dENLbWJSUmxCUEVQUlppMTR3Qzd1Q290TVF0TXFDMG5SVXExdHFGVkZsRmNKbFMyeWlxSzIyZGdsUlVXRFh3UkZiYkJzbVRHVkJZQm8vQzBpZ3M0VlJVV0pFVUZxc0RpMUV5b0xGVTVUaTNaSUhGaW9vTEcwU0ljV0hRS3dPUFRLWU1udzZLcGt3c1JLY1dJR0hwcTBPUFRDSWZFRFJTZ3R3cVF3dFJEQ3hSVEN4S1F3dFZRY1V5WU1MZUVJSXRlZ1ZEWUhaUmVRUllxbE5naVVSWUVLT0k1U2c0alpBY1JzaEJ4UWdpMUZnNHBnemhzVUJ4Q0lJdEhWRkhEaEVvaXc3SlJzT0FsQndLVlJ3NVJLMkEzU2c0RGxRbzRqWlZLMkkyVXl1R1liS296RFpSV2JoQVc0UVpnaThyTWlNeUsySVZSbUNpdGoxUUhIaEJzRkl0YjZaNFZoV3c2SVZqNmFGYkJJVU1Bb3JZQlZHdzRDQVluWlJXWWhFWmxNWVhJTWhHWUpCc2VFV3RnK25pb0I5UGhER1FQcCtPaUtIMHlvdEtiTnlnR0NEWWhRZ1lEWkFEWU5rQXdRS2JObEdpWW9BeUFZaFFMaHdxRndPeWpSVFp3b3BUWWRVUXVDS1UrbXNxbWZUVm9VMjdxS1EyQlFxWnM0VXl1TWtOcWlrTnZDR01wRzFGSWJYU0Nac0tpcEczaFJVemFwRlROaEZGRlNObkhaUVR1c2VWT1plZEkyNkl1RXpaQ0xoUEZTTFhqaTNSZDNuVkZ2WldDZ3QyVnhoTXEyMnF4RnJiVUZSWXlyT2NxMjJjSUsyMkxUS2dzVkZSNmFDZ3NWUlVXVVJLY1dCRVVGbkNxS2l6aEE0dENFT0xTVlVPTEFnY1dyVVEyQ21ES2c5UGhWTGc0c1FOaHdpbXhLVkREMHpxaG5KaDZZM1JENEJDbUZnNm9sSEViT25LcHNlRVF3c1ZJYkJBY1VCeFFnaTFET0RZOEZDRGdkbFFjRUJ3VXdaTUxGU3RnRktEZ0ZVb2kwZFVLT0EyVW9PSEFRcHNWVWJIbFJSeFFqWXFvMklVV0RpRlNOaUVnekRaUlJ4NFZRY2VFSTJKMlNLT0pTRFlwQnNlVUJ4Q1F5MklTR0J4R3ltZVE1Mng0U0RNaGpETWl4bUNKQlpBTVFnT0kyUld3NFVHd1ZHdzVVbzJHNVNnWUhkQnNFbzJIRHFWUXhHeURZQlJXd0dnQ3FCZ29vWUlCaWl4c1NoR1k3SVFNZUVHdzRVQXdTaGZwbFJRUHBvWXlIMHdoUzRCVC80di93QkRBYktLR0kyUURBSWxLYkVVcHRVVXVLQlRhaWxOZ1JDR3hGeFNtd3FGSWJPRVVoc1VDbjA5bEY1RXpaM1JTR3hSVXo2YW1Wd21iRkFoc0NMeXBteEZTTm9VQ0d3S0xoRTJ0MFVhVE5tcUNKdFpSVXphNmlvbTFGSmlvcnhyYk4xNkhuV0ZqNlFyaEZSYTJpQ3R0bkNJdUxXcFZYQ1pVdHMxVlJZV3Fvb0xWVVZGdkNvb0xEc2xSVVdIWkVxZ3NLQ2dzVlRLZ3NWRkJZNkljV0FLMUZCWndnY2Vud2xJb0xGVXprMktKRGkxS1F3c1FNTEVEaTNoRU1MZUVYUElZV0haVkRZSGRBdzlOTTVNR3c1UkRDd0lEaUZRUllnT0lRTmloUnhSS09LR0J4N29jNXNVR3g1VklPTzZnMklRTUxlRlFjVHNrR3hPeWtYQWl3cWc0RXBBZnBuZEFjT1VSdnBoRkhBSURnRXBHRm9UQmtjZUVJMlBDRFloQm1DTERNaEdZN0tVSEU3SWxiRXBWd09KU25NMkNVck1FcEF3R3lVZzREWktOZ05rcEJ4NFF3R0tpdGlOMEkySVFiSGxDTmlnMkpUSTJCMENISTJKVUd4Uld4UkF4Q2l4c0J5ZzJBUWJCVElHUENaTUFRZ0RJb1l5aDhBd1FERlJZR0o2cW96RlFBMm91QzRncUxuRUEySVlBK21pVXA5TXFaYXhrTUNpRXhVeTFnTVFnVTJBcUJUWWlreFFLYmU2QlRhaWtObkNaTUVOaFVqUkRidXBCTTJKQWwxaENpcG0zaFRPRlR1OU5Gd21iRkZUUHBxQ1JzUmNaVE5pTFVyckZGU3V0R3FtVlN1czJVWENKdFV5cE1aVUhqQ3dydTRLaXh0VmFtVnJiTjBGaGFleXVFeXRiWU5sVVZ0dGZvZ3RiYnd0TXFDMVVWRnFJcUxVUlFXcW1WQlp3aVJTMnc3S29xTEcwUkRpd2xVcWx2cHFsVUZpSmFZV29oeFlvcHhZRlVOaU5naUdBVmhUQzA3SVU0c1FNTGVFUTJQQ0FzaXdjVlVoc1ZRd3M0aFFIRGhYbVRuTmdmOEFDZ1lXSGdJRGdkMFFjRVVjQWtCRm8wZFdBNGNJR0ZuQ0FpMUVqQzNlVVVjUkNFSEhoQVdRYkU3S1ZSeE95ckk0bFNxMktVSEZLTmg0cFNqaU5sS0RpTmtvMkEyVEJrY2VBZ09KNklOaW9OaXFOanlnMktBNGxNbUd4S2xWc1NsQnhQQVJLMkI0U2pZOHFWV3g3cFJzRTVUa0hEaFVyWWdhS0x6aGlOa0xCWWJLMUF4NVFiR0VvR0pSV3hLWEJ5c3hTa0RIaEtSc1VLMkNGWTI3S0xXeFFiRW9BMVZGRERnSkNoam95TEdZZUNobkRZOElrQmhzaEFJN3FMQU52Q29VMkZGd0JzT3lrS1hFcEZERklSc2VGSUZOaUJUNmZDQkQ2YW1Xc0JncWxLYkZsU214Q2tObkNqVktiR1JLVTJoRGxJYkVWTTJiS0tRMjdvcWQxaWdrYlc1VEs0VE5xZ2tiU0ZscE0ydWlvbTFTcWxkYjRKbGNZU3V0UXdqZGF5aXBYV0tMVXNTbzFYa0MzWU91enpxMjJIWlZGN2JDZWlHRnJiR1ZTcWl6bFhDWld0c0dpdUV5cmJZclVWRmcyUkZyYkJzaUtpM1pYR0RLZ3RWUlVXb21UZ0t3VXRzVlRLZ3RSREMxQ0hGcUdUaTNoMFE0dEowVndad1lXSFpBNDlNOU9GUlFXZmVpR3dDUW80cW9ZV1NnWVdEWjBXbUZpcUNMZUZBK0pWUWNlVUlPS2l3V1ZnT0oyS0VIQTdLNXlZd2JCQWNRcFNEakt0UWNKcXMyTGFPQ3RTdGdBZDFDbXhHeVVIR0tKUnNkNFVVY1R1aVVjUXFNdzZvQ3lJTGNJUUFPRkdzNEhFN0lDTFNxallvc0hIbEVqQzBhcUxHeENFSEVJUm1HeUVaZ2dMSU15RVpvU0hNekpCbVFnc2hHYUhVV05pVXlSc1VTTmlnMkowUll6SFpDTWJUc2d6SFpDQmp3b3JBSmd5eklrWmtpaXlad015VEl6VFJBTVVBeFNyR3hNcGdnWW5aQnNlRlViQkl0YkJDNEtiUEJSYUdIS2N4enRpZGxVREZsRmJGUWJFZE9VeVlERkFwc1VYQlRiM1JTa0lBeWl3ckltY1FwdDRVVWh0UlNtMDdJRU5xa1VwdFVPWWhzUUppVkdpRzNoVUliT0ZLcVpzSVFJYmV5Z2tiRkdzWlNOaWhValp3cGxVcnJWRlR1dDRVVkUyc2lwWFdxS2diVzZLVllUQ2FwU1BGdHRYVnhYRnFvdGJhckU1MWhidXJobkt0dHJyVVJhMnp1bElyYlp3cWkxdGhSRmhZZWdWd2lnc1Z3WlZGaVJNcUQwMVVVRmdDQ2d0VlJRV2NJSEZvMlZqSnhhVWdjV1VSVGl4RWg4VlVGdUVpbUZoMlZRd3NRT0xEOXlGTUxEOTZGTmh5bFEyQVF3TEJBY2VGUVJZb3VUQzBCS2tNQWRFcEdaS0N5bFdDeWN5YzRpM2hVSEVxRkhGS2dpM1JBY2ZKRmc0OHFvMk81UWJFS0xCeENFWmhzZ0xEWkFVTUFneUtJQlJHeE95UmFPSlZSc1NvRGlVR3hRSEZLTmg3QkN0Z3BSc0VXNUVXb05pQkxvbktPTUlZYkZGYkdBaDhXYmRCaGFrS3pGQm1QM0tOTXhWUnNTR1JXWkVabE1yaG1QUkFjWUtxTmlOZ2dHQVJXd2RRbzRiSzFBTmgyVVZtYlJXcEdaUldZS1FCa0dJRG9ZdzJJVkF4NVVVR0txTTNDRUJrVU1lNlVBMitDaTRManloQXhPM2RBR0tpdGlpQmg5enFMbkpUYjJTaFRZaS83aTRxTFF4Q0lYQUtLUTJLQlRZaWtOcUVLYlZCTTJwVmladFJjRU5xZ21iTmthd2tiV1VpMU0ycUNOMXFLa2JWRlJ1dFVoVXJyVkZSdXRSVWJyVkZxV01xTlBJdHRvdXpndUxSc3JoRjdiZFdXc1laeXNMZUVGcmJZUk1yVzJxNFJhMjFWRlJhcmhNcWkwN0trVUZuQ0N3czNDdkl5Y1dub2dwYjZaUXpsUVdKaE1uRnJxbk1vTEVvb0xCc2lIeEd5SEtJdDRWU0hGcm9waGIyUkRpM2hWQkZxWXlad1lXaENHYmhBY1RzcUd3UW9pMUNpTFNhcVVOalJLRGdpVWNWS0RpRUJ4R2dRRmtCWlV4aG1Rak53aXdVU01oQnhPcUsySlFIRW9YQTRvallwUWNmSkFjUWhobVVvT1BEb0Rqd2cySjJRSEVvUmhhZGtNdGlka0d4S2lqZ1ZZTmlVTVliRTdvUnNESG1nMkJLYzV6RGdVR3dKUUhBOElOaDBRSEIwbzJKNnBSc2VFb3d0NFRCbHNmSkNNeGZWU3JHNmhWSXpCUlFZYklNQUVNc3dRWnZGRkRFb1ZtS0RNVVZtUWpOQ0ViRWJLVWdZZUNEWWRHUURFcFJtUVpsQ3MzZEFNUnNsR3dqM0lCaWxJRGJxa0RIWlF3R1BDTHlGeEVvb0cxbEFGWWdFQ2l5cFRhZ1UyK3hSYVFoRktSd3BGS2JVaUVOdlpSYW1iV1JhUWhRSmRiMlVpMU0yOEtpWkNnbWJlRVZFMnFOWVRJVUViclVWSzYxU0toZGFvSlhCUlVMclVWTnBRcnlyYlYwYzE3YkZhTDIydXJ6TXJDd0lsWHRzZFV5c0xkbGNNNVd0dHBFcW9yYmFxUlcyMUJVV3NpS0MxMVV5cGJZaGxRVzhLcGhRV0haRVV0c1AzcW9jV0lHRnBLQng2WTNRUGdOVlVwOEFoZ1JZTm5RTXdWUVc3S0tMS29ZQTZJZzRsU3JqQmdPNlVnNGxBUmFoa1dSRFkwS0VIRkNOaXFvNHFGYkhoREFpMUtaSEZBUllFd1p5TEFHaUlLVWpNZ0l0SlFIRkNEaHVxTmlvc2JFSkFSYWhrV1FacFpBV0tISXpJRGlnemRZUXJBSVpGa0diVGJWQ015QXNoQWI4RVVVU00zM0lyTjk2SXlLM3NVR2tGUWpONElSbVJXODBJTElrWnRFcWkzSFpLakFKVElZNnFMV3dFb1ZzQnVVR3dDRnl3czJUQm1oaWRrUm0wb2k1dzJpRVpnZ0RJTVFtVEFNVzl5aThqTTJpSzNaVkFiVlJRTnZLQVluc2tLQ0l5UVp1NmtVR0NVZ1k3S2hUc3lBTjl5RkJwYXFLVEhsQXJNcEZDRVFEYU5GQWh0UmFRanlSYVZsQ0ZOcUNkMXFpcGtLS1FnRkRtU3V0VVZNaEZUdXQvRkRDTjFzcUxqS1pDS2hkYW9xVndVRUxncEdrYnJWRndqaWg4SG5XMjhMb3hsZTIwN0tzcjIyRktpOXRoVkZoWm9sUmEyeFdwbGEyd0tvcmJZTmxVcXd0QTBWVG41MUJhbUV5c0xRQWlIQVZGTGJWVXlvTGVPaWdabFE0dC9CVWh4Yjl3UkRZb21NSEZ1eUtZV3FvT082Qmhic2lHRmlVRVdpWVpTcmtjVUJZT2dJdEtxUTJJMUtFRUFiZEZGaklHYmhWQkZwUXkyS0tMSWtGa0J3T3lBNEZBY0FoekNMUnNoekRqOTZpaXlxTXlVRnVFR1pCbVJZTFZTSXpkMEdZS2pNa0c4dGxGYmhBVlJwUVpDTXlETXBneXpiU2hCWktSbThFVm1hcVZPZG04RUdiVlRtVzBXR3F0Um0vQlJXYmhLQ3gyVlJtVUkzZEZaQ0NoR1JJeklyTXBCdWlvM1ZRWkFLYUtLeW9LSUVhcUt6QlZBTnZMS0tCQlFCajlxcU1nQ2k1WmtLRFZRQlVaUlFaOUVBYlpDQTFYUUJJQXlrR0lIWkFHMUN0UXBHNkJTS3NpNHlCdDdJRU5yZmNwRm9JRk5xZ1FpdkdpTFNFZmdpMGpLTGtodFFUTnFoVXlGSXFkMXFDUkZZVWFTSVFSdXRVWEdVaUZGUnV0VEs0UXVDeXFGd1NLbTBySzhyZ3RIQzZZdzU1V3RDcVpYdEN1RVh0dGhET0Y3YllXbVhUWjZIcTNCN2ZUdXVCL2lBTExPZHBweHo1dzFqWjZzODJNdW4wL3dCSCtwdmZEOVA2dDdWQXNKK0N6bmlObnA1OVdPbkRXTmh0TlhOcHowWmRObjdkK3V1TFcvby9YdUpvQjZkeis1WXp4bXh4aS83OVBUaGNjSnRzNW4relYwWmROdjdUKzVhL3QzNm4vdXIvQUxGai9JY052TkhheDF0LzBQRWJ2VjJjOVRwSDdIKzhRMzdSK3NPMytnOVQvTldmOHJ3bSswZHJUMXRmNHppOTFyN09lcDBXZnk5KyszaDdQMlg5ZmNON2YwM3FuL21yR2ZPZUIwOCszMmVQNTlQVzFqeWpqZFhMalliVHNhdXAwV2Z5MSsva2dmN2ovWGg5VCtuOVFEeE5xbWZQT0F4K3ZzKzNwNjF4NU54K2VUL28yblkxZFM0L2xiK1l0UDJUOWIxK2pmOEFZcy81L3dBdjMrejdXR3NlUmNmdU5mWnl2Wi9LUDh5WEJ4K3kvcXUvcGwvQmM4L2NYbDJQMTlIUzZZKzMvTU0vbzYraGYwLzVPL21XOHNQMmI5UUN6emFMWDhTRm5WOXplVzQvWDA5SzZmdHp6SFA2T3BVZnlYL00vd0QrbjlhT2JmOEFPV2ZWSGxtKzAvajFOZW1mTXR6cS9Eclgvd0QrRi9tcXYrNkwrL3FlbC9uckhxM3l2Zlk2TlhVM2o3Vjh5M09lblQxcTJmeUYvTmwvNWYyZy93REc5YjBSNFA2Z1dkWDNoNVZwL1c3dXZ3dGFmdFB6UFA2UGUwOWEzOXYvQU9iZi93QlQxLzAvNmY4QTFpejZ5OHAzM2QxK0ZmU1BtbTU3Mmp4Sy93QnUvd0NiR0gvbDFrNmZXOUwvQURsejlhK1ZielBaMWRUcDZPOHozZU8xcDZ6Mi93Qk92NXBOMkovUStuYnZjZlc5Tmg0WEVxWis5dks4WTVOcG5zNnVveDltK1o1L0pqdGFldGIrMi84QU5Bai9BR2IwQi8yMXF4NjM4c3orYlYyY3Vub3p6TDVkUGF3cFovVFgrWjczZjAvMDFoMEI5WUgzQXJPcjc1OHN4OGRXZjVXdFAyVjVqbjRhY2Z6SEg5TXY1bllISDlLeC93Q3RwLzdLejY4OHQvNTluK0sraVBNUCtQVC9BQVhIOUx2NWloL1YvUkFtdHA5VzV4NFdGWXo5L3dEbDJQaHRPemp4TitodVB6OGRIVG5xTmIvUy93RG1Fa2Y2YjlDSmJJK3JmOFBUZFRQN2dlWFkvTHRPakhpWEgyTHgrZmpzK25QaFVIOUxQNWdmL3dDOC9id0puNm5xdEgvWkxuN2hlWC9KdGVqVDQzVDBIeDN6N1BwMWVGUzMrbGY3NFRkbit1L1FXZ05TNzFibmYvc3dwcS9jUGdmaHM5cDBhZkZsZFAyRnh2eDE3UHAxZUZUKzFYN3lCLzZoK2lQUStwL21MUHVId2U3Mm5kNjJzL1lQR2J6UjN1b3cvcFgrN3Y4QU4rNC9vN1JvUjlRdi93Q3dGTS91SndudzJXdnU5YTQrd2VMK08wMGQ3cVYvdFQrNW1uN24rbWl2eTMrOW1XUGNUaHQxcjZjTmUzL0U3M1IwWkVmMHAvY2lRLzdwK21BSnFMYnlaVXorNG5EYnJYMDRYSDJCeEc5MDlHVmgvU2o5WFQvZkhvLzkxZC9uTEh1THNkenE3V09wdjIvMjIrMDlHZXRoL1NuOVdmOEE4dDZMN2ZTdSsxUGNYWTduVjA0NmoyKzIyKzA5R2V0YTMrbEhybi84MVlOeDlBeC84eGMvY2JSdU05cjZYVDIrMTcvSForcGovU24xbkEvMzFZUVlmNkJyL3dCNG51Tm8zR2UxOUo3ZmE5L2pzL1VzUDZUWE1IL2ZRQ2FqL1pvSC93QTBMR2YzSHhlVGgrLzlEZVAyOXpPWGlPNTlUZjJtSkxmNysxbi9BTUxwL3dCOHA3ai9BTnYzL29QYjMrNDduMW5zL3BQWTUrcCsvWE5vMzZZVysvMVNzNnYzSHo4T0g3LzB0YWYyOXg4ZHYzUHFQL2FqMFhQL0FKM2ZWdjhBb0IvckZuM0cxN2pIYXo0V3ZiN1J2ODluNmhIOUovUmRqKzkrcEd2K3pqL1dKN2phOXhqdGZTdnQ5bzMrZXo5VEQray9vQmlmM3U4aU1oOUFEenpLWi9jYmFmRFlZN1dlbzl2dG52OEFQWi9pcC9hajlHLy9BS3Q2MVA4QTRWdjJySHVMdHR6cDZjOVRmdC9zZDlxNk1kWWorbEg2TjJQN3Y2NGYvcTdmdFQzRzIyNTA5T2VvOXY4QVk3N1YwWTZ3UDlLdjBRTEg5NDljUi84QUN0ZjNwN2piYmM2ZW5QVWUzK3gzMnJveDFyZjJxL2JQL3dCbitxZHRyUGN5NSs0dkU3clIwNWI5QWNQdmRYUmhqL1NyOXJIL0FPVC9BRlZXZkd6N0ZQY1RpZDFvNmNyNkE0YmU2K2pEZjJwL2EyLzlVL1V2d0xOT3llNG5FN3JSK1BXZWdPSDN1cm93cGIvU3o5bXhlNzl3L1czWGF0OU1lV0JXTS91SHhsNU5ucys5MXQ0K3dlRW5MdE5mZDZoL3RaK3luLzhBdi9yWGZmMDkyL3dLZTRmR2J2Wjk3eEw2QzRUZWErNzFCL2F6OWxsdjNEOWFTS1Q2ZitZcjdoOFp1OW4zdkVub0xoTjVyN3ZVSi9wWit5bW43aCt0ZUlmMDlmOEFpSjdoOFp1OW4zdkVlZ2VFM212dTlRZjJ0L1ppVy8yLzlhK2srbjMvQUlFOXcrTjNlejczV2VnZUUzbXZ1OVFuK2x2N0xiWDl3L1dlUHA5LzRGUGNQamQzcys5NGowRHdtODE5M3FFLzBzL1pSUDhBdkQ5YVFlZlQxLzRpZTRmR2J2Wjk3eEw2QjRUZWErNzFCL2EvOWxrSDlmOEFyUTM4VCttM0JteFgzRDQzZDdQdmVKUFFQQ2J6WDNlcFgrMTM3QkFQNno5ZUNRNy9BRlBTOTMwdml1ZWYzQzQvNU5uMGF2RzM2QzRINTlwMDZmQzM5ci81ZmRqK3MvY0FZTGZVOUwvVXFlNFhtSHliTG8xZU5mUVhBL1B0T25UNFcvdGYvTHpUK3MvY0dQOEExbnBjZjlTbnVEeC95YkxvMWVNOUJjRDgrMDZkUGhFZjB0L1lDeC8ydjl3RDArZjB2OVVudUZ4L3liTG8xZU05QmNEOCswNmRQaGIrMS84QUw3RnYxZjdpZiswOUwvVko3aGNmOG15Nk5YalBRWEEvUHRPblQ0Uy8ydS9ZV1A4QTR6OWYwUHFlbC9xazl3ZVArVFo5R3J4bm9QZ2ZuMm5UcDhKdjdYL3kreFArMS91TWY5WjZYK3FUM0I0LzVObDBhdkd2b1BnZm4yblRwOExmMnY4QTVmOEEvd0RML2NIbkgvU2VscC8yU2U0UEgvSnN1alY0ejBId1B6N1RwMCtFbDM5THYyTmhqK3UvWFdscGUvMGk5S2Y2TUxXbjl3dU8rT3oyZlJxOFRPcjdDNEw0YTlwMDZmQ0g5clAyYi84QVlmcmVDL3ArN0JYM0Q0emQ3UHZlSm4wRndtODE5M3FBL3dCTHYyYlQ5ZjhBckNXa1A2ZGYrUXI3aDhadTluM3ZFZWd1RTNtdnU5VGYydS9abS84QXYvMXp5Q3g5UC9NVDNDNHpkN1B2ZUk5QmNKdk5mZDZtL3RkK3pNVC9BTGYrdE9vbjAvOEFNMVQzRDR6ZDdQdmVJOUJjSnZOZmQ2bS90ZCt5cy84QXQvNjNrUDZmK1pLZTRmR2J2Wjk3eEo2QzRUZWErNzFOL2E3OWxqL3gvd0N0OGZUbzMvQVQzRDR6ZDdQdmVKZlFYQ2J6WDNlb1A3WGZzOGYrUC9Xa3M3ZyttM25ZbnVGeG03MmZlNnowRndtODE5M3FLZjZXZnRidVAzUDlXTFpZWTJFKzVieCs0bkZmSFphUHg2Mk0vWVBEZkRhNi93QU9vdjhBYTM5cnIvdlQ5U3hEZ0czMHg4RmZjVGlkMW82Y3A2QjRiZTZ1akFEK2xuN2FXLzhBTlAxTGsvNGJObjJUM0U0bmRhT25KNkI0ZmU2dWpBWGYwci9RUDh2N3Qrb0FPaDlPd24zaGJ4KzR1M25Mc2RQVGxuUDJCc0x5YmJWMFlKL2F2OUVJL3dCNyt1Ly9BUEZhM3ZWOXhkdHVkUFRucVQwQnNkOXE2TWRZaitsWDZLUC9BRGIxd1RwOU8ySTZwN2k3YmM2ZW5QVWVnTmp2dFhSanJKZi9BRXAvVHY4QUorOCtyYUcvaTlHMHoveXd0YWYzRjJrNWRoanRaNm1OWDdmN084bTJ6MmNkYVkvcFY2SkQvd0MrNytmOUFDMy9BTXhYM0YxN2pIYXo0VTl2OUcvejJmcU4vYWowQ1A4QTF5L3A5QWY2eFBjWFh1TWRyNlQyL3dCRy93QTluNms3djZVMkZoWisrRUE2bjlPQy9UL1NCYXgrNDJyNDhQMy9BS2NzNS9iN0h3Mi9jK29wL3BRUVAvWGYvd0RWK3oxbHIzSC9BTGZ2L1F6N2ZmM0hjK3NwL3BVWmI5K24rRUg5S2E3ZjlLcmo5eHY3ZnY4QTBIdDkvY2R6NmlmMnE5YVAvT3JPZjlBZjlZdCs0dWpjWjdYMHNlMyt2ZjQ3UDFFL3RYNnBwKzllblIvK2hMZisrcjdpNk54bnRmU250L3IzK096OVNYOXEvd0JaUC9tL291UCtydSsxYjl4Tmp1ZFhUanFZOUFiWGZhZWpQVzM5cXYxcGR2M2YwSUxIL1IzYWY4WlBjVFk3blYwNDZqMEJ0dDlwNk05YUovcGIrNXYvQU9wZnB1dU4vd0JpNmU0ZkRiclgrREhvSGlON3AvRVA3WGZ1TE9mM1A5TU9jYi9leWU0WERiclgwNFBRUEU3M1IwWlMvdGQrOEVPUDEvNlBIU2ZVL3dBeGI5d3VEM2UwN3ZXeDZDNHZlYU85MUIvYTM5NWRoK3YvQUVRMHI2bitZbnVGd2U3Mm5kNnowSHhlODBkN3FTdS9waCsvQjIvV2ZvQ0IvbCtxRC84QVM1VzhmdUR3SHgwYlRvMCtKeno5aWNiam0xN1BwMWVFRC9TLzkvRnBQKzAvdDVPdG85VDFYLzhBcEs0L2NIeS9QNU5wMGFmRW1mc1Rqdm4yZlRxOEtYOXNmNWhML3dDbC9SUWYvaTMvQU9yWFQxOTVkL3B0T2pIaVo5RGNmL3JvNmM5U1YvOEFUWCtZN2FIOUplQlUyK3FZOGJRdGFmdnp5N1B6NC9sL2l4cSt5UE1NZkpuL0FQZjRGUDhBVGY4QW1RUTM2YXJmOUx2L0FNVlgxMTViL3dBK3ovRlBSWG1IL0RwL2dnZjZlZnpNSC84QUQramN6dVI2dHE2ZXQvTGZtMWRuTEdmc3p6SDVkUGF3VzcrbmY4emluNlgwcnovaEhyV2ZFaGF4OTcrV1ovUG5zNVp6OW0rWlkvSmp0WVNQOVB2NXBnSDlCWngvcHZUL0FNNWI5YStWN3pQWjFkVFBvL3pQZDQ3V25yU3Uva0grYWdXSDdhTDRxUFg5QnA2M2hheDk1ZVZaeC82eitYWDRXYy9hUG1lTS93RGwzdFBpU3Uva0wrYXdELzVTWXEzcmVnZkw2aTFqN3c4cXp5ZjkzZDErRk0vYWZtZU9YL3E3Mmp4SW4rU1A1cEgvQU9JdkgvYWVsL25yZnF6eXZmWTZOWFV4Nlc4eTNPZW5UMW8zZnliL0FETUNSZCswZXE5dXhzUG1MbHJIM1I1Wm5sLzd0UDQ5VEdmdHJ6SEdmL0hWK0hXbGYvS0g4eVdzL3dDeit1WG93Qjl4VzlQM041YnEvWDAvajFNNSszUE1kUDZPcjhPdHpuK1ZQNWpmL3dCSC9WZjhoYTlSK1hiL0FFZEtlbi9NTnpxNkVUL0xQOHdpdjdMK3MvN20vd0N4Yi96M2wrLzBkckRIK0Q0L2NhK3psRy8rWFAzNjA0bjlrL1hFN0Q5UDZoOTFxMWp6dmdNL3I3UHQ2ZXRuUGszSFkvUTJuWjFkVG52L0FHRDk4dEQzZnMzNjYwYm45UDZvL3dDYXRZODQ0TFBKamI3UHQ2ZXRuUGxQRzQ1OWp0T3hxNm5PZjJiOTNZay90WDZ3QVZQMFBVL3pWci9LY0pubTIyanRhZXRuL0c4Vmo5TFgyYzlUbXUvYXYzR2YvTC8xUC9kWC9ZdC8xL0RielQyc2RiUDlEeEc3MWRuUFU1aitoL1dBbi93bnJCb0krbmRIa3Q0NHZZNTV0ZW5wd3huaGR0OGRHcm95NTcvMHZyMmxyL1E5UzA3RzBqNExXTnZzODQ1TldPbkRPZGp0TVo1ZE9laHkrcDZWOWpaMlhXdnVHVzlPckdybXpoTTZjNDU4T2U0SWlGd1JVYmdzcmhGcFNLL1NQcC90SDdWYmM5djdaK2x0MGowZlRIL05Yd1BWNWp4V2NjdTExNS9tejF2dVdueS9odFBOczlIWngxTzMwdjJ6OXZ0dUJ0L1EvcDdUTWowN0Eza3NaNDdpTTRtZHBxNmM5YmVPRDJHTTNHalQwWWR0bjZIOUlHUCt5ZWk0bTM1QTc2YUxubml0cm44K3JweTNqaHRsajh1T2pEdXQvVCtqSCtpc2ZYNVJIa3VmL2JyL0FOYzlMZU5scC8weDBPdTIxbUIyZ3JtNk9teTBnQjQyVUhSYmJwWGJRcUtyYmFkU1dmeVFWdHRQeXRYUUg3a3F1aTIxNFp2YjdWQllXNkNBK3lnc0xUREdLTWdZU1NCMlpXQnhhUVEwZys5S0tnTVJYN0ZBNHRKZmh3N29IdEZPNm1Rek9IRWcxS0tZV3NRR2cxNm9oc1hJTnhJWi9Qa0lLTUJBa25UMkNnQXRZZjRoQVlRdzFWb2NBZ00wN2pud1VVV053STNpVkJtSWdIeDA3S2tHU0NScng1NklDQWJ0R0dnTW9wbWNBOFFTZ0dGekNrU09xQXV4ZDZqV1BhcUFzUU5SUWN6cWdPSk83UTRNZmVnYkZxQnh4NG9BUnBJQjFvemZnZ1lXOGttZWlET1RJcHFaRmFVUWJnQ0JUelFZM1VBTHlCNHBFRWs2czRsaHY4RVVDUUhZc2RIb2dJb0E4eDI4VUFEZzhieE82RFBkc2VkTmUvdlFHanZvSUNBQTNrQmhXcGtvTUJRMWN4dHRWQTBuRVFmRGtJTVFaZXZmUktNYklORE9wMzI4VW9BQURoOUErbW4ySlFSYXpBa1BvWTNwVktOak1XaHRlbmRLQTM1ZFhOUS90b2dhSkxrQm5HeWdOQTgwbCtVQUF0ZjhvSkJnZEVHMG0xMk1hb01RSUxWWUViYWhBYmJRQkFqVTBRYkVQM21Vb1hFQzF6OHplUGVxVWFIaTBCaTdvTXdBeUwyaXNRZTZvTjF1alBQSVVvd1ozaVRYbW5LRFlnTnVkZHRkRUFZdzRsNUkwVkdhMzhwM2dQeWcySmdPWnA0YXBSbW1wQjFKMkhnbENzWEV5S0U3TWRPeUFrQjhYNVowR3dKMTQ1U2pNeGlsUzBzZ3djbHd4RWpKdWlBbVJJQmZSQUlOMFYxWW9NQ0FETDhuVkFvSkRCM1BqRlZVYTNFVWUycmluZEE1TGNiOTFGQVRJR013Z1c0QVBKY0F0dHNxakFOSWdPZmw2MWVxaWppREp0cno5cUJUYUdEZ3dYTUE3blJBSjFxTFhKUUM0T1RFYXRKUWFnR3cwTzdvTmlCSURrNm9FeGhyYXY4QWw5L3VWR2E0RURGNGtqUi93VUFaMkpreSt5QUFYVUpqTFNlYThJakFFaDIwOW9RaFFjclM0eC93elBpVVFYRndKQTJjdXlLVWk2USs3T2lBYmFXa1lrQ05RZUZRcGRpekVNVkZUeG1yVHJ2MVZRT0NLVkNLVEdQbEJFZmxaS2laQlpoT3cwZnFxRXhMa3kwZ1dvSjNEWWN5VlFwZnNOUzJrRklKM1dCd0RNMVVDWFdrMDBoMEhOalc3V1c5Z3RDVndjR0R1NkNPSFZ2dFJJaDZsb2M3dElmZE1JaGRiVVUyOEZSeStwWlpkYTF3RjFwMHVEaGF4bk9NM0NaeGpQTzVMLzAzb1haQStqWmMvd0NZWWd2NUxwamJhOGMyclBTeG5aYU04K01kRGp2L0FFUDZNdjhBK0Y5RmpYL1IyMDhGdkhGYmJINTlYVGx6L3B0bG44bW5vdzVQOTJmdHp0L3NINmZyOUt4dmN1bjlkeEc4MWRyUFd4L1JiRGQ2ZXpqcVZzdGVlMUY1YzVlcDFXVzYxM1VvNjdSdzdlOVFYdEJndjNTcTZiTGE2NktWWFJZS1U0RlZFWHRtSWNlM3hSVmhiRTBlVXFyMlcxSmdOVlNpb3RlZ2FEOWlsRjdRU1F4alErOVNpZ0JOSWtzRlE0a01KSnB0MVNpZ3RlQ0dJa3FVTmF3dGNTR2pzcUtXNnpOMUFkblVvWmhhQVRTSEk0VUZNV2MwcVNaanpTcWJXS2dPaUd4QmNFeThOVktDQTVoMjVIbTdLVU93TEVpU2xVSkltTFNXMCtLQWdOMEZSYkhWV3FObzAyMDYwU2pZQUM0Znd1NXRTaG1IeW5rbDlqNUpVTlVHQlNYNGJoS29XdmlBUmoxaUVCeGwzYzZoMlNoamFDTVNab1NmYVVvTGw2U05RMnFERVUxdEtVWW1oSUxFeGJxZ3dMZks4Qmc0R3ZWQUJKRC9BSm5MZElTZ3V6eUFSK1k3T2d3eWVhSFR0d2xCME1NUlVIeVVvemFBVVp3ZnNWb0lINXBZWEZ4NUtVQ2tNZVdsS00xcHRtWEx0MFNoclJhUnU0aUpsTTVCTHlCNGs5MUtBTWlCVVJWV2pQSURBN2pUM0tBdmtkUmkxRHVnelNEQTZWU2dNVGpxMVcyU2pDUmJMQTE1NnBRSEFMU0RiRHpzcU5hQzFYY05JU2hxR2JtZm55VW9RQ0xpeExuODJ5dEJMWXYrTG9DQXhjZ2d0RFVDVVlrQ2hkNUpQc0VHY2NBdzRkOVdTalFEOG9acHVhT3lVWVFBNWdNQnV4UVlOcEVSdjI2SlFURGg2YTAvRlFZVUFFUFY2OWtvV3BEYUJ5Ulh3cm9xREw0NnM4Q0ZLTjhyZ3N4QWdmWXFNK29nYm1sZnZRQzU1QUxpNGJWcVlLQXZxRFdRVHB1VUJFbHhCb3gwOEZLTSt1VFFRNkFTSkU4RWl1eW9Ja0VEU0FlenVvQStwdDZBNzlTcU0xUTh2SHM2VUtCYmFBRHQ1cFJyZ0RMdUJyMVRHUmlOUXpEWG9FbzBnYm1BSmg5VmFBd2VrdE4ycVViS3QxTGVZRlVCdEpPTVBBYytLQkhEczVCdVoycDQ5a1F3b0hMUE1kUWxVSFlnQXlYT081ZmRBUTVjYTZIVGdoS05VTnFQNFovRktBd2M1U2VSSHU1U2pHMDF0TlM1Sm4zSlFKMGMrK2ZzUUFFMElQVTZEUkFwWWw2ODhKUU1hTVNBREk1NnBRc3V4M24zcFJtRk12eTFsNnBSaHZMYWpVY01vZ0hrTytuNHBRRERoNTl2ZVVvRkpZbmJsMWFGT0pobUxvRXVacE5EQlFJYlNIMlNoQ3h5RnI3RStaVnFFYmNNL3dDWS9pbEVyclE1M2VvOFZhRUlEZ2tzWmNPL1pLSnMvd0FwRlBibE1oU0JJSVo2ZE95bEViclhtUnF6VlZvamVIZG5mZWlvaGVDWERkRXhrUkxQZHhwK0NJNTdyWklacFZvNXZVQUVzejZGWEdVYzkvc1ZhT2U4YUhzRVJ6NEYrMVZhT2V4NEtLNjdBdzgyS2c2Yk5uclRkQjBXbW14cW9yb3NCZ1ZJMVVIVGFUdTcwQVVWYTBVMGFqVFFxbUY3Y2lXbloxRmRGdVRidW9MV3ZUMjZxQ2drdlU2RDI2S2lrd0IzSFZRUGFEQW1KMjhVRkFOS1cyd3lCZ0dEVVBuS2dwYlYyY0UrY29waHViV0lMMnZ4dWlLeVI4djJkVVVYWU9UQUU3K1NnWVpQQmRCaGJ1Y3F3ZkJBUVFiUUNXRFNIMjZvTTBzMU5Ib0dRRUVXM1FJYjgzRUt3TzVOZkF4UFZSV0pKM0owY0tqRVE0aHhCTEFkVVF3L01KK2FVVVNTU3dKR2hjYklBNWR5WWtBZThlU0l4L2l1Y2tpb1BEb0M1TWhpTitSc2lzTGk3Q20zVFJJRGJveEpEQ1Bib3BrQUM1cTAvTStpQXVEcWFTMUprSUgzYVR4MVVBTkFDV0dwOW9BUVk2eXgzYjdOVlFYazVVRE1YVUdkeGROYWJJRkJKQUFJZVpZZUtvWndaeTJrYmZpb0JrWHhCTHZ0NGxJTUtraU1RMlNBZ2xvTHZyOWlBRnkvekFHNm9JZGlnTGtrblIzZnArQ0FBMmc3UHZXRUd5dUlBYW9JNFNBbGdXWnpKWmtHa05vR0p4cktFWW00aUMrZ0xmWWczRnBGcDFqNElRQUN6RUIyRGEwNm9RSDFCckxpdjJxd2EwMExPNGZXdWlCaVhpNVFaeUdEalJ3S29BTWdXZ3N6ZFB1UU54dDJIYnhRS2IySUJKRVZhTzFVZ3hKSmpVVjBRWjNJMEpMa0lOa1E0RGNrb0NYTlpod1c4WVFZWEVtcnNIaElOK1YycnFneExPeHEycUFaUVFmbEJqcDJRWTNIK0VaWmZsRVU3cEFYTkR6M0QwUVp5U01nNUkyUUFFaHhIVGIzSUMrUmVRZjhUZmFnRnhKYTBGcm1mM0pnWUdrbVdEa2JkZXFEWEZpQ2JxQUVEcDRLZ3UxQzMycURFbGhMQTFKajdFQXV5L2h0a01BUm9xR3E4Y053VkF1dW1SRk5ZVkNrTURjQ1llSWpWQ01aT2dOTFNQRkFKQWk0c1pCNnFnNjlJSStDQUZ5SGYvZ3pycDVvUURlUkRsOStVZ0ZRd0RBd2RDNkpERnJ0OW5vaWc0TEFNV21aUUFCLzRnOVdHcUVMZGtNZ1F3b1NPVVJuSWcxbHRpaWxhbFROQVcrelZFYlI3YUNDQ1ZCaTVmVW1nTkVBWTh1UkwwOGtBTlFDSlBIdHVvRmk0U2EwSjUyVklSeUFXUFNkZTBxb1M0RWdzNzY5K2lLUXcwdFRiNERoRUJ3UVFhME82S21RUkR6N29xNnFKM09OWFBDQ1ZSTUVlMnFvVWlLbmt1Z2tRV3BOMnlnZ2NnVExnNktpRnhMN0FWUVF1ZDlpeDlxTFNaUzlRUFdEN2JKZ2MxKzFEVkVjdDRKbnc2TFFoYy8yQkVjLzhYeGJ5VkhONmVtcjZxanJzSDJyTkhTS0FWbG0xVVYwMjBmUVUwNFJYVFlKYWgwUG1wUjBXT0dlZDMwM1VGcllxNEJaTTVWYXdUcVRLRG90QTFocWFVV1ZXdERHdlZFVmVuU0RLQmdDMnhmcWxWUUNndGhwTG1maWxSWEVHbFdZdHpWU3FlME43dndRVXRjTkRVZ1RDQmd4N1U1NVFFQWtuNXVROVZBYlhjM00rZ1pCVThRZEI4RkJ2emFFZ2x1eW8zeWhpTmZCaXFvZm5tb2FJOHBUbUdycCthcE1hNklLRUdDQUhNTWRlaUJuZHFGdDJvb01UMlozdVpBS0VtcEZHMGo3a29MYXRRNkpRb09WWG1oTk9pb2I1aWRIMTJQQ2x3Q0dZUm80TllOZkpLTXdOcmtQUHUxT3lVT1RUUjlDb0E4RnJYZlQ3ZXJvQXprUzlyd0NQc1ZvemxzZ1BscWR5b0RMN3pUaEFDWEpkbVppTlVCbzB1Q2FjSUI4cEZwdVlqZjIzUUJpZDMzSDJRclF6Z2dFT1cwOC9jb01LRnRLZmNnQUpJcVNTUk5PVUJiSXUwRFdQQktCeUJKMGFvSjhFb05XZjVoQlpBQVp4ZHJXWnVxQXcxcDM3NklGYTRzd0xHaEVNNm9ZUER1SWtTOHFBaHpJYWxVR3hhTWZDUHhTakMyQXhadllKUmdDQ0FBM1BSQmlLUERHbWhLQm1jT3hiK0RSQU1RV0JPWEIreEtNUmFRd2RuZWlERzBPd0JvR1AzaEJpTFFJTWhnSDk5RUF1QmN0Um5jaDZWUUEyczRtVG8zVHFsR2E0VjFodnZRRWc3RnBMYWRrQWtFT0dZUXhIZEJzZnpBQnkwOWRuU2pINW5rd1pIeGhBT0NESFZLQzl1Z2dVSUZFQXVJQkRna3RHdEhRRW1TUEVHblB2UUE0a2k1NHEreXRCakpqWGFXWlFZc0hmMytiMVFDUmFBQ01qQXVQanFsQnE3R0dnMWZwS0RDVEFMUHpWdFhRRW5qNVRVKzlBQS95a0dsU1dqaEFJcVNTTHFrVUNBc0FKUHlpQ0s5RW9QOEE3MHNEMVFBa2lOTlNmZ3lBRXZCR3NidlZBR0RNYlFDekVobnI4VmFNYlJvTm1xKy9zeVVKVVFZR2s5MWFHT2dxU1hyM1VBZHlBWGx0bFJvdU1PQVgwanVnTk5LQ2lsQUJKQllFQWVNS2pNN3c1RXpBMWRRSmNHZDM2VkRkT1VBbWtHd0NkVW94aDNOQkRhRHgzUUtEUnlkQXdPdFVRRDh4TDlSVWNJQTBRWVA1WTIrOUFwRVFBR3A5bWlEWEJ0Q3pHUlZBalBvUkVVWmxSSWdmbU1FT2xDT2RmUFFSVkJPNmgwSTBLb2tTNFBFT3lJV2F6QmdGQks3K0lDb05kMEVyZzBWOTZLNTc3ZmxJaDFxb2hjV1pnMmsvWW1CRzZzenlsUnpYQUV3NVpVYzk0RjNMSFRsVWM5MERkcWhFUllaTnFxamxzRGZGQjEyZ1BTZENvcTl0V0x5ZllJT3EzckgzcVpWMDJ3SG82bVIwV3dRNHFvdUZyQUg1ZmVxRG90dExEVjlOZ29MMjFPKzBxS29CRFVJOXRWVVBhQmsybnVVVlFPeGt6QTY4S2l3ZVhrbUZrT0psM1l6d2djRUI3clpHeUNnRDlEN2JJSGdFdTRlVUdETVM3MmlCdm9nYU1uSUxVT29oUUcyak9BQm9rVXdNZ2Jud1pBdG9KSWt5STVIWlVVMGtoekRiKzNSQVhyb2Q3ZkZRYlVHWkdtc2ZjcUNYRE16dFVxQlFITWdQTDg2VVZHSmNDb0x3Z1lXT0pBaUcyZnJ3cFJoYkRqNVMwQm9sQTdhMUJVQUZ4TGFCcGYyMVFBTzdzU0RMTzgrM0NCZ3dlR0FGVVVEVzZmOEFoRmtSc1F6UVlITC9BSElNWERTUUtVZjdVRFNBQTdlMElwSUlwU0JSajd3cWc3Z3lLL1lvTVRKeEVDa3h1RUJvU0QvRjdNaWppWW1wZDQzUkRZd1pvYUJGREVkRHYwOGtRd0UwSWJlWDJSUWNRUUg0N0ZFQmpBQVpnSURmZWdZdVdGdlY5RHFnRGFsMzIxWW9DYTArVm43bEJua2JFc2RrVnJLQ1k3U2RVeWhTUVE0cVF3YXJxZzBlR0EwWlFFRXlKQjhXUUFCeFB6Uzg3b01KRGdraG81UGlnSjFKY3RJQVFLd2dIWFNubDNRTmk4L21MdTJqOFFnRGh4SWgzRDZsQmhWelBoeFJCb2NNQzVBb0dlaW8xcFlNWHBPdkNnSXRoNjNmd3ZvMmlBUUpMeCtZMUNBd1lBWUNHNVFBdVRJb2UrNkEydHpNZ2Rhb0VZd3pER3M3ZEZRU1FTMFpNOVBlb0NMUURvRytLS1VDR0l4SllOS3FNUTVBTjJNU0EwTW9EaVJKbHBMNmRFQUZwQmt5SGNOeThGQUNhYXVXQTNiOEVCaWdFZUNLUndTUVd5R2xkV1ZRVGthZFlMbFFiVTFxMnlBMXJOcGpZb3JPVElHdmlpQVdxTGd6Z2x1eUFzSUlqWWpYcWdHVTRNRFNPZGhUWkFmbGh4NzJicDNRQnpEd1N3ZjR5RUdBeUV3WkJJalZBdU5OSWIyWldnT1B6RWtSeTNaVVp3WGF0M1NmZW9CSUhYY3VGUWVDQ3hsNm9BU1JwMGF2RGlFR05vMEdzalNabFFUSllnVkxVZGpLb3hyL0FKVFMvc0hRWTFMR3VvVVFwZGdMWGhqY0tJTVFLa0E5ZEVDRVYvdzZnL2NxRnVBbG5BdUtCQ05vbHFhN29KM0hYeExJRUlKZWhjVmZSVVR1REVuVTYrM1JCSFV1ZW5LQlFETGwyVEtZU1lWRTkwVkM0VE92d1ZSekdDd29YY0R3VkVTTmkwUENJamZSNjhLNEhMY0hCam9mWXE0SE5kVWh2RkJKamszbWpMazlQRm5BNURhcldSMTJlK2l6bFY3ZHhYUW9ycnRIR3lnNkxTSnUzK0NtUmExaHlOS2ZCRmRGZ2gzQU8raWc2QUdCMVlleFJWN2F3WVVEaHBBN29tRGkwd3dxYXZ1bFZjQUdHcFQ0S1VNSGU0MEdzb0xXZ1hPTjZqb2dhVDhyaHhYd1FNOVR3N01VRE04bWVtNlVQU2dEWXNRWXB1b0c2M0FPSjJkRllIV0hQOFBDRERRVk9nb1B1UVVoM2w3YWo3SFFBT1FBUTJ4Z3dxQ1hPckEvbDRPaWcxYW1tdkowSVFBT2JpOFhBMEc3Q1ZRd0FHVXRqK1lLVU96UGMwMEE2cVZRMUp1RGJieWlNS3NHY0IyYWZGQW9PcERsbmNhc2ZpZ2Y4MEdXcU5FQUZHREVFZGtWb3BONFB4UkdJZ01CREcwYklNYlM0TGR0QWxHWUY5OUJYeEZFb05odXUwWURTcVpEQUVSMEhQVkF1Skx4SUVQdUtIVkF3QUFFRWsxOFBCQmlRWEZEYlB0MlFFZ2tDQVJVZ3oxWm5RRjJJY2hoN1VRQmc3aXByZDA2cFJoaTF0UThPWU1ib0dhR25YM29wWEdJTkRpKzZJMXJVTFBieStwQ1pDdXdoNE9ueEJWRGdzdy9DYUtBUVdNYmdBUFB2UWFrRUJoK1p0Z05PaUE2dVFlQWVtaUtYOHhJZlNXUkRFUFNDQUdRQnlDejVDNlFISFJBSERQU1p1alhka0JxQjdFOTBDdEJ0Tno4KzhxaHBuVWpUUit5Z0labmNBZVVJTmt6aXJrc1hRS045bmR1ZFlRWnF1R3lZQnhwUmtCRU1mNGpYUjI2SU5FT1dOQ2FPZzM4TWtBRVQzM1FBdzRINVdJTE4zUVlseVNOOFJ6eDVvRC9BSk9wZDd0dGlneE1rdXdERGhCbU10QTAxNFFEVS93bmV0WDVRTkJobzhrVXJzWHh0eUlqZnVpR0ZYQmZZYU1nQWNtUnkwb01RQ1habzIvQkJzWGtING9wV3VmY0VzUTRoRUtiVExtUUdmaEtDNEppNzVSTS9lZ3pPeGw0ZjR5T2lEY0Z0dlowVUFMYVBzQWRSOWlJMHZjNEJJaW1pQm1GYUV2S0tVa1dzSFBNN3dpTUF4eURNWkozU2dPUkRFa09BTmExaEF4eGVXTTdvSmtFRFVROTBLMENvYTMrR0lmZ2NxalFIWUVONEFxQWt2cklnZHdneElvYm5yd2dCdEJ1THUvajk2QkFEYVFOOVBqdWd3YzNGOU9yRkJwQmpTczlVQ3pMaVRReW9pY1d1eExXajh1M1ZhRzZGaVJRb0V1YWJTVzJISGdnUXVZZHRlNkNWd0FNMEpvZ1FnMEpQbXJSTWlDYXNnam8yb01nRlZNa3VEaHpXamxSVUxpR3ViVVA5cXVFYzl3WUZvMUFLQ0JET1NYYVNxSVhCb1p0dkJFYzE0RHlRVHd0RGx2RnZtZEZSSmk3K2JLTXVPdzlDcm5DdW15NkJxVklPcXdqWXkwK2FLNkxDOGlQUFJTRHFzdTFhQ0ZtQzFwQlBjUHFGWXJvOU15ME85T2lrRjdidEFLMUNtY0t2WmNLMERNa0RPNWlIb1BZSUtXa0VrVlllZEVIUURpQ2FuUUtRTmFUVjRhZGZaMUlLaTVzdEJRSDNwQTlwTEdqczc5ZWlRWXlHeEllcCt4VVVFUEZhNkR1czVHYzFrblcwSDRTckEyV3B0YktvUENSUmVoSTdEY29IQnR0QUJiWUJJR3lGQkpQMkpBcHV5WVl0cHQyaElOa0hjbXNXbnJza0JOemlRWmhoeWtCQjFMaHRBRytHcWdkMkxnZ0FicUtVWFVhMW0vTUEzaDRxeEJ5QWNzVzJmbnF5a1ZuMUlBMmMwVlJzbU54bTVxSkJzZ0h0bzVqZndTQVNhMU1iSGRCc3FBV2dFSHoxU0E1Um83UVhpU2tHeUIyWVQ4VWltbGhrU0tleEtSREF0TEdmdGhTREc0TzV0SWVjdGZjckJudWNtUzRZU2cyVEQ1akpnRGs3S1FESUQ1V2JRZ3pHenF3SE5zaXpCbmd4cWZOSUJrMXJDalNhKzNpa0I1M2tuZEJqY1pOdHVRTzMycEFjaGJTMmRCcnlwRkM0aHc0QmVBVEd2S3VFQzY0bWdvL3kxTkV4Z0EzQ3RkWmFPVWdkNU1BdFE2OTFGSzh1enZyb1ExZk5WR0JKdUp4Z0QyaEFjaUFUb3pnRXBBTXlERWdod1k4VWd3WnpCM3RuUW9ObU1RS0VWbVFrQnlZZ3NKaHpIWmlrR2VlZWRnVVZoZVNCY1lCbC9ibElBQ0EvVUZoQ0lOdHpuOHJPS1BEZEVneHVnbDRNQnArMUlHTWlqRlJTa3k1RUdDNkl4dTRMNm5SV0RaQ2Zta2lOUWtHQmdERVpFRHlicWtHTnhGQXphN2U1SUM0Y0h3TDFVaWdiZzlHWXhNVW9yRURMVVFRS2M5MGdkM1lIdnlvcFhlQUc2ZTlFWVhSK1ZnSGZYc3JBY2dDSERsb2V2dEtrVmpjV2RnK2x2d1NJQXVrSFJtRFVxckJpU2FUYnFEcS9LQXdEU2J0SVp4S2lnNHVmR0c3RjFVQTBMUTFDL2VpUUtjaERlRTdjSUZCR05vTFhDMDhGL0ZBUWFTeHRqNElNU3doM2NrRGt4OFVCZlJnKysyenFSUXlJZURkcmI3NnF3SEwrS2dBbjJaSUZCRFhSMkJKUkFjbHZsY0RVUDhBRklHZUNHWjdpd0ZVQkYrcEVOOHMxOFZJcENDR0xjTWFOcXFoY2dEcThselIyQ3NCek5vMEZlaVFDNjlqc0FhcEFRU1I0dWVhSUZkeVNDQ1F3cktRSmtBOE5wZDREWklBYnNpd3JhWFNBVzNPTGlJZHBKKzVUT0VZM0Fzd1lrdjVKQWo2V2dFVFF0UmFnVzR5ekZtMU5WSUV1SUFIeXRvd1NDWnVsM2d3Q2tDWEVzSEhVZFZjQ054dUlJZzdFUXJCTjhuaUMwS0NkOXpBRzdWbUtzRXJyZzcwY0pqQTV5VEQxYVZSelhHV2JqYVBCV0lqZGRYYzBEcEVjMTEwdFdycXdjdHhNblg0S3dRbW5kK1ZVY2RraVJHbHcrQ0k2clhiZmQxS3JvczNaNkhaa3F1cXc2YUNHVW82TFpBWnJ0SVVIVGEzeWs3cFdsN0RBZU42N2FLQzlzVm5VbjRLVVhEL0FEdFZTZ2hqY0hCM2YzSzBXdHBJbHFkVktLaUF4WmdZUFRsU2lvSUFGSE5BZ0laZ0JJMUc3cTBWcXdJRHY4cWxEUHJvVFRkQTdzSGFPZkhsUU1EUGFUenNpZ0JpOFBOUE4xYUN4ZVMrcHFQaWxGYUJuSWxTaFhKbkZ3RE82b0ltQmM3eWZKS01hTmFXZ3kreVVDNEdCM0JuUjlFeGtPZEFBd1ptRlhVbzJSQk9SalRmM29EYkpOTnZDdnZVb0FjRUI2VkFhT1hoV2hxQURzNmlzSGU2SzBQc3lVTFNsb0JrbDU3cTFCK1l0TU4zVW96dk52VnQ2TXFOOHNHM3Q4V1NoclJMWEI2a09wVk51d2VyQUZoMENVQ2FnZ2dSYTMybFdvTE5xNElabTBHaVZRR0krWXlHY0ZrcUMvWnkvd0J4VVVRN2swYy9kS1VBUFVPWm8rNlVFUEJvR3A4QWxBQkpBT2hGWG5vZ0lBSWExZ0tnaWpwUmdhdUcwYngxUVpoVUFUOFVvVUhaM1BCZmZWVkdCaHgrWWhBMW9MRVhUdnQ1cVp5cFNYdWNiZmxKYlhaVkJhRy9LSm1nOEVvQkQzQjVMT0IxU2d0L0VCSkx1ZkJTalBiTHlKY3ZzZ3dnMU56T1hqVHdWcWpsR1RBdjdCUUxhMnpCbUlJMDZxMUdEOTR5OEVvMmpFRTNTQUN6OFRSS01TQVlEQncramFPZ0lFRnFiQm1QYWlsQkJkeVkwS0tUUWdHWlBzVmFoaXpBRXVUUXhLZ0F1T1JKb05hY2pSVUVjVFRWaTZnMHM5WmVzSlJ0aVRpRExLMEFzNUJBWXRSS01BS3l4a2tKUXdPaGd0VGhSUUJEM2dpVCtiOFZVWTNBSG5icW9CQWd3S0RyVjlsYUM3Z0VnVFEwZFJRTE5BZGdJZDQ0VnFNVHFZWjVFMFFFd1dKY0hRNi9CQnBiNW8zSTgxS0M4Z2paanhzaWdRN2lBbENBaDIySmN1MCtLQmRnQWZsN04wVnFHN0V0N1Y3cUtBYVgvS2V5VkdJZDdpQzRwMjBWb0lic0tNTjFLcFM0TkdENGc5MFJucHFOT3N6NUtobkpJZ2lIZFJRZlV5N1AwUUFBR1lKRStUVlZxRUdSTCtmRzBPclFRemdURWg1U2hRWXVCMWo3dXlCNjBlM2luS2lsRHNRNGpRVFhSVkV3YU0xSmhBU1dCaHF5Z1FPR0xQRW5reVZNNVJtZVNRWG9kZXlVSWRTN2lySGxXaGJtTEF5UVpQWktGTGRDOG12WjBvbGNBUVcxTmErS1VUdUZJa2UxVmNaRTdpYmlSdnA5NkNVd3c3SUVQQkhCU2lGeGRtZGdTNFZ3T2U4aDNCbWFLb2hjWElpbXFvamNTVEJZaW80UkhOZEJvdzFLVWNsOURDMVJKNXJHNzZvamp0MW1xcU9xMmV4aFJYVFkwR3JzeWl1bXc2TWU2ZzZMWGFRNWFDbVIwV3p6S2pTOW1wbUM3K1NndmJwYzJyUFJNaTl0U0FTWE92S2dlMldMMTNwMlFWdGVkZjhBRUVGUVEyeDBQM0tCd1NSTnJBMWxCUzJMY1RNUitDQ28za0NnMTk2RE9CL0V3QjZvS09DeDBtTnBxc2pXczROc2JSdktxNEIzRkdNRVBNUFhkVU1IQTNMVTIrQ0I1WWdVME11b0NSazBzMG44Q2d3cEJlMC9taDVRRVVyeGtSMlpCc2dHZXV3MFBzVWltQm9DYW1DLzJxQWwyWjIzQmxoMVFhYUZtdUFHT2oxS0F2RnBBamM2QkJqYzJySG1pUUJnQ0IzTStDQlE1TENMQ3hEQkVZQnF4RWNJSEpodFJYU3FLVjVJeVl0QTBSQkVFVUVtVVU0a1d1VE5iZ2QwUVhiWEozSWJZb29Ha0Y3YUVsRUZ5RGJrZFB4UWE2QVlJZVNhb285OVkrQ0JXRG1IZ09LZFNpRGFRSUdtaE81UlFEeTRkcEIxazBRWm5ZbHlkUlhaRVkxdDJCY0h6bEFab1FRNXJzaWd4TEVWZzFpbXFJTkk4L3ZSU3M0dGRpQlFEeThFUVRiSS93QVdwWkFRd2M5d05lcFBLS0R1UVdja005c3hyNW9qTnJVR0JFQUlyR0t6T2orTElneFI4Vy9LSDE5aWl0OHphZ2lHSm5yeWd6aDJBSlpwMHFnQVlnaXI2Nm4ycWlNYXpTZUJSMEduRWtDb2pwMlJXQSthVEJwNzBCSmNaQXRGQnFnQk5vb1NDN3RVb2pFU1cwMkFyb0VCRHVjUXdFTkNLQWt3Q0FlR1krd1JHY2xzWG80Z0lwcEduQjE2SUFHTldOcG1KZnZ3aUFBNzFCb3huZXFEQzdvUVB6RGQrRWdJSHpRd0FEQUlvU0xvbi9KZHkzTDhvR01EOG9veGVBM21nQUJ0Wnk0Y05ETWlGY000bDZtUU9kRURHZEJhd2g5T2lLQmd0V1lJMzI4RVJtSVlQUVNOQjRvQytoZDl4Q0t4TU5UVDRJSW5ndmlISTl0MFEwaDJMMmlEMFJXWUFoeXdPanMyeURPSUFrRDJqc2dMaVRVR3VxQWFtTVdFYWxBUVdBQmsvZWdFQ3NSSmhFWm5GdTdPYlR5Z3dxNHRZbXQzUjRSUUlJQW1nbXBSQ1FhQmpQbG9GUXBZUER3SEQ3YU15b1lUV2Q2VVpRSFNKZUNTSitDS0JhMjBnSHJOSDNSRXlLU2RSa1BOQWZsWjNkeS9YUkF2ekNJYmlpSUJNY0NSMGxBaGVBQUhOUTIzNHFoYmcwdExWKzlCTzZBMVhMa2RFQzNZbGh2TEJRUk5HcnJ2UlVJUTFSbHozOFZSRVRzNW9kMENFbHdmTHpRUXVJWjJudXJoRWJ5SDJKUHhSWE5kdnpFTFNJMzhBR0tLWVJ6WHM4enMvbXFPWDFCV3J3N0tpR3VQbDhWVWNmcG1udEpUS09xMDBBTE5WUlhSYVdIYU95VlhYYnFBM0Rickk2YlphSElTaTFydVExR2I3VXF1aTJlRzBVcXVnRjZnL2Vwa1ZEZ2drbHpvbEZRU3hZNlFWQlFFT0c0WUNrNnBSVUd2QjdoMEZBSkxWMENnZTB1QmI0N2V4U2lnTG1qdzRTaGlDTXBMbVVvYXlEV0E1ZFRPUXhlTGQ0YmJsS0dKTVBIZEdnWUFia3lUOTZ0UVJjS1RNQTdUb3lCbW9HRE81OXhZSlF3Wm4vaTFyN2xLb09CaXdZYnFvMVdZNndSdnFsR3QrVzVuWUVsZ21jaHhjQU1oSUdnOXBXVk1YTUF0OEVvVnlDSUkwQXI0N0tvelUwYlQzYmJLVWJRTU9kQ0ExS0pWRU9CRWh0SVNqQjl3U0dGZmJkS0ZwYXpqTFFzUUNQWXExQmN1N1VQbDcxRll4RzRxQTlHMlNobk1HUzlTUEJLTUxueGNPMVhyd2xEWlBQNVdEZ0ZBZG5xYW5WS05RQUFzZllwUU1vTlEwYyswb01HR3VSREVxb01rMGdST3FsVnVUWFVhcFFSekpKcFZrb1c2NXJhYWFTeXFNYVRCNk9XMVVVZnlpNlhJTGo3MG96aTE2VFE3dHVnem5RNk05VUcxTGVESlJpUkJhWXIxKzlLQTRJQk9veUo4enlsUUdZQzFtYXBOQ3JRUVJXUXhFNytLaWllV0lNSGRLQTV0QmVXbVJTT0ZRUVFIRDR0UFJRQUVoN1pKMys5QVNJSWZZVUh1U2dGbmtFYjdkVW8zNVFSK1lBc3pQWFJLTXpubXBIVHYwU2dpb05RQkIzZnFsQlptY3ZTdmdsQWF1NU1kNGRLQUhBK1puZW85L21yUVE4QWpjbmhTalVEaU8xVDVwUm9kekV0YTJxVUVWcElnRktBQWVtNDZwUUN3cmNmbUJsS01DY20wUDVuanVGUWNwbHdYWmxBQ0NYSU5Rd0lLVUVWWi93RGhCS053UXhJbEFBekM3RmdIYnVsUVgzaVpQR2lLVW5FT0JJNWo3RW9YV1RRaUtwUWRpWEFkQUdJQTRFc1BjbEJreEJaNnp3bENzUWJvR0xUTmQvY3JVRTRnZk5JQVlrNmdLVlNuOHh1eWEzVWZGbGFoaVNTdzZqMmJoUlJJRGl1NENVWWJtbFFVb1hJaVNHQTNoVUt4Y3U5elVTakFHQUtEbjIwU2hRdy95ZDIrUGlyVU0yTUJnS2txVlFGd2U0dkZGUUxpSGZtVktKa3dibUo0QktxRE1GMmg3a29YOHR4aUttNTZBcVZBdUlCYkZ1RXdGbUNISklyd3JRcElQUStFcFJPNlRzeno3MG9TNG11bzltUVNKRGdidjh3bnpDb2lUb1BieFNoWEJnQ2RRZ2pjMDZnUTRWb25jV05PakpqSTViaVE1RkdyVlVSdUpmdFRXVmFqbnZERjlOdnhTbzVyMkxzUnFGUnpYbmpoV2lML0FETS90VktqaHNOQTc5RlIxV0ZoNHFEcHRpNmhQdHlvcnF0SjNiUlFkRnBBbVozUWRGcEZCektpcldOb2VvS21WZE5taGM5VDdsTWkxaDBZaHBQUGdvS2FNMUZROXJzQURJRlVGckNiZ0RYY0prT0dhM0ZuZU5VRlFSRlNlZUZrTUM3Q2owSTNDb29DQ0hxQUJUZFFNNTBKSm9mZWltY0VadXdVUm90ZWFsM0tLSWZUb2FrZTlVRTVNQ0ppbXFLZDd1aHF4KzVBUXdCYlFoajdGQmdSb0lKZW01UVlFalZ3RDdoS0F2UXM3d2VPRUd0ZzFrZ0ZNZ1BhV05BOGthdHgyU0lwUjNsNkFVOGxGQnlDWmNPU1JxZ3pOK1lPSHFVQmR5eGdzOEgzS0FBa0M2cFl3VHFYVkJNbDNBSFh4b2dEUVFDS0Z3N1VkL01vQTlDeDBacTlLb2hqU0RwRE1vckJqTE0xVUFBYTRrUTVvNm9iSWtCeTVxYlQ3Y0lNQ1R5RFJCaGRXSXAyMlFPTHJYZ2dhZGgrS2cwRm5Ja0JoOEZRSitaeUJzZGtHK1V1Q0tubVMyNkROQmUwUitYYUVCaXBJNmtLREZqQnFhY1ByS29ITGZMY1g0UUY2L0syb29GQU5DR0FKMDl6cWdpNE9YT3hIZmhTQUc2VFhqVFRkVUgrSFJ3MkxvTUdvRFVUOEdRQm9MRUJqWHcxUWFIRG1zekh0VkFmbURiRGZSQUl1SUxtRFNtcURTU0FaTFNXUVlYV3VXRWhtZndTQXRKSUFKRmE4SUF4THpMU0FJcFRaQVM3T1N4R3ZUaVVCSUpZMHE1aHg3MUF0c0NKR2cyNTNWR01TekE3VjVFSU5CTWRlcHI4RUdCdW5JRXRJQVpBZFhxNWZTSXFnRlJjelRvS251Z3hKazIxWjNhRDBRWnpMQ0trYmxrQ2s2UlB5eDdGRU9LSFEzYisyaWlnNEllTmlRL3VRQVh3QUM1YVJ1cU5sVndBSDhVQ202NEFrZUk1MWhBWG5sbjY5MUFvcEJEYXY0UDBWR0prU0hHaitLRGJ3SzFHL1FvQTVjVmo4emVWRUIvNHJnVTQzNVFFdVFHTldKUDJLQUMxdHpqSWZUb3FNNUkwSU1jSURITmFOT3lnVnc1RGdCNGJnS2hRV2RnUzB0MTRWRy9pM3U0S0FYQWdFaHdBUHphdHFpRzRhQTBuaEZBRnc4VUxIYnVnREFPQWNYbktpSVZ5U1JRRXNaazhlU0FSdFVPWDdvck5JZVJzaUJKMWxtMW9vRnlBY0ZxTzRub3JBdFhraDBRTGlBd2NEYUVDRWlDd2FpQkhZT0pmMktDUmVYa2lmRjFvVHV1N21qbjdrRWJtb2VIT2lER21qMVpRYzVnVXltaW9sY0R4eDhWUnozR3JTL3ZWSFBkY0pCb0tPaUkzM09DOEFWWlZITGZRaWRoN0ZVYzE5MHR0VklJc2MzaXF0UndXWEFibHlxT3F5NEV1enlvUjAyM05KcFJSWFRaZjdleFJYVFpmRDhRb1IwVzNDbmtvTDIzaHhxUVZGWDlPOE96NktDd3VBa09ZZ0lLaTd0Vm0zUWg4M1k3bW00UVd0dkowK1U5RkZoN1M0OHNmd1ZwRDIzTTRwdkg0cVpGUVJXYmhSUWg4Mkx1L0ZQZWhGTXJmR3ZocWdFTzJMN0lRd0l1SWJhbjNxY3hEWk9XYldQTkJueXBHNWFIblFxMVJ5SElQUmtHRjRZUkJiWVEzM0lSVE4yK2JFN2NuM29NYmlDWW5wNElNYnFRekFFQ0QyQ0FPR1lGalFnVmhDTnZwdG9aYnpRaG5iSUN1aFFqWmt3ekJvSUZGSURrTGhVaDlOWWxDR2UyU1o2OVZDTTRxQTFEQ0VBMzJ1NVljL0JVRjZQYVcyanpVR2NuZ25WQ01TQXhla3YwcWhBZGdEaTIxdXgrOVVqTTBoejVKU0M0bHh5VEZWQ01UUWdGM253OGtJQmFwSkdwUGJSVWpBZzVQYitid0xoQ0RreGVyVnBEZmFvQm1RSU1FUzlDcVF4dkFFaGdEVGRsQU1pU2FqVXQwOEZTRG1MV2YrSTdvUXd2RWo1bWhvVVdCbmJvQ3hrOHVpUnN4cFV5MzRLa1kzZ2sxQkZXZ3lnWTNENWhicUtId29vUWNnNThrV0Z5dG5YWExxaVFjcldkMkVzU1dRZ0EyM00rOEZDQ0xuRTJrQnRkMEFvUXdrUmE0anlWSXh1WUYzSU1FN3VvTmtKZTJha0RoVVlnQVVhZEQ1aFNrWjdSYWJkYXhvNnBBTndhSGNib1EyVnRzeTdValQ4VkZqWlduc1EvdEtKQzVUMGNBMXIzbFVqWjJBc0hCUHZRZ1puVVFaSlkrRVZRRWVwYkwydTVnMWNCUURJRVltMDFCWXREeXFSc3dkQzVwN1ZVSXh2dEJOckJ5STgraW9OMThBaWorOVFoY3dhdkViY2hDRmUwdXpIUUg0S2tFWFB1SEpaMEJCSmFPaFB3VUlMdzVsdG9qeFJZUjdTUkQ2WTkyVlF6aHkvQkZ1cWhBQkFERmlIcFNCOTZwQmNRY2QyYWpLQlhjVUljMUhUVlVna2dSQkR3RG95RUM2NzVYQjZqUVIwUWEwL0tTQVRCMDhxb1E3aDVNajJvb3NJRGF4TzRENitleXFSczNKWit0S0pBcElsaXhNeWVteW9CSllmeEhVY2FvUXd1bVFSUmdnVUVnVE5hZFpRaGlhdlI1VUlSeGFhOHNBL2RXa1kzQWhuSXhpcUVLYm5aZ1FYa2dmYWdEdk5zQTFDVUFYR0lmaWhVUU1tK1lUSHpTaEFMR1dKZXJLa0M2OFd1UzhTZ21TRDgweUphQWhFM3JjUTRFalJVaE1uT3JBeFZBdVlFVUFyc2dpYncxSGJUbXNPaEV5UUduMktxUk80Z2FPemJPaEVpWCthUStua2hFTHJ3QzVnbG05eW9oZGRvQ1J6cXFJbTRUMVJFTDdnSEwxb2c1YnlKNnkzaXRFY3B1Z3pLcUl2OEFNK3IxYmxCNTl1bWoxVlIxV1I0MVVWMVdYTUE3cURvdHUxQnBKVVYwV2tSTk5kMEhWYWZ4NVVWVUVrQjRmeVVGN2JwQTMyZUVWY0Z6V0RwUmxCYTB5S0hidW9LaGhJMUtBdTdpaDJRVnRMU0lmWDJLQ29aalU2RUlHQnBNYUhaQTl2eXM1cVhsUlRod3hZUkxCQTRJSkVpM1VQdHNnTTJ6VVZQUkE3aWpEcnhvcEFRZE9JQktnSUJFR2hOSzZLMFl5MFRvVlZHcm1mOEFKKzN6VUJGMUNYSXVMcWhnWEpZTVJUU0RSUUFCZ3dEdTg2ZVNvTE14cnp2c2dZQ2VqK2FnVXdYSjBZbWs4cWdBQ0E0Sk1HZHArS0Jzc1NOSDh0MUlHeUxRSDYwU0RDaG94cDAwRElDVG93TVQ4RkFBS3pxOFJYb2cwUVJxZFBZSU1BRDh3Y1pQQkc5VUIyTFBzRHVnTEdMcUhVSU1HQStVUnVLYm9GL016aDNoOTkwQnRCNVk5aW1SaUFXQi9objdFQUphbElmcU4yUUVrRWdnaUgxUUFtVFVrVWQrM0ZVQm5RVlBRZDBBMUJKRGswOW1RR2RpVFNmZWdBQklvMTNzK253UVlPenNhMDEzMFFZT1JjL3pBME9qSUN3Sitad1E3ejhVR0w2Rm9xZ0J1ZCtLRHk1UUFISWhqQWVXMTZxaDV0R3ptQlRzb01Td0Rqa0JBcHUvTVNUREV0cDBLQS9NNWFBSzhlOUFBN3NYSFBVOGJvQ0NkUVNhQTZ4OXFBRUNUL0NZYlJBSEIrVXlZWjllNm8xdnpPRDhzdUJyS0JpNExHWG9HcXlnQmN0TWd0YVhaejJRRWtzQ05OWVFiSnhGQVdZaElNQk5wTGtqWDNvQWFzWlA4UTA4VUJJRHllUUNIaEJ1TVh0TzBvQk4wQWdqeFFGNjdTekZrRzVrUDlyb0FaYmZTTlc1RUlDU0FhMTFoQUFIajVXZU53Mi9SQnR3NC95bTJsQVh1Y0VNQUlQWHlRYXBJWWh4SXFnRjJ4cTJ6cGdZRUV5QklodGxSaGNEVC9qYTlsSUZGdzBBbHpsM2Z1ckJtTVBKcTdJTS9EdnAwTkVBZWgvTnNYMVZHNWJyYjBRRG4rRTE5bVFHNE9RMTJMRk1ERTBBSlBNMTJkUUtYdWgySG1xRkFkaE9Pcjc5MEFJdHJVZGtHQkpGck9keitLbVVyRXZhWERsbklRS1MzekNaRW9BQTVCZWRCc0ZRamlKRmREN2tBTHVHb0hjb0ptNlFBV0d2TElFSmloQUduc1ZSTXVMaUhyVGRFS1NCSGlUc2RIUlVTUTlRUUlBNkloU1c2RGJoQkkzY3p1Z2lTR014TGFLaUYxem1BWTNWRXJqbzVlUm9pWmM5eFoyMGxVYzl4Qk1VNFZ3T2U0MDNWUnpYa1MzY2JvaUx6NXFqZ3RPblJCZXk0a2JFVkdpbzY3TG1qdXNqb3RJTEVEcHNvdUhSYmRYbnlRZE50d2lYR2lpdWl3OU5uMlVGUTNqQlNxdmFRd08yL3ZVRmdRMENuaENDMWhhdEFwVk80L2hseUE5VVF6ajhwYUtPZ3NMbkczdHNvcHcwNmxxNmNLMFBrek5NY3FCaFVsaE5UOEVvZk5pN3ZRY3FCeGRRT3p0S0RCcnF5VFVLaDhtWUNtcnFEQWlTOHZBQ0J5OUFJT3RlNmxDN3N4RlIxNVZvWVhVYnpFQWFvcmJrVERJQUhCTE9BSjlnclE0dUFFdUorYloxQVhCL2lySU5ENW9OakRsbm1hOUVvYVNKY1JYWW9NU0FkQnVnRUF4SnFUK0oxU2pPeEp1TGhvQjRRQVEybEF3UWIvSmN0RWpjVlpBNzBZQUFhcUFQYlZoQlk3aFVaeUhBTHZEdFZBd1l1QTh1NTFoUUZ5RzY4ajdrQUVDSGN2RzBJTWJycDFhUzJ6L2NuSUN3RVVsNkpRcEJjYzBFanFsQmFUQWN3RDdjSlFkZEpHKy91UUNrcytNamZtVW9ZdURWcXYwUUQvSjBMNGlsUE5CaC9raG5sNFRPUUFOQ1B5MFNqZktBMVlEYjhJTS96T3hjQ2o4NklOUU1TSWdQd2xETzdmTE1BNjFRTFYyaTRRNC9CS0RTQXcwM2hLQVhhanpBNDdwUnQ3V1l1WFBIZ2dERUF6aVNmSFJLR2NRMVFXOFVHTXNkejhQTktBeGt0aytoNFNnaCtESHk5VzBRYVpMdHNOOW42b0JOU1dMZ003SU5Sd1QzNUNERUV5Qk5DRDFkS0RqYUgwSURrOGVTVWFRR01Bc1BIb2xHNW9icXY3a0FBSUpFRUhzeVVGZ3pNNVlreEQwU2dBMm5yMTFRRTBCRWRlVW9BTnBiajhvaGtERW5ScDFxRUFpMTI2alp4Q1VBazFjV3RSQm9CSkoxbG5RRElPL2pvZ1VremtLR0NIM3F5b0xnbVhnd2d4M2RwZC93U2dHQ0hhNE1hOFYwUWFvWUVGNTM4MEdGVHJGZFgzU2dPN2hvZVZRWW1wcUJQS2dQVWh4VG9sQ0c3Y0F2US9CQURjNWswTFIwUUtYckFBM1BnVmFNNHFMaHJQdmpzcFJuWUFnSEUxWktqQUJpQVNDN1AxVW9WOFM0RDZlU29CTEZ5Y1FnV0FUUnorWDhGUUxyZ1lJY0IvbXFnbVNERnRBWVFLWnEyM2hzbENFbTQxSGNVVlFEV3JrMUtWVXJpS1VxeVVTeWtoMmJyUFJFSzdTUHcrS0NkMTJvQW9XQ0NkeFo5WkdTWVZDNjRTZTdxb2lkeitDdEVMcmlUQkIzTG9qbnV1RTdFczZvaGZkQkloNVZITVNRL2xzcXk1N3lKMDJUQWcvei9CVWNOaDRRWHROUEpCMDJFd2VuWlFkTmhnUEhmVlFkTnBBUFdxaXIySGJTb2hUS3VpMHNYTkc5aWd1QzdSRlhVRlJjWGQySDhJNVNLdGFXN1NWQmVkTkpvaXFBZzY3T1ZCVEtIWnVhcGdFWFdrUzgxNit3VmlLNUFzOGlmSlJUdkRsMjh3Z2NsZy9MaEJuWWh4TkdGT0I1cUlybHZ3NVVVNzY2R3BwQ0FpNm00Z2JGVUVraWEvQkFUQk5HOW5VREM0RVZKL3doSUNDU1M0Qkd5RERRdTRCbnJ5b0NLbHV4M0d2dlZXaTVjK0tEQ1dKQUhQZEFQbVlzZm1GRENCOG1saFN1K3lBNVczRHNlblpBV2FQNFdrL1lnd2MxWU5CRys2QldNQXQ5amJLZ2h2NGd3RkNXOEZCcXRRY0VWVkJjeTFKRHFETzRKQi81TWxCcXNZUHR6c2d3TmFPd0JDQXVZY1RvREtBR2dkeTd4MlFITXVBZC9sMzdza0dkeVlZaitKL2k3b0M0ZHJZMGNxQWd5UkxNNTlnZ3dMaTRzdzBQeFFIUVBhelNpaFp3WURVa2RreWc2SEVoejRQOTZCVGFDSGZrTkhTU2dKY0NBS2RIWkFkUTVyUUlBenVEU2hMb01aZmlhODhJQ1NXWWFRUitLQU0ybnpYVlFHQ0tWMUUwL0JCbWlvSTI1cTZBQXp3SzhOUHhRWXhXQmQwcUtJR0pMZ2luaWdTTFdNVjZ0dktjNDBrTUxXREdXbWlBaGk1QlltaDBJQ0FBN3dhdElkQXpRUXdtcGFFQXR0YTBqTFdYSHdUSXhGemsxZURPaUFGOURzTzlKUU01REE2KzNLQlhCY2JRRzM3SU5rQ0NSMGZ2eXlRR0NHYWdRS1N3ZHZtMXVIMnF3TG1DekVndUdId1NBNUZ0WHJNVDdCSUFST1FMajdXUWFRWEdzSHNnWWtpR2ZreFJBcEFMeVhhRzZvQzhFZzVUSDJJTUJVblF1NDBRRWlXTXgwUUJqTEFRN2FzZ0RTUzdobTMxUUEzaDNGcjdublpBUVRvOGpYUkFsSEVBbVNkMEJjU05SdE9pQlhCTWwybHVxRFN6ZzhudWlESWR1Zzh0bEFscEEveVFHZy9lZzF6bWRxR2txZ1ZaMzNZb0ZsM2JhV1ZBeStVa1BxK21wUUtiaUp1MW8wbFFMazQxM1FUZGlTK1IyL0ZVSzhUZEFpT3lvVTNFRGlrd2dtU2FhYjBRSmsrc1ZKVmdRelNZVW9XKzZ2Uk1ZRXJqRWxpYXFqbnV1WVZab0lDSWhkY0RyM1Z4Z0pkY3p5eDFDSWhjVzQ0VkhOZGRyb0toVVF1SWVqSWlGOXc2N2xWSExmU1FxT2R5K1hrcU9HeTduV1FxT3EwOWhxc2k5bHpCbkdxRHB0TE4xb29PcTB2clBDaXJlbVNkWisxRlh0dUlEYndvTDIzTy93QVVGeGQ5NmlxQW1SUXNKUVd0dTdjeHBFcUN3TUFFMTBLQ3R0emFuL2cvY29LUWFBa0V5bUZGOFdEeDJWNTBPTGdYYmVnNTFoUlRpNFFLRFVHZVVGRGNkMkVVVEFZT09wbGxBUm9DV2VrN0lIekRaYWE4NklDTHRUcFRpdWlCN1RNZ3Z2djJVQkZETW1vTS9ZcUNRUVB6TnNYWkFjajBpcHBLa0JZVVljOUhRRmpjQjhWQVFXbW02QU94ZlE3MDk2b0lMNnNHWU43MFd0cUN6Tkxpbk82QW1BU0ttc0ZBUVRPTndKWjJRWVhYVVBFY2RrQkpOSmYvQUJCQVJkVG5Xbmlnd0ZkcnZFK0tBbVdtTjZVOEVHbXBvSkc2QmNtSUpETUtoV0JneGY1WjZWZFFaMlpxKzI3SUEvWXdDTzJpQVFaSW02Z2QvRFJBMHMzOEpFRWExUWFYaldqelNxREYySnFXM3AzUUYydUVzL21VQUZ3ZG4vS1lGYTBRWVBwZTRhb3JYb2d6dTVvYlk2SUE1dEpZTytuWGxBMlJZdnREbElDREEvaWp5VUN1UTdBdUFkS2txZ2d0UU5hUHlvTm5RczdhVVpJR3lZQ0lBYmhsSUJrWEpZRWF2VldCWWdFQmlhQ0E2QTZIVTA2ZEVHeWdRQ0drVDdrZ0dRa1UzSjI1bElDRHE4Vy9tMjltUUI2M0EwQkh0Q0JnYm50ZmFCOXFEWkd0V2dKQWx4T2haenI0cGdGeUhxLytJSU5xTGlBeHFlbXFEQUY5Q2RmWjBHL0xPanlOdVVHSm83UitaQUdNT0FZbzZERmhPbThJQ1FNcE10RG9NU0FETzduVWNvRG8waGhFSUFBWVA1dUQ3RkFBSW1uTU9nSkxNV2E3UnpYdWdWL3pFdEFtS3NnSnVERndSSGFFQ0VtaGNrMUlEODZxakVzOXpuYTRpTklVR0pvTFE1R3NJTUlma01idnhRTFVFQUlnZ3NkUnNpczRyVnFzOVFvZ2t0SkxDU2dtYmgzWjNWZ0dSNERsdG0yVmcwWkVFbWp2OEhRSzdIckRqZXFBRXVQbG9XSU1vQVNDWjFxZ1EzUkJ4MytNb0ZKRlM1WWE5VUNrM1B0YTFGUXB1R2djdlRUMmxBaHUvd0FwN2g3VVFUdUkrd2NEUkVUZVR1U0NEMXA1cWdFdERObHA3QlFJYnBJSis1QkkzQU5NcWlWMXp4cTBvSTNYU2RlRlJFbHBFYVA5cUlqZGRKSlBib3FPZTY2UUhmYjRLaUZ4aG43ZkZCSzY1aHA5aUk1YjdoNzRWUnpYM0h1YWhVUm5ieVZSNTl0N056UkkwNmJMeEduVlNEb3R1R3JkMUVkRmwvQ0s2YkxtYlhkVEpGN2I5ZDRQMktSVjdiNVNDOXQ0RDlhN3FSVjdibWY1b09zQkJZWHVKQm80VUZMYjdSRHpza1ZXeTVnMjFQZW1jRVh0dUJFdWQzbFFoaGZRMDl0a2dxTGd3ZGpvKzZoRE84ZzlPcXBEQWwzQWQ2TzZrQnlBaDMybVhRUGJjSGNmbFBzSVFWekJJY2N1WW9nSnV4cFRWSUdCQWwyTFVVaEQ1TThFaHZKUld6cTBuWTZLd0cyOEF2YnRJNVJEL1UxYUQybElyV3NSQkxtcExWWkVobkRTSEFOU2dJdUxnTVEzUlNLd3ZHMU5qTWNKQmhjRHF6eTlFaUdCZC9tbnozVVdCazlCMmI4S3FqUjh4cXgvTFFleklHeUJrU3dFNlIxUVlseVhqZjNJb2x0V2NDVDl5RWJLSEFMa0pCamM1MXRwSVNEQytjWnBCUHM2REc5bk9tNDFrS2tObUhZQ1FJSHRSUWdpNEVTT0k2SU5rQUxtRDl0WDJTRENoZm41UndoR01FeWVBSGhDTkdvSkxGMElQeWdEeEhDRVk2alFVSG5DRUQ1WEFZOEFSeWhHZHEwcFQzb0M0Y0RXbmF2ZElCRU5VQ0RxaEJCRHMwTlJDQ0M4MGZWQ0ZGd2Y4eExRd1NBQW1mbFlHQXFHb055TlQwM1VJQXVkNCtWMmhJakF1TmJuQW43a1ZoYzRseSt1amVhUUVtQkUrSlFiSnREb2tHY094UExkU2d4a0hWNmdCQ01DemxqTWthbEJubGk1YitKQUhja2FWWThvUmhOcmgySWpWdk4wSUphakc0OG9SamNHcEZTeVFDUVhENmh6WDJkQ05sQUJNNzhnS3dIVVNXTSs3b29SdHVCMFFqQzRGbjFNRHpsSUJrQXhkdUlRZ1pTUUFTOEVhT3lFYjZqbUpGRWdHUkl1WU1YMS9GQU0rWDJTRFBvV0lFWTdKQXVUT1N6RVFQdVNCd2JRQnFiWTVRS2IzRkMvdHV5UkdGeGlDSmNxQVpTMGdiYU4zUWJJVURsbVlpbmtrQXpBbXJucUt3a0NtOEc0TlV2TE9yRVlYR2hIQXFFZ1YySDVRK3NkbFJzN0pHclVTREcrWmFScHVvcGNpeGhoV0ZVaGN3U0dwbzBhSUZ5RzdXcy9aRmhjc1dreFVVU0lWNmdURWoyS3BHeWJuY29zVE53QUxVMk82SkNaYXN3SmZRSUZKSmQ0WXdnVTNCM1lsaitiWlVUTjQ3NitOVkFsMXhBcVE4a21WWUozM0VBdEoxTy9aQ0kzWGhwcXpFaFdDWnVFUzVyMVFTSkZyc0hPdnQzVG5SRzYrV2ZwYnVyRVF1dm1uZElJWDNrUnhYN2xSQzY0U1Ryb2lPZSs4U0dmVmxjWUVMNzViaGlxT2E2NE9UcndxaVAxQTlmYnFrVjV3dTFXaDBXWEdObEIwMmw5WlV5TDJIc2c2QmM3Q25LaXVpMjU2Ky95UVhzTlF6Z3lvTFczR3J1OGh0VVZlMjZYSm5RZEZCWVhrVWtpb1FXRnpnT0s2Y0tCM0FZYWlRaXEyMzFhU0Q3a2lyVzN2cjgya0tDb05OQ0RSUU1DVHBUUVFDZ3BsTVFCTGU5UVBrWUwxWnVWVU01NjZHRkNqTzdpbktLSXVNQjIyWlVPQzFRd29GQlJ4MGM2b01ianlXWVI1cEF3TXZNbVZCc3RUdDE0UVBrQng1ZFVCQlk4RW4yNklHeU13MVBNN0lEbEUxRVBLQm9QSm9VQUFNZndzMUQ1SUdtMmhqV0VBQkxpR0FNSUd5ckRFRG5WU0RGbWNTYUJBYU1JSERJTS9MT3c2KzlGWnY0ZEgyU2pWdUxpSG1mZ2xHY0IzY1FTd1BjKzlVTTRkaEVPNTJDaXN4SUVrYW9CcGN3b3hBVlJ0S0VEUWRlaURFa0VnWFN6c2U2QTUxQU1jZUtRRUVrQnJwYmlpS1VHSWFEWGtvaGpjWkRzMHVneElGczFxZ1ozSkRIdklSUXUwSWpRbHBDSU9RWTg2ZkZSUy9MRDZ1NnFHTE14SUQ2OVVBY01KWWFGQm5BNWlFR3l4MklQNXFvQTRCTTBKblpCZ2JkYmdXZkkwOXFvR2UwQWFBYWo0cUtEZ1VrRWd2M1ZHY0Nza2wvR2lJeldrQjlOZHVpVUFGNEpxR2VKWkFjclkyZXJOS0RYRUFjR0FQdVFMaytqeTJxREVrc1l0R3AxOW5RYk5nNUxBRmdQaHFneE56U1hMVjIrNUZhUkpPVGtEYnRDSUZ4bHRScjNRWUQvQUJHbnQ1b0dZUS9ZYUJSU3RSdEQ1YUtnWEFEZ0dvMFJCY1hNNTVrVDBVRzlpRFJLQStySVZ1QWU1cWdCWm5ZZk5xSW9VUmhBY2wzcktET0JxWU5hSUE0SU9xb1hLNHNLeExPL2drREJpSEJpam9GSkV2QUJGZVVDdmJUUVJYMjNRQTNuYkdRMnRLcEFDWkxuaGg1SUZ5WUVpMmp0UGlnQUphSEhYcG9nVncrcGQzT3lCY3RYRnBxT1NyQnJpUXhxYU9VQ1B0OHVxb25reEFGUlRYaEFNaVlxMVRzaFFkbUR0eCtLSUUwZ2tNQWdtYm1ocGFuQVJTRWg5ekxvRXl0TkNYSmRCSTNGb2lWUk0zNmduVS9ja1JFa2loZDZLaERlTis2UVJKYUlHd1ZSQzY2U01wMlFRSkZYSExLaVJKQlluMkNJNTc3bmRxMEtEbnZ1TWpmZFZFTHJ0M080Q281N3l3YUdkTUNPZXJuZFVlZGJmcERhS282UVcrS2l1bXk2ayt3VXlyb3N1Z0FhS0lzTHFEeVFkRnQza2l1aTI0MDAxVUY3Ym45dmVvS2kvdVVWWVhtTjlIaFFYRi9uK0tpcVczT3dCWVJEYUlpZ0pxTzN3Q1ZWTGJpR085Um9FeUtXK3BUbWg2N0tLcm5FMFFQYmNkejdlS2dwYmVYWWpycktCOGpCbG05dFZLR0JFUzU0VnFRenhzODdJTUxqQWN0VGFpQnhjZXAzRzBxS2JJbG1MdjdRclFSZThRSGtlS2dZRU1TSHRhZzJLQXVYQUZESSs1QStXbTBGUUVYbDRNZnhlQ0E1RUF3UWFsdmdnTnBvQTl0WjBRRVhFZnhPZWRVQk44dmk1R2hxZzJSdDhZYm1WUVJYWXVYZWEwVW9ZRWwyREFCdGtHeWJ0UTcrd1FZRWdraVFUSVFISmhNYXVnTnBCMzdzYXFBNUNSNGtSN1VSUmMxY0Z6SEtBT3dpU0lBcDJsQmlYZGl4TzJyb0RxR1p6MG9sQUpkNWQrTmtwUkJsN3BhUVNsR0pZa20xM0VuNFVTZ2s3bjdJcTVaS0JsSWhpWCs1Q2pBSWZSMlNnRmhxWllNRmFvQmlYRW00eWFRbFF3dURPS2VYZFJXSmJiTFFkVlJnZHRhSDNsa0JkOGdJTFVLZ1dqMFBFRHhaV28xV0FjdHI0UWlzekJ5UG1ZVDdPbFJpWEw2TithaURHSzZiNzZKUVhPaHJweS9WRlo1Z3ZFQUlBWkVOME9nSGRFWXdiYVRBQVFHT3BHaWxWbkRCaS9UN2tRQ1JNenE5YUpSaVNIT3I2ZkdxVUF0VXR3WGJvclFTK2trR2FhOGxTak96REVqYmZ4U2pGKys5SCsxS0FDVHIyYmZkS0NTV3FIQTEreEtNWEpabmZWMG9HVlM0Y0g4VVFwT2pHUHQ0Vkd5YVdaaEhSQWNpOGtQN1VVVW9OYXZwQ3FNYmlIWVNmZ2cwV3V3WXNLSlFOUHpaZTFPNlVMa0RvMHd4WlViTXV4RUNIMWhRWWtzSmQ5VUM1TkFaMmxqNG9vWlhQMTBLSVUzbVppcjhEWlVLYndLdjRtRUdKZUFRQWE5MEFOd3RrelBVeWdVM0VNd2MwU2hNN2dhU2R1cW9CdUpJMjFNaFFKY1pwOENxZ1NIbGhvTk5VQ3V6R216c0dTa0tiNS81eUtRM2tQdEpMb0VKSjFxZ1EzR04vTlVUTi96QVVRU041WXM3MUtvbWJ4cVhlbmRFcWQxenpvSzhJSW02bXBHcXFJRzRzUzVCbm9xSlhYbWRqdkNHY28zWE81MENJaGRmdUtLam51dloyTTBWRVRkcThvaUY5MVpvZzU3N21Id1ZWelpsMVVjTnQxUGVxam9zdUxCNFVGN0xtZzkwVjAyMzkxRmRGdDlDN2NxUkY3Ym1adkZCVzIvUUlyb3N2MU1kMU00RnhjMVRHZzFVRlJjeFB2UlZCZHMxWjdJTDIzdVBlOExJcUx0ak9wZjNvS2k0R2xSdUhSVGczTnZ1RkZVRjVZYWNPa0ZCYzFTZXFDZ3ZlamthKzlBNHZwM2I3RkF3dklveEd5UU9Mb0xEN1VEZ3hvOVN5aVFSZGtONWYyZEFYSkJxUi9DVlF6L0t3SFVjS0tZWGlLRHA3a0J5Ymx3WVFOazlEd1NnSXVjM0IzRjN0c2dNRG9LRFpBenpSMzJVQmR4VjliWFFFWENTWmVUdFJBUmZXZys1QVhBQjVZUjhhb0d0dU5ScWFiZFhSUkZ4cS9HNkFndTNpQ0VHQmFXTGJEMkNJT1Z0WHFZWkJvSk8zbWd3SUlZTkhLQXM1SWQvYmhBWGNtaDJDa1ZnOXN0eWV5SU84VFEzSXBRZmxOejFkMis5V0laMkFCcnVTcEZadzRKMGNNa0FCQTRBYUoxN0lHY0F1YXZDQUFqemVqSDRJRGtKWXVBSFo1OTZET0pKWXRKUWI1UTRkbjM1UVlFVmd5d0tnMEVFL3dBT3JWVlJpQzVnRUFmbEZVVXdiam5yUlFMcUM3QVZKOFZRWG5XS2pmelVHeDI3aXFBQnhXMlpvcU03blkwT2lCWERFTzFLbmRFTUxnenU3T1QzbElyTU1lZmVVQU53dEprbHFwRUdIcUc4VDdrVXJ1eGR1QVlSQmNhUzFCOEVBeU5kTlFka2d3TXphemx3TmVxUldmV2pWT3pCa0FGMFl0M1pFQUUzTngycUtxakFNMHZvVzJIUkFTQlhZeDJSUWNGaS9JTzRSQUJBTVB1MUVDNUZ6ZFY5TlBqb2dMazFZWEZuOXlBRXVKcnBzNkFaQjNmVFl2Q0JjZ05Ob0hDRFpYQm9lYWZnZ0dRQUlPakJBajJtR1pqdnZvcURrYUFNYWxTREVsNW5ZS2hDZWRLOEhsQUNSRVFVQ205K2p2SEhWQXVRTGhtQ0JYTk5RWktBVm9STlVSaVJBTE1OQ2dVM05yVVNQd1FoRGVKQkRhVENSU1hYdVNKY0t3SWJoOHhpTkVDbStSOHpjSUptOGlrQTEvRkJJM0VocXVxRXljZ1BvVVJNM0FTT2pjcWlkMTNMa29pUnVEdFRqelZFVGVld1FSTnoxOFJ5cWlSdmg5Qm9FRVRlckJ6MzNseTMySmdRdU83Y3FvbGZjUjk2RG12dWFXVndybXV1QkpvcWhNa1N2TXR2YjRLanBzdW9QRlFkQXVjTnFsRjdiMmlqS0s2YmIrL1JSVjdiMzZpcWlMVzNNMHBSWVhlM0tLdGJmUWJLQzF2cUQ3Vys5QllYQ0pwK1lLS29McWNHUXlVVnR2cHlKK0tDNHVkZ2VxelZVRjdrelQ4VURpNTNjTlBpZ3BsTCtXNlZUajFIUHRSUVA5UVBhL1lHc29IRjhoeTducjVvS0crQXo4dEtBNWtOVW5iMkNDZ3VucHlvSHlvTnBVb0l1MGgrTnVWYVF6dkZPcURXeDkzeFJEWkY5aXpzb3RFWHMxUGRQUlVFWE9Ia1RRNnFVSEtBWEJHOUZhRGtMV2VZOCtFb2NYQjkzTlcxQ2xHZWdkK2ZmQ0JzeUJQbitDRFpWZ2dvTWJnOW9pR2hBMmJzTW5OUTZneExnNURIWHNsRE8ycysycVZSRE1kQ2FzbEFjU3gwRWF5bFE0dUQxQm1UMVNxRjF4RTdPd05VUXprUzNzVXFnNEhRQ0xod2xRMlEzYzZIcjBSUWZhZndTb0k0b041N0pWQVhXZ0V3d3F5cUREa3dXcnA1OUZLckMwNUVnNytLVkdiRUFWSGlsR2tmTXhKYjViZGU2S3ppMTMxMUVWVG5CZVhjQVVCUEhWQmlhZ0ZydUNnQmRnSGNtbnhTb010QjRhaVZSZDlTZ3prMUlIZDBDZ212RGpTT1VRU1NTOVdFalVKUmdmZUtsRkJta3M5VXFNWWw2VUZFcWk4VVl0ck05RUFpQnRMTWxRZG5Qd1NnRWlndVl2UjM5bVNqRWlCRFVLVlFCaUNlVzlpbFJuQkRDWHF5VUFrLzRYNFBYZEtEbE14dTFKU3FEbDMwRkQxU2daeUhkQUhET1RSeS9LVkFKSHlpSWlVcWdDS05YUktqT1RiU3UrcVZRTjdDMFAzZlJFRElYRnc1YWlLR1k2TXFnRjNHMXVoMTJRQnp1eno4S0ZBRGNLQWRpRmFCa0cwblhSS0JkZG83VWJWU2dDNWdCTDdKUXVSRW5TczdwUXQxSmx0RDlxdU1qTzBtSTlwVUtYZ2dkVmFrYkt1KzZWWVRLbXdlcFVvVStwclI2RUtpWkx5STRKUUtibUJQRVA1cTBJYjJGVHc2VVROd0pNajdpZ21iM0xBUE92a3FGdUprdWxDWFhnTXc3SWhEZkkvRHlRU043Wkh3S29qZGV3YXJiS29sZDZnMyt4Qk0zUnY1b0kzWE00QmQ1Q3RSem03bzZ0RWpmSTAyUVJ1dmQyMTFSRUxyaFFGdG00Vm9oZGQzVlZ6MzNEZnNsUkM2NEI1blpXb2xuejdPZzg0RUtvdlplSVNLNmJUVHlXUmUyNEVRYW9xMXR3ZmRRWHR2Y3hwQ1JWN2I5NE9xZ3VMcTBQS0lzTG5JVVZTMi9rTnVndUx4QkJISTBVZ3NMb28vVW9LQzZoWjlsRlV0dm94ZGdnc0x4RXp0WFJSVkFkak9oMFFVRjdORWJCQlFId0NnTHlHcjdlOUZVRndBMjFJNFFPTGdEejhLb0tmVW9RSE9wQ2tEQTAzWmtEZ2dpWVFFWEE4Ykhva0Q1TlV1OUFkMUJRWGJsem95Z3d1Z1Zlam1vVkRPd2tsZ0tvQzRNMElxK2lJTGg1OE4wV3R3UzVad2d6d0JRR1NVREV2VXhzZk5BNHZvQVdod0ZGRVhGcXRvOWFLb3p2ZDQ5VVVSY0RMdHh1aU1HY01YYlFjSUdlNW8xM1VVUVRWaTdSN1FneHVGQnJvZmZDUWFDSzVjZVNJUE1BN09pbWR5Wm5WdFlVQWZVQlZCZGpPc3ZxRkZGeFg4enh2RW9ObHFXR3o2ZVNBdUoyS0JYSHpHbTU2OVZRUTRZTzVJamhBWEVmTTBuVlFaM2NDNE03MVZERW1RNDZlYWdXS3RGU1hWQkJwTTA4RkJwb1M3N29OSll2MEpMSUJPVE83YUtnOFNOajVLRGFTV2doL2VnR1JhQysra0RkVkJkMkl1SUdpaWpsTzdlS0FHV1l1QU9FQWc2aUJMYm9Oa0tndUliU1VBZDdpZHVYUUhLMEJtWWVYZEFvdTNHL2k2RFoxZmFRMnFxTmJkUnFDUVRVcGxSRndMYjhlMnFnUVh0clRXT2lzUmkwQUdwbmZaRmJJUzlOVWdBSXVCYUpuV1U1Z0FhanJIZ2tBZTZyeExOOTZvQklnUmFaZDBRTXBJMkZXUU1idFBCbEZJN1Y2QW1lNnFGSkJhcGI0ZEVBSkR5SE50RUdjbGhUY0JBamhvWnp0N0JBUWU0aVVLV0FRUEdLNklnRWd3dzZmZENBRWgrdTNqNW9zQndBUkkyMFFJYnBjM1RvZEVDbTRFRXM0M29rQzVCMjNvVlFsMTRkaVdxZ0J1RElJbS9hTjlhOUZZRkpCY21XM1FJOUQ0a2xFS2J3SkpaMGhVemVDM05GWUltN1hmVHA0SWladUlHNUtvbmRkTEFzWUpSVTdpNEwrM2lpSlhYQVFJTlJ2c3FpSnYwUGJaSUkzWGlwTGJCVVNOd0w3SUlHNGdFUDNWNTBTdUxjc2lvWFhiOUZSejNYQjJIc0VSRzY0TldsVlJ6M1hVWXp1cmhFY2tIbTIzazYwV21WN2JpV2U3UlJWN2J6dlJJcm90OVE3dHVwQjBXM25lQW9LMjNrYW9MMitvWW10Q0tLUnBhMzFEWExTZ1VGaGZ1VVJjWGRTVkZVelAzb0syK29RV2VLQkJZZW9abnVGQlVYblV4b2dvTHp2RXNvdFZGeGlTNXFVRkI2aElJQm5SOWV5a1UzMURMRnl6d2lLNTNkWmtvcW4xQ2FIaFNCODZkVURDN0lzOEVJR3pKaXZhUE5GcGhlWGNrU2Zkd2dlMzFDN2d4U050RkJRZXBjN2t1S01VREM0NG1XSVFFM2tobitLQnhkY0IrWnBVQitvYUFqbUhTQmhjTlRPb1FISzV2ekE3Z29Rd0lJbGgyM1NrTTlXdXFkTjBCK1orRUF5Y055elFnd3ZMVERpWjBRSEl2VjBCenVabmJvZ1AxS3RBUUhNdCtZRjZuUkEyWkFreUpNSUFMbWRvWnlnWTNOQUpmUW9NTGk1dWNjb01DMUNIMUh4UUVYRnFscExrb0NMak5yOVI3MEJ5dUx0Qk5TRkZESzRPNWNING9ObGNBekRWMFFSZmN3RHpzaXRrNW1LUDBRTmxERXRGVkFNaUpMa25UUlZDNWtFQnRlTkVnYk9URWFrd2tVQVdNRm5EeDdrQnlySWZhSTJVZ3oxa0YzNnFnNUU5RkJzbmVRVzhmQkF1UkxFMU5GUmpjejEzTktJTmxyVnZnZ0l2Skw4VlNBQzgxSGM2Y3BBYzdnV2htaElGRjJMa0NUcWlCbVhZNjZNUFB4VmdJdnVJcVFkV0hYcXBCaGRjd1p3SGRpZ0RtSkk0WjlGUm5JaklPS09nMlJxSm1HWlJReUpkcERDUGdxaGN5U1NhVkgzSU5uY0hMa1BOSDdJQm1SSnZIS0tHUmR6RHM2SVhNdzRnMURhYUlNTDdnSUxnR2pJQTl6QnpXb0xlYURBbG0ycXlEWkVqYWRQd1FBbHhXa002RGZVZ1lsMEM1bDVJY0NSQ0JjMlo3aHVnWE80dklEMThFQU41ZzVid2tDNUVQS0JEZVphSE9vVkNpODF5alJreUUrcGNTUzhHaFFUTnpsZ1hkVUEzazFKYm5WQXBKSDhURFpLaEQ2ak52cTI2UXFaOVM1ZzViWm1kV0JUZmNBUGJ3UVRQcWVmbWlKbjFDSnkzVmdtYjdtbTd2UkJNK29YSTl5RlNONTBMYmxWRTdyejAzKzlCRzcxYnZhaXNFcnJ5NGt4cWdsZGZxTklRUnV2OFZVUnU5UWpXRVZFMzNLb2hkZlYwRWJyelI0VlJ6M1huZnlWRUxyeVhEOUZSSEl2OGRVUjU5dHkxbEY3YnQ2N0tLdmJmMjRVRnJiajFSVjdiK1doUWRGdC9sb3BCYTIvWXUraWtWYTI2amQwRnJiNTM0VVZZWHlCWFdxUVdGKzVmaFFWeWh3UU9VRkxiNHIzMFFVdHZZekZPaUN0dDUzRFBCVUZoNmxKMGRsSUhGdzFadFVXcUFrU0tJR0YraDluUlZjd2RaMGRRT0w2c2VVRDVVbnVnZTMxSmNsZ3BCUUU4ZTVRTUxnWEdvMFZCZm8yb1JUWkZvOXZGQTR2SjFhVklHejUzWThvQ0x5dzIzUU83aVoyWkFSY1RVaHpIZElEazhhYmFKQTR1WTlWQVRlUThNQnNpbUYrTENVUWNycWpYeVFISUdvZjRJTUxnSGR5ZnRRTVFETUI0ZEJnSGN2SGdnMmcwWmh1Z2FYaDZxS1hMU3JDYUVxb0pJbzRab2J6UUZ6UUVHN2RBSGQvbHJ0N2JJTmxxMnJvSHpjUDNxb3JabVJvQlRoVUZ5NG5xaU5NSHgwS0FpOTRBZ2VTZzJSZG5lWE5mYlJWUU54MUlhcUlPV25pTlVBRzdEaEtHRjAwb2FxS0J1cnJ1T2lxTVNXZ0NQWUlDKzRvWFFLNUcyNVFGNkZqQjFRWi95aUFVQUJ1dEh4SHZRRis1TkFVVURleEZOMjZvZzVORGRrVUNURE9RL3NVUU0zSmx5UEpGRElqZmZyNElnT1dZMENEWkdEUWlIcWdEblFRMm5rZ3preVBmQ0FPV2FTVDJRRXc1Y3NkbEFIRHc0NHB3cUJVTUlmN0daQWZ5dVcycDFSUXlPek5RSWdaVmo3WlFESmdDM1JwUUEzbU5XOXFLS1hJbG5BWXZKbFZBTjBjYXdnUTNSOHhmcXFBYnJuQkZQWjBnVjJJYW1yb0ZON3UxTjBBenJ1ZFRyN2tDWlZqc0tJRnlOUnV3UFZVSTVsdmxxN29nRzdsNlFLb1VtY2MxbElGdXZBR2dHenBBaHVNc2ZGVUlib0FwV2lCTHJtRVIwNFFTdXYwVlFtVGpjSUptK3BCZEVwRGZOZWdRU3V2QWVxb2xkY1gyNStDQ1YxNm9uZGN4RG1VRWlleUNOMTh3YTdLd1J1disxQkkzTTUwMlZSRzY4cEVjOTE3bDFvUXZ2OGxSRzY2citLSWpkY3lDT1UxbFZIQ0M5REt0VlVYdFhkRWRGdC80S0t2YmUvWlFWdHUxQjdJTDIzd2ZNS0t0YmRNSUwyMzdkbGtXRjZpcVczS2l3dkxnOHFLdUx4dXlncGJlNDhLSUtaQ0FUWFJBOXQ5UEJCVVhtSkVRU29LaSthbDJoQlFYbmJ6VUZjeDMyUlRDNllyVW9IeUw4VVowRGkrc3RPek1vcDhnOHhvdzJvZ1llcE5XZWpoRVVGek04ajRxS2Y2bXJraHFwQS8xQlV3YUJBUmRHb05JUU5sVjlhTkZORW9Ma2F5QktLWVhYVXFEVkF4OVFCdUtieXBBYzMxTDdqWkE0djFwMVFObnQxYWlBNXZVTzN2UUVYQXc0ZlVIMkNBNXhYdU5GQTJZRllCcG9nSXZvZFVCellFN1VsMEJGN2dFZU5hb0d5M1BmOEZGYk55ZGtRUjZna3g0aFVBbHBNK2RFQnlEd0VCQkZYYnNvTURrNG5lWTltVkdlMEVPV2ZkQm5EU1lLQW5zNEtnTTBvU2FlOUJuTHM1MUNvd094NElVR2ZUVFJBQVMwbm5zcUdjN3ZxZTZpZzVhb0xPZ09SazAyQmhFREtQdEgycWpaSFFucHFvTTh0bDJIaXlBRnlLMXE2bzJScFJ5OVpHaUF2TXpJVUdMeTBvb09DZHk2SXhMN2RFQXJRZ0RhcW9KTm9jOHpDZ0JJbGoyWjBvMlFxOFZsVld5RnNtQzZpQmJjSW9IMFRJR1pyNEtqSDFHTW1xZ1VYVmtIOEt4dXFwVGVIZ2pseWlOazNWM2RBTTdtdTl6VjNRS2J5Q0piZzY4b0JucTRBMzhsUURkekFRREtocEVxQmNoR1dncUZRbjFEVXhMVDVJQmRjQnF3NHAwUUxrWVlkUnhvcUE5eGwyNFU1QXB1WWttYXkreXFVdVpyUjZiUnlnWDZuZHlnWDZqTzZCRGNha29FeTJMa1ZWQ1pQd3pPTkVDRytoMW9nUzY2NGlyS29RM2FIczIzWkFoOVNmZVVSTStvVzVWRWplQUt3UHdRVHV2THh1NUxvSkcrdTVWQ0c2WlBtZ21iL05CRzYvYnNORlJHNzFEMm51Z2tiMEVUYzNEaFZFYnJ3L0lWUkc2NTVNa2FxOHdqZjZua21CQzY2SlZSRzY5a2dqZGVxSlpvT0syNUVXRndLaXFXM0ZVV3R1Q2d2YmZ5cEJhMjRhRkJXMjl2Y29xOXQ0KzVCYTI5bWVpa0ZyYnRCM1VWVVhDSmRDcWk2TmtWVzIra3pzb0tpL1NyNmFJS2krbXU2Z2NYTUlMSUtDN3F4MlFVRjd3Q2dvTHdRT04xQlFlb05Jb1NrRGk5d3pPeWdwa0g2L0JGTmJjK3JFbVVEWmtQWGNzZ2Nlb1F6OXdpbkY0TldmbFFQbFNmc0NBaTZyVk9uM0ZBNHZBR2cyNktRUGxWaVlDQnhjRHArS2dPUUhRR1NnTDFZNjFWcW1OL05kMUNpTG9aK3U2QmhkWHlDQTVsaUdxZ1lYOHQwUU5uSXJ3U2lnTGhMMUZTRVEyVHdZMmxBY2hSMk4wRkFSZTdUcTZnT1lvUUowS1FGeVF6UVpxaW1GNzl0VWdHZTFkZFVnSjlSbTJTRFpnenJQVHVrUVJlZGV4OW5SUnlBTDZEcHlvQ2J5Uk5DelFndzlSdWVJcWcyVDZTRFJWQnpJY3VHTWVDaWdMd1hMOXc5RlVINmprc1lDSzJldEVHeTNycCtDSUp2Rlk0VVVCZkFkbnBzcWpaTStyQkJqY1dZbnVvTm1LUVBoeXFvRzlvbzc3K0tJMzFLQUd0YUlvaTQvTkpJT2lnR1dtcG1OVUM1QjRwVXVxQzlwNDNEcUJjNWR3VzNvcU5tZCtFUmpmcU81YlpJb1pjRXZVTWlCbEVrUkwxU0FQSkxoeVdQVkFEY0hreU9GUUxpNWZiUk1EWkFQTkhsMFVEZlE3S0JmcWZORURVS29COVNoZXFLWE1WQjA5NklCdml1dmRBanhOV1k5MVJqY3dFUFNRZ0J1NHJDZ1hObWU1dmlxaFRjOUtlL2hBdjFHaHp5VWdRMzZDdkcvZElGTjJnTDlTNm9YSUFvRU44TlNZNkt3SWJ4cFhoQWg5Ui9scDE4RWlVaHV0MU9xRktiMmwzNVFKZDZsWmtIb2lKM1hoaEx2QVZ4Z1R1OVJ0ZXpvSm00Q1FXVkNaYTcxTElKbTRPN3VReUNkMTRWZ2tiNnp6S0NWMS9iUjNRU3V1cWRkMVJJM0JFVHU5UVRxUm9rRUxyNnRxcWlOMTZvamRjN3owUVJOMi9aVkVicis3cXdSdXZFcEJDNjVVSTQ0VGxSeFczQlVXdElVRmhjR1FPQzNJUVh0dUc2aXEyM2FvTFczRHJ3b0tpN3dSVnJiMUJlMjRSd29xb3ZiM3VpS2krQUhVZ3JiZEZVVlFYczJoU0tvTG04RkJVWHUyNFFWRjFQSUtDZ3UwZWdyMFFPNTdJR0Y3YXVnZTIvZG1yN0ZNaW92Qmd5TmxBK2ZNR2lRT1BVa2lWQTR1NWNVOEVVMlV1Tm9LRk01MUE5dEVVK1JqVTdvR0Y0MExNYUJBMlRhdVJwUkE0dUVCMmFoK3hRTUw1SmVOdkJBd3ZMOERYM3FRTWJoVjVRTUw5YTZwQTJSWlFFWHdLODhvR3lGWHBWQUgxck5TZmJaVmFKdTNKWi9naFRpN1dwVUFGMjRiZVhWZ2JKOWU2Z09iT08reUJzZzVMdngwUlJGekJoQmFXUkF5Z2gyZUoxQ0JoY3pEd2ZSRkUzaG9JZnhJUkdGd2d4eWdPb1lNd1p2dlFESjIwNklHZTA2dDRoUUFrRmhXWlpVRTNhRXhNS0F1MDFJMUtvQXVrUys4b00rcjlkblFZRUFrZzhNNkt3Z0VPVzFSR2R5NExBYzFRWUZuQU1qbEJpZjhyU2JuQVFZa2J0TEhsQmdROEUreFJRZHEzYXlpTTRBYUdhaURQRUIrc29BOEhRQnk0NklCa0dveG9FQnp0ckRTL0xvQWJvRGtCdGtVTWdLTzVVUUhha0hZMFZBeUVtcDBDREc3WXNaUVROMUtuelZCeWxsQU05QWFVTmRGWVVNalN2M0lBN1VMVi9GRUFsenY5bWlBRzdWakdpZ1hMVmhxN1RWVURQVWQrNkJUZWRRUGdrQzVHdFR1VUNtL2xtZ1R1ckFtUUxBblJBcHY4cENvVTN0U2VuM0lGTjhnSUVjMTFiVkVLUzFOV2hBcHVBZVdKMVFJZlVML0FCUkV6Y0tFdG82c0NHNEViOG9KbTlqd2RWUk0zT09xQlRjWjBtT2lCTXgzQ0Nadk1oK2pxd1N1dmw5a3dKbSt1dktRU053STNWNWdodSs4SWxTdXVoaVVFYnZVKzVXSWpkZlh6VmdqZGU3OElKRzUxU3BYWFNpSTNYT2doZGZLc0VpU2EwVlJPNjZ1cUNiL0FESXJoQjVWUlVYY29MVzNVOTZndGJjb3FnTzBxaWd1UkZyYndvcTF0L2lvS2k0SFdsVUZiYjI5ektMVmJiMEZSZDVJTFczdzFWQllYMEhtb3B4Y1BCQlFYUytwUlZMYjVyUlFVRitsU0I3a0ZSZURMMFVENTYrQ0J4Yyt3ZEtLWkg3MERDN1YyWlFQYmZUVlVQbU4vYnNvSEY0ZGhFZFVENTdrY0VLQnhmVjQ0UlRaQ0pvZ1lFVm9hSVV6MGNUeWdZWDlqc29waGVBTnh2OEFpcUNMdzRZMGRBK1lrY1FGSUNMcnFrMTZvR0Y0M0dqSUd5ZXBmL0NvRG13N29HeUI2L2FnT2VzMSsxQXc5UVRxZFFwQnNnekVQcVVEWlBMOU9xQWd3SE5VQUJOU1J5RUJjVFFkS3BWYkpuMWhVb2cwbHdFQUYyd0xtb1FwZ1hyMkpVR3pCblFVZEFUY3phYythRFpGaWZBZmc2QTVNQkFCS0FaYVRSZ2dZWGdnTVliWFpJQm56MEJRRVgwbWFrZkZCaGU0WWdFYklCbUNaTHZRTXlBNWc2c0RvZ1UzTVF4alp2aWdJdmloSENRYkpvQlpBdVpGRHJxWFZHTnpzQ1J5UHhVR3lsdkJCc25janVnMlhMTnNnR1hnS3NnQXVPN2xrS0dUYXdOU0ZTczRocUVxRFpRSjdCRUxrSVBtcUFTNE9qRm8yVUdQcU53RWd4dUxON1NnUTNralk2S2daaDl4b1VDbTVuMktCVGZVdlVDRlFNb0lmZ2xBcHZFa0h3UUtTQjR3Z1hQc1FxQm1UWHAyVUN2K0NxRU53Y3VTNDBRcFRjSk5TVUNtK3JWUkM1YVAwS0JEZlhyS29UTVVKZEJQNmp2elVxaFRkWFZCUEtvMHA0b0VONURaSHVnVTNzSGV1cUNadllUVFVvSm0vd0M1VVNON2paQk0zUHIxS29RMzFjb2xUdXZHL1JCRzcxSG9xaVJ2VmdsZGVCVHNnamtTNkJEY0J5aUkzWE9xSTNYcWlGMTNkVkV5V1FUdXVlaUNOMXhaMFZOOVhWUnhpNS90UkZBVVZVWEtLc0w0UVZGNTBVRlJjL0NCeGNSMFJGYmJxYW9xd3ZLZ3JiZm83cUNvdWtOQ0NndkxUb2lyVzNxQjdiOUVGaGZEYXJLcVczOG9LQzlCUVhTN3FLY1h2WFJCUVh2ckFUbUZNd0pLQ2d2MTNVZ2NYdDk2QnhkRHUycUJoZFZBNHVOT3lCaDZuTktsUU9MK1dtVUQ1cEEyVDBMN3VvcGhlMHYwUU9McTZiblhaQXd2ZUQwWkFYQU1TZ1lGeU9KUW81RUVCeFBpaWlMeURXRURtL1YrRkFmcVE3OUdWQnpxQnJIUlFNTHpEbVhraElObVQycUJ1a0Q1SFF2T3lnT2JmYWdPWnBNMFlvQWIzNkJVUG1MUVM5Qlhvb05rOUQxS0JzeXdrZzZHcURmVTJralIwZ09iM0NXR2lEWjZhTlJBYzMrSUtESDFHcVdtcVFiTHZLUU5rRFh3VWd3SWFaMVpJQWJpSFlxamZVM0xKQ3NibmdkRUd5dEk5d2RCbmtiQnBRSElOQVBRcVFESXQ3Z3JBTW5kbUZEeXlRQTN0UXVkdUVnYkwzdW9CbTdpSzZLd0Erb3hEcEFQcU5EaGpxZ0dmTmRVQXpGQ3hCcFZCdnFFVktCY3lYUFlGQU1qTXZjZ3pqd3BXRUF5SUZZQVpBdWJhejFWZ0dRUHhTQlRlOHdZZDlrZ0J2YWtFNm9Gekk0NFFETHpxcUZOMnBobEFDZVlWUU1nOWVHUW9HOERYelFJZlVvTit5QkRlK3VxQlRjYWFJaFRld0xUdXJBaHYvQkFwdlBkRlR5TTFtSVZRaEkxS0JjaFB6UTlFQ20vU2lDWnZjbXFRSWZVWi9lZ21idXAxVkNHOHM1N29KbTdzRlJNMytLSlVqZnlxSm05NjY2SUozWHowU0NWMSttaXNSSzY1VVROeUlsZGZ5Z2tidWVGUkUzOHBCSTNFbXFvUzY1a0VycmtFYnIxUkc2NTBRanlxT0lYZUswS1czMFV5TFczcGtWRjFGbFZCY1ZSUVh3b3F0dHlDb3U4VkVpZ3VRVUYxUElvVlVYZmVpcTIzK2VwVUZSZTRIS2tGQmZ4S0NndW95TFZMYjlWTXFwYjZtK21xUVVGK3RGQlFYbnBORWdvTDlTem9IeTViWlJUaTVtOFVGQmVmQkE0OVNka0RpODc5MUJRWDhkRUJGdzAyb2xEQzU5ZXlCOGpMUzJpZ0l2WnRocVZRNHZNVmhSVC9VN2JJZ2oxTmFuN1VnY1gxVWdiSTZtbEVVMlo5dDBCRjVuVUdxQnMyRDZsQWNoSW1FRFpRL0tnT1ErS0ZFWEZoUWdxcXdKZnVvRG1mSlVObTNiaFFiT200RDlFREQxRzZoQWM5a0JQcWVTUWJOajNiVklEbUIzMDgwZ0F2ZmJubElHelBRSkFYZ0NkcXFERzRrSFRzckJoZnNleWcyVW1hNmZhZzJmK1VPVWdPVGJ4US9ha0F5dXE4YWhCdnFhbWxkRWhXemJWZ0tRa0JGMEJrQXpxMGI4SU5uTWsvWTZzR054TFNSdWtBemh5VEtRQTNNWTJvNkE1UHFWQXVlclVvT3FzR0Y3YVVnbElCbVF3ZWxkRUFQcURkdEhTQWZVT3pqVkFNL0RRQUlCa2RDeklGRjFOQlYxUnNqcnFvVWh1YXBOdk82cVZzbUJJTmQzUXJHNE1kRkFwOVNPMHFoVGZRNm9GTjVBREVnK0tJVTNCMFV1WW9OS3F3TDlUVklGTjRFVkhYNzBRbWZMY2ZhZ1Uzd1pndlJVTGRjWjVUQVhLSlBjSUZ6QW9YUlNtOW45cW9oVGVKOTZLbWIzUkV6ZnUvQnFxRU4wbC9GQW1iOG9FTit5SWtiMzdLaVo5U0tzZ25kZFhmZFVJYnVTZ21idkxSVkttYjZnSUpYWCtDUkVycjlsUkkzK1NvbWJ0YUlpWnVRU04zRW9KbTlWVWplZ2tiaWZzVlJNM0JCSzY5RVR6bXFvNUFWUlVYSUhGMVBlb0tpOEpCWVhLUU9DaXFXM0lLQzc3bEJZWHFLb0x0WFJGQmR5Z2NYSUsyMzdhcVpWUzIvNzBGUmYrS2dwYmVkL0ZCUVhqd1JhY1hhK2FCeGYwNktLb1BWaXZWSUtXM3hWbEJRWCtYdlNCeGZ2UlFPTHRhSUh5b1FZSlJUZlVQMnBCVDZqdE5WQVJlT1ExVUZCZHpVU2ltRjZJWVhnOXRFRGk1cUhwc29vNWJ0eXFnaTVta3NDZ1lYdzcxVURDOXp1UWdiNmxmSW9HK3B6T2lSUnpjZE5rZ1lYQXRvMGhFTUxpb3JDOTZSelFxb2I2bGFCOUgxVVVjMzZJRG5RL0JBY3cxUTJxQWk4TUhrb0RsdVowUWJJTXo5a0t3TE9INklVY2lSVnJrQkJZTUNHUUhJN3dvdEUzeWVLb0JrWWFkRUJ5SUFNY25nSU5sTFFnd3Z1NENEWm5YeFFiTXVBRDFsQU1ycXZ6Q29PUnA1cUFaTkQxUUY0K0NBWlZEVjJoQnNnWXExQXFCbGNYN1FkMFNoa2RUMVFyWjZka2kxc3RUNG9sYkpRb1pDWWQ2aUZRTXh2MVFBM2huRTZvQjlSb2pwOXFBWnV3OEFRZzMxR01tU2dYTUJ0VHFnUStyV1dDc1J2cWFlU1FLYjJMa0RxaWdmVUViVjZJRnprNjhJaE16d05tUURPdW5SVUxrL2ZSUlN1eE9pcUFieHYzVUM1NmVhcWxOK3RBaUVOMjVIT3FCVGVLYm9wRGV6ejVxb1EzNnBBbVRQUFVvRk4zZm1FRXplREd1cXFGTi9MdFJTQ1J2Zm56VkNHL2xCTTM4cXdJYjlVUk0zdHFxbFROOVVFN3I1clRSTVlFcnI5YUtpZDEvS0NadjdLd1ROMzRvaVp1YlZCTTM3VlZWTTNwQkUzT3FoQ1ZCTTNLb2ticFFTTnlvVEpVY3dMb2huUVZGeWlxQzVCUVhxQ3R0eUNndUJVVlFYTWdvTDBWUVhJS0M5UVVGMnlpUTR1Vm9vTGxLcDdiMkFiVFJCUzIvZndRVUYxTjFCUVhzMnFVVXR2ZG4xVVZRWDh2dUVENW5aRk9MK1hVRGkvelFVRnczNUtCeGZPL0NnY1g3dytxQnhmQUxkUWdZWEU2c2ltRnpJR3pZYmNsQTR2cktCaGZRS0JoZFBXblpBOXQ4UXdHdXpLS2JQZW1wS0lPVG9wc3BkK3lWQnlBRlhaRk5rWk5FcUFMdzBFOU82b2JKaTd6cW9waGUweHdnSnY2OVVRVGZIdlNxYjZnRzhCUUg2aFBYVk9RTjlRYlJ1Z09ZYXZKUURLWExIbDVRRVhqUWs2Ym9nbThoZ0poRkhJUFZ5Z3c5U2plT3FCczRyMFVDNVZNRGNoVUVlcFNTNDBkQWMzbC9idXBRUjZoNFlvQUx5d2IyWktEbWRJU2pabHlhN0lNYnlBUGlnR2NUVTBsQnM2N2psQU02c1FTcU5tWUhMQkFENm1oTG1wUFJCc3oyMENnMlpWQU40RE9aMEhDQVpna3oxbEF1ZVNJT2FLWE45ZXljZ0dhQlI2Z0kzODFRUHFOOFVRQmZGWlJTbS9VU0NnWElRMjZxQWJpZXFsQUpETVM2dEdOd09wNTZLVUtieEZRMnFvR1pPclRLaWxONEtJWDZtanNxcERlQVBnaUVONDA4VlFwdkwxcG9vRnlKMVY1QWh1QmsxMlFBM2dNaUVONW5WQWh2bmRBaHY0VkV6NmpvSm0vdG9nUTNuUlVJYjkwU2tONnRSTTNvSm04Ym9KbTlVVE43OG9FTjNLQ1p1MjhVcUVOeXBFemZ5aXBHNVVUTjZDWkxvaVp1UkU3cjFSSTNjb0ptNzdncUptNVVJL0tnNXdWVVVGeWdaQStVSkZVRjFGQTR1L0ZVVnR1VXpnVkZ5aXFBb0dGeENDZ3ZCVVZRWGNvS0M0YjlsQlFYY3BBNHVvaUhGMzNvSEZ5aXFDK2t1ZDBEaStzdWdvTHFTb0tDOHRWQTR2ZXRVVTR2NTgxQ25GemU5MFU0dSs4SUcrcFJJS0QxS2JDcnBBMllDZ29MMkZVREMrUnJ5cEEyVDBxRURDN2xrVTJYdmhBMmZLQWk2dm1nY1hzL0tpbUY2SU9jbWFJR0Y0cVBCa0REMUJSNlFVaW16VUd6cDVsVkJGd3A0SW92czhJQ0R6NElObHNRZGtEQzR0dXlnMmJieG9pTm5Bbng0UlJ5TlhaNmpsQWN1ZWlEWlJXaUE1dzdnOEZBUmUrcUFaeTJUN2gwQnpuM3lndzlUUjJPM0NBL1VKYlZJalo3bDNvaXNiL0FNQWcyWkZVQnk1WUlGemZVYXpzZzMxSzY4SURuejVvQjlSNGVRZ3h2TzdJRXpWaURtVklyRzQ3c2dHZmlrQXo3dVlWaUJsUi9KUld5WmdHQTBLQVpXaldORlFEY1RxZVFnMmRXN0ZBTTY2YnBBdWV3NkpBdWUvdlFLYjlhd2cyWTNaQWh1SEhLcUZQcUFjZEVnVTM2U1dDUUxuMlFEUGxrS1EzRDdWU2hteWdUUGRWQ205aXpvRnpyNXVnbm1PaDNWQ20vdWdRMytWRUV6ZDd0VlVLYm5jT2hTRzlwUVROL3dCcUlRM29KbThWVkNHL2FFRXllVlFodTVRSWJpaUprb3NJYjlrZ21icHE2b21iMEV5WFpWQ1pBSUptOUVTTjBLaVpQWlVJYm9VRXlYVndFSlJNbHk0N29PY09xSEJLWkRnbmxRVWRBd0tLY0U4b0tBbllxQ2xwS0NnSm1DeUNnSjJLaW5IZ1VEZ25aRlBhVHNncUNkQW9IQk94VUZBU2RFRGduWXFJY0V6QkNvWnpzb3AzdTJQS0NnTjJ4UU9EY05EeWdvRGRzZmdvSEJ1R2poQTR1Tkdvb3BnVFZpZ1p6czZCZ1RFRkZVQnUyZlpBd3V1L3dsQTJSMlFPRGREQThxQmdidGlnWUc0YUU3b0hCdTBIVlFFa3hDS1lFN1ZRRjdwZ29DQ2Vhb0M5MUdLQndiNWEzdWlpOXdxQ2RuUUZ6RUZFRitQSkE3M2FncUt6M2FnOElqRWw1RG5SMVE3M01ZVVVBYjVnOTBRMlYyeDZJclBkc1VRU1N6RVA3ZFVWbnVtSjdvalB4Q0F1ZEIwMlJXYzYybEJuWjZ4eHdnem5RUnFPRVFYTE14UldjN0ZRQjNvNDZiS296bjcwVVgyQjZoUUJ6dCtDcUE1YWlET1JwVkJnYnR1aklBU2EzQXRzVVZudUZBZUVHeXVNQUZ0VUFKdWVpQUUzYkVuUkFIdWNCa0FlN1lvQTkyMXlCWHVZd2lBNUdoOEZSc3Jxc1pVaWtOMTBRZkIxUUNUc1cxcWlGT1QwbEFEbEZVQ3ZjOGdsQUhPZ0tCU2JobzZJVjd0QkhDb0JOMnlCQ2Jub2U2QmNycGcrQ0JDYm5vVlFoTjJvSUtCQ2Jtb1VDdWR2SkVLU2RrQ0c0aUdKN0toQ1RzaUZKT3hSVTN1YWhib2dRbS9ZcW9rU2RwVEFWenNxRUpPeEtJVWs2Q09GQk56c3FwQ1RNRkJNazdGVVRKT2dLcUVKT3FLUWxFSVNaZ29KRW5aVkV5VHNVQ0VuYnVpcGtuWTlWVUlYUUlUd2lFSlBMb0ZubFVmLzJRPT0iPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0icGFyYWxsYXhfaWxsdXN0cmF0aW9uIj4KICAgICAgICA8ZGl2IGlkPSJhdXRoIj48L2Rpdj4KCiAgICAgICAgPGltZyBhbHQ9IjQwNCAmbGRxdW87VGhpcyBpcyBub3QgdGhlIHdlYiBwYWdlIHlvdSBhcmUgbG9va2luZyBmb3ImcmRxdW87IiBjbGFzcz0ianMtcGxheGlmeSIgZGF0YS14cmFuZ2U9IjIwIiBkYXRhLXlyYW5nZT0iMTAiIGhlaWdodD0iMjQ5IiBpZD0icGFyYWxsYXhfZXJyb3JfdGV4dCIgd2lkdGg9IjI3MSIKICAgICAgICBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBUThBQUFENUNBTUFBQUFPVFVDOEFBQUFBM05DU1ZRSUNBamI0VS9nQUFBQkRsQk1WRVgvLy8vTXpNekZ4Y1VBQUFDMnRyYVRrNU1BQUFEVzF0Yk16TXk3dTd1dnI2OW1abVpVVkZST1RrNEFBQURXMXRiTXpNeVptWmxDUWtMVzF0WnJhMnRtWm1iVzF0YkZ4Y1d2cjYrRmhZWGUzdDdXMXRhMnRyYVptWm5lM3Q3VzF0YkZ4Y1dscGFYZTN0NjJ0cmF2cjYvbTV1YmUzdDdNek16RnhjVzd1N3ZtNXViZTN0N016TXp2NysvbTV1YmUzdDdXMXRidjcrL201dWJlM3Q3MzkvZng5UGJ2OHZUdjcrL201dWIvLy8vMzkvZng5UGJ2OHZUdjcrL2o2ZTNpNk96ZjVlalYzK1RVM3VIUjIrREgxTnZHMDluRjBkZTZ5ZEs2eWRHM3hzK3N2Y2VkdEw2UnFMV0VuYTEwbEtWcGlweG1pWnhiZ0pOYWZwUlFkWXhLYzR0Q2E0TTlhb00yWW5zeVlYb3dYWGpGcTBOL0FBQUFXblJTVGxNQUVSRVJJaUlpTXpNek16TXpNek5FUkVSRVZWVlZabVptWm5kM2QzZUlpSWlJbVptWnFxcXFxcXE3dTd2TXpNek0zZDNkN3U3dTd1Ny8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy85SDJCOVZBQUFBQ1hCSVdYTUFBQXNTQUFBTEVnSFMzWDc4QUFBQUhIUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkdhWEpsZDI5eWEzTWdRMU0wQnJMVG9BQUFJQUJKUkVGVWVKenRYWTFqRTdlU1R4NTN2TndYM09HV3V4Y083c2lEZDd4Y29ZUVhycFZDYVFOckIrdzRNU0h4N3Y3Ly84aHA5RGt6R3EyOXRnbTBSUzNZdTVZME16L05qRWJTN0xLMTlkbktZTEFYeTJEdytmajRBc3JPZzZjdnRkYktGdi94OHRtRG5jL05WNi95bUxEdnY2NGd3czdlSWU4b2xQL2JXNkcveHlwamJDVysrcFpEN1docW5XZ2Y5TzVsOEN5MjFoSWtUM3Riem1HQ1E0Y3UrL1BWdXd3aTk5cjlnWTlIdDI3MTZtVG5XUnhJam9VTzk1NzFHOXRCcmgyNk4xOHJsSDFKZ0R1M2J2YnA0OEVoYXB3cFIwQkVQMWlCTDAzKzlPUnJsUkxOeGY4SDVmbXRXemVXNzJIN3dMT2VHWXBtM3crMmUvQ0YyZ2ZON2NmWFNtWFhFeVFEKzdDUFd0NCt3TG9odUE1MDcrQjJMNzVNZDlpcjllTnJ0ZkpVNFB1SFd6M1U4dmFoYjRqVlEyZDkrbkwwcjB0Miswem9vQmRmcTVWdEJvZWwvbDBQdGR3NTFKbllOQUJodi8zajBueng5cm9QWHl1V0J5b3JXbjI3dkZwdUgzVHJBd25PckFMOStQZDkrQ0xkOWVCcjFjTEZzUnozVU11blNlcmdsTW1OQkVXTWNiNWZuaStLOGpXWXl3NGRCdmZSWTVMZkZiUXJWeEoyL2VmbCtNcmMwVFVFSDN1U0hNdFA4dHRvVW94V3ppZFo5TVZOWS9xZmUvQ0ZzTHltNE1NVGpYUjdUUElobGtOVGk5YmNUTUxrRXl2cTV3djdUL0ZkV2dOY1EvQnhPeEx6MmduOEx6L0ozMWFDZlpCQVJpdHVMUGJxVHdzN0ZzS1lhd2crOXRNd1JERjZlSzNvOURTMUVpbzh2dlM2OG1JQmhYMmhtMnZ3cGtrdEVlSGxKL2tkMnBJRzEzUWhFKzNKZjN6VFRlSXdqejE2QlVVcmxyc3FtcjZPSXZ4cGFiVmtvNWhrZi9Iay92MXY3OXkvLzlmdmo1U1NWRWMvN3h6cXV4S1V5L08xY25sS0NMcS9sdzgrdGc4UnowZ0ZucHV3S1pRN1Q0NXlaUUdJN25UMS9BelZEQTM3QkVVcmxtM05sZHFVdnk2dGxydXNwWGNPZndJY2J0NjhZWHE1Y2VQR3pXOStqTXFIcXovcUVHNDcxa0xyN3VYNVdybGt3UlNRWDM2U2YwWWJJamhJRC8vMG85TUlPdWw4MzZIOHU3algvbnl0WEE3b3hHZ3Z2bDk2R0xiRlNBemdZQjM4d3hISEhNcWRNcGtEYWx5MjFmSjhyVngyc2pGUWZTYjVYV2xSKzEwT0I2ek5VSXdXTEtkc01IamFpdVVhZ284OXNrVHc2cjY4MTlySDJoR2l6enZpTUI0S0EvNjhLTjhlcmhZd3ZJYmc0NldneGowbStiRDlqWnd5YkZCSWJEK2dBdnJ3cWtUb0pkSGIzbnl0V200blU0a1RvbDUra2lkYUhZYXhzRUd4alNFUGE1MXZDd04rbTY1MWJNTWVmSzFjOW9saTlBMCs4dG5XZkJTYkg4UnFTZFJIQlFsSmxIZDl3UWVPMWVNS3RNY2svMWpsNWJ2U0tENWdKcUN0YlMza0s1WnJDRDVZVE96S3Q4c1B3d0Z1NmR2Zkx6VWZVRUxXRUY3SUl0NVZQQkl6Mzc3NTlPcnhGT1BnbCtWOUp2bER0QzRKcS9weXpNVDB3MTdLbFo5RnhGTE5hd2crdG5NR2UyM0lTZnZmUDVUWjl0dTBlQzVTZHlRODJINi93L3dhTmdwMzA2U0FSbXg1dFJ5RVlReGUwdnovdHpMYnovZ1N4alM0TDlXVzFoRFhFWHhrKytxcTN5bmxYY3F4L1hoU3htT1A2NkxCOGFGVSt3QVBrdTdQMTRwbEJ3a1RTNTlKZmc4MzlkK2VsSWN4VGpESS96NFJwTnpKdURMQVhVUHc4WURSQmJYdnRTRzNGNlJEckJlbkYyTmVLUGdJVVphRXh3T01tUThUcjJXalVEUHVWTTlKbnF4QmZXZGRlS2lzNkw4SjFWK3lSWkh1eTlkcTVYWWtHdU5GbU9SdlVkN1RtT1k5SFBDRnNRSjdLL0s5dzR3QS9oTHd1RTNzeFAwZkZ3R0RiRDRVK0ZxdDRPQXlyTUhqSkUvSDBvSW00SUg0RHFWckhKWGl1NGFTZmp4bUNFUEorRUxUL0liZzJEckVSaG8ySklMWFFuZ0VEY2tkR29OTXUxcGxQSVJjQ0NFZ080eFZVcWdpOGFVaXhZM0FjVGRLa2Z5OWpzSGxBSlBVZnVSbFBPaElkbkhINjhKVmhzZGQ5SFBjNVVaOGtTQUdNTnNRSHZ0VUZFc2tUZko0SEx5Q0NIamt4dHlKUjR3MXUrcW5wVzN5cDR3dmVoaXdHVHkyR1YrMjcvdXhiejRYMk4ycERJLzRLL1lmWlpxNU84M3Jid2NZOEJFdzVZc0dhaHZDWXplUVJYaWpTWDZRaGRZTC9JY3ZQM1p4ZHhERFdGM0VZemZocThNNkFQTkZJeDR0NnUwcWhlOWZ3N3oySkRuREFWRkpaK2tTSHByYWdGbkFkK0tSYUlXdnZQNkJVbndnRk9HTE1DM3I3UXBsaHcyVC9mSk42bnFRRDVPRUJ3L24xSXV1TVBKQWNLaXMxeENqSk1nMFNaRmllTWpqdEVLaHNicWovZ0xGeElQa3pUd29YZmFTcEZ5RUI1SkQxRHE4NjV3d1JueUY0Q0NodFJFOFVGNTRIR0M4d3pBSWFDVCtjcnJJVHNLZkpmRW85bnFJZnNxQ0Q4U1hLdmF3VXJuTmFaTGdZeXZvaDE0V2o4amtNbmgwOUhvYmo0TDIzb253UmRSV2J3cVB2d2ltVDNZWXdsWlA1emd3VE9IcmowdnBoMHJ5MEY3L2dyQU5jeEhuaXp2NlRlQWg1WnJjeHgzemRVSlhQQmFtUlN0QUZ4NXAwRXNvbzBjQ2d0dksrU0ptdXBINTlpNFRGZ2pUSFlaQmlrMENkMHZFSDFxSXZ6TThGSmx3U2E5M1NXZFpVTFNWeFlrYm1sLzJNNUQ1YWVBQWpidXYxakhmcGpIdmpBWnlXWmcwaEM5ZmNyNVE2ODNnc1UxbGNGZmZrSDZ4dmVpU1hyTEFlYUUxYTlLcCs0YnI1L3Y5bXVkbkQzQnp2U0U4ZHZrWXFPdzBjTUM0RXVrZWFMTE1XTGo2RnBMSVNEeTdpK25wSWw5MGtiRUJQS1RudXRqeHhnQU5vaXJSVGNkenFmS2Z5dHpSMDI4bkR6bWVlRWI2Yzk4NFh6bWthK1BCYzAyeVNYNUwzT3NzNElHeTlrMWtMeCtva0Q1VFRLem9mbUhpQ3htaXdCZkwyMXdiRDVxSjRRby8zcUR6V29IdUhobEpWKzZYOThjR3ZLN1M1SGppQVY4Y1NueHBydG5ycitjT2tyVkVxSGtxRW83WC9aR3lnQWRIVmNrSEtrRmVWRTNINmdtUEE3U3M4YlN6dkhHMjd0NUVQSFpiWlVOditIcnlQM3U0NEFRTUhhcTRuOUlUbzdzSXRGRDN1ekllZXlvNm1xZ3BqeEllYUY4OWtaWDV3Z1FGdnZxVnh5aEd4eWV2dWZlUHpLUFpUYW4wVFBFZ3lSV2JkQ3hnbnRLWldibWdPRlovek9RVVJzMnh6RzRITFY3MUxRRTRWcytmRHNYaXlaLy9FU1hZWnI5YmgxckdnejN1Wk52ZFNlcDBxUG8rRVJCL0FycUlyMzZsUkNialFIeW9SMk9QS1QyQlhFb0o4NFIxK3FPdE03eEJmdTZFSW92VkNQa09UOTZOUi9KSTJEZXg0QkZUUXh2L21zd2dCeVIwY3BYRUUzc29BK0xFM1FVT3g3Q0lKT0JpU0JBY2tzSHFsZkVRaGtCQ3ZxUStpTzVqVWwzN0diSkE5ekdlckh4ZjMxRThKTExTWTRxNUIxR2RNMzAzSHBxUW92TWJCcU9nUFlqdWJtQXZhWTh4Z1FKYkI3eFBwZkQwRXN3cGZ4Q0M4c1BRMlFBZXBNdUM5aEd1S1h1SUxzdlVjSjArbEIwSW1VNmpzOEY0UkpuNVRrT0dURjcwbW5pUXJzUXBKaVhDSm9QSS9GWjhMaHM1K3hleXdlekhucE5NSk5tc0pDK2Y1UXJzciswLzhIUWxreEk1STNUM2NRY0J2L3NTWDJLQy9uTWNXM2FRbENjNlAxTGgxR1J0L1NEZW1kRkN6T0M2bk81ZGFUeC8rQmVCNmdHdkIwUWZVanh5QXcyTTRBaVNNUmZQUXpabEwxUWlhYWFob0dHNllzYW0rajVuYkorNDNOQWpXYnhtNUhETnNyVzR2OWZ4SDN4R3lHYVR5SVV3SXpDNlQ4VVo0ZnUveStDUVpnU2FZb3VyOU5OWWQ3MmVmbVJpY3RpbGlTZW5lemY3M2FxMDNzVVU3NUxFenFUNWRQRksrU3FyQklVbGxZM1lDK0l4VjJpUkFUWU9oM2lJVUl2RC9RZUR3ZmJXWUxDNy8xTHg0bnVpVzRFUzNjQ1NzREdabFUzZ1FVZStBQVN1b2prZWU3eUZTajVQc3orc1BLRjdQV20yRUhoWVFwWFhpOGRTZUNGTlpvcW9oRUo4Y2orTzMrNVE0bGlZV2dDek8zUW5SK0FoM2xsbTFEWTB2eXhTQ2NVSGlOSGRVMW9FTmN2ell2UWcyK1JtQjE4bC9vcnJtVlh4Mk5xNnRiamN6L2xLUHhLNjJ5Rkd6YlV0Z1NISmVTZmI2RnVlTHh5TUZmajZoSGc0Y1VwMEh5U042ckhhZ0l4anZ0QlpraS9XNS9wNExGRUdTVGNUM1VMZGJOOHJBdEdCem90YksrMEQ1M25DbThvL1hVQlhVeU5WSGVmb095bWlZR0dUOEZvWTM2ZitkclhoSEpCTml1NXgybVFaVU1HVTZqcm5JTWZ5R01UeWZ2WERGWjlYNE9jTjE0Z0hWL1lPdXYrVjBDUEJXWEhMNzlGcTFzTE95ZlRDRStPTmxRR202RVRyb3Z1L1VXYkJaZVNtOTN4bDV6ZEliSVUrcnhNUExGY24zZjltMlJNWklsaG5IcTArRnd4b1o5ZG9MOW51WVRmZC84d0RydmdkZXlGbGR6MVdmdGdwenlPL1JqeW9oQXZvL3RzTFVUdThlaWVUZWZIdE9wRUM5cWNML2Z3R3l3QVQxVXVOdzQwLy8xQ3dHSFQxdzZQMUFxZUlSd0xrdXZTRHZWaG9DYm8zSC8zUWZRcnMwRmpud2NBc3YvQ0xuRzlEdVhIcjRYTytSRTRmengrdUgxVVB5TlBkMStrLzZCQXZTL2VHV1dJOGVaR3Y4Rjg4dWIrUk5jWWdHNmJyd1dONzhPLzNXVm1TN28yYlJ1bzc5eDgraWVYaC9UdCt3WFZ6N1JYWDZueXRXMjdraTh1bG05NjhtVGUrdVQ0WTYvSzFKdUdzOUd4K001YWVUVDhwWDEvTDEvSzFmQzFmeTlmeXRYd3QxMS91N2grRUpXWmFqWlJLY1p1TFhQRTlMNzU1SkhjdG5LelJSVjg2Wk1ySWtab0ZLcUhhd2Y3ZE1obzc0dkVJMnRkQXR6QUxQZmIvR085c1dTdDJRcmtnUDVmMjFmSXVSSFpkODRNL0Z1QjRVTXBncEwwSzI4RFpqY0s1SS82cWhidWNTSkk3MjJMSis0NlZrZjRzbDJndi83dE1meUhObHN0RDRBSWdIYzZyZEhVZ1E1WDN6WDlQbkhJQ1RFM0VSTHZBMTJNQmpudUJGQjZVa3VKMmZjbzBBK2VFVGZJNHJrQ0hDYkZPQ2orcnlpamV5K0Q0dzB0Y0Z6ZkFuUWpqTE9pOXJBMXMxR1haU2s5b3hOL0pienEvNlc4a3ZhSTJMb2xseW1IMkQzZnR5aU1rZVlMb1p2aXdTcFJFbHlQN2w0N0VYc1FPR2krRVZFYUc4SmJqejY5Mk9SNzdHWS9jaFJXc3YrU3hzaXBGYjdoaWtrd2FyK1dqQXFYRXFWeXJmWTRITVpmclVOR29ZaDF5TUFYOGhMUDhTNDVIbHR2MUsxSDBqSlhDRDVSOW5kM2hlQkRZYUtPYzh5ekJGWjFsRnhoa1BXWDZSUXdnNDVrMlh5WWxPMVlrZlhLV2toZ1pIbGkySlZJNGtmVDljdnp6V3l6SHY2Q0FDL3J0SWltQmdkUEs0TE9FaDhoTnJvY0lEVVcvZHFnMGo1UlZBa0ZKUXN1Q1VsMVBGcEFOdXhnRHN6N2p1RXQ0Y014aUR3SXBGWlUxdDNic09SWU5uc3duSlVnRzRST3RCNHYya2xEeEY3K1BJRlhXRHpxaVJTZUVuUXYra1EwQVlpeTIvVkk5YjQ0SE53cnhJdDM5amJuZDhueTdzSy9QYmVxVWNsbVRXTFZ1aFJUd3dKMmpZUlY2U1NRa05vZzEvRnBza0s5d0VXT2Z4bUZSbm9oRW9zSWx3eWNrWlowclVFSE01WlVveHZwZWpzZVhzTEFxTnRHa0hURWxvbE5ZdTRqMVVuM1VpdGluK2JqSDhQak5ydFVFL2pBWHNkOTdYRC9rTWN0TVdFZU9DU2VValFJWXhBUGtQNlRMQXY5WWxFelk1TkNFRUwzQUswYjNYb2FIUUZnTGQ5TTE3L1NUN3Z0U3VvSUtaSklyaVgyaGxzb0E2Yk1XUk9KazlXVmlqTFRFUzV3bGxsQjF2bGdwb1lrSUJ0RksrTnRheUdRaVlhS0d2N3M5czNzSUR6dzJSSm01QUw5bHlPNWgvY2duSWNvV01aR3lHUkxPdWdYbkZscTAxV1JGdVIrazdLMFpydDNEOFhwWng1ajNVR3JXdG0wOXlXdkppaXJKSm9PWnlkdmhvZzBQVFRQWnJJdjJKcE94U0JmbUlIM1ROUGJ2dW1uUEhSN3RCSGVwRzNTRHg3bVRwbTBFQ0phS2M0ZUdJaHNLUitlOHFlRXJ0d2x5UmJHS0pEdmkzSHRrUFNmcGtLRnNnR2d0SGpYOE5kUHFkRzd3bVpDS3BzcWtvSm1BUjczcVlWTmxPazQvYUdER2dYQjZCVU9BMVUwU3NxeTFxVEpSd1h0aHZVK3NrN2pSbVlVRFZBTUFhV1pXZk1zVzhqa053d1BiMktRQm1WYnpPVU9qQmxoeno1TlNBTW5OKzV4NzZSK1F5T3ZhTW12YWQ2TnFhbENwcW1GYnorQkhvekpVUHlhVHlVZ1UyTnlvekk5Ri81VHJKckh1a1VFZVY1OGx1NHdteXJSUy9wb0U0N3REck1LQXpyZXBwdjliR3p6TUhhUDB3RmdUOEtnbkNiK3lQaFpNVU9BYkR5RGFQWmt3UEpDZk1wb3pJZjVnSXd1TWd6OTBQS3B2djc0ZFZRcVVIaFJYdlIyK2dYdkpuMzdpelRLS2g3Wit5c3RuckhjaVUxdGpzOHpBVVg2bGhxOWtSVEdNTlVrZzYxL04vMmZXU01ERkJEN0hIMXJyZjl2UTY4ZzZZM3Z4MDNUdWZtdEMzekJUWGI0L016M04zdnZleHhlMnlzWFlOS2w4WDYybk8vT08zWTZGYy9OTmMxWjVQcUZsM2M2blIxanNmZ3M5Z0dNcnE4YSsyNDRtYmUxRmhQOHRHRERqdEdPNG5yVjJzQ3hzVnQ3YTJwanRvckl6TlhUeTA3eUdPUnVFQ1AyZjIxNHN0czNZRWdNOXRMWEFHS3JXLys0Wk9mZDBiZHpoZkR4MDUxdENQQUJONTYrU0FQMEN2b050dEg0UlhMOU9uVnJGalZVTVlTZEVQZi9aWEo1K2JKeURmUTFRMkNGc2d3bS9PWWVaQ2ZDWXRoYW8ybUFYdURpOWJCTWlyNkdEMExQNTgxcTltVjM2emx6OTAxbkF3MXc0OVlDNlY5RHlaNjk2NXM0VWpTT1RxSFB0YUxVRHZkQWFmUVlZSW5nVEhBaUEvNWhXMVFpR3hQa1JONTVnVmZWa1dJMThaVWZjbXBvcHhsZytqRVpWRlZ5QzlqMDFaNlBocVF0ZzFNVEFPYW1HSTFCSGUyMDZmb3VZQTJtUDNKV0JkV3A2bXpTK3BkR09pYm0rTVBna2EwQjJRZHgvWmk5S0JUaEtyeGlodFVIMGRGVkhHL1poaHd0SWJLMGphMEJOYWg2Z05MS2N3cWZSK3JTcU5BMGdvdEcxaTY1QURYVUVHUEJ4eWhHS0YxNGoydDZmQk5SUDI5U2kxK1pUZ0dPTDIwcEVFSGZuNTVjd3FqNzhzcDh3dmJRdU9IcHY5T044OG9hT2k0dkhsTG93bjlPVG55Zy9NR3RxSkg5UUhtK0Evam9acWg4SUhYaFFDUTlENWVjeHhFa1hIQVFWL1NyREJkMk5jRWd2Z09lZVY2ZEF3T05SVzU4R1dtMmIrM0ZUSDYwdi9EaXRVT3N3Y21NYjc3ZXp5VSt4VzZXOXhWbGNWRkJESFRVd3FxVWZwTVl1NGxURXdhdW10dmJTWE5iV2Y0eGQvV0FsbWd5UEh5VHNOM1R5SGNSZWttSFJUenUvTkdrS05WSUVYUTMrSTB5Q3gzTTc3VFROYVdwdW13TE5xZk9HOWVYYmhIYmpwZUw2RWZ4SmRLWU9FRGNRa1NTNk5iRjlKM2RhTUF5ZHdNVUZ3U0g5Z3pYY2dJSWhZeW5zbkJmaU1xL2VTcjgrdmJRUkEweUNIcnhKWGZ2WlpueG1KNDcyTW5vNEhWWWhBWThRYk1DS1FPTjR6QTBNV2loNGp4dVJnOG1tYWVjaEhNbEdsaFd5VU1Cd0xQZHE0T0FFN0IwZHpDUG9oNDRCcTZrZGpkanJPSm1xaHhPRFYzc1NxUVhMOHl2bTVEOGEyR0hSQVo4dzMwV0N5VVNiT3JZOG14eW44Y3lsQ0IvRTJjSmZCeVRuY3FubWRCTWp4RVRlbnlZLzE3UjJmWFBheGhqVUwzMnNBSFp0L0twTlB0RjVJT3RIbkFWRy9haTlQNjA5V2MrOVZSdlBRKzFzdHFudDN0VFkxS3hVcjBRcDVYc20ya0hPbzFBbGhJeTFsOVlIM1ZvaDhhUDZoc1ZFMjE0Tmh5WUlhSnQ1SEFUVHRIWXVZbDZaM3liQkVkcmZXelJ6bTNzbnhxOU9UYVdwb2ZBT3BEUVVwcVBocThEWXBlbjRwRHEycFB6VTYzazR1bXJyRCsrcWtTSHhTMUwyYUpmSU56SkFtSGJ3Vjg2S3FJN1BJZks3UEhWM2JGVFpuQitmZnJUemhiMWh0SGQyYkpYWVJmTGcxU3g2eDNaMzBUUlY0WmUycmwvN25rOXQvRGw3QzA2bnJhR0R5eGo2V2lmejZzcGVWSDZRSUY1ckcwY1M0dnFaNDhFcTNzU3ZaMEpJVkJwWmVtSCtvdHBCNGc5ZHlBbWFPQjg1Y3ovTldydkdxTTdkNnNxR1gvRDcwQnFRMjBtN2ZPWFpHYlcyOXN4T29hM2JlaHdySHpXNytMdXBaaTdJcnd4OFZ6NWNueDliZnNZMkNCOEdSbDVCRUFOOHpCeTAxY3pOWjhEWTFHMXFPang2SExGdjVYaHd6ZUNRVEp3a00rWHhnSVZrTTVxNXUzYkx5REpuN1FiRTk0dE02R1prV1lSdEU3ZVlNMEg3aVFySzdOY2p3NWxkaUZpeGY1bk9UYTM1OUxVblBUeHpQWHVyUGdKL1BQTTgxQzN3QUUydHJDZG5qbzlKYmhOSXJtekFPUjZTUWlqMW0wc0RVdEtLSHo0elBBcDhKaWhJUDh6MXl1VDV6MXFwenFWbHpqL1YxcXdHOG84cTlxMEt1eDJwbGlhTjNaOGlIdVVtY3NINGVZSEZLbDBkRUxFTHM2STRMbW9UVHdOWkRycnc2TklybmFURy9XWkNhTVF0WlZtVEZwOTA0N1hjYzViWlVmQWZuOGQ0dndDUUJUd0lCaDFEUTZ4RFJVWkY2MDRWTWkwVisxNU9qaTdtd3QyZUU0Rm9MenI3RzBtVjlwU1EwV3IwUHlZU3g2dkxxUEY0Nm5RbjQ0TDRDQzdYaHZJSkN2NkRtOVh2Sm1FcXQ1Y3YxclFGYWJEeXJ1WS8rVUIzMkl2UTFXOC9KaXZOTDd4RFptYWE2aUluUEhTeE8xUFFKWlpUQXRlaVRlazRIcEl1NWZmRUxnUnlVdnl4QVNiY3VkUFNURVFOU0c1RmszN2phSVJoWUo0TTgxSWN3d1ZYU3JRWDdCd0NPZmExczB0M3QycmRXaGNKeTFvSGZTWDB4RDQxbGIxb29sSlhVbmNaN3FRczBJOTh4WitiWE9JNURxRjZOUTJiWXNpYmtEYlV2VVphbXZkSGUxYVJOMmFMdEZlRjFMbFlnNG5xcnVYNWRuM3ZEM3Q5UlBTTmVQOEk0U2ViNWlVOEV2L1Vpa3Z5U090UHZPWE1EWG1kOVdlSG1OamZTRXpLekJPdUMzZ0lyZGhRTEl5QjhGNTRjU0N4QWlHMWNBU3dVcE9oU2ZUOFhjR0VOV25yNnlNRnk3Z0k1QXJ6TFdJbzlnSmYzTGxHcTN4eWdiSnBoazRUeGhmMnlNTm5YUGhOUlhNZDlncmRwRlBEanRubHFhdGs4OURhNXVLOXB6bStDUGtPN2N4M2FUcS84bDBxdHhGbS9oL2FMY1c2R1dxN2hRYmJZRmZUbjVYYnF6Ujl4aTFIREYyR0VBV3hoQWRIbWhhN04yamtkM3VUTFJ3OXdaYXY5cnVJY0h0KzVQU2pkcnVuelVXUXB2STNBTWdQOXFiYkdBeWJ2dnJVbldGYVJNNTlsellENU9xVmw4UEpXOE5tTGZSajVEMmFOMzVuZW43a2NrOHNYbzZWS2d3OGMwbE1OSHlaejdlaXNRVFhmejZITVorcDJWVmIxL09aTnA5Tk16K0hYSTNXN1JXMzlSUklRbzZDRmJYMm0rdktiYTdiSGRWMFFGUDdWakM0cjYwUXRnL1l2VGRkK2ozeUppUnhLTHYxRHB2NWRpdisvRmhCSG9rZkc2aDAraEhVdzI2MHcxYjlNVk9PSmVMbGtqL0ZiZ0ViMmxIcmpvZ24vbk5zUG8rVVBiSnJKcU5oUEd3Qi96RWNqZExoQ3pTSFU0QlJOWHgvYVV3R3JvMjRObkVrSFU5Q3VzZlVuNGJDMGZla2dpU09lSDZqbEsvcmo3aTF1bXJiaTJvVURubDB5QzBBZzZaSjA5S3NLTmhPSWY1UVdZTXc2WnkxN1puNUJwWnVQdFdaKzRobmk2YytMblc1R3k2VktLcHNPTnlIVEJtNFZUYzRZVE5NU2Y0WVg0ZFVrZE53VEtjOEhnNlhab0x4Q1NsdDRWQ3NhVU91SFMyTDVvWGNYaGlXQkVOdGp3S05RcnkyVm51a2ptcW5KbzZmMXluandndWpnM0FLZzRieUpmUXY0Mm5BbzNWSC94RTF3QWU2YkZFU0IwdjBDRWVjOFFpVkp1ZHdJRFNQZGpPa2N2M0EwN2o3Um1iK1YvYTQzbWE2TldOdHpVVTdJZHBMWi81ajVmWEM0WkVTQ0RFZTdtWTF2WFRXNzQ3dm00YlZhai9HL0lDQWg4Vk8yMVFScmFPZXhMUGVodURCaEZpaVpQcXhjSkkrQTgvMXdjNjNaOHBaajNMQ05OWS9UdjExVFVVUEY4R1k0Qm9PMGV6OFJJN3ovVkJiZTNHdWNocDdjSGpZczJGNmFEeXAzYmx3U0ZhSy9vTkZJbmhCdFF3ZUZBREo1WXhoYWpQc25CdGhYcmROR3hJY1c1ZHhNWFQxZy9FYlhHcU1oNWZZYXNMWVRqZnpzOWFtTThTc1JZZWFUUVVBSmJ5S1NSemVCV08vNFhEUkxvTk9wZnN4S2FWdmRDZjZEeVV2aFZ3NUFrOXFCUG5Ga0o1Wkp4TGtQNXU4d2FMYlhLY0pkb1plV1lLbk5ENzVhdncyNkhoVWVmOXBVODNPSnNjS2p6RlBNY1ArMURhdWZVNUkwQnVkWWtsU2RQZ3QrQlYvdnh5UDhkYXgxWm5WWXJDVnhuN2FNcmJoVWFJYitET1JZbktHWWJLWndZRjlUT3ZRUG5samJNYitUV29LMTNDb1Rabnd1YjRqckIvT0JOMnpENURqcVNIMjg4a29YYm9nUmZveUh0SmtIYStzbXJmdjFJa05KSjI1NkZjbU1QdHdZZ0tCcXZvNStIdnovUXcvRzJSSDNzUWtBQ1JrUzF3MTdlVkpOUnFGcEEySXcwNnFhdXBuNDU5TUlIN3gzblF5Z2lRT3o0ZHBjekdzeHZNd2owRGM4YTZxM3MzOUpEUzNmWXpuRFhyb1FwU2pzRXJyaUQvNDBJUnlCSFB0M05LTzV1SzAyNGFLd01kYm40RUFsL09VVkRscFE2NzdGVFE3YTVxd1hHa2cxanoxMlEyd0FQQnpSdVBTQUpKb1V4K2ROODZ2K3NHeGY4WXd6MDFkdkEvNTJ5NCtWVWxCY2dDQ2gwMUZubTh4Rk5UOC9BelRnTXVIeU9CTWhTNm5YaGhnZmxTN3JCQ1lNZCtrM2lBUHo5Ni9zcHdlejEzT0NQeGREMDAzMHdCSTY0VzM0WDBRM1haek5QY3dlM3V4VFBpWUhpcTgrdUFCZ2R1anlGd09SR0dUTXNPRHpDNUszQU1Hd3paTFVzaXdSNUdCT2psemtnRWVyWmZzWW5JVVc3dU1aZU1BNHMzak00OEkySkh0MlNlUGhPeTBkMmRPb1NheEMvVWFVa0l1VTNLNEhuOEFkYmdZZS82T3BtYU44M0ZpMTArVlNzTWI0d2cwM3BuV0NQYUM5N0VvTm5rbm12V28wemxOUGlBcU9kbmlYRzV2aGV3MFRDOWp4SzFUNGgwZWR2b3dTaWUyY3RQZy9zRCtWZlNucExiWUZIMVEvNXN0Q3NKM2tteXBSZDYwajA0RXJFanRKbnZJVlJvQ09mS1NSZXVZWDNSV1g1NXd1TnpDYU9Pdm1nUWo0UWZ1NS9WRjQ1WjU0WGZTb1NmMDNxY2NwbDdRUURHbDVjT0g3MmR3U2ZIWXVwdnIxTlRRcnhFUDRzZ1NyYmRtYmgyZU5YVXp6dHNHbVY3Qm5ENmVRNUFzd1o4TVdkSXdZc3JjZ29yMklpRzZBVVZ4KzBFZlR3dVdBRThyK2tuNklqVEMvSHZZUjM0RHpabExGa1NzcXlpeS95Q0NyQXQ1K0Q1MHdzNm9yOFFBK2d6RGl5TWtDUGZaSS9zZ1dPMm4xNHdWZmlHd25CUlk4TmxMNCtFdTF6a3BxRndzTnN0bENGek5JRzN5UW80ckF5SDdHQjBzRzRsMDZZcjVMQ2J4UXRlL0FBOUZ0VUlMUGdVelcvcmtsOGozY0MwT0d3NlNMbVlqSUJ3NHluUjE3RHBRMFpwWHRSUTc4TUJLbTgxTGd1c1FHQ244SkRzaFdsdXZrRnhSRFlkSFVxV2NENGxyU3l6SFEvU0ZuSGpHZmE0SnJ2TElMay9rU1JQZGRMYTBuaStjUUNnLzVEOXpSYU1XbFkxTUtSNWJXc0V5K3BHTS9XdG9sMTVDRmNwUlpROG5pSWRyMDhxNFFBVXhwOXl6Zy9FSUtsYnJxOTlDL0NISXJmT21Rb2RDTGZYbW9vN0xzdzc5ZXZ1aFNkVmNyUWE5d21LaGZybEhiazBKUzVZVjlNdVdRdnhCKzhqWUozeGxQNlJMdUdaQktUZS9jQjAyWEZXWXZOaHJaekt3TmYwYjFnSW5FWVNWRDRJRlBLUmhadTNwY0dWM2tkdlg2U2xKSGF0SmZmT0hTZUd0R1JVeTJVVkJjM2pZTU54RVVqQWNrSjBSU2UzOWhmTXQ3YUNJa3NCaWNITllVRFNiTWx4aXRTNFNIYjlaMk1VMVlscDBZOVdnYXFJRGMwVThaR2RCdVZ0cVRwejRSL1FEeGFJOHlLeW84U01XUGgyZUhwSFMvRkp3UDFxNWZhL21nM3NxMHE0bUp0TjU2eDhUZEVrUE5rTWhPZ1o0WXhBMC9YbHFkMyt1cG5ZM0ZEWjJYRUxFYTE4TjVoZS9Qd2I3MExWN2hCU2kvSG95K2RpMmwrRzVJdGZTbll2NythUnlDUkJ1eWg1L3NKdE1GM2F2Q3RZQUgwL2dUQU1PSktSUkp2Y1c2a2RvRklDM0hiczlUZTFlY1dRNEQrbUVFL2Rhb2JhNU9vb2pGUXpiN3ZUWkkzdDRCNFUrbXZzOXROcnVwY0plWWcxNCtFeTg4NloxSnl0MjFlTTNUUzlzTHNrdjg1QW4wVFFSajladkV5cllUNnI5dml6Z09mUGYyYlFmaEtNMnMrRDVseHdXcFZ1L0FleGVTWEhzeVRWMmorOTFHMW1aeGtnOG5LeE82L2llcnFuMkc4Tk9MdGlMOVFlOVozWjc5TncrSXVqa2VlTnpPU3hKdTRpYnRxbWN2M0Y2L25aMjZaL2YwNy9VZm1mYktOQXY3aWxGOTl3YW51YlNLRE1aQzNnd3Y0UmFRTXJDY0RTSjV3aHdVSGh4VXMzaE9OKytibUpVVlI5Y2tvUFhEei9md29uQUVESWlYUHJDdksxdG9zSUhlK2tUQWV5bTlJZGRGWUVZQUFBSEFrbEVRVlJYdG0wYm5rU0ZYZm41dURxNTlIa1BjNXZpTUJyNkl3WHY3VUVyM2xwZ2JkckVxSW9zQXVobm8ycU8zOUdSaVJrbVBpa2VvMkF3SCtnWHFBa1BHeFRxYzRnZXdzdTBJRlNNQVcxNHVOMmZSQWZIRnc1YVhhS0NkZ2VPUm1rYXY5cVA4YW4yRklMaDZTYTg5Y0MvVDBJUjJGTm1ZeHZ4Z0FjWTdXczNpRnZPbkt1c0gxMW5sYjZSUzBJSWVMalg0UVJzM0kvTkJmSWZEY1hETWQ3NEJBNTBhdHRPamM2ZitUZWNoSk00N1U5N3phZC85QitOT3dyWXdHMEhkWExycGRZZGJlcWExRk5SbzdLenlpNy9rUU1ZZ2hlYm85QWtQT0t6NjI0RUw1MnBqMFAxK01hUDFqOWQ3Z0VnOEVDMTJwNzBwNlA4Rm10Z1JNNy9BQjJGcDlzZG9aamdHVGZ4K1JHdnZSbllDcENrd2RlZGVMQzJxVXhiOTZxZUJtbHorQTFrcSszUDAwUXBaRHcwNlNTK1FWeEM0cDM3dE9rUzZjQzJRZlpTSjBHMWUwdUl3Y0VmOVFlempQWmk4ZGJPQVdtVkZrSWxuY2MrdFJ5ZjZnUUpmcHdGRW1DYWVuNFd6NHNkSHpwTUpWRG1LRU1ocGJsNEFNTGhmb1A5aDI5N0ZaL0V0c1BiSUl0RXdJYWhpSy8xc24vZzRYWExxMzFEUUtxbmxjT1B6Q1FLSzRYQ1UwYVhmcVJXcVo4THcvTDRPREZGRWw1QUpwZWhnRHF4L2czVTI1MjhCL0ZpSW9zUFQwRGZ4ekhHU1BpaDFCcXZBVEZsS3J4UHd2S0gvYWt6NEpBcVV0Zml1eDRqSEdUUVJUdzRscWlYSnI1SWdWazNGRGhjcnJoZUJuRW9BRkVxK0RuQ0JMb1UzaFhpSzJpTk5RZytMLzJwTVRybjF0UmU2Z1NvVG9TVFlHRjhNemxMLy81TEFDRGZnSjdYSnZxdGhwVi94WStOQmx0ZngyVW9uSmk1ZjFTOWpwYnQzOXFoSVNoNVA2eE9ya3k4b3B5aW5ReXI5eUZSd2ZsRGlOSzhTMDBVVXY0bE9BWUZyK002TlN5MGJIN3gvdlM5Y1VQVHlyNGxvN0ZIVnVIbzJ3Z3ptNTJmWmlJUlJHUjdLZWZTbjdtNDBEcUsyVEhFcHpWa3o4WUp0NEYxQnhvUmQrZ0M2YlhqSnFZbTJNVFZlRm1QbFk3VnpQcW52am9OYjgwNGZ3c1VHc2p3UHZadjJkQW1YbzhCL0NSdytpYVNzZnJqNDFGNFM0Wjd5OXY1T0tnTU92cUxQZ1FaVVVrL2tHV1I4MkQzanFUV0JlMFZyQnRncmprUHZidWtoNURNcHYxYjlsd01OM1huRGJWWGdHbkk5WURMb1Z1U25LdWZQanFlengxWWxYdmxvVUZtbUU0cmpxL0NraVQ2QmY4eVB5dnMyeXUvRUpqREMzUGdMWUJOZXRPVGUwMEhkaUgwQ0VXS3gyaU1FckYwRFk3UHJtSUdTbVgzUFFubzd5QWpxS25qYXlhcUlDaW94QVVzTFM1Q2lnUms3N2Z0aHpIME8zTEozZWN1S1dTbTNZdG40VjBma0JsbEJuc0duK2JMRE1ibzUrbGxFL01nZE1URHZyOVloNVd6WFRpN2xQZndkaUh0V0NYYVFVUmNLbjlNcjdMMXYxVEovUm5wUU5ybWlOVTBpMC96VGpwSWFuNG4wRm13UDVidkpKUG9kaG14dVhxV3VGN3Mram43TFU4UjI4VFIyWUw0UTdZYmdVaHlNY2xMYVNKRUJDYTRwNUxrSkVSZ2NLS3I5eTJjdG9oS0x6Sk8yUytOTU1kajNVR1RHVmh6MEZpMW8yb0VLWWIyTFVzTWRHSnFPYUU0VTJCK1NCSDBvOXNCRjh6a09wOTJnd2V0N0h4NkVvUXE5ODEvVDV4eUF1NTdJZjdJdWVuaDZNcGxEVWZuZjRYUHlrMDE3VmhzdmQ3TEF4Yk5Md3o2SE51QzNtUURySVhia2ZGK3gwZERtRURuMCtPY0h1NDU4YWZUbll3TElwQVd6eXMvdTd6aHQwOGhMeVpGdkk5dkllcUhaQ21NamFBdE9xdVRsVGlaa0lOWDNCRFpReEhqRExpOFd2WXp1eUU1UHE3L09SNWZoSXNJdjNKd051RWlNb1hFWlZFOGh0R1hSZ2dOdGNvZ2xFVEhWWmlDWjBxVDZpWVNDYnBscEJSWVRvWWxhSGN4UHMxUGFnVHF1TW9YTnl0bjZwWHBHdTRrL0Y2SVA2UWVjV015YUtLN2lUOFNtNURHSkJjSm81QTZrUlVpVmlCYXF2aGxnVkwyazRoSEhMb3ZmRElvU3NWdlNKakk3Y3Y2a1ErZ1FFcm85SE9zWmFRcmRLTUlIVWRHUG05QUhQN2EvM1hPM2xaVThLZWZTMTBGMGpxL3F6R2U4VlBIYW91Y0JMNU82bHJ3SDB4MWRXaVVnNUZxZG9Lem1VQko4MTgrVGVCYzhoOVVmM3N0RVhPaklQVVFTT1Z4RlAyVkJLdXNEQVNPZ28xUXl3cTNPdU14MytBTDIvN0FYemE5L1ZGOFA4enYxRndXdkIrWE1aV3pUVzBuMU1TVitZRGtOLzJOQkRxRm4yc0F1ZDl0Y1d5b2FJZ3FLWHJwZlVxL3Mwa1dGY0ZlZUNjYVM1c2pKSnFwYkNVNkRtcVhGK0lDc2k0RWNoc01BRGtlaDc4cjc1blQ1WGk4RERVazNTcGE2K2VOb1FUY2MyWlVSQ2ZxQ1ZFbzkrY2x4Mk5ma2QrVElrcktLc3VBVFNwSktxeTN4ZENBQzBhMXRUekF5emtKaWtHdUwvc2NqMTNjeVcvU0lpS3Mwakp0bCtQeGh4OG9rVUwvekg1K0t6NzNjSnZqc1hVUGs4R0tJSTZReEFiWjRoRFlWVkZpeWp4cVJnWE4xK1g0Z285ZGgxRnI0V2ZQc3J0OUw0TmphK3V4S0NSaHRVamhWNzVyK0ZpQVkydHI3MWVtNUVteEVMQVpHVzdIakNCYzdZbHdiRzM5OGVCVDd1akxHdWZIWGtLUWQ1MVkwZlNHUXRDRSs1aytvSnFVeXNGT0FRNXdJdnNIdmhGQ3BJdEpURExqUUJBeE9JL1NhSEpnQ3RxRGZsOXZwanQ0SnJtT3JhMy9CNzJMOTlDQ3JGSDNBQUFBQUVsRlRrU3VRbUNDIj4KCiAgICAgICAgPGltZyBhbHQ9IiIgY2xhc3M9ImpzLXBsYXhpZnkiIGRhdGEteHJhbmdlPSIxMCIgZGF0YS15cmFuZ2U9IjEwIiBoZWlnaHQ9IjIzMCIgaWQ9InBhcmFsbGF4X29jdG9jYXQiIHdpZHRoPSIxODgiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUx3QUFBRG1DQU1BQUFCWWdoOElBQUFBQTNOQ1NWUUlDQWpiNFUvZ0FBQUJnRkJNVkVYLy8vOVNPQ3hTT2pIL3dwOEFBQUQrd0o0SUNBaFdQakwvN3RETVFqai8vLy82NjgzNHZadVptWm1WY2wrYmRtTjdLQ0l4SVJyMzkvZFVRanBSUzBuRlFqaEtNaWhwdGFWUVJVRXpKeUF5SXg0NktTRjhMU2RBS3lKU09DeFVRanFjaW5jUUVCQlNPakZTT2pIenA0dFNPQ3oveHFaU09qRmtURUJVUWpwU09qRzdxSlAvK1BRcEhocFNPakZTT2pIODcrano0Y1JxVVVSRE1TbFRTVVJRUlVGVVFqci8xci8vMGJBYUVnOVVRanFIWkZMLzU5bk9URU5UU1VSU09DeU5mR29qR2hkZFYwd3BLU25HbDN5V2xKS1VoM2Q0WWxNNU9Ua1FFQkRlejdmTHZLV2RqNGh6VzB4SVFqLzA1K2JicDRuV1psWlRTVVJUU1VSU09qRlNPakhvMTd5TWduNStiRndaTFNsV1BqTDM1OHYvNHNMNXc2WFd4S3lKY21GM1ZrWWhGeEl6TXpQODZNeW5uSWkxakhSWG1Zd2hJU0VZR0JoU09Dd0lDQWo1MHJ2ZWhuK1NibHFSTUNsV1BqSUlDQWdBQUFDTFpXSkFhMkkyWFZSUlMwa1FFQkJVUWpwTE9DL3h0NWJscXFXdmhuQk5oM3NwUkQ0SUNBaFdQakttTk5vekFBQUFnSFJTVGxNQS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1JCSC8vLzhpLy8vLy8vL3Vadi8vZDRqLzNmK3EvMVdaLy8vL1pydi8vLy8vSWpOMy8vLy9NLy8vL3pQTS8vOFJNLy8vLy84UmlQLy8vLzhSLy8vL0VVVE03di8vLy8rNy8vLy8vLy8vL3lMLy8vLy9SR2E3M2YvLy8vK3E3dTcvLy84aWQ1bXEvLy8vLy8rcTdrRkNOa3dBQUFBSmNFaFpjd0FBQ3hJQUFBc1NBZExkZnZ3QUFBQWNkRVZZZEZOdlpuUjNZWEpsQUVGa2IySmxJRVpwY21WM2IzSnJjeUJEVXpRR3N0T2dBQUFnQUVsRVFWUjRuTVZkaDBQVXlCbzMyVTJDN2dMQzB2dkNvemNCUVJFYkZsVFVzL2ZlRmZYT2UvcTg0b24vK3B2Mmxaa2ttNngzbkNOdVN6TDV6VGUvcjh6TWwyVFhyc1RTTnJueTIvejgrUEJnWlgveUR2OWU2VHA2clhLb25nTUdQVjBpK1RJK2VYV25nR1dVcnNtcEd4ckd0MnU1RHhyeGZJUGVsMysrZDJ5d2JRY3hKcGEyeW04REhpdDVoVjlCNkpHdlAvcStQMTQ1c2FOZ3JkSldtY0tlVi9MenZCczV4WGZkczR0b2dVRHZmUnY1bC9oZitjM1h2Yzc2My9OV2NoM2I1YkZqdE9oTkIzampSM2NZOTY1ZGh6VE43YUowTDVmbzU3Q3hyUEh3NFZoK3pma2U1SUxudm9OWi8rQkgzbVNlR3Fib0NIVjhSRTJSLzY5WGRnajU4b2lsb1Q3RExZWG9YODlUeVhYZWJNWjdVSjBka1g3WDhDakt5UGZRVGtBelZFdnk4R1lBbSt6cm82RVpSS0pqZFhtTmJPUnpvd3l0ejg3bWE4bHJFSGw0ZytxSkdndTFpQytSYWRlYmZ3eisxY0ZqRnNVUmJveTZ2MmRYMXVhenVwU1JqRWhod2ZDTGplUC9xMTFOMS81cmxjcmN5c3J3c1BpclhEdlVsZFRyUjFldUUrcUlSRVp2K3F6cSswQU84Tmhsa1cxcmZPZ0ZLQ054T0czN0QxVUdWNmJ1amxyNkFvd2J1RHMrUEN5YWRIVC8vN3IyTDFlR3gydHBsbmlOZkx1YTJ1SlM1NDk0eCtHSmdVTklJZkYvWU81YVY5ZitydjlWS3BYSmxlSDVlWTkzbXBhWWo4ZXlob0FzWEJFREp5UEVqaFVxOWN1MmN5ZTRjRDJmTk1DY3pvL1lSZ01qQWw3eVF5TW1SZFlraGc5Kzg0MVk5QWtpNHFrUG5OZTFER2Z6QmlwVFZVZStMU1BlRWo4bXVpU2MvQVBnc3drUitiVFZ3R2ZIUnNTdDhaemd0VHg1OGYwRWtGWUE0a01mZU1nQWppcExoZFJoWEdsanhNcWhzVlNsajVKeXordlp0YnFpZHJodkgrZmk5VzBoY1owQW1nS2tiRGQxdzFZb0ZoZERrMkk4OWxKdGN4SnVFS3Z2MFU1NENoOTBoZmFsbXJzeXdZUFBxRk1xaG1ldWdRTklZQWQ5MTlMRUZRZmE3aGdxTDQrNWVXUEFjVExiQ21UTzZydW5CcnZJZE15U09qZGMwbHNUSzJON00vbjVhQno4d1V6d3Z4am9sdEx3dnVVQThJdyttVURlSU9ncWlFODg2Z1ZxVEJTRHpGdkRPbW9rRS93VU94VDV3ZXFKdUEwbVlZR1p0KzJGaFlQMmp6eFh4M2xYeFE2RW83TnQ1VWltQUJ5end0VFNKY0kvN09QbU04R3Y2RFBxSVFCUjFSbFNnaEh5bmY5T2cwbXFyTGVpeU5wT1crTEthelhURzgwRVArZDlCeHYvcGM3SUJEOXA2NXJqQ0puVmlmY0kyODFxVklvQXFBTkFhMkpuVVI4cFVNdjBVcFAvZ0lUaWRBVkUzeGVTbWJjbzAwdFZvRVpYQms3MDdYUERZZ1RJeEJ3ZnhpbDRWRWVFUitCWGxFbGlIQ1ZLNXRSTFJWY1ZBUUlLOWhnelZBTXRFMmsxeStCS0hramJjckFveW5vc2NwcW1Ec2djZkZZU3RGM2h3TkExNWhrNUVOdi9wRWlROUNTdUVqeTJjV1B5elBpZ0F0WDczajhSeCtJM05pTGpmVmpYVURCekFxSHlmU01GUUtIdHZ3bGNDQVZZRm1wRkZBL2h1QXpzM2pFL1pnWTNrMTdteklFdG5pUnI2TE9UK2d3eXR6czhtc2lhT1REVlpZSWYvSHNHZ2NCMTlNN096dmJNenZiMkxuRlFmMGVqTWtleHc0WWhrVk9ISlpVNEdpWk5lV0QzYWxnc0Z1Vi9YY0xxNnV4c1Arc0p2VitkVVY1bVdEbHV3ZFhIbWJsT1YzSStCYmtlMEVTZXQzODFEQlZ5ODZZL3FQZlYyU1VHQ1d2a05kZVllL2t0Qy93M3U3VStWcFUzSE8rdm9yak5hMGcveU5hczl6bzlsanNBbXNyQWZwVVlFVmNmUDNXRWhudDByQlpENG91V1BtT1A3b0p3MXFuYU1nRHA5aUlyb0ovMFlxajUycFNYRVRyMGhpUnMwd2dqZjZZRFlyT0dYMi9va0RYWCt1WnZEZVdla0pCcmMwZkE3eUFCNU9YT0w3V3hML3VzTXMvdVNTOXordkVKeDZzbHIxK2dQN0FOZ2o5aGk2bFpLMlVFNHZiTmVRd0szcDZNMVpIcjN6T2ZZbmJyV05YY0NGa0RHTnZKOElTNkZGZnptQzdxZXkvRFZnN2Jwc21aRnZhc0xXNi9kQmhJdG4xbjFLY09nUzFWZ3UwbFRBc245RXVOdUJLWE1kVng5UVZjSFNIeUJHWE54QjlTTTRoSXhXcUhaOVdlR1l3UHBBK21qakZ2bVdOVVJ1QWpJWGN1YWk1aDNnS3VzK3BMVlZVVjJUT3pIdGdDNm1nUGJFV3F6c0k0Sk5tQzg0cE01WXp4VmNhWGtDTW5OVFdjS2xwN1BzRWVKSGJXbk1GS0M0dEhJMHZlcUp3V3Z5M3ppUnI4eEdKTEdCWkR1eE5DQ3pPM205MGNvRTlTdDZUR1lIMUxUb0tva0RsSGNXaUdaQTZ6ZTdqVVVjUUVXUGNBM3hpaVZpdzVYakdpWmtUMitmUSt5UmJuR0lQc2s4ZzU1MU9XamZxTGFHakl0SWVFRCtuRDJvWEtMYndWcUE2eGtweGZuQXRKY3dqWE9FbVlOREFlQU1KRWFrR1dheGlHWW9RcUpOYURGamdkZ3ZKZmhaUHlLWFVmeGM5N1dHRkowdGszY1U0WXM1TzFNclhPOFZoNmk4eXhnalh1ZCtYL1dhKys4V1o4VGJQTHBZZzFNY083MHQ3UGw2UXB1a1krM283NFJnclYrcGxjNHFiTytzMVBaUDJJNVVvVFVLYk9tSVkyR081VTR5eXhyQ1Z5QzJpQ2hMZDB6Z0NKVVBpdXAyb2JZTnBDcjM1MnJETnJDWkhMT013ZDY2em5INmJKTCs1WXRzTDRIUzgxUEZTSFk4UHI4VkRVakY2c1A4OGF5emNIL0c4MldES1l4aVJhTFdHS0ZEMEp3YnlFWU5LdElJenN1bXRzUW15aXNmYlk0eVNtbEdsQmU5S3lUZHZBaEJrTkhNWWtXN01Pem5XU2Q0enI5aGVyQTlTeFZaU0lFMVJ4Sm1PeFIrS1YrQTVjeHVtdWU5VUpIVUh3SVJOMnlCbFNMUExBbWY2djI1aDVTK0kyd2c0dXB4emtlWmRnT3dBY09TWXJLa2FWUmJOTys0UldpNHM5eGdQV0h1QWJLTmFVcTdQdW5SMFJlSHJFOElSQnlSOFJBR0xMcElaNHdoelJJWjhFNllwdnRzUWQxd1ZmZTllcVJYZkg4SENlQTZFc0RRbXRIYXJXckczdGRUMit0amFJcGk4aUk1VWo4V1BXUmt5eG8rTlJRNk1BamdyenFFRVRKL2Y0amFYWC9zSis5K3FZaGE4NjhpVk91eUZCbmtGaHNZNUJJU1A5RFdwaXFubWlMVGgzdVdReEpDU1ZaR3BxaFExeHZsaTdyRnZXM0ljR2VBbHpseU9jOGd4dS90WFZKNHp0Rm4ydG9BQ0J1d2FVTjBzZnUrVGxYVHM4WmxsNVpCTjJFeGxFczAxckEzTzM0R1hxTUlnTUxtK0NLVldyajNuWDI2R2wrSXpnVjNnREUybGo5NmY1MElPNlo0bWYyRzNQc1RMVjRPYUlZVmN4RGp0NXJSa01IRS9kTlh2V21iZXhhZ1BsY3JTTk8rZ0U5bysxaVRmOENXTXFuVHhwUVIwMWRvRGcxWkhEMHpHN3ZyNys1RWx2OXlweHgyNkFMVlpzQjlCc3ZidTNXNVRlSGhaeGRqakdNWFdLZXBEMDlYdFdGeDgzaWRMOEpRZ0toWUw4Zi9uVWw2YTFDYjkzTlRYRVhPK2RXRnhyZW5IcXNqaWdYTkJGSGxrb24ybytvMHhYT0p0MzVYblkxbGVHUFZkU3hQdm01cWJtNWxNSUlkQkFWRE9hUlRNV0p5WW11cnVYeE92RTR2dW1KZ2tad0Fid1Y5YmZ5bVZ4OEl2RjNxb1lqVFBSK2JGMVFvSUJBY0pnRFc3Z0lwbnBPdXJWcUZuSXZibjVjbEFBSVJJeThSSUU1VUFMMlB3WUJId1hMWEE0ckN4MkR5NkxqcHlZdGJoaHdiSFk0TjAxNENHNXlXZCtEQTJMYmJLWTVwd1J5QVg4c2pvNWh4WW9vQUhyQ2ZsZDdRZHRvUTFtTDdHaFhHNldQSXpRb0hsa3MrRUw4enNRM2N4bkNkbjhaRTlBTkVub1RWKytTOGp5Qi9rYVlCUGx0eStTaDQvalFtYlVJWVVZWU1ZbVRpcldYMnlLQ2VkMEl5bjNwdVpUZFBJQWNBY0diRUR0Z0VZRThLRWNBT3ZoaUVMaGhhenhNU3BjWkRzZTBtRDl5WUNIRGttWVdJcjVCaHdwckNuc3paZUo3VUVaVlJIQUJoWjFBdDRqdkZteXFlTHJLVW1iTlVPUXpOUUJqZjBxNElhSUlOY0NuVVF1L2l6cEVvWHhVNWtvWG1hUUEvTUYyeXJmTHdzdGFsN0xteHpEUmlJeGdERVBpL1dwMm9XdGtkaS9sSmtjT1pJQTJnVG9BN0pFbGw2dzk4dFNqUjV6dmhKTDRwT09Hdnl5aHpUelBCWjMxVFErYTVJMFRjYkthekRFZys4MFBoSzhVbGd1ODFUalk4ZVVhWXZtVUFkRU5ZcjV6ZHBRWHRZaUxKUEhJV3hhSzdVcEl0cG9zNGlrS2tPdktjbUx2bHkwdEszR1pEMzVLRTRuN2xiVDh2a25tamN1bkQ1OStzS0JNYkowWkdvTVNSUzhNdmRjQmJTUEpPK3haNGYzemV3N2ZNQklmaUp2cEtMQkQxdSt4L25DcTJBdTRsR2pLdWYzN0RtTXhDMERTNmhJeDE5R20xSkFFcUZxQnc4Tzd6Rmw1djVscVVXUjU4N1FlZWgwTlhadEdRZnNhRDZ4QVI3MG1sM2ZhUTErVTU3MFlBR1FNeU9KT2hwSVM0N093R0NXUHluemVHQm1ENVZOU1VTU0Y1b09VRWhyUm0rVW9nUEhyR2ZsU2l4cTdJMlg5bWowRWhHejhtUUhVZURnbnJTT0dwVW9IMmdGNFBMRDVtbWhTTlRWcUdaSm50TjdBK0R0K01VV3MyVTZZY010QTE2ZmUrWmdHUXdPTit2TTJhSWhSV0twYjIvM2NPeXRtNDJubTk4RGFKT0VRR2Qxa3RKTStzb1VwMG0rY1BnMFVsNlZmZHdPWWhjNFVRMXBMUVFHWXpNU2RXc3I0TjlzYkx5d1JoSk1ENGRsTWRNSFUzVmZyYUpaYyt2V2VlajF3NEdLdUl5UUEzSkk1UUxpUlp1UGpuZWZPWHptOEQzRnY0ZWkwalA2RE5tSllZTW8rWHc5aFJzRWEwNy90Mi92M3ZZamw2WHdCSVl4c05XZ2tHWEY3TUFRUEVEV1kwZ2dsRlZEdi9SdXR5aFgvdHl6NTd3QXYxakxRQ3VRNXFjSzBRYmhNUUduajkyRjFQdjY5dmIxeVpNZVZudzliQTFJSE90WXBrMzBVOWtJL3UyUjNlMjcyOFhmbFVzU3ZEWDhUOHcrTUIyeVRBcHI5UTk4QWVmbUt2dkZ4Z3Q5RXZ6UDRyUzdqNmdlMy9NQXVleEVPUmc1QkdBcVRXaWd0Zld0Rkh1NytuOUZjbEZKcmZZa3F3Wm1KaXRYb0RVKzV4VTM3ODVTMWExR1FSbFJmdDZ0T2x3SjhCazYxZ0FNZW9BQlFZRTFSemRBY0Y1NXAwdEgybmRqV1JOc3RFUllLNW5DTEM5TVFtUHlPdWJHL3dyS0NQRG12SDlxZ3dNYWlreUh1RXUvQlhZL0ZNWmFwYmE4MjgzSzNsdU50d3hiZkR5cFJRS0NCUU9waW1mRDlPdytpckhwekdrbCtMNmZ6VGsxY2Nhc3lGSkx2VXlpTjNTU2JTdXJqY28vTFpncWxCamErL29hajF1U0kybmpiK0F6SWQyc3kwR1o1V1p2L1hjdnNhWWRSSCtnVGplckZGMElYdXFxYWNIZXZsdG51SXJWY3JPUXBYakM3cGRhQ1JlcUVzUDR2Y2pXSzlyVUIrUTcwUnRwdTE3R3lKMmFzRSt3Wm9hVFJvRGZ1emJCQkFnc1RVeSt3U251VWM5aU9sOWNVUzlhYnlBbC92WnBqYjJQVkUzeVpsK2dHY0hzREhBR2dtWWFyWWdQcldCcWRwUGs5L1pSb0dMbU00Q3MzRWZLRjF3RS80MHppL1ZVY3BMUWhWc1NPZGdhZGVxM1VvcDFqVHZLWTVJMWYzTHc3VDhMNjZ0UG5wZ2tCTzhhelJ5QVgwbGU2VFBIYW91Sk9ac1QydGIwRWVVTjZhMlF2WXoySEExT3dkZ2kzYTZETXBxeGJNM3VuNFZNbUhUVHZJeGV5c05VczBIV291VENmTmh4QVg0dkdFclQ0WmUxdVVHaWF5TVBnSU1nWVpRdVk0UFdLMGgzQmo3MS9CNHovRFREUGVuRldvZUFZeEhTNmNZMXkxREs4azRpR2VPaEw0MEkyYnhJbVVYSHlyOWVvZllyOEgxOVhzTHlrMGJqczk0US94bDRKL2lrVnRqWGJJaS9pY2JHdFQ1UzEzWUVMeVZQWVFEWFZnako0TE5xd3dFWkExL1p6WXNDYjNtWEd1dVNGVWFieUVHZU9tby8zaWc1YjdORzBFYUU1UTkwT0NtUmxRTWlpWTdweXdGVENFdnlSQnlnallQZnBZNytHZk0rUnJ6OHlRYW5OZmcrcHE2Z3NKcnVBY0VHd2NOYm1mQUhVbUgzdkd0WGRiUWo1eDBNMUFEZitzbkhvRkxsSkhLbU9NZFlsNjlPeUVHSWxEeUxwNVNwM0ROREZwMEZZd1VkaENIdGNSaUlwcEp6WHByS3lMTForTW0xbUNENUV5NXl6Mk42bzE5Z2RIVmJnSmRPcXM5aTZ6N2xwR2oyQ2RsZVkzVEZuSlJsS25QYURsZ01QTW9DVHdQY2p1cFkxc0Z4R1hNLzNzdU5mTHNNRDFybGNJUmlBSEswTENBMkxUQTd5UWJQSElGWVhvSHYyL3ZZWXhFQU45QkFYdndkY2crR0xlU3M2UW5aS2hzUy9IOHBOR2czbEc5dFBWQW9HSU1lbEdIcUdDZHNpUHpvdzNSZzFzNnFrWUZaam13Vi9RSzVsYU5PLzdndFlOK2paZ24rZE4vUG5QSkg5a2tjWTl5a2E2N1huQ3c3SU1lKzkxai90UXZ3all0NTcvbGd4aUxMakNLOGo4REc4Tm42eGFZTFN2U1d1djRwc2U4TGtPaDhBTWhNUFU0YTZPMFAxQ2p3SFpQODdqNDlHTEZ3cDgzV3Q1R2haREdiK2NETWt4bjN5cldLaTAyS040MVhFSDI3SGdhMjNnZWdFQld6UGlEcmlmNjNFT2lBL3RJUmh2NjlHZ2JHNW11b05jeGxHdGJjUU01WTNJcHdmL2I3V3JQaXpmbExSMURSMURpcVZVYzJBYkMrQU85bFdqRXJ3ekRMYkhxclpwdmVIa0ZYZlVYTzIxeTBVNUlZMDYzNFlDQmhFSmk4ZGtibGZYUFRrSnFpdkFUTzhjb2xQZlhCK1pKajdVemFuSDFxeXVmdEVRMjkvZDNNVGVsRUxLTmlKUjN3MUlKUkNPWmpXc3A2QUdNaS9WVXVoNmdweXRiV1ArVkpqL3pacXFjWkh6Q241QXhXQTdRN2FDZTFJaC9VazN6NzNzbHVsSk5PbDBUVkZ6eHlrNVJkRTdzeTM5eDhBdkNDUCtXK09EYXNra3ZlRzQzbkJYYXBvM3FTVHBiN1phSzJrWE9PWWRWaG1LUzh0S0JtdWxzRmVMT3NRMXpSbjl4aDFSVGFtaG90ZENJMnRRSjRZVk5LVzRzY0psckxJTytDQ1J3MVEvNjRjdVZkT1VpTDJNWm1jSlpWdFVHQUg1TFR4Tmo1NmN2ditnNlFjMmxKWE1RWTFCSmZyM28zTDhDa3RDa3pZOFpyd3VvMnlQcy95ZzM4b1hrQ0l4TFVZQk9kVVYydGpSZEUvYnFYVTBkeVdzUjZJUFc3TFdqUEdsQ1JwelkxdmxlcmFBOW10T2lOM0dZT2toZFNiaFlib0MzcUZZZ05iRjhid0pRZlRuSHZtWmJWTC9yVytTMnpqWnQwT0Q5Z2R3eE5JWHZnMVNKV3lacGFPRmI5VFp4NXdKY1BBbVMwZURjZTJPUldJSEF6Y1N4M2VkdHE1S0FjM1F1NVBMcVd4M0R2Ti9wYXo4VkZheEw3QzNIU1p6TkdaRFBQSHFTdlYyb1BkTVdlTjZEUVUzNGZPd3pxTTNPZzhFWFNjczJ6QVpNTnBCa2xYMThzWlM1WW9Cc2lldlloVmozZW9oVE5LVGt5R2p1Z0Z5REhUSTVCT1dBZVZ2dWtRa0U3Ly8rd0Jkb3lDQjRHNXVYQzJMM0QrL2J0Ty94Vy9QUkZKaCs4Wis3ZXg3UTNicjU5NzRhMmxHODRVQ3MyYzM3V2NZYTE2cDJkUkNOTStKRjNWb2dBNDFpbUFEakEra1BsTTZ4aC82ZExkQndHMzdac1BXZ2NxUWxmRjMwdlJIT0tKaUN6NTRRaEtDZ1hhSkVoNEc4QnplZ3J5amROY0NGYWFXVUV5ZHdydDIwMHhoR0xMS3dQNVZlWkZIZktHdTRGeUhPVktHYVliYWR1NVZzcE9hVXpuUkxqRWpDRXBnMHc1VlRKRlpGQkRaR21UWUxOemgrUkJlVnlFQis1QkM5VXdvckxXVGNpMDJoeCtEMFNEMnJBTkxvOTRxdk1zaTlKazc0RjZuMG0xOFQxSE56SFRPS3JqMzk4a1p4WnpMR2VJMGVwZE5YRkwzeExRbWN4NytYTDJLeVp0Rk1CS2dlc0VSaExJcU1wbkFGVEJIb0xSY0MvTENqemZwSG82Y2pmZzFCRmF5Qy9rUDBYYUo1dnROT1N1T1hjZkcraXVla1BOSXJrbGdKUVQ2c2RScndCYWJLaFR4bTlydnpwanhkTk9rc29aMHF3ZFVIdk1QVkw5ZzBhSGplOXNNanlYVWtIcExSSzdNM05rT0NVblhRZ2dubjc4cm9LVC9CektFUzNUakU3bkduK0kxdXE1Zi9ZeFJqTG9JQ0hRT2NJc1RlZjRaQk5UT0xreWJCRVAvZXV6bTFUZGR3VDZQR0xyRWk5RUJ6WmJaY3JhUXViUXV4ckVkcEF5N3R5N0tDOWZ1SmRibzVldDlpQmVCT0k0eTJlc2dDWVRxRFdDT0xFd050TzJFeUxqRDA0dFhHYngxWnVQQk16SDJsMzZLbU1NdFRXTVc2cWtCZE5Iemg0Y0d3TXdjUlRoWUlZYlFwT3F0RFl3ZnZQSGw2NHpkSW4rUWxTVTRWU2IwbzFPY3BhR3lYVVNTSVlLcFVhU3MvdXl6YVFjV1EyVThjMmhhRGdhSzl4V0FjUFBHc29MVHkvSGRVUjBzb2RCbXJkeXV6UWVBYmgwQVpjZk5qUUlCb2d5clA3YjJVTFRGQ3YrVkJtZmNCVVFRZkVCKy9MdzBybkgvR0FDczdvMnovWUNwQndGMnFyZEExYU42T3VrWmc1ZEs5QmdSYzRSQ2NjT0RoR3VvdHFISkFGTlUxNWNPQ1pPdXJtRUUxazVMejcySHoySFdaMzdkcS9jZ3lPWm5Md3VTaVVPWnFZTG1ua3NvaDMxUUJ5cE5DTU11UE4ySDNkWDZYcFJXWmNjdDJCOTVmY0QwMW91ell5Q2p5c3NTcDY1cUZDWXBvZ1B5eThIVXRmMXptb29aY2FOcy9FUElrZENUQXg2WThqZWFUT0cxQVpHV1dWSmRQeDBhYkNyTml2Y0pWSzl3K094UlJVZm41d0g3VGt1ZVZIczI5b01ULzVYUTg2dVRvNU5aQ1JnWE44czRHS3dpYng0MGpKMkZEQmRkTTNEVGZQUU12Skd0WllxUit2OVlpV24xNXZGWXZGN1hPdmZrclpvVXMyZ0ovUDllQUF2MlJlNVB2RHhUQU1aK1dWUk4zcWNxckZCZWlnOHhNV1NmQlRVbDdoOVpYbEZGQ0dIRnY2TXFBNzFlSzVrNmw3N1I4Y1Q3UDZzZ0czendOb01FQU5EWnNYcTNoMTFPbzBkc29RNzBMTHlqc3oyNk1qbFV5eVBGWFhNWDN0N094OEdSYTMwdUh2MnJVOE9KK2VoSFJ4V2hIZTZvS2JpK1lTdTZWTitHbmhERStuNGROMFhEU2o0NE9IOGowT1owdGVpdlZSZ085Y0Y2M1lmbHByM3hQTDh2a083aVNnRnRiaTgzdEdIMEg0cFlacGRSdVEyL2RLMkJ6T1A1K1R4THhkbnhvOG1pYnd0bGVmWHpuU1BhbDY5dXZIVDFWOWZkN3JqTWFlV0I0K1p0a0M0STRYRGQxVU5wOHA3MEpVREMvb1BoRmZiMDZreitQZXVEc3lXS241V0lXVEgwUXZWcmZQV2orK3BxdEFxMTgvZlEyMzB6U1hOYUF5UE0vSVE3Sjc5TEFCN2I3VzBOdlRhSW9XRnAyOVZac0g1a2ZtS29rUHc3RExVNG53WmVkZld6YjZwOXR3QmVKTFJmM3R6SXBVMlYrWm00SWtLYnA1NDhWcFF4SGRBUXYzOE9POWkxeFgvQTZ2NDgxd0piL3ZPU2RCL3RYWitaY0w3N1c1a2xWczYveExFRDkzamJzcTNmMzk2a3BLV3VXL1NOSnYyRndBTTFScTJFQ3BkL1QzOXJSMHR4ekxycDZWRHhKZ1ZZajN6aXRueThsZnRmQ3JkNVI5TzVlL3ptR0JvcVZuaWU3RUoxNm1TeXJnRVRaOWdUVDRQQ0p2NmU1cGtVZlZCZjZzdnM2eit2R3Y2cGE3N2VrV3V3TkFtS20xVk5wYVJPa1IvM283MFA1Rnp6WG02UVVUTWNpbVhOVFkrOFh1M2QwdHZUMDl2YjMxZ0QrSjE4aUh4WmhGUEx0bGNOLzUrUExqblYvUEpsV1FXTHlPcGFYZWJ0bUVsbjY0RkhmaXViUTYwd3ZBSHZFM0xUZDE5TGIwdHZUMzYzNWlXVzY1d05PVndYSFJQdjJWbExhem1wdjJKNHk5NjFqcTcrbnBWdUlYanY3UmRNTzk2WnNsNW5UUGVGR0hFRGUyVCtyc3R6b2VqSGV5YUs3Zy8vZzFTU2VmZmxCM1QvdjZzdlBscDdEb2FrVmE2VUpQSXh2UUsrR0x4a3hzYkU0LzFMelhwbWJUOS9vbGNxTVdacDB4KzNiNFdGNlpVT09PME5nWTZlVjJmaCtPbnRGOEQzekRxNnlNUkVVRDVJM0pqZzlObDByTTJ3NTE5QnVkdHNaSDJZOVJzTUdIb1Foa1BoV1RkdmhNZHgrYkZkNGpWNmZlUmVRWTdTd0pDWjhaV21nb29laExEUk1kc04zMytNMHZjend3aDRNdkZvWGtQNFdKYm5RYmlGV1ZnaG5OTVFUb1NoNExkVXdNYlVLQUxCdHdrM2NPamlUbFgxNzA1OHdGL2VITHpqdkZSSE55Vm5tQ1l2V1R1ck9ZL3lZYi9RaERZd0VjT2cvalc5bUlhUjRXUUVDbTNxTjh6UGtKYjVwUXZSTVdrd01ZUmZ2aStsZHpwc3lIWTNTNTRrU1FHOU1zUGk1dE9Pa3kxRTQvR3M4enhqdEhOK0lRLzFKMjJsWWEyd1B4WHRZOW1NYzlZSytiQUhEOHVSbjJxYitMMUNueGxNM1I3QURuRmR4a1JybXBKR3NqeTFsRkxUcFY3VTZkOHdpMVQ4U1IrSTlmS0ZGWTB4QkJFSms4L1o1RmZCbTlHQ3Y0c2ZOT21CcTlmQlk3ckxMQnhuaU5JYzBobStZY2tIOTh5TXpRcUJrbWE3ZUUwZXBvelljUnZxSTdtaWhMbVRyZSswbHluc080bm1ydmx3ZHFYSXozYU9nZURrdFVVRlpqQ0N3M3phYytrNkR0ZFpIaXJyOVNmSlFwbi9GbWRFQ0dsQm5DeVJ0OCtzSitFYlFadW9kemdXQnNPTHZpQ1JxamMwbm42ZnA5bHQ5NjVpOFJzdGVJR24rQ2V5dVJiRzRNeHNabko0N2VUWkdoa2YxeDRhVndOdWU1TFEwRG1ld1BOT1ROb0RXbTZwTFRYaTE0S3huWmhqdWZ3bDlyV2FkelZhdENmYnBqZzhTZXRxTnpkelB2UzNCOENDZlNSSERBMm1nY0ZHdUpNVk4wMXJ0M2Y1bWZQMmJVdXNwdk95UGZhb2JyWjZzcCtVUHlxWVZUZCs4eUdSSUprQWpRNW8waGJXblVpUHc0cDd6UGVvR1R6alFmaDVYS21QbzlHTEdZTytoczFYWUwyNzVWcHg4L0s3RWs5ZFlRR3hmQXhvdHkyL0ZnZWJ0QTFMN09iZ3Yxc2ZOak1TdmNuUU4zQXhZOFY2b2o2YUFhVFEwOWh6a3lJZmt6S0dXZjE4S1F1N1pJWDlZaUtucENsQkdXNW1QbStQb2EwN3VFQXY0bUxrYjJQUnFhMWdOQVZTNnkvU3dyd3oyYkpSdWNlYTJHY0JNeEVVOTJaZy94S3JhRTY3anhQMnlKdkl0RDAraGVHeG9XYzJVcVc1VkJYOUJOLys1MHZyeVQ3cDlzOEo3RlBxczVJS2NheXpHUGhzN1RNS3BoSXNlVmI5QUZ6bnc2VEFub1diSHNpWUdLblN6MFhjcTJNYlRKUmxJVGVYS2I0WVRXdlE4OXhmYnFSekdzRG5OTnlWUjg1d3ptbERVeXd0MkdSVVBTUndIOGtxc2hiRS9BN2RRRlk2MStKWGs1S1ZBdGhwK3pzV3ZhL0IwejZma1hoNTRqYVVRVG9ycDdEbXhjdnhuNmllRlRtR3N5cVlMU2NLa040dmFkYzFnV1JKYmJROU13QXBURlVSd3pBblJhaE42Sjk4T3NZdnVucjJINElWTlhFYnpQcW9qWllIWW0wRGE3QWRIeG9ZY1V6cGNhdklTSFA4UU9ZbUUrMXVoM2YrejhxaDFyemhrcW5sS1BwK0Q4Wk9kbHZHRzRSR1N6VUNxUmwzTEFNazhWVzFsM2JxZjg5YS9PcjhMWWJQVjAxd1crRG5QbVdjdURzcWl3REdmTEZ1cHVQRHFwcng4Rlk3YTZXM3BhY2owL1h0K0puaEg3ZXg2UCtjZ2FCQzQ0MlQramxYRXIrNGNkeUd1Uzc5VndxNldscDZlbHBTWG5jK3NQZVNoUXJLck94MHMrZW00bVBoUnRGdmgyWDkzbTgrcktRSUxWeHgvd3Q5RVdPYU1zWjNGekxrTWM1VFhGSEQrZTBJaU10WU1jLyszbnVDQWlHbkRUcXN3MzJYbVYzM01rbFBXMlNPUnlRai9uSXZneUliY3BrU2dxNHIzaGtQeDI4VGtBTDhINDJ5Ty9EZmZkdXpvM3lxckJhdms5Y2Z1NzFUcEVkMjlMUHV6MmcxNWNvTGFtcFpnOWIrSzVnYTcrTnMyK0FQQUdvK2dVbW42M1BpTjV0WFFoL25LQ3Yyb2Ria2RudnZVci91UnFuWCtCcHZvYU5IaVBVWVNmclczUXBJZHBFam5YMS9XM2RIZjN5S1dMTnpuQjd3SWczRm5ENlhQNnJvMlNXWkZWaVFobWh3aHFjTTYzUEpYcXU1YUV2aXJPNTU0TUg3VVUzcEdINnRyUnFia1J6NFBvM3MyQkZhcXljWS9aK2ZNa1dvMHNwbnh0bUY4RjlSbFY2bWd4SmFlbGxMZnI4UUdaYlg4MUo4MEV5NHBYNDVLTlJ3dTRsRjhTNEowbDh5VExzVHdGRHN1YStWU2tGOFltTDNaNDJDYzM1dVFZeDBFR1hUVWNvM2Q3MHhCZXZrN2JQUE5USGtmZU5ubU05Z05oOUN0VFdjZXlaOXUzQkkrblFZM1E5Rk9iUjFFWmNnZStMV0pnSnBjRmJTUHIrNmxaTkYwajN6eG04Y1dIcFo1ZUdSelVzWEE0aDhuL1ZpNzd3TERWMzE0Tnp4dWRaNXgvcnBDd25Ja2FjY3FKeWV0V1N6dWtsK3Jwem85ZDNjK1BlUjlkZm5kMUJzUU5wTEJPT20xUy9tQzJ6OU9TMElGU2JUbTJUWTU3YVBtOS9sNWhMZk12dk1teWY0VGpqcno1dWZqeW1zVXI4Sjd3dzNPVXU1enRjNnhYSnBZVEZVZ05FMzZxdTdlK0xBVlp1aVpYeHVkRkdWbEp5ZDlCTWpCOVJQT3p3VkxPTm54MjJZRjh5MzZXdWp4L1pYQllBQmdmbnF3ekxURlhJVkVtV0tmYm1GWFdVRHJ1aHUzWmp5UGY4Vkx6cnVPTDkzQ0N1L1RJOHozN3BzYy9Hcm94bFdrWmV2N05CcHp0TzhOYXA2L1V6cmU2dnFQZ2FUQVVjL3UxSWY4QUFBTUpTVVJCVkF1ZTl4QUZiN0pWK0hSaGJtZS9VK1VxNXpnS0hIK0IzRExCK1FsdWFkUmU5U1NyN0VqWmIxd1hCbE1RVXVvZmhpaExkQUoraDltcU9oSW1kcWgwR1VoV0IrQXFrLzhJeDRFTmxPVU1DbDVIcnNyT2xLUGN2anZncExtaCtYa1BvbFFNdHdheXE5L1pjZzNEMXNSTXp3aW0rMHIzYUJ1YXBqcHluSGFrMEh3c3lOT2l0UWNSdlp6NThOd0xhR3BkdVBLdmdLKzFKQVcyc3FTbmJZQk42SUIvdExtWjlOeGlSemZuUVY5dkpoalV6RWQ2N3p6NCtGUUZLOU13ZmJDUXNIcndvNk1ibEx5NzdtR1dhbzZmbHdtdHBYc1BONUl1eC9tdXEwRCt1YUtuOFowbjlESnV5S1FCdWZCNEx1UzRvZnhnalYyMjBmaUkwT0JjRDBNTjNrbkUwUHo1d1JwN0ZHZTRtU0ZobVllellSSEFKOHhlWlR5UWZLZkxDaE96ajF5bkpzaXNBWm1HZHk3czl5Q21KUEhmeUt4L0o4dityR2ZScmhaRGxZWjNydGpMWUtQZDJZbXhYZTR5WGp1Y1Y0OWVWUWxWcjJXeW9CM095NitEV1NmWXdiSWNaYkRHRjZ4UktSb25aYzVhZk1Yejk2d3o3R0I1dytjN2pPS2lVa3FrL1pDVWRMYTR5anNFUzc0cm9YYWtEQkNEdVgwa2RQS2h0M3JkZHl0a3Y1T3ovWUZEUVRNbmxKNmNXQzBXZjlXN2ZpNTIyQ01XWGFacW4yRG55c210ZFVjOXpUc0dBaDJDTlNiUjRXbXh4OEp0RlAwSERVak95b3pqZmt1TUtGbFkwcGN1Q2k1TTJWNzEyTElJa0NkOXJuZ255OU10OHh4aks1eVBlRHM4UHl4U3l1L0pzTVBzWUYzVytDTWloTFl0OHdTOTlhWDByQzBSbFgyZ0xQZHpUNnplTVZyN0kwai9pajBIZnJWN3lTT2Z5bXg1YU9VUXRtMzFKeWoxandEL0ZCTjd3NjF6SjNlMUhWcTV6cW12c3NsNlVWdk5NV0VIN1FHTi9TR0I1ZFBQMjl2YjV6Ni9Qb204YURzME1zQWIwQkc2VjBlZUZOR1pNeGdjL1lGZXlpbXdHaVpMVHhoUFpUdjU2MncvYjU4MzlZUEhVblk1Rjg3Mjl2ZjNkOHZNcW9SMHNLZGJRa1ZhV3BiNis1ZjZ1MGQraUpsTUwwOHhZVG5sVXZLZnp0RXpRT3U0N1BOZkthL2h3YW9mVWpNSVQyN2g5ZmovSnJJYzViUE9idi8xZGEycnNFOXVtMVQrZncxV3Z2TFR0dUJMalZzbm1ITDIxZmFIOEVQZXl5WnJsZjhEYmdKNFN6dUp0TG9BQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSIxNTYiIGlkPSJwYXJhbGxheF9zcGVlZGVyIiB3aWR0aD0iNDQwIgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFiZ0FBQUNjQ0FNQUFBQTZYazRWQUFBQUEzTkNTVlFJQ0FqYjRVL2dBQUFEQUZCTVZFWC8vLzlObWNDVGZtdVVlMk9RZDJLTWRXR0djRnFFYlZxRWExSk5tY0NiaEd1Y2YyaWJoR3VjZjJpVWUyTkhoYWlRZDJLZmluRkptOGFqaFd1YmhHdWNmMmlEZVcyUWQyS0JkbXVNY2xxS2JsbHpZRXhKbThhamhXdWJoR3VjZjJpTWNscUtibGxKbmN0RW5NdWJoR3VjZjJpY2ZXS1FkMkpDaGF4Sm5jdEVuTXVqaFd1YmhHdWVnV1djZjJpUWQyS2poV3ViaEd1ZWdXV2NmMmlVZTJPTWNscUtibGxJb2RHamhXdWJoR3VlZ1dXVWUyT01jbHBFcE5kQm9OT25pbXVqaFd1ZWdXV1VlMk04aXJpTWNscHNXa2hEcDkybGpYT25pbXVqaFd1bGhHU2VnV1djZldLVWUyTTRpNzZWZUYyVWMxbU1jbHFPYjFOQ3ErRkRwOTJ0alhDbmltdWpoV3VsaEdReWk4V01jbHBQcmR4THJOMUNxK0ZBcXVNOXF1TS9xT092a0c4N3BlQ3RqWEN0akd1bmltdXFoMm8ybjl1amhXdXJoR1NsaEdRMmx0S2NmV0l2a3RBdmpzMHlpOFVxaThzdGljV1VjMW1UY1ZScFVrSmtVVUZhcmRWVHJkaFBxTlN2a0creWozQ3RqR3V0aVdlbmltdXFoMnFyaEdTZWdXV2NmV0l5aThVeGlMK1VjMW05cG9xOXBJYTFuWUpncmROaXJOQmFyZFZxcXNlem1uMndtWDVhcXRDVm5aV3RsWHEwazNOYXBNeFRwcytzazNhMGtXNnlqM0N2a0crempteW1rWFpUb3NpdGpHdWxqWE5TbmNPdGlXZFFtNytuaW11cWgycWZpbkZObWNDcmhHU2Nobk9qaFd0UWxyeDVqcEdsaEdTYmhHdVVoSFdlZ1dXbWZtR2NmMmlNZ25pVmdXMmlmRjJjZldLVGZtdElqclZDakxTY2VsdVVlMk9EZm5oQWlMZVZlRjJQZW1SNmVucVFkMkk3aDdxWmRGbENoYXlVYzFtTWRXRTZoYlowZVh3Nmc2K1RjVlNNY2xxT2IxTTZnS2FHY0ZwcWRYMktibG1NYTFPRWJWcGhjNEdFYTFKZWNYK0VhRTR5ZWFLRFprOThhRlNEWkV3eGRKNVJiWUY1WkZKN1lrc3djSloxWVU5RGFvTjVYa2x6WUV3dWJKTjBYRWtwYXBNNVpZRnpXVU5zV2toclYwTXpZWDh0WDM1cFVrSm9VajVrVVVFcFhIMWpUenhnVGo5aFREcGJTanBSUWpaU1FqTk1Qek5MUERGSE9TMUNPREJFTnl4QU5DczlOQzg2TUNvM0xTZ3dLU2t0Snljdkp5VXJKQ1IvN2k0d0FBQUJBSFJTVGxNQUVSRVJFUkVSRVJFaUlpSXpNek16TTBSRVJFUkVSRVJFUkVSRVZWVlZWVlZWWm1abVptWm1abmQzZDNkM2QzZUlpSWlJaUlpSW1abVptWm1acXFxcXFxcXFxcXFxdTd1N3U3dTd1N3U3dTd1N3U4ek16TXpNek16TTNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDd1N3U3dTd1N3U3dTd1N3U3dTd1Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9XQlZWbGdBQUFBbHdTRmx6QUFBTEVnQUFDeElCMHQxKy9BQUFBQngwUlZoMFUyOW1kSGRoY21VQVFXUnZZbVVnUm1seVpYZHZjbXR6SUVOVE5BYXkwNkFBQUNBQVNVUkJWSGljN1owTFlGdGwyY2U3RFM4TXhzZGdFMFZ3b094VFVXRnNNSENJQ0tLdVhKU2JPb0cweFNHS2pHME9BYm1vM053WUtEYlluS1drQmpzR210b09FeVhJR05SVXZyVk9Pa3RwQ3kyakk1aG1UYnV5cERsalkwM3A5N3ozOXozbkpNMmxKSVBtYVpxY2U4NTVmK2YvWE41emtwU1VIQkIyME96WmN4YWNzdUNVUmFXbHBZdGdZUGJzYVlYZXBhS2xzdW1mV0hCTzZROSs1TEt5SDVSK2ZrYWg5NjlvWnB0eDBqbmYvWVVsTWNsK2ZzSGNRdTluMGJoTm5iT2c5QWUxNHpFanRzRno1N2tmS1BRT0Z3MTB0bUI4bVFtcjlTQzc4OHdpdW9MYTFMbm5aQUFOREdQekJOcGZXSFY0b2ZkOTh0cU1MeTdKQ0JyajlrSTBGdFAxZ1lXRjN2OUphVlBubHY0OFUyclVUd1pqY1YyUDYvSG84WVUraU1sbnM4NjVQWE5xTHBjYmM5UDFXRHlPNEExL3ZOREhNY25zODlaRjJ2aUd1TFdEMlBTOSsvZnBNZEJjb1k5a1V0bWNMRnlrQU9jSFh2cklXQ0l4c2djR3ZsYm9nNWxFZGtyVzJMRGdRcm9PM01iR1JzY1NlOEJaRnZwb0pvL056WjRiaW5CK1NFdjJBYld4eE5qWTI4Q3dLTGs4MmZUTXFqYkZVRXJaQXdFT21DRkxqQUc0M1lVK29NbGlwZGx6UTU2eWZsaVB2NFg4SkxiOVFLNllXT2JGRHN1Qkd3TFhvc2VHRXdrYzRaQzdMUHJLZk5sWGN1Q0dRdHgyUGI0SGdDVkdzYnNjM2F2ck54WDZrQ2FIM1pFanVLR1l2bzg1U25qWkg0OFZTN2w4MkNkeTRJWnprMWg4K08zUlVVSU5uT1hJY0Z6L2NLRVBhakxZb2x6QWJZQmlJSzdIOWljZ24wd2tjSXdiZ1JxOG1KM2t3YzdQQlJ5Nm1oT1A2WWdicVFiQVl2RjRNVHZKZzJYYlI4bkF0VUg1alpKS3ltNXNiRTh4cmN5TFpkOUxTY0MxQXpod2thT2pPTVNOam8zdTBlTS9MZlJCVFFiTG9kc0VnK3ZTNDNHZVVpS0w2M29SWEI0c0YyNElYQWRVM0tTRVN5Undjcm0zQ0M0dmxrc1pSMXhsVEI5RDVGaUdzbmU0Q0M0ZmxxdXJiSVAwSDRVNDVpNkxNUzVQOW9NY3diWG8rdkE3Vkd5amtGNG05c1NLNVVBKzdMczVndHVFeWdHVW1JeWk3a29BRnl1V0EzbXhuSHBPMFBYdm1CNGZTWkRycU9nYXdUdmdPb3MzNmVYQmNyajhUZTd3aWc3cisra2xuVEhjNWFYSGkxMWVlYkNwYVg0NndNbzJJSEI5cUI3QTFIQUh5djZZSGl2ME1VME95L2pPWldINEh1WTJkT2ZDS0hhVHlHSHVMZDY3a0NlYmt5TTR2eDZMN1VkT2NoVGpBMDlaekUzeVkxa1hCQnZJcHowRzlmaGVFdDhnc3h5SngyUEZFSmNmbTVVbE56Zmg1dW1BQXVBZDdDZEg4YldCNGdYd2ZObm5zd05IdVhtOHd6SFVlWUp2R0JvcDNpdVVUNXVUVGI4WEU1ekgwd09KNUg3YzMvVU91cE81ZU9OQy91eVF6UHRQYWprM2oyOFlkTFlmRmQ5NzQ3RllVWEI1dFRuWFpxczNzRllBRjl1N2Z4OFVCdnFiaFQ2U1NXZHpNbEtkUjdGZVFCWkRINC9UbzhXVU12ODI0NHZweHJwYWo4R0N5RnZHOWZodzhST3BoYkZaWDBuajVpRVROckRtYUZ5UDZUODl1dEFITUlsdCtuaGZ1bUNCRFZtZzQ0cGM1WGJFRWNkODhwT2ZPdkhFWS81blFvNWtFdHFNazBwWnN1SjJqNnMyYkhlZGUxUU9iempsaU05KytYSmJ1UTJzdkx6TVp2dis1ZC84Nm1lSytMS3pHU2VkOGQxZnVPdkJFSmphMmcwR1ZBME45Y1E4bmp0em9YYndNYWQvM1ZaZVZsRnVRMzlsdHZJS2dHZXpWZnp3aHU5OTlUTVRkemlUekE2cFQ4dE96bkx6VXdCYVdYazUxaG9nS3dPMWxZUGtrT29xeXN0L3VITGxpbThXMldWbjZZRzdLSnROVC9uVWx5OUQya0xra01qSzhUOTZZSVl3OFAzbEs1ZXYvTWxYaXo0ekM3c3pMWEMrakwvRzYrRFBuZ1dneWl1UXZJakdzS3NrbytYRWIxYllnTnhLWUZlVVhlWjJWM3FTKzNSR0d6MzR4SzhqalZFK2pCaVdIRmFiamZoS0NIYVlIS0Q3WGhGZGhyWnN3bjNsbEUrZVZVWjRsU0UwRlFoaEJYREM0UTNUb3krWTdROVhJbmRaUkpleHBRbnVyblMzZDh6cGx3RXM3QnJMeWxoY294NFNNY1RScmdLbGwvaGhLNytCU0E3c204VllsNEZkbEI2NCt1UFMyZGpCbjcwY3lheU0wcXF3RVY2a0FFQVNoRUVtTjF6VUFkc2Zyc1MyWXZueUlycE03Tncwd1gxci9FMGRjMVlGSlNJbElyWUtDaEVxT1F5THVrcVV0WlJoak11cDRsWWdmbDk5OTQvNGZXSm5wZ2x1UEY4NTVjVEx5MW40UXVrSGZpWWUwa1lyT1JiZ3lzcUk2cERuQkExZXY1SW1LUGpsZTBYUnBXZW5wZ211UG1YZnlSRmZ2cXlzekNhbEhzUmI0amdHY01yS0tGUThCWGQ3b1FFY0EyM2ZCMmpMbDlNNFZ4UmR1blp5dXVET1RicUpLWkQ4WTF3b2FGV2dCQktSdys2eXJJSm5rallxUDZaTEV1R1EwMXhPOVVhRXQ3d291clRzdUhUQkpmT1ZSNXgrR2U3S3dqS2lBSm5Dc01PMHNYNHV0RVNGalVSQWxyNmdseHVvMUpqa1ZxNHNWZ2JqMitIcGdyUDJsY2VjSlVveUJLK3NERFJIMGVBWVYwYjdUaWdtaEJRWEF3d3R6TDJCUWFNVlhkRmRwbU1mU0J2Y21hWjFwM3pxNjFoVVJHaTQ0SzZ3VVhWVmtIU2tnbDRXb0I2eWpGSXVzNG1jeFhiOWNsbHY1TFhvTHNlMXRNRXRNNnc0NWNUTEtMUUtrb2lVRVFHVjJjcElueGF1cnl0UXRDdkRBaU9kelRhTVdzNWtybWZFaEsrRTRxQkliaHhMczdNU1RQblZnWU5Qdjd5aW9seEtPQ29xU0Q5eUdWVldXVVVaODZGb0hndHlWSS9rRWdIcHg3eCtwV3lNM2srSzVGTGJzclRCblNwV091SXMyZ1ZpWTMwZzViUjJveTgybEZyQ0U0dHZtRm9GelZmb2FyUmlLTCtlc2xwQmFuQWE3MWFzS0tZb0tTM2RQcS82K2p1L3NmanF4WXUvQVk4cnI3cktScHFmeUFrbEpUYkd5TVpreHk4SDJPakZieVk5UkJHVkRUU0p1VjZJalNDRWttQUZHaXlTUzJGSFhwZzJ1SHFId3c2UDN6NXczMzMzcmIwUDIvMFAzbnpMTGJkY2VTVnd2S3FDd1NLbEFldEhyaUJkSmxEUzJmQUY4REpTZnVNMGhYUm0za0QxUnZ1K2xtTnlhTGpvTFNXYmV1U1JKOHliZC9ZM0ZpKzkrdXBiSFdDdTlNRzVHRGJHRFFiSTBGcnlkUDk5OTk5eTh5MVhYWGtsOHBJNGtKSCtTaFlKY1RKakl4a2xtbDJCVTlBYmxxK2dsY0J5MG9leWtqT2M3T1NtSDNuc3ZIbUxGMTk5dGQxaHg2cEJUMWcvRHZ1NjlNRjVLRFpyVzRzZWE4a0wxZVA5OTkrQ0JJa2RLN3BxWU9QWHcySENWVDhqOXJ2bi92blBwLytKN0xsN25ydm5ucnZ2UmdHT09zMFZVd3JkZElXd21ad1dBc1NJMlNrd0IrRm5kNlFQN2s4UFNDcFRFS240MWlyall2VCsrNUZqdlFYQit0MUQrTzkzRHozMHU0Zi96MkQvQUlMM2dQWldyRmkrOG51RmJzUTgycUhIemp0ajhiZVhFbFlVbDRPK0NHeVlKbmxlNTNyY016NjF1ai85OGRHSERJZ1FsTFgzU1FUWHFrOEdwR3VWbGRlQ0lHKysrZWFmUFl6VmhvQXArUDU1ejkzSWQwNkNQcFRwcythZHZYanBiVVJWNU9GZ0drUEk3T1NaRGlpaWd5RU4zUXViR3Rzamp6eHNBbmVmdGU0azUybXBQUm51NzU5ODhtbGtUejczOUhQRUNFZFEzajNnTmQvSHFlWDBtVURzYWhHMnFER3g4UWVoU0wwbDA1NkQrbEV5NG5SWjh3TnNqejc2eUtPUENCSnJpZHBNek5aSzJoUC8wb0pyK1dRNitpaUNCZy9LNzJreSt2VFR6OEhqdVh2dXZ1ZVVZMmNlT2JYUWJUekJOdk56b0RFSHA4SndNQ3AyaWFQaU0rMks0dGdDd3FGcVRsZHRyU0NJc0QyQ0h3OGFTQmx3eUFxalUzNFA5dWpmL3Zia2svLzRGOWpMcjc3NitxdncvL3F1WGJ2NjBYLy9xNisrOGNhckw3Lzgwci8rQlo3eWFjazR4aitSbmJ4MTZkSnZMMTU4OXJ4NW56dnl5RU1MM2ZEWjI2RW5uRUZFWm1mZVQwUXdPL09RZHNGTWNZc083aTBaWDdHK1FZeWFjOTF2SDNnWURBRjQrT0VIZWZKb1lRL0JJbzhBb2ljUkl1RHpPbkRaUlFtUlZ6SU9MM1FTZm1XemliMyt4aHN2di93eWJBQjg1Wk5QSXhVK1dhMkVhWHBtYWt1WExsMjhlUEc4ZWZObUhqbnJ2U0hJWStjdFhxcGxyeVo4MkZ5T1FxdXl4NVJXZ2dMQVdrMFBBaVlDNmFYWFgzLzFEUzZoWFl4VnY0UmtKNW5XVDZmdEZLQVlXdkxZU2NaMjloUEkvZjJ2di9IeVMvOHdPblR4SWc3aFZzenhqSG56VHBnNTg4QVQ1UFRQbmIxVWFtYTczUzZVaFllWnBwVE0wVzZYRGxFa0sweGhLajA1ZDdFN2Z2c0F6ZjN4ODROSVVCalU2d1JMdndHQUVCWGoxcy9JOUROOTliT0Yrdmx5UW9Ga25aMFNVVFNyeHM0OWlKM3RvOTB1T3hoNlJNTFgzTVlkNjh4Wk13c0xiZFlaMzduVklVaklzbENIcFFNeHpaTlRTV1ZkMVNoSlVtNC85UHRIUVZndjBialVMMkJoRnFMTm1YSVVwTklJVnlERmh0ZnRaNjRURDRMU0VMVitCaDB2dXZQdjhvN1p4ZW1tK2hHTFF4QmgzcjUwNlRYRXNSNDdhK2IwUEZJNzRleGJ4YTZySHMzWS9sa2ZtK3dsMFdEbEEzLzgyNzllZWxWUUVHSVJVdXMzamxCZjJNOEljVHE3K3Z1NWgreG43SVJ6WlZ2WTJTLzVVWmp3eWhQS3ljWU9nejNieGY0cWgyYm5oKzR3SEI0KzRsdVhYdk1kSXNoWjcyS21jOEozYmpNaGtvNUJzSkdreE9jcGFZakttcnRNYVl4dXBHRkx4eXU3V0NPSzV0L0oxZE5QZlJwVHhpN2gzdEJpbkFpUlVqK2x2NU9LcVI4dkw5Rmx1UHZsYytTL3J6ei9aNFZGMHZNMTJXbk1ZcjdLVlRsdThuTE5OZC9HQWZMWUNjUjR3cTM0UFp6YU9nMVNQQ2ZZT3Z5SEh1cmVhckpEWkpPVVk1R3l5V1FIRFlzNHV3WUczdVIrRVRmeVR0elMvWFNjUWxCZElzMDRjRnJCVlNQQU14K2ExdG53MzlkZWZQNEppR3lhZVQvRmVTYWEzcTdSZzlQVWs1VEhmcWxWRFBRMTg5bWdYWE1OYVBGejJTTThhTmFjQmZOTHgvK0psWFhybk1vYmMzQ21STkh1a0p1Q0hhM2lXUENydStIdm0xOTg4YlhYZHJJRzMwWGhHWEozUHFGZlRrcjZXWDdaVDVVbGdweEVxSitubUV4bS9idGVlKzJWLy94Nzg1L1h5K2VabEN1UmZkYzBBMFhwU0JVSHc0U2xISnJaVXB6MDRFN25uWkFKdjBQbXppLzlVWVpmNCtUa1NHU0hyL0ZwbXZGSU5iSFBWdWNwMmN5Nnh4NzcrK1ovdi9qS2EvL2w2Y1JPcGlwR1pLZWd3dEpHbGorcXBDWFBTSlQxR3RoLy9nT3NOai94MkdNMWJFK1p1K1k3SXl2UExyR1JUa0kxZ3NrRE1tSk5MQ3U1VDZVL1YyNGtOdUhXNzV4eHdyZ0p6YlE1aTc2YjlUZk9POFdiU3lDTWc2bGR2MmF4UERtODlZODlzZmw1TEVTTENFYkpxSlUxTDgvNkVTS1EwNHZ3dDNuejVyOC9CcHpVZDlBTWI2Y0pvWEVCR1JLUmlUeEJaVjlrNTQxajUrMWhSL1Era2J6T24xWjZlN2JRR0x0eGt4Rk5ucWJ4cHFFdVUxcURQOFFXTkxhb0hhU0k3SW5OMlA3OUl0aC9udDhzMjUvSkV1dG9HMDlJK0xFWW5vQXowckFDTzExVTc0bUhyem5qV0V0dXMzTDZkUWVqN095RzNTdG91RkQySjcwY1NScGxPNjBSQWNublhoNU9Vc1VkM0hhMm1kMGhFOEhONWZHNHlmc3FJU0FYMDZ6R05IbFVTNzU0VWhQN1pMMkNsbVR1K0p1M214WXg3NlF5VDFPejEvSGU0Zll6Vko5NVVFNC85VWFOZkZsSjByZCs3N1pXTWt0OUhIenpGcGJ5YkRabTMyd0NYZW1jYVJLNEJibGpxL1Y0TmdWM3Z4bHBjNWwzeGRNV2pBU0RiVzJCVFI0UDNSVkZsZFFQcGRFTTVpTXpLazZUanBjcDFIeE9hSnJHNkpwbUd0NVNuYS9KMjArOXIxYmVRbU5IcWlVN1lEWkxTN1o1MTEzaUp0T3B0K2VLamZ6NDh6RDZtcnVoeDFuYjBMZHlkWVlqa2NnZ3N2QWd2RzRQdHIyd2FaT25WbXBYdHErYWVUK1ZjYW54akFldkpXdE9hV3VhdVRrMGVVOE5ydGc4UVRPK3AzbFhOWFZjMnJabVZydFlTdDE1dmhHTGhUMWU3N0pES0xoVGN0YWJ4MU0vcE1kajZHdnVZbEczY2hTMUlVU0wvaU9BRVVJd01oZ085bXhyM3VUenVPVEQxNVRETll2VHlEZEpITFFVaE9WcHJwbHd5VnN3bjByRzA4VklqNnVldjU5MUVMQU1DV3hOdW1NV083ekJDM2JYeHdpNFhDTWM2SzFoS0s3SDBkZUJna1hrMDhVVkhDUnFHeVRrQnRVUk10NFg3R3hyM2xUdmNScE9UK1dvTmU1bmt1aEtvczNlMy9JVTUrcE9HaHMxOGFKdVdqa3ROT05xeVp5bzdLS3RkdHpCZHNpd2t2d21aTGJiZzdoNWZYZGh6YzNJblpzbkNGNXllTy8rdC9mcUlMdUFkTHAxRXJWRkpHSlljYXFGdzFTVU95QVVnaC8xV0o5dXBwYVFYWXdtUFpTbVZaYXhFSmdzRzR0MXBWaHBjcUxLdUh5T0pUdTFsTVhWelJuMlFWa0Q3NFlMcVBud0E3emxSS1Fta0U2MklMR05KQkpqby90aXczcFV2R005OTVNVWtFQW1DekdzOGtTWWc3MFlZYTN4SUNRMXBtMUpwV1dZYXhrMURVc1k5aUZQSHNHSnRlWkQwQWc3OU4xMEYrUUlEaHhsRkFRM2duK2RiMnh2VEIvMjh4M1lnV0JRZGxSNEVZYUdxMDlhSkRMSWwyVm93OXQ3MmxvZ0ZMcU5CNWk1V1lVNGMxaTBqbmJHWlkyNlVNNEY2OEEyL3VsbXBWU25pemhJckRUMjZsdVdlNGp6NEYvczF2R1A0TURmTzVDZ0JCMU9oeE5kK3ZFUkJtRU9qS21LNUptUlNGaVNHUStDaW12RkkyRTBJOUxYMndFbEJRcUZFQXpoQ2Yyajk4SG1RUDAyZUk0R1l4cWVqbHNYejlYd1hDZHVHNmZHMWlEcjQxRUh6L1RKSnRFS2JDazh4b2Z4ZHVtR05iUWY4RS8zUkNOSHpkNExUM1RRdDNHUTllSE5ISnFUN2FlRDc0cURIb0htWkhzQTcrSnliL0RJdEJnN0dQV1g1UGdqdERqQ1JmWDRIdng3WWFPZ3VyM3g0U2c1R3MzWm8vakVTQVFESTdBaXhoU0ZUbGkvdXJLcTdxbm16dTE5SWd1bE5NTmNxMEVhQ3AyczJmRVR2S0dHR3dDL29vZkdrQkkyRHJLVVJocWRya2VhM2tIYmt6V3lnNTRKR21sYzBwNmFwdkUzYy9MVjZUSjhGbjNGQU9oMHlwVHRINTZKQnpVSG0rdWdlNDduSTJJTkFJcVQ4c3BEZVBpREpkTnpFeHhFdUVBOHB1OVBFR3lKTWZUalJSNXlXcm9pSEpoSUlTTmNjZUZCaVIrREcxNzlLMmEvcm55c3JtbnI5aUNUWTRSdFNRcVB3UjVhRlRvMVJsRnFmaWRtQ1ZQZGJ0S3hVMXVMdjFBWUVkQTByamlObmZnYVdZVzFONXFERnlWTGFGakRnZ1BYajFDbVJyWkgvekJxSFAzNE9hU3g5M0x5M1NVS1JqTmRlRGNiYUJqemNXSStpUjNSbnZkYk9TZVYwQm9oU0NYeGI3eVJYK21MeFdQTjVKaDlTaWFpSnBiZ1A4T0RFZVl6S1dDVXV6VDl5bVJyS212cW5tM3EzcTZBeCt1RnVWejdlbWtvRko1TmFoZlM0QzVYTFhJUStPQWJHaHBnY0lNYmd5UnVqdW1PdGpyRlorSFpOS296Nmxlb3BqUUhWNy9HM3RSQmg1bWJwTjZRc1VhRHlHdWhnc29qcUppY296UWRtLzlMSHl3cG1aMHp1T0c0L3ZZWStUMU1rRnhpVHp6ZVEwN1RabzZFaVN2Q0JRTTVpUVZOVlhJbVcxMVpUZDBvQzMvQ0NRK0c2WmFETzlwd0tGekhHNHNwVWFPTjZGd0hiWVcrdkZzNnB4V1FHaGVYeHM4REloWGlqa1dvcEdHTWgxbzBtM3BGVFV6aXorUUZvY0kvYU5JZ3dUQ1lUd2xxc3AvMDNmdTFENkZxSURkdzhQNEI5Q08wQkJ2NlJkUEVQbDBQa3Azc01URGg0U3lNSlNPcmpTWWhhS0F1T1RoaHY2bXNxMnZhaGdpbXlFcEpLSHpjNDJTdWprcEY0NjJwMGRNZG5jVmVuOThQRC9LRTI0eVN4SnJVbUhTRnB5U25BWTF2WEhsYzd3Nk52Uk1XRlJhN3g5dmdoYTJqOE9YemUvRjc0WGRGNFF4UFJxUGtCWFlBVDBaTElmUGlXWDUvSUJ5TlJtLzZXa25Kb1RtQmcvTzJKeDdYcWRydzcyTHVIOVozazBNSWNoOUl1aW1Gb3hzY3BNRXF6Q1FYNFpsa2R6cmdKRGU2dnE2cG1icFI2b1M1dnJuZ2Q2QlE2RWVoa0hvcExoSHVVZUZZYWlFbGFFRDgvRGpHK01rRHM0UVdxd2YvS2tSSmNpQ2FiUEM0NVNCbmN5MFJOSlkwT1EvODlJeEFvM0NPd0F2ZXNzL3I1M014Rmk5N04zSUtJWDQrcER5MElwN1hHaVgyOFpLcHVZSUx4WFFkYVcwTWdRUFZqY1QxS0RtTU1NdjZPWmNJQzBrUlhnZEVCREl5TWJ3bUkzS0tHMjNxN0E3ejgwTktlYmdNdzVETk5BZDhIcGRUVS9NRWpldUY1Z2dVbWRmSFd0elB6MzBpU1Qrb3grdWhoa0tVd0lObUMxNWVDWXlFaWVxYUFQSDVEQ3Q2cVJyUmFsNnlMaHFuM0c3NjBVZExTbks2aUFyZ2R1djZQbExEb1Y5V1RDUkdZbkVDempXK3VnWUZXTjRQSFU3TFY2YXdTdXhHdTRNc2FFcHhWUFROaEVOQlZCVTJlRmdTSWpKM3JrSk0wR3ZRZ1U4MHZnL0poZzF5S0lxNmlJL3pLdE1saU9vYVJGMkNxOStyTElIODVKc0lXKy9QcTZvK1VsS1MrUys4U2ZZSDlEdnJVQXlNa2JRU1FseGlSSThQWTlkZWk1dUtGRzVTZnduSlRTSmNacVppd1NLdnpNNllHeFZCa0o4NHNnc1hWU0VqcHdubmgveWhHNWRWdkFWOTdNWG44M25sZGxiYW15emtsU1p6TGZuOE5NREpNUXhzeTViV2pxNVFLTlM3UlZHbWRGSU1BTGJCK3FwcURHNVJMdUE4bm5vOXBvOGthRmFKZERlaXg0YnhJZGRLWjdrZ0kvVjI4VlJDMGwzR1FTNGRRMjcwbWFiTzdXRlpkUkpLMnNFekdFSTlwQUVFMGNVVEdtRnVpSUZlcVVVNUdDOXpwRjRmMXlTV0tJNVJmS1pmV285THFiR2xwYTJqTjlRM01CQ1ZySzlSQnVkbFRyWU5jZnRERmJLUDVGakllVHorT1BvRld2SWI2eWpHamUxbk1jNXRLdDlFeVIxSjBZUjlFdzVPR0xqUnZ6WnZ3OTB5VE8yRFFvOWg1dFlSeGlENDBoY0NVQnA2NUR3RzVPZHBJSkhJSjNQdythUWtVUUxEdkoxd2dUQVEyTkxhMWhNTVJSUllpdTBPc0szSjRYSUk1dFJWTVhEWi8rb3pCcmRKQjNDSUdqVndsUmdjSENUdnBzS3VFa3VLOVpod1RHRUZIQzRJQmxOVWNoTm12d1kzMnJ5MU81aG1QMm9RVllkRWpJK3Z3LzIrakFkcFZ0bmorYWxIVkVZRExWdmEyanQ2Z3dNRGcwbHB5VFlrVGdwYU8zaDlLRE5wUTlUQVZVSnlVakkzSjNBQlhZOFRZZ2tzdThTK21ENklQMSt3TGlnSEZCYmh3aUxTS1dtN3BMbnMwc29zYlhWbFRkMHp6WjNkOU00SzRTRlNYb01LN3RnUkRvV0NvWjZ1OXZhdXJxNzJMUzNZQWkwdGFLZ1ZUMjF2NzRBbEJzSURRMm1od2hZT2QzZnYySTJHZ2dwM1REQUVrMnVJNERDNGt0S3N1Ymt4T0ozK3lEcVIzRnU2SGlhZXBZMERrL3ExaE9ESXFSM21DM0hMS3poaEtCdEZDUHVVTWw2eGlESWpmUjdqcUN2YzE5bloxTFN4am9pcHFxWVBUUTM0alFaQWU2amdzS3NzbVpyMWxSMm9CdnpjVlNad25FdnMxZlVlQXE1WnVFQng3RGlmNUVrbVRUSERnOEtyRmd5Y3NOVzRva0Q1cUZvS3lyNEN4bmJuaEtzdjNObTl0Zm1wdWhwQ0FqOVZvMGQxVlUwa0trdU94cmd0TUxHK1NsWmN5VUhabGdSUWV2cjBlSHdFWlpPNGlJTW5HSDhCdTBxbmgzaEdjdkJoZXV6aE1PMGV4ZzNBVWdFbDJTdzRPTW5XUUVKYTE0eHJDdE5scGl6QURZV0QzWjFOejI2c1l3Q3FxcXVycXhnM3pxOE9MZHRvRUZ3N1RLdG1DMzJFM3VtVlpVMkFPZzJHNC9IOVk3aXpDenZNZDNROVZrK3pzSkFJWkpsSUx4L0pTUmIyYTRpR2YyMXU2dXp1RHBMZFRpOTJRYkFNZG5kdmEyNzZ5OGFhS2l1clZoUkhucnBoeFM0RHVKNW9OTVJYK2lpN3VYSk9OaDBvdUVNdUd0ZmZSbGQwVUl3RHliMGRpdzI3TUxaMXpnQmh4WHQ5RGZBaTVwTVlCLzVDRTByTGZsTlpXZDNjM0x3Vk9NS2pHeVFKMXRkSlJqcWJrZjIxRGxCVlc4SVNlcFA0U1NTUjVNSit0Ym9QMFp4U0JWZHkwS0xhVExtUjMxcVA2UEY5WXdsQ0xqR2EyS1BId3F6dWNmV1JleWpEQ2pSRHpJK1EyeXdIbWZZR093dk5KRzJyRkhxUkJTVEVROUZVcTU1UTRhWElycnFhRFVHVWUxTUpjbjUvT0JwOWxpOHV3SldVSEpKcGRrbjZWM3NnT3hrbFBTZWpvNG1SZUZ4djRSWHJKdDREcVdabXhreHRrTVZCTlBoc29YbWtiWlVLcW1TaU11akplcjVocExvdGFzb3JvVngvaWk4Z2d5c3BPYlEwRTlYUjN4SGVRbS9OR3h0RlllNnR1QjV6ZzZ0MDRUOW5qem1uNW4wV3ZIS1RYQ2x5bHpXRjVwRzIvVG9GQW10V3htbUtwMlNJMGVCR0FOZXVnb09RdXBFdi9wRVMxYVovTWUxWVJ4eWx4OU13SEl1L1JZcUIwYkVSUGE2SE1ESVU1MXhPZDFCS0dkWGJZdVhZaHk4ZTBKS3U3d0ROVFN4c2pXVmlVVzN3bjlWOGpxVlo2N1Vhd1BXWXdEM082WDYweEdRbnBkY0Z4cmg1UEdFZDkxYmlwSEtmUGh6M3cxd24wMXh0ajBnOXBLd2tIREZtS254a2E2RnhwRzlya29DUS9LT0liWUtuaFhPVVFpQmRCSUpjeUZSLzEvSGxqSXJETnZ1YzhXVW4vWFozUUkvcGUwbVFHOUZqY1o2YVVORUZRcGxWNGI4cE5JNzBiWTJrTExOcXBGa3A1SlpNc1VHVVZob1Z4K3Z2S2d2RlladGJtdnAyUzQ5c1EvSGgyRjdNRFgzU3lpdHp3NitlUUd0UFVIQktmVjExVzZGcFpHQ3JqZm95WkkxeWRpa0daWXJKWTE2bkNSd2tKejYreldUZ1NrcW16VjJTTkZPcFZiaDVBc1Bvc3dQNzk2RlB5T2tkTkw0eGJsaDI2TW5qYjI3ZndhK2Ewa3R3MGpWT0lyMitBNm5iWkR4YmJmUnpDaVZscHRFOVdrM21yTkc2VzlrVkFtNFJsRldPcHpoc1UrZGVZT1V6RGRnODZNTTZzUmhvRGYwUFhTdWs2dVJQMHNyZVFGdFBrTitqWi9yZ3puc25wVVJHMjluZ0w0MWNrdmpNcE02MUdxRnJpa1lqS2pnb3dMZnlwVktDUTNiWW9pVkt1NXVwZ2RWREVSNEhmeG1QNy80UWFIWDIvSytjZnkxbTVoVGtPRUE4VUwrcHBXUEh3Q0N2dlhHTmpvZjZ1cHZxYWlvTFRTUk5xMDRKd3BSWnNtbXFSSzNCUHh1TjdsYkI5VWFqdlh6SmNjRWh3MTlkVTJ2TmpKSUw2ZGhQM3ZSaHNkYU1PUXZPWDJJWktUbERqeS9RMXRzbmtrb3A3UVIrZjFsL3dQT1RrRlFyLzlWR21Wa2xNY1pDZ05VTmVQcFRKbGZaQlNqNXNtbUJRM2I0eWVjdXV6TTVPVThnK09iUVR6OXVzZUxza3hhZGYrM3RqSlpUNVlkSDNRMkIxbzRkMWxjdGQzUTNienlBK1pseG1BYXFpYUpTZFZrYWM5TWs0RnFndEh1Y0xaQTJPRUp2enFublhyaXMzZ3Jjc25NLy9ZRVVhMDZmdmVBclM2NU5sdXdRK1cxcWJ0dk9MenVIeFUyMFdIL05mMTFmZWVCVjVnWUptWUJZakZqWEQ5VkdLVlk5WThvcUc2T3N6eXRqY05TbUhuWHlxV2RlZE5GRlM1WXRXM2JoaFJlZWUrcW5qMG9GVGJKRDU4NC8vOXFVaFVadFBTUXZJVG55RGJJTUpuekE4VnVka3BHeC9EWkJOYVV1OGtBekpDZmtpbHdqR0g1Rk5UblRaRmJnY3JXRFpuOEIzS2NiMzVaUEh2aGpFQzc4NnNJVEdqYTF0QVVIa25TMUFMK25EZ2grcXcyZ1V2aERRMGxuNG16cWF0bUdlMDRhR1RZWVFCZmtvbitnQzFqMm5PVEpEcGt6L3h4d24yNlpvTnNsUnR3dWp6L1EzcU4rWkZXNnFTamMzVlJnZnF0RlA1YXNubXFKa2dyTFdJMVhzOFZGV3NMbWRrTU9TWkFoZVBnMUVCVlg1QXFpT05VT216dS85TG83WEl3VzBoOG5SMTdxSVhrSlJuamF5ZEJSUHdyNVo2SDg1eG9qR2N2eUxidTZIUHhpTytGRndEV1NTaTY2bml4MEFJQWpObTMyRjg0NS96b21OK0k3M1c1SmdLNEdYMHQ3TDc4TmsydVAzZjVYQ1AydGtSbytSVVdYYXRTNEFUWmVBNHhhbU9BSU5uOGp1bDFvQU4vL1VKMW1VcEUzZytMdmdpVy9JQUVQQnowS2tzblF0UUdTbDQ3Z29Dby82Wk1JZmR2enlNOXdQUzRKUG5OdkpSczBDRlFlaGFSeWQyTWpDWERrQlEzMUluTDFWVlhyVHk0MHFDUTJDNHEvNis1d3M2QW5RaDgxVnoxRVAvekJWSjZ5eU5WN2VEQzhQUi8rczlJb2x0eDd1dGpnZHBSVU1tcCtEakJFNzBDNnFkQ0VVdHIwV1NSN2NibGtaakpDMUhNV0ZCOEVaeGRzaFJSQmYzWHZIajg1d3pDd1M1N3NKNkduR3ZLVVBZMkNHbjlsNUQ0OGZ2TVYzR2I4Ny96emwvelNyWmdjQXQwYmNNYzE3MjhSdDByVEVCZ0piOS82ekx2QWI3V3hBa2lqSXlYTkhwV3R3R2FMWDBCakNQMk43ZWhtMmVqQWh3cE5KWDFEeGQ5MWJwNXVHczNsYnZBSE9ucjZlTjFBMDdvb0VRQUFBOFJKUkVGVW5TYnZCNFVSekcvaXJodXBGOENOOTJsWmljM1VVV2xaTklEZ2RxTitFOFpLR0VhNXBiV3I2OTVDMDhqWWNQRjNuU0k3ZzNrRFVMdXJuK0NTN3Y5RC85MWJuNTBRZnIreFZvdWdLS0JRVENaOVZWZkpycGJYQ3VqREEyMkNtOEJIS3ZIR3hvc0x6U0ZibXpGMy92ay8vcVdiZGJxWS9XZXREOXpuRHJWMnB4VThZN2c5UjM1cXYwbVZyQ0FMUEVtRVo2b1ZBRzROWkNib1loemxKRVU0THJ5UEZScEFiallOWFhyNHNkdGwxaDZiQU82enJUYzBHR0YzL3B1ejBPejVyVEUzZmVhWDNjeGc2N2JpS05ZcUtDbmtzUHErVk9pV254ZzdiTTU4VnZ3bE1lRFgyaUg4Sjc1cUcrR0ZJTHI3SmJ4OVcxTmRYV1VtZHlwVmpwTWJWbGNwTHROQ1h2SnlWWTl2Yk43V3pUOUlFbXhNWWU4VGJzeG16d1g1M1pHTUhmYWZLUDcxaXZLUGZBa1ZjNkcwZ3UvdWhCS2ladndjZEUxeUlBWnhXZmMrOHo2U2pVMWJ1NE9HRDl1Rmt6SGIxTmg0NzNHRmJ1bDN4YWJOUnNWZlV2bmhtdEM3Q2ZMUFlNUjQxVTg4WTE4YTdON2FuRUtFbFFZQVNkbndDOXRxcmxsVDkyeHo5NDZ3NVNkOGVwT3I3VjcwUFY3dlk1c3haMzZwc2Znem1SY2lJTXBBa3hZUXBDZ01iN2NRNFJvRElha0xLL1VIUGVxZWFtN3I3ck1HRm8zdUhncjF0Z2VTWXp2dC9ZMk5HMlF2cGRlTmc4L3Q5bmdEcmUyOXdRSDZOUXpTaDR2b3pXanNRMzVVaEtEQzFWWlNzK3E3SWhOcjZrQmZXN3UzSitNRkpYVW8yTlBla2lxeU5kNTczbkdGYnM4ODJ5RnpGdkRpTDdVRXZZRkFlMGVROUtKRkZPVXBWNVRRNTcvRFlRaUhuYzNOejJ6Y1dMZXhybTY5aks1bTQwWTA5ZG1tcG0wQXF5L1ZSMWNId3FHdTl0YVV3TEN0T3UvNFFqZGp3UXlLdnd0K1BKNzdGQWkzNEsrM0dHUTNVU2hmK0pmYng3OHBzSjZPMWkzakU4UFFQdjBlNnVKNnQyemE3QzhzdXVESDZlRkQ1c01xSkFnanBDRE01UXNYQmdkQ3ZWMnR5YU9Za2RuRnB4MDNTY0phbW9iN3p0S1VIMU9oTDRBdUJnYkRHWHh4Q2JYZGtZRlFxS2VuTlhVUVUrMWVZUFpldUFoUUdKdWRnZnRrdGdGMTlMYTJkM1gxaGtLaG9hSElrQm5rME1EQVVBVEQ2dXBxVFNPQ0dYVjJhWkZaV29hS3Y5SjAzV2REOGdadlNUTm9KYmQ3cnpqdjVQZDRSMlFCN0RCMDQ4UTQvRFo0YzBTVEZObXFTeFllWDVSWkxuWVl1TTlrNFMrRjNMSzJWVmVjdC9CanhiUnh3Z3lGdnlYWGJuZ1g1YmJxaWtzV0huZDRvWS96L1dvSHpaNUxIZWhFWVFzQXNOTk9QcnFvc2Z6WXRLT09YN2p3MGt1dnVIRlZWclJ1dlBHS1M4NWJlTnJ4UnhlcnNnTGE0VWNmdC9DMDh5NjU1TktMVjkxNDQ2cFZOOTVyb0lTbXd1UFNpeSsrK0x5RkM0LzdXTkVkSHRqMndUd204djhQa20rckZzS1NuQ1lBQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSI0OSIgaWQ9InBhcmFsbGF4X29jdG9jYXRzaGFkb3ciIHdpZHRoPSIxNjYiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUtZQUFBQXhDQVlBQUFCUTY5S01BQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBSFhSSlJFRlVlTnFFWFcvRWJsZDJYMnUvcnhCQ0NDRWs3a2pkdW5WSjNYSEhNQlZDS29SVXhqQzBPcWFVb2ZwaFZOTXZqYUUxTmJTRzlrdERDYUg2SVJLbFk5SVpNem9hdlZxOXhGeXVpVVl1SVNibWFvaUdFQzdoMmF2cm5MMzNXcisxOWo1dmJqeDV6L09jYy9iWlorKzExNS9mK3JQNWg2LzhLUlVTb3Yyai8yY21rVUlzUXN4VmYyWDl6OC9wLy9aanBxci9GZjF2dTZiWU5WczcyL2Z0NjNiOWRuNzhmdnhQcjRmMjJ0VU1iYlluQ3Y1Zis1SDdWN1hmaGF2ZHNiOEh6KzF0L2RQWGcyczU5RS83OGJqMjR5SG96d1A2dVdMdFRuMXJ6eHBOY1c4RjI5N0hwTjN6a2Q3N3dSalBiWnkxdlZ0OHdmajRlN1J4RW1KcnVaM244Sjc3SExIc2ZhejdQZHM4bkdqZC83TDNqdE1jNWZGcXYwai9mK2wzbnZiMjkrdTJCcXIzbzlKWmVDYis4M1BGeGluVDJUa1NwUTBDaVQwQUwyYkJBYWRPMFAxMkZuaEFoUW55aVdGY0FQdGdTeWZHVXlDcWNSd0hVR3dpOXVQK1BLU3BRSlRjKzBGMFRTKzZUOXU1MWs5ZDFkL3YxOU1QYXg4dTlRbDhSSzk1ZFBSenZGZUJkNlcwUkdMZllFSmdNZGpRd0tRakFXNUV1V2p2TTIzajdmNHU5N1NQNzJ4OTFIN2QwWFkrMWQvdTZuVWY2dC8zOWZQeGVQYTR2eEdKejBWZTZJUEkyM3pVTnA4N3c1SERkMnlMV1B5ZXJXOWp6TWNZZFJvWVJMZS9HOGNXZlF5cTB3bWN0Ym5YcytkRXJiSDJVclc5bUZCcWRMeHJlN0h4NHJTdjFOaUI4RUw3WCs3RFVvRzRxUk9XMktwcUU5R3VMWDNnQ05vYUszUGlvcFd2YWJ1WGRZQTJqblpKZjd1c253ZFo2bFg5Zm4vbUxzaWxrWUJzcExkK0NSS0tEdE5HdkFjVDE4YkE3eStoemNGZGF1ajNpcHZBK2Z1MGpldjJPOWNuVVJMeHhOSGtqcmIzcVI3ZjFxNThvdjI4b3ovZTFvLys1VTlvakoxMFJycU5iU2ZPSVJIYXU1WEFkSERoc2ZXeDJvSnEwck96Qys2MDBOc1M1aFhmUDNqZlFiQmovTnJ4K1dESkJBL2Z4Ym10S0dnV3VBRnlPT25rNTlkdTk1NXMrZ2EzYk53WVdYZ1RxVTRnUGtBTTUvWExBNTN3dGdtNzNNWHFaVDExZGJ4SUhBRHhRVGNGSUl2Zmcwa1FpU0t4Q1B4V1lMV0xjY3BHYUZuOGNUcy8xSXh0OFhkT2cyME1GU0F1RXBRMG9ENXhYUkh5bFQ1LzE4ZFAvdTcxbzQxQTlWaTVMcjNkaUpYZTArbDlmNGhqSnd6dlUxYUpkc25XSlp4SkNLazJya1ZBZlBNSk9SbjBCK2NKVlNkSmROTytuODlDYXJCWWdjRnRFeXpzZWhIRGd3ZGhqNGtiMzIyRjJjbzdXVmVOYTNBUTBQZnJQVi9leEswZVg5UGpLM3I2aWg0L3doUUhQYWdaL2JtMTY3WmIzMG9pZk83M2NoS3AyRjdrcDlYR2IzQUhUbUp4ZlBmM2RYSEhTVVhhM2wzcWdnakx6STJqeEdtaWVmU0JnbUtEMTFXekQ0RFJQTncvVDBaOVZUN1RlOTdXRnQ3Wk9PNm1KdWd6YnFxT2VIZHJ0cGcrSy9acERJQVRJVkd3SVV6bjdHTSsrbCtNNkpGSVY1elo3Wlh6cUdRM3BUbm9LNW45Q2lXaTRERFpxR3lqaWlCR05HRXlMK3NUdjZKL3Y2d0Q5cVErKzVxTHg1b20yWFVtVnhFcWlOOUJURGg0dGROOVZ4Rm9WaEdPREswcVRVUzVxR1BqNWlVWUlETHh1YVVCMDNWZTE1VFhLa0lrSU5CTlJTWVZZVEFRQnIzOXlPQUExYUNwQ3lUWHV3VHk5bG51YW1zMzliRnY2WHZlMVBsN1M5ditqS3lmTWkwY05MU2tjOXJLcFM4YmxJRElFR1F5VG9QT0tNQXhaWWlseE1aZG9RYzJUclhUOTFDdTJZd1lYQTF1dFpsQmRFa0g5Rms5ZmtaUFA5VldzeVJyMXBWM1JzNktrejRXa0pSbStVc1d5MlRpUEM0d0RoTTU4QURUczZWenArMWRWQ1M1dU91TGR1ZHVUV1NaQVNhekpqV3JOVFVZT24zSldMOTlvbDE5R2h5SGtvNHROczZuUk1BMUVPV1JKQWdMUlNaeCtxZys0K3Y2OSt2TzJlb04vZk9tMHNBTnBZc2JVUUx1bkFiRXY0dDg3M3ZpakRJbVdwYnF5K2pUZWVZWXd3Z3g4UUFLNlhpRlFid0ZwZ0dObTQzYjdGYWM4UDM2OUdmMWwyZTF2WTBZSDBjOXc1OVJUQk1Nbkt5LzdEVFFYYW8xRWMxR0RoVzR5TkNOQmlHMVNSTVlxQUVaRFU1OE1vcGlVRVZzZ0x2UlFHaXh5N3pxTXhkR0x1bXdpNHRBdkg4c2VKNHNlRFp1UHhsTlhDZWRsRzNSTkNob3lkbEZBcGQzaHNSSlJPOE01S21Pa214R2xoS24vRXgvKzRGTytBZlVSZnhZOGdXTUt6R3BCdStVRmh3bHpJWEhtUHpySzMreWQycUlMVnhKamxOeTRwVEZST1BpMzRQNlVXTGszOVZybm0xNjQ0RzRDdmpuNkJ4YS9BaHI5SUUzTEZXZ1Q3UTBIUEE1SkZHM0MvQVVjT1c5ZmNQanVDK3l1dEFCNHhKemlLdE1YSG1Gc1Y2TVY5TG5Zb0daSTA4R0UwZmkyL3UxVUIyaVlSTFJ6QmtXaTFxNHFpSzNsUG04b1hUd2VrY0JKZ09uMFpNYndmNCtiS3BqWGppTlVYUXVXUkFLb0dJY3gxNFNNU2V1SmxZNnBkK25MV3dpNEVmNitULzl2S2JOZjIyRGF6Z0pOd0h3WVhDM2FwTlpBeFkzcnEyN3lDWXdBQ1N0T0o2bXE0bGJKNklzTmh5ZWlxZ0VpUlBsZ0s0eWlENzBKRlFUU29kZlJodnRXaHVmZ05HS0xXNlhIRUlPNGZqa25NSzdiZThraTNmRk1SMVFEU0lKTnRZU05lSG1BS0VnRGJ1MUI2cUZKRWVJWXhyNmpPdEtOOS9WbzNmMXZkN1ZHLzlDZjM0a001RnFSdEFwTUxaQlI3ekEwY3Y4b2h3VUprNFF5c1pCZHF1OE5YaFZ6Lyt0SHYxS2lmaWY5Y3JudElObmJUVVVJQTZmUm9SdlVMeGxDTDBORG9EMUltQ0UwTVFwODZTeGlhV0l6NDFuN2xJQytrRUpxNlBrNVhEQ09adTlQZUJ3YVAwZCtwUHJrTnQ5dTZyQlpLSjhxQVp1NGZPRU9HQ2ZkK0I2WVpBeTl0aUE3UUlTS0hNbE5LaWtqNFZyNEZHMVFJWlNrNDNDNElYYklienY2anY5cjU3NWtmYjNlVzMvakFHcmRwWXlveEI1SGtybVprSUlpNVRKRXVzNm40cHEray85OVgvMDJ3dDZ4OFBqSlp1SG9CSEcxcUhva2NBbitjdjdaSkJOL0pqWWVkVktHT0JoaU93dkw1endYSm00cWtGYUUrR1VsWVVBZXB1akNTNVI2bVQ0QkJDY3grS1M3ZzBaK0o1TSttR0ZzVjRCMHlpdW14SjExdCtKRTljY0FMZ0VhQnk1Wi9LaGRjbFlnbXdiaXc3UmgvSGV0UzlTSmdGZHYwdVpzdi95bkg3L29SNzhTajkvM3RVN3dHUTVvUlZPZVVObkxkRXQ1UDVRRjNGdDBIcW52cWJIUDlmam4yellXTlBkc3A0bnk1Y2IvbmRKQk9DY2s0TlAxMFFTMWJDV01xRU5RaEZ5ZlFXSkRQdld4R2l5QWhQV2xya3VUKzREV0xqTWFmSTRFcDVJSVA3Mkd4OW9pcklVMWNpaEtTeWowOFFOd3dJV3dKK2gzd1BPaStPTGNCOVAzajBqUmx1Y0N3L1lXRVExNlBjcTF1V3Y5Vm0vMU9QdjZlZWhScmhBSDRLU1IweE5LcEpXVTJTaTNKd2ZWSi9TU2ZxRi92QXZPaURYMGRlWkRRb1RLdjNseG9BTktDcU1uUlRVanBLb2tBalZMQ1pURUJGQVg3RE00bUpYOHJrbUpadDJ6dEltaVEzdGRJSndXSC9sWmhzTHpSZmJ5aVhIMFgwTGhDb1RzSFFDN0ErZEZ5VXMzb3YvUmE5ZHZzZFVEVWxjRnFRV3d6ZzU3bHducjltOGFLTEh4eGVqUEtqSDM5RTJmNm5IMzlFcjdnc0wzNHpHamhKdmhxSUVuVTFzY0FmRjYvRS82ZC8vMEZOUDRFQXpHQmhvVU5pQWN5T28zUnZCYkNLREdOcVkzSWtVakJhaWk5eDFLU0FDM0dlVGlBWGdPZDdUSjBqNjhoRTJ2ekhDVG5zYmxaZEdDK0sxSmhvbENNWDJUb3QzalJZdUVtb0ZSa0VBK1pBYkZZaXhqak5TbGo1cHpvaUNTSUNKb2dSeGwzU2MzMW5kQ1I0dktSY3VscTYvUHFEdGZrOWIvb1VlUHkxSnZSb0xZRGZHU3dleGF4OGMrTGZCUGUvcVRkL00rRnp1R0JJVXVwZDRRQmFTRlcraGdZSm00bmJDaUJ3MERvcGNzRkpsTm1qTTJpMEw3aDZORnVwZ3RYUmRhRmpSUEhTZnJNUUxIUmd0RXRRTjdpTFM5Tk91YzV0eFZoUEt3QUpQS1JPVVJsVERtS0FxRXoxTVVSa3FhUTU1SVlWRU9BVFlCRGR0Sm5zSTk0dkJpVjJDMllJVHBLRXJldnp2K3RtWTN2MFVFSjd1VmgzY3hGMXZkS1l2dkZuYXIyMUtxK0RERjlZd0FzQlpEK1J1ZVhMUWc2SnhzZXVJM1lJWEMrSHFBOFJzdjgrRFV2cEU4MlFocjFad3NVQ0ZEcCt3VFA0YUJNUUhzRis0Z2daWnpjK1BRUnpSdU1DRktvRUxEaVBCaUZQRXhzaDFWdTZPTFFGLzlDa1lIMGdvd2JnVW4xZ0dDR2kyQVNDVWNBb1ZGQXQrR2YxcWM3QkdVZmY1WWo1OHh2Q21ZVWdrUUlqZjFOLytXNDhlUnpSa041eHhZQnYxMHI5cHgxN3dsVjJKK1poRkl4ZU1rek5IeEdUUGljRVNZTUVQZzJyWHlZU0RjaDV4UUEvT0NNSEM0L2tzVXg4SHNhVFZDOXdJcFlaQWdHL2tRdWExWVVyaFl0Rm5mWVFEY3VKMlBKQ01qbXk0M2RHNXRrbWpPb0V0UVRYaEdnS29hWEcxdjNPWmRWM2hwVmNwRVAwQ3ZXQ2hTWitQcWdNQkU0bVN1Y1hKOHM4M1l4cXg4UUlpWWxPRVh0dGsvK1FQaFZXK0RNdGFLTkZFQ3d1WjZ4enltemlkcldJR2tJb0JsQy9pTHJka3lTSFJzT0Z6RURDd0lQSUJKcmRyYURLY2dvdlRydVBKNmw2cERvTWIranZXSlpGNERPclF5WWZmMklGMk44YkVQSFJIdk1JNWVwYlhrb0p4T0NFeGNzaCsydHlKaFNOR3cwb09SVDVpbzQzREMzanUrdXl4UExRNVovVDRpVEZIWmF4SS9mSHY5YkxuK2NDcndsUVBRQnNCT0tsTUNySkhITkVVc0NDVFNCMUdVMG5HR0UycnVoa3RaY2s1M0pNaWh2VTFZRHQ2b1hZeHpUWEVSTmJnYVNtZ2owWVlTWUtUZ0JlK2JiZHFrWU9oZmo1RXAwTnFqUmdOK0o2OFArQmdFRm5BYlk0TEI4ZUF5SXlMZGtKRG8yc2dETFBUcFNZbTRvdGZtQTd1b2FCYkJqeFVWbEtYSDlSelAya1FFelVjVXovUDZSUCtlT1ZuSmdoMEZTcVREakh5ZW9iK1ZRaDBydUZlV29TSnhaVUt4Ris1cDF5Y0FWSDAvQldKb1dQTXg2a1BBNnB5TmFNdXBOWGN6dkRJQ0VST0ZRZzh5Smp2YWxGUThqMnZJSzloSGFOSHJIQkVBbnpjeE5KUFVBSjRueTUyUXF3SkJyMTdZdnAra0F5OEZ1M29LZzdwSVp4dzRKd0hab0U1ZFVKR3V2UjlWRC9mTjZWSFQzNS90bmpqaW13Nms0dGY0eklRcDRjdXlNQlpoaCtPVUdjU0VEbVFWOVFuQjFNdUJuUlJ1SVpCbU1RaWNEYWM5SFZVVFlaV1N2Q0VUTzY3QUI5RlhRdDFOZ2JERFkyZjRIT25NaTNRaTRJMENDSjNNRVNSODZJTDNKNFhpNmFBYTdtRTlCRktJTHhRREV5T1RvdVlSc0lINFhWMXdtT1J1TXUwY1BwWS9MN080MVhWMk1xVDJ3R0twekhCV2RRVWlCVWMxbGlNcHU2K1pDYWJuTEVpbklBbDVJNkVTYWdkR3NrcmRRRmRETmJuOEVaTUNFTzFvWUtvcVFDR1MxYzlnaCtZS1dXNmxCRDBJQkJ3RXFMSUplS3JBOHZNcVJZWEdaRVZVWWJSdG94WXpBT0RKeGhvaDdhenFVY3QyYXNhcG13NVNVQXdqa0pJUURXeUt4TTlWWU43ZW44YXZTeEJlSFRDVElBVm4rbDB2ckNKOHFkWFdYYVNwQUFucmpqRVUrQjZUSlloeHdzOUNPK3Zwb1ZoM2t0dlIyZ0t0MFZJQTFNSlBEeU9BbWZ4MUdHRzNKK3NtTmQrTG9iSG9ZK2Nla3pxeXYzYUhBZ1lyZVRJeEQ1cHdpWnlPYmdQSTllUXZwQ0hZV2NLVlJ0RWlqSDVDNnM0aEwzTlZvQjUzcExVQVJIcWdTMHNocUc2Sk9Dc0FCaXp3RWcwUkIzY0dEMGRMRWhlcW1LdFgvVFUxdEtqQ0l3TzYwK296UHBJV3BVbGVvbjY2ajREaHNZZ3Rrb1l4SUh3eDJpV05VQWRYWHVZb1RpLzg3REdNVHJibFhhMGtOMlRVMm4yRzgvSWhFd2lpMU44SThJNkl5OS93ejFrNGFVSnJ0UVJyWldNbFBZN1QvN3NISnpoekVJbVJ3Y3RKRjVXS1JBWlFJZUk0N3B1ZTdRRlZ3SU43TThVWGlJVVk0Rm1hSW9odW1weXNyQmMyczdjYzVZNi9MWFZRTjA1VnE1T0NyR3N1RnZ0VnFaZFh4ZURFWFV5ZzBrQW9FYVlKSHNZT0JDTDY2Nm1pekdIRUxoY2hJQlRUR1ZXOG1uU3EwcFNYV1Rwb25Oc3NpMFF4R2lERmM2Y2dpQm0zVEpQZGt4eW04UEhQREdRSnlTRUpuRU1EQ1lrOW9uNXJFT29Zc2RuQnh3bU5pcW5FRXVheHlUZ29VekJlSzIweWxPU2UxdExkN0lvREg1WUJFTlpEdnlnTWhGZDAwRnBBWlBVb0VzWnB6US90UVJ2aFVmUnRHK3I1SzNoZVhBaUxTbW5CYWFocFh3QUI1OXoxVjEzcW9rYjFnVnhISnN0d2N1VEMwdDAxUUQxK0dpZzBOS3pGU2UvVEFzaTYrRFp5a1pHZ0ZGZ3FJZWlSUE81bFJDbVZ6Q29PenNlRW9RMWhlUUZGMm1PK2R6UHZiMjVKTi9RenlrbXQ4TUUxNWtiMm91a1VQb1FnVDZ0Uk5Ea1dBNzBUZFRsWkdFZzFQQnNFeWtTTGRBUk1MdGFaRjVsUkE2TUVJKzBsamtNZDlidUpHTzNuQUxEWk9tRkdmNnJhYUZCcXNISWFYSzBJaytrV0tUOHlndEV5VUFKK2ZFaUlmR05sOGxodERTeThsZ01ITnRENldUMk5NRWlZNkhsSW9QRis0UE5KWGxYcjN6Vk5id09KWERQQWw2QXd6a2tYa0p1SkMvMURQZkVzTG5kREJMcWY5dDFFZlFPRTh3Y244MjBkdkVsSDNXZW1CeVVhOG8vV084ZWg4bG1xWEtvOHROVWxaR1VoekdGQWI3SmdiR21ja1J1dlBMNVoxR09vSGtzNVZPWDZrQU1wY3NxQjAvb2gwaVprWUs5cnlYRUlPUUkxYUgrRGFjSDZybGlLRUQxOGV0cE00VXFSRkNZZExtcm4zOG9IWXA0VWJ2MWlRV2hjZzBCbkVleEtBTjBqMGFEeHpmbWdTaGMzWjJYQ0I0ajJkMXJRd0dmTkhFbTRIT1dOVlN5QXNESFJFd0JJVXlnVjFNZ01GTVJoR0lGRHNJUVBqbTJNQk4zWmx5SVVtQml4WFRFSSt3MUJ6ckVzUkNRSmlWeDdiVWJOQ2FycGNKY1JsU25HTUZhWktuS1lGa3V0OWFsRzMrelk0SXhka0dDZC9FdjllaGVhWjRPM3FqMDk3U1ZVeURHWHZTcUJwZVlFK3hZS1NzOVloWjk0bVZTd0NzMElvaFFSQ0RjNEFPVzZ4d05tQ2JwVVFFdmpGWXJvZ1p6d08vczk4WGdWV0lKRVRzSWkrQXpzOVZxWVdzeUE4cWxRemg0UGNKMkdOMnpjdUxsc1hCcFVxa1oxOFVqMWkvd2hSOUJUZHlEcUJtOGVSVEU4TUU5NHBtdEF6cGNNYlFKZEdkK1hiKzkwaUxZTzNhbEYvOVViL2xXY1BqM3FPc2Nzem5udXBTbEFuK1JSd05EOXpPWHlHQjRuaGpVcTNMTTVzcHF4WFNObGRYcVB2Mmtrd3BhclpPQzdnbHQ0b0JTNDVJMGNhYTE0Wmlpckxyb3g1eWk0T1NRRkEzS3ZERFlvaFRJa05GY1gya1ZrRmlnN3pFcWpKZEZDMm5DVEVNL0pZWUZvb1FBeDhWUGRaeit3Q3J1alVpZVBtSC9xRTE5VmY5K0duT1RlZUhTdXdqZ1BacUVFNlNUWnRGQ0VFZklNRHdlZW85cHJyUUlXaTFKSDh2NkdocHlrb3lpb1F0aDFtQko1UVRYNytlRTZQQlZqVkZJaDhaVzlxSFBzWTNaU1BHK1k5YW9XRFpweEVoZEpZb2l0QUNhd2xOWW54ekdiSHFrZllseGxSTks0dVpkQ1hDUnF4dUVNWnN2NjExS2QrV3pZVVM3NjZGUHV0NzJobjc1b242NzR3K1dvQU11Z3dGQy9VT1ovS1VDbFRjcUZHd0s0REhYVUozRGM1TTc4VXNTSzZrM1BtbGQ3MDFjQ2d1MW9ndldqS0tlckZZV2FicXJYSEswSFpEQXhsVzVYdWRNbEY1T1JWS09lM1poVnN4UURNYU9lUDlxQXJMRjFaVG90NVlKYlZnRklzOVNxcHF3ODRVdlNWMGJlVjExR2RtVURPZU5FUDlvKyt3MWt0QmpOUFNCV0FTRzN0T0x2NlMzdjBUSjlJK0ZCR1RoKzNRT0pMM3kxNHdYUWpHRHJtTmxRd1g5NlR5NXNPVEFrdlQ0MFYzdEVPZkV3ZklGeDVLSDMwWGNycUFGeW5XcFRvUVVaSmJrYXo0T3B2V3lNMEpFY3dYUEtaNFNLamVYN001RXp4a3VQT1IwUFp3dVJNaUh5blYxQ2ZPRWNMcFIra1djSStmd1A1UnlHVnhmTE03YjJ0NXY2YTh2MTBYWVhNSHFiZ1VTa2JUcHJVN050emZ1cWQ5dm9kVVlTYTFNOVgxR09MMTNQb0xESlZRbFBwbVN2WFJCR3RqTWsvaEZ2QzRiTHpGQ2ZvWk5SckRzV3I5bElvUTR1blhxaXpKWHpTaEx3NjFDcUZlTWJjVndQQXJ1em1FVW9MSGkrZXErUUtaQ1kwdHhtcnhabFNGU1BwWmx6RlkvTFdKTVRTWHBYaTB2V3NZSGttc0Yrdk1uZWs3cGlyK283ZDFhNi9CbTFBS1lYRG5VQ3RLL3QvWDdsN1ROYitueCt3THBvYUVLY2NpQmNVQTJleE1RM2tCclBJckRYZ1p3Q2J0d0NNbnlHTVcxcVZVUE1nZkRYOGxHVUZtNktFc290bFdXVlRNUVpMYUEzWklKTVZ1MWZLSGxqRjZ0WWtoR09Zd3BDQjR3ekNFZnFTakIxWmc1ZVZtWU5yd0tUNE40MFFvdXpFSUhOYVh1NlQwcWdlazM5TnhMV1FVUWtCUzlkSTJBL2lhQUw2Ykt1S0ptUE11djZ6WGYwTS9iRnZMR3ZQUnlJTHV2SWRLY0puMXFQdytGNVVVOEdXemxKMFk0QldNQ1Y1bWNobkpJV2FhWURnaHJDcTVnQmk3TzRLVTZDd012SEhWcjlLNll3MERtd050UnlHcE85cWNMQzFtTjlPb1NVaHhtdzJ5a2ZYRHdaSlZrekNSSk1USkVWeUZxVkpZNlBYcjVTaysycXpFQWFLc2IvM2Q2L0FYYUpiQjh1RUpnUXZTVmlGYzN5QkFRQjkrcHBUaWNkTEJmMWNaK1U4OTlWZi8rZUg2TDJadFFGcGw0cHUrTVFnUUlzYkRRc3A1UlRpUGdkYUtWNzY0QVFzYnl6VG1sN3A1QXh3V1BTdTlDdFRxZ0o3aCtSaWxXTlpBeTF3aDRwY1hMeVRJZFpXMWcxb1ZYS0cyNmNJampTbEFGZUJVdE5SWGxMWWVlc3BuVCtyUDZtTHl2N2J5b3YzOUJmL3N6bmZDUDF1OVhRckV5WTFvclIvdDRaWGNOOGlyNjZBMXQ2SGYwODFoRDYrbXVUQllqUVRCcUxLczNlek1xQW5CelFEQ1VkMkdvRUxlSzJjUWtxMXh6VXJvMTdjU0FwZjlRSjBaSFpZVzZQMld4SU5aUlF2bTNraXJtb1RQaUtHNTFSYVN4ZWtxTktRMVFvakhqdUJHeU85SjdFUWlWQ2ZESFJSMWRqM3M3OTdUOVYvWGRmbHVQZjAwL2Y2TjNmanhxajFZcE0zS0JCaElqQjJaWnhBbENTV3ZHVW9GNXZacHY4NiswazQvcEdHdUgrS1crM1Vjb3BKcnh1YnFvOGxaVDlkMHdnVHlYdkE2UVRvcmlXYTlxMThIY3VsMkJ4UFVnKzFOUzZVU2FkTWZNSFpGN0UwUjNZeHByc2ZGeC8vL0tFVEJsYVk2WVJxRUF1ZTI2bnZEazBvM3Y4bmtJaDFpY2FKZ0xKaWpGTXlBZityR2UrMFA5KzVqT3lUZjA3NXU1Zk04dXNZcUFQbDNBem9CMG1ENG01NE1JUmhLV0tmcGNsM0YrVnN4MTFCM0NnV1I2VXgvMHBoNS9XKy81aWw3M1BPMFZQYlpLd2dSaDJWSE1GRENPNW5BMVlQbGpoV0dtWHhZL0hSdk0raVpQVmRPSWlNcjBuYUNRL1VVdXZKSktVMDh1emVIT2t6VU1odmdwNXBLdnRtMFprZ2FUMW9TeVRRQnpaUVZwUzBBbmlOWWJLZVM4bjJ5eEx6WlMrRlRiM0tvS3Y2cWY3ZThuSVQ1WGVMNUgxczZXcVVMeUtIV04rVHBXbzFjNDFWeDN3OFlKZU0wcHdGSzlxZDl1Nm5OZTFDK1BzK3gxMTUvUnlYcGFaK3lob2R2WjlodWhBb1dYcmVaRlRYZXpCbVVPZ3NWd0x5eFN0ZHBWTFJlNGN0QkpsdGFvOVZOaUJRNi9NdTRneDFJRHI1dHdYeWpZZ3J1Ym9hakVldXQ4WUNralYxNVZSSEVWQzdCWGNlNXF4YjRnaDZ1a0tubDY2b2IrZGtQbjdJYmU5K2FxMm5JTFdSUzNJV1JkMHR1M0E2RlVqdFVqdHM2RE5jUlE0OUlha25rc1dMb3E0MG45WTRlak9MaG0xR3d3MDh2NnJKZjdpdGgyUzNoR3I5MjJUdm1LM3Z4SXFFQkJFVitNOVNucjV4UytkMTA0aHJDaGpobExaNlBJQ3Z2dmJLS25GdkJJK1NQMnlTcXU4aVFYVzRKWFlwMTVTamxBalpnTDFFSVhkem55a2RTb3FYNjdFMFRjY1EyNU9oWWZxeUd2UCswKzhwbU84VnM2eHNwYzZMK1VVRGJSL0tuSFhBN083ZmhDMXFzdFM3WDNrUmMwWmR4ZXZHcjE4SVNkRDBnanVza3FiS3gwbXYza2tOOHRZRHhVaTRxR1BRL1ozV0xnK2JtbEUzRExWNXRjMG1lcDZEL3RoTXB0cTQvN1VQRnVlU1Z0MFJTS29zcDM1NklBYnNmdDZ2Sk9EbklvT24wSGo3UEEwVU1FZTFBNWVCS1YrZnVxVGpvdkFrMkNHSjVDNldUSmdZSzZJbGoyV255anFMMm1hbDBRN243OWUzcThnZDBiSWQ3VXVYbXJRQlFZNXVnekJLOFlrU1VKR25lMU9NcmhndkhtV1YwNFI5K3pWVHdiN0x2VXhYWWhmZFZJbVh4dEJTeHN0TkJ0WlVJTjhJM2JpQVhSeWdjNk1SOW9wMTRIVHJodE5EcDJRWHRDajYvcXM3YmpoOTFUQlFWSDVTeFpuNm5pbWZSbmhueHBEczRCT3RqaFlTN2RTb3N0V2xMd2hLRUJkUXJhaUhucnRORHQzQi9kSkdMMDBkZXdEMmVGRWdzbGJENUxNNngxU3dudGpyYXdFZUsyUzlxZGZhcy9hcXR2cUQxamJuTHRTbFBuc0pBWXh3VjJ2R2NsaFkxYWd3NDhrbWxBTlRoZjU2K3dCUXZQSzMrT1pGbHRKSVMrYnR2TDBLSnR5SFFST2hqczVtWGFOdkxrbjdYQjVoRjhzSlVTVVFMbGE3VC9wU3ZLVFM5ejI5THZBTGp0SlppRnB2eWt1QmxWM0draEt1WjFPZGk0elNEUnZMOU8zSzJDUFI5ZmVITHhWdFR0a284QXR5Z3B5NkJrR2p0RGZLeHR2S2ZYYmZ0SnZyTnhRejNlQ1BDOURCMEpHRUFDVy9leFpIZElYVWloYm4xVTNtTkhpbTJvUllFSWM5bDBOUDd5QnF3RjFJcnp3NENNdkx2c0FsNndqakp1UnJyZXdKTUJFckdrTllzY2t1Q1VtMk9pQ2JhZjNpeEFlWXYyM2JzbzQzVFh1OWk2b2hkdld6bGYyam1zMEVPNktCN1hDZGlxMlYwTjI2ZUVSU1VoY0pqSjl3TWFCV0ZYYmtPY2tDaHF4U1k5TUFDSkFEY3N4a25mZy81OTJLRzVMU1R4amo3MHBML2Y3cnowSGIzL0h2Y2RlU1VSQkc3a2xiZklzMXBSWThGVVY0dFdVZmtoRWtuRTNKelp0UnZGOXd6bTA3U1ZDaE51eUhxZU8zN0VBYWNCQTBLa3NCSGRhYkVwRXkwZ0U0YWE3TEtNSE1xYktnMEQ2M2hIWGJyVmphaGJCT2dDYzNhZjdlKzViUk45MXRVRElHTFRxUjdRNHl0amIwVi9KNzRlWXdsaTV0KzgwWkxoZmgvb2J4OVJUSWY5V0x2NFBxZ2tXOGR1OXpiZTBmUDM5SjZkMk9JMjNkeTJaazVxQzZjTTB6R2NkZXowMXQ4dDY4RWVoVVMydDZXNVpJVmdON1lLMFU0bnBlRXpZeWZIYUUxVWsyeUJqQmpZTk85akQ4Ly9GMkFBRHAvOS9rR0I4V01BQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSI3NSIgaWQ9InBhcmFsbGF4X3NwZWVkZXJzaGFkb3ciIHdpZHRoPSI0MzAiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWE0QUFBQkxDQU1BQUFBZjFaTXRBQUFBQTNOQ1NWUUlDQWpiNFUvZ0FBQUFYVkJNVkVYLy8vK3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3ZGMHF2QUFBQUgzUlNUbE1BRVJFaUlqTXpSRVJWVldabWQzZUlpSm1acXFxN3U4ek0zZDN1N3YvLzZxYXVOd0FBQUFsd1NGbHpBQUFMRWdBQUN4SUIwdDErL0FBQUFCeDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdSbWx5WlhkdmNtdHpJRU5UTkFheTA2QUFBQW5oU1VSQlZIaWM3VjJMbXFvNERGNk9nK2dnZzRoWWtXbmUvekdYVzlza2pkZFJBVFZuOXhzdWJVbi9QMG5URnZXLy84WW1RUmpPdzBabVEydnlFU3J6TUlyakpNdHlwZlpLS2QwSnRQKzFSNkNWMm03U1ZSZ01yZXA3U2hCR3F6ak5za0lwME9aZngxRlBVVTlZeXhXZ0MycWJycUtQd3oxRGFwSnFKOXFxQSthRXlkRTdZTmxycEN5eWVCa08zYUdYbEo2azBnS1B2YVVuZ1I5aW5tUUcyNnVseW42VzgwK0l2SWVFaTFXNlZiOE1ZaHo2dWxQQUJJQWR0RnlVaEo1TFJwdzdxMVNleHVIWDBCMmVwc3lpT04xMHpnUU9WdWhvY0R5QjQwWFRzb1FWZHhjMHZVbVpiVVR0c2pqNmhNZ0xaYlpNc24zcHNBVUxQcUN3Wm5JSFlMeHdocWdMTWtaZGV6eDA2blpnUzVhZkxQS29CR0c4M2lyTWhBaHZqN0JGR1RDTnpNZnVRSGUxeitvUStXRU5TUkRGV1ZFNm1HejJCZ3c4N1lZcGZJdTVDcTFBWXFWMExoODYwanZqVVBrNi91VCtZWnk1UEFJWWR2akVPWXI5dzExT0lOY2QyMVJFdUllemtqUFRnM0wzcnJsL3c1UmcweDVDSkNhU2dPYVZodjQvVXdFNFdaZ2MyNURna1p4Yy9ydzI5MytiRURsYnBzckhTSk5CeTJWOEdIU3dUUEdabE1VZmdKNWpkbmdOTy9naFduQkFGZjNZWGV0eS81Y09rVkZhVkFqaHYxazViY0FNTkF4L0MrL3BPSGZrQnZacXBwUWxmSjlucXhmTS9jT2ZBbzlCR0JCLzNRRUF4VHpBUmJrNzRJdm5TR0dqa3o5QUlzVklUVWRTejcwZkZzcGlrN3pNd0JhdVM5SmZCZ1YzSEo4Ym9JWEl1RWFKZXNUc21kd2t4ZEg2Y1d0aGxjclNWZmh2YUx6L0lrRlNlcEdOZ21DdDlrUm9rb0toVUJ4TVdPU1hKV3Z3SFJMY3JBekZQVHF4NEEvRi9tYUNndHFtOFdLU2kxcHhSYnZKd2REWWtydDRpWGwwdG81YXNLRk5ZQi9EVEk4QUdRVFJoWTl5SkVnZXArb1lnOUEvQ2lhNDdwOWFxM3ZXWW9Udk84d3hqNjA5b1VNNmthUGVUMHpORytza216eW9MSm5JdW45QklSZkJCczJqSlBBb3BVV0lIU3JtS1RSbFFIRDcxTkFabk9oRWFGeXkrYWQ3TUtuc25kZ0lZSlg3clhQLzFjaHoveUF0d1RBZ0dqYWNRTlJIa2NRcGkvbWdxeDNlYmE4NDROQ3N0Y3F6TVM5cXpkZkg0M3dQQ1RkNDdtOElRT3RVUW5oRGYxempBZ21lSmw1TW93OEFYSStWRXVic2lPa1RNNWR1M1g5b2Nud0pGRU4zdW83aExzcytmME9tV2FsTk1xWjEvK1doOXhVZklBcSt0RXRQTUFlVGNYa1dUc0gyREVCd3NiNGlNQ1dHRzJQMytWRHYvSVRMT0E1Yk53K2lCRzAzV3AxSHRhM2wrd2JUNTZtWnBLcHovKzluaFVpemV6VzFwSTBiQXE4SzNGWFJlclBVQVVsd2M2NlRSN1lZeXYwbStYNW83aDhzOCtyZEk5cTlEYkJxdGtibmp3aVJTZlh5SnQvdjBTQ1dIcmFyUmh1b0I3Yk5mUWUyaU1NQTRzbWpGdWs4cDdFVkhhaVRULzN2bWZ1dkt2Y1VvNEMxR1Jxa1NDRkJoRGlJSFFCMTNNT0NzM3pmMVNUVUgxTm5pQlhPU21WL3ovMW5XeEJVQWsydWd0LzNYcWxEc2NuVzhTcit5USttZjZkRG1wUTVZclBRdEFWM2pWS1BFZWE4R2Fma1BrakdYeERyT3ZDdEhsSUhIS1dtSld5TnVIZWtxKzE1MWF6N1I3ZXYrNGY1Q1RyQS9lTjBxSXphU3AzKzUrcERCM29tNlNlUSsvWEFWdHk2b2QwU2hycHhTUWlvVWprY2g2dE1XWFZ4eU9GcDVkODJPVFF2N2VkNzlqbENieTZPSGlmTVZYN2V0ZVphcWh0ZVp2MUtLOWN3Q0ozR3VybCtxbTJ5a0RLZmVjTVpTSFVkWUlKQlRuNTRjbld1dGMxbVEvdWE5LzJEMVVFTURqaGZRRWdpMWFwaXM1STRDK08wK05WY2VPN1Bua2x5TXdNT2lGemErd2dySVAvTFJvZXB0WWJqdVl4dnM0eDlxakhXaGt3cnVCcG5sbFgzbDYvN0wvSktFd0VTSm80bzJKMFVSeDR4KzI3ZW8vcWsrNllTZFVyQ0syN2xzRXVYNTBrTDRyMmtxR3ZUbVRwWHR6elI3R3laN3BnbGNCallrZ1c2WjNwNTFMaE5iZUR6YlRTTU9HMmw5UnZVaW4zMFVhTkNqZldxRVh2eEl4UUFVWVhwaHFvNFBydWJWWkZHNTk3M0NkY1ZnZS9pTk81Y2t0Tnc1dDdXMGROSzQ0Q3JwUEZ6aWVzQmFSV1hwU1Q2VHlCS0dWV0wrRndhOHMyREl2VW5pclNWaTNMU0p0ay9NSTIxZnVYMVEvZGdVdGs3UVZHQSsxOTJOaXhHR2ZFeHdiSUpyUFhmNGhLMkhHZWw5cHNrclR0b0dTYjZEVVBrOXZ3N2tPNmxVQU9ORDY5VGYzZnQ0a3J2WjJPUFJkNU5VaHg1TlhKVVFBSEFaWWtHUjc4eHFpZjJBMXVtV2w0QTZTeXhNMTdhUzYvMzZ4dVh3dnBKdFd0eFBQTlhlNDM2aDlPQW9JdkxQR1M1SmIwSXoxbFNzTTV6YTZ5bG1OOUdWaS96ZUtPY2x0aHRHSVFHUCtZeHZqY3k5NklPNkFsSFY3UGlkSUJqMW91dENjOUN1R0swcXFBTVVwbEVFL1BVNUVJMC95MjcxSU5Ram5EYTNtVnZZQjVuZTVMaEhJY1hhOElpamxTdm0yZ2p6SVVneDdEQjBBa2dYekdrdStCSXlwSVFJdmZQazh0aHJnZWE5a05EZnJBbzRudHV2OVdUNmwzMWlZV2kyY0h1T2l6REpLL0F0VjlQNC9MdlI3eVc4UFh0SnRVT1g2YTlTNzBRQTd5RHBOZnNqTlFBeWdLN2lRL1I4NnpoRUhkOTRNY1Byd2Q3RmlWWnNmOHRsY29lK3dtYmVsSk4vUGtOczNlOHdORWVMUjZJOXoza1h6OUJrK2Zsem41SndOUWttQkxFa0c4QlJXZ1M4L0xWMEh4Y0lzR2k0UXpiS3dpOWNYMTlrY1JDVTdvYnVXVHVOUTVwRjBJd0JSNnlPTTd6bTZUNDA2YTI5aG1TWFdHbFFIdHh3a1JEMTdGYUp2WkJ3U0JhZFJNMFJoTVBnc0J1WTVJYzlJSS80Vk1BQjVudnpqSURCR3RERmtKZUtBN0dMWDMxOFRPYVl2blErTjhrWWNQWmk0WTdvcFExeHU1dk5kNFBLNTJWOWh0WlNQTHg2dW5JYnpRMDVuOFZzK3RKaHlhTmd5QVpSRHpVZ0I5cXFiaUh1Q21QNHFRL29qR0QrT3Zrc1JyaFI4cHVrWTR6OEx1TUZ4ZUlQN0RVZ3hrOUQ1VThOZ0k5bE1Pd01FTTJuSm53aGg2QWZaZTJZc2tzSnBabW5KYXZmbEk5dGdnbU5PVlVFb3Z4ME4wMmZOSDJ5ZFRrYTVsc1M5NXZma3dBQkkwelAxTEVSOThDeUNvNHQ4R09SNFpLWVA1MTNWSm5tVXo2QzFwT1NyOVQ3VnhLc0hKNVZDTG9NdFlHbkpJWHIraFpWQUs3ZU9XeklTMFZza3dCeE9zYXgwcmtQWTk4RTArbEU4N2VyNU4vVWJMQlg3ODR0VUdzekpmaithVDZzOFIrWlNZSGE1UnI3a2F6UTM3WGJjU0pTYk1RNGd3Zk5FY1JrVEw0cmtxNVRhTDM4eXBmbWxmMjZmdVRCajl2ckdLUTB2eEE0Z2VUYkR4SHMvMWo0a2ErRXJYOFh2U205VHZKekU3UU9IQW5Vell2NDZDSDNtalZrZXd6akhoa2MyVzFlZWZ3ZDFLYU4wSituNXJoYVZRUFVJbFd5andaK3o3eDhESmJycmVsSld1Z2phK3FTQmVmZ2VwaXFTZG8yNUtuMEJ4bDdHeTBHTTdCaWZ1UlZyeFFDVDFUbjRIcUptbGVKU2EvWk1DSExreUEyNFp5V1I4amtLVXd3RzYzMGUrbGxtd0hrSy92TkM4NXVveUwzdHRzZm81RDM3RTBuYmhWVldTckY5a0pHWU1FaTUvTzBlU0UwQVk5N0RoNEg4MmJHcmpLOVh6cUUvd2VJdVlIZWY0Mk9GbXBtbSswZU4xRjliRkl1R3krSjRSNkY4dElUcThyZHIvZzhTSHFtVElMNDJSVDdCa3BKMWZtSzFWa1NUeU43OGgrVlFuQ01JN1Q1a2Vlelc4OEExNXAwa3J0c213ZHg0dFBLakZPbWZVL29QNDhML29mZUZpRjk2cEU1dVFBQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLWludmVydD0idHJ1ZSIgZGF0YS14cmFuZ2U9IjUwIiBkYXRhLXlyYW5nZT0iMjAiIGhlaWdodD0iMTIzIiBpZD0icGFyYWxsYXhfYnVpbGRpbmdfMSIgd2lkdGg9IjMwNCIKICAgICAgICBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBVEFBQUFCN0NBTUFBQURFelN6YUFBQUFBM05DU1ZRSUNBamI0VS9nQUFBQmdGQk1WRVgvLy8vanlaejAyS1cycEh2ZHhadTJwWUxueTVmdjFxV0ZlbDdWdTRPbG1uYXNuSHV5bjN1S2ZtTGV4WmJWdnBTRWUyTGt4NVRzMjdMU3VJWEdzNHZGc0lyWnhKYnMwYUxQdkpPNnA0UHAyckhselozV3ZZM1B1bzdkeTZEYXlhSE90b1Rkd1pKdWFGdkpzbjZsbFhQdzFLQzJvM2ZXeFozRXJZU29tbnVla20vSHNvU2VrbStBZG1Lb21udWNqbTNPdFl2bjE3R2Nqbk9sbFhPNnA0UEtzSWpTdUl0N2MyTzhySVdFZkdtU2gzT05nMlYxY0dHVWluVHQwSnlkazNGemJHSFB1bzdrejZHSmYydm4xcTNxMWFUZno2bWFqbm0ycEh1eW4zdTJwWUt5bjN2UHVvN3MwYUxPdFl2U3dKbThySVczbFhLbGxYcTlxNG5keFp2VnZwVGV4WmJQdW83U3VJWEVyWVI3YzJOMWNHR0VlMktvbW51MnBZTFB2SlBHczR2V3ZZM091SkY4ZFdtTmdteHliRnVPaEhHNnA0T3NuSHZPdUpHc25IdUVlMkxGcm4zR3M0dkhzb1RGc0lxNnA0TzJwWUxLc0lpMnBZTFp4SmEycFlMYXlhSFp4SmJHczR1c25IdmJ2NCt2bkhhbGtHNkpmMnQvZVd4OGRXbDBYcVJHQUFBQWdIUlNUbE1BLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9FYnYvLzNmLy8vLy8vMFFpZC8vLy95SkU3di8vSXU0aVJQOGlSUC8vRWN6L00vLy8veUozZDRpcXU4emQvLy8vZDRpcXUrN3U3dTRSRVNKRW1hck0zZjhpTXpORVZYZUltWm1xdTd1N3U3dk16TjNkN3U3dTd2Ly8veEVSRWRxVlVFWUFBQUFKY0VoWmN3QUFDeElBQUFzU0FkTGRmdndBQUFBY2RFVllkRk52Wm5SM1lYSmxBRUZrYjJKbElFWnBjbVYzYjNKcmN5QkRVelFHc3RPZ0FBQVVyVWxFUVZSNG5PMWRDME1UVnhiZU1ETk9yR1FtRVVnSUVDQ0tpb29GUWVVaEtqNjJpSSt1aW1odGk2OTJwYmkyZHEyUDJ0YjJyKzk5bmNlOU13TkpWSUpkRGlUenpHVHVOOS81em5mdmpQaVBmMno3K1BlK2RwL0JweFgvUHYyZmRwL0NweFU3Z0RVWk80QTFHVHVBTlJrN2dEVVpUMDcvY252bzljcjZhcnRQNUJPSnRkZVg5dlpkR2h3Nk5QaHlCN0xONDkzMXZYMTcrL29rWWtPRGh4N3NPTEpONGkrSmw0cExnNE5EZzBQbkY5cDlSdHM3Rmd5LytqUmlJaThmdFB1VXRuZXNIOStyRVpPVFFZblkwRnE3ejJrN3grTHh2WDBDc3IzSEpXcDdMdzBOSFJvYWZMMGpZOW14THNYcmVCKzhTWUlORHUyVXl1eDRMUlgvZU4veDR6b3Z2NUJKT2JpallwbXg4SVdLUXhEL1V2R20zYWUxYmVQaTA4ZVBlM3NmUHliQXVsWGNtbS8zbVczWFdKUnFMME9ML3Q0dmhOc1hzYVA2V2ZGT2FyNHFreXI2dmhoUzVyWGRwN1dOUXp2V1BxbjRFckVoSmZvcjdUNnJiUnkzZGJlb1Q3UHNrbUNYaU12dFBxdHRISXQzWjVUSDF6RXpNeWc1OWxlN3oybzd4eTl2dGR4TDFDNjllaVVCK3orMFlkUHozODNOM2JweTVjcjk4em9ldlhuMDhNV0xodzkvdWk5V1h2bGhibTU2M2xUQ3AyK1BIemQ0OVEyK2ZTVTAvL1dmN1QzNUxZejVpM08zN2orL0cwZCtmNlZEUnRqQjQ4RFpYUmhSVkIrNCsrTFpsYW4vdnRXZVFpQTJPSFJDTU96L29tTzA3K0t0cHovL0drY2NKd09XbklRSVhNaEJVM0cwODdVd1grVnlMTU9ySHZyYjR6VTlkK3ZxcjdGZlFSNkZPQTBKcnBCdHJSQm1KUWxZS2U3VkVmZDYxZDd6N1c3UXg0eUx0NjUyeDlFRkN3Nzg3V0FRaHJBTmFIZFdveVhpWk9ldU9GWm9pZmUvTTJBQ3JJbHlQNGZLMHF6UUFzekJUc1ZaU01sZEtodDdkVXIybGt1UGxpZmIzYmdQSGZ1ZVBQMDE3dWRjQ20zTlNnQVUycHd6ZXRhL3EzN3k5ejl1MW5vMVhESWw0N0pLMVVmTHMrMXU1QWVMZldldTFuSkpUaVVCeVFpMjQ4bWJOMi8rY1dTOHBzQ1NxSFVLaG1FZHZiYjJkK2lEUDdrYTUxSmFqeUpGVzBLaVY4ajNnZmV3NCtiTjA0WDhrWkZpcjRKTE1jeUxKNGFwZ3BZZUxYM2FtRTMvY0xjZldzdFN6eVdYcFY4bUt1S0g1dFRQcVQveStYeHhaQ1N2ODlHa3BHRGRLSE1kcGZPZmY3S1l6VDNNSVFxaXZUTDZSZVQ2YzM0dUoxOStWSTVVbENPL1hDN3J1YWhzVmtMb1JiRzJIQWpBOGdLd1dGVkltWkpDOUNmeXAvKzRlYW9rZ2pBYmEzZlRXNG1sTi8wQ0h3bU1iTEl2TVJMUnJ5R3JYS2lZQ0NtSVVxRjBhV3BacjlPN1ZUcUwrYUlDVE9kanI3SVZFOFY4L3ZUUlU4T25aQXlJK08yM2VuM2dwelB0Ym45ejhjMXlKTEM1WVBCSTJDcWVpRXpWY0UwWTBocW1ZcldpWWxqUjFFamx3K0p1U2J2Q3lNMEJ5YTFTVkJjeDhOdkF3S2xmcjN3NnFmbm5BeHVWa0wwNzFzc1cvelF6d1hlUEM1Q1N2ZHFJcVpRVXdpWWd1K2wwb1hhVjZqOTkzMjRrR29wM3QxTWtQY05OaElsZFdla01rK2oxL3k0QjAvb1Y2NjVSdDhJclh5d011NGdKek81T3RSdU5UV1B4dHAxMllYcmJRdzVrQXNUVWFxcHoydmVVaHZWcUoyWVlKcU00a0FSTXhOM3RYVFFuYjNkWXFtT2xtcHVTaEFxNWU3ZGJhZStoWnZxcld2QmxwYXdTWUwvYjNOcUZSWFBnaDRWMnc1SVZiaks2VFU3alhqcVYwdVlSTi9IUi9raHJXUFdHQVd3OEpTRXhUdDFxTnpLcDhmVTZCNEw3MURDUllra2k0YjU4eDFRZ1lYSkIrTG1lN25KdC9QZmZSK3RaV0JtZTNkMkdMbU10Z3oxcFRVL3RTYnBrU294a3NKVGxIKy9ueU5Cc3lWb2RmYm5OS3ViaTlmVFdaOWdFenNNVWtCdnBtQk51TG1DcEhDdkY5N2VSK3YrMW5pTHBZZUtkVlFJcUF3eXBrUDI2NEc3a2UyM0FTalF0V2V1M1QxNnVkVGpoakVNa1lIVFV5QUVvbVl3dVFubzMzSElneWE5U0d1ZEtQeSswR3lvWjM5ek9VcGN0STkxWk8vc2NxckUxMjRGa3F5NFRuSXFYWms1ZHNuUWt3bkprWVVlWTJtbWk3UzVDbVhKV3Y5SnV2TmFiWVVJbVhwU2NJYTFKOE5ISlZYYklzd1RKWnFDOWFLdjIvK2tVeDdUSXFuN3BwVEFNelM5aG1Wa3pRL2lFVUxIRzQ4M0Y5dUcxYUxFanpTV2tOM2R6MnhCYXRpdjFjeGJkZU42QjRDZTFUQzlHYlRQK2E4NTFwaHpNVXFXTkFOcHdVNWlHRzd2MWU1WmdLU1ZkckZVTkJLTDMyNE9YSzE4ZGlaYWxBb2F5bGxZTzRJQ3BSeUVTODR4VnJ3TU42RmVKb0h2ZURyeHV1MjFKWDNBMGpGZEdPNSt6SW5UZFJrakFJZVFWQ1lhVmlDbHdzVTF0a0g0dTk2SFRQSnNQRGQ4eFNsc2JncFl4eEJoVXVHb2pacVZoK09VV0k3Wnd2ZGxDMWtpa3BHaURDbG5aTUNQYmo5akM5UTVLbEE2U25TeXJHdHFrMlNCck0zSE0zazBpMkl5dkFNUzJFckRydkFFV1BEWldZV3FYS2RsNlc4U2RMWGlFUkZiVGx4NXdpRlJ5WjBySlFaOHRmTzVuSmRVMldMTU5EMmRaWmM5ZGtiZ01XUjNPL21UZWxaS29zWGs1ZWJaVmVEMUlSU2l4emlaRWtoZnBhTHQxMUQ1MGF1a0lTZk5UMUtyRS9ZUzlmV2xyOEZwSEliWXFZb2U3MkVBa2lMWGhBYks3VFdHR1RtM2l6VXBiTW5peHVrR3IycFdYWndHZUp2T3k5TTNIeCt2ckNseGVjRUo0dVpNNEpueFRZdE9HNHhqcGtUUXBZUlplbThhamp3L1lTNnQxV1VtWkRWdVdscjFQeWExWVFLWEtsYk1kTjM1bzRYODNPVG01cUYrTGs0dmk5NEZzYzBVenJGTHBxQnlvSEJDaEhzUlJzK3E5b2xhbzFXcnhRbjlGUHNxakhuY1NjenJVWEw5NkJrcjlWdnB6NnNrZTlTdGZ0ZEhSSHZFalE3NVAxQjdYTW1MaXBJanVreXBPMVFic2tNdTEyc0FwTlZlRGRYVVR2OTMvUEJIdm8yeDM5R05LZnM0M3ozVHBpSHhjOXRXUG52aStmdTdMTE90ZGM3NTUyTWxzTVFjMEc5VkNCQnZNanZvdzNZSG5lWUg2a1ZNdkNBSTl4UlZxUmk4RmFxdjVBRzQwbjhDOXZJQXRzYjBET0thYS92YzlDSWJ0ODFsakpUQnEyV2VJcVhiNmdLMEZwOCtPa3NzaG1yQS9BazFJcWpVOTBIWUxNWThCRWNEcWdCcXROdW9WZ0tqQnh1eWw4ZlZjbElNQVZnVFYxZ0ZiVlcyTFdFdW9QWnhqUkF6ZWJwK3Y4M01NS0FNWDRzZVppdEVUMkt6d0dJVVlnelJBUWNCSjR4QU9ZQ0pzR01TR3VNQTA4Vjc5cm1YQTFvRXUyQTVmRTB5dWlOZ200Z2pTaU5DVk9aY2pVdm8rN2FjVFVyT1c0YXBlUFl4YzFDVE9FVnhET3pFK0p2S1A3NUZJVklUZTg2cHpMUU8yQW5ReVZNRWtndVRFek5JVEJ5ZGI1d0JnSDVJUjNoRndIek1lR0JaUTR6QmxIQkNSVlFSTWdHQVJEQ2lHc0FyejBPUGZJSCtxclk5aDN3R1FHSGx5dk0wY0gyc2YxbllIU1ZVSFVPc2lKek1SVWw4Q1psT0JwVTFnc1Fiekx5RFpJOUFzaE5rbXlFcllrYVpYVzhYclhSSXF5QjRmMVJwMmlhalpGZ2NwQi9GZ3pnSmxOVjBMc1REcU1YVm5PSGdXbVl4aWVkMnhMTjM5Rnk1YytPYy9MM1EyRVB4SStpSWdBMSsxQ3RpYWFWd0U0c1BVektJVUppM0RnU2tWMEkzQTlzRlNSRmcrdUQ5UjRJOXlEbkdTRWFFZ3djVE1LTU0rK216ejZPVElzd29pWDlWV0J4ZlhjMWJ3a3NqNVpuUEZLWGRzUWRkYktyRGlveEVEaytpcmR4aEZxQ3pORGl6QXdFVUZWZlo5RFFFRy9vVGxJeXhVVy8ySFN5dGNXVnl3SW5qTGdmTmtkQUlVcktRakFHR0dYRVlTM053b1NoSkxRS3ZJc1RaNlhrUlhzVUdHc1hyQ0RpUlZ2MVd2ZjRkemh6a0kzNGZjaW9ocUpya2lxS2pRZnF5cm1JYyt3NVR2QXBscElCNWxaUTVkdU9YdTBWTElhVXgrc1p5RjBzakluczdPUFllQllXZ28wUFNhTC9tOE5id20yK2hhdGVnMzQxb25rS1crWmxnaEwzL3krVUtob0ovbGwyODlQZDNkQVdOWXdyV3FMMml4YzdSR09xUml3NTZmRFNxbEYyTEYwRFM5Uzh4aW00eXcxNDNHZW42bVB4TjBHNUgwZ1dFRkNWQ2hXRENQcGVjVmVnS3ZIZzJZWFgzUm0rbWNiQTJ3ZFpzd0taVWZDSmRqc3dsbHN2Wml0Y0JVWUYwSkNGM2dtMy9EOGhCTzVhZmVIeWoyRGZnR0h3RXI1UFZ2b2FpSUprRVRnSFV6d0FKK0JUeGpPUGJzQ1JaYUFtd2x1OXVTVWdrQkYySVZkS05BNmVqanZzTkxOayt3M2ZCWW9qQVB3UzBGY0VLK1JYaGRrR0g1b2tSSlo2YUNySUNBZmJZbk5ZeEhhKzBSNHNoUXdFMHFuNnNWNVJWQVFJempDUEhFWTNYUlpoNGIySkNBVVEvYVVJcjhHSXhSR05tUnJhemplVENHNlhUVVVpYkoxdFBkMCsyZE96SSt2b2Y2U3VqLzFjRVVZQzExamladDdteEZid2c3OWpLcUhyVkFad3FQdzJaeUdLa3hFWmZyY1ZtODFlUHg4WE5IamlpdDE2QVZKYmtBTUsxaGFmVENZM2xQV3dGc1RaLzd4eDZVeU16dXdFMlVUbWIzU2F1eE5IVERJYUpZTTZ4ZzRNb1gxVC9mVXBCSmhnVWpSODZkMjdOQmRudmVMNjBBdHU1elZDUjBBSjdWWk00bEg2eUVSYStjYjYxaXhaRjlYbS9qVjZjS0hXMkxhQzdEYUZLTjYzRWMxK1UvNmowaUNBWU0wMEFCY0VyRFJrUjBCakF5Wm5jYzNxTno5REtqSVZUaElOOCt6b0IxcDQwSjhndzZOYXhmcm1aMDUwaitjK2Q0UkRGTU9RbXNsSG5ETUZZbHMyMUw5VmdMZ1BuQXE1eWw1QnVaYytJZVM5eUlPR1hMSUI0Y1A4QTFYMmdZWG4zbzcyV2JjN2tpZ290bFJMOEExbFZxbUhZVk9pV2g4dzE5THh5OHhpOXNwWE8wU1BiYm1IczBBMXh6eUkrQjRyTUVCY09tSWZGcE4vc29ORnlCbjVBcHllMUVBQllWUnZCeFhOQkRBR080a0FZd0pWMG1LdzNUR0dBZWFWWnlJTEtWTXJtMk5lYUJWMXVkN1VDMnFtc2VyQnprSzB4ckorQ0NRTmNvVHk2c3FCMS9nYnBHSGg2YWtSZ2RTd3RqaUE5UXB5SnFsYVZkRENsWDVwM3NvcExnSThjNG9GWTZBNlJPUWJUSFVDR0IwS1NKbjI0NEVUS3UrbFVnM1djTXM4QnlSM2RQTkEvWVN3V1VzZ05SQW9hY0dlV3plRWRvK2g4Q2JEaDV5QnAzOUJWS0c3WnpGTDQ3QWx0aE9wQUYyYVBVbUZGZjBnWWJxNlJSZ09iTDVEZlVDamFxaDB5aGhqbnRsYU9DUG1xV2JSckFuMXJKcllzQ0x3WjZuNGhyZW9BTVl6N2ZJMExvalhBQjJHZ0YybjJkblhrckpiRkE4dEVLdmFyYTlEOS9XSDJmbTlZNUJpaXlEemZaR1pneGRCSEZWb3BzNUFHUUoyVlRUNEJoRXFJaTJWYzVkTUZzQlJOQUdtcER2V3o2cjZ0Y2RyT3dkVEZLSElnTjNXYmZSbzhTbDUyUHIzbzRKTWFVZThDY0VURk1ld28xV0ZIRXZpU2xwQWJIdHNTNnM5WFpkT2Zvd1pia0hmSFY1MGpLdHlnajd4anBpSHQ2N1lUQkd6Vk1tMVVZckZDQVFVcGFsaGo3WHVCV1d1Z2MzU0U4R0ZKSWdjaEhzNEQreW14a3lZdU9BY29IcGFYUGR1WVpEeCtOWXA2Q09ETEtSdzBEdDdzVTFPWGZOZUlEaUlVQzJIeGpYaFZnUjhibGFBVkxTTkl4R0diem1oMUQvSG9yeVpSamx0ZkFGL25SUm9NVUxqV1VJZ1ZWK1ZlZzZxSkhLYnVTNHdVMTVKbzNCc3gweFVuRGlFeFlVdmczQnRQTkFiWktOc0hwMVdROGEyT3prVGpqcy9KcVB1NHIwSWg4Wk80Wnhjb3hvUUVrby9zNmFQeFpZUWprblNOMUdIRDZoYUlleWpkanJtcE1IMnpGWnk3MDFnVUltdTRjWFVZZ0dDNk1BclNJS1dZVHhnS09TcUNWM3l4ZDJmNkdmeEhJRms3UVVTUU51bWxuTFZMZXNZd2FWdEFXalByZmFqeE04bStQM1h0WHM1eGhuVTEyamxZd25TS0dGcnVGaEd6enVWVFpYVXVyU2pEalFYaG55SjJjbEFFaVp3RHhzRFdJWVE5bFRKVHI1VGl1MThiSDVmQU9xTDJpbWV2RFByTlQvREEvak1yd0pqdEhkelp2VVFwWkxDaDg0SlhaRWU5aHlrMTBRNU0rYlBVVmNsR2FVZ1g4U1RBaUdJQTZxaGptMnpkQndMMFdkRjlTMklwejU0Nm9JZXJBS2lsWWVmVmJjNTJqZHpsTFYzQWtZUXVMWmdTQXBJcC9vZ3FvZmFyeVR5Nlg2d09DWWVmT1FmY1JpU1lMSmU4YUJVejN2VVRSYks1enRJcVhIMHBqaTJNMENDSVNVbS9hL0dHeE9Na3diczJoQ0Zoak5PWUJDK3A4bXh0SGFNUmtTdmJnZUJqZEMyWjlWUVNzcWM3Uk9qU1hld25PSzF2RGsyUTAyOTVqcExhTXpvc0t2MmtlalZrd0Y2czJsTlgzUUpYRVRJUkJub0xWbDJRcFNDTWlXSWliSzVNckNmWGE2SllyeVJZZzVUTXEwdWRoSDh0UjRFZDRKVldBTWZJNHQxelo2SUtIS0tyT2tiNU1obUZGNkVrV2pLMG9KQVlRdmN3aHQrWWVzTGhqVGgxeWl6K0daTGlUczBJN0FhWmlob1pjd1FpYlJwN0pLeU8xUERLWUFKQ3pBTWxreGhBamxwSkY4Sy9DaXhYWmJiWk85bm5pTDlvNnNhcVpCeXplTmV6SHVVdGdFbTdoeUtZR3pRaHh6N1l0ZGZCY3JoLzNzTVB0Y1lxcDE2ZzZFTHZ6YllpRk9xYXFKR21ZeHlNZ0xxdWNiQUt3dFZiZEppVWxGZ2lHTDdNVzdFaDJDY1o2RXZNaEYzU1pTYmVKUWlkZlZYVUVkUHIwTElyV3NYeVJqN2hDa21OdXN1eVh4MnJpNlhONDlKRHlDYVZuUzRaMjVEUnVibWpINkpqS0RFcEphMmduUmNQb3RrQ0FhZ2JhV0gzU09HQXJRQzVVR2R2R0VvbG81a00vWlJkam5ySGJiVXpDR0xsWW9Zc1p3L0o0N3hzSGVxek90M1ZrcWk2STRzOVRVOThmVzJnTU1Hd1pFY25wTzNMS1djbklMWWI1SEthbWhxZXgrK2N4RlVIa0Zaa01yQVpjZmtUVTVCR29MNmtGckFEUG8rUnQwYmNQeCs1RUtiSldSN3QyNys3cTZ2cHEvLzZEbDZmR3ZwL2R4TW0rbTV5Y1dsdGJXMTlmUDcreThxYmNlQzc1U0R6Y2FKZEtGRWZmdlNqRVlsOHdqQ1NNeWo0alFtb3VuWlFmNWs4Z0Z0SHZxeUVlQXN3aG1JeHF0WHBDeEwzUm84TWl1Z1JlS3N4VUxBdnNMaDlzbEhmN1ppY25WOWZXbHBmWEgxdzcvN0ljV2RYelF6K0lJbVpqM3JtelBCbmhseGpvRjJVeTUrY3NXMEVQb2hTdHUwWlZGU2RtWm1hT0hqMDZmSFM0YTNoNE55Q0VXQ0ZhRm5MeVRXSW5lWGVzOFI3VS9Qems2dXJxNWVYbEI5ZXVuWmQvM2gyS0oyWVZLUmRMTjdZT0lhTzkwYWJrWW9TS095YVFMdEovckFMYUN6REFsTllyaHAwV01UNCtQakx5ZG1ibTNyMGJYdlhHcUtRUUE2SkxUYnJNYkZjU3BpNXJ4WmY3OXo4N2VGQ1FUYkN0Q2Nqc1dKaWUvbDRndUx5OC9QemF0YnNDd1RKUE1TYUtEclBVY3ZMV1VVeUp4d3lFdzZqa3JTUDV2SURXTUltUGlCT0NQNHBBWFRZQ0xuMEFMVVJQd2dZN3ZKQUFYVDQ0TmpVMmUyd3pMV3M1OW4wM1B6MDN0YnAwWmZuWmo5Zk8xK0pZa0xDSnpuc2NFSGNDcHNocEQxaWdBTTJjdURjOFVUdFZsU0FaM2VGNGRObE02ZXB5bVFPeGYvLytLd2NQTG8yTmpSMmJiZDkvenpJOVAzMXg3c3phMHRMeTh4OS9yQTMwcWpUMlVlUWdNWTNkSDhCRVROcDlCVSsxK2tvbzBEMnBRRUtnaDVFWXU1MlVTZ2xMenJzMFFETER4a1F0UFBaMTJ3RGFMUFo5TnoxNzVzemMwdExTc3grZmYxbXJEY1NnaEpKK05WNGJnMnFnQ0NRVldpZllicmZOa0VwZHU1MVVBMTFpYTc0eUVpUUFPamE3QlgrSzRXUEYvUFQ4azdrenQzNVl1di96ODRjOUoxN05uSGgxVCtOakFOTE1BZjUwdWNnNERDSUpBbzBlbS9xMmRZM2U3akhib055a3BacklzUHNITHdzSm1qbzIyOHF6aEo5azdPT0psckJERnBoS295OGZYQk5GN05qc3QrMCs4YmJGVjFrOEVoTDBrOUpvNlJ1LzNiNGF2ZFd4SC9sbEpFaGsyT3kzZjFzSmV2OFFKbWhNYUhTN1Q2T0IrQitDL0tPcjBoNHBkQUFBQUFCSlJVNUVya0pnZ2c9PSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLWludmVydD0idHJ1ZSIgZGF0YS14cmFuZ2U9Ijc1IiBkYXRhLXlyYW5nZT0iMzAiIGhlaWdodD0iNTAiIGlkPSJwYXJhbGxheF9idWlsZGluZ18yIiB3aWR0aD0iMTE2IgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIUUFBQUF5Q0FNQUFBQzZSUTlrQUFBQUEzTkNTVlFJQ0FqYjRVL2dBQUFCZ0ZCTVZFWC8vLy9reVptMXBJRGV4cHI3M3Fxbm1uYWxsbkdubW5uMzNhcWpsWG4xMmFuc3pwaTdwNFBVdlpQdTFhWFB1bzZ0bTN6cjBhTGZ4WmJOdDR4eGJXT1VpbTZ5bjNsN2MyTnNhRjIrcklTdG0zeW9tNEMybzN2MjJLU3puVytybklHZWpHdXFsbTNaeEpaeGJXTjBiRnZVdlpQdjBKdm56WjJNZm1QQXJZcTdwNFBYdm83UXU1TEZzb3ErcklSc2FXRHgwNTdFcllLem5YQ3NtbktGZTJxb200Q1BnV1NNaEczUXU1S2NrM09sbG5HamxYbDdjMk56Y0dlSmYyMTdjMk9KZjIzRnNvcVVpbTYrcklTY2szUEFyWXAvZVdsL2VHV2ZrbnJHc0l6QXJZckdzSXljazNQTnQ0elh2bzY3cDRQcjBhTFF1NUs3cDRPbWsyemZ4WmJaeEpiRXJZTDEyYW51MWFXd20yNzUzS2ZtemFIbnk1YU1nM04vZVdtZmtucWFqbm1VaVhTTWhHMk1nM09ybklHamxYbVVpbTZVaVhTTWhHMkVlR04vZUdXMXBJQ2FqSE9GZTJyR3NJeTdwNE9WaG1lK3JJU3RtM3lubW5tZWpHdVVpbTZWaG1mVXZaUFF1NUxOdDR6ZXhwclB1bzdHc0l5N3A0T3luM21tazJ3Ky9NVjBBQUFBZ0hSU1RsTUEvLy8vLy8vLy8vLy8vLy8vLy8vL1JQLy8veUozL3lJUjd2OUUvLy8vUkhlNy94RWl1Ly8vUkhmdS8vLy8veEgvLy8vL0lqTkVWYXFxek13UkVTSXpWWGVJdTh6ZElpSXpabVozZDRpWnFydTd1N3ZNM2QzdTd1Ny8vLzhSRVNJaUlpSWlNek16TXpNek0wUkVSRlZWVldabVptWm1abmQzZDRpSWlJaUlpT21hcjFjQUFBQUpjRWhaY3dBQUN4SUFBQXNTQWRMZGZ2d0FBQUFjZEVWWWRGTnZablIzWVhKbEFFRmtiMkpsSUVacGNtVjNiM0pyY3lCRFV6UUdzdE9nQUFBRnpVbEVRVlJZaGVXWGgzc2FSeERGdlN6SEhRc2N6VUVLQ0ZWa2lJTktGRVcyNVJaRmNWd2pKRnZOVHUrOTkrcC9QZk5tQ3dmY3hZb3NmOG4zWmNCM2dqdnY3OTdzbTlubDFLbEh4TnlqYm5nQ01mN1Uvd1U2OTI5QWwvNUw2WDNucTQzZjV1ZC91ZjNacFNjQVJYcC9HQi82OHExZkQ0SUhZWFA1VEM3M2VtNzMxcHNuRFlYUzlkTURYNzI5blZaQm1rSXBWYzRoWHIxODh0Q0xBOUNmQWlJcWZ0TS8xV3dUZGE5MG90QzVJZWlsYmFoa29ZQUc5T2N5aXoxSjZKRFNOdzQxS2cwd3ZSVE9UVkMzSGd2endjYkc3WkpyZm9OS0x4OHFUbXM2SUJ4VCtjUHlZMUp2SHFnbXhyaGxQcFBTcTU0cm0yMVd5RnlYWkR6R0dWQy9PU2J5OGpZUDFLUkJkcTlZNkRudmdybjhjd0FDWlJjKzRya2xVOEZYSVp2NHh2R2cyMHFMZUVEVVBTNTc2a2puZkFOOUQ1Y1VweFpZZmVKc2E2bTd4MkorQ1NJa0JDRlYvWmFGV3FWYlNydEk2ZHdxN1NqT0RjOXE3bGlGYzJEbXl6dzZFdHhQNzFJakRLa2RORlV6UkRUNXRrREJVVW9iT0xkM1ZORDQ2dXJxalFaaTZtWVlsc3ZsMThvSVFiRTNUMUVSVWtpRXdFbmdqSU9zZHJ2ZGdyUXgreXpIdDZjNXh1aWwzd2xiZ0JKR0VHWTBHazg0aFA0aytpZGgrUHhuUG5Xa0dJdUgydEcwQUl2UVdBc1hScUZSaXkrT3hreUUyb0dseWQrd1BQMUlmZUU2d1NlaDlCL25tS0I1c1pqSlpqTmVER3VoNmxQVWs2QlRGaVZkSXFXRldxUjBhdnNaWjJnMW02RlhETFJZb1F1WnpFUVNWRVNzYVUvbWk3SnlFZXBUd0UwK1ZSQmFhWUZHem1ZbllxQ3loa3UxMVBVRTl6cnZHSjNXUkVLRzZIRksyVFZGVnlhZFUxUXJad0dWa0VORHgwQVhBYTBuS0cxRWpDUDdKNkdoS3RyZmJjOExTS25RMEJyeVc0K0RWbW0yczM2eWV3Y3Q1R1pYaXRCMkhUUjJkRUR1OFJHb1dNVFFNVTRxaWdJbTFmdTdraEd1VEkxNzlKR2dRZGd1dDh0NDYwNFZtUFF5VkVwMlVpWU9Xc2tpVXE4a3VGZEdLbFZFZkNwSWFhQXF2dWQ3bnVmalFFZHU5VENTVG04QlJvcHhVbEdJT2wzSzFCSkxwbDkrSXRKOTZIT1pVbG9obEllaTgvbHNvTkxNcWN3Z1JpZVZvSGxVVXoxSnFlMHh3cHJXYVE5cC9tYVpDSlVzTlRCR2trOXpla1VkL3ZWam9MS0t4L0VUNW5UQXZKRmxSREEwWGRFd3BCWUgzaHhGb0lzWWV0UkpSWW5NMDVWazkwYTdqc3N1bDB3NlBXczFjblk5TGhxNGw2R0NlMUoyMUVta3RNS040OU1FYUg5RmtXNE4wVThDYU1WbVZ4OEhvSFFYZWhMYTNZaFMxRERGRi9GejZ0cXNOR0RoSE1WUWRxNXYwRjZnVE1tWTlGYllTU005cVlnbEFkQVhFK2JVcmN2V1NxNFhjM3AxWGkwM01FcDVUbkZYSGUxaHhMN2tYcm1BSkx5VWxONzR6b0Qwa3F4WnJkVFRaY29sbzFKZG8xU3drMkpXTnlndDRIRmVUb1FLbDFqaFZsTDhVUTQ0dld3aTB5SzRIMGJjSzZxWk9DZVJVdlFra2pyOE05T2sxNVZMWkxYV1NUYnUxUnExWE94M0F6dW51SkY3MG9pVGloaXNqaVhvYWdLMHZ6RnhENkMxYS9mYUt1VVU4N0xqb0xnNTFrbVlVM0VXVW1PZFZMSXJkdjlnOWk1VXAwclhxZS9BbnUxSVRpbnB5WTQyd2lKRzdRRWE2NlRTWU9lTEZLd1E1WFNrSStsNXhaSWU5TjFMdCtmMUdqWVlWWXh5SG5NYTY2UkdaRjltNTlXdXFyVEthQ01abWI1THIxT0tIb3V4UjVYU1poM0dqblhTRkV0c2kzYTd1TEN3c05pMVdua1JWMWhsVEhLMVlHeGJWQlRLcS9XSWs0cWNySXZ3V0p5VHBsZ2RwcXJLZVluMmYxWnFTbFJuMStlZmlZQmVNMFlTZXQ4MzVLUWlwNjBIYUp5VHVHUWtWa2tOalc3UnNIT29HQnNacmRpdDhNYnNtcTVUR2Ura0lydWlsOVNUU3Z3ZjAwNnBiVW5PU0VhaWJRN1lLRm1sMm01NWJCNkduRlRreDk1Qm9jWTVTZGNwdWx2VjJzNzFDbHVuRnVyYk9lMEt1Vzk2citteDJXRW9IbWNXTlpPZG1aNWU2MXh2UmFGTHErL1NyOFR6RkgvODJidDd0L2NNeCs4N08vUXpjZmZ3OEhCUE55VGRnUDIrZS9lTlVpa0szTzVxRTRpYWlmeHppT3J6aUpXVnlaVkp4UHJNdyttdk81KzBZanRqVWx6NTZNT1BYNkI0Ly9OU28vSGRuVHZmOXpZM04zdTkvZlgxOVh2MzdrOWk2SlhKK3pNY0Y2WTVmdXgwMXRZNmE1MVdxelhXY3JTL0FHU2hqNW5vR3JaTUFBQUFBRWxGVGtTdVFtQ0MiPgogICAgICA8L2Rpdj4KCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8Zm9ybSBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIGlkPSJzZWFyY2giIGFjdGlvbj0iL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxsYWJlbCBmb3I9InNlYXJjaCI+RmluZCBjb2RlLCBwcm9qZWN0cywgYW5kIHBlb3BsZSBvbiBHaXRIdWI6PC9sYWJlbD4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSI+CgogICAgICAgIDxpbnB1dCBjbGFzcz0iYnRuIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPgogICAgICA8L2Zvcm0+CgogICAgICA8ZGl2IGlkPSJzdWdnZXN0aW9ucyI+CiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvbnRhY3QiPkNvbnRhY3QgU3VwcG9ydDwvYT4gJm1kYXNoOwogICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vc3RhdHVzLmdpdGh1Yi5jb20iPkdpdEh1YiBTdGF0dXM8L2E+ICZtZGFzaDsKICAgICAgICA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2dpdGh1YnN0YXR1cyI+QGdpdGh1YnN0YXR1czwvYT4KICAgICAgPC9kaXY+CgogICAgICA8YSBocmVmPSIvIiBjbGFzcz0ibG9nbyBsb2dvLWltZy0xeCI+CiAgICAgICAgPGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHRpdGxlPSIiIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVJwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1RXRmphVzUwYjNOb0tTSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZNVFpDUkRZM1JFSXpSakF4TVVVeVFVUXpSRUl4UXpSRU5VRkZOVU01TmlJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk1UWkNSRFkzUlVJelJqQXhNVVV5UVVRelJFSXhRelJFTlVGRk5VTTVOaUkrSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2tVeE5rSkVOamRDUWpOR01ERXhSVEpCUkRORVFqRkRORVExUVVVMVF6azJJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1V4TmtKRU5qZERRak5HTURFeFJUSkJSRE5FUWpGRE5FUTFRVVUxUXprMklpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtTTTlNQ0FBQUErNUpSRUZVZU5yRVYxMUlrMUVZM3M0K2RkT3AyOVE1YjBvcENnS0Zzb0tvaTVLZzZDSWh1d2k2ekxKTG9ZTG9wcTRxc0tLZ2k0aTZDWUlvVS9xNWlEQUtzNnN5b1M3NklSV3R5SitwN2NkdDdzZjFQR09EK2UwYzNkeWdBeC82N1p6elBNOTUvODc3R1lkSFJnM1pqTVhGeGVwUUtOUzZzTEN3SnhxTk51RnBpTWZqVnM0WmpVYS9wbW1qZUQ2VmxKUzhOcHZOVDRRUTdteHdqU3NKaUVRaW0vMSsvOWxnTUhnSXI1b2h1eEcxV0N3OVZxdjFjbEZSMGRDcUJPREVsVjZ2OTBvZ0VEakdkWWJWalhocGFlbmRpb3FLMDdDSVI3WkFxRTQ5UFQwOUJQTDJQTWdUQnlRR3NZaVpsUUQ0dU1YdGRyK0p4V0lOaGdJTlloR1QyTXNLZ01ybTJkblpYZ1JYaGFIQWc1akVKb2RVQUh4dXg0THVkSEpFOVJkRWRBK2kzSnV6N2JHSGU0bWhFOUZOcmd3QkNMaXJNRlY5T2toNWVmbEZoOFBSNW5LNW5EYWJyUjJCTkpsS08wVDM1K0xpNG40Ky9KKy9KUUN4aG11NWgzdUpvWE5IUGJtV1pBSE1zaFdCOGw1L2lwcWFtbWFBZjB6UEREeDFPTlYzdnVyZGlkcXdBUUwrcEVjOHNMY0FlMUNDdlEzWUh4SVc4UGw4NXhTV05DMWhBRERJdjBySUUvbzRKMGsza3d3NHhTbHdJaGNxM0VGRk9tN0tOL2hVR09Ra3QwQ0ZhNVdwTkpsTXZ4QkV6L0lWUUF4Zy9aUlpsOXdpSEE2M3lEWWllTTdEbkxQNUNpQUdzQzdJNXNndFlLSkdXZTJBOHNlRnFnRkpySmpFUFkxQ24zcEo4LzlXMWU1VldzRkRURW1GckJjb0RoWkpFUWtYdWhJQ015S3BqaGFocU4yMWhSWUFUS2ZVT2xEbWt5Z3JSNG80QzBWT0xHSktyT0lUS0I0amlqemRYeWdCS2l4eUM1VERRZG5rL1B6OHFSdzZvT1dHbHNUS0dPUVc2T0g2RkJXc3llUHhkT1hMVGd4aXllYklMWkNqeitHTGdNSUtuWE56YzQ5WU1sY1JkSFhjU3d4RlZnVEluUWhDOUczM1VoTm9KTHVxcTZ0MzQ1cDl5M2VVeThPVGs1UGpBSHVJOXVvNGIwN0ZCYU9oc3UwQTRVbmMrVDFUVTFOajNLc1NTRTV5SjY1anFGMkREZDhRcVdZbUFacklNMlZsWlRkblptYjZBYnBkVjlWNmVjOXpuZjVRN0hqWXVtZFJFMEpPcDNNaml0TzRTRmErY1p6OFVtcWUzVENiU0x2ZGZrUi9rV0RkTlFsNUludVRjeXNPY3BGVDM1WnJiQnh4NHAzSkFIbFpWVlcxRC82MzRWUnQrRnZMQmdLL3Y1TFY5V1MrMTB4TVRFd3RSdzdYdnFPTCtlMlE4VjNBWUlPSUFYUTI2L2hlV1ZuWkNWZmN5S0hnMkNCZ1RwbVBtallNOGwyNEd5YVVIeWFJaDdYd2ZSOUVyRThxSG9EZm4yTFROQVZDMEhYNk1GY0JJUDhCaSs2RjZjZFcvRElDa0FOUmZ4OTlmRVlGUTdOcGg1aS91UWlBMjE0Z25vN0srZ3VoYWlLZzlnQzYyK004ZVI3WHNCc1lKNGlsYW02MEZiN3I3dUFqOHdGeXV3TTFvSU9XZ2ZtRHk2UlhFRVF6Sk1QZTIzRFhyVlM3cnR5RDNEZjh6L0ZQZ0FFQXpXVTVLdTU5WkFVQUFBQUFTVVZPUks1Q1lJST0iPgogICAgICA8L2E+CgogICAgICA8YSBocmVmPSIvIiBjbGFzcz0ibG9nbyBsb2dvLWltZy0yeCI+CiAgICAgICAgPGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHRpdGxlPSIiIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVJwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1RXRmphVzUwYjNOb0tTSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEVRVU0xUWtVeFJVSTBNVU14TVVVeVFVUXpSRUl4UXpSRU5VRkZOVU01TmlJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRVFVTTFRa1V4UmtJME1VTXhNVVV5UVVRelJFSXhRelJFTlVGRk5VTTVOaUkrSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2tVeE5rSkVOamRHUWpOR01ERXhSVEpCUkRORVFqRkRORVExUVVVMVF6azJJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1V4TmtKRU5qZ3dRak5HTURFeFJUSkJSRE5FUWpGRE5FUTFRVVUxUXprMklpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtoZlBSYVFBQUI2bEpSRUZVZU5yc1cybU1FMlVZYm9kdHQrMjIyMnUzNVFoZW9DQ1lHQlFsaWdJSmdrWkpOUHpnaWdvYVRFajhBZEZFTWZBRGZ5QUJrZ1dpaVdjaWVLNFMrUU9pSEFZVWoyaE1OS2dZbEV1anBOdHR1OXZ0dGJ2ZHcrY2hVMUs2TTUzNXB0M3ViSENTeWV6UitiNzNlYjczK3Q3dnJmWHN1Zk9XNGJ6Nit2b205L2IyM292bk5OdzM0YjV4WUdBZ09EZzQ2TWJ0NG1lc1Ztc1dkMXFTcEhoZFhkMmZ1UC9BZmNwdXQ1L0E4OHh3eW1jZEJnTHFlbnA2RnVSeXVXVjR6dS92NzU5UXlXQmp4b3o1dDc2Ky9ndW4wOW1LNXhGeWFrb0NBUFNhVENhek5wdk5Qb1lWYmg2TzFZS0dSRjB1MTNzTkRRMjdRTXpmcGlBQUtqMGxuVTYvZ0JWZkFaVzJXV3B3d1Z6eTBJZ1AzRzczRnBqSTZSRWhBR0E5cVZScUExYjltVm9CVnlJQzJ0RGk4WGcyNCtkVXpRaUFiUy9zN094OEcyby8zbUtDQytadzBlZnpQUUVmY1ZqWXJBUlgzZGJWMWJVdEhvOGZNZ3Q0MmYrTXAweVVUVlFiZFdzQUhWc2lrZGlIa0hhUHhjUVhRdWZYZ1VCZ01SeG1lOVUwQUF4Zkg0dkZ2ak03ZUY2VWtiSlM1cW9Rd0VRR0E1N0FjNUpsbEZ5VVZaWjVja1VFZ01WeHNLMmpsU1l6SStRWEpzaXlqek5FQUp5SkF6Yi9LUWE0MWpKS0w4cE9ETVFpVEVBeW1YdzVuOC9QMElqRDNiaDdSZ29nNTlhYW54aUlSVFZ2Vi9vajB0bkhjYS9XTXJWd09Ed0IzcmFUR3h6a0JnL2duWlZhcEZWNjJXeTJuNUFPNzBITS81d2JKMFFuWHlRU2FWUERJdU5aelkwVjNudEhNd3hpd0hBMEdqMk5wN2VjSUJEZ2FEQVlYS0NRSk0xRGhyZ0ozbmh1bGNQYmw4ajRObUhlNDZYL2c2MGZ3YnozYWV3amtxRlFhQXFlYldVMUFPcXlRd3Q4SWQ2cUVITWM5N3p1N3U3RkdHc243SEFpVnVvc1Z3N1AzNUMxbmNjZGdTQ3hvcDFkSGVac3dtZkhNbnhCbzZaVGsrak44ZGwvdkY3dldvZkRzYStNTE45b0VVQk14T2IzKzFlb0VzQlZ3NlptdWE0OXI4WW1oQUtEaUVQY013QnN4TWlxUStpeHpQRnhaeXFScFhBUkcvWU9yMU9iRkowZ1Vza1hCYmFtY1IxT0ttTVV2RHhIUkF1OC9MbVkzakZMTVVwRnF6OUh4RzY1c21ZSmR5S3lFQ094RGlFQWUvcDFnakYyb29uaXZaQXN4VmdsMmRhYTRFUVdDVzZKNTVxRkFGRlppSldZTHhOUXkycU9TVXpHUnN5WENVREllbGl3QUhFTzRXU2xXUUJSRm9aYWtYY0ttQ1hteVhBS3MwVmU5dmw4cTQyV29JWXBKVTRoVjNoS2NOczhtOWdsN3AveFE3M2VGNWtCNGo1bU5yV21USlJOd0F6cWlWMUN4alZUWkNJa0VxK1oxYlpGWlNOMkNlbm1WQUZWeTRQbHo4eEtBR1dqakFLRms2bENCTURSL01KakxMTVNRTm00M3hBaVFLVGFBKzkvd2V3aERqTCtKVkkxa2tUU1NPVGNLYk1Ud1BxRVNBb3Q2ZG42RnIxZ0h3VkpqdTZJUnV5aUJ5UHVVVUJBZzVER2tBZ0JteGx2ZGdJRUs5Z0Rrb2hkWS9CSm80Q0FHMFI4bWlSU3NHQUJrZ1ZRczRLWHUwOThJZ1VYU1NSc0ZBb0taaVZBVkRZMldVaWlQVGpZUmk0MUt3R2lzckdzTHRsc3RoOEZpd256MmZCa1F2V2ZSdGxFM2lGMnlXNjMveUNhY1haMWRXMDJHd0d5VEZhUmQ0aWRKbkNLSFJhQ3hZUkhvRzVMVEtUNlN5aVRvUDFmSkhibUFZUFlSUjBVblpRdE1uQTZzMHpnK0daQmx0MEdkbzdFUEhncEUzUTZuWjhZeUxoYzhYajhNSmgvYUtUQVkrNUZQQUtITEU3UmR3dVlKWm1Od3p5Q01rQkNZeUtST0pCTUpsOUIvUFhYQ2pqbUNtRE9WekgzZmlQcE9iRVdHcW9LZTRFQmw4djFobHFzZEx2ZDIzbWt4SE05cGM5a01wbW5vOUhvZVRpaTdld2JIRVpQUHgxenRMUzF0VjNBbkd1TWppTmp2YlFGdUh3NnpEbzVCeTdkVFBBUU5CZ01MclJhclRrU2xzMW1ud1Q3dXdwOXZpcng5UXpiVy9IdVYvajVkL2IrNmpuaUtsbGxQOGxrZU9OSkRrK2RxOUdzUVRuQzRmQjFoZU8wSzQ3SHdlN1dkRHI5bkFLZ1h3T0J3SEkrQzQ1SHRqMWQ2c2Q0MjlUVU5FY21VZGMrUFJhTEhjdm44N2RYVzR1Z3pkc2FHeHVmTDk0TkZ2OXppMUo3R1ZiaGx2YjJkbmFKM1NWcnhmYytuMitOVHNaNy9INy9NcjNnNVhkU0lIeUpTSDFQWis3ZlRveWwyK0VycWlsZ1o0TmFMWUI5Z29WR2FIalI5M0h2MVpyVTRYRHNGVDIwa0gzUE9iemJXazBDZ0cxamFjVklVbkFRYjlGK1ZleHlMTXprcGNMdjBJSlY3QUhRSU9DQVVZSHg3djVxZ1NjbVlIdFRxU0F5WkxFSlRLMjJCaWU0aXEzeHNxcG00U0FmOUhxOWEyRG5KNHVMSzNTRVVMY2RSdnAzaTN6SHlTcXBmaWN4RWRzUWMxTnJsWVhYdlIrTzdxQVNTZXpYQitoMVN1VW9tZ2c5TEw4QlVvVjQ3NDlFSW9sS2grRWlxV21xVkVabERnSGtzMnB4SHc3eFRxVVF3OUo1TmNBWE9LMTBBR0lvWjZabGk2Slk2WjFRNDYxS29aNE5pS0xIYXJXK0tEc3hsRFVQSFo1elBRWnFVVkRQSnNUcWI1bjltYWxicEFoOEMyWFhETGw2MitXWklERlJVbE5WT2l3ZW5jbk5VM2FRRWtMK2NETVNvTHZabzJmUUI3QUpzc05BdUZ1dm9ybERWVmtrZzJJODcram8ySzJRQVZwaERyZnlWaUs1VnF0TzM0T2theFhDcCs3ZHJkREJDQWR1Ym02ZWlkWCsyV3dxVDVrb213aDRZUUxrK0g0YUU5M2g4WGcyZ3ZIZWtRWk9HU2dMWlRMeURUTEo0THg5L0taV0tCU2FpblQ0SXkzRnFRQmZuVVpSNDJQS1FGa3NCcjlRS1ZYQ1B1c0QzT2lBL1JrUTVrUDhxVi9KbDFXeXdBcC82K2RjbVBNMnpMMVVyVWFoZTRKcWZuV1dLWEl1bDN1VWJmUDhuakFGTFcxT0ZyM2dkRnRaNzJjTkgrUHRRVDcvYnJXK05YcUpBSGgweTlWOC9VL0ExVTdBZndJTUFEN21TM3BDYnVXSkFBQUFBRWxGVGtTdVFtQ0MiPgogICAgICA8L2E+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvX2Vycm9yLmpzIj48L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K) + format("woff"), + url(data:font/ttf;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGNvbnRlbnQ9ImRlZmF1bHQtc3JjICdub25lJzsgc2NyaXB0LXNyYyAnc2VsZic7IHN0eWxlLXNyYyAndW5zYWZlLWlubGluZSc7IGltZy1zcmMgZGF0YTo7IGNvbm5lY3Qtc3JjICdzZWxmJyI+CiAgICA8dGl0bGU+UGFnZSBub3QgZm91bmQgJm1pZGRvdDsgR2l0SHViPC90aXRsZT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+CiAgICAgIGJvZHkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWYxZjE7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICAgIGJvZHksCiAgICAgIGlucHV0LAogICAgICBidXR0b24gewogICAgICAgIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgICB9CiAgICAgIC5jb250YWluZXIgeyBtYXJnaW46IDMwcHggYXV0byA0MHB4IGF1dG87IHdpZHRoOiA4MDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB9CgogICAgICBhIHsgY29sb3I6ICM0MTgzYzQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KICAgICAgYTpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CgogICAgICBoMyB7IGNvbG9yOiAjNjY2OyB9CiAgICAgIHVsIHsgbGlzdC1zdHlsZTogbm9uZTsgcGFkZGluZzogMjVweCAwOyB9CiAgICAgIGxpIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgICAgbWFyZ2luOiAxMHB4IDUwcHggMTBweCAwcHg7CiAgICAgIH0KICAgICAgaW5wdXRbdHlwZT10ZXh0XSwKICAgICAgaW5wdXRbdHlwZT1wYXNzd29yZF0gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiA3cHggOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgY29sb3I6ICMzMzM7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0IGNlbnRlcjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwwLjA3NSk7CiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZS1pbjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZS1pbjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CiAgICAgIC5idG4gewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIGNvbG9yOiAjMzMzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRTsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgjRkNGQ0ZDLCAjRUVFKTsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoI0ZDRkNGQywgI0VFRSk7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgfQoKICAgICAgLmJ0bjpmb2N1cywKICAgICAgaW5wdXRbdHlwZT10ZXh0XTpmb2N1cywKICAgICAgaW5wdXRbdHlwZT1wYXNzd29yZF06Zm9jdXMgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBib3JkZXItY29sb3I6ICM1MWE3ZTg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgNXB4IHJnYmEoODEsIDE2NywgMjMyLCAwLjUpOwogICAgICB9CgogICAgICAuYnRuOmhvdmVyLAogICAgICAuYnRuOmFjdGl2ZSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoI2VlZSwgI2RkZCk7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCNlZWUsICNkZGQpOwogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKICAgICAgICBib3JkZXItY29sb3I6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5idG46YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkY2RjOwogICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjYjViNWI1OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTUpOwogICAgICB9CgogICAgICAjYXV0aCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB6LWluZGV4OiA1MDsKICAgICAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTMsOTUsMTIwLC40KTsKICAgICAgICBwYWRkaW5nOiA3cHggMTBweDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMTBweDsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMHB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgM3B4IDAgcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgICNhdXRoIGgxLCAjYXV0aCBwLCAjYXV0aCBsYWJlbCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuYXV0aC1mb3JtLWJvZHkgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQogICAgICAjYXV0aCBpbnB1dFt0eXBlPXRleHRdLAogICAgICAjYXV0aCBpbnB1dFt0eXBlPXBhc3N3b3JkXSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgd2lkdGg6IDE3NXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogOXB4OwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OwogICAgICB9CiAgICAgICNhdXRoIGlucHV0W3R5cGU9dGV4dF06Zm9jdXMsCiAgICAgICNhdXRoIGlucHV0W3R5cGU9cGFzc3dvcmRdOmZvY3VzIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSgyNTUsMjU1LDI1NSwuNSk7CiAgICAgIH0KICAgICAgI2F1dGggLmJ0biB7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICB9CiAgICAgICNhdXRoIC5idG46Zm9jdXMgewogICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSgyNTUsMjU1LDI1NSwuNSk7CiAgICAgIH0KICAgICAgbGFiZWxbZm9yPXNlYXJjaF0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgI3NlYXJjaCBsYWJlbCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDIwMDsKICAgICAgICBwYWRkaW5nOiA1cHggMDsKICAgICAgfQogICAgICAjc2VhcmNoIGlucHV0W3R5cGU9dGV4dF0gewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICB3aWR0aDogNzA1cHg7CiAgICAgIH0KICAgICAgI3NlYXJjaCAuYnRuIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICAgIHdpZHRoOiA5MHB4OwogICAgICB9CiAgICAgIC5sb2dvIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW4tdG9wOiAzNXB4OyB9CiAgICAgIC5sb2dvLWltZy0yeCB7IGRpc3BsYXk6IG5vbmU7IH0KICAgICAgQG1lZGlhCiAgICAgIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICBtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLAogICAgICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzogMi8xKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICAgICAgIG1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLAogICAgICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgICAgICAgICAgICBtaW4tcmVzb2x1dGlvbjogMTkyZHBpKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICAgICAgICAgICAgICAgbWluLXJlc29sdXRpb246IDJkcHB4KSB7CiAgICAgICAgLmxvZ28taW1nLTF4IHsgZGlzcGxheTogbm9uZTsgfQogICAgICAgIC5sb2dvLWltZy0yeCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgfQogICAgICB9CiAgICAgICNzdWdnZXN0aW9ucyB7CiAgICAgICAgbWFyZ2luLXRvcDogMzVweDsKICAgICAgICBjb2xvcjogI2NjYzsKICAgICAgfQogICAgICAjc3VnZ2VzdGlvbnMgYSB7CiAgICAgICAgY29sb3I6ICM2NjY2NjY7CiAgICAgICAgZm9udC13ZWlnaHQ6IDIwMDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luOiAwIDEwcHg7CiAgICAgIH0KCiAgICAgICNwYXJhbGxheF93cmFwcGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLWluOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLWluOwogICAgICB9CiAgICAgICNwYXJhbGxheF9maWVsZCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgaGVpZ2h0OiAzNzBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfZmllbGQgI3BhcmFsbGF4X2JnIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAtMjBweDsKICAgICAgICBsZWZ0OiAtMjBweDsKICAgICAgICB3aWR0aDogMTEwJTsKICAgICAgICBoZWlnaHQ6IDQyNXB4OwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgd2lkdGg6IDk0MHB4OwogICAgICAgIGhlaWdodDogMzcwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiBpbWcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9lcnJvcl90ZXh0IHsKICAgICAgICB0b3A6IDcycHg7CiAgICAgICAgbGVmdDogNzJweDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9vY3RvY2F0IHsKICAgICAgICB0b3A6IDk0cHg7CiAgICAgICAgbGVmdDogMzU2cHg7CiAgICAgICAgei1pbmRleDogOTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9zcGVlZGVyIHsKICAgICAgICB0b3A6IDE1MHB4OwogICAgICAgIGxlZnQ6IDQzMnB4OwogICAgICAgIHotaW5kZXg6IDg7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiAjcGFyYWxsYXhfb2N0b2NhdHNoYWRvdyB7CiAgICAgICAgdG9wOiAyOTdweDsKICAgICAgICBsZWZ0OiAzNzFweDsKICAgICAgICB6LWluZGV4OiA3OwogICAgICB9CiAgICAgICNwYXJhbGxheF9pbGx1c3RyYXRpb24gI3BhcmFsbGF4X3NwZWVkZXJzaGFkb3cgewogICAgICAgIHRvcDogMjYzcHg7CiAgICAgICAgbGVmdDogNDQycHg7CiAgICAgICAgei1pbmRleDogNjsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9idWlsZGluZ18xIHsKICAgICAgICB0b3A6IDczcHg7CiAgICAgICAgbGVmdDogNDY3cHg7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9idWlsZGluZ18yIHsKICAgICAgICB0b3A6IDExM3B4OwogICAgICAgIGxlZnQ6IDc2MnB4OwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgoKICAgIDxkaXYgaWQ9InBhcmFsbGF4X3dyYXBwZXIiPgogICAgICA8ZGl2IGlkPSJwYXJhbGxheF9maWVsZCI+CiAgICAgICAgPGltZyBhbHQ9IiIgY2xhc3M9ImpzLXBsYXhpZnkiIGRhdGEtaW52ZXJ0PSJ0cnVlIiBkYXRhLXhyYW5nZT0iMCIgZGF0YS15cmFuZ2U9IjIwIiBoZWlnaHQ9IjQxNSIgaWQ9InBhcmFsbGF4X2JnIiB3aWR0aD0iOTQwIgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQWdBQVpBQmtBQUQvN0FBUlJIVmphM2tBQVFBRUFBQUFVQUFBLys0QURrRmtiMkpsQUdUQUFBQUFBZi9iQUlRQUFnSUNBZ0lDQWdJQ0FnTUNBZ0lEQkFNQ0FnTUVCUVFFQkFRRUJRWUZCUVVGQlFVR0JnY0hDQWNIQmdrSkNnb0pDUXdNREF3TURBd01EQXdNREF3TURBRURBd01GQkFVSkJnWUpEUXNKQ3cwUERnNE9EZzhQREF3TURBd1BEd3dNREF3TURBOE1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd00vOEFBRVFnQm53T3NBd0VSQUFJUkFRTVJBZi9FQUxZQUFBTUJBUUVCQVFBQUFBQUFBQUFBQUFFQ0F3QUVCUVlJQVFFQkFRRUJBUUFBQUFBQUFBQUFBQUFBQVFJREJBY1FBQUVEQXdNQ0F3VUdCQUVHQ3dnQ0F3RUFFU0V4QWhKQlVXRnhnWkdoQS9DeHdTSVQwZUh4TWdRRlFnWUhGMUppMGlQVEZCVnlncExDTTJPRGt5UWxOYUt5VTZPek5FVlZjMFJVcEJZUkFRRUFBUUVEQ2dRRUJRVUJBUUFBQUFBUkFRSURVd1FoTVpIUmtxTFNCUllYUVZMaUJxRkNRd2ZoZ2hSa0ZWRVNZaE16Y1lILzJnQU1Bd0VBQWhFREVRQS9BUG10K0tMNmZIeU13RHU5U3FsVUZ0QlJBeklsTUJzSGRWREMxVU9CMjRRcGdORlloOFVGQmFmYWlKVEFDcFBaVkR0QTBReVlXbEVwaGJNcWh4YVVRNHRQZFVweGJQZElsTTNaV0pjbkZzMFFNTEZTbkZ2a2dZVzBWaUNMVlVweFlvVXdzQ3FHQUhaQTJKUU5naVV3dENzS1p1RWhSeEtJT0JWREN5VURZYnBFbzRxcFRZaUVCeDRTQnNVSUlzS3NCd1FFV29VY1ZZZzRxUlJ4NFZUT0J4NFNBNG9yWWNJZzRJTmlnT0tGSEJGbzRIWkV6bHNPRXdaYkRoQ2pod3BWSERvbFBpMkFSRyttRmFOZ0ZBY0FsR3dDVWJFYkJBY1JzaHl0aWcyUENpaGlxWWJCS2NyWUlOZ29vWUJFWTJLNE01REJRYkJGREU5VUkySjJSUXg0VWdHSVZnR0NnR0NLQjlORG5ENmFJMzB5cGxjQmdkbEZwY0ZVREJSV1BwcUxrdjAwU2hncEZwY09FVXVLWk1CanVFZ1hFS1pYQmNPRUFOdkNpMHB0NFZDbTE5VkZwVFlVS1RBNkptR01nYkRzNmk4eFRZWjl5aGdoczNESXVTL1RVS1EySXVRTmdVQ0gwNnFMVXpZVUF4bWtKbGNGTnFrQ1k3UWk0NVNHeXVudVJZUWc2NjZxQlRiMzJTS1EydHA0SUFiZENvcERidUhLR01seFBDaWtObGVFcWx4RGNxSTQycXk2T2VWQU50U2ltYngyUkRNVG90SW9BM1E2b0dBOEVUSmhhNjBpZ3RVS2ZFbGlkVlVPQTVnTWlVMkpRcW1JOEVETS9Lc1RPVGkwN2VDcVU0dFpXRk5pcmhGQU5WSVV3dFZpVXdDb1lXcXBWQmFvVXd0VlEyUEREZEF3dDNRTUxBT1VRemNLNHdHQUtzUXdzUU9MT0VEWUpoTW14UWhoWXFSc0ZVTmdnWVc4S0xqSTRoVklMSkRtTmlxRGloUnhSS09IQ0ZNTERzZ09IS0lPQ0tPQ0lPQ0dSd1VVY0ZVNUJ4VUsyS3BZT0NRcllIWkFjT0VLT0hDbk1jdVJ3T3lzSzJCUTVXd1JHd1VhYkJWR3dRSEJCc0ZGYkJWR3dLaXRod2dHSENEWWNKbGNaRDZaMlFvL1RRLzNCZ2hXK21WS0I5TW9WdnBwUnNDZ0dQQ2l0andnMklRREVJQmdFVU1BaHpoZ2lsd0tHQXg3S1FvWThJQmp3Z0dDQVlGWld3TUNpMHVCUkNteENnYkZGTGdQeFFMOU1iS0tHSENCY09HNktSUU5xUTVpR3hGTGdtVEJUYXBGSWJVVXBzNFFMaHdtY0xqSkRhUm9wQXBzZWFJdEw5TlFJYkRxb3BEWU82QmZwaFRLNEliT1BCUlU4V2h1NkJjWmhSUzR0MlVVcHRlRXF4TTJtcjkwQ0cyQ2lrTnAyZDFDRk5xZ1hFN0lPRUNCSFJkSE9tQWJwb3FoZ1BGVVVBNDZJaDJsWEFjVzdVM1JEZ2EwNFZRNEd5QnhhL3hST2M0REtvZkdWUTR0bjdFUlFXalpXSWNXL2VpbkZwMVZTbUZ0RlVVRnBTTFRDejhWV1RpMVFPTFVEQ3gxVU1MUUZZaHhic0VEQzFBNHNWU21GZ1FwOFVPVWNWVU5nZGtoVGl3b1VSWWRsVU1MQ25NYzVzUHdRTjlORW80QkNtd0Njb0l0R3lBaTNoQTJPeUZnNHBDamdpWnlZV0haSVVjRlFjRVFjQWl3UmFFU05pRVVjUnNnTGNKQm1WaVpIRXBqQm5MWWxGYkVwakJrY1NwQ3RpVlFjRHNvRDlNb045TXFsYjZaM1VvUDB6dWxHK21kMHlZeVAweWhXK253b1ZzT0ZTaGg3TW9vNEZFREZJVnNVaXRpa0daU0dNZ3lvemNLQVk4SU5paWhnZ0dDaFF3NVZLMzB3b29mVEc2STMwK3FMUXc0VUF4YlIwQU5vMlRsVnNVU0ZOaUx5Z2JFQzRJcFRhaXRodzZoQzRwQURaeDNVVXVCVkMvVEtsVU1EdW9GTm5aRkxnRXFGTmcyVVVwc1VVaHRiUWRVaWxOb0tnUTJJcERZb0ZJM3FpbHdmcWdRMm5aUlNtMkpVaTBoc1U1em1JZlRLVlNHMzhGRkliUEZSVXpZUHZRSmRiNGxSU1k2TWdCdDZsUnBOalJDRkkxMVVNRUlkbzdJdUU4ZkJCNXJUMTFYYkRnb0J4QXFVRkFQUFJBNHQ0VkZBTm9iVlZLY0JFT0xVUTR0VkljV3loektDeHFqaFhuVG1VRm8wQ3NRNHRkQlFXdHlyRXprd3QvRlVPTFVpWnlvTFJzeUpUaTNoREdUQ3k0NktwVGl6ZEE0dDJWU25IcGxBNDlPanp3cWhoWVB2UU9MT0ZVUGh1RVF3c0d5RlBpMmlZNVZ6eUdGdkNzUXd0NFFvNG9oc1VCeFFoc1VpamdpR3c0VmhuSnNOV1VEWUJFRVdoVUhIaElEandtTUdSeEtRbzRGQVJZcVFjRVFmcG9wc0FwUnNBcWc0RFpBY09FTURod2dPUENGYkZBY1hRYkU3SURpVU9Sc1VnMlBzeURZb05pVUsySlFIRTdJVnNUc2ZCQ3RnZGxGSEFvbERDNUZvL1RLSTJDaTViQlVyWThJZ1lqWlJSeC95VWcyUENSUXhHeVRJR0FRYkJJWURBSkFNQnNtVEFZY0tSYTMwK0VLSDB5aTVENmR5RFlKem5NR0ExVVVNQWlVRDZZVXFoOVBoQXVIQ0tHS2dCdFJTNDhJa0tiUXB5cUJzN3BWS2JPQ2dVMkhaQXVISGRGREFySzBwOU5BaHNSU215c0tCVDZZMlVxNXdRK253b3BEWndnWEhjS0tRMklFTnFLVTJoUlV6WndVQ0d3N0lFTm1yTEs0SWJFcXBtd3FMU20xU0xTR3p4MlV5cVdDQUcwS0ZUTm8yMFJhbWJXUlFZZmVvUjVZQUhETHRLNVV3QzFHVkJhM3hRcHdGV2FvTFRzZ3BiWStpRlVGaDBGVlRKeFlVU3FDemRWRkJZN1NxaWc5TUN0VVRPVGl3S29vTEFoVkJhTnU2RlBiWndybE1LQ3hRcHhhT3FzUTR0T3lxR0ZpQjhlRllIRmhWUXc5TkVPTEFnWVc4S3dQZ2diQUltVEMxQTJQRElvNEtvY1dkMEtZV0loc0FnSXNHeXFHRnZDTHlHd0tJSTlNb1UzMDkwb1Awd2xEQ3diSURpTmxjSmtjZXlBNG9EaW5NZkVSWWdPQ0E0QkFjQWhXd1NnNGNJZzRjSURpcU5od29vNGxCc1VRY0VHd1JSd1NwbHNGRmJGV0ZvNGxBTVNvRGlxWWJGQnNWSVZzZUZSc1Rzb280blpCc09FQXhWR3dDbEd3Q1ViQUpTTjlNSU45TUlOOVBaU3JBdzRSZVVNRVF1Q0RZS05TaGdxZ0cwN0tLMkhDQVlJQjlOUUQ2ZktpME1FQXdRREFiSXVNbHdHeWlnYkJzZ1hBS0lHQ0tVMnFSUzRxWlhCY0VvVTJjSlZMZ2RrTUZOaDJRS2JGRklmVEc2S1hCUXhraHNDZ1UyRFpGcEQ2WVVVaHRHb1Vpa05qb0pteFFJYlVYQkRZNmN5ODZSdFFJYlB4V1dvUTI5MURDWnNHaU5jaERieDNVRXpaM1FJYkRzb3BEWjk2aWx3UXJ5UmJ4Qzc0Y0txTFFKMVFQanRDcVpVRnBaRXpsVVdwQlFXNjZxcGs0dDRWZ2NXa3E0VEtvczNSRkJhOUtLb2NXYWxVVUZ2RUlLQ3p1aUtDM2hJaHhhckVPTENxSEZxdU1HVGkwbEVPTENxSEZpSlRpdzZCVkREMHlnZjZhVXB4WndvVXdzS3FVdzlOREdWQjZTVU1MQXFoaGFORkZNTGRGWXlPQlNGTmdxRGlFRE5zRUJZcENqaVZVRVdFb1hKc0VCd0tRbzRjSmd5YkFvRGdVcURnbEJ3U2c0SlFjRUJ3NFFIQkFjVUJ4U0ZiQklEaWtLd3M0U0djamh3a0sySEFRSEE3QUlEZ1VXdGdkMFNqaHlnMkNVYkJCc2VGT2RlWWNUc2h5dGlka0d4NklnWUlyWW9OaHdpdGh3VkViQTdGVWI2WlVxeHZwOUVBK255cFZiNmFVRDZhVWJCQ3Rnbk9jelk4SUJqd2hBeFVxeHNVQXdRREJDbCtud3lOY2pmVEtJWEFxS0dCUmNaREFLQWZUNVVBK21xRlBwalpSYVhCQU1PRWhTNHFLVTJxS1UySUVOcWtVcHRLQlRhZ1EyS21DR3cwV2N0RU5oMlNITVUrbWRrQ213N0taWENac1VpNElmVDVRcFRadXBuRFdNcG14U0NaOVBoS3FaczRVQ0czaEZJYk95S25pUTdxWlhDWnRkUVR1c0tLbWJkR1VWTTJLS1hFN0lQSlllSzdZY09RNHRjcWl3dG9vR0Z2REJhd3lxTGV5Q2x0cDdiS3BoVzIxK2RrRkJhdFl3emxRV0ZDcUN6UmtTNE9MRlVxb3NRVUZpdURLZ3NUQ1p5b0xPRlVPTE9FS2NXRFpYQms0dDRWakp4WWdjV2dhSVU0dEd5SVlXdWhuQnhad3FoeFlnWVc4T2dZV25aQTJCMlZUNG5IcDdwVUhCQ213UU1MQ3FVUjZhSlREMHdnWVdEWlV3T0kyVWdaaWtCeEtzQndLSWJCRkhCUU1MZUZZbGJEaE1HY213T3lmRStBNEZDamdoeWpnbEJ3UWpZSURod2hCeDRWQnc0Q0RZcUtPSlFiQkV3T0tLMkJRbzRGQ3RnZGtLT0IyUXJZS0ZIQkNoOU5Vby9UVUszMHlsQXdRSERoQnNDaEF4S2hHeFQ0ck9Sc1RzZzJKMlFiRTdJTmlkbEJzZUVVTVVHeFNMUXdVR3dDRmJDMUNoZ0V5WUREZ0tEWW9GeE95SzJKUURIaEFEYWhDNEJBRFlpd3VIQ21jbU1CZ2RrYURBN0ltQXc0VWlsUHBwQ2x3U0xTL1RRS2ZUVUMvVEd5UUQ2WTJVeXVDSDB4c2lrTmhDaGdwdFVVaHM0UlNHMUFodFJTR3poUUlmVEtLUTJIYnVvcWQxaWlwbXdxWnlFTmlMaktaOU1LS21iTmxGVE52Q0ttYk9GQWhDbWNLbmRhZndVVkkyb1NsYjNVMFVpdkdGcTcxd3FndFZSWVc4Smd5Y1d1emFxb3RiYVB2VlJRV3BneW9MVldjckMxa0RpM3VpS0MxV0lvTFZZWnlwYmJSRXFvdE5LcThoeW5GcFZRNHNLcUhGaEtxS2owMUtIRmlCeFlnY2VtRVNtRm9FTXFoeFp3cUhGaUJ4WndrUy9Bd3RWaUhGcVl3b2kxV0liQkF3c0NwbkJzUnNvUWNTZEZjcGd3c0taTVpOOU1vRytueWdPQ2xEWUtvT0FRTmdOa3ljbzQ4SVp3T0tFSEVvbzQ3SlVnNG9vNDhPcWc0Y0tBNG9EandnT0tKeXRpclNEaW9zYkZTTFJ4Q3FRY1JzaG5EWThJUWNlRXdSc1VpOHpZb1FXUWpZOElrdzJQQlJjeHNUc29zSEhoQnNUc2xTRGlnR0NBNGhGYkVLRFloRWpOd2d6Y0ljN053aXMzQ0FNZzJLRFloUURIc2l3TVVHd1FnZlRPeUFZSFpSYUdCN29OZ3FCaHlwRmJBS0lHQTJSUXdHeVF1V3c0UlNteFJjRk5xSURLcURicVVnWWhDQWJPRVVoc095Wk1GdzdLS0JzS0JmcDhzb3BUNmZzRW9VMktLUTJjS0JUWU5rTVpoRFp3b3ZPUTJNaWtOcWl3aHNVRXpheXFrTnFpeE0yY0lFTm5DeTBtYk9GQk0rbVNpcG16ZFJVelorS2hVallpODVEWUNwVlN1dENLbWJSUmxCUEVQUlppMTR3Qzd1Q290TVF0TXFDMG5SVXExdHFGVkZsRmNKbFMyeWlxSzIyZGdsUlVXRFh3UkZiYkJzbVRHVkJZQm8vQzBpZ3M0VlJVV0pFVUZxc0RpMUV5b0xGVTVUaTNaSUhGaW9vTEcwU0ljV0hRS3dPUFRLWU1udzZLcGt3c1JLY1dJR0hwcTBPUFRDSWZFRFJTZ3R3cVF3dFJEQ3hSVEN4S1F3dFZRY1V5WU1MZUVJSXRlZ1ZEWUhaUmVRUllxbE5naVVSWUVLT0k1U2c0alpBY1JzaEJ4UWdpMUZnNHBnemhzVUJ4Q0lJdEhWRkhEaEVvaXc3SlJzT0FsQndLVlJ3NVJLMkEzU2c0RGxRbzRqWlZLMkkyVXl1R1liS296RFpSV2JoQVc0UVpnaThyTWlNeUsySVZSbUNpdGoxUUhIaEJzRkl0YjZaNFZoV3c2SVZqNmFGYkJJVU1Bb3JZQlZHdzRDQVluWlJXWWhFWmxNWVhJTWhHWUpCc2VFV3RnK25pb0I5UGhER1FQcCtPaUtIMHlvdEtiTnlnR0NEWWhRZ1lEWkFEWU5rQXdRS2JObEdpWW9BeUFZaFFMaHdxRndPeWpSVFp3b3BUWWRVUXVDS1UrbXNxbWZUVm9VMjdxS1EyQlFxWnM0VXl1TWtOcWlrTnZDR01wRzFGSWJYU0Nac0tpcEczaFJVemFwRlROaEZGRlNObkhaUVR1c2VWT1plZEkyNkl1RXpaQ0xoUEZTTFhqaTNSZDNuVkZ2WldDZ3QyVnhoTXEyMnF4RnJiVUZSWXlyT2NxMjJjSUsyMkxUS2dzVkZSNmFDZ3NWUlVXVVJLY1dCRVVGbkNxS2l6aEE0dENFT0xTVlVPTEFnY1dyVVEyQ21ES2c5UGhWTGc0c1FOaHdpbXhLVkREMHpxaG5KaDZZM1JENEJDbUZnNm9sSEViT25LcHNlRVF3c1ZJYkJBY1VCeFFnaTFET0RZOEZDRGdkbFFjRUJ3VXdaTUxGU3RnRktEZ0ZVb2kwZFVLT0EyVW9PSEFRcHNWVWJIbFJSeFFqWXFvMklVV0RpRlNOaUVnekRaUlJ4NFZRY2VFSTJKMlNLT0pTRFlwQnNlVUJ4Q1F5MklTR0J4R3ltZVE1Mng0U0RNaGpETWl4bUNKQlpBTVFnT0kyUld3NFVHd1ZHdzVVbzJHNVNnWUhkQnNFbzJIRHFWUXhHeURZQlJXd0dnQ3FCZ29vWUlCaWl4c1NoR1k3SVFNZUVHdzRVQXdTaGZwbFJRUHBvWXlIMHdoUzRCVC80di93QkRBYktLR0kyUURBSWxLYkVVcHRVVXVLQlRhaWxOZ1JDR3hGeFNtd3FGSWJPRVVoc1VDbjA5bEY1RXpaM1JTR3hSVXo2YW1Wd21iRkFoc0NMeXBteEZTTm9VQ0d3S0xoRTJ0MFVhVE5tcUNKdFpSVXphNmlvbTFGSmlvcnhyYk4xNkhuV0ZqNlFyaEZSYTJpQ3R0bkNJdUxXcFZYQ1pVdHMxVlJZV3Fvb0xWVVZGdkNvb0xEc2xSVVdIWkVxZ3NLQ2dzVlRLZ3NWRkJZNkljV0FLMUZCWndnY2Vud2xJb0xGVXprMktKRGkxS1F3c1FNTEVEaTNoRU1MZUVYUElZV0haVkRZSGRBdzlOTTVNR3c1UkRDd0lEaUZRUllnT0lRTmloUnhSS09LR0J4N29jNXNVR3g1VklPTzZnMklRTUxlRlFjVHNrR3hPeWtYQWl3cWc0RXBBZnBuZEFjT1VSdnBoRkhBSURnRXBHRm9UQmtjZUVJMlBDRFloQm1DTERNaEdZN0tVSEU3SWxiRXBWd09KU25NMkNVck1FcEF3R3lVZzREWktOZ05rcEJ4NFF3R0tpdGlOMEkySVFiSGxDTmlnMkpUSTJCMENISTJKVUd4Uld4UkF4Q2l4c0J5ZzJBUWJCVElHUENaTUFRZ0RJb1l5aDhBd1FERlJZR0o2cW96RlFBMm91QzRncUxuRUEySVlBK21pVXA5TXFaYXhrTUNpRXhVeTFnTVFnVTJBcUJUWWlreFFLYmU2QlRhaWtObkNaTUVOaFVqUkRidXBCTTJKQWwxaENpcG0zaFRPRlR1OU5Gd21iRkZUUHBxQ1JzUmNaVE5pTFVyckZGU3V0R3FtVlN1czJVWENKdFV5cE1aVUhqQ3dydTRLaXh0VmFtVnJiTjBGaGFleXVFeXRiWU5sVVZ0dGZvZ3RiYnd0TXFDMVVWRnFJcUxVUlFXcW1WQlp3aVJTMnc3S29xTEcwUkRpd2xVcWx2cHFsVUZpSmFZV29oeFlvcHhZRlVOaU5naUdBVmhUQzA3SVU0c1FNTGVFUTJQQ0FzaXdjVlVoc1ZRd3M0aFFIRGhYbVRuTmdmOEFDZ1lXSGdJRGdkMFFjRVVjQWtCRm8wZFdBNGNJR0ZuQ0FpMUVqQzNlVVVjUkNFSEhoQVdRYkU3S1ZSeE95ckk0bFNxMktVSEZLTmg0cFNqaU5sS0RpTmtvMkEyVEJrY2VBZ09KNklOaW9OaXFOanlnMktBNGxNbUd4S2xWc1NsQnhQQVJLMkI0U2pZOHFWV3g3cFJzRTVUa0hEaFVyWWdhS0x6aGlOa0xCWWJLMUF4NVFiR0VvR0pSV3hLWEJ5c3hTa0RIaEtSc1VLMkNGWTI3S0xXeFFiRW9BMVZGRERnSkNoam95TEdZZUNobkRZOElrQmhzaEFJN3FMQU52Q29VMkZGd0JzT3lrS1hFcEZERklSc2VGSUZOaUJUNmZDQkQ2YW1Xc0JncWxLYkZsU214Q2tObkNqVktiR1JLVTJoRGxJYkVWTTJiS0tRMjdvcWQxaWdrYlc1VEs0VE5xZ2tiU0ZscE0ydWlvbTFTcWxkYjRKbGNZU3V0UXdqZGF5aXBYV0tMVXNTbzFYa0MzWU91enpxMjJIWlZGN2JDZWlHRnJiR1ZTcWl6bFhDWld0c0dpdUV5cmJZclVWRmcyUkZyYkJzaUtpM1pYR0RLZ3RWUlVXb21UZ0t3VXRzVlRLZ3RSREMxQ0hGcUdUaTNoMFE0dEowVndad1lXSFpBNDlNOU9GUlFXZmVpR3dDUW80cW9ZV1NnWVdEWjBXbUZpcUNMZUZBK0pWUWNlVUlPS2l3V1ZnT0oyS0VIQTdLNXlZd2JCQWNRcFNEakt0UWNKcXMyTGFPQ3RTdGdBZDFDbXhHeVVIR0tKUnNkNFVVY1R1aVVjUXFNdzZvQ3lJTGNJUUFPRkdzNEhFN0lDTFNxallvc0hIbEVqQzBhcUxHeENFSEVJUm1HeUVaZ2dMSU15RVpvU0hNekpCbVFnc2hHYUhVV05pVXlSc1VTTmlnMkowUll6SFpDTWJUc2d6SFpDQmp3b3JBSmd5eklrWmtpaXlad015VEl6VFJBTVVBeFNyR3hNcGdnWW5aQnNlRlViQkl0YkJDNEtiUEJSYUdIS2N4enRpZGxVREZsRmJGUWJFZE9VeVlERkFwc1VYQlRiM1JTa0lBeWl3ckltY1FwdDRVVWh0UlNtMDdJRU5xa1VwdFVPWWhzUUppVkdpRzNoVUliT0ZLcVpzSVFJYmV5Z2tiRkdzWlNOaWhValp3cGxVcnJWRlR1dDRVVkUyc2lwWFdxS2diVzZLVllUQ2FwU1BGdHRYVnhYRnFvdGJhckU1MWhidXJobkt0dHJyVVJhMnp1bElyYlp3cWkxdGhSRmhZZWdWd2lnc1Z3WlZGaVJNcUQwMVVVRmdDQ2d0VlJRV2NJSEZvMlZqSnhhVWdjV1VSVGl4RWg4VlVGdUVpbUZoMlZRd3NRT0xEOXlGTUxEOTZGTmh5bFEyQVF3TEJBY2VGUVJZb3VUQzBCS2tNQWRFcEdaS0N5bFdDeWN5YzRpM2hVSEVxRkhGS2dpM1JBY2ZKRmc0OHFvMk81UWJFS0xCeENFWmhzZ0xEWkFVTUFneUtJQlJHeE95UmFPSlZSc1NvRGlVR3hRSEZLTmg3QkN0Z3BSc0VXNUVXb05pQkxvbktPTUlZYkZGYkdBaDhXYmRCaGFrS3pGQm1QM0tOTXhWUnNTR1JXWkVabE1yaG1QUkFjWUtxTmlOZ2dHQVJXd2RRbzRiSzFBTmgyVVZtYlJXcEdaUldZS1FCa0dJRG9ZdzJJVkF4NVVVR0txTTNDRUJrVU1lNlVBMitDaTRManloQXhPM2RBR0tpdGlpQmg5enFMbkpUYjJTaFRZaS83aTRxTFF4Q0lYQUtLUTJLQlRZaWtOcUVLYlZCTTJwVmladFJjRU5xZ21iTmthd2tiV1VpMU0ycUNOMXFLa2JWRlJ1dFVoVXJyVkZSdXRSVWJyVkZxV01xTlBJdHRvdXpndUxSc3JoRjdiZFdXc1laeXNMZUVGcmJZUk1yVzJxNFJhMjFWRlJhcmhNcWkwN0trVUZuQ0N3czNDdkl5Y1dub2dwYjZaUXpsUVdKaE1uRnJxbk1vTEVvb0xCc2lIeEd5SEtJdDRWU0hGcm9waGIyUkRpM2hWQkZxWXlad1lXaENHYmhBY1RzcUd3UW9pMUNpTFNhcVVOalJLRGdpVWNWS0RpRUJ4R2dRRmtCWlV4aG1Rak53aXdVU01oQnhPcUsySlFIRW9YQTRvallwUWNmSkFjUWhobVVvT1BEb0Rqd2cySjJRSEVvUmhhZGtNdGlka0d4S2lqZ1ZZTmlVTVliRTdvUnNESG1nMkJLYzV6RGdVR3dKUUhBOElOaDBRSEIwbzJKNnBSc2VFb3d0NFRCbHNmSkNNeGZWU3JHNmhWSXpCUlFZYklNQUVNc3dRWnZGRkRFb1ZtS0RNVVZtUWpOQ0ViRWJLVWdZZUNEWWRHUURFcFJtUVpsQ3MzZEFNUnNsR3dqM0lCaWxJRGJxa0RIWlF3R1BDTHlGeEVvb0cxbEFGWWdFQ2l5cFRhZ1UyK3hSYVFoRktSd3BGS2JVaUVOdlpSYW1iV1JhUWhRSmRiMlVpMU0yOEtpWkNnbWJlRVZFMnFOWVRJVUViclVWSzYxU0toZGFvSlhCUlVMclVWTnBRcnlyYlYwYzE3YkZhTDIydXJ6TXJDd0lsWHRzZFV5c0xkbGNNNVd0dHBFcW9yYmFxUlcyMUJVV3NpS0MxMVV5cGJZaGxRVzhLcGhRV0haRVV0c1AzcW9jV0lHRnBLQng2WTNRUGdOVlVwOEFoZ1JZTm5RTXdWUVc3S0tMS29ZQTZJZzRsU3JqQmdPNlVnNGxBUmFoa1dSRFkwS0VIRkNOaXFvNHFGYkhoREFpMUtaSEZBUllFd1p5TEFHaUlLVWpNZ0l0SlFIRkNEaHVxTmlvc2JFSkFSYWhrV1FacFpBV0tISXpJRGlnemRZUXJBSVpGa0diVGJWQ015QXNoQWI4RVVVU00zM0lyTjk2SXlLM3NVR2tGUWpONElSbVJXODBJTElrWnRFcWkzSFpLakFKVElZNnFMV3dFb1ZzQnVVR3dDRnl3czJUQm1oaWRrUm0wb2k1dzJpRVpnZ0RJTVFtVEFNVzl5aThqTTJpSzNaVkFiVlJRTnZLQVluc2tLQ0l5UVp1NmtVR0NVZ1k3S2hUc3lBTjl5RkJwYXFLVEhsQXJNcEZDRVFEYU5GQWh0UmFRanlSYVZsQ0ZOcUNkMXFpcGtLS1FnRkRtU3V0VVZNaEZUdXQvRkRDTjFzcUxqS1pDS2hkYW9xVndVRUxncEdrYnJWRndqaWg4SG5XMjhMb3hsZTIwN0tzcjIyRktpOXRoVkZoWm9sUmEyeFdwbGEyd0tvcmJZTmxVcXd0QTBWVG41MUJhbUV5c0xRQWlIQVZGTGJWVXlvTGVPaWdabFE0dC9CVWh4Yjl3UkRZb21NSEZ1eUtZV3FvT082Qmhic2lHRmlVRVdpWVpTcmtjVUJZT2dJdEtxUTJJMUtFRUFiZEZGaklHYmhWQkZwUXkyS0tMSWtGa0J3T3lBNEZBY0FoekNMUnNoekRqOTZpaXlxTXlVRnVFR1pCbVJZTFZTSXpkMEdZS2pNa0c4dGxGYmhBVlJwUVpDTXlETXBneXpiU2hCWktSbThFVm1hcVZPZG04RUdiVlRtVzBXR3F0Um0vQlJXYmhLQ3gyVlJtVUkzZEZaQ0NoR1JJeklyTXBCdWlvM1ZRWkFLYUtLeW9LSUVhcUt6QlZBTnZMS0tCQlFCajlxcU1nQ2k1WmtLRFZRQlVaUlFaOUVBYlpDQTFYUUJJQXlrR0lIWkFHMUN0UXBHNkJTS3NpNHlCdDdJRU5yZmNwRm9JRk5xZ1FpdkdpTFNFZmdpMGpLTGtodFFUTnFoVXlGSXFkMXFDUkZZVWFTSVFSdXRVWEdVaUZGUnV0VEs0UXVDeXFGd1NLbTBySzhyZ3RIQzZZdzU1V3RDcVpYdEN1RVh0dGhET0Y3YllXbVhUWjZIcTNCN2ZUdXVCL2lBTExPZHBweHo1dzFqWjZzODJNdW4wL3dCSCtwdmZEOVA2dDdWQXNKK0N6bmlObnA1OVdPbkRXTmh0TlhOcHowWmRObjdkK3V1TFcvby9YdUpvQjZkeis1WXp4bXh4aS83OVBUaGNjSnRzNW4relYwWmROdjdUKzVhL3QzNm4vdXIvQUxGai9JY052TkhheDF0LzBQRWJ2VjJjOVRwSDdIKzhRMzdSK3NPMytnOVQvTldmOHJ3bSswZHJUMXRmNHppOTFyN09lcDBXZnk5KyszaDdQMlg5ZmNON2YwM3FuL21yR2ZPZUIwOCszMmVQNTlQVzFqeWpqZFhMalliVHNhdXAwV2Z5MSsva2dmN2ovWGg5VCtuOVFEeE5xbWZQT0F4K3ZzKzNwNjF4NU54K2VUL28yblkxZFM0L2xiK1l0UDJUOWIxK2pmOEFZcy81L3dBdjMrejdXR3NlUmNmdU5mWnl2Wi9LUDh5WEJ4K3kvcXUvcGwvQmM4L2NYbDJQMTlIUzZZKzMvTU0vbzYraGYwLzVPL21XOHNQMmI5UUN6emFMWDhTRm5WOXplVzQvWDA5SzZmdHp6SFA2T3BVZnlYL00vd0QrbjlhT2JmOEFPV2ZWSGxtKzAvajFOZW1mTXR6cS9Eclgvd0QrRi9tcXYrNkwrL3FlbC9uckhxM3l2Zlk2TlhVM2o3Vjh5M09lblQxcTJmeUYvTmwvNWYyZy93REc5YjBSNFA2Z1dkWDNoNVZwL1c3dXZ3dGFmdFB6UFA2UGUwOWEzOXYvQU9iZi93QlQxLzAvNmY4QTFpejZ5OHAzM2QxK0ZmU1BtbTU3Mmp4Sy93QnUvd0NiR0gvbDFrNmZXOUwvQURsejlhK1ZielBaMWRUcDZPOHozZU8xcDZ6Mi93Qk92NXBOMkovUStuYnZjZlc5Tmg0WEVxWis5dks4WTVOcG5zNnVveDltK1o1L0pqdGFldGIrMi84QU5Bai9BR2IwQi8yMXF4NjM4c3orYlYyY3Vub3p6TDVkUGF3cFovVFgrWjczZjAvMDFoMEI5WUgzQXJPcjc1OHN4OGRXZjVXdFAyVjVqbjRhY2Z6SEg5TXY1bllISDlLeC93Q3RwLzdLejY4OHQvNTluK0sraVBNUCtQVC9BQVhIOUx2NWloL1YvUkFtdHA5VzV4NFdGWXo5L3dEbDJQaHRPemp4TitodVB6OGRIVG5xTmIvUy93RG1Fa2Y2YjlDSmJJK3JmOFBUZFRQN2dlWFkvTHRPakhpWEgyTHgrZmpzK25QaFVIOUxQNWdmL3dDOC9id0puNm5xdEgvWkxuN2hlWC9KdGVqVDQzVDBIeDN6N1BwMWVGUzMrbGY3NFRkbit1L1FXZ05TNzFibmYvc3dwcS9jUGdmaHM5cDBhZkZsZFAyRnh2eDE3UHAxZUZUKzFYN3lCLzZoK2lQUStwL21MUHVId2U3Mm5kNjJzL1lQR2J6UjN1b3cvcFgrN3Y4QU4rNC9vN1JvUjlRdi93Q3dGTS91SndudzJXdnU5YTQrd2VMK08wMGQ3cVYvdFQrNW1uN24rbWl2eTMrOW1XUGNUaHQxcjZjTmUzL0U3M1IwWkVmMHAvY2lRLzdwK21BSnFMYnlaVXorNG5EYnJYMDRYSDJCeEc5MDlHVmgvU2o5WFQvZkhvLzkxZC9uTEh1THNkenE3V09wdjIvMjIrMDlHZXRoL1NuOVdmOEE4dDZMN2ZTdSsxUGNYWTduVjA0NmoyKzIyKzA5R2V0YTMrbEhybi84MVlOeDlBeC84eGMvY2JSdU05cjZYVDIrMTcvSForcGovU24xbkEvMzFZUVlmNkJyL3dCNG51Tm8zR2UxOUo3ZmE5L2pzL1VzUDZUWE1IL2ZRQ2FqL1pvSC93QTBMR2YzSHhlVGgrLzlEZVAyOXpPWGlPNTlUZjJtSkxmNysxbi9BTUxwL3dCOHA3ai9BTnYzL29QYjMrNDduMW5zL3BQWTUrcCsvWE5vMzZZVysvMVNzNnYzSHo4T0g3LzB0YWYyOXg4ZHYzUHFQL2FqMFhQL0FKM2ZWdjhBb0IvckZuM0cxN2pIYXo0V3ZiN1J2ODluNmhIOUovUmRqKzkrcEd2K3pqL1dKN2phOXhqdGZTdnQ5bzMrZXo5VEQray9vQmlmM3U4aU1oOUFEenpLWi9jYmFmRFlZN1dlbzl2dG52OEFQWi9pcC9hajlHLy9BS3Q2MVA4QTRWdjJySHVMdHR6cDZjOVRmdC9zZDlxNk1kWWorbEg2TjJQN3Y2NGYvcTdmdFQzRzIyNTA5T2VvOXY4QVk3N1YwWTZ3UDlLdjBRTEg5NDljUi84QUN0ZjNwN2piYmM2ZW5QVWUzK3gzMnJveDFyZjJxL2JQL3dCbitxZHRyUGN5NSs0dkU3clIwNWI5QWNQdmRYUmhqL1NyOXJIL0FPVC9BRlZXZkd6N0ZQY1RpZDFvNmNyNkE0YmU2K2pEZjJwL2EyLzlVL1V2d0xOT3llNG5FN3JSK1BXZWdPSDN1cm93cGIvU3o5bXhlNzl3L1czWGF0OU1lV0JXTS91SHhsNU5ucys5MXQ0K3dlRW5MdE5mZDZoL3RaK3luLzhBdi9yWGZmMDkyL3dLZTRmR2J2Wjk3eEw2QzRUZWErNzFCL2F6OWxsdjNEOWFTS1Q2ZitZcjdoOFp1OW4zdkVub0xoTjVyN3ZVSi9wWit5bW43aCt0ZUlmMDlmOEFpSjdoOFp1OW4zdkVlZ2VFM212dTlRZjJ0L1ppVy8yLzlhK2srbjMvQUlFOXcrTjNlejczV2VnZUUzbXZ1OVFuK2x2N0xiWDl3L1dlUHA5LzRGUGNQamQzcys5NGowRHdtODE5M3FFLzBzL1pSUDhBdkQ5YVFlZlQxLzRpZTRmR2J2Wjk3eEw2QjRUZWErNzFCL2EvOWxrSDlmOEFyUTM4VCttM0JteFgzRDQzZDdQdmVKUFFQQ2J6WDNlcFgrMTM3QkFQNno5ZUNRNy9BRlBTOTMwdml1ZWYzQzQvNU5uMGF2RzM2QzRINTlwMDZmQzM5ci81ZmRqK3MvY0FZTGZVOUwvVXFlNFhtSHliTG8xZU5mUVhBL1B0T25UNFcvdGYvTHpUK3MvY0dQOEExbnBjZjlTbnVEeC95YkxvMWVNOUJjRDgrMDZkUGhFZjB0L1lDeC8ydjl3RDArZjB2OVVudUZ4L3liTG8xZU05QmNEOCswNmRQaGIrMS84QUw3RnYxZjdpZiswOUwvVko3aGNmOG15Nk5YalBRWEEvUHRPblQ0Uy8ydS9ZV1A4QTR6OWYwUHFlbC9xazl3ZVArVFo5R3J4bm9QZ2ZuMm5UcDhKdjdYL3kreFArMS91TWY5WjZYK3FUM0I0LzVObDBhdkd2b1BnZm4yblRwOExmMnY4QTVmOEEvd0RML2NIbkgvU2VscC8yU2U0UEgvSnN1alY0ejBId1B6N1RwMCtFbDM5THYyTmhqK3UvWFdscGUvMGk5S2Y2TUxXbjl3dU8rT3oyZlJxOFRPcjdDNEw0YTlwMDZmQ0g5clAyYi84QVlmcmVDL3ArN0JYM0Q0emQ3UHZlSm4wRndtODE5M3FBL3dCTHYyYlQ5ZjhBckNXa1A2ZGYrUXI3aDhadTluM3ZFZWd1RTNtdnU5VGYydS9abS84QXYvMXp5Q3g5UC9NVDNDNHpkN1B2ZUk5QmNKdk5mZDZtL3RkK3pNVC9BTGYrdE9vbjAvOEFNMVQzRDR6ZDdQdmVJOUJjSnZOZmQ2bS90ZCt5cy84QXQvNjNrUDZmK1pLZTRmR2J2Wjk3eEo2QzRUZWErNzFOL2E3OWxqL3gvd0N0OGZUbzMvQVQzRDR6ZDdQdmVKZlFYQ2J6WDNlb1A3WGZzOGYrUC9Xa3M3ZyttM25ZbnVGeG03MmZlNnowRndtODE5M3FLZjZXZnRidVAzUDlXTFpZWTJFKzVieCs0bkZmSFphUHg2Mk0vWVBEZkRhNi93QU9vdjhBYTM5cnIvdlQ5U3hEZ0czMHg4RmZjVGlkMW82Y3A2QjRiZTZ1akFEK2xuN2FXLzhBTlAxTGsvNGJObjJUM0U0bmRhT25KNkI0ZmU2dWpBWGYwci9RUDh2N3Qrb0FPaDlPd24zaGJ4KzR1M25Mc2RQVGxuUDJCc0x5YmJWMFlKL2F2OUVJL3dCNyt1Ly9BUEZhM3ZWOXhkdHVkUFRucVQwQnNkOXE2TWRZaitsWDZLUC9BRGIxd1RwOU8ySTZwN2k3YmM2ZW5QVWVnTmp2dFhSanJKZi9BRXAvVHY4QUorOCtyYUcvaTlHMHoveXd0YWYzRjJrNWRoanRaNm1OWDdmN084bTJ6MmNkYVkvcFY2SkQvd0MrNytmOUFDMy9BTXhYM0YxN2pIYXo0VTl2OUcvejJmcU4vYWowQ1A4QTF5L3A5QWY2eFBjWFh1TWRyNlQyL3dCRy93QTluNms3djZVMkZoWisrRUE2bjlPQy9UL1NCYXgrNDJyNDhQMy9BS2NzNS9iN0h3Mi9jK29wL3BRUVAvWGYvd0RWK3oxbHIzSC9BTGZ2L1F6N2ZmM0hjK3NwL3BVWmI5K24rRUg5S2E3ZjlLcmo5eHY3ZnY4QTBIdDkvY2R6NmlmMnE5YVAvT3JPZjlBZjlZdCs0dWpjWjdYMHNlMyt2ZjQ3UDFFL3RYNnBwKzllblIvK2hMZisrcjdpNk54bnRmU250L3IzK096OVNYOXEvd0JaUC9tL291UCtydSsxYjl4Tmp1ZFhUanFZOUFiWGZhZWpQVzM5cXYxcGR2M2YwSUxIL1IzYWY4WlBjVFk3blYwNDZqMEJ0dDlwNk05YUovcGIrNXYvQU9wZnB1dU4vd0JpNmU0ZkRiclgrREhvSGlON3AvRVA3WGZ1TE9mM1A5TU9jYi9leWU0WERiclgwNFBRUEU3M1IwWlMvdGQrOEVPUDEvNlBIU2ZVL3dBeGI5d3VEM2UwN3ZXeDZDNHZlYU85MUIvYTM5NWRoK3YvQUVRMHI2bitZbnVGd2U3Mm5kNnowSHhlODBkN3FTdS9waCsvQjIvV2ZvQ0IvbCtxRC84QVM1VzhmdUR3SHgwYlRvMCtKeno5aWNiam0xN1BwMWVFRC9TLzkvRnBQKzAvdDVPdG85VDFYLzhBcEs0L2NIeS9QNU5wMGFmRW1mc1Rqdm4yZlRxOEtYOXNmNWhML3dDbC9SUWYvaTMvQU9yWFQxOTVkL3B0T2pIaVo5RGNmL3JvNmM5U1YvOEFUWCtZN2FIOUplQlUyK3FZOGJRdGFmdnp5N1B6NC9sL2l4cSt5UE1NZkpuL0FQZjRGUDhBVGY4QW1RUTM2YXJmOUx2L0FNVlgxMTViL3dBK3ovRlBSWG1IL0RwL2dnZjZlZnpNSC84QUQramN6dVI2dHE2ZXQvTGZtMWRuTEdmc3p6SDVkUGF3VzcrbmY4emluNlgwcnovaEhyV2ZFaGF4OTcrV1ovUG5zNVp6OW0rWlkvSmp0WVNQOVB2NXBnSDlCWngvcHZUL0FNNWI5YStWN3pQWjFkVFBvL3pQZDQ3V25yU3Uva0grYWdXSDdhTDRxUFg5QnA2M2hheDk1ZVZaeC82eitYWDRXYy9hUG1lTS93RGwzdFBpU3Uva0wrYXdELzVTWXEzcmVnZkw2aTFqN3c4cXp5ZjkzZDErRk0vYWZtZU9YL3E3Mmp4SW4rU1A1cEgvQU9JdkgvYWVsL25yZnF6eXZmWTZOWFV4Nlc4eTNPZW5UMW8zZnliL0FETUNSZCswZXE5dXhzUG1MbHJIM1I1Wm5sLzd0UDQ5VEdmdHJ6SEdmL0hWK0hXbGYvS0g4eVdzL3dDeit1WG93Qjl4VzlQM041YnEvWDAvajFNNSszUE1kUDZPcjhPdHpuK1ZQNWpmL3dCSC9WZjhoYTlSK1hiL0FFZEtlbi9NTnpxNkVUL0xQOHdpdjdMK3MvN20vd0N4Yi96M2wrLzBkckRIK0Q0L2NhK3psRy8rWFAzNjA0bjlrL1hFN0Q5UDZoOTFxMWp6dmdNL3I3UHQ2ZXRuUGszSFkvUTJuWjFkVG52L0FHRDk4dEQzZnMzNjYwYm45UDZvL3dDYXRZODQ0TFBKamI3UHQ2ZXRuUGxQRzQ1OWp0T3hxNm5PZjJiOTNZay90WDZ3QVZQMFBVL3pWci9LY0pubTIyanRhZXRuL0c4Vmo5TFgyYzlUbXUvYXYzR2YvTC8xUC9kWC9ZdC8xL0RielQyc2RiUDlEeEc3MWRuUFU1aitoL1dBbi93bnJCb0krbmRIa3Q0NHZZNTV0ZW5wd3huaGR0OGRHcm95NTcvMHZyMmxyL1E5UzA3RzBqNExXTnZzODQ1TldPbkRPZGp0TVo1ZE9laHkrcDZWOWpaMlhXdnVHVzlPckdybXpoTTZjNDU4T2U0SWlGd1JVYmdzcmhGcFNLL1NQcC90SDdWYmM5djdaK2x0MGowZlRIL05Yd1BWNWp4V2NjdTExNS9tejF2dVdueS9odFBOczlIWngxTzMwdjJ6OXZ0dUJ0L1EvcDdUTWowN0Eza3NaNDdpTTRtZHBxNmM5YmVPRDJHTTNHalQwWWR0bjZIOUlHUCt5ZWk0bTM1QTc2YUxubml0cm44K3JweTNqaHRsajh1T2pEdXQvVCtqSCtpc2ZYNVJIa3VmL2JyL0FOYzlMZU5scC8weDBPdTIxbUIyZ3JtNk9teTBnQjQyVUhSYmJwWGJRcUtyYmFkU1dmeVFWdHRQeXRYUUg3a3F1aTIxNFp2YjdWQllXNkNBK3lnc0xUREdLTWdZU1NCMlpXQnhhUVEwZys5S0tnTVJYN0ZBNHRKZmh3N29IdEZPNm1Rek9IRWcxS0tZV3NRR2cxNm9oc1hJTnhJWi9Qa0lLTUJBa25UMkNnQXRZZjRoQVlRdzFWb2NBZ00wN2pud1VVV053STNpVkJtSWdIeDA3S2tHU0NScng1NklDQWJ0R0dnTW9wbWNBOFFTZ0dGekNrU09xQXV4ZDZqV1BhcUFzUU5SUWN6cWdPSk83UTRNZmVnYkZxQnh4NG9BUnBJQjFvemZnZ1lXOGttZWlET1RJcHFaRmFVUWJnQ0JUelFZM1VBTHlCNHBFRWs2czRsaHY4RVVDUUhZc2RIb2dJb0E4eDI4VUFEZzhieE82RFBkc2VkTmUvdlFHanZvSUNBQTNrQmhXcGtvTUJRMWN4dHRWQTBuRVFmRGtJTVFaZXZmUktNYklORE9wMzI4VW9BQURoOUErbW4ySlFSYXpBa1BvWTNwVktOak1XaHRlbmRLQTM1ZFhOUS90b2dhSkxrQm5HeWdOQTgwbCtVQUF0ZjhvSkJnZEVHMG0xMk1hb01RSUxWWUViYWhBYmJRQkFqVTBRYkVQM21Vb1hFQzF6OHplUGVxVWFIaTBCaTdvTXdBeUwyaXNRZTZvTjF1alBQSVVvd1ozaVRYbW5LRFlnTnVkZHRkRUFZdzRsNUkwVkdhMzhwM2dQeWcySmdPWnA0YXBSbW1wQjFKMkhnbENzWEV5S0U3TWRPeUFrQjhYNVowR3dKMTQ1U2pNeGlsUzBzZ3djbHd4RWpKdWlBbVJJQmZSQUlOMFYxWW9NQ0FETDhuVkFvSkRCM1BqRlZVYTNFVWUycmluZEE1TGNiOTFGQVRJR013Z1c0QVBKY0F0dHNxakFOSWdPZmw2MWVxaWppREp0cno5cUJUYUdEZ3dYTUE3blJBSjFxTFhKUUM0T1RFYXRKUWFnR3cwTzdvTmlCSURrNm9FeGhyYXY4QWw5L3VWR2E0RURGNGtqUi93VUFaMkpreSt5QUFYVUpqTFNlYThJakFFaDIwOW9RaFFjclM0eC93elBpVVFYRndKQTJjdXlLVWk2USs3T2lBYmFXa1lrQ05RZUZRcGRpekVNVkZUeG1yVHJ2MVZRT0NLVkNLVEdQbEJFZmxaS2laQlpoT3cwZnFxRXhMa3kwZ1dvSjNEWWN5VlFwZnNOUzJrRklKM1dCd0RNMVVDWFdrMDBoMEhOalc3V1c5Z3RDVndjR0R1NkNPSFZ2dFJJaDZsb2M3dElmZE1JaGRiVVUyOEZSeStwWlpkYTF3RjFwMHVEaGF4bk9NM0NaeGpQTzVMLzAzb1haQStqWmMvd0NZWWd2NUxwamJhOGMyclBTeG5aYU04K01kRGp2L0FFUDZNdjhBK0Y5RmpYL1IyMDhGdkhGYmJINTlYVGx6L3B0bG44bW5vdzVQOTJmdHp0L3NINmZyOUt4dmN1bjlkeEc4MWRyUFd4L1JiRGQ2ZXpqcVZzdGVlMUY1YzVlcDFXVzYxM1VvNjdSdzdlOVFYdEJndjNTcTZiTGE2NktWWFJZS1U0RlZFWHRtSWNlM3hSVmhiRTBlVXFyMlcxSmdOVlNpb3RlZ2FEOWlsRjdRU1F4alErOVNpZ0JOSWtzRlE0a01KSnB0MVNpZ3RlQ0dJa3FVTmF3dGNTR2pzcUtXNnpOMUFkblVvWmhhQVRTSEk0VUZNV2MwcVNaanpTcWJXS2dPaUd4QmNFeThOVktDQTVoMjVIbTdLVU93TEVpU2xVSkltTFNXMCtLQWdOMEZSYkhWV3FObzAyMDYwU2pZQUM0Znd1NXRTaG1IeW5rbDlqNUpVTlVHQlNYNGJoS29XdmlBUmoxaUVCeGwzYzZoMlNoamFDTVNab1NmYVVvTGw2U05RMnFERVUxdEtVWW1oSUxFeGJxZ3dMZks4Qmc0R3ZWQUJKRC9BSm5MZElTZ3V6eUFSK1k3T2d3eWVhSFR0d2xCME1NUlVIeVVvemFBVVp3ZnNWb0lINXBZWEZ4NUtVQ2tNZVdsS00xcHRtWEx0MFNoclJhUnU0aUpsTTVCTHlCNGs5MUtBTWlCVVJWV2pQSURBN2pUM0tBdmtkUmkxRHVnelNEQTZWU2dNVGpxMVcyU2pDUmJMQTE1NnBRSEFMU0RiRHpzcU5hQzFYY05JU2hxR2JtZm55VW9RQ0xpeExuODJ5dEJMWXYrTG9DQXhjZ2d0RFVDVVlrQ2hkNUpQc0VHY2NBdzRkOVdTalFEOG9acHVhT3lVWVFBNWdNQnV4UVlOcEVSdjI2SlFURGg2YTAvRlFZVUFFUFY2OWtvV3BEYUJ5Ulh3cm9xREw0NnM4Q0ZLTjhyZ3N4QWdmWXFNK29nYm1sZnZRQzU1QUxpNGJWcVlLQXZxRFdRVHB1VUJFbHhCb3gwOEZLTSt1VFFRNkFTSkU4RWl1eW9Ja0VEU0FlenVvQStwdDZBNzlTcU0xUTh2SHM2VUtCYmFBRHQ1cFJyZ0RMdUJyMVRHUmlOUXpEWG9FbzBnYm1BSmg5VmFBd2VrdE4ycVViS3QxTGVZRlVCdEpPTVBBYytLQkhEczVCdVoycDQ5a1F3b0hMUE1kUWxVSFlnQXlYT081ZmRBUTVjYTZIVGdoS05VTnFQNFovRktBd2M1U2VSSHU1U2pHMDF0TlM1Sm4zSlFKMGMrK2ZzUUFFMElQVTZEUkFwWWw2ODhKUU1hTVNBREk1NnBRc3V4M24zcFJtRk12eTFsNnBSaHZMYWpVY01vZ0hrTytuNHBRRERoNTl2ZVVvRkpZbmJsMWFGT0pobUxvRXVacE5EQlFJYlNIMlNoQ3h5RnI3RStaVnFFYmNNL3dDWS9pbEVyclE1M2VvOFZhRUlEZ2tzWmNPL1pLSnMvd0FwRlBibE1oU0JJSVo2ZE95bEViclhtUnF6VlZvamVIZG5mZWlvaGVDWERkRXhrUkxQZHhwK0NJNTdyWklacFZvNXZVQUVzejZGWEdVYzkvc1ZhT2U4YUhzRVJ6NEYrMVZhT2V4NEtLNjdBdzgyS2c2Yk5uclRkQjBXbW14cW9yb3NCZ1ZJMVVIVGFUdTcwQVVWYTBVMGFqVFFxbUY3Y2lXbloxRmRGdVRidW9MV3ZUMjZxQ2drdlU2RDI2S2lrd0IzSFZRUGFEQW1KMjhVRkFOS1cyd3lCZ0dEVVBuS2dwYlYyY0UrY29waHViV0lMMnZ4dWlLeVI4djJkVVVYWU9UQUU3K1NnWVpQQmRCaGJ1Y3F3ZkJBUVFiUUNXRFNIMjZvTTBzMU5Ib0dRRUVXM1FJYjgzRUt3TzVOZkF4UFZSV0pKM0owY0tqRVE0aHhCTEFkVVF3L01KK2FVVVNTU3dKR2hjYklBNWR5WWtBZThlU0l4L2l1Y2tpb1BEb0M1TWhpTitSc2lzTGk3Q20zVFJJRGJveEpEQ1Bib3BrQUM1cTAvTStpQXVEcWFTMUprSUgzYVR4MVVBTkFDV0dwOW9BUVk2eXgzYjdOVlFYazVVRE1YVUdkeGROYWJJRkJKQUFJZVpZZUtvWndaeTJrYmZpb0JrWHhCTHZ0NGxJTUtraU1RMlNBZ2xvTHZyOWlBRnkvekFHNm9JZGlnTGtrblIzZnArQ0FBMmc3UHZXRUd5dUlBYW9JNFNBbGdXWnpKWmtHa05vR0p4cktFWW00aUMrZ0xmWWczRnBGcDFqNElRQUN6RUIyRGEwNm9RSDFCckxpdjJxd2EwMExPNGZXdWlCaVhpNVFaeUdEalJ3S29BTWdXZ3N6ZFB1UU54dDJIYnhRS2IySUJKRVZhTzFVZ3hKSmpVVjBRWjNJMEpMa0lOa1E0RGNrb0NYTlpod1c4WVFZWEVtcnNIaElOK1YycnFneExPeHEycUFaUVFmbEJqcDJRWTNIK0VaWmZsRVU3cEFYTkR6M0QwUVp5U01nNUkyUUFFaHhIVGIzSUMrUmVRZjhUZmFnRnhKYTBGcm1mM0pnWUdrbVdEa2JkZXFEWEZpQ2JxQUVEcDRLZ3UxQzMycURFbGhMQTFKajdFQXV5L2h0a01BUm9xR3E4Y053VkF1dW1SRk5ZVkNrTURjQ1llSWpWQ01aT2dOTFNQRkFKQWk0c1pCNnFnNjlJSStDQUZ5SGYvZ3pycDVvUURlUkRsOStVZ0ZRd0RBd2RDNkpERnJ0OW5vaWc0TEFNV21aUUFCLzRnOVdHcUVMZGtNZ1F3b1NPVVJuSWcxbHRpaWxhbFROQVcrelZFYlI3YUNDQ1ZCaTVmVW1nTkVBWTh1UkwwOGtBTlFDSlBIdHVvRmk0U2EwSjUyVklSeUFXUFNkZTBxb1M0RWdzNzY5K2lLUXcwdFRiNERoRUJ3UVFhME82S21RUkR6N29xNnFKM09OWFBDQ1ZSTUVlMnFvVWlLbmt1Z2tRV3BOMnlnZ2NnVExnNktpRnhMN0FWUVF1ZDlpeDlxTFNaUzlRUFdEN2JKZ2MxKzFEVkVjdDRKbnc2TFFoYy8yQkVjLzhYeGJ5VkhONmVtcjZxanJzSDJyTkhTS0FWbG0xVVYwMjBmUVUwNFJYVFlKYWgwUG1wUjBXT0dlZDMwM1VGcllxNEJaTTVWYXdUcVRLRG90QTFocWFVV1ZXdERHdlZFVmVuU0RLQmdDMnhmcWxWUUNndGhwTG1maWxSWEVHbFdZdHpWU3FlME43dndRVXRjTkRVZ1RDQmd4N1U1NVFFQWtuNXVROVZBYlhjM00rZ1pCVThRZEI4RkJ2emFFZ2x1eW8zeWhpTmZCaXFvZm5tb2FJOHBUbUdycCthcE1hNklLRUdDQUhNTWRlaUJuZHFGdDJvb01UMlozdVpBS0VtcEZHMGo3a29MYXRRNkpRb09WWG1oTk9pb2I1aWRIMTJQQ2x3Q0dZUm80TllOZkpLTXdOcmtQUHUxT3lVT1RUUjlDb0E4RnJYZlQ3ZXJvQXprUzlyd0NQc1ZvemxzZ1BscWR5b0RMN3pUaEFDWEpkbVppTlVCbzB1Q2FjSUI4cEZwdVlqZjIzUUJpZDMzSDJRclF6Z2dFT1cwOC9jb01LRnRLZmNnQUpJcVNTUk5PVUJiSXUwRFdQQktCeUJKMGFvSjhFb05XZjVoQlpBQVp4ZHJXWnVxQXcxcDM3NklGYTRzd0xHaEVNNm9ZUER1SWtTOHFBaHpJYWxVR3hhTWZDUHhTakMyQXhadllKUmdDQ0FBM1BSQmlLUERHbWhLQm1jT3hiK0RSQU1RV0JPWEIreEtNUmFRd2RuZWlERzBPd0JvR1AzaEJpTFFJTWhnSDk5RUF1QmN0Um5jaDZWUUEyczRtVG8zVHFsR2E0VjFodnZRRWc3RnBMYWRrQWtFT0dZUXhIZEJzZnpBQnkwOWRuU2pINW5rd1pIeGhBT0NESFZLQzl1Z2dVSUZFQXVJQkRna3RHdEhRRW1TUEVHblB2UUE0a2k1NHEreXRCakpqWGFXWlFZc0hmMytiMVFDUmFBQ01qQXVQanFsQnE3R0dnMWZwS0RDVEFMUHpWdFhRRW5qNVRVKzlBQS95a0dsU1dqaEFJcVNTTHFrVUNBc0FKUHlpQ0s5RW9QOEE3MHNEMVFBa2lOTlNmZ3lBRXZCR3NidlZBR0RNYlFDekVobnI4VmFNYlJvTm1xKy9zeVVKVVFZR2s5MWFHT2dxU1hyM1VBZHlBWGx0bFJvdU1PQVgwanVnTk5LQ2lsQUJKQllFQWVNS2pNN3c1RXpBMWRRSmNHZDM2VkRkT1VBbWtHd0NkVW94aDNOQkRhRHgzUUtEUnlkQXdPdFVRRDh4TDlSVWNJQTBRWVA1WTIrOUFwRVFBR3A5bWlEWEJ0Q3pHUlZBalBvUkVVWmxSSWdmbU1FT2xDT2RmUFFSVkJPNmgwSTBLb2tTNFBFT3lJV2F6QmdGQks3K0lDb05kMEVyZzBWOTZLNTc3ZmxJaDFxb2hjV1pnMmsvWW1CRzZzenlsUnpYQUV3NVpVYzk0RjNMSFRsVWM5MERkcWhFUllaTnFxamxzRGZGQjEyZ1BTZENvcTl0V0x5ZllJT3EzckgzcVpWMDJ3SG82bVIwV3dRNHFvdUZyQUg1ZmVxRG90dExEVjlOZ29MMjFPKzBxS29CRFVJOXRWVVBhQmsybnVVVlFPeGt6QTY4S2l3ZVhrbUZrT0psM1l6d2djRUI3clpHeUNnRDlEN2JJSGdFdTRlVUdETVM3MmlCdm9nYU1uSUxVT29oUUcyak9BQm9rVXdNZ2Jud1pBdG9KSWt5STVIWlVVMGtoekRiKzNSQVhyb2Q3ZkZRYlVHWkdtc2ZjcUNYRE16dFVxQlFITWdQTDg2VVZHSmNDb0x3Z1lXT0pBaUcyZnJ3cFJoYkRqNVMwQm9sQTdhMUJVQUZ4TGFCcGYyMVFBTzdzU0RMTzgrM0NCZ3dlR0FGVVVEVzZmOEFoRmtSc1F6UVlITC9BSElNWERTUUtVZjdVRFNBQTdlMElwSUlwU0JSajd3cWc3Z3lLL1lvTVRKeEVDa3h1RUJvU0QvRjdNaWppWW1wZDQzUkRZd1pvYUJGREVkRHYwOGtRd0UwSWJlWDJSUWNRUUg0N0ZFQmpBQVpnSURmZWdZdVdGdlY5RHFnRGFsMzIxWW9DYTArVm43bEJua2JFc2RrVnJLQ1k3U2RVeWhTUVE0cVF3YXJxZzBlR0EwWlFFRXlKQjhXUUFCeFB6Uzg3b01KRGdraG81UGlnSjFKY3RJQVFLd2dIWFNubDNRTmk4L21MdTJqOFFnRGh4SWgzRDZsQmhWelBoeFJCb2NNQzVBb0dlaW8xcFlNWHBPdkNnSXRoNjNmd3ZvMmlBUUpMeCtZMUNBd1lBWUNHNVFBdVRJb2UrNkEydHpNZ2Rhb0VZd3pER3M3ZEZRU1FTMFpNOVBlb0NMUURvRytLS1VDR0l4SllOS3FNUTVBTjJNU0EwTW9EaVJKbHBMNmRFQUZwQmt5SGNOeThGQUNhYXVXQTNiOEVCaWdFZUNLUndTUVd5R2xkV1ZRVGthZFlMbFFiVTFxMnlBMXJOcGpZb3JPVElHdmlpQVdxTGd6Z2x1eUFzSUlqWWpYcWdHVTRNRFNPZGhUWkFmbGh4NzJicDNRQnpEd1N3ZjR5RUdBeUV3WkJJalZBdU5OSWIyWldnT1B6RWtSeTNaVVp3WGF0M1NmZW9CSUhYY3VGUWVDQ3hsNm9BU1JwMGF2RGlFR05vMEdzalNabFFUSllnVkxVZGpLb3hyL0FKVFMvc0hRWTFMR3VvVVFwZGdMWGhqY0tJTVFLa0E5ZEVDRVYvdzZnL2NxRnVBbG5BdUtCQ05vbHFhN29KM0hYeExJRUlKZWhjVmZSVVR1REVuVTYrM1JCSFV1ZW5LQlFETGwyVEtZU1lWRTkwVkM0VE92d1ZSekdDd29YY0R3VkVTTmkwUENJamZSNjhLNEhMY0hCam9mWXE0SE5kVWh2RkJKamszbWpMazlQRm5BNURhcldSMTJlK2l6bFY3ZHhYUW9ycnRIR3lnNkxTSnUzK0NtUmExaHlOS2ZCRmRGZ2gzQU8raWc2QUdCMVlleFJWN2F3WVVEaHBBN29tRGkwd3dxYXZ1bFZjQUdHcFQ0S1VNSGU0MEdzb0xXZ1hPTjZqb2dhVDhyaHhYd1FNOVR3N01VRE04bWVtNlVQU2dEWXNRWXB1b0c2M0FPSjJkRllIV0hQOFBDRERRVk9nb1B1UVVoM2w3YWo3SFFBT1FBUTJ4Z3dxQ1hPckEvbDRPaWcxYW1tdkowSVFBT2JpOFhBMEc3Q1ZRd0FHVXRqK1lLVU96UGMwMEE2cVZRMUp1RGJieWlNS3NHY0IyYWZGQW9PcERsbmNhc2ZpZ2Y4MEdXcU5FQUZHREVFZGtWb3BONFB4UkdJZ01CREcwYklNYlM0TGR0QWxHWUY5OUJYeEZFb05odXUwWURTcVpEQUVSMEhQVkF1Skx4SUVQdUtIVkF3QUFFRWsxOFBCQmlRWEZEYlB0MlFFZ2tDQVJVZ3oxWm5RRjJJY2hoN1VRQmc3aXByZDA2cFJoaTF0UThPWU1ib0dhR25YM29wWEdJTkRpKzZJMXJVTFBieStwQ1pDdXdoNE9ueEJWRGdzdy9DYUtBUVdNYmdBUFB2UWFrRUJoK1p0Z05PaUE2dVFlQWVtaUtYOHhJZlNXUkRFUFNDQUdRQnlDejVDNlFISFJBSERQU1p1alhka0JxQjdFOTBDdEJ0Tno4KzhxaHBuVWpUUit5Z0labmNBZVVJTmt6aXJrc1hRS045bmR1ZFlRWnF1R3lZQnhwUmtCRU1mNGpYUjI2SU5FT1dOQ2FPZzM4TWtBRVQzM1FBdzRINVdJTE4zUVlseVNOOFJ6eDVvRC9BSk9wZDd0dGlneE1rdXdERGhCbU10QTAxNFFEVS93bmV0WDVRTkJobzhrVXJzWHh0eUlqZnVpR0ZYQmZZYU1nQWNtUnkwb01RQ1habzIvQkJzWGtING9wV3VmY0VzUTRoRUtiVExtUUdmaEtDNEppNzVSTS9lZ3pPeGw0ZjR5T2lEY0Z0dlowVUFMYVBzQWRSOWlJMHZjNEJJaW1pQm1GYUV2S0tVa1dzSFBNN3dpTUF4eURNWkozU2dPUkRFa09BTmExaEF4eGVXTTdvSmtFRFVROTBLMENvYTMrR0lmZ2NxalFIWUVONEFxQWt2cklnZHdneElvYm5yd2dCdEJ1THUvajk2QkFEYVFOOVBqdWd3YzNGOU9yRkJwQmpTczlVQ3pMaVRReW9pY1d1eExXajh1M1ZhRzZGaVJRb0V1YWJTVzJISGdnUXVZZHRlNkNWd0FNMEpvZ1FnMEpQbXJSTWlDYXNnam8yb01nRlZNa3VEaHpXamxSVUxpR3ViVVA5cXVFYzl3WUZvMUFLQ0JET1NYYVNxSVhCb1p0dkJFYzE0RHlRVHd0RGx2RnZtZEZSSmk3K2JLTXVPdzlDcm5DdW15NkJxVklPcXdqWXkwK2FLNkxDOGlQUFJTRHFzdTFhQ0ZtQzFwQlBjUHFGWXJvOU15ME85T2lrRjdidEFLMUNtY0t2WmNLMERNa0RPNWlIb1BZSUtXa0VrVlllZEVIUURpQ2FuUUtRTmFUVjRhZGZaMUlLaTVzdEJRSDNwQTlwTEdqczc5ZWlRWXlHeEllcCt4VVVFUEZhNkR1czVHYzFrblcwSDRTckEyV3B0YktvUENSUmVoSTdEY29IQnR0QUJiWUJJR3lGQkpQMkpBcHV5WVl0cHQyaElOa0hjbXNXbnJza0JOemlRWmhoeWtCQjFMaHRBRytHcWdkMkxnZ0FicUtVWFVhMW0vTUEzaDRxeEJ5QWNzVzJmbnF5a1ZuMUlBMmMwVlJzbU54bTVxSkJzZ0h0bzVqZndTQVNhMU1iSGRCc3FBV2dFSHoxU0E1Um83UVhpU2tHeUIyWVQ4VWltbGhrU0tleEtSREF0TEdmdGhTREc0TzV0SWVjdGZjckJudWNtUzRZU2cyVEQ1akpnRGs3S1FESUQ1V2JRZ3pHenF3SE5zaXpCbmd4cWZOSUJrMXJDalNhKzNpa0I1M2tuZEJqY1pOdHVRTzMycEFjaGJTMmRCcnlwRkM0aHc0QmVBVEd2S3VFQzY0bWdvL3kxTkV4Z0EzQ3RkWmFPVWdkNU1BdFE2OTFGSzh1enZyb1ExZk5WR0JKdUp4Z0QyaEFjaUFUb3pnRXBBTXlERWdod1k4VWd3WnpCM3RuUW9ObU1RS0VWbVFrQnlZZ3NKaHpIWmlrR2VlZWRnVVZoZVNCY1lCbC9ibElBQ0EvVUZoQ0lOdHpuOHJPS1BEZEVneHVnbDRNQnArMUlHTWlqRlJTa3k1RUdDNkl4dTRMNm5SV0RaQ2Zta2lOUWtHQmdERVpFRHlicWtHTnhGQXphN2U1SUM0Y0h3TDFVaWdiZzlHWXhNVW9yRURMVVFRS2M5MGdkM1lIdnlvcFhlQUc2ZTlFWVhSK1ZnSGZYc3JBY2dDSERsb2V2dEtrVmpjV2RnK2x2d1NJQXVrSFJtRFVxckJpU2FUYnFEcS9LQXdEU2J0SVp4S2lnNHVmR0c3RjFVQTBMUTFDL2VpUUtjaERlRTdjSUZCR05vTFhDMDhGL0ZBUWFTeHRqNElNU3doM2NrRGt4OFVCZlJnKysyenFSUXlJZURkcmI3NnF3SEwrS2dBbjJaSUZCRFhSMkJKUkFjbHZsY0RVUDhBRklHZUNHWjdpd0ZVQkYrcEVOOHMxOFZJcENDR0xjTWFOcXFoY2dEcThselIyQ3NCek5vMEZlaVFDNjlqc0FhcEFRU1I0dWVhSUZkeVNDQ1F3cktRSmtBOE5wZDREWklBYnNpd3JhWFNBVzNPTGlJZHBKKzVUT0VZM0Fzd1lrdjVKQWo2V2dFVFF0UmFnVzR5ekZtMU5WSUV1SUFIeXRvd1NDWnVsM2d3Q2tDWEVzSEhVZFZjQ054dUlJZzdFUXJCTjhuaUMwS0NkOXpBRzdWbUtzRXJyZzcwY0pqQTV5VEQxYVZSelhHV2JqYVBCV0lqZGRYYzBEcEVjMTEwdFdycXdjdHhNblg0S3dRbW5kK1ZVY2RraVJHbHcrQ0k2clhiZmQxS3JvczNaNkhaa3F1cXc2YUNHVW82TFpBWnJ0SVVIVGEzeWs3cFdsN0RBZU42N2FLQzlzVm5VbjRLVVhEL0FEdFZTZ2hqY0hCM2YzSzBXdHBJbHFkVktLaUF4WmdZUFRsU2lvSUFGSE5BZ0laZ0JJMUc3cTBWcXdJRHY4cWxEUHJvVFRkQTdzSGFPZkhsUU1EUGFUenNpZ0JpOFBOUE4xYUN4ZVMrcHFQaWxGYUJuSWxTaFhKbkZ3RE82b0ltQmM3eWZKS01hTmFXZ3kreVVDNEdCM0JuUjlFeGtPZEFBd1ptRlhVbzJSQk9SalRmM29EYkpOTnZDdnZVb0FjRUI2VkFhT1hoV2hxQURzNmlzSGU2SzBQc3lVTFNsb0JrbDU3cTFCK1l0TU4zVW96dk52VnQ2TXFOOHNHM3Q4V1NoclJMWEI2a09wVk51d2VyQUZoMENVQ2FnZ2dSYTMybFdvTE5xNElabTBHaVZRR0krWXlHY0ZrcUMvWnkvd0J4VVVRN2swYy9kS1VBUFVPWm8rNlVFUEJvR3A4QWxBQkpBT2hGWG5vZ0lBSWExZ0tnaWpwUmdhdUcwYngxUVpoVUFUOFVvVUhaM1BCZmZWVkdCaHgrWWhBMW9MRVhUdnQ1cVp5cFNYdWNiZmxKYlhaVkJhRy9LSm1nOEVvQkQzQjVMT0IxU2d0L0VCSkx1ZkJTalBiTHlKY3ZzZ3dnMU56T1hqVHdWcWpsR1RBdjdCUUxhMnpCbUlJMDZxMUdEOTR5OEVvMmpFRTNTQUN6OFRSS01TQVlEQncramFPZ0lFRnFiQm1QYWlsQkJkeVkwS0tUUWdHWlBzVmFoaXpBRXVUUXhLZ0F1T1JKb05hY2pSVUVjVFRWaTZnMHM5WmVzSlJ0aVRpRExLMEFzNUJBWXRSS01BS3l4a2tKUXdPaGd0VGhSUUJEM2dpVCtiOFZVWTNBSG5icW9CQWd3S0RyVjlsYUM3Z0VnVFEwZFJRTE5BZGdJZDQ0VnFNVHFZWjVFMFFFd1dKY0hRNi9CQnBiNW8zSTgxS0M4Z2paanhzaWdRN2lBbENBaDIySmN1MCtLQmRnQWZsN04wVnFHN0V0N1Y3cUtBYVgvS2V5VkdJZDdpQzRwMjBWb0lic0tNTjFLcFM0TkdENGc5MFJucHFOT3N6NUtobkpJZ2lIZFJRZlV5N1AwUUFBR1lKRStUVlZxRUdSTCtmRzBPclFRemdURWg1U2hRWXVCMWo3dXlCNjBlM2luS2lsRHNRNGpRVFhSVkV3YU0xSmhBU1dCaHF5Z1FPR0xQRW5reVZNNVJtZVNRWG9kZXlVSWRTN2lySGxXaGJtTEF5UVpQWktGTGRDOG12WjBvbGNBUVcxTmErS1VUdUZJa2UxVmNaRTdpYmlSdnA5NkNVd3c3SUVQQkhCU2lGeGRtZGdTNFZ3T2U4aDNCbWFLb2hjWElpbXFvamNTVEJZaW80UkhOZEJvdzFLVWNsOURDMVJKNXJHNzZvamp0MW1xcU9xMmV4aFJYVFkwR3JzeWl1bXc2TWU2ZzZMWGFRNWFDbVIwV3p6S2pTOW1wbUM3K1NndmJwYzJyUFJNaTl0U0FTWE92S2dlMldMMTNwMlFWdGVkZjhBRUVGUVEyeDBQM0tCd1NSTnJBMWxCUzJMY1RNUitDQ28za0NnMTk2RE9CL0V3QjZvS09DeDBtTnBxc2pXczROc2JSdktxNEIzRkdNRVBNUFhkVU1IQTNMVTIrQ0I1WWdVME11b0NSazBzMG44Q2d3cEJlMC9taDVRRVVyeGtSMlpCc2dHZXV3MFBzVWltQm9DYW1DLzJxQWwyWjIzQmxoMVFhYUZtdUFHT2oxS0F2RnBBamM2QkJqYzJySG1pUUJnQ0IzTStDQlE1TENMQ3hEQkVZQnF4RWNJSEpodFJYU3FLVjVJeVl0QTBSQkVFVUVtVVU0a1d1VE5iZ2QwUVhiWEozSWJZb29Ha0Y3YUVsRUZ5RGJrZFB4UWE2QVlJZVNhb285OVkrQ0JXRG1IZ09LZFNpRGFRSUdtaE81UlFEeTRkcEIxazBRWm5ZbHlkUlhaRVkxdDJCY0h6bEFab1FRNXJzaWd4TEVWZzFpbXFJTkk4L3ZSU3M0dGRpQlFEeThFUVRiSS93QVdwWkFRd2M5d05lcFBLS0R1UVdja005c3hyNW9qTnJVR0JFQUlyR0t6T2orTElneFI4Vy9LSDE5aWl0OHphZ2lHSm5yeWd6aDJBSlpwMHFnQVlnaXI2Nm4ycWlNYXpTZUJSMEduRWtDb2pwMlJXQSthVEJwNzBCSmNaQXRGQnFnQk5vb1NDN3RVb2pFU1cwMkFyb0VCRHVjUXdFTkNLQWt3Q0FlR1krd1JHY2xzWG80Z0lwcEduQjE2SUFHTldOcG1KZnZ3aUFBNzFCb3huZXFEQzdvUVB6RGQrRWdJSHpRd0FEQUlvU0xvbi9KZHkzTDhvR01EOG9veGVBM21nQUJ0Wnk0Y05ETWlGY000bDZtUU9kRURHZEJhd2g5T2lLQmd0V1lJMzI4RVJtSVlQUVNOQjRvQytoZDl4Q0t4TU5UVDRJSW5ndmlISTl0MFEwaDJMMmlEMFJXWUFoeXdPanMyeURPSUFrRDJqc2dMaVRVR3VxQWFtTVdFYWxBUVdBQmsvZWdFQ3NSSmhFWm5GdTdPYlR5Z3dxNHRZbXQzUjRSUUlJQW1nbXBSQ1FhQmpQbG9GUXBZUER3SEQ3YU15b1lUV2Q2VVpRSFNKZUNTSitDS0JhMjBnSHJOSDNSRXlLU2RSa1BOQWZsWjNkeS9YUkF2ekNJYmlpSUJNY0NSMGxBaGVBQUhOUTIzNHFoYmcwdExWKzlCTzZBMVhMa2RFQzNZbGh2TEJRUk5HcnJ2UlVJUTFSbHozOFZSRVRzNW9kMENFbHdmTHpRUXVJWjJudXJoRWJ5SDJKUHhSWE5kdnpFTFNJMzhBR0tLWVJ6WHM4enMvbXFPWDFCV3J3N0tpR3VQbDhWVWNmcG1udEpUS09xMDBBTE5WUlhSYVdIYU95VlhYYnFBM0Rickk2YlphSElTaTFydVExR2I3VXF1aTJlRzBVcXVnRjZnL2Vwa1ZEZ2drbHpvbEZRU3hZNlFWQlFFT0c0WUNrNnBSVUd2QjdoMEZBSkxWMENnZTB1QmI0N2V4U2lnTG1qdzRTaGlDTXBMbVVvYXlEV0E1ZFRPUXhlTGQ0YmJsS0dKTVBIZEdnWUFia3lUOTZ0UVJjS1RNQTdUb3lCbW9HRE81OXhZSlF3Wm4vaTFyN2xLb09CaXdZYnFvMVdZNndSdnFsR3QrVzVuWUVsZ21jaHhjQU1oSUdnOXBXVk1YTUF0OEVvVnlDSUkwQXI0N0tvelUwYlQzYmJLVWJRTU9kQ0ExS0pWRU9CRWh0SVNqQjl3U0dGZmJkS0ZwYXpqTFFzUUNQWXExQmN1N1VQbDcxRll4RzRxQTlHMlNobk1HUzlTUEJLTUxueGNPMVhyd2xEWlBQNVdEZ0ZBZG5xYW5WS05RQUFzZllwUU1vTlEwYyswb01HR3VSREVxb01rMGdST3FsVnVUWFVhcFFSekpKcFZrb1c2NXJhYWFTeXFNYVRCNk9XMVVVZnlpNlhJTGo3MG96aTE2VFE3dHVnem5RNk05VUcxTGVESlJpUkJhWXIxKzlLQTRJQk9veUo4enlsUUdZQzFtYXBOQ3JRUVJXUXhFNytLaWllV0lNSGRLQTV0QmVXbVJTT0ZRUVFIRDR0UFJRQUVoN1pKMys5QVNJSWZZVUh1U2dGbmtFYjdkVW8zNVFSK1lBc3pQWFJLTXpubXBIVHYwU2dpb05RQkIzZnFsQlptY3ZTdmdsQWF1NU1kNGRLQUhBK1puZW85L21yUVE4QWpjbmhTalVEaU8xVDVwUm9kekV0YTJxVUVWcElnRktBQWVtNDZwUUN3cmNmbUJsS01DY20wUDVuanVGUWNwbHdYWmxBQ0NYSU5Rd0lLVUVWWi93RGhCS053UXhJbEFBekM3RmdIYnVsUVgzaVpQR2lLVW5FT0JJNWo3RW9YV1RRaUtwUWRpWEFkQUdJQTRFc1BjbEJreEJaNnp3bENzUWJvR0xUTmQvY3JVRTRnZk5JQVlrNmdLVlNuOHh1eWEzVWZGbGFoaVNTdzZqMmJoUlJJRGl1NENVWWJtbFFVb1hJaVNHQTNoVUt4Y3U5elVTakFHQUtEbjIwU2hRdy95ZDIrUGlyVU0yTUJnS2txVlFGd2U0dkZGUUxpSGZtVktKa3dibUo0QktxRE1GMmg3a29YOHR4aUttNTZBcVZBdUlCYkZ1RXdGbUNISklyd3JRcElQUStFcFJPNlRzeno3MG9TNG11bzltUVNKRGdidjh3bnpDb2lUb1BieFNoWEJnQ2RRZ2pjMDZnUTRWb25jV05PakpqSTViaVE1RkdyVlVSdUpmdFRXVmFqbnZERjlOdnhTbzVyMkxzUnFGUnpYbmpoV2lML0FETS90VktqaHNOQTc5RlIxV0ZoNHFEcHRpNmhQdHlvcnF0SjNiUlFkRnBBbVozUWRGcEZCektpcldOb2VvS21WZE5taGM5VDdsTWkxaDBZaHBQUGdvS2FNMUZROXJzQURJRlVGckNiZ0RYY0prT0dhM0ZuZU5VRlFSRlNlZUZrTUM3Q2owSTNDb29DQ0hxQUJUZFFNNTBKSm9mZWltY0VadXdVUm90ZWFsM0tLSWZUb2FrZTlVRTVNQ0ppbXFLZDd1aHF4KzVBUXdCYlFoajdGQmdSb0lKZW01UVlFalZ3RDdoS0F2UXM3d2VPRUd0ZzFrZ0ZNZ1BhV05BOGthdHgyU0lwUjNsNkFVOGxGQnlDWmNPU1JxZ3pOK1lPSHFVQmR5eGdzOEgzS0FBa0M2cFl3VHFYVkJNbDNBSFh4b2dEUVFDS0Z3N1VkL01vQTlDeDBacTlLb2hqU0RwRE1vckJqTE0xVUFBYTRrUTVvNm9iSWtCeTVxYlQ3Y0lNQ1R5RFJCaGRXSXAyMlFPTHJYZ2dhZGgrS2cwRm5Ja0JoOEZRSitaeUJzZGtHK1V1Q0tubVMyNkROQmUwUitYYUVCaXBJNmtLREZqQnFhY1ByS29ITGZMY1g0UUY2L0syb29GQU5DR0FKMDl6cWdpNE9YT3hIZmhTQUc2VFhqVFRkVUgrSFJ3MkxvTUdvRFVUOEdRQm9MRUJqWHcxUWFIRG1zekh0VkFmbURiRGZSQUl1SUxtRFNtcURTU0FaTFNXUVlYV3VXRWhtZndTQXRKSUFKRmE4SUF4THpMU0FJcFRaQVM3T1N4R3ZUaVVCSUpZMHE1aHg3MUF0c0NKR2cyNTNWR01TekE3VjVFSU5CTWRlcHI4RUdCdW5JRXRJQVpBZFhxNWZTSXFnRlJjelRvS251Z3hKazIxWjNhRDBRWnpMQ0trYmxrQ2s2UlB5eDdGRU9LSFEzYisyaWlnNEllTmlRL3VRQVh3QUM1YVJ1cU5sVndBSDhVQ202NEFrZUk1MWhBWG5sbjY5MUFvcEJEYXY0UDBWR0prU0hHaitLRGJ3SzFHL1FvQTVjVmo4emVWRUIvNHJnVTQzNVFFdVFHTldKUDJLQUMxdHpqSWZUb3FNNUkwSU1jSURITmFOT3lnVnc1RGdCNGJnS2hRV2RnUzB0MTRWRy9pM3U0S0FYQWdFaHdBUHphdHFpRzRhQTBuaEZBRnc4VUxIYnVnREFPQWNYbktpSVZ5U1JRRXNaazhlU0FSdFVPWDdvck5JZVJzaUJKMWxtMW9vRnlBY0ZxTzRub3JBdFhraDBRTGlBd2NEYUVDRWlDd2FpQkhZT0pmMktDUmVYa2lmRjFvVHV1N21qbjdrRWJtb2VIT2lER21qMVpRYzVnVXltaW9sY0R4eDhWUnozR3JTL3ZWSFBkY0pCb0tPaUkzM09DOEFWWlZITGZRaWRoN0ZVYzE5MHR0VklJc2MzaXF0UndXWEFibHlxT3F5NEV1enlvUjAyM05KcFJSWFRaZjdleFJYVFpmRDhRb1IwVzNDbmtvTDIzaHhxUVZGWDlPOE96NktDd3VBa09ZZ0lLaTd0Vm0zUWg4M1k3bW00UVd0dkowK1U5RkZoN1M0OHNmd1ZwRDIzTTRwdkg0cVpGUVJXYmhSUWg4Mkx1L0ZQZWhGTXJmR3ZocWdFTzJMN0lRd0l1SWJhbjNxY3hEWk9XYldQTkJueXBHNWFIblFxMVJ5SElQUmtHRjRZUkJiWVEzM0lSVE4yK2JFN2NuM29NYmlDWW5wNElNYnFRekFFQ0QyQ0FPR1lGalFnVmhDTnZwdG9aYnpRaG5iSUN1aFFqWmt3ekJvSUZGSURrTGhVaDlOWWxDR2UyU1o2OVZDTTRxQTFEQ0VBMzJ1NVljL0JVRjZQYVcyanpVR2NuZ25WQ01TQXhla3YwcWhBZGdEaTIxdXgrOVVqTTBoejVKU0M0bHh5VEZWQ01UUWdGM253OGtJQmFwSkdwUGJSVWpBZzVQYitid0xoQ0RreGVyVnBEZmFvQm1RSU1FUzlDcVF4dkFFaGdEVGRsQU1pU2FqVXQwOEZTRG1MV2YrSTdvUXd2RWo1bWhvVVdCbmJvQ3hrOHVpUnN4cFV5MzRLa1kzZ2sxQkZXZ3lnWTNENWhicUtId29vUWNnNThrV0Z5dG5YWExxaVFjcldkMkVzU1dRZ0EyM00rOEZDQ0xuRTJrQnRkMEFvUXdrUmE0anlWSXh1WUYzSU1FN3VvTmtKZTJha0RoVVlnQVVhZEQ1aFNrWjdSYWJkYXhvNnBBTndhSGNib1EyVnRzeTdValQ4VkZqWlduc1EvdEtKQzVUMGNBMXIzbFVqWjJBc0hCUHZRZ1puVVFaSlkrRVZRRWVwYkwydTVnMWNCUURJRVltMDFCWXREeXFSc3dkQzVwN1ZVSXh2dEJOckJ5STgraW9OMThBaWorOVFoY3dhdkViY2hDRmUwdXpIUUg0S2tFWFB1SEpaMEJCSmFPaFB3VUlMdzVsdG9qeFJZUjdTUkQ2WTkyVlF6aHkvQkZ1cWhBQkFERmlIcFNCOTZwQmNRY2QyYWpLQlhjVUljMUhUVlVna2dSQkR3RG95RUM2NzVYQjZqUVIwUWEwL0tTQVRCMDhxb1E3aDVNajJvb3NJRGF4TzRENitleXFSczNKWit0S0pBcElsaXhNeWVteW9CSllmeEhVY2FvUXd1bVFSUmdnVUVnVE5hZFpRaGlhdlI1VUlSeGFhOHNBL2RXa1kzQWhuSXhpcUVLYm5aZ1FYa2dmYWdEdk5zQTFDVUFYR0lmaWhVUU1tK1lUSHpTaEFMR1dKZXJLa0M2OFd1UzhTZ21TRDgweUphQWhFM3JjUTRFalJVaE1uT3JBeFZBdVlFVUFyc2dpYncxSGJUbXNPaEV5UUduMktxUk80Z2FPemJPaEVpWCthUStua2hFTHJ3QzVnbG05eW9oZGRvQ1J6cXFJbTRUMVJFTDdnSEwxb2c1YnlKNnkzaXRFY3B1Z3pLcUl2OEFNK3IxYmxCNTl1bWoxVlIxV1I0MVVWMVdYTUE3cURvdHUxQnBKVVYwV2tSTk5kMEhWYWZ4NVVWVUVrQjRmeVVGN2JwQTMyZUVWY0Z6V0RwUmxCYTB5S0hidW9LaGhJMUtBdTdpaDJRVnRMU0lmWDJLQ29aalU2RUlHQnBNYUhaQTl2eXM1cVhsUlRod3hZUkxCQTRJSkVpM1VQdHNnTTJ6VVZQUkE3aWpEcnhvcEFRZE9JQktnSUJFR2hOSzZLMFl5MFRvVlZHcm1mOEFKKzN6VUJGMUNYSXVMcWhnWEpZTVJUU0RSUUFCZ3dEdTg2ZVNvTE14cnp2c2dZQ2VqK2FnVXdYSjBZbWs4cWdBQ0E0Sk1HZHArS0Jzc1NOSDh0MUlHeUxRSDYwU0RDaG94cDAwRElDVG93TVQ4RkFBS3pxOFJYb2cwUVJxZFBZSU1BRDh3Y1pQQkc5VUIyTFBzRHVnTEdMcUhVSU1HQStVUnVLYm9GL016aDNoOTkwQnRCNVk5aW1SaUFXQi9objdFQUphbElmcU4yUUVrRWdnaUgxUUFtVFVrVWQrM0ZVQm5RVlBRZDBBMUJKRGswOW1RR2RpVFNmZWdBQklvMTNzK253UVlPenNhMDEzMFFZT1JjL3pBME9qSUN3Sitad1E3ejhVR0w2Rm9xZ0J1ZCtLRHk1UUFISWhqQWVXMTZxaDV0R3ptQlRzb01Td0Rqa0JBcHUvTVNUREV0cDBLQS9NNWFBSzhlOUFBN3NYSFBVOGJvQ0NkUVNhQTZ4OXFBRUNUL0NZYlJBSEIrVXlZWjllNm8xdnpPRDhzdUJyS0JpNExHWG9HcXlnQmN0TWd0YVhaejJRRWtzQ05OWVFiSnhGQVdZaElNQk5wTGtqWDNvQWFzWlA4UTA4VUJJRHllUUNIaEJ1TVh0TzBvQk4wQWdqeFFGNjdTekZrRzVrUDlyb0FaYmZTTlc1RUlDU0FhMTFoQUFIajVXZU53Mi9SQnR3NC95bTJsQVh1Y0VNQUlQWHlRYXBJWWh4SXFnRjJ4cTJ6cGdZRUV5QklodGxSaGNEVC9qYTlsSUZGdzBBbHpsM2Z1ckJtTVBKcTdJTS9EdnAwTkVBZWgvTnNYMVZHNWJyYjBRRG4rRTE5bVFHNE9RMTJMRk1ERTBBSlBNMTJkUUtYdWgySG1xRkFkaE9Pcjc5MEFJdHJVZGtHQkpGck9keitLbVVyRXZhWERsbklRS1MzekNaRW9BQTVCZWRCc0ZRamlKRmREN2tBTHVHb0hjb0ptNlFBV0d2TElFSmloQUduc1ZSTXVMaUhyVGRFS1NCSGlUc2RIUlVTUTlRUUlBNkloU1c2RGJoQkkzY3p1Z2lTR014TGFLaUYxem1BWTNWRXJqbzVlUm9pWmM5eFoyMGxVYzl4Qk1VNFZ3T2U0MDNWUnpYa1MzY2JvaUx6NXFqZ3RPblJCZXk0a2JFVkdpbzY3TG1qdXNqb3RJTEVEcHNvdUhSYmRYbnlRZE50d2lYR2lpdWl3OU5uMlVGUTNqQlNxdmFRd08yL3ZVRmdRMENuaENDMWhhdEFwVk80L2hseUE5VVF6ajhwYUtPZ3NMbkczdHNvcHcwNmxxNmNLMFBrek5NY3FCaFVsaE5UOEVvZk5pN3ZRY3FCeGRRT3p0S0RCcnF5VFVLaDhtWUNtcnFEQWlTOHZBQ0J5OUFJT3RlNmxDN3N4RlIxNVZvWVhVYnpFQWFvcmJrVERJQUhCTE9BSjlnclE0dUFFdUorYloxQVhCL2lySU5ENW9OakRsbm1hOUVvYVNKY1JYWW9NU0FkQnVnRUF4SnFUK0oxU2pPeEp1TGhvQjRRQVEybEF3UWIvSmN0RWpjVlpBNzBZQUFhcUFQYlZoQlk3aFVaeUhBTHZEdFZBd1l1QTh1NTFoUUZ5RzY4ajdrQUVDSGN2RzBJTWJycDFhUzJ6L2NuSUN3RVVsNkpRcEJjYzBFanFsQmFUQWN3RDdjSlFkZEpHKy91UUNrcytNamZtVW9ZdURWcXYwUUQvSjBMNGlsUE5CaC9raG5sNFRPUUFOQ1B5MFNqZktBMVlEYjhJTS96T3hjQ2o4NklOUU1TSWdQd2xETzdmTE1BNjFRTFYyaTRRNC9CS0RTQXcwM2hLQVhhanpBNDdwUnQ3V1l1WFBIZ2dERUF6aVNmSFJLR2NRMVFXOFVHTXNkejhQTktBeGt0aytoNFNnaCtESHk5VzBRYVpMdHNOOW42b0JOU1dMZ003SU5Sd1QzNUNERUV5Qk5DRDFkS0RqYUgwSURrOGVTVWFRR01Bc1BIb2xHNW9icXY3a0FBSUpFRUhzeVVGZ3pNNVlreEQwU2dBMm5yMTFRRTBCRWRlVW9BTnBiajhvaGtERW5ScDFxRUFpMTI2alp4Q1VBazFjV3RSQm9CSkoxbG5RRElPL2pvZ1VremtLR0NIM3F5b0xnbVhnd2d4M2RwZC93U2dHQ0hhNE1hOFYwUWFvWUVGNTM4MEdGVHJGZFgzU2dPN2hvZVZRWW1wcUJQS2dQVWh4VG9sQ0c3Y0F2US9CQURjNWswTFIwUUtYckFBM1BnVmFNNHFMaHJQdmpzcFJuWUFnSEUxWktqQUJpQVNDN1AxVW9WOFM0RDZlU29CTEZ5Y1FnV0FUUnorWDhGUUxyZ1lJY0IvbXFnbVNERnRBWVFLWnEyM2hzbENFbTQxSGNVVlFEV3JrMUtWVXJpS1VxeVVTeWtoMmJyUFJFSzdTUHcrS0NkMTJvQW9XQ0NkeFo5WkdTWVZDNjRTZTdxb2lkeitDdEVMcmlUQkIzTG9qbnV1RTdFczZvaGZkQkloNVZITVNRL2xzcXk1N3lKMDJUQWcvei9CVWNOaDRRWHROUEpCMDJFd2VuWlFkTmhnUEhmVlFkTnBBUFdxaXIySGJTb2hUS3VpMHNYTkc5aWd1QzdSRlhVRlJjWGQySDhJNVNLdGFXN1NWQmVkTkpvaXFBZzY3T1ZCVEtIWnVhcGdFWFdrUzgxNit3VmlLNUFzOGlmSlJUdkRsMjh3Z2NsZy9MaEJuWWh4TkdGT0I1cUlybHZ3NVVVNzY2R3BwQ0FpNm00Z2JGVUVraWEvQkFUQk5HOW5VREM0RVZKL3doSUNDU1M0Qkd5RERRdTRCbnJ5b0NLbHV4M0d2dlZXaTVjK0tEQ1dKQUhQZEFQbVlzZm1GRENCOG1saFN1K3lBNVczRHNlblpBV2FQNFdrL1lnd2MxWU5CRys2QldNQXQ5amJLZ2h2NGd3RkNXOEZCcXRRY0VWVkJjeTFKRHFETzRKQi81TWxCcXNZUHR6c2d3TmFPd0JDQXVZY1RvREtBR2dkeTd4MlFITXVBZC9sMzdza0dkeVlZaitKL2k3b0M0ZHJZMGNxQWd5UkxNNTlnZ3dMaTRzdzBQeFFIUVBhelNpaFp3WURVa2RreWc2SEVoejRQOTZCVGFDSGZrTkhTU2dKY0NBS2RIWkFkUTVyUUlBenVEU2hMb01aZmlhODhJQ1NXWWFRUitLQU0ybnpYVlFHQ0tWMUUwL0JCbWlvSTI1cTZBQXp3SzhOUHhRWXhXQmQwcUtJR0pMZ2luaWdTTFdNVjZ0dktjNDBrTUxXREdXbWlBaGk1QlltaDBJQ0FBN3dhdElkQXpRUXdtcGFFQXR0YTBqTFdYSHdUSXhGemsxZURPaUFGOURzTzlKUU01REE2KzNLQlhCY2JRRzM3SU5rQ0NSMGZ2eXlRR0NHYWdRS1N3ZHZtMXVIMnF3TG1DekVndUdId1NBNUZ0WHJNVDdCSUFST1FMajdXUWFRWEdzSHNnWWtpR2ZreFJBcEFMeVhhRzZvQzhFZzVUSDJJTUJVblF1NDBRRWlXTXgwUUJqTEFRN2FzZ0RTUzdobTMxUUEzaDNGcjdublpBUVRvOGpYUkFsSEVBbVNkMEJjU05SdE9pQlhCTWwybHVxRFN6ZzhudWlESWR1Zzh0bEFscEEveVFHZy9lZzF6bWRxR2txZ1ZaMzNZb0ZsM2JhV1ZBeStVa1BxK21wUUtiaUp1MW8wbFFMazQxM1FUZGlTK1IyL0ZVSzhUZEFpT3lvVTNFRGlrd2dtU2FhYjBRSmsrc1ZKVmdRelNZVW9XKzZ2Uk1ZRXJqRWxpYXFqbnV1WVZab0lDSWhkY0RyM1Z4Z0pkY3p5eDFDSWhjVzQ0VkhOZGRyb0toVVF1SWVqSWlGOXc2N2xWSExmU1FxT2R5K1hrcU9HeTduV1FxT3EwOWhxc2k5bHpCbkdxRHB0TE4xb29PcTB2clBDaXJlbVNkWisxRlh0dUlEYndvTDIzTy93QVVGeGQ5NmlxQW1SUXNKUVd0dTdjeHBFcUN3TUFFMTBLQ3R0emFuL2cvY29LUWFBa0V5bUZGOFdEeDJWNTBPTGdYYmVnNTFoUlRpNFFLRFVHZVVGRGNkMkVVVEFZT09wbGxBUm9DV2VrN0lIekRaYWE4NklDTHRUcFRpdWlCN1RNZ3Z2djJVQkZETW1vTS9ZcUNRUVB6TnNYWkFjajBpcHBLa0JZVVljOUhRRmpjQjhWQVFXbW02QU94ZlE3MDk2b0lMNnNHWU43MFd0cUN6Tkxpbk82QW1BU0ttc0ZBUVRPTndKWjJRWVhYVVBFY2RrQkpOSmYvQUJCQVJkVG5Xbmlnd0ZkcnZFK0tBbVdtTjZVOEVHbXBvSkc2QmNtSUpETUtoV0JneGY1WjZWZFFaMlpxKzI3SUEvWXdDTzJpQVFaSW02Z2QvRFJBMHMzOEpFRWExUWFYaldqelNxREYySnFXM3AzUUYydUVzL21VQUZ3ZG4vS1lGYTBRWVBwZTRhb3JYb2d6dTVvYlk2SUE1dEpZTytuWGxBMlJZdnREbElDREEvaWp5VUN1UTdBdUFkS2txZ2d0UU5hUHlvTm5RczdhVVpJR3lZQ0lBYmhsSUJrWEpZRWF2VldCWWdFQmlhQ0E2QTZIVTA2ZEVHeWdRQ0drVDdrZ0dRa1UzSjI1bElDRHE4Vy9tMjltUUI2M0EwQkh0Q0JnYm50ZmFCOXFEWkd0V2dKQWx4T2haenI0cGdGeUhxLytJSU5xTGlBeHFlbXFEQUY5Q2RmWjBHL0xPanlOdVVHSm83UitaQUdNT0FZbzZERmhPbThJQ1FNcE10RG9NU0FETzduVWNvRG8waGhFSUFBWVA1dUQ3RkFBSW1uTU9nSkxNV2E3UnpYdWdWL3pFdEFtS3NnSnVERndSSGFFQ0VtaGNrMUlEODZxakVzOXpuYTRpTklVR0pvTFE1R3NJTUlma01idnhRTFVFQUlnZ3NkUnNpczRyVnFzOVFvZ2t0SkxDU2dtYmgzWjNWZ0dSNERsdG0yVmcwWkVFbWp2OEhRSzdIckRqZXFBRXVQbG9XSU1vQVNDWjFxZ1EzUkJ4MytNb0ZKRlM1WWE5VUNrM1B0YTFGUXB1R2djdlRUMmxBaHUvd0FwN2g3VVFUdUkrd2NEUkVUZVR1U0NEMXA1cWdFdERObHA3QlFJYnBJSis1QkkzQU5NcWlWMXp4cTBvSTNYU2RlRlJFbHBFYVA5cUlqZGRKSlBib3FPZTY2UUhmYjRLaUZ4aG43ZkZCSzY1aHA5aUk1YjdoNzRWUnpYM0h1YWhVUm5ieVZSNTl0N056UkkwNmJMeEduVlNEb3R1R3JkMUVkRmwvQ0s2YkxtYlhkVEpGN2I5ZDRQMktSVjdiNVNDOXQ0RDlhN3FSVjdibWY1b09zQkJZWHVKQm80VUZMYjdSRHpza1ZXeTVnMjFQZW1jRVh0dUJFdWQzbFFoaGZRMDl0a2dxTGd3ZGpvKzZoRE84ZzlPcXBEQWwzQWQ2TzZrQnlBaDMybVhRUGJjSGNmbFBzSVFWekJJY2N1WW9nSnV4cFRWSUdCQWwyTFVVaEQ1TThFaHZKUld6cTBuWTZLd0cyOEF2YnRJNVJEL1UxYUQybElyV3NSQkxtcExWWkVobkRTSEFOU2dJdUxnTVEzUlNLd3ZHMU5qTWNKQmhjRHF6eTlFaUdCZC9tbnozVVdCazlCMmI4S3FqUjh4cXgvTFFleklHeUJrU3dFNlIxUVlseVhqZjNJb2x0V2NDVDl5RWJLSEFMa0pCamM1MXRwSVNEQytjWnBCUHM2REc5bk9tNDFrS2tObUhZQ1FJSHRSUWdpNEVTT0k2SU5rQUxtRDl0WDJTRENoZm41UndoR01FeWVBSGhDTkdvSkxGMElQeWdEeEhDRVk2alFVSG5DRUQ1WEFZOEFSeWhHZHEwcFQzb0M0Y0RXbmF2ZElCRU5VQ0RxaEJCRHMwTlJDQ0M4MGZWQ0ZGd2Y4eExRd1NBQW1mbFlHQXFHb055TlQwM1VJQXVkNCtWMmhJakF1TmJuQW43a1ZoYzRseSt1amVhUUVtQkUrSlFiSnREb2tHY094UExkU2d4a0hWNmdCQ01DemxqTWthbEJubGk1YitKQUhja2FWWThvUmhOcmgySWpWdk4wSUphakc0OG9SamNHcEZTeVFDUVhENmh6WDJkQ05sQUJNNzhnS3dIVVNXTSs3b29SdHVCMFFqQzRGbjFNRHpsSUJrQXhkdUlRZ1pTUUFTOEVhT3lFYjZqbUpGRWdHUkl1WU1YMS9GQU0rWDJTRFBvV0lFWTdKQXVUT1N6RVFQdVNCd2JRQnFiWTVRS2IzRkMvdHV5UkdGeGlDSmNxQVpTMGdiYU4zUWJJVURsbVlpbmtrQXpBbXJucUt3a0NtOEc0TlV2TE9yRVlYR2hIQXFFZ1YySDVRK3NkbFJzN0pHclVTREcrWmFScHVvcGNpeGhoV0ZVaGN3U0dwbzBhSUZ5RzdXcy9aRmhjc1dreFVVU0lWNmdURWoyS3BHeWJuY29zVE53QUxVMk82SkNaYXN3SmZRSUZKSmQ0WXdnVTNCM1lsaitiWlVUTjQ3NitOVkFsMXhBcVE4a21WWUozM0VBdEoxTy9aQ0kzWGhwcXpFaFdDWnVFUzVyMVFTSkZyc0hPdnQzVG5SRzYrV2ZwYnVyRVF1dm1uZElJWDNrUnhYN2xSQzY0U1Ryb2lPZSs4U0dmVmxjWUVMNzViaGlxT2E2NE9UcndxaVAxQTlmYnFrVjV3dTFXaDBXWEdObEIwMmw5WlV5TDJIc2c2QmM3Q25LaXVpMjU2Ky95UVhzTlF6Z3lvTFczR3J1OGh0VVZlMjZYSm5RZEZCWVhrVWtpb1FXRnpnT0s2Y0tCM0FZYWlRaXEyMzFhU0Q3a2lyVzN2cjgya0tDb05OQ0RSUU1DVHBUUVFDZ3BsTVFCTGU5UVBrWUwxWnVWVU01NjZHRkNqTzdpbktLSXVNQjIyWlVPQzFRd29GQlJ4MGM2b01ianlXWVI1cEF3TXZNbVZCc3RUdDE0UVBrQng1ZFVCQlk4RW4yNklHeU13MVBNN0lEbEUxRVBLQm9QSm9VQUFNZndzMUQ1SUdtMmhqV0VBQkxpR0FNSUd5ckRFRG5WU0RGbWNTYUJBYU1JSERJTS9MT3c2KzlGWnY0ZEgyU2pWdUxpSG1mZ2xHY0IzY1FTd1BjKzlVTTRkaEVPNTJDaXN4SUVrYW9CcGN3b3hBVlJ0S0VEUWRlaURFa0VnWFN6c2U2QTUxQU1jZUtRRUVrQnJwYmlpS1VHSWFEWGtvaGpjWkRzMHVneElGczFxZ1ozSkRIdklSUXUwSWpRbHBDSU9RWTg2ZkZSUy9MRDZ1NnFHTE14SUQ2OVVBY01KWWFGQm5BNWlFR3l4MklQNXFvQTRCTTBKblpCZ2JkYmdXZkkwOXFvR2UwQWFBYWo0cUtEZ1VrRWd2M1ZHY0Nza2wvR2lJeldrQjlOZHVpVUFGNEpxR2VKWkFjclkyZXJOS0RYRUFjR0FQdVFMaytqeTJxREVrc1l0R3AxOW5RYk5nNUxBRmdQaHFneE56U1hMVjIrNUZhUkpPVGtEYnRDSUZ4bHRScjNRWUQvQUJHbnQ1b0dZUS9ZYUJSU3RSdEQ1YUtnWEFEZ0dvMFJCY1hNNTVrVDBVRzlpRFJLQStySVZ1QWU1cWdCWm5ZZk5xSW9VUmhBY2wzcktET0JxWU5hSUE0SU9xb1hLNHNLeExPL2drREJpSEJpam9GSkV2QUJGZVVDdmJUUVJYMjNRQTNuYkdRMnRLcEFDWkxuaGg1SUZ5WUVpMmp0UGlnQUphSEhYcG9nVncrcGQzT3lCY3RYRnBxT1NyQnJpUXhxYU9VQ1B0OHVxb25reEFGUlRYaEFNaVlxMVRzaFFkbUR0eCtLSUUwZ2tNQWdtYm1ocGFuQVJTRWg5ekxvRXl0TkNYSmRCSTNGb2lWUk0zNmduVS9ja1JFa2loZDZLaERlTis2UVJKYUlHd1ZSQzY2U01wMlFRSkZYSExLaVJKQlluMkNJNTc3bmRxMEtEbnZ1TWpmZFZFTHJ0M080Q281N3l3YUdkTUNPZXJuZFVlZGJmcERhS282UVcrS2l1bXk2ayt3VXlyb3N1Z0FhS0lzTHFEeVFkRnQza2l1aTI0MDAxVUY3Ym45dmVvS2kvdVVWWVhtTjlIaFFYRi9uK0tpcVczT3dCWVJEYUlpZ0pxTzN3Q1ZWTGJpR085Um9FeUtXK3BUbWg2N0tLcm5FMFFQYmNkejdlS2dwYmVYWWpycktCOGpCbG05dFZLR0JFUzU0VnFRenhzODdJTUxqQWN0VGFpQnhjZXAzRzBxS2JJbG1MdjdRclFSZThRSGtlS2dZRU1TSHRhZzJLQXVYQUZESSs1QStXbTBGUUVYbDRNZnhlQ0E1RUF3UWFsdmdnTnBvQTl0WjBRRVhFZnhPZWRVQk44dmk1R2hxZzJSdDhZYm1WUVJYWXVYZWEwVW9ZRWwyREFCdGtHeWJ0UTcrd1FZRWdraVFUSVFISmhNYXVnTnBCMzdzYXFBNUNSNGtSN1VSUmMxY0Z6SEtBT3dpU0lBcDJsQmlYZGl4TzJyb0RxR1p6MG9sQUpkNWQrTmtwUkJsN3BhUVNsR0pZa20xM0VuNFVTZ2s3bjdJcTVaS0JsSWhpWCs1Q2pBSWZSMlNnRmhxWllNRmFvQmlYRW00eWFRbFF3dURPS2VYZFJXSmJiTFFkVlJnZHRhSDNsa0JkOGdJTFVLZ1dqMFBFRHhaV28xV0FjdHI0UWlzekJ5UG1ZVDdPbFJpWEw2TithaURHSzZiNzZKUVhPaHJweS9WRlo1Z3ZFQUlBWkVOME9nSGRFWXdiYVRBQVFHT3BHaWxWbkRCaS9UN2tRQ1JNenE5YUpSaVNIT3I2ZkdxVUF0VXR3WGJvclFTK2trR2FhOGxTak96REVqYmZ4U2pGKys5SCsxS0FDVHIyYmZkS0NTV3FIQTEreEtNWEpabmZWMG9HVlM0Y0g4VVFwT2pHUHQ0Vkd5YVdaaEhSQWNpOGtQN1VVVW9OYXZwQ3FNYmlIWVNmZ2cwV3V3WXNLSlFOUHpaZTFPNlVMa0RvMHd4WlViTXV4RUNIMWhRWWtzSmQ5VUM1TkFaMmxqNG9vWlhQMTBLSVUzbVppcjhEWlVLYndLdjRtRUdKZUFRQWE5MEFOd3RrelBVeWdVM0VNd2MwU2hNN2dhU2R1cW9CdUpJMjFNaFFKY1pwOENxZ1NIbGhvTk5VQ3V6R216c0dTa0tiNS81eUtRM2tQdEpMb0VKSjFxZ1EzR04vTlVUTi96QVVRU041WXM3MUtvbWJ4cVhlbmRFcWQxenpvSzhJSW02bXBHcXFJRzRzUzVCbm9xSlhYbWRqdkNHY28zWE81MENJaGRmdUtLam51dloyTTBWRVRkcThvaUY5MVpvZzU3N21Id1ZWelpsMVVjTnQxUGVxam9zdUxCNFVGN0xtZzkwVjAyMzkxRmRGdDlDN2NxUkY3Ym1adkZCVzIvUUlyb3N2MU1kMU00RnhjMVRHZzFVRlJjeFB2UlZCZHMxWjdJTDIzdVBlOExJcUx0ak9wZjNvS2k0R2xSdUhSVGczTnZ1RkZVRjVZYWNPa0ZCYzFTZXFDZ3ZlamthKzlBNHZwM2I3RkF3dklveEd5UU9Mb0xEN1VEZ3hvOVN5aVFSZGtONWYyZEFYSkJxUi9DVlF6L0t3SFVjS0tZWGlLRHA3a0J5Ymx3WVFOazlEd1NnSXVjM0IzRjN0c2dNRG9LRFpBenpSMzJVQmR4VjliWFFFWENTWmVUdFJBUmZXZys1QVhBQjVZUjhhb0d0dU5ScWFiZFhSUkZ4cS9HNkFndTNpQ0VHQmFXTGJEMkNJT1Z0WHFZWkJvSk8zbWd3SUlZTkhLQXM1SWQvYmhBWGNtaDJDa1ZnOXN0eWV5SU84VFEzSXBRZmxOejFkMis5V0laMkFCcnVTcEZadzRKMGNNa0FCQTRBYUoxN0lHY0F1YXZDQUFqemVqSDRJRGtKWXVBSFo1OTZET0pKWXRKUWI1UTRkbjM1UVlFVmd5d0tnMEVFL3dBT3JWVlJpQzVnRUFmbEZVVXdiam5yUlFMcUM3QVZKOFZRWG5XS2pmelVHeDI3aXFBQnhXMlpvcU03blkwT2lCWERFTzFLbmRFTUxnenU3T1QzbElyTU1lZmVVQU53dEprbHFwRUdIcUc4VDdrVXJ1eGR1QVlSQmNhUzFCOEVBeU5kTlFka2d3TXphemx3TmVxUldmV2pWT3pCa0FGMFl0M1pFQUUzTngycUtxakFNMHZvVzJIUkFTQlhZeDJSUWNGaS9JTzRSQUJBTVB1MUVDNUZ6ZFY5TlBqb2dMazFZWEZuOXlBRXVKcnBzNkFaQjNmVFl2Q0JjZ05Ob0hDRFpYQm9lYWZnZ0dRQUlPakJBajJtR1pqdnZvcURrYUFNYWxTREVsNW5ZS2hDZWRLOEhsQUNSRVFVQ205K2p2SEhWQXVRTGhtQ0JYTk5RWktBVm9STlVSaVJBTE1OQ2dVM05yVVNQd1FoRGVKQkRhVENSU1hYdVNKY0t3SWJoOHhpTkVDbStSOHpjSUptOGlrQTEvRkJJM0VocXVxRXljZ1BvVVJNM0FTT2pjcWlkMTNMa29pUnVEdFRqelZFVGVld1FSTnoxOFJ5cWlSdmg5Qm9FRVRlckJ6MzNseTMySmdRdU83Y3FvbGZjUjk2RG12dWFXVndybXV1QkpvcWhNa1N2TXR2YjRLanBzdW9QRlFkQXVjTnFsRjdiMmlqS0s2YmIrL1JSVjdiMzZpcWlMVzNNMHBSWVhlM0tLdGJmUWJLQzF2cUQ3Vys5QllYQ0pwK1lLS29McWNHUXlVVnR2cHlKK0tDNHVkZ2VxelZVRjdrelQ4VURpNTNjTlBpZ3BsTCtXNlZUajFIUHRSUVA5UVBhL1lHc29IRjhoeTducjVvS0crQXo4dEtBNWtOVW5iMkNDZ3VucHlvSHlvTnBVb0l1MGgrTnVWYVF6dkZPcURXeDkzeFJEWkY5aXpzb3RFWHMxUGRQUlVFWE9Ia1RRNnFVSEtBWEJHOUZhRGtMV2VZOCtFb2NYQjkzTlcxQ2xHZWdkK2ZmQ0JzeUJQbitDRFpWZ2dvTWJnOW9pR2hBMmJzTW5OUTZneExnNURIWHNsRE8ycysycVZSRE1kQ2FzbEFjU3gwRWF5bFE0dUQxQm1UMVNxRjF4RTdPd05VUXprUzNzVXFnNEhRQ0xod2xRMlEzYzZIcjBSUWZhZndTb0k0b041N0pWQVhXZ0V3d3F5cUREa3dXcnA1OUZLckMwNUVnNytLVkdiRUFWSGlsR2tmTXhKYjViZGU2S3ppMTMxMUVWVG5CZVhjQVVCUEhWQmlhZ0ZydUNnQmRnSGNtbnhTb010QjRhaVZSZDlTZ3prMUlIZDBDZ212RGpTT1VRU1NTOVdFalVKUmdmZUtsRkJta3M5VXFNWWw2VUZFcWk4VVl0ck05RUFpQnRMTWxRZG5Qd1NnRWlndVl2UjM5bVNqRWlCRFVLVlFCaUNlVzlpbFJuQkRDWHF5VUFrLzRYNFBYZEtEbE14dTFKU3FEbDMwRkQxU2daeUhkQUhET1RSeS9LVkFKSHlpSWlVcWdDS05YUktqT1RiU3UrcVZRTjdDMFAzZlJFRElYRnc1YWlLR1k2TXFnRjNHMXVoMTJRQnp1eno4S0ZBRGNLQWRpRmFCa0cwblhSS0JkZG83VWJWU2dDNWdCTDdKUXVSRW5TczdwUXQxSmx0RDlxdU1qTzBtSTlwVUtYZ2dkVmFrYkt1KzZWWVRLbXdlcFVvVStwclI2RUtpWkx5STRKUUtibUJQRVA1cTBJYjJGVHc2VVROd0pNajdpZ21iM0xBUE92a3FGdUprdWxDWFhnTXc3SWhEZkkvRHlRU043Wkh3S29qZGV3YXJiS29sZDZnMyt4Qk0zUnY1b0kzWE00QmQ1Q3RSem03bzZ0RWpmSTAyUVJ1dmQyMTFSRUxyaFFGdG00Vm9oZGQzVlZ6MzNEZnNsUkM2NEI1blpXb2xuejdPZzg0RUtvdlplSVNLNmJUVHlXUmUyNEVRYW9xMXR3ZmRRWHR2Y3hwQ1JWN2I5NE9xZ3VMcTBQS0lzTG5JVVZTMi9rTnVndUx4QkJISTBVZ3NMb28vVW9LQzZoWjlsRlV0dm94ZGdnc0x4RXp0WFJSVkFkak9oMFFVRjdORWJCQlFId0NnTHlHcjdlOUZVRndBMjFJNFFPTGdEejhLb0tmVW9RSE9wQ2tEQTAzWmtEZ2dpWVFFWEE4Ykhva0Q1TlV1OUFkMUJRWGJsem95Z3d1Z1Zlam1vVkRPd2tsZ0tvQzRNMElxK2lJTGg1OE4wV3R3UzVad2d6d0JRR1NVREV2VXhzZk5BNHZvQVdod0ZGRVhGcXRvOWFLb3p2ZDQ5VVVSY0RMdHh1aU1HY01YYlFjSUdlNW8xM1VVUVRWaTdSN1FneHVGQnJvZmZDUWFDSzVjZVNJUE1BN09pbWR5Wm5WdFlVQWZVQlZCZGpPc3ZxRkZGeFg4enh2RW9ObHFXR3o2ZVNBdUoyS0JYSHpHbTU2OVZRUTRZTzVJamhBWEVmTTBuVlFaM2NDNE03MVZERW1RNDZlYWdXS3RGU1hWQkJwTTA4RkJwb1M3N29OSll2MEpMSUJPVE83YUtnOFNOajVLRGFTV2doL2VnR1JhQysra0RkVkJkMkl1SUdpaWpsTzdlS0FHV1l1QU9FQWc2aUJMYm9Oa0tndUliU1VBZDdpZHVYUUhLMEJtWWVYZEFvdTNHL2k2RFoxZmFRMnFxTmJkUnFDUVRVcGxSRndMYjhlMnFnUVh0clRXT2lzUmkwQUdwbmZaRmJJUzlOVWdBSXVCYUpuV1U1Z0FhanJIZ2tBZTZyeExOOTZvQklnUmFaZDBRTXBJMkZXUU1idFBCbEZJN1Y2QW1lNnFGSkJhcGI0ZEVBSkR5SE50RUdjbGhUY0JBamhvWnp0N0JBUWU0aVVLV0FRUEdLNklnRWd3dzZmZENBRWgrdTNqNW9zQndBUkkyMFFJYnBjM1RvZEVDbTRFRXM0M29rQzVCMjNvVlFsMTRkaVdxZ0J1RElJbS9hTjlhOUZZRkpCY21XM1FJOUQ0a2xFS2J3SkpaMGhVemVDM05GWUltN1hmVHA0SWladUlHNUtvbmRkTEFzWUpSVTdpNEwrM2lpSlhYQVFJTlJ2c3FpSnYwUGJaSUkzWGlwTGJCVVNOd0w3SUlHNGdFUDNWNTBTdUxjc2lvWFhiOUZSejNYQjJIc0VSRzY0TldsVlJ6M1hVWXp1cmhFY2tIbTIzazYwV21WN2JpV2U3UlJWN2J6dlJJcm90OVE3dHVwQjBXM25lQW9LMjNrYW9MMitvWW10Q0tLUnBhMzFEWExTZ1VGaGZ1VVJjWGRTVkZVelAzb0syK29RV2VLQkJZZW9abnVGQlVYblV4b2dvTHp2RXNvdFZGeGlTNXFVRkI2aElJQm5SOWV5a1UzMURMRnl6d2lLNTNkWmtvcW4xQ2FIaFNCODZkVURDN0lzOEVJR3pKaXZhUE5GcGhlWGNrU2Zkd2dlMzFDN2d4U050RkJRZXBjN2t1S01VREM0NG1XSVFFM2tobitLQnhkY0IrWnBVQitvYUFqbUhTQmhjTlRPb1FISzV2ekE3Z29Rd0lJbGgyM1NrTTlXdXFkTjBCK1orRUF5Y055elFnd3ZMVERpWjBRSEl2VjBCenVabmJvZ1AxS3RBUUhNdCtZRjZuUkEyWkFreUpNSUFMbWRvWnlnWTNOQUpmUW9NTGk1dWNjb01DMUNIMUh4UUVYRnFscExrb0NMak5yOVI3MEJ5dUx0Qk5TRkZESzRPNWNING9ObGNBekRWMFFSZmN3RHpzaXRrNW1LUDBRTmxERXRGVkFNaUpMa25UUlZDNWtFQnRlTkVnYk9URWFrd2tVQVdNRm5EeDdrQnlySWZhSTJVZ3oxa0YzNnFnNUU5RkJzbmVRVzhmQkF1UkxFMU5GUmpjejEzTktJTmxyVnZnZ0l2Skw4VlNBQzgxSGM2Y3BBYzdnV2htaElGRjJMa0NUcWlCbVhZNjZNUFB4VmdJdnVJcVFkV0hYcXBCaGRjd1p3SGRpZ0RtSkk0WjlGUm5JaklPS09nMlJxSm1HWlJReUpkcERDUGdxaGN5U1NhVkgzSU5uY0hMa1BOSDdJQm1SSnZIS0tHUmR6RHM2SVhNdzRnMURhYUlNTDdnSUxnR2pJQTl6QnpXb0xlYURBbG0ycXlEWkVqYWRQd1FBbHhXa002RGZVZ1lsMEM1bDVJY0NSQ0JjMlo3aHVnWE80dklEMThFQU41ZzVid2tDNUVQS0JEZVphSE9vVkNpODF5alJreUUrcGNTUzhHaFFUTnpsZ1hkVUEzazFKYm5WQXBKSDhURFpLaEQ2ak52cTI2UXFaOVM1ZzViWm1kV0JUZmNBUGJ3UVRQcWVmbWlKbjFDSnkzVmdtYjdtbTd2UkJNK29YSTl5RlNONTBMYmxWRTdyejAzKzlCRzcxYnZhaXNFcnJ5NGt4cWdsZGZxTklRUnV2OFZVUnU5UWpXRVZFMzNLb2hkZlYwRWJyelI0VlJ6M1huZnlWRUxyeVhEOUZSSEl2OGRVUjU5dHkxbEY3YnQ2N0tLdmJmMjRVRnJiajFSVjdiK1doUWRGdC9sb3BCYTIvWXUraWtWYTI2amQwRnJiNTM0VVZZWHlCWFdxUVdGKzVmaFFWeWh3UU9VRkxiNHIzMFFVdHZZekZPaUN0dDUzRFBCVUZoNmxKMGRsSUhGdzFadFVXcUFrU0tJR0YraDluUlZjd2RaMGRRT0w2c2VVRDVVbnVnZTMxSmNsZ3BCUUU4ZTVRTUxnWEdvMFZCZm8yb1JUWkZvOXZGQTR2SjFhVklHejUzWThvQ0x5dzIzUU83aVoyWkFSY1RVaHpIZElEazhhYmFKQTR1WTlWQVRlUThNQnNpbUYrTENVUWNycWpYeVFISUdvZjRJTUxnSGR5ZnRRTVFETUI0ZEJnSGN2SGdnMmcwWmh1Z2FYaDZxS1hMU3JDYUVxb0pJbzRab2J6UUZ6UUVHN2RBSGQvbHJ0N2JJTmxxMnJvSHpjUDNxb3JabVJvQlRoVUZ5NG5xaU5NSHgwS0FpOTRBZ2VTZzJSZG5lWE5mYlJWUU54MUlhcUlPV25pTlVBRzdEaEtHRjAwb2FxS0J1cnJ1T2lxTVNXZ0NQWUlDKzRvWFFLNUcyNVFGNkZqQjFRWi95aUFVQUJ1dEh4SHZRRis1TkFVVURleEZOMjZvZzVORGRrVUNURE9RL3NVUU0zSmx5UEpGRElqZmZyNElnT1dZMENEWkdEUWlIcWdEblFRMm5rZ3preVBmQ0FPV2FTVDJRRXc1Y3NkbEFIRHc0NHB3cUJVTUlmN0daQWZ5dVcycDFSUXlPek5RSWdaVmo3WlFESmdDM1JwUUEzbU5XOXFLS1hJbG5BWXZKbFZBTjBjYXdnUTNSOHhmcXFBYnJuQkZQWjBnVjJJYW1yb0ZON3UxTjBBenJ1ZFRyN2tDWlZqc0tJRnlOUnV3UFZVSTVsdmxxN29nRzdsNlFLb1VtY2MxbElGdXZBR2dHenBBaHVNc2ZGVUlib0FwV2lCTHJtRVIwNFFTdXYwVlFtVGpjSUptK3BCZEVwRGZOZWdRU3V2QWVxb2xkY1gyNStDQ1YxNm9uZGN4RG1VRWlleUNOMTh3YTdLd1J1disxQkkzTTUwMlZSRzY4cEVjOTE3bDFvUXZ2OGxSRzY2citLSWpkY3lDT1UxbFZIQ0M5REt0VlVYdFhkRWRGdC80S0t2YmUvWlFWdHUxQjdJTDIzd2ZNS0t0YmRNSUwyMzdkbGtXRjZpcVczS2l3dkxnOHFLdUx4dXlncGJlNDhLSUtaQ0FUWFJBOXQ5UEJCVVhtSkVRU29LaSthbDJoQlFYbmJ6VUZjeDMyUlRDNllyVW9IeUw4VVowRGkrc3RPek1vcDhnOHhvdzJvZ1llcE5XZWpoRVVGek04ajRxS2Y2bXJraHFwQS8xQlV3YUJBUmRHb05JUU5sVjlhTkZORW9Ma2F5QktLWVhYVXFEVkF4OVFCdUtieXBBYzMxTDdqWkE0djFwMVFObnQxYWlBNXZVTzN2UUVYQXc0ZlVIMkNBNXhYdU5GQTJZRllCcG9nSXZvZFVCellFN1VsMEJGN2dFZU5hb0d5M1BmOEZGYk55ZGtRUjZna3g0aFVBbHBNK2RFQnlEd0VCQkZYYnNvTURrNG5lWTltVkdlMEVPV2ZkQm5EU1lLQW5zNEtnTTBvU2FlOUJuTHM1MUNvd094NElVR2ZUVFJBQVMwbm5zcUdjN3ZxZTZpZzVhb0xPZ09SazAyQmhFREtQdEgycWpaSFFucHFvTTh0bDJIaXlBRnlLMXE2bzJScFJ5OVpHaUF2TXpJVUdMeTBvb09DZHk2SXhMN2RFQXJRZ0RhcW9KTm9jOHpDZ0JJbGoyWjBvMlFxOFZsVld5RnNtQzZpQmJjSW9IMFRJR1pyNEtqSDFHTW1xZ1VYVmtIOEt4dXFwVGVIZ2pseWlOazNWM2RBTTdtdTl6VjNRS2J5Q0piZzY4b0JucTRBMzhsUURkekFRREtocEVxQmNoR1dncUZRbjFEVXhMVDVJQmRjQnF3NHAwUUxrWVlkUnhvcUE5eGwyNFU1QXB1WWttYXkreXFVdVpyUjZiUnlnWDZuZHlnWDZqTzZCRGNha29FeTJMa1ZWQ1pQd3pPTkVDRytoMW9nUzY2NGlyS29RM2FIczIzWkFoOVNmZVVSTStvVzVWRWplQUt3UHdRVHV2THh1NUxvSkcrdTVWQ0c2WlBtZ21iL05CRzYvYnNORlJHNzFEMm51Z2tiMEVUYzNEaFZFYnJ3L0lWUkc2NTVNa2FxOHdqZjZua21CQzY2SlZSRzY5a2dqZGVxSlpvT0syNUVXRndLaXFXM0ZVV3R1Q2d2YmZ5cEJhMjRhRkJXMjl2Y29xOXQ0KzVCYTI5bWVpa0ZyYnRCM1VWVVhDSmRDcWk2TmtWVzIra3pzb0tpL1NyNmFJS2krbXU2Z2NYTUlMSUtDN3F4MlFVRjd3Q2dvTHdRT04xQlFlb05Jb1NrRGk5d3pPeWdwa0g2L0JGTmJjK3JFbVVEWmtQWGNzZ2Nlb1F6OXdpbkY0TldmbFFQbFNmc0NBaTZyVk9uM0ZBNHZBR2cyNktRUGxWaVlDQnhjRHArS2dPUUhRR1NnTDFZNjFWcW1OL05kMUNpTG9aK3U2QmhkWHlDQTVsaUdxZ1lYOHQwUU5uSXJ3U2lnTGhMMUZTRVEyVHdZMmxBY2hSMk4wRkFSZTdUcTZnT1lvUUowS1FGeVF6UVpxaW1GNzl0VWdHZTFkZFVnSjlSbTJTRFpnenJQVHVrUVJlZGV4OW5SUnlBTDZEcHlvQ2J5Uk5DelFndzlSdWVJcWcyVDZTRFJWQnpJY3VHTWVDaWdMd1hMOXc5RlVINmprc1lDSzJldEVHeTNycCtDSUp2Rlk0VVVCZkFkbnBzcWpaTStyQkJqY1dZbnVvTm1LUVBoeXFvRzlvbzc3K0tJMzFLQUd0YUlvaTQvTkpJT2lnR1dtcG1OVUM1QjRwVXVxQzlwNDNEcUJjNWR3VzNvcU5tZCtFUmpmcU81YlpJb1pjRXZVTWlCbEVrUkwxU0FQSkxoeVdQVkFEY0hreU9GUUxpNWZiUk1EWkFQTkhsMFVEZlE3S0JmcWZORURVS29COVNoZXFLWE1WQjA5NklCdml1dmRBanhOV1k5MVJqY3dFUFNRZ0J1NHJDZ1hObWU1dmlxaFRjOUtlL2hBdjFHaHp5VWdRMzZDdkcvZElGTjJnTDlTNm9YSUFvRU44TlNZNkt3SWJ4cFhoQWg5Ui9scDE4RWlVaHV0MU9xRktiMmwzNVFKZDZsWmtIb2lKM1hoaEx2QVZ4Z1R1OVJ0ZXpvSm00Q1FXVkNaYTcxTElKbTRPN3VReUNkMTRWZ2tiNnp6S0NWMS9iUjNRU3V1cWRkMVJJM0JFVHU5UVRxUm9rRUxyNnRxcWlOMTZvamRjN3owUVJOMi9aVkVicis3cXdSdXZFcEJDNjVVSTQ0VGxSeFczQlVXdElVRmhjR1FPQzNJUVh0dUc2aXEyM2FvTFczRHJ3b0tpN3dSVnJiMUJlMjRSd29xb3ZiM3VpS2krQUhVZ3JiZEZVVlFYczJoU0tvTG04RkJVWHUyNFFWRjFQSUtDZ3UwZWdyMFFPNTdJR0Y3YXVnZTIvZG1yN0ZNaW92Qmd5TmxBK2ZNR2lRT1BVa2lWQTR1NWNVOEVVMlV1Tm9LRk01MUE5dEVVK1JqVTdvR0Y0MExNYUJBMlRhdVJwUkE0dUVCMmFoK3hRTUw1SmVOdkJBd3ZMOERYM3FRTWJoVjVRTUw5YTZwQTJSWlFFWHdLODhvR3lGWHBWQUgxck5TZmJaVmFKdTNKWi9naFRpN1dwVUFGMjRiZVhWZ2JKOWU2Z09iT08reUJzZzVMdngwUlJGekJoQmFXUkF5Z2gyZUoxQ0JoY3pEd2ZSRkUzaG9JZnhJUkdGd2d4eWdPb1lNd1p2dlFESjIwNklHZTA2dDRoUUFrRmhXWlpVRTNhRXhNS0F1MDFJMUtvQXVrUys4b00rcjlkblFZRUFrZzhNNkt3Z0VPVzFSR2R5NExBYzFRWUZuQU1qbEJpZjhyU2JuQVFZa2J0TEhsQmdROEUreFJRZHEzYXlpTTRBYUdhaURQRUIrc29BOEhRQnk0NklCa0dveG9FQnp0ckRTL0xvQWJvRGtCdGtVTWdLTzVVUUhha0hZMFZBeUVtcDBDREc3WXNaUVROMUtuelZCeWxsQU05QWFVTmRGWVVNalN2M0lBN1VMVi9GRUFsenY5bWlBRzdWakdpZ1hMVmhxN1RWVURQVWQrNkJUZWRRUGdrQzVHdFR1VUNtL2xtZ1R1ckFtUUxBblJBcHY4cENvVTN0U2VuM0lGTjhnSUVjMTFiVkVLUzFOV2hBcHVBZVdKMVFJZlVML0FCUkV6Y0tFdG82c0NHNEViOG9KbTlqd2RWUk0zT09xQlRjWjBtT2lCTXgzQ0Nadk1oK2pxd1N1dmw5a3dKbSt1dktRU053STNWNWdodSs4SWxTdXVoaVVFYnZVKzVXSWpkZlh6VmdqZGU3OElKRzUxU3BYWFNpSTNYT2doZGZLc0VpU2EwVlJPNjZ1cUNiL0FESXJoQjVWUlVYY29MVzNVOTZndGJjb3FnTzBxaWd1UkZyYndvcTF0L2lvS2k0SFdsVUZiYjI5ektMVmJiMEZSZDVJTFczdzFWQllYMEhtb3B4Y1BCQlFYUytwUlZMYjVyUlFVRitsU0I3a0ZSZURMMFVENTYrQ0J4Yyt3ZEtLWkg3MERDN1YyWlFQYmZUVlVQbU4vYnNvSEY0ZGhFZFVENTdrY0VLQnhmVjQ0UlRaQ0pvZ1lFVm9hSVV6MGNUeWdZWDlqc29waGVBTnh2OEFpcUNMdzRZMGRBK1lrY1FGSUNMcnFrMTZvR0Y0M0dqSUd5ZXBmL0NvRG13N29HeUI2L2FnT2VzMSsxQXc5UVRxZFFwQnNnekVQcVVEWlBMOU9xQWd3SE5VQUJOU1J5RUJjVFFkS3BWYkpuMWhVb2cwbHdFQUYyd0xtb1FwZ1hyMkpVR3pCblFVZEFUY3phYythRFpGaWZBZmc2QTVNQkFCS0FaYVRSZ2dZWGdnTVliWFpJQm56MEJRRVgwbWFrZkZCaGU0WWdFYklCbUNaTHZRTXlBNWc2c0RvZ1UzTVF4alp2aWdJdmloSENRYkpvQlpBdVpGRHJxWFZHTnpzQ1J5UHhVR3lsdkJCc25janVnMlhMTnNnR1hnS3NnQXVPN2xrS0dUYXdOU0ZTczRocUVxRFpRSjdCRUxrSVBtcUFTNE9qRm8yVUdQcU53RWd4dUxON1NnUTNralk2S2daaDl4b1VDbTVuMktCVGZVdlVDRlFNb0lmZ2xBcHZFa0h3UUtTQjR3Z1hQc1FxQm1UWHAyVUN2K0NxRU53Y3VTNDBRcFRjSk5TVUNtK3JWUkM1YVAwS0JEZlhyS29UTVVKZEJQNmp2elVxaFRkWFZCUEtvMHA0b0VONURaSHVnVTNzSGV1cUNadllUVFVvSm0vd0M1VVNON2paQk0zUHIxS29RMzFjb2xUdXZHL1JCRzcxSG9xaVJ2VmdsZGVCVHNnamtTNkJEY0J5aUkzWE9xSTNYcWlGMTNkVkV5V1FUdXVlaUNOMXhaMFZOOVhWUnhpNS90UkZBVVZVWEtLc0w0UVZGNTBVRlJjL0NCeGNSMFJGYmJxYW9xd3ZLZ3JiZm83cUNvdWtOQ0NndkxUb2lyVzNxQjdiOUVGaGZEYXJLcVczOG9LQzlCUVhTN3FLY1h2WFJCUVh2ckFUbUZNd0pLQ2d2MTNVZ2NYdDk2QnhkRHUycUJoZFZBNHVOT3lCaDZuTktsUU9MK1dtVUQ1cEEyVDBMN3VvcGhlMHYwUU9McTZiblhaQXd2ZUQwWkFYQU1TZ1lGeU9KUW81RUVCeFBpaWlMeURXRURtL1YrRkFmcVE3OUdWQnpxQnJIUlFNTHpEbVhraElObVQycUJ1a0Q1SFF2T3lnT2JmYWdPWnBNMFlvQWIzNkJVUG1MUVM5Qlhvb05rOUQxS0JzeXdrZzZHcURmVTJralIwZ09iM0NXR2lEWjZhTlJBYzMrSUtESDFHcVdtcVFiTHZLUU5rRFh3VWd3SWFaMVpJQWJpSFlxamZVM0xKQ3NibmdkRUd5dEk5d2RCbmtiQnBRSElOQVBRcVFESXQ3Z3JBTW5kbUZEeXlRQTN0UXVkdUVnYkwzdW9CbTdpSzZLd0Erb3hEcEFQcU5EaGpxZ0dmTmRVQXpGQ3hCcFZCdnFFVktCY3lYUFlGQU1qTXZjZ3pqd3BXRUF5SUZZQVpBdWJhejFWZ0dRUHhTQlRlOHdZZDlrZ0J2YWtFNm9Gekk0NFFETHpxcUZOMnBobEFDZVlWUU1nOWVHUW9HOERYelFJZlVvTit5QkRlK3VxQlRjYWFJaFRld0xUdXJBaHYvQkFwdlBkRlR5TTFtSVZRaEkxS0JjaFB6UTlFQ20vU2lDWnZjbXFRSWZVWi9lZ21idXAxVkNHOHM1N29KbTdzRlJNMytLSlVqZnlxSm05NjY2SUozWHowU0NWMSttaXNSSzY1VVROeUlsZGZ5Z2tidWVGUkUzOHBCSTNFbXFvUzY1a0VycmtFYnIxUkc2NTBRanlxT0lYZUswS1czMFV5TFczcGtWRjFGbFZCY1ZSUVh3b3F0dHlDb3U4VkVpZ3VRVUYxUElvVlVYZmVpcTIzK2VwVUZSZTRIS2tGQmZ4S0NndW95TFZMYjlWTXFwYjZtK21xUVVGK3RGQlFYbnBORWdvTDlTem9IeTViWlJUaTVtOFVGQmVmQkE0OVNka0RpODc5MUJRWDhkRUJGdzAyb2xEQzU5ZXlCOGpMUzJpZ0l2WnRocVZRNHZNVmhSVC9VN2JJZ2oxTmFuN1VnY1gxVWdiSTZtbEVVMlo5dDBCRjVuVUdxQnMyRDZsQWNoSW1FRFpRL0tnT1ErS0ZFWEZoUWdxcXdKZnVvRG1mSlVObTNiaFFiT200RDlFREQxRzZoQWM5a0JQcWVTUWJOajNiVklEbUIzMDgwZ0F2ZmJubElHelBRSkFYZ0NkcXFERzRrSFRzckJoZnNleWcyVW1hNmZhZzJmK1VPVWdPVGJ4US9ha0F5dXE4YWhCdnFhbWxkRWhXemJWZ0tRa0JGMEJrQXpxMGI4SU5uTWsvWTZzR054TFNSdWtBemh5VEtRQTNNWTJvNkE1UHFWQXVlclVvT3FzR0Y3YVVnbElCbVF3ZWxkRUFQcURkdEhTQWZVT3pqVkFNL0RRQUlCa2RDeklGRjFOQlYxUnNqcnFvVWh1YXBOdk82cVZzbUJJTmQzUXJHNE1kRkFwOVNPMHFoVGZRNm9GTjVBREVnK0tJVTNCMFV1WW9OS3F3TDlUVklGTjRFVkhYNzBRbWZMY2ZhZ1Uzd1pndlJVTGRjWjVUQVhLSlBjSUZ6QW9YUlNtOW45cW9oVGVKOTZLbWIzUkV6ZnUvQnFxRU4wbC9GQW1iOG9FTit5SWtiMzdLaVo5U0tzZ25kZFhmZFVJYnVTZ21idkxSVkttYjZnSUpYWCtDUkVycjlsUkkzK1NvbWJ0YUlpWnVRU04zRW9KbTlWVWplZ2tiaWZzVlJNM0JCSzY5RVR6bXFvNUFWUlVYSUhGMVBlb0tpOEpCWVhLUU9DaXFXM0lLQzc3bEJZWHFLb0x0WFJGQmR5Z2NYSUsyMzdhcVpWUzIvNzBGUmYrS2dwYmVkL0ZCUVhqd1JhY1hhK2FCeGYwNktLb1BWaXZWSUtXM3hWbEJRWCtYdlNCeGZ2UlFPTHRhSUh5b1FZSlJUZlVQMnBCVDZqdE5WQVJlT1ExVUZCZHpVU2ltRjZJWVhnOXRFRGk1cUhwc29vNWJ0eXFnaTVta3NDZ1lYdzcxVURDOXp1UWdiNmxmSW9HK3B6T2lSUnpjZE5rZ1lYQXRvMGhFTUxpb3JDOTZSelFxb2I2bGFCOUgxVVVjMzZJRG5RL0JBY3cxUTJxQWk4TUhrb0RsdVowUWJJTXo5a0t3TE9INklVY2lSVnJrQkJZTUNHUUhJN3dvdEUzeWVLb0JrWWFkRUJ5SUFNY25nSU5sTFFnd3Z1NENEWm5YeFFiTXVBRDFsQU1ycXZ6Q29PUnA1cUFaTkQxUUY0K0NBWlZEVjJoQnNnWXExQXFCbGNYN1FkMFNoa2RUMVFyWjZka2kxc3RUNG9sYkpRb1pDWWQ2aUZRTXh2MVFBM2huRTZvQjlSb2pwOXFBWnV3OEFRZzMxR01tU2dYTUJ0VHFnUStyV1dDc1J2cWFlU1FLYjJMa0RxaWdmVUViVjZJRnprNjhJaE16d05tUURPdW5SVUxrL2ZSUlN1eE9pcUFieHYzVUM1NmVhcWxOK3RBaUVOMjVIT3FCVGVLYm9wRGV6ejVxb1EzNnBBbVRQUFVvRk4zZm1FRXplREd1cXFGTi9MdFJTQ1J2Zm56VkNHL2xCTTM4cXdJYjlVUk0zdHFxbFROOVVFN3I1clRSTVlFcnI5YUtpZDEvS0NadjdLd1ROMzRvaVp1YlZCTTM3VlZWTTNwQkUzT3FoQ1ZCTTNLb2ticFFTTnlvVEpVY3dMb2huUVZGeWlxQzVCUVhxQ3R0eUNndUJVVlFYTWdvTDBWUVhJS0M5UVVGMnlpUTR1Vm9vTGxLcDdiMkFiVFJCUzIvZndRVUYxTjFCUVhzMnFVVXR2ZG4xVVZRWDh2dUVENW5aRk9MK1hVRGkvelFVRnczNUtCeGZPL0NnY1g3dytxQnhmQUxkUWdZWEU2c2ltRnpJR3pZYmNsQTR2cktCaGZRS0JoZFBXblpBOXQ4UXdHdXpLS2JQZW1wS0lPVG9wc3BkK3lWQnlBRlhaRk5rWk5FcUFMdzBFOU82b2JKaTd6cW9waGUweHdnSnY2OVVRVGZIdlNxYjZnRzhCUUg2aFBYVk9RTjlRYlJ1Z09ZYXZKUURLWExIbDVRRVhqUWs2Ym9nbThoZ0poRkhJUFZ5Z3c5U2plT3FCczRyMFVDNVZNRGNoVUVlcFNTNDBkQWMzbC9idXBRUjZoNFlvQUx5d2IyWktEbWRJU2pabHlhN0lNYnlBUGlnR2NUVTBsQnM2N2psQU02c1FTcU5tWUhMQkFENm1oTG1wUFJCc3oyMENnMlpWQU40RE9aMEhDQVpna3oxbEF1ZVNJT2FLWE45ZXljZ0dhQlI2Z0kzODFRUHFOOFVRQmZGWlJTbS9VU0NnWElRMjZxQWJpZXFsQUpETVM2dEdOd09wNTZLVUtieEZRMnFvR1pPclRLaWxONEtJWDZtanNxcERlQVBnaUVONDA4VlFwdkwxcG9vRnlKMVY1QWh1QmsxMlFBM2dNaUVONW5WQWh2bmRBaHY0VkV6NmpvSm0vdG9nUTNuUlVJYjkwU2tONnRSTTNvSm04Ym9KbTlVVE43OG9FTjNLQ1p1MjhVcUVOeXBFemZ5aXBHNVVUTjZDWkxvaVp1UkU3cjFSSTNjb0ptNzdncUptNVVJL0tnNXdWVVVGeWdaQStVSkZVRjFGQTR1L0ZVVnR1VXpnVkZ5aXFBb0dGeENDZ3ZCVVZRWGNvS0M0YjlsQlFYY3BBNHVvaUhGMzNvSEZ5aXFDK2t1ZDBEaStzdWdvTHFTb0tDOHRWQTR2ZXRVVTR2NTgxQ25GemU5MFU0dSs4SUcrcFJJS0QxS2JDcnBBMllDZ29MMkZVREMrUnJ5cEEyVDBxRURDN2xrVTJYdmhBMmZLQWk2dm1nY1hzL0tpbUY2SU9jbWFJR0Y0cVBCa0REMUJSNlFVaW16VUd6cDVsVkJGd3A0SW92czhJQ0R6NElObHNRZGtEQzR0dXlnMmJieG9pTm5Bbng0UlJ5TlhaNmpsQWN1ZWlEWlJXaUE1dzdnOEZBUmUrcUFaeTJUN2gwQnpuM3lndzlUUjJPM0NBL1VKYlZJalo3bDNvaXNiL0FNQWcyWkZVQnk1WUlGemZVYXpzZzMxSzY4SURuejVvQjlSNGVRZ3h2TzdJRXpWaURtVklyRzQ3c2dHZmlrQXo3dVlWaUJsUi9KUld5WmdHQTBLQVpXaldORlFEY1RxZVFnMmRXN0ZBTTY2YnBBdWV3NkpBdWUvdlFLYjlhd2cyWTNaQWh1SEhLcUZQcUFjZEVnVTM2U1dDUUxuMlFEUGxrS1EzRDdWU2hteWdUUGRWQ205aXpvRnpyNXVnbm1PaDNWQ20vdWdRMytWRUV6ZDd0VlVLYm5jT2hTRzlwUVROL3dCcUlRM29KbThWVkNHL2FFRXllVlFodTVRSWJpaUprb3NJYjlrZ21icHE2b21iMEV5WFpWQ1pBSUptOUVTTjBLaVpQWlVJYm9VRXlYVndFSlJNbHk0N29PY09xSEJLWkRnbmxRVWRBd0tLY0U4b0tBbllxQ2xwS0NnSm1DeUNnSjJLaW5IZ1VEZ25aRlBhVHNncUNkQW9IQk94VUZBU2RFRGduWXFJY0V6QkNvWnpzb3AzdTJQS0NnTjJ4UU9EY05EeWdvRGRzZmdvSEJ1R2poQTR1Tkdvb3BnVFZpZ1p6czZCZ1RFRkZVQnUyZlpBd3V1L3dsQTJSMlFPRGREQThxQmdidGlnWUc0YUU3b0hCdTBIVlFFa3hDS1lFN1ZRRjdwZ29DQ2Vhb0M5MUdLQndiNWEzdWlpOXdxQ2RuUUZ6RUZFRitQSkE3M2FncUt6M2FnOElqRWw1RG5SMVE3M01ZVVVBYjVnOTBRMlYyeDZJclBkc1VRU1N6RVA3ZFVWbnVtSjdvalB4Q0F1ZEIwMlJXYzYybEJuWjZ4eHdnem5RUnFPRVFYTE14UldjN0ZRQjNvNDZiS296bjcwVVgyQjZoUUJ6dCtDcUE1YWlET1JwVkJnYnR1aklBU2EzQXRzVVZudUZBZUVHeXVNQUZ0VUFKdWVpQUUzYkVuUkFIdWNCa0FlN1lvQTkyMXlCWHVZd2lBNUdoOEZSc3Jxc1pVaWtOMTBRZkIxUUNUc1cxcWlGT1QwbEFEbEZVQ3ZjOGdsQUhPZ0tCU2JobzZJVjd0QkhDb0JOMnlCQ2Jub2U2QmNycGcrQ0JDYm5vVlFoTjJvSUtCQ2Jtb1VDdWR2SkVLU2RrQ0c0aUdKN0toQ1RzaUZKT3hSVTN1YWhib2dRbS9ZcW9rU2RwVEFWenNxRUpPeEtJVWs2Q09GQk56c3FwQ1RNRkJNazdGVVRKT2dLcUVKT3FLUWxFSVNaZ29KRW5aVkV5VHNVQ0VuYnVpcGtuWTlWVUlYUUlUd2lFSlBMb0ZubFVmLzJRPT0iPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0icGFyYWxsYXhfaWxsdXN0cmF0aW9uIj4KICAgICAgICA8ZGl2IGlkPSJhdXRoIj48L2Rpdj4KCiAgICAgICAgPGltZyBhbHQ9IjQwNCAmbGRxdW87VGhpcyBpcyBub3QgdGhlIHdlYiBwYWdlIHlvdSBhcmUgbG9va2luZyBmb3ImcmRxdW87IiBjbGFzcz0ianMtcGxheGlmeSIgZGF0YS14cmFuZ2U9IjIwIiBkYXRhLXlyYW5nZT0iMTAiIGhlaWdodD0iMjQ5IiBpZD0icGFyYWxsYXhfZXJyb3JfdGV4dCIgd2lkdGg9IjI3MSIKICAgICAgICBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBUThBQUFENUNBTUFBQUFPVFVDOEFBQUFBM05DU1ZRSUNBamI0VS9nQUFBQkRsQk1WRVgvLy8vTXpNekZ4Y1VBQUFDMnRyYVRrNU1BQUFEVzF0Yk16TXk3dTd1dnI2OW1abVpVVkZST1RrNEFBQURXMXRiTXpNeVptWmxDUWtMVzF0WnJhMnRtWm1iVzF0YkZ4Y1d2cjYrRmhZWGUzdDdXMXRhMnRyYVptWm5lM3Q3VzF0YkZ4Y1dscGFYZTN0NjJ0cmF2cjYvbTV1YmUzdDdNek16RnhjVzd1N3ZtNXViZTN0N016TXp2NysvbTV1YmUzdDdXMXRidjcrL201dWJlM3Q3MzkvZng5UGJ2OHZUdjcrL201dWIvLy8vMzkvZng5UGJ2OHZUdjcrL2o2ZTNpNk96ZjVlalYzK1RVM3VIUjIrREgxTnZHMDluRjBkZTZ5ZEs2eWRHM3hzK3N2Y2VkdEw2UnFMV0VuYTEwbEtWcGlweG1pWnhiZ0pOYWZwUlFkWXhLYzR0Q2E0TTlhb00yWW5zeVlYb3dYWGpGcTBOL0FBQUFXblJTVGxNQUVSRVJJaUlpTXpNek16TXpNek5FUkVSRVZWVlZabVptWm5kM2QzZUlpSWlJbVptWnFxcXFxcXE3dTd2TXpNek0zZDNkN3U3dTd1Ny8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy85SDJCOVZBQUFBQ1hCSVdYTUFBQXNTQUFBTEVnSFMzWDc4QUFBQUhIUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkdhWEpsZDI5eWEzTWdRMU0wQnJMVG9BQUFJQUJKUkVGVWVKenRYWTFqRTdlU1R4NTN2TndYM09HV3V4Y083c2lEZDd4Y29ZUVhycFZDYVFOckIrdzRNU0h4N3Y3Ly84aHA5RGt6R3EyOXRnbTBSUzNZdTVZME16L05qRWJTN0xLMTlkbktZTEFYeTJEdytmajRBc3JPZzZjdnRkYktGdi94OHRtRG5jL05WNi95bUxEdnY2NGd3czdlSWU4b2xQL2JXNkcveHlwamJDVysrcFpEN1docW5XZ2Y5TzVsOEN5MjFoSWtUM3Riem1HQ1E0Y3UrL1BWdXd3aTk5cjlnWTlIdDI3MTZtVG5XUnhJam9VTzk1NzFHOXRCcmgyNk4xOHJsSDFKZ0R1M2J2YnA0OEVoYXB3cFIwQkVQMWlCTDAzKzlPUnJsUkxOeGY4SDVmbXRXemVXNzJIN3dMT2VHWXBtM3crMmUvQ0YyZ2ZON2NmWFNtWFhFeVFEKzdDUFd0NCt3TG9odUE1MDcrQjJMNzVNZDlpcjllTnJ0ZkpVNFB1SFd6M1U4dmFoYjRqVlEyZDkrbkwwcjB0Miswem9vQmRmcTVWdEJvZWwvbDBQdGR3NTFKbllOQUJodi8zajBueng5cm9QWHl1V0J5b3JXbjI3dkZwdUgzVHJBd25PckFMOStQZDkrQ0xkOWVCcjFjTEZzUnozVU11blNlcmdsTW1OQkVXTWNiNWZuaStLOGpXWXl3NGRCdmZSWTVMZkZiUXJWeEoyL2VmbCtNcmMwVFVFSDN1U0hNdFA4dHRvVW94V3ppZFo5TVZOWS9xZmUvQ0ZzTHltNE1NVGpYUjdUUElobGtOVGk5YmNUTUxrRXl2cTV3djdUL0ZkV2dOY1EvQnhPeEx6MmduOEx6L0ozMWFDZlpCQVJpdHVMUGJxVHdzN0ZzS1lhd2crOXRNd1JERjZlSzNvOURTMUVpbzh2dlM2OG1JQmhYMmhtMnZ3cGtrdEVlSGxKL2tkMnBJRzEzUWhFKzNKZjN6VFRlSXdqejE2QlVVcmxyc3FtcjZPSXZ4cGFiVmtvNWhrZi9Iay92MXY3OXkvLzlmdmo1U1NWRWMvN3h6cXV4S1V5L08xY25sS0NMcS9sdzgrdGc4UnowZ0ZucHV3S1pRN1Q0NXlaUUdJN25UMS9BelZEQTM3QkVVcmxtM05sZHFVdnk2dGxydXNwWGNPZndJY2J0NjhZWHE1Y2VQR3pXOStqTXFIcXovcUVHNDcxa0xyN3VYNVdybGt3UlNRWDM2U2YwWWJJamhJRC8vMG85TUlPdWw4MzZIOHU3algvbnl0WEE3b3hHZ3Z2bDk2R0xiRlNBemdZQjM4d3hISEhNcWRNcGtEYWx5MjFmSjhyVngyc2pGUWZTYjVYV2xSKzEwT0I2ek5VSXdXTEtkc01IamFpdVVhZ284OXNrVHc2cjY4MTlySDJoR2l6enZpTUI0S0EvNjhLTjhlcmhZd3ZJYmc0NldneGowbStiRDlqWnd5YkZCSWJEK2dBdnJ3cWtUb0pkSGIzbnl0V200blU0a1RvbDUra2lkYUhZYXhzRUd4alNFUGE1MXZDd04rbTY1MWJNTWVmSzFjOW9saTlBMCs4dG5XZkJTYkg4UnFTZFJIQlFsSmxIZDl3UWVPMWVNS3RNY2svMWpsNWJ2U0tENWdKcUN0YlMza0s1WnJDRDVZVE96S3Q4c1B3d0Z1NmR2Zkx6VWZVRUxXRUY3SUl0NVZQQkl6Mzc3NTlPcnhGT1BnbCtWOUp2bER0QzRKcS9weXpNVDB3MTdLbFo5RnhGTE5hd2crdG5NR2UyM0lTZnZmUDVUWjl0dTBlQzVTZHlRODJINi93L3dhTmdwMzA2U0FSbXg1dFJ5RVlReGUwdnovdHpMYnovZ1N4alM0TDlXVzFoRFhFWHhrKytxcTN5bmxYY3F4L1hoU3htT1A2NkxCOGFGVSt3QVBrdTdQMTRwbEJ3a1RTNTlKZmc4MzlkK2VsSWN4VGpESS96NFJwTnpKdURMQVhVUHc4WURSQmJYdnRTRzNGNlJEckJlbkYyTmVLUGdJVVphRXh3T01tUThUcjJXalVEUHVWTTlKbnF4QmZXZGRlS2lzNkw4SjFWK3lSWkh1eTlkcTVYWWtHdU5GbU9SdlVkN1RtT1k5SFBDRnNRSjdLL0s5dzR3QS9oTHd1RTNzeFAwZkZ3R0RiRDRVK0ZxdDRPQXlyTUhqSkUvSDBvSW00SUg0RHFWckhKWGl1NGFTZmp4bUNFUEorRUxUL0liZzJEckVSaG8ySklMWFFuZ0VEY2tkR29OTXUxcGxQSVJjQ0NFZ080eFZVcWdpOGFVaXhZM0FjVGRLa2Z5OWpzSGxBSlBVZnVSbFBPaElkbkhINjhKVmhzZGQ5SFBjNVVaOGtTQUdNTnNRSHZ0VUZFc2tUZko0SEx5Q0NIamt4dHlKUjR3MXUrcW5wVzN5cDR3dmVoaXdHVHkyR1YrMjcvdXhiejRYMk4ycERJLzRLL1lmWlpxNU84M3Jid2NZOEJFdzVZc0dhaHZDWXplUVJYaWpTWDZRaGRZTC9JY3ZQM1p4ZHhERFdGM0VZemZocThNNkFQTkZJeDR0NnUwcWhlOWZ3N3oySkRuREFWRkpaK2tTSHByYWdGbkFkK0tSYUlXdnZQNkJVbndnRk9HTE1DM3I3UXBsaHcyVC9mSk42bnFRRDVPRUJ3L24xSXV1TVBKQWNLaXMxeENqSk1nMFNaRmllTWpqdEVLaHNicWovZ0xGeElQa3pUd29YZmFTcEZ5RUI1SkQxRHE4NjV3d1JueUY0Q0NodFJFOFVGNTRIR0M4d3pBSWFDVCtjcnJJVHNLZkpmRW85bnFJZnNxQ0Q4U1hLdmF3VXJuTmFaTGdZeXZvaDE0V2o4amtNbmgwOUhvYmo0TDIzb253UmRSV2J3cVB2d2ltVDNZWXdsWlA1emd3VE9IcmowdnBoMHJ5MEY3L2dyQU5jeEhuaXp2NlRlQWg1WnJjeHgzemRVSlhQQmFtUlN0QUZ4NXAwRXNvbzBjQ2d0dksrU0ptdXBINTlpNFRGZ2pUSFlaQmlrMENkMHZFSDFxSXZ6TThGSmx3U2E5M1NXZFpVTFNWeFlrYm1sLzJNNUQ1YWVBQWpidXYxakhmcGpIdmpBWnlXWmcwaEM5ZmNyNVE2ODNnc1UxbGNGZmZrSDZ4dmVpU1hyTEFlYUUxYTlLcCs0YnI1L3Y5bXVkbkQzQnp2U0U4ZHZrWXFPdzBjTUM0RXVrZWFMTE1XTGo2RnBMSVNEeTdpK25wSWw5MGtiRUJQS1RudXRqeHhnQU5vaXJSVGNkenFmS2Z5dHpSMDI4bkR6bWVlRWI2Yzk4NFh6bWthK1BCYzAyeVNYNUwzT3NzNElHeTlrMWtMeCtva0Q1VFRLem9mbUhpQ3htaXdCZkwyMXdiRDVxSjRRby8zcUR6V29IdUhobEpWKzZYOThjR3ZLN1M1SGppQVY4Y1NueHBydG5ycitjT2tyVkVxSGtxRW83WC9aR3lnQWRIVmNrSEtrRmVWRTNINmdtUEE3U3M4YlN6dkhHMjd0NUVQSFpiWlVOditIcnlQM3U0NEFRTUhhcTRuOUlUbzdzSXRGRDN1ekllZXlvNm1xZ3BqeEllYUY4OWtaWDV3Z1FGdnZxVnh5aEd4eWV2dWZlUHpLUFpUYW4wVFBFZ3lSV2JkQ3hnbnRLWldibWdPRlovek9RVVJzMnh6RzRITFY3MUxRRTRWcytmRHNYaXlaLy9FU1hZWnI5YmgxckdnejN1Wk52ZFNlcDBxUG8rRVJCL0FycUlyMzZsUkNialFIeW9SMk9QS1QyQlhFb0o4NFIxK3FPdE03eEJmdTZFSW92VkNQa09UOTZOUi9KSTJEZXg0QkZUUXh2L21zd2dCeVIwY3BYRUUzc29BK0xFM1FVT3g3Q0lKT0JpU0JBY2tzSHFsZkVRaGtCQ3ZxUStpTzVqVWwzN0diSkE5ekdlckh4ZjMxRThKTExTWTRxNUIxR2RNMzAzSHBxUW92TWJCcU9nUFlqdWJtQXZhWTh4Z1FKYkI3eFBwZkQwRXN3cGZ4Q0M4c1BRMlFBZXBNdUM5aEd1S1h1SUxzdlVjSjArbEIwSW1VNmpzOEY0UkpuNVRrT0dURjcwbW5pUXJzUXBKaVhDSm9QSS9GWjhMaHM1K3hleXdlekhucE5NSk5tc0pDK2Y1UXJzciswLzhIUWxreEk1STNUM2NRY0J2L3NTWDJLQy9uTWNXM2FRbENjNlAxTGgxR1J0L1NEZW1kRkN6T0M2bk81ZGFUeC8rQmVCNmdHdkIwUWZVanh5QXcyTTRBaVNNUmZQUXpabEwxUWlhYWFob0dHNllzYW0rajVuYkorNDNOQWpXYnhtNUhETnNyVzR2OWZ4SDN4R3lHYVR5SVV3SXpDNlQ4VVo0ZnUveStDUVpnU2FZb3VyOU5OWWQ3MmVmbVJpY3RpbGlTZW5lemY3M2FxMDNzVVU3NUxFenFUNWRQRksrU3FyQklVbGxZM1lDK0l4VjJpUkFUWU9oM2lJVUl2RC9RZUR3ZmJXWUxDNy8xTHg0bnVpVzRFUzNjQ1NzREdabFUzZ1FVZStBQVN1b2prZWU3eUZTajVQc3orc1BLRjdQV20yRUhoWVFwWFhpOGRTZUNGTlpvcW9oRUo4Y2orTzMrNVE0bGlZV2dDek8zUW5SK0FoM2xsbTFEWTB2eXhTQ2NVSGlOSGRVMW9FTmN2ell2UWcyK1JtQjE4bC9vcnJtVlh4Mk5xNnRiamN6L2xLUHhLNjJ5Rkd6YlV0Z1NISmVTZmI2RnVlTHh5TUZmajZoSGc0Y1VwMEh5U042ckhhZ0l4anZ0QlpraS9XNS9wNExGRUdTVGNUM1VMZGJOOHJBdEdCem90YksrMEQ1M25DbThvL1hVQlhVeU5WSGVmb095bWlZR0dUOEZvWTM2ZitkclhoSEpCTml1NXgybVFaVU1HVTZqcm5JTWZ5R01UeWZ2WERGWjlYNE9jTjE0Z0hWL1lPdXYrVjBDUEJXWEhMNzlGcTFzTE95ZlRDRStPTmxRR202RVRyb3Z1L1VXYkJaZVNtOTN4bDV6ZEliSVUrcnhNUExGY24zZjltMlJNWklsaG5IcTArRnd4b1o5ZG9MOW51WVRmZC84d0RydmdkZXlGbGR6MVdmdGdwenlPL1JqeW9oQXZvL3RzTFVUdThlaWVUZWZIdE9wRUM5cWNML2Z3R3l3QVQxVXVOdzQwLy8xQ3dHSFQxdzZQMUFxZUlSd0xrdXZTRHZWaG9DYm8zSC8zUWZRcnMwRmpud2NBc3YvQ0xuRzlEdVhIcjRYTytSRTRmengrdUgxVVB5TlBkMStrLzZCQXZTL2VHV1dJOGVaR3Y4Rjg4dWIrUk5jWWdHNmJyd1dONzhPLzNXVm1TN28yYlJ1bzc5eDgraWVYaC9UdCt3WFZ6N1JYWDZueXRXMjdraTh1bG05NjhtVGUrdVQ0WTYvSzFKdUdzOUd4K001YWVUVDhwWDEvTDEvSzFmQzFmeTlmeXRYd3QxMS91N2grRUpXWmFqWlJLY1p1TFhQRTlMNzU1SkhjdG5LelJSVjg2Wk1ySWtab0ZLcUhhd2Y3ZE1obzc0dkVJMnRkQXR6QUxQZmIvR085c1dTdDJRcmtnUDVmMjFmSXVSSFpkODRNL0Z1QjRVTXBncEwwSzI4RFpqY0s1SS82cWhidWNTSkk3MjJMSis0NlZrZjRzbDJndi83dE1meUhObHN0RDRBSWdIYzZyZEhVZ1E1WDN6WDlQbkhJQ1RFM0VSTHZBMTJNQmpudUJGQjZVa3VKMmZjbzBBK2VFVGZJNHJrQ0hDYkZPQ2orcnlpamV5K0Q0dzB0Y0Z6ZkFuUWpqTE9pOXJBMXMxR1haU2s5b3hOL0pienEvNlc4a3ZhSTJMb2xseW1IMkQzZnR5aU1rZVlMb1p2aXdTcFJFbHlQN2w0N0VYc1FPR2krRVZFYUc4SmJqejY5Mk9SNzdHWS9jaFJXc3YrU3hzaXBGYjdoaWtrd2FyK1dqQXFYRXFWeXJmWTRITVpmclVOR29ZaDF5TUFYOGhMUDhTNDVIbHR2MUsxSDBqSlhDRDVSOW5kM2hlQkRZYUtPYzh5ekJGWjFsRnhoa1BXWDZSUXdnNDVrMlh5WWxPMVlrZlhLV2toZ1pIbGkySlZJNGtmVDljdnp6V3l6SHY2Q0FDL3J0SWltQmdkUEs0TE9FaDhoTnJvY0lEVVcvZHFnMGo1UlZBa0ZKUXN1Q1VsMVBGcEFOdXhnRHN6N2p1RXQ0Y014aUR3SXBGWlUxdDNic09SWU5uc3duSlVnRzRST3RCNHYya2xEeEY3K1BJRlhXRHpxaVJTZUVuUXYra1EwQVlpeTIvVkk5YjQ0SE53cnhJdDM5amJuZDhueTdzSy9QYmVxVWNsbVRXTFZ1aFJUd3dKMmpZUlY2U1NRa05vZzEvRnBza0s5d0VXT2Z4bUZSbm9oRW9zSWx3eWNrWlowclVFSE01WlVveHZwZWpzZVhzTEFxTnRHa0hURWxvbE5ZdTRqMVVuM1VpdGluK2JqSDhQak5ydFVFL2pBWHNkOTdYRC9rTWN0TVdFZU9DU2VValFJWXhBUGtQNlRMQXY5WWxFelk1TkNFRUwzQUswYjNYb2FIUUZnTGQ5TTE3L1NUN3Z0U3VvSUtaSklyaVgyaGxzb0E2Yk1XUk9KazlXVmlqTFRFUzV3bGxsQjF2bGdwb1lrSUJ0RksrTnRheUdRaVlhS0d2N3M5czNzSUR6dzJSSm01QUw5bHlPNWgvY2duSWNvV01aR3lHUkxPdWdYbkZscTAxV1JGdVIrazdLMFpydDNEOFhwWng1ajNVR3JXdG0wOXlXdkppaXJKSm9PWnlkdmhvZzBQVFRQWnJJdjJKcE94U0JmbUlIM1ROUGJ2dW1uUEhSN3RCSGVwRzNTRHg3bVRwbTBFQ0phS2M0ZUdJaHNLUitlOHFlRXJ0d2x5UmJHS0pEdmkzSHRrUFNmcGtLRnNnR2d0SGpYOE5kUHFkRzd3bVpDS3BzcWtvSm1BUjczcVlWTmxPazQvYUdER2dYQjZCVU9BMVUwU3NxeTFxVEpSd1h0aHZVK3NrN2pSbVlVRFZBTUFhV1pXZk1zVzhqa053d1BiMktRQm1WYnpPVU9qQmxoeno1TlNBTW5OKzV4NzZSK1F5T3ZhTW12YWQ2TnFhbENwcW1GYnorQkhvekpVUHlhVHlVZ1UyTnlvekk5Ri81VHJKckh1a1VFZVY1OGx1NHdteXJSUy9wb0U0N3REck1LQXpyZXBwdjliR3p6TUhhUDB3RmdUOEtnbkNiK3lQaFpNVU9BYkR5RGFQWmt3UEpDZk1wb3pJZjVnSXd1TWd6OTBQS3B2djc0ZFZRcVVIaFJYdlIyK2dYdkpuMzdpelRLS2g3Wit5c3RuckhjaVUxdGpzOHpBVVg2bGhxOWtSVEdNTlVrZzYxL04vMmZXU01ERkJEN0hIMXJyZjl2UTY4ZzZZM3Z4MDNUdWZtdEMzekJUWGI0L016M04zdnZleHhlMnlzWFlOS2w4WDYybk8vT08zWTZGYy9OTmMxWjVQcUZsM2M2blIxanNmZ3M5Z0dNcnE4YSsyNDRtYmUxRmhQOHRHRERqdEdPNG5yVjJzQ3hzVnQ3YTJwanRvckl6TlhUeTA3eUdPUnVFQ1AyZjIxNHN0czNZRWdNOXRMWEFHS3JXLys0Wk9mZDBiZHpoZkR4MDUxdENQQUJONTYrU0FQMEN2b050dEg0UlhMOU9uVnJGalZVTVlTZEVQZi9aWEo1K2JKeURmUTFRMkNGc2d3bS9PWWVaQ2ZDWXRoYW8ybUFYdURpOWJCTWlyNkdEMExQNTgxcTltVjM2emx6OTAxbkF3MXc0OVlDNlY5RHlaNjk2NXM0VWpTT1RxSFB0YUxVRHZkQWFmUVlZSW5nVEhBaUEvNWhXMVFpR3hQa1JONTVnVmZWa1dJMThaVWZjbXBvcHhsZytqRVpWRlZ5QzlqMDFaNlBocVF0ZzFNVEFPYW1HSTFCSGUyMDZmb3VZQTJtUDNKV0JkV3A2bXpTK3BkR09pYm0rTVBna2EwQjJRZHgvWmk5S0JUaEtyeGlodFVIMGRGVkhHL1poaHd0SWJLMGphMEJOYWg2Z05MS2N3cWZSK3JTcU5BMGdvdEcxaTY1QURYVUVHUEJ4eWhHS0YxNGoydDZmQk5SUDI5U2kxK1pUZ0dPTDIwcEVFSGZuNTVjd3FqNzhzcDh3dmJRdU9IcHY5T044OG9hT2k0dkhsTG93bjlPVG55Zy9NR3RxSkg5UUhtK0Evam9acWg4SUhYaFFDUTlENWVjeHhFa1hIQVFWL1NyREJkMk5jRWd2Z09lZVY2ZEF3T05SVzU4R1dtMmIrM0ZUSDYwdi9EaXRVT3N3Y21NYjc3ZXp5VSt4VzZXOXhWbGNWRkJESFRVd3FxVWZwTVl1NGxURXdhdW10dmJTWE5iV2Y0eGQvV0FsbWd5UEh5VHNOM1R5SGNSZWttSFJUenUvTkdrS05WSUVYUTMrSTB5Q3gzTTc3VFROYVdwdW13TE5xZk9HOWVYYmhIYmpwZUw2RWZ4SmRLWU9FRGNRa1NTNk5iRjlKM2RhTUF5ZHdNVUZ3U0g5Z3pYY2dJSWhZeW5zbkJmaU1xL2VTcjgrdmJRUkEweUNIcnhKWGZ2WlpueG1KNDcyTW5vNEhWWWhBWThRYk1DS1FPTjR6QTBNV2loNGp4dVJnOG1tYWVjaEhNbEdsaFd5VU1Cd0xQZHE0T0FFN0IwZHpDUG9oNDRCcTZrZGpkanJPSm1xaHhPRFYzc1NxUVhMOHl2bTVEOGEyR0hSQVo4dzMwV0N5VVNiT3JZOG14eW44Y3lsQ0IvRTJjSmZCeVRuY3FubWRCTWp4RVRlbnlZLzE3UjJmWFBheGhqVUwzMnNBSFp0L0twTlB0RjVJT3RIbkFWRy9haTlQNjA5V2MrOVZSdlBRKzFzdHFudDN0VFkxS3hVcjBRcDVYc20ya0hPbzFBbGhJeTFsOVlIM1ZvaDhhUDZoc1ZFMjE0Tmh5WUlhSnQ1SEFUVHRIWXVZbDZaM3liQkVkcmZXelJ6bTNzbnhxOU9UYVdwb2ZBT3BEUVVwcVBocThEWXBlbjRwRHEycFB6VTYzazR1bXJyRCsrcWtTSHhTMUwyYUpmSU56SkFtSGJ3Vjg2S3FJN1BJZks3UEhWM2JGVFpuQitmZnJUemhiMWh0SGQyYkpYWVJmTGcxU3g2eDNaMzBUUlY0WmUycmwvN25rOXQvRGw3QzA2bnJhR0R5eGo2V2lmejZzcGVWSDZRSUY1ckcwY1M0dnFaNDhFcTNzU3ZaMEpJVkJwWmVtSCtvdHBCNGc5ZHlBbWFPQjg1Y3ovTldydkdxTTdkNnNxR1gvRDcwQnFRMjBtN2ZPWFpHYlcyOXN4T29hM2JlaHdySHpXNytMdXBaaTdJcnd4OFZ6NWNueDliZnNZMkNCOEdSbDVCRUFOOHpCeTAxY3pOWjhEWTFHMXFPang2SExGdjVYaHd6ZUNRVEp3a00rWHhnSVZrTTVxNXUzYkx5REpuN1FiRTk0dE02R1prV1lSdEU3ZVlNMEg3aVFySzdOY2p3NWxkaUZpeGY1bk9UYTM1OUxVblBUeHpQWHVyUGdKL1BQTTgxQzN3QUUydHJDZG5qbzlKYmhOSXJtekFPUjZTUWlqMW0wc0RVdEtLSHo0elBBcDhKaWhJUDh6MXl1VDV6MXFwenFWbHpqL1YxcXdHOG84cTlxMEt1eDJwbGlhTjNaOGlIdVVtY3NINGVZSEZLbDBkRUxFTHM2STRMbW9UVHdOWkRycnc2TklybmFURy9XWkNhTVF0WlZtVEZwOTA0N1hjYzViWlVmQWZuOGQ0dndDUUJUd0lCaDFEUTZ4RFJVWkY2MDRWTWkwVisxNU9qaTdtd3QyZUU0Rm9MenI3RzBtVjlwU1EwV3IwUHlZU3g2dkxxUEY0Nm5RbjQ0TDRDQzdYaHZJSkN2NkRtOVh2Sm1FcXQ1Y3YxclFGYWJEeXJ1WS8rVUIzMkl2UTFXOC9KaXZOTDd4RFptYWE2aUluUEhTeE8xUFFKWlpUQXRlaVRlazRIcEl1NWZmRUxnUnlVdnl4QVNiY3VkUFNURVFOU0c1RmszN2phSVJoWUo0TTgxSWN3d1ZYU3JRWDdCd0NPZmExczB0M3QycmRXaGNKeTFvSGZTWDB4RDQxbGIxb29sSlhVbmNaN3FRczBJOTh4WitiWE9JNURxRjZOUTJiWXNpYmtEYlV2VVphbXZkSGUxYVJOMmFMdEZlRjFMbFlnNG5xcnVYNWRuM3ZEM3Q5UlBTTmVQOEk0U2ViNWlVOEV2L1Vpa3Z5U090UHZPWE1EWG1kOVdlSG1OamZTRXpLekJPdUMzZ0lyZGhRTEl5QjhGNTRjU0N4QWlHMWNBU3dVcE9oU2ZUOFhjR0VOV25yNnlNRnk3Z0k1QXJ6TFdJbzlnSmYzTGxHcTN4eWdiSnBoazRUeGhmMnlNTm5YUGhOUlhNZDlncmRwRlBEanRubHFhdGs4OURhNXVLOXB6bStDUGtPN2N4M2FUcS84bDBxdHhGbS9oL2FMY1c2R1dxN2hRYmJZRmZUbjVYYnF6Ujl4aTFIREYyR0VBV3hoQWRIbWhhN04yamtkM3VUTFJ3OXdaYXY5cnVJY0h0KzVQU2pkcnVuelVXUXB2STNBTWdQOXFiYkdBeWJ2dnJVbldGYVJNNTlsellENU9xVmw4UEpXOE5tTGZSajVEMmFOMzVuZW43a2NrOHNYbzZWS2d3OGMwbE1OSHlaejdlaXNRVFhmejZITVorcDJWVmIxL09aTnA5Tk16K0hYSTNXN1JXMzlSUklRbzZDRmJYMm0rdktiYTdiSGRWMFFGUDdWakM0cjYwUXRnL1l2VGRkK2ozeUppUnhLTHYxRHB2NWRpdisvRmhCSG9rZkc2aDAraEhVdzI2MHcxYjlNVk9PSmVMbGtqL0ZiZ0ViMmxIcmpvZ24vbk5zUG8rVVBiSnJKcU5oUEd3Qi96RWNqZExoQ3pTSFU0QlJOWHgvYVV3R3JvMjRObkVrSFU5Q3VzZlVuNGJDMGZla2dpU09lSDZqbEsvcmo3aTF1bXJiaTJvVURubDB5QzBBZzZaSjA5S3NLTmhPSWY1UVdZTXc2WnkxN1puNUJwWnVQdFdaKzRobmk2YytMblc1R3k2VktLcHNPTnlIVEJtNFZUYzRZVE5NU2Y0WVg0ZFVrZE53VEtjOEhnNlhab0x4Q1NsdDRWQ3NhVU91SFMyTDVvWGNYaGlXQkVOdGp3S05RcnkyVm51a2ptcW5KbzZmMXluandndWpnM0FLZzRieUpmUXY0Mm5BbzNWSC94RTF3QWU2YkZFU0IwdjBDRWVjOFFpVkp1ZHdJRFNQZGpPa2N2M0EwN2o3Um1iK1YvYTQzbWE2TldOdHpVVTdJZHBMWi81ajVmWEM0WkVTQ0RFZTdtWTF2WFRXNzQ3dm00YlZhai9HL0lDQWg4Vk8yMVFScmFPZXhMUGVodURCaEZpaVpQcXhjSkkrQTgvMXdjNjNaOHBaajNMQ05OWS9UdjExVFVVUEY4R1k0Qm9PMGV6OFJJN3ovVkJiZTNHdWNocDdjSGpZczJGNmFEeXAzYmx3U0ZhSy9vTkZJbmhCdFF3ZUZBREo1WXhoYWpQc25CdGhYcmROR3hJY1c1ZHhNWFQxZy9FYlhHcU1oNWZZYXNMWVRqZnpzOWFtTThTc1JZZWFUUVVBSmJ5S1NSemVCV08vNFhEUkxvTk9wZnN4S2FWdmRDZjZEeVV2aFZ3NUFrOXFCUG5Ga0o1Wkp4TGtQNXU4d2FMYlhLY0pkb1plV1lLbk5ENzVhdncyNkhoVWVmOXBVODNPSnNjS2p6RlBNY1ArMURhdWZVNUkwQnVkWWtsU2RQZ3QrQlYvdnh5UDhkYXgxWm5WWXJDVnhuN2FNcmJoVWFJYitET1JZbktHWWJLWndZRjlUT3ZRUG5samJNYitUV29LMTNDb1Rabnd1YjRqckIvT0JOMnpENURqcVNIMjg4a29YYm9nUmZveUh0SmtIYStzbXJmdjFJa05KSjI1NkZjbU1QdHdZZ0tCcXZvNStIdnovUXcvRzJSSDNzUWtBQ1JrUzF3MTdlVkpOUnFGcEEySXcwNnFhdXBuNDU5TUlIN3gzblF5Z2lRT3o0ZHBjekdzeHZNd2owRGM4YTZxM3MzOUpEUzNmWXpuRFhyb1FwU2pzRXJyaUQvNDBJUnlCSFB0M05LTzV1SzAyNGFLd01kYm40RUFsL09VVkRscFE2NzdGVFE3YTVxd1hHa2cxanoxMlEyd0FQQnpSdVBTQUpKb1V4K2ROODZ2K3NHeGY4WXd6MDFkdkEvNTJ5NCtWVWxCY2dDQ2gwMUZubTh4Rk5UOC9BelRnTXVIeU9CTWhTNm5YaGhnZmxTN3JCQ1lNZCtrM2lBUHo5Ni9zcHdlejEzT0NQeGREMDAzMHdCSTY0VzM0WDBRM1haek5QY3dlM3V4VFBpWUhpcTgrdUFCZ2R1anlGd09SR0dUTXNPRHpDNUszQU1Hd3paTFVzaXdSNUdCT2psemtnRWVyWmZzWW5JVVc3dU1aZU1BNHMzak00OEkySkh0MlNlUGhPeTBkMmRPb1NheEMvVWFVa0l1VTNLNEhuOEFkYmdZZS82T3BtYU44M0ZpMTArVlNzTWI0d2cwM3BuV0NQYUM5N0VvTm5rbm12V28wemxOUGlBcU9kbmlYRzV2aGV3MFRDOWp4SzFUNGgwZWR2b3dTaWUyY3RQZy9zRCtWZlNucExiWUZIMVEvNXN0Q3NKM2tteXBSZDYwajA0RXJFanRKbnZJVlJvQ09mS1NSZXVZWDNSV1g1NXd1TnpDYU9Pdm1nUWo0UWZ1NS9WRjQ1WjU0WGZTb1NmMDNxY2NwbDdRUURHbDVjT0g3MmR3U2ZIWXVwdnIxTlRRcnhFUDRzZ1NyYmRtYmgyZU5YVXp6dHNHbVY3Qm5ENmVRNUFzd1o4TVdkSXdZc3JjZ29yMklpRzZBVVZ4KzBFZlR3dVdBRThyK2tuNklqVEMvSHZZUjM0RHpabExGa1NzcXlpeS95Q0NyQXQ1K0Q1MHdzNm9yOFFBK2d6RGl5TWtDUGZaSS9zZ1dPMm4xNHdWZmlHd25CUlk4TmxMNCtFdTF6a3BxRndzTnN0bENGek5JRzN5UW80ckF5SDdHQjBzRzRsMDZZcjVMQ2J4UXRlL0FBOUZ0VUlMUGdVelcvcmtsOGozY0MwT0d3NlNMbVlqSUJ3NHluUjE3RHBRMFpwWHRSUTc4TUJLbTgxTGd1c1FHQ244SkRzaFdsdXZrRnhSRFlkSFVxV2NENGxyU3l6SFEvU0ZuSGpHZmE0SnJ2TElMay9rU1JQZGRMYTBuaStjUUNnLzVEOXpSYU1XbFkxTUtSNWJXc0V5K3BHTS9XdG9sMTVDRmNwUlpROG5pSWRyMDhxNFFBVXhwOXl6Zy9FSUtsYnJxOTlDL0NISXJmT21Rb2RDTGZYbW9vN0xzdzc5ZXZ1aFNkVmNyUWE5d21LaGZybEhiazBKUzVZVjlNdVdRdnhCKzhqWUozeGxQNlJMdUdaQktUZS9jQjAyWEZXWXZOaHJaekt3TmYwYjFnSW5FWVNWRDRJRlBLUmhadTNwY0dWM2tkdlg2U2xKSGF0SmZmT0hTZUd0R1JVeTJVVkJjM2pZTU54RVVqQWNrSjBSU2UzOWhmTXQ3YUNJa3NCaWNITllVRFNiTWx4aXRTNFNIYjlaMk1VMVlscDBZOVdnYXFJRGMwVThaR2RCdVZ0cVRwejRSL1FEeGFJOHlLeW84U01XUGgyZUhwSFMvRkp3UDFxNWZhL21nM3NxMHE0bUp0TjU2eDhUZEVrUE5rTWhPZ1o0WXhBMC9YbHFkMyt1cG5ZM0ZEWjJYRUxFYTE4TjVoZS9Qd2I3MExWN2hCU2kvSG95K2RpMmwrRzVJdGZTbll2NythUnlDUkJ1eWg1L3NKdE1GM2F2Q3RZQUgwL2dUQU1PSktSUkp2Y1c2a2RvRklDM0hiczlUZTFlY1dRNEQrbUVFL2Rhb2JhNU9vb2pGUXpiN3ZUWkkzdDRCNFUrbXZzOXROcnVwY0plWWcxNCtFeTg4NloxSnl0MjFlTTNUUzlzTHNrdjg1QW4wVFFSajladkV5cllUNnI5dml6Z09mUGYyYlFmaEtNMnMrRDVseHdXcFZ1L0FleGVTWEhzeVRWMmorOTFHMW1aeGtnOG5LeE82L2llcnFuMkc4Tk9MdGlMOVFlOVozWjc5TncrSXVqa2VlTnpPU3hKdTRpYnRxbWN2M0Y2L25aMjZaL2YwNy9VZm1mYktOQXY3aWxGOTl3YW51YlNLRE1aQzNnd3Y0UmFRTXJDY0RTSjV3aHdVSGh4VXMzaE9OKytibUpVVlI5Y2tvUFhEei9md29uQUVESWlYUHJDdksxdG9zSUhlK2tUQWV5bTlJZGRGWUVZQUFBSEFrbEVRVlJYdG0wYm5rU0ZYZm41dURxNTlIa1BjNXZpTUJyNkl3WHY3VUVyM2xwZ2JkckVxSW9zQXVobm8ycU8zOUdSaVJrbVBpa2VvMkF3SCtnWHFBa1BHeFRxYzRnZXdzdTBJRlNNQVcxNHVOMmZSQWZIRnc1YVhhS0NkZ2VPUm1rYXY5cVA4YW4yRklMaDZTYTg5Y0MvVDBJUjJGTm1ZeHZ4Z0FjWTdXczNpRnZPbkt1c0gxMW5sYjZSUzBJSWVMalg0UVJzM0kvTkJmSWZEY1hETWQ3NEJBNTBhdHRPamM2ZitUZWNoSk00N1U5N3phZC85QitOT3dyWXdHMEhkWExycGRZZGJlcWExRk5SbzdLenlpNy9rUU1ZZ2hlYm85QWtQT0t6NjI0RUw1MnBqMFAxK01hUDFqOWQ3Z0VnOEVDMTJwNzBwNlA4Rm10Z1JNNy9BQjJGcDlzZG9aamdHVGZ4K1JHdnZSbllDcENrd2RlZGVMQzJxVXhiOTZxZUJtbHorQTFrcSszUDAwUXBaRHcwNlNTK1FWeEM0cDM3dE9rUzZjQzJRZlpTSjBHMWUwdUl3Y0VmOVFlempQWmk4ZGJPQVdtVkZrSWxuY2MrdFJ5ZjZnUUpmcHdGRW1DYWVuNFd6NHNkSHpwTUpWRG1LRU1ocGJsNEFNTGhmb1A5aDI5N0ZaL0V0c1BiSUl0RXdJYWhpSy8xc24vZzRYWExxMzFEUUtxbmxjT1B6Q1FLSzRYQ1UwYVhmcVJXcVo4THcvTDRPREZGRWw1QUpwZWhnRHF4L2czVTI1MjhCL0ZpSW9zUFQwRGZ4ekhHU1BpaDFCcXZBVEZsS3J4UHd2S0gvYWt6NEpBcVV0Zml1eDRqSEdUUVJUdzRscWlYSnI1SWdWazNGRGhjcnJoZUJuRW9BRkVxK0RuQ0JMb1UzaFhpSzJpTk5RZytMLzJwTVRybjF0UmU2Z1NvVG9TVFlHRjhNemxMLy81TEFDRGZnSjdYSnZxdGhwVi94WStOQmx0ZngyVW9uSmk1ZjFTOWpwYnQzOXFoSVNoNVA2eE9ya3k4b3B5aW5ReXI5eUZSd2ZsRGlOSzhTMDBVVXY0bE9BWUZyK002TlN5MGJIN3gvdlM5Y1VQVHlyNGxvN0ZIVnVIbzJ3Z3ptNTJmWmlJUlJHUjdLZWZTbjdtNDBEcUsyVEhFcHpWa3o4WUp0NEYxQnhvUmQrZ0M2YlhqSnFZbTJNVFZlRm1QbFk3VnpQcW52am9OYjgwNGZ3c1VHc2p3UHZadjJkQW1YbzhCL0NSdytpYVNzZnJqNDFGNFM0Wjd5OXY1T0tnTU92cUxQZ1FaVVVrL2tHV1I4MkQzanFUV0JlMFZyQnRncmprUHZidWtoNURNcHYxYjlsd01OM1huRGJWWGdHbkk5WURMb1Z1U25LdWZQanFlengxWWxYdmxvVUZtbUU0cmpxL0NraVQ2QmY4eVB5dnMyeXUvRUpqREMzUGdMWUJOZXRPVGUwMEhkaUgwQ0VXS3gyaU1FckYwRFk3UHJtSUdTbVgzUFFubzd5QWpxS25qYXlhcUlDaW94QVVzTFM1Q2lnUms3N2Z0aHpIME8zTEozZWN1S1dTbTNZdG40VjBma0JsbEJuc0duK2JMRE1ibzUrbGxFL01nZE1URHZyOVloNVd6WFRpN2xQZndkaUh0V0NYYVFVUmNLbjlNcjdMMXYxVEovUm5wUU5ybWlOVTBpMC96VGpwSWFuNG4wRm13UDVidkpKUG9kaG14dVhxV3VGN3Mram43TFU4UjI4VFIyWUw0UTdZYmdVaHlNY2xMYVNKRUJDYTRwNUxrSkVSZ2NLS3I5eTJjdG9oS0x6Sk8yUytOTU1kajNVR1RHVmh6MEZpMW8yb0VLWWIyTFVzTWRHSnFPYUU0VTJCK1NCSDBvOXNCRjh6a09wOTJnd2V0N0h4NkVvUXE5ODEvVDV4eUF1NTdJZjdJdWVuaDZNcGxEVWZuZjRYUHlrMDE3VmhzdmQ3TEF4Yk5Md3o2SE51QzNtUURySVhia2ZGK3gwZERtRURuMCtPY0h1NDU4YWZUbll3TElwQVd6eXMvdTd6aHQwOGhMeVpGdkk5dkllcUhaQ21NamFBdE9xdVRsVGlaa0lOWDNCRFpReEhqRExpOFd2WXp1eUU1UHE3L09SNWZoSXNJdjNKd051RWlNb1hFWlZFOGh0R1hSZ2dOdGNvZ2xFVEhWWmlDWjBxVDZpWVNDYnBscEJSWVRvWWxhSGN4UHMxUGFnVHF1TW9YTnl0bjZwWHBHdTRrL0Y2SVA2UWVjV015YUtLN2lUOFNtNURHSkJjSm81QTZrUlVpVmlCYXF2aGxnVkwyazRoSEhMb3ZmRElvU3NWdlNKakk3Y3Y2a1ErZ1FFcm85SE9zWmFRcmRLTUlIVWRHUG05QUhQN2EvM1hPM2xaVThLZWZTMTBGMGpxL3F6R2U4VlBIYW91Y0JMNU82bHJ3SDB4MWRXaVVnNUZxZG9Lem1VQko4MTgrVGVCYzhoOVVmM3N0RVhPaklQVVFTT1Z4RlAyVkJLdXNEQVNPZ28xUXl3cTNPdU14MytBTDIvN0FYemE5L1ZGOFA4enYxRndXdkIrWE1aV3pUVzBuMU1TVitZRGtOLzJOQkRxRm4yc0F1ZDl0Y1d5b2FJZ3FLWHJwZlVxL3Mwa1dGY0ZlZUNjYVM1c2pKSnFwYkNVNkRtcVhGK0lDc2k0RWNoc01BRGtlaDc4cjc1blQ1WGk4RERVazNTcGE2K2VOb1FUY2MyWlVSQ2ZxQ1ZFbzkrY2x4Mk5ma2QrVElrcktLc3VBVFNwSktxeTN4ZENBQzBhMXRUekF5emtKaWtHdUwvc2NqMTNjeVcvU0lpS3Mwakp0bCtQeGh4OG9rVUwvekg1K0t6NzNjSnZqc1hVUGs4R0tJSTZReEFiWjRoRFlWVkZpeWp4cVJnWE4xK1g0Z285ZGgxRnI0V2ZQc3J0OUw0TmphK3V4S0NSaHRVamhWNzVyK0ZpQVkydHI3MWVtNUVteEVMQVpHVzdIakNCYzdZbHdiRzM5OGVCVDd1akxHdWZIWGtLUWQ1MVkwZlNHUXRDRSs1aytvSnFVeXNGT0FRNXdJdnNIdmhGQ3BJdEpURExqUUJBeE9JL1NhSEpnQ3RxRGZsOXZwanQ0SnJtT3JhMy9CNzJMOTlDQ3JGSDNBQUFBQUVsRlRrU3VRbUNDIj4KCiAgICAgICAgPGltZyBhbHQ9IiIgY2xhc3M9ImpzLXBsYXhpZnkiIGRhdGEteHJhbmdlPSIxMCIgZGF0YS15cmFuZ2U9IjEwIiBoZWlnaHQ9IjIzMCIgaWQ9InBhcmFsbGF4X29jdG9jYXQiIHdpZHRoPSIxODgiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUx3QUFBRG1DQU1BQUFCWWdoOElBQUFBQTNOQ1NWUUlDQWpiNFUvZ0FBQUJnRkJNVkVYLy8vOVNPQ3hTT2pIL3dwOEFBQUQrd0o0SUNBaFdQakwvN3RETVFqai8vLy82NjgzNHZadVptWm1WY2wrYmRtTjdLQ0l4SVJyMzkvZFVRanBSUzBuRlFqaEtNaWhwdGFWUVJVRXpKeUF5SXg0NktTRjhMU2RBS3lKU09DeFVRanFjaW5jUUVCQlNPakZTT2pIenA0dFNPQ3oveHFaU09qRmtURUJVUWpwU09qRzdxSlAvK1BRcEhocFNPakZTT2pIODcrano0Y1JxVVVSRE1TbFRTVVJRUlVGVVFqci8xci8vMGJBYUVnOVVRanFIWkZMLzU5bk9URU5UU1VSU09DeU5mR29qR2hkZFYwd3BLU25HbDN5V2xKS1VoM2Q0WWxNNU9Ua1FFQkRlejdmTHZLV2RqNGh6VzB4SVFqLzA1K2JicDRuV1psWlRTVVJUU1VSU09qRlNPakhvMTd5TWduNStiRndaTFNsV1BqTDM1OHYvNHNMNXc2WFd4S3lKY21GM1ZrWWhGeEl6TXpQODZNeW5uSWkxakhSWG1Zd2hJU0VZR0JoU09Dd0lDQWo1MHJ2ZWhuK1NibHFSTUNsV1BqSUlDQWdBQUFDTFpXSkFhMkkyWFZSUlMwa1FFQkJVUWpwTE9DL3h0NWJscXFXdmhuQk5oM3NwUkQ0SUNBaFdQakttTk5vekFBQUFnSFJTVGxNQS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1JCSC8vLzhpLy8vLy8vL3Vadi8vZDRqLzNmK3EvMVdaLy8vL1pydi8vLy8vSWpOMy8vLy9NLy8vL3pQTS8vOFJNLy8vLy84UmlQLy8vLzhSLy8vL0VVVE03di8vLy8rNy8vLy8vLy8vL3lMLy8vLy9SR2E3M2YvLy8vK3E3dTcvLy84aWQ1bXEvLy8vLy8rcTdrRkNOa3dBQUFBSmNFaFpjd0FBQ3hJQUFBc1NBZExkZnZ3QUFBQWNkRVZZZEZOdlpuUjNZWEpsQUVGa2IySmxJRVpwY21WM2IzSnJjeUJEVXpRR3N0T2dBQUFnQUVsRVFWUjRuTVZkaDBQVXlCbzMyVTJDN2dMQzB2dkNvemNCUVJFYkZsVFVzL2ZlRmZYT2UvcTg0b24vK3B2Mmxaa2ttNngzbkNOdVN6TDV6VGUvcjh6TWwyVFhyc1RTTnJueTIvejgrUEJnWlgveUR2OWU2VHA2clhLb25nTUdQVjBpK1RJK2VYV25nR1dVcnNtcEd4ckd0MnU1RHhyeGZJUGVsMysrZDJ5d2JRY3hKcGEyeW04REhpdDVoVjlCNkpHdlAvcStQMTQ1c2FOZ3JkSldtY0tlVi9MenZCczV4WGZkczR0b2dVRHZmUnY1bC9oZitjM1h2Yzc2My9OV2NoM2I1YkZqdE9oTkIzampSM2NZOTY1ZGh6VE43YUowTDVmbzU3Q3hyUEh3NFZoK3pma2U1SUxudm9OWi8rQkgzbVNlR3Fib0NIVjhSRTJSLzY5WGRnajU4b2lsb1Q3RExZWG9YODlUeVhYZWJNWjdVSjBka1g3WDhDakt5UGZRVGtBelZFdnk4R1lBbSt6cm82RVpSS0pqZFhtTmJPUnpvd3l0ejg3bWE4bHJFSGw0ZytxSkdndTFpQytSYWRlYmZ3eisxY0ZqRnNVUmJveTZ2MmRYMXVhenVwU1JqRWhod2ZDTGplUC9xMTFOMS81cmxjcmN5c3J3c1BpclhEdlVsZFRyUjFldUUrcUlSRVp2K3F6cSswQU84Tmhsa1cxcmZPZ0ZLQ054T0czN0QxVUdWNmJ1amxyNkFvd2J1RHMrUEN5YWRIVC8vN3IyTDFlR3gydHBsbmlOZkx1YTJ1SlM1NDk0eCtHSmdVTklJZkYvWU81YVY5ZitydjlWS3BYSmxlSDVlWTkzbXBhWWo4ZXlob0FzWEJFREp5UEVqaFVxOWN1MmN5ZTRjRDJmTk1DY3pvL1lSZ01qQWw3eVF5TW1SZFlraGc5Kzg0MVk5QWtpNHFrUG5OZTFER2Z6QmlwVFZVZStMU1BlRWo4bXVpU2MvQVBnc3drUitiVFZ3R2ZIUnNTdDhaemd0VHg1OGYwRWtGWUE0a01mZU1nQWppcExoZFJoWEdsanhNcWhzVlNsajVKeXordlp0YnFpZHJodkgrZmk5VzBoY1owQW1nS2tiRGQxdzFZb0ZoZERrMkk4OWxKdGN4SnVFS3Z2MFU1NENoOTBoZmFsbXJzeXdZUFBxRk1xaG1ldWdRTklZQWQ5MTlMRUZRZmE3aGdxTDQrNWVXUEFjVExiQ21UTzZydW5CcnZJZE15U09qZGMwbHNUSzJON00vbjVhQno4d1V6d3Z4am9sdEx3dnVVQThJdyttVURlSU9ncWlFODg2Z1ZxVEJTRHpGdkRPbW9rRS93VU94VDV3ZXFKdUEwbVlZR1p0KzJGaFlQMmp6eFh4M2xYeFE2RW83TnQ1VWltQUJ5end0VFNKY0kvN09QbU04R3Y2RFBxSVFCUjFSbFNnaEh5bmY5T2cwbXFyTGVpeU5wT1crTEthelhURzgwRVArZDlCeHYvcGM3SUJEOXA2NXJqQ0puVmlmY0kyODFxVklvQXFBTkFhMkpuVVI4cFVNdjBVcFAvZ0lUaWRBVkUzeGVTbWJjbzAwdFZvRVpYQms3MDdYUERZZ1RJeEJ3ZnhpbDRWRWVFUitCWGxFbGlIQ1ZLNXRSTFJWY1ZBUUlLOWhnelZBTXRFMmsxeStCS0hramJjckFveW5vc2NwcW1Ec2djZkZZU3RGM2h3TkExNWhrNUVOdi9wRWlROUNTdUVqeTJjV1B5elBpZ0F0WDczajhSeCtJM05pTGpmVmpYVURCekFxSHlmU01GUUtIdHZ3bGNDQVZZRm1wRkZBL2h1QXpzM2pFL1pnWTNrMTdteklFdG5pUnI2TE9UK2d3eXR6czhtc2lhT1REVlpZSWYvSHNHZ2NCMTlNN096dmJNenZiMkxuRlFmMGVqTWtleHc0WWhrVk9ISlpVNEdpWk5lV0QzYWxnc0Z1Vi9YY0xxNnV4c1Arc0p2VitkVVY1bVdEbHV3ZFhIbWJsT1YzSStCYmtlMEVTZXQzODFEQlZ5ODZZL3FQZlYyU1VHQ1d2a05kZVllL2t0Qy93M3U3VStWcFUzSE8rdm9yak5hMGcveU5hczl6bzlsanNBbXNyQWZwVVlFVmNmUDNXRWhudDByQlpENG91V1BtT1A3b0p3MXFuYU1nRHA5aUlyb0ovMFlxajUycFNYRVRyMGhpUnMwd2dqZjZZRFlyT0dYMi9va0RYWCt1WnZEZVdla0pCcmMwZkE3eUFCNU9YT0w3V3hML3VzTXMvdVNTOXordkVKeDZzbHIxK2dQN0FOZ2o5aGk2bFpLMlVFNHZiTmVRd0szcDZNMVpIcjN6T2ZZbmJyV05YY0NGa0RHTnZKOElTNkZGZnptQzdxZXkvRFZnN2Jwc21aRnZhc0xXNi9kQmhJdG4xbjFLY09nUzFWZ3UwbFRBc245RXVOdUJLWE1kVng5UVZjSFNIeUJHWE54QjlTTTRoSXhXcUhaOVdlR1l3UHBBK21qakZ2bVdOVVJ1QWpJWGN1YWk1aDNnS3VzK3BMVlZVVjJUT3pIdGdDNm1nUGJFV3F6c0k0Sk5tQzg0cE01WXp4VmNhWGtDTW5OVFdjS2xwN1BzRWVKSGJXbk1GS0M0dEhJMHZlcUp3V3Z5M3ppUnI4eEdKTEdCWkR1eE5DQ3pPM205MGNvRTlTdDZUR1lIMUxUb0tva0RsSGNXaUdaQTZ6ZTdqVVVjUUVXUGNBM3hpaVZpdzVYakdpWmtUMitmUSt5UmJuR0lQc2s4ZzU1MU9XamZxTGFHakl0SWVFRCtuRDJvWEtMYndWcUE2eGtweGZuQXRKY3dqWE9FbVlOREFlQU1KRWFrR1dheGlHWW9RcUpOYURGamdkZ3ZKZmhaUHlLWFVmeGM5N1dHRkowdGszY1U0WXM1TzFNclhPOFZoNmk4eXhnalh1ZCtYL1dhKys4V1o4VGJQTHBZZzFNY083MHQ3UGw2UXB1a1krM283NFJnclYrcGxjNHFiTytzMVBaUDJJNVVvVFVLYk9tSVkyR081VTR5eXhyQ1Z5QzJpQ2hMZDB6Z0NKVVBpdXAyb2JZTnBDcjM1MnJETnJDWkhMT013ZDY2em5INmJKTCs1WXRzTDRIUzgxUEZTSFk4UHI4VkRVakY2c1A4OGF5emNIL0c4MldES1l4aVJhTFdHS0ZEMEp3YnlFWU5LdElJenN1bXRzUW15aXNmYlk0eVNtbEdsQmU5S3lUZHZBaEJrTkhNWWtXN01Pem5XU2Q0enI5aGVyQTlTeFZaU0lFMVJ4Sm1PeFIrS1YrQTVjeHVtdWU5VUpIVUh3SVJOMnlCbFNMUExBbWY2djI1aDVTK0kyd2c0dXB4emtlWmRnT3dBY09TWXJLa2FWUmJOTys0UldpNHM5eGdQV0h1QWJLTmFVcTdQdW5SMFJlSHJFOElSQnlSOFJBR0xMcElaNHdoelJJWjhFNllwdnRzUWQxd1ZmZTllcVJYZkg4SENlQTZFc0RRbXRIYXJXckczdGRUMit0amFJcGk4aUk1VWo4V1BXUmt5eG8rTlJRNk1BamdyenFFRVRKL2Y0amFYWC9zSis5K3FZaGE4NjhpVk91eUZCbmtGaHNZNUJJU1A5RFdwaXFubWlMVGgzdVdReEpDU1ZaR3BxaFExeHZsaTdyRnZXM0ljR2VBbHpseU9jOGd4dS90WFZKNHp0Rm4ydG9BQ0J1d2FVTjBzZnUrVGxYVHM4WmxsNVpCTjJFeGxFczAxckEzTzM0R1hxTUlnTUxtK0NLVldyajNuWDI2R2wrSXpnVjNnREUybGo5NmY1MElPNlo0bWYyRzNQc1RMVjRPYUlZVmN4RGp0NXJSa01IRS9kTlh2V21iZXhhZ1BsY3JTTk8rZ0U5bysxaVRmOENXTXFuVHhwUVIwMWRvRGcxWkhEMHpHN3ZyNys1RWx2OXlweHgyNkFMVlpzQjlCc3ZidTNXNVRlSGhaeGRqakdNWFdLZXBEMDlYdFdGeDgzaWRMOEpRZ0toWUw4Zi9uVWw2YTFDYjkzTlRYRVhPK2RXRnhyZW5IcXNqaWdYTkJGSGxrb24ybytvMHhYT0p0MzVYblkxbGVHUFZkU3hQdm01cWJtNWxNSUlkQkFWRE9hUlRNV0p5WW11cnVYeE92RTR2dW1KZ2tad0Fid1Y5YmZ5bVZ4OEl2RjNxb1lqVFBSK2JGMVFvSUJBY0pnRFc3Z0lwbnBPdXJWcUZuSXZibjVjbEFBSVJJeThSSUU1VUFMMlB3WUJId1hMWEE0ckN4MkR5NkxqcHlZdGJoaHdiSFk0TjAxNENHNXlXZCtEQTJMYmJLWTVwd1J5QVg4c2pvNWh4WW9vQUhyQ2ZsZDdRZHRvUTFtTDdHaFhHNldQSXpRb0hsa3MrRUw4enNRM2N4bkNkbjhaRTlBTkVub1RWKytTOGp5Qi9rYVlCUGx0eStTaDQvalFtYlVJWVVZWU1ZbVRpcldYMnlLQ2VkMEl5bjNwdVpUZFBJQWNBY0diRUR0Z0VZRThLRWNBT3ZoaUVMaGhhenhNU3BjWkRzZTBtRDl5WUNIRGttWVdJcjVCaHdwckNuc3paZUo3VUVaVlJIQUJoWjFBdDRqdkZteXFlTHJLVW1iTlVPUXpOUUJqZjBxNElhSUlOY0NuVVF1L2l6cEVvWHhVNWtvWG1hUUEvTUYyeXJmTHdzdGFsN0xteHpEUmlJeGdERVBpL1dwMm9XdGtkaS9sSmtjT1pJQTJnVG9BN0pFbGw2dzk4dFNqUjV6dmhKTDRwT09Hdnl5aHpUelBCWjMxVFErYTVJMFRjYkthekRFZys4MFBoSzhVbGd1ODFUalk4ZVVhWXZtVUFkRU5ZcjV6ZHBRWHRZaUxKUEhJV3hhSzdVcEl0cG9zNGlrS2tPdktjbUx2bHkwdEszR1pEMzVLRTRuN2xiVDh2a25tamN1bkQ1OStzS0JNYkowWkdvTVNSUzhNdmRjQmJTUEpPK3haNGYzemV3N2ZNQklmaUp2cEtMQkQxdSt4L25DcTJBdTRsR2pLdWYzN0RtTXhDMERTNmhJeDE5R20xSkFFcUZxQnc4Tzd6Rmw1djVscVVXUjU4N1FlZWgwTlhadEdRZnNhRDZ4QVI3MG1sM2ZhUTErVTU3MFlBR1FNeU9KT2hwSVM0N093R0NXUHluemVHQm1ENVZOU1VTU0Y1b09VRWhyUm0rVW9nUEhyR2ZsU2l4cTdJMlg5bWowRWhHejhtUUhVZURnbnJTT0dwVW9IMmdGNFBMRDVtbWhTTlRWcUdaSm50TjdBK0R0K01VV3MyVTZZY010QTE2ZmUrWmdHUXdPTit2TTJhSWhSV0twYjIvM2NPeXRtNDJubTk4RGFKT0VRR2Qxa3RKTStzb1VwMG0rY1BnMFVsNlZmZHdPWWhjNFVRMXBMUVFHWXpNU2RXc3I0TjlzYkx5d1JoSk1ENGRsTWRNSFUzVmZyYUpaYyt2V2VlajF3NEdLdUl5UUEzSkk1UUxpUlp1UGpuZWZPWHptOEQzRnY0ZWkwalA2RE5tSllZTW8rWHc5aFJzRWEwNy90Mi92M3ZZamw2WHdCSVl4c05XZ2tHWEY3TUFRUEVEV1kwZ2dsRlZEdi9SdXR5aFgvdHl6NTd3QXYxakxRQ3VRNXFjSzBRYmhNUUduajkyRjFQdjY5dmIxeVpNZVZudzliQTFJSE90WXBrMzBVOWtJL3UyUjNlMjcyOFhmbFVzU3ZEWDhUOHcrTUIyeVRBcHI5UTk4QWVmbUt2dkZ4Z3Q5RXZ6UDRyUzdqNmdlMy9NQXVleEVPUmc1QkdBcVRXaWd0Zld0Rkh1NytuOUZjbEZKcmZZa3F3Wm1KaXRYb0RVKzV4VTM3ODVTMWExR1FSbFJmdDZ0T2x3SjhCazYxZ0FNZW9BQlFZRTFSemRBY0Y1NXAwdEgybmRqV1JOc3RFUllLNW5DTEM5TVFtUHlPdWJHL3dyS0NQRG12SDlxZ3dNYWlreUh1RXUvQlhZL0ZNWmFwYmE4MjgzSzNsdU50d3hiZkR5cFJRS0NCUU9waW1mRDlPdytpckhwekdrbCtMNmZ6VGsxY2Nhc3lGSkx2VXlpTjNTU2JTdXJqY28vTFpncWxCamErL29hajF1U0kybmpiK0F6SWQyc3kwR1o1V1p2L1hjdnNhWWRSSCtnVGplckZGMElYdXFxYWNIZXZsdG51SXJWY3JPUXBYakM3cGRhQ1JlcUVzUDR2Y2pXSzlyVUIrUTcwUnRwdTE3R3lKMmFzRSt3Wm9hVFJvRGZ1emJCQkFnc1RVeSt3U251VWM5aU9sOWNVUzlhYnlBbC92WnBqYjJQVkUzeVpsK2dHY0hzREhBR2dtWWFyWWdQcldCcWRwUGs5L1pSb0dMbU00Q3MzRWZLRjF3RS80MHppL1ZVY3BMUWhWc1NPZGdhZGVxM1VvcDFqVHZLWTVJMWYzTHc3VDhMNjZ0UG5wZ2tCTzhhelJ5QVgwbGU2VFBIYW91Sk9ac1QydGIwRWVVTjZhMlF2WXoySEExT3dkZ2kzYTZETXBxeGJNM3VuNFZNbUhUVHZJeGV5c05VczBIV291VENmTmh4QVg0dkdFclQ0WmUxdVVHaWF5TVBnSU1nWVpRdVk0UFdLMGgzQmo3MS9CNHovRFREUGVuRldvZUFZeEhTNmNZMXkxREs4azRpR2VPaEw0MEkyYnhJbVVYSHlyOWVvZllyOEgxOVhzTHlrMGJqczk0US94bDRKL2lrVnRqWGJJaS9pY2JHdFQ1UzEzWUVMeVZQWVFEWFZnako0TE5xd3dFWkExL1p6WXNDYjNtWEd1dVNGVWFieUVHZU9tby8zaWc1YjdORzBFYUU1UTkwT0NtUmxRTWlpWTdweXdGVENFdnlSQnlnallQZnBZNytHZk0rUnJ6OHlRYW5OZmcrcHE2Z3NKcnVBY0VHd2NOYm1mQUhVbUgzdkd0WGRiUWo1eDBNMUFEZitzbkhvRkxsSkhLbU9NZFlsNjlPeUVHSWxEeUxwNVNwM0ROREZwMEZZd1VkaENIdGNSaUlwcEp6WHByS3lMTForTW0xbUNENUV5NXl6Mk42bzE5Z2RIVmJnSmRPcXM5aTZ6N2xwR2oyQ2RsZVkzVEZuSlJsS25QYURsZ01QTW9DVHdQY2p1cFkxc0Z4R1hNLzNzdU5mTHNNRDFybGNJUmlBSEswTENBMkxUQTd5UWJQSElGWVhvSHYyL3ZZWXhFQU45QkFYdndkY2crR0xlU3M2UW5aS2hzUy9IOHBOR2czbEc5dFBWQW9HSU1lbEdIcUdDZHNpUHpvdzNSZzFzNnFrWUZaam13Vi9RSzVsYU5PLzdndFlOK2paZ24rZE4vUG5QSkg5a2tjWTl5a2E2N1huQ3c3SU1lKzkxai90UXZ3all0NTcvbGd4aUxMakNLOGo4REc4Tm42eGFZTFN2U1d1djRwc2U4TGtPaDhBTWhNUFU0YTZPMFAxQ2p3SFpQODdqNDlHTEZ3cDgzV3Q1R2haREdiK2NETWt4bjN5cldLaTAyS040MVhFSDI3SGdhMjNnZWdFQld6UGlEcmlmNjNFT2lBL3RJUmh2NjlHZ2JHNW11b05jeGxHdGJjUU01WTNJcHdmL2I3V3JQaXpmbExSMURSMURpcVZVYzJBYkMrQU85bFdqRXJ3ekRMYkhxclpwdmVIa0ZYZlVYTzIxeTBVNUlZMDYzNFlDQmhFSmk4ZGtibGZYUFRrSnFpdkFUTzhjb2xQZlhCK1pKajdVemFuSDFxeXVmdEVRMjkvZDNNVGVsRUxLTmlKUjN3MUlKUkNPWmpXc3A2QUdNaS9WVXVoNmdweXRiV1ArVkpqL3pacXFjWkh6Q241QXhXQTdRN2FDZTFJaC9VazN6NzNzbHVsSk5PbDBUVkZ6eHlrNVJkRTdzeTM5eDhBdkNDUCtXK09EYXNra3ZlRzQzbkJYYXBvM3FTVHBiN1phSzJrWE9PWWRWaG1LUzh0S0JtdWxzRmVMT3NRMXpSbjl4aDFSVGFtaG90ZENJMnRRSjRZVk5LVzRzY0psckxJTytDQ1J3MVEvNjRjdVZkT1VpTDJNWm1jSlpWdFVHQUg1TFR4Tmo1NmN2ditnNlFjMmxKWE1RWTFCSmZyM28zTDhDa3RDa3pZOFpyd3VvMnlQcy95ZzM4b1hrQ0l4TFVZQk9kVVYydGpSZEUvYnFYVTBkeVdzUjZJUFc3TFdqUEdsQ1JwelkxdmxlcmFBOW10T2lOM0dZT2toZFNiaFlib0MzcUZZZ05iRjhid0pRZlRuSHZtWmJWTC9yVytTMnpqWnQwT0Q5Z2R3eE5JWHZnMVNKV3lacGFPRmI5VFp4NXdKY1BBbVMwZURjZTJPUldJSEF6Y1N4M2VkdHE1S0FjM1F1NVBMcVd4M0R2Ti9wYXo4VkZheEw3QzNIU1p6TkdaRFBQSHFTdlYyb1BkTVdlTjZEUVUzNGZPd3pxTTNPZzhFWFNjczJ6QVpNTnBCa2xYMThzWlM1WW9Cc2lldlloVmozZW9oVE5LVGt5R2p1Z0Z5REhUSTVCT1dBZVZ2dWtRa0U3Ly8rd0Jkb3lDQjRHNXVYQzJMM0QrL2J0Ty94Vy9QUkZKaCs4Wis3ZXg3UTNicjU5NzRhMmxHODRVQ3MyYzM3V2NZYTE2cDJkUkNOTStKRjNWb2dBNDFpbUFEakEra1BsTTZ4aC82ZExkQndHMzdac1BXZ2NxUWxmRjMwdlJIT0tKaUN6NTRRaEtDZ1hhSkVoNEc4QnplZ3J5amROY0NGYWFXVUV5ZHdydDIwMHhoR0xMS3dQNVZlWkZIZktHdTRGeUhPVktHYVliYWR1NVZzcE9hVXpuUkxqRWpDRXBnMHc1VlRKRlpGQkRaR21UWUxOemgrUkJlVnlFQis1QkM5VXdvckxXVGNpMDJoeCtEMFNEMnJBTkxvOTRxdk1zaTlKazc0RjZuMG0xOFQxSE56SFRPS3JqMzk4a1p4WnpMR2VJMGVwZE5YRkwzeExRbWN4NytYTDJLeVp0Rk1CS2dlc0VSaExJcU1wbkFGVEJIb0xSY0MvTENqemZwSG82Y2pmZzFCRmF5Qy9rUDBYYUo1dnROT1N1T1hjZkcraXVla1BOSXJrbGdKUVQ2c2RScndCYWJLaFR4bTlydnpwanhkTk9rc29aMHF3ZFVIdk1QVkw5ZzBhSGplOXNNanlYVWtIcExSSzdNM05rT0NVblhRZ2dubjc4cm9LVC9CektFUzNUakU3bkduK0kxdXE1Zi9ZeFJqTG9JQ0hRT2NJc1RlZjRaQk5UT0xreWJCRVAvZXV6bTFUZGR3VDZQR0xyRWk5RUJ6WmJaY3JhUXViUXV4ckVkcEF5N3R5N0tDOWZ1SmRibzVldDlpQmVCT0k0eTJlc2dDWVRxRFdDT0xFd050TzJFeUxqRDA0dFhHYngxWnVQQk16SDJsMzZLbU1NdFRXTVc2cWtCZE5Iemg0Y0d3TXdjUlRoWUlZYlFwT3F0RFl3ZnZQSGw2NHpkSW4rUWxTVTRWU2IwbzFPY3BhR3lYVVNTSVlLcFVhU3MvdXl6YVFjV1EyVThjMmhhRGdhSzl4V0FjUFBHc29MVHkvSGRVUjBzb2RCbXJkeXV6UWVBYmgwQVpjZk5qUUlCb2d5clA3YjJVTFRGQ3YrVkJtZmNCVVFRZkVCKy9MdzBybkgvR0FDczdvMnovWUNwQndGMnFyZEExYU42T3VrWmc1ZEs5QmdSYzRSQ2NjT0RoR3VvdHFISkFGTlUxNWNPQ1pPdXJtRUUxazVMejcySHoySFdaMzdkcS9jZ3lPWm5Md3VTaVVPWnFZTG1ua3NvaDMxUUJ5cE5DTU11UE4ySDNkWDZYcFJXWmNjdDJCOTVmY0QwMW91ell5Q2p5c3NTcDY1cUZDWXBvZ1B5eThIVXRmMXptb29aY2FOcy9FUElrZENUQXg2WThqZWFUT0cxQVpHV1dWSmRQeDBhYkNyTml2Y0pWSzl3K094UlJVZm41d0g3VGt1ZVZIczI5b01ULzVYUTg2dVRvNU5aQ1JnWE44czRHS3dpYng0MGpKMkZEQmRkTTNEVGZQUU12Skd0WllxUit2OVlpV24xNXZGWXZGN1hPdmZrclpvVXMyZ0ovUDllQUF2MlJlNVB2RHhUQU1aK1dWUk4zcWNxckZCZWlnOHhNV1NmQlRVbDdoOVpYbEZGQ0dIRnY2TXFBNzFlSzVrNmw3N1I4Y1Q3UDZzZ0czendOb01FQU5EWnNYcTNoMTFPbzBkc29RNzBMTHlqc3oyNk1qbFV5eVBGWFhNWDN0N094OEdSYTMwdUh2MnJVOE9KK2VoSFJ4V2hIZTZvS2JpK1lTdTZWTitHbmhERStuNGROMFhEU2o0NE9IOGowT1owdGVpdlZSZ085Y0Y2M1lmbHByM3hQTDh2a083aVNnRnRiaTgzdEdIMEg0cFlacGRSdVEyL2RLMkJ6T1A1K1R4THhkbnhvOG1pYnd0bGVmWHpuU1BhbDY5dXZIVDFWOWZkN3JqTWFlV0I0K1p0a0M0STRYRGQxVU5wOHA3MEpVREMvb1BoRmZiMDZreitQZXVEc3lXS241V0lXVEgwUXZWcmZQV2orK3BxdEFxMTgvZlEyMzB6U1hOYUF5UE0vSVE3Sjc5TEFCN2I3VzBOdlRhSW9XRnAyOVZac0g1a2ZtS29rUHc3RExVNG53WmVkZld6YjZwOXR3QmVKTFJmM3R6SXBVMlYrWm00SWtLYnA1NDhWcFF4SGRBUXYzOE9POWkxeFgvQTZ2NDgxd0piL3ZPU2RCL3RYWitaY0w3N1c1a2xWczYveExFRDkzamJzcTNmMzk2a3BLV3VXL1NOSnYyRndBTTFScTJFQ3BkL1QzOXJSMHR4ekxycDZWRHhKZ1ZZajN6aXRueThsZnRmQ3JkNVI5TzVlL3ptR0JvcVZuaWU3RUoxNm1TeXJnRVRaOWdUVDRQQ0p2NmU1cGtVZlZCZjZzdnM2eit2R3Y2cGE3N2VrV3V3TkFtS20xVk5wYVJPa1IvM283MFA1Rnp6WG02UVVUTWNpbVhOVFkrOFh1M2QwdHZUMDl2YjMxZ0QrSjE4aUh4WmhGUEx0bGNOLzUrUExqblYvUEpsV1FXTHlPcGFYZWJ0bUVsbjY0RkhmaXViUTYwd3ZBSHZFM0xUZDE5TGIwdHZUMzYzNWlXVzY1d05PVndYSFJQdjJWbExhem1wdjJKNHk5NjFqcTcrbnBWdUlYanY3UmRNTzk2WnNsNW5UUGVGR0hFRGUyVCtyc3R6b2VqSGV5YUs3Zy8vZzFTU2VmZmxCM1QvdjZzdlBscDdEb2FrVmE2VUpQSXh2UUsrR0x4a3hzYkU0LzFMelhwbWJUOS9vbGNxTVdacDB4KzNiNFdGNlpVT09PME5nWTZlVjJmaCtPbnRGOEQzekRxNnlNUkVVRDVJM0pqZzlObDByTTJ3NTE5QnVkdHNaSDJZOVJzTUdIb1Foa1BoV1RkdmhNZHgrYkZkNGpWNmZlUmVRWTdTd0pDWjhaV21nb29laExEUk1kc04zMytNMHZjend3aDRNdkZvWGtQNFdKYm5RYmlGV1ZnaG5OTVFUb1NoNExkVXdNYlVLQUxCdHdrM2NPamlUbFgxNzA1OHdGL2VITHpqdkZSSE55Vm5tQ1l2V1R1ck9ZL3lZYi9RaERZd0VjT2cvalc5bUlhUjRXUUVDbTNxTjh6UGtKYjVwUXZSTVdrd01ZUmZ2aStsZHpwc3lIWTNTNTRrU1FHOU1zUGk1dE9Pa3kxRTQvR3M4enhqdEhOK0lRLzFKMjJsWWEyd1B4WHRZOW1NYzlZSytiQUhEOHVSbjJxYitMMUNueGxNM1I3QURuRmR4a1JybXBKR3NqeTFsRkxUcFY3VTZkOHdpMVQ4U1IrSTlmS0ZGWTB4QkJFSms4L1o1RmZCbTlHQ3Y0c2ZOT21CcTlmQlk3ckxMQnhuaU5JYzBobStZY2tIOTh5TXpRcUJrbWE3ZUUwZXBvelljUnZxSTdtaWhMbVRyZSswbHluc080bm1ydmx3ZHFYSXozYU9nZURrdFVVRlpqQ0N3M3phYytrNkR0ZFpIaXJyOVNmSlFwbi9GbWRFQ0dsQm5DeVJ0OCtzSitFYlFadW9kemdXQnNPTHZpQ1JxamMwbm42ZnA5bHQ5NjVpOFJzdGVJR24rQ2V5dVJiRzRNeHNabko0N2VUWkdoa2YxeDRhVndOdWU1TFEwRG1ld1BOT1ROb0RXbTZwTFRYaTE0S3huWmhqdWZ3bDlyV2FkelZhdENmYnBqZzhTZXRxTnpkelB2UzNCOENDZlNSSERBMm1nY0ZHdUpNVk4wMXJ0M2Y1bWZQMmJVdXNwdk95UGZhb2JyWjZzcCtVUHlxWVZUZCs4eUdSSUprQWpRNW8waGJXblVpUHc0cDd6UGVvR1R6alFmaDVYS21QbzlHTEdZTytoczFYWUwyNzVWcHg4L0s3RWs5ZFlRR3hmQXhvdHkyL0ZnZWJ0QTFMN09iZ3Yxc2ZOak1TdmNuUU4zQXhZOFY2b2o2YUFhVFEwOWh6a3lJZmt6S0dXZjE4S1F1N1pJWDlZaUtucENsQkdXNW1QbStQb2EwN3VFQXY0bUxrYjJQUnFhMWdOQVZTNnkvU3dyd3oyYkpSdWNlYTJHY0JNeEVVOTJaZy94S3JhRTY3anhQMnlKdkl0RDAraGVHeG9XYzJVcVc1VkJYOUJOLys1MHZyeVQ3cDlzOEo3RlBxczVJS2NheXpHUGhzN1RNS3BoSXNlVmI5QUZ6bnc2VEFub1diSHNpWUdLblN6MFhjcTJNYlRKUmxJVGVYS2I0WVRXdlE4OXhmYnFSekdzRG5OTnlWUjg1d3ptbERVeXd0MkdSVVBTUndIOGtxc2hiRS9BN2RRRlk2MStKWGs1S1ZBdGhwK3pzV3ZhL0IwejZma1hoNTRqYVVRVG9ycDdEbXhjdnhuNmllRlRtR3N5cVlMU2NLa040dmFkYzFnV1JKYmJROU13QXBURlVSd3pBblJhaE42Sjk4T3NZdnVucjJINElWTlhFYnpQcW9qWllIWW0wRGE3QWRIeG9ZY1V6cGNhdklTSFA4UU9ZbUUrMXVoM2YrejhxaDFyemhrcW5sS1BwK0Q4Wk9kbHZHRzRSR1N6VUNxUmwzTEFNazhWVzFsM2JxZjg5YS9PcjhMWWJQVjAxd1crRG5QbVdjdURzcWl3REdmTEZ1cHVQRHFwcng4Rlk3YTZXM3BhY2owL1h0K0puaEg3ZXg2UCtjZ2FCQzQ0MlQramxYRXIrNGNkeUd1Uzc5VndxNldscDZlbHBTWG5jK3NQZVNoUXJLck94MHMrZW00bVBoUnRGdmgyWDkzbTgrcktRSUxWeHgvd3Q5RVdPYU1zWjNGekxrTWM1VFhGSEQrZTBJaU10WU1jLyszbnVDQWlHbkRUcXN3MzJYbVYzM01rbFBXMlNPUnlRai9uSXZneUliY3BrU2dxNHIzaGtQeDI4VGtBTDhINDJ5Ty9EZmZkdXpvM3lxckJhdms5Y2Z1NzFUcEVkMjlMUHV6MmcxNWNvTGFtcFpnOWIrSzVnYTcrTnMyK0FQQUdvK2dVbW42M1BpTjV0WFFoL25LQ3Yyb2Ria2RudnZVci91UnFuWCtCcHZvYU5IaVBVWVNmclczUXBJZHBFam5YMS9XM2RIZjN5S1dMTnpuQjd3SWczRm5ENlhQNnJvMlNXWkZWaVFobWh3aHFjTTYzUEpYcXU1YUV2aXJPNTU0TUg3VVUzcEdINnRyUnFia1J6NFBvM3MyQkZhcXljWS9aK2ZNa1dvMHNwbnh0bUY4RjlSbFY2bWd4SmFlbGxMZnI4UUdaYlg4MUo4MEV5NHBYNDVLTlJ3dTRsRjhTNEowbDh5VExzVHdGRHN1YStWU2tGOFltTDNaNDJDYzM1dVFZeDBFR1hUVWNvM2Q3MHhCZXZrN2JQUE5USGtmZU5ubU05Z05oOUN0VFdjZXlaOXUzQkkrblFZM1E5Rk9iUjFFWmNnZStMV0pnSnBjRmJTUHIrNmxaTkYwajN6eG04Y1dIcFo1ZUdSelVzWEE0aDhuL1ZpNzd3TERWMzE0Tnp4dWRaNXgvcnBDd25Ja2FjY3FKeWV0V1N6dWtsK3Jwem85ZDNjK1BlUjlkZm5kMUJzUU5wTEJPT20xUy9tQzJ6OU9TMElGU2JUbTJUWTU3YVBtOS9sNWhMZk12dk1teWY0VGpqcno1dWZqeW1zVXI4Sjd3dzNPVXU1enRjNnhYSnBZVEZVZ05FMzZxdTdlK0xBVlp1aVpYeHVkRkdWbEp5ZDlCTWpCOVJQT3p3VkxPTm54MjJZRjh5MzZXdWp4L1pYQllBQmdmbnF3ekxURlhJVkVtV0tmYm1GWFdVRHJ1aHUzWmp5UGY4Vkx6cnVPTDkzQ0N1L1RJOHozN3BzYy9Hcm94bFdrWmV2N05CcHp0TzhOYXA2L1V6cmU2dnFQZ2FUQVVjL3UxSWY4QUFBTUpTVVJCVkF1ZTl4QUZiN0pWK0hSaGJtZS9VK1VxNXpnS0hIK0IzRExCK1FsdWFkUmU5U1NyN0VqWmIxd1hCbE1RVXVvZmhpaExkQUoraDltcU9oSW1kcWgwR1VoV0IrQXFrLzhJeDRFTmxPVU1DbDVIcnNyT2xLUGN2anZncExtaCtYa1BvbFFNdHdheXE5L1pjZzNEMXNSTXp3aW0rMHIzYUJ1YXBqcHluSGFrMEh3c3lOT2l0UWNSdlp6NThOd0xhR3BkdVBLdmdLKzFKQVcyc3FTbmJZQk42SUIvdExtWjlOeGlSemZuUVY5dkpoalV6RWQ2N3p6NCtGUUZLOU13ZmJDUXNIcndvNk1ibEx5NzdtR1dhbzZmbHdtdHBYc1BONUl1eC9tdXEwRCt1YUtuOFowbjlESnV5S1FCdWZCNEx1UzRvZnhnalYyMjBmaUkwT0JjRDBNTjNrbkUwUHo1d1JwN0ZHZTRtU0ZobVllellSSEFKOHhlWlR5UWZLZkxDaE96ajF5bkpzaXNBWm1HZHk3czl5Q21KUEhmeUt4L0o4dityR2ZScmhaRGxZWjNydGpMWUtQZDJZbXhYZTR5WGp1Y1Y0OWVWUWxWcjJXeW9CM095NitEV1NmWXdiSWNaYkRHRjZ4UktSb25aYzVhZk1Yejk2d3o3R0I1dytjN2pPS2lVa3FrL1pDVWRMYTR5anNFUzc0cm9YYWtEQkNEdVgwa2RQS2h0M3JkZHl0a3Y1T3ovWUZEUVRNbmxKNmNXQzBXZjlXN2ZpNTIyQ01XWGFacW4yRG55c210ZFVjOXpUc0dBaDJDTlNiUjRXbXh4OEp0RlAwSERVak95b3pqZmt1TUtGbFkwcGN1Q2k1TTJWNzEyTElJa0NkOXJuZ255OU10OHh4aks1eVBlRHM4UHl4U3l1L0pzTVBzWUYzVytDTWloTFl0OHdTOTlhWDByQzBSbFgyZ0xQZHpUNnplTVZyN0kwai9pajBIZnJWN3lTT2Z5bXg1YU9VUXRtMzFKeWoxandEL0ZCTjd3NjF6SjNlMUhWcTV6cW12c3NsNlVWdk5NV0VIN1FHTi9TR0I1ZFBQMjl2YjV6Ni9Qb204YURzME1zQWIwQkc2VjBlZUZOR1pNeGdjL1lGZXlpbXdHaVpMVHhoUFpUdjU2MncvYjU4MzlZUEhVblk1Rjg3Mjl2ZjNkOHZNcW9SMHNLZGJRa1ZhV3BiNis1ZjZ1MGQraUpsTUwwOHhZVG5sVXZLZnp0RXpRT3U0N1BOZkthL2h3YW9mVWpNSVQyN2g5ZmovSnJJYzViUE9idi8xZGEycnNFOXVtMVQrZncxV3Z2TFR0dUJMalZzbm1ITDIxZmFIOEVQZXl5WnJsZjhEYmdKNFN6dUp0TG9BQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSIxNTYiIGlkPSJwYXJhbGxheF9zcGVlZGVyIiB3aWR0aD0iNDQwIgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFiZ0FBQUNjQ0FNQUFBQTZYazRWQUFBQUEzTkNTVlFJQ0FqYjRVL2dBQUFEQUZCTVZFWC8vLzlObWNDVGZtdVVlMk9RZDJLTWRXR0djRnFFYlZxRWExSk5tY0NiaEd1Y2YyaWJoR3VjZjJpVWUyTkhoYWlRZDJLZmluRkptOGFqaFd1YmhHdWNmMmlEZVcyUWQyS0JkbXVNY2xxS2JsbHpZRXhKbThhamhXdWJoR3VjZjJpTWNscUtibGxKbmN0RW5NdWJoR3VjZjJpY2ZXS1FkMkpDaGF4Sm5jdEVuTXVqaFd1YmhHdWVnV1djZjJpUWQyS2poV3ViaEd1ZWdXV2NmMmlVZTJPTWNscUtibGxJb2RHamhXdWJoR3VlZ1dXVWUyT01jbHBFcE5kQm9OT25pbXVqaFd1ZWdXV1VlMk04aXJpTWNscHNXa2hEcDkybGpYT25pbXVqaFd1bGhHU2VnV1djZldLVWUyTTRpNzZWZUYyVWMxbU1jbHFPYjFOQ3ErRkRwOTJ0alhDbmltdWpoV3VsaEdReWk4V01jbHBQcmR4THJOMUNxK0ZBcXVNOXF1TS9xT092a0c4N3BlQ3RqWEN0akd1bmltdXFoMm8ybjl1amhXdXJoR1NsaEdRMmx0S2NmV0l2a3RBdmpzMHlpOFVxaThzdGljV1VjMW1UY1ZScFVrSmtVVUZhcmRWVHJkaFBxTlN2a0creWozQ3RqR3V0aVdlbmltdXFoMnFyaEdTZWdXV2NmV0l5aThVeGlMK1VjMW05cG9xOXBJYTFuWUpncmROaXJOQmFyZFZxcXNlem1uMndtWDVhcXRDVm5aV3RsWHEwazNOYXBNeFRwcytzazNhMGtXNnlqM0N2a0crempteW1rWFpUb3NpdGpHdWxqWE5TbmNPdGlXZFFtNytuaW11cWgycWZpbkZObWNDcmhHU2Nobk9qaFd0UWxyeDVqcEdsaEdTYmhHdVVoSFdlZ1dXbWZtR2NmMmlNZ25pVmdXMmlmRjJjZldLVGZtdElqclZDakxTY2VsdVVlMk9EZm5oQWlMZVZlRjJQZW1SNmVucVFkMkk3aDdxWmRGbENoYXlVYzFtTWRXRTZoYlowZVh3Nmc2K1RjVlNNY2xxT2IxTTZnS2FHY0ZwcWRYMktibG1NYTFPRWJWcGhjNEdFYTFKZWNYK0VhRTR5ZWFLRFprOThhRlNEWkV3eGRKNVJiWUY1WkZKN1lrc3djSloxWVU5RGFvTjVYa2x6WUV3dWJKTjBYRWtwYXBNNVpZRnpXVU5zV2toclYwTXpZWDh0WDM1cFVrSm9VajVrVVVFcFhIMWpUenhnVGo5aFREcGJTanBSUWpaU1FqTk1Qek5MUERGSE9TMUNPREJFTnl4QU5DczlOQzg2TUNvM0xTZ3dLU2t0Snljdkp5VXJKQ1IvN2k0d0FBQUJBSFJTVGxNQUVSRVJFUkVSRVJFaUlpSXpNek16TTBSRVJFUkVSRVJFUkVSRVZWVlZWVlZWWm1abVptWm1abmQzZDNkM2QzZUlpSWlJaUlpSW1abVptWm1acXFxcXFxcXFxcXFxdTd1N3U3dTd1N3U3dTd1N3U4ek16TXpNek16TTNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDd1N3U3dTd1N3U3dTd1N3U3dTd1Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9XQlZWbGdBQUFBbHdTRmx6QUFBTEVnQUFDeElCMHQxKy9BQUFBQngwUlZoMFUyOW1kSGRoY21VQVFXUnZZbVVnUm1seVpYZHZjbXR6SUVOVE5BYXkwNkFBQUNBQVNVUkJWSGljN1owTFlGdGwyY2U3RFM4TXhzZGdFMFZ3b094VFVXRnNNSENJQ0tLdVhKU2JPb0cweFNHS2pHME9BYm1vM053WUtEYlluS1drQmpzR210b09FeVhJR05SVXZyVk9Pa3RwQ3kyakk1aG1UYnV5cERsalkwM3A5N3ozOXozbkpNMmxKSVBtYVpxY2U4NTVmK2YvWE41emtwU1VIQkIyME96WmN4YWNzdUNVUmFXbHBZdGdZUGJzYVlYZXBhS2xzdW1mV0hCTzZROSs1TEt5SDVSK2ZrYWg5NjlvWnB0eDBqbmYvWVVsTWNsK2ZzSGNRdTluMGJoTm5iT2c5QWUxNHpFanRzRno1N2tmS1BRT0Z3MTB0bUI4bVFtcjlTQzc4OHdpdW9MYTFMbm5aQUFOREdQekJOcGZXSFY0b2ZkOTh0cU1MeTdKQ0JyajlrSTBGdFAxZ1lXRjN2OUphVlBubHY0OFUyclVUd1pqY1YyUDYvSG84WVUraU1sbnM4NjVQWE5xTHBjYmM5UDFXRHlPNEExL3ZOREhNY25zODlaRjJ2aUd1TFdEMlBTOSsvZnBNZEJjb1k5a1V0bWNMRnlrQU9jSFh2cklXQ0l4c2djR3ZsYm9nNWxFZGtyVzJMRGdRcm9PM01iR1JzY1NlOEJaRnZwb0pvL056WjRiaW5CK1NFdjJBYld4eE5qWTI4Q3dLTGs4MmZUTXFqYkZVRXJaQXdFT21DRkxqQUc0M1lVK29NbGlwZGx6UTU2eWZsaVB2NFg4SkxiOVFLNllXT2JGRHN1Qkd3TFhvc2VHRXdrYzRaQzdMUHJLZk5sWGN1Q0dRdHgyUGI0SGdDVkdzYnNjM2F2ck54WDZrQ2FIM1pFanVLR1l2bzg1U25qWkg0OFZTN2w4MkNkeTRJWnprMWg4K08zUlVVSU5uT1hJY0Z6L2NLRVBhakxZb2x6QWJZQmlJSzdIOWljZ24wd2tjSXdiZ1JxOG1KM2t3YzdQQlJ5Nm1oT1A2WWdicVFiQVl2RjRNVHZKZzJYYlI4bkF0VUg1alpKS3ltNXNiRTh4cmN5TFpkOUxTY0MxQXpod2thT2pPTVNOam8zdTBlTS9MZlJCVFFiTG9kc0VnK3ZTNDNHZVVpS0w2M29SWEI0c0YyNElYQWRVM0tTRVN5Undjcm0zQ0M0dmxrc1pSMXhsVEI5RDVGaUdzbmU0Q0M0ZmxxdXJiSVAwSDRVNDVpNkxNUzVQOW9NY3diWG8rdkE3Vkd5amtGNG05c1NLNVVBKzdMczVndHVFeWdHVW1JeWk3a29BRnl1V0EzbXhuSHBPMFBYdm1CNGZTWkRycU9nYXdUdmdPb3MzNmVYQmNyajhUZTd3aWc3cisra2xuVEhjNWFYSGkxMWVlYkNwYVg0NndNbzJJSEI5cUI3QTFIQUh5djZZSGl2ME1VME95L2pPWldINEh1WTJkT2ZDS0hhVHlHSHVMZDY3a0NlYmt5TTR2eDZMN1VkT2NoVGpBMDlaekUzeVkxa1hCQnZJcHowRzlmaGVFdDhnc3h5SngyUEZFSmNmbTVVbE56Zmg1dW1BQXVBZDdDZEg4YldCNGdYd2ZObm5zd05IdVhtOHd6SFVlWUp2R0JvcDNpdVVUNXVUVGI4WEU1ekgwd09KNUg3YzMvVU91cE81ZU9OQy91eVF6UHRQYWprM2oyOFlkTFlmRmQ5NzQ3RllVWEI1dFRuWFpxczNzRllBRjl1N2Z4OFVCdnFiaFQ2U1NXZHpNbEtkUjdGZVFCWkRINC9UbzhXVU12ODI0NHZweHJwYWo4R0N5RnZHOWZodzhST3BoYkZaWDBuajVpRVROckRtYUZ5UDZUODl1dEFITUlsdCtuaGZ1bUNCRFZtZzQ0cGM1WGJFRWNkODhwT2ZPdkhFWS81blFvNWtFdHFNazBwWnN1SjJqNnMyYkhlZGUxUU9iempsaU05KytYSmJ1UTJzdkx6TVp2dis1ZC84Nm1lSytMS3pHU2VkOGQxZnVPdkJFSmphMmcwR1ZBME45Y1E4bmp0em9YYndNYWQvM1ZaZVZsRnVRMzlsdHZJS2dHZXpWZnp3aHU5OTlUTVRkemlUekE2cFQ4dE96bkx6VXdCYVdYazUxaG9nS3dPMWxZUGtrT29xeXN0L3VITGxpbThXMldWbjZZRzdLSnROVC9uVWx5OUQya0xra01qSzhUOTZZSVl3OFAzbEs1ZXYvTWxYaXo0ekM3c3pMWEMrakwvRzYrRFBuZ1dneWl1UXZJakdzS3NrbytYRWIxYllnTnhLWUZlVVhlWjJWM3FTKzNSR0d6MzR4SzhqalZFK2pCaVdIRmFiamZoS0NIYVlIS0Q3WGhGZGhyWnN3bjNsbEUrZVZVWjRsU0UwRlFoaEJYREM0UTNUb3krWTdROVhJbmRaUkpleHBRbnVyblMzZDh6cGx3RXM3QnJMeWxoY294NFNNY1RScmdLbGwvaGhLNytCU0E3c204VllsNEZkbEI2NCt1UFMyZGpCbjcwY3lheU0wcXF3RVY2a0FFQVNoRUVtTjF6VUFkc2Zyc1MyWXZueUlycE03Tncwd1gxci9FMGRjMVlGSlNJbElyWUtDaEVxT1F5THVrcVV0WlJoak11cDRsWWdmbDk5OTQvNGZXSm5wZ2x1UEY4NTVjVEx5MW40UXVrSGZpWWUwa1lyT1JiZ3lzcUk2cERuQkExZXY1SW1LUGpsZTBYUnBXZW5wZ211UG1YZnlSRmZ2cXlzekNhbEhzUmI0amdHY01yS0tGUThCWGQ3b1FFY0EyM2ZCMmpMbDlNNFZ4UmR1blp5dXVET1RicUpLWkQ4WTF3b2FGV2dCQktSdys2eXJJSm5rallxUDZaTEV1R1EwMXhPOVVhRXQ3d291clRzdUhUQkpmT1ZSNXgrR2U3S3dqS2lBSm5Dc01PMHNYNHV0RVNGalVSQWxyNmdseHVvMUpqa1ZxNHNWZ2JqMitIcGdyUDJsY2VjSlVveUJLK3NERFJIMGVBWVYwYjdUaWdtaEJRWEF3d3R6TDJCUWFNVlhkRmRwbU1mU0J2Y21hWjFwM3pxNjFoVVJHaTQ0SzZ3VVhWVmtIU2tnbDRXb0I2eWpGSXVzNG1jeFhiOWNsbHY1TFhvTHNlMXRNRXRNNnc0NWNUTEtMUUtrb2lVRVFHVjJjcElueGF1cnl0UXRDdkRBaU9kelRhTVdzNWtybWZFaEsrRTRxQkliaHhMczdNU1RQblZnWU5Qdjd5aW9seEtPQ29xU0Q5eUdWVldXVVVaODZGb0hndHlWSS9rRWdIcHg3eCtwV3lNM2srSzVGTGJzclRCblNwV091SXMyZ1ZpWTMwZzViUjJveTgybEZyQ0U0dHZtRm9GelZmb2FyUmlLTCtlc2xwQmFuQWE3MWFzS0tZb0tTM2RQcS82K2p1L3NmanF4WXUvQVk4cnI3cktScHFmeUFrbEpUYkd5TVpreHk4SDJPakZieVk5UkJHVkRUU0p1VjZJalNDRWttQUZHaXlTUzJGSFhwZzJ1SHFId3c2UDN6NXczMzMzcmIwUDIvMFAzbnpMTGJkY2VTVnd2S3FDd1NLbEFldEhyaUJkSmxEUzJmQUY4REpTZnVNMGhYUm0za0QxUnZ1K2xtTnlhTGpvTFNXYmV1U1JKOHliZC9ZM0ZpKzkrdXBiSFdDdTlNRzVHRGJHRFFiSTBGcnlkUDk5OTk5eTh5MVhYWGtsOHBJNGtKSCtTaFlKY1RKakl4a2xtbDJCVTlBYmxxK2dsY0J5MG9leWtqT2M3T1NtSDNuc3ZIbUxGMTk5dGQxaHg2cEJUMWcvRHZ1NjlNRjVLRFpyVzRzZWE4a0wxZVA5OTkrQ0JJa2RLN3BxWU9QWHcySENWVDhqOXJ2bi92blBwLytKN0xsN25ydm5ucnZ2UmdHT09zMFZVd3JkZElXd21ad1dBc1NJMlNrd0IrRm5kNlFQN2s4UFNDcFRFS240MWlyall2VCsrNUZqdlFYQit0MUQrTzkzRHozMHU0Zi96MkQvQUlMM2dQWldyRmkrOG51RmJzUTgycUhIemp0ajhiZVhFbFlVbDRPK0NHeVlKbmxlNTNyY016NjF1ai85OGRHSERJZ1FsTFgzU1FUWHFrOEdwR3VWbGRlQ0lHKysrZWFmUFl6VmhvQXArUDU1ejkzSWQwNkNQcFRwcythZHZYanBiVVJWNU9GZ0drUEk3T1NaRGlpaWd5RU4zUXViR3Rzamp6eHNBbmVmdGU0azUybXBQUm51NzU5ODhtbGtUejczOUhQRUNFZFEzajNnTmQvSHFlWDBtVURzYWhHMnFER3g4UWVoU0wwbDA1NkQrbEV5NG5SWjh3TnNqejc2eUtPUENCSnJpZHBNek5aSzJoUC8wb0pyK1dRNitpaUNCZy9LNzJreSt2VFR6OEhqdVh2dXZ1ZVVZMmNlT2JYUWJUekJOdk56b0RFSHA4SndNQ3AyaWFQaU0rMks0dGdDd3FGcVRsZHRyU0NJc0QyQ0h3OGFTQmx3eUFxalUzNFA5dWpmL3Zia2svLzRGOWpMcjc3NitxdncvL3F1WGJ2NjBYLy9xNisrOGNhckw3Lzgwci8rQlo3eWFjazR4aitSbmJ4MTZkSnZMMTU4OXJ4NW56dnl5RU1MM2ZEWjI2RW5uRUZFWm1mZVQwUXdPL09RZHNGTWNZc083aTBaWDdHK1FZeWFjOTF2SDNnWURBRjQrT0VIZWZKb1lRL0JJbzhBb2ljUkl1RHpPbkRaUlFtUlZ6SU9MM1FTZm1XemliMyt4aHN2di93eWJBQjg1Wk5QSXhVK1dhMkVhWHBtYWt1WExsMjhlUEc4ZWZObUhqbnJ2U0hJWStjdFhxcGxyeVo4MkZ5T1FxdXl4NVJXZ2dMQVdrMFBBaVlDNmFYWFgzLzFEUzZoWFl4VnY0UmtKNW5XVDZmdEZLQVlXdkxZU2NaMjloUEkvZjJ2di9IeVMvOHdPblR4SWc3aFZzenhqSG56VHBnNTg4QVQ1UFRQbmIxVWFtYTczUzZVaFllWnBwVE0wVzZYRGxFa0sweGhLajA1ZDdFN2Z2c0F6ZjN4ODROSVVCalU2d1JMdndHQUVCWGoxcy9JOUROOTliT0Yrdmx5UW9Ga25aMFNVVFNyeHM0OWlKM3RvOTB1T3hoNlJNTFgzTVlkNjh4Wk13c0xiZFlaMzduVklVaklzbENIcFFNeHpaTlRTV1ZkMVNoSlVtNC85UHRIUVZndjBialVMMkJoRnFMTm1YSVVwTklJVnlERmh0ZnRaNjRURDRMU0VMVitCaDB2dXZQdjhvN1p4ZW1tK2hHTFF4QmgzcjUwNlRYRXNSNDdhK2IwUEZJNzRleGJ4YTZySHMzWS9sa2ZtK3dsMFdEbEEzLzgyNzllZWxWUUVHSVJVdXMzamxCZjJNOEljVHE3K3Z1NWgreG43SVJ6WlZ2WTJTLzVVWmp3eWhQS3ljWU9nejNieGY0cWgyYm5oKzR3SEI0KzRsdVhYdk1kSXNoWjcyS21jOEozYmpNaGtvNUJzSkdreE9jcGFZakttcnRNYVl4dXBHRkx4eXU3V0NPSzV0L0oxZE5QZlJwVHhpN2gzdEJpbkFpUlVqK2x2NU9LcVI4dkw5Rmx1UHZsYytTL3J6ei9aNFZGMHZNMTJXbk1ZcjdLVlRsdThuTE5OZC9HQWZMWUNjUjR3cTM0UFp6YU9nMVNQQ2ZZT3Z5SEh1cmVhckpEWkpPVVk1R3l5V1FIRFlzNHV3WUczdVIrRVRmeVR0elMvWFNjUWxCZElzMDRjRnJCVlNQQU14K2ExdG53MzlkZWZQNEppR3lhZVQvRmVTYWEzcTdSZzlQVWs1VEhmcWxWRFBRMTg5bWdYWE1OYVBGejJTTThhTmFjQmZOTHgvK0psWFhybk1vYmMzQ21STkh1a0p1Q0hhM2lXUENydStIdm0xOTg4YlhYZHJJRzMwWGhHWEozUHFGZlRrcjZXWDdaVDVVbGdweEVxSitubUV4bS9idGVlKzJWLy94Nzg1L1h5K2VabEN1UmZkYzBBMFhwU0JVSHc0U2xISnJaVXB6MDRFN25uWkFKdjBQbXppLzlVWVpmNCtUa1NHU0hyL0ZwbXZGSU5iSFBWdWNwMmN5Nnh4NzcrK1ovdi9qS2EvL2w2Y1JPcGlwR1pLZWd3dEpHbGorcXBDWFBTSlQxR3RoLy9nT3NOai94MkdNMWJFK1p1K1k3SXl2UExyR1JUa0kxZ3NrRE1tSk5MQ3U1VDZVL1YyNGtOdUhXNzV4eHdyZ0p6YlE1aTc2YjlUZk9POFdiU3lDTWc2bGR2MmF4UERtODlZODlzZmw1TEVTTENFYkpxSlUxTDgvNkVTS1EwNHZ3dDNuejVyOC9CcHpVZDlBTWI2Y0pvWEVCR1JLUmlUeEJaVjlrNTQxajUrMWhSL1Era2J6T24xWjZlN2JRR0x0eGt4Rk5ucWJ4cHFFdVUxcURQOFFXTkxhb0hhU0k3SW5OMlA3OUl0aC9udDhzMjUvSkV1dG9HMDlJK0xFWW5vQXowckFDTzExVTc0bUhyem5qV0V0dXMzTDZkUWVqN095RzNTdG91RkQySjcwY1NScGxPNjBSQWNublhoNU9Vc1VkM0hhMm1kMGhFOEhONWZHNHlmc3FJU0FYMDZ6R05IbFVTNzU0VWhQN1pMMkNsbVR1K0p1M214WXg3NlF5VDFPejEvSGU0Zll6Vko5NVVFNC85VWFOZkZsSjByZCs3N1pXTWt0OUhIenpGcGJ5YkRabTMyd0NYZW1jYVJLNEJibGpxL1Y0TmdWM3Z4bHBjNWwzeGRNV2pBU0RiVzJCVFI0UDNSVkZsZFFQcGRFTTVpTXpLazZUanBjcDFIeE9hSnJHNkpwbUd0NVNuYS9KMjArOXIxYmVRbU5IcWlVN1lEWkxTN1o1MTEzaUp0T3B0K2VLamZ6NDh6RDZtcnVoeDFuYjBMZHlkWVlqa2NnZ3N2QWd2RzRQdHIyd2FaT25WbXBYdHErYWVUK1ZjYW54akFldkpXdE9hV3VhdVRrMGVVOE5ydGc4UVRPK3AzbFhOWFZjMnJabVZydFlTdDE1dmhHTGhUMWU3N0pES0xoVGN0YWJ4MU0vcE1kajZHdnVZbEczY2hTMUlVU0wvaU9BRVVJd01oZ085bXhyM3VUenVPVEQxNVRETll2VHlEZEpITFFVaE9WcHJwbHd5VnN3bjByRzA4VklqNnVldjU5MUVMQU1DV3hOdW1NV083ekJDM2JYeHdpNFhDTWM2SzFoS0s3SDBkZUJna1hrMDhVVkhDUnFHeVRrQnRVUk10NFg3R3hyM2xUdmNScE9UK1dvTmU1bmt1aEtvczNlMy9JVTUrcE9HaHMxOGFKdVdqa3ROT05xeVp5bzdLS3RkdHpCZHNpd2t2d21aTGJiZzdoNWZYZGh6YzNJblpzbkNGNXllTy8rdC9mcUlMdUFkTHAxRXJWRkpHSlljYXFGdzFTVU95QVVnaC8xV0o5dXBwYVFYWXdtUFpTbVZaYXhFSmdzRzR0MXBWaHBjcUxLdUh5T0pUdTFsTVhWelJuMlFWa0Q3NFlMcVBud0E3emxSS1Fta0U2MklMR05KQkpqby90aXczcFV2R005OTVNVWtFQW1DekdzOGtTWWc3MFlZYTN4SUNRMXBtMUpwV1dZYXhrMURVc1k5aUZQSHNHSnRlWkQwQWc3OU4xMEYrUUlEaHhsRkFRM2duK2RiMnh2VEIvMjh4M1lnV0JRZGxSNEVZYUdxMDlhSkRMSWwyVm93OXQ3MmxvZ0ZMcU5CNWk1V1lVNGMxaTBqbmJHWlkyNlVNNEY2OEEyL3VsbXBWU25pemhJckRUMjZsdVdlNGp6NEYvczF2R1A0TURmTzVDZ0JCMU9oeE5kK3ZFUkJtRU9qS21LNUptUlNGaVNHUStDaW12RkkyRTBJOUxYMndFbEJRcUZFQXpoQ2Yyajk4SG1RUDAyZUk0R1l4cWVqbHNYejlYd1hDZHVHNmZHMWlEcjQxRUh6L1RKSnRFS2JDazh4b2Z4ZHVtR05iUWY4RS8zUkNOSHpkNExUM1RRdDNHUTllSE5ISnFUN2FlRDc0cURIb0htWkhzQTcrSnliL0RJdEJnN0dQV1g1UGdqdERqQ1JmWDRIdng3WWFPZ3VyM3g0U2c1R3MzWm8vakVTQVFESTdBaXhoU0ZUbGkvdXJLcTdxbm16dTE5SWd1bE5NTmNxMEVhQ3AyczJmRVR2S0dHR3dDL29vZkdrQkkyRHJLVVJocWRya2VhM2tIYmt6V3lnNTRKR21sYzBwNmFwdkUzYy9MVjZUSjhGbjNGQU9oMHlwVHRINTZKQnpVSG0rdWdlNDduSTJJTkFJcVQ4c3BEZVBpREpkTnpFeHhFdUVBOHB1OVBFR3lKTWZUalJSNXlXcm9pSEpoSUlTTmNjZUZCaVIrREcxNzlLMmEvcm55c3JtbnI5aUNUWTRSdFNRcVB3UjVhRlRvMVJsRnFmaWRtQ1ZQZGJ0S3hVMXVMdjFBWUVkQTByamlObmZnYVdZVzFONXFERnlWTGFGakRnZ1BYajFDbVJyWkgvekJxSFAzNE9hU3g5M0x5M1NVS1JqTmRlRGNiYUJqemNXSStpUjNSbnZkYk9TZVYwQm9oU0NYeGI3eVJYK21MeFdQTjVKaDlTaWFpSnBiZ1A4T0RFZVl6S1dDVXV6VDl5bVJyS212cW5tM3EzcTZBeCt1RnVWejdlbWtvRko1TmFoZlM0QzVYTFhJUStPQWJHaHBnY0lNYmd5UnVqdW1PdGpyRlorSFpOS296Nmxlb3BqUUhWNy9HM3RSQmg1bWJwTjZRc1VhRHlHdWhnc29qcUppY296UWRtLzlMSHl3cG1aMHp1T0c0L3ZZWStUMU1rRnhpVHp6ZVEwN1RabzZFaVN2Q0JRTTVpUVZOVlhJbVcxMVpUZDBvQzMvQ0NRK0c2WmFETzlwd0tGekhHNHNwVWFPTjZGd0hiWVcrdkZzNnB4V1FHaGVYeHM4REloWGlqa1dvcEdHTWgxbzBtM3BGVFV6aXorUUZvY0kvYU5JZ3dUQ1lUd2xxc3AvMDNmdTFENkZxSURkdzhQNEI5Q08wQkJ2NlJkUEVQbDBQa3Azc01URGg0U3lNSlNPcmpTWWhhS0F1T1RoaHY2bXNxMnZhaGdpbXlFcEpLSHpjNDJTdWprcEY0NjJwMGRNZG5jVmVuOThQRC9LRTI0eVN4SnJVbUhTRnB5U25BWTF2WEhsYzd3Nk52Uk1XRlJhN3g5dmdoYTJqOE9YemUvRjc0WGRGNFF4UFJxUGtCWFlBVDBaTElmUGlXWDUvSUJ5TlJtLzZXa25Kb1RtQmcvTzJKeDdYcWRydzcyTHVIOVozazBNSWNoOUl1aW1Gb3hzY3BNRXF6Q1FYNFpsa2R6cmdKRGU2dnE2cG1icFI2b1M1dnJuZ2Q2QlE2RWVoa0hvcExoSHVVZUZZYWlFbGFFRDgvRGpHK01rRHM0UVdxd2YvS2tSSmNpQ2FiUEM0NVNCbmN5MFJOSlkwT1EvODlJeEFvM0NPd0F2ZXNzL3I1M014Rmk5N04zSUtJWDQrcER5MElwN1hHaVgyOFpLcHVZSUx4WFFkYVcwTWdRUFZqY1QxS0RtTU1NdjZPWmNJQzBrUlhnZEVCREl5TWJ3bUkzS0tHMjNxN0E3ejgwTktlYmdNdzVETk5BZDhIcGRUVS9NRWpldUY1Z2dVbWRmSFd0elB6MzBpU1Qrb3grdWhoa0tVd0lObUMxNWVDWXlFaWVxYUFQSDVEQ3Q2cVJyUmFsNnlMaHFuM0c3NjBVZExTbks2aUFyZ2R1djZQbExEb1Y5V1RDUkdZbkVDempXK3VnWUZXTjRQSFU3TFY2YXdTdXhHdTRNc2FFcHhWUFROaEVOQlZCVTJlRmdTSWpKM3JrSk0wR3ZRZ1U4MHZnL0poZzF5S0lxNmlJL3pLdE1saU9vYVJGMkNxOStyTElIODVKc0lXKy9QcTZvK1VsS1MrUys4U2ZZSDlEdnJVQXlNa2JRU1FseGlSSThQWTlkZWk1dUtGRzVTZnduSlRTSmNacVppd1NLdnpNNllHeFZCa0o4NHNnc1hWU0VqcHdubmgveWhHNWRWdkFWOTdNWG44M25sZGxiYW15emtsU1p6TGZuOE5NREpNUXhzeTViV2pxNVFLTlM3UlZHbWRGSU1BTGJCK3FwcURHNVJMdUE4bm5vOXBvOGthRmFKZERlaXg0YnhJZGRLWjdrZ0kvVjI4VlJDMGwzR1FTNGRRMjcwbWFiTzdXRlpkUkpLMnNFekdFSTlwQUVFMGNVVEdtRnVpSUZlcVVVNUdDOXpwRjRmMXlTV0tJNVJmS1pmV285THFiR2xwYTJqTjlRM01CQ1ZySzlSQnVkbFRyWU5jZnRERmJLUDVGakllVHorT1BvRld2SWI2eWpHamUxbk1jNXRLdDlFeVIxSjBZUjlFdzVPR0xqUnZ6WnZ3OTB5VE8yRFFvOWg1dFlSeGlENDBoY0NVQnA2NUR3RzVPZHBJSkhJSjNQdythUWtVUUxEdkoxd2dUQVEyTkxhMWhNTVJSUllpdTBPc0szSjRYSUk1dFJWTVhEWi8rb3pCcmRKQjNDSUdqVndsUmdjSENUdnBzS3VFa3VLOVpod1RHRUZIQzRJQmxOVWNoTm12d1kzMnJ5MU81aG1QMm9RVllkRWpJK3Z3LzIrakFkcFZ0bmorYWxIVkVZRExWdmEyanQ2Z3dNRGcwbHB5VFlrVGdwYU8zaDlLRE5wUTlUQVZVSnlVakkzSjNBQlhZOFRZZ2tzdThTK21ENklQMSt3TGlnSEZCYmh3aUxTS1dtN3BMbnMwc29zYlhWbFRkMHp6WjNkOU00SzRTRlNYb01LN3RnUkRvV0NvWjZ1OXZhdXJxNzJMUzNZQWkwdGFLZ1ZUMjF2NzRBbEJzSURRMm1od2hZT2QzZnYySTJHZ2dwM1REQUVrMnVJNERDNGt0S3N1Ymt4T0ozK3lEcVIzRnU2SGlhZXBZMERrL3ExaE9ESXFSM21DM0hMS3poaEtCdEZDUHVVTWw2eGlESWpmUjdqcUN2YzE5bloxTFN4am9pcHFxWVBUUTM0alFaQWU2amdzS3NzbVpyMWxSMm9CdnpjVlNad25FdnMxZlVlQXE1WnVFQng3RGlmNUVrbVRUSERnOEtyRmd5Y3NOVzRva0Q1cUZvS3lyNEN4bmJuaEtzdjNObTl0Zm1wdWhwQ0FqOVZvMGQxVlUwa0trdU94cmd0TUxHK1NsWmN5VUhabGdSUWV2cjBlSHdFWlpPNGlJTW5HSDhCdTBxbmgzaEdjdkJoZXV6aE1PMGV4ZzNBVWdFbDJTdzRPTW5XUUVKYTE0eHJDdE5scGl6QURZV0QzWjFOejI2c1l3Q3FxcXVycXhnM3pxOE9MZHRvRUZ3N1RLdG1DMzJFM3VtVlpVMkFPZzJHNC9IOVk3aXpDenZNZDNROVZrK3pzSkFJWkpsSUx4L0pTUmIyYTRpR2YyMXU2dXp1RHBMZFRpOTJRYkFNZG5kdmEyNzZ5OGFhS2l1clZoUkhucnBoeFM0RHVKNW9OTVJYK2lpN3VYSk9OaDBvdUVNdUd0ZmZSbGQwVUl3RHliMGRpdzI3TUxaMXpnQmh4WHQ5RGZBaTVwTVlCLzVDRTByTGZsTlpXZDNjM0x3Vk9NS2pHeVFKMXRkSlJqcWJrZjIxRGxCVlc4SVNlcFA0U1NTUjVNSit0Ym9QMFp4U0JWZHkwS0xhVExtUjMxcVA2UEY5WXdsQ0xqR2EyS1BId3F6dWNmV1JleWpEQ2pSRHpJK1EyeXdIbWZZR093dk5KRzJyRkhxUkJTVEVROUZVcTU1UTRhWElycnFhRFVHVWUxTUpjbjUvT0JwOWxpOHV3SldVSEpKcGRrbjZWM3NnT3hrbFBTZWpvNG1SZUZ4djRSWHJKdDREcVdabXhreHRrTVZCTlBoc29YbWtiWlVLcW1TaU11akplcjVocExvdGFzb3JvVngvaWk4Z2d5c3BPYlEwRTlYUjN4SGVRbS9OR3h0RlllNnR1QjV6ZzZ0MDRUOW5qem1uNW4wV3ZIS1RYQ2x5bHpXRjVwRzIvVG9GQW10V3htbUtwMlNJMGVCR0FOZXVnb09RdXBFdi9wRVMxYVovTWUxWVJ4eWx4OU13SEl1L1JZcUIwYkVSUGE2SE1ESVU1MXhPZDFCS0dkWGJZdVhZaHk4ZTBKS3U3d0ROVFN4c2pXVmlVVzN3bjlWOGpxVlo2N1Vhd1BXWXdEM082WDYweEdRbnBkY0Z4cmg1UEdFZDkxYmlwSEtmUGh6M3cxd24wMXh0ajBnOXBLd2tIREZtS254a2E2RnhwRzlya29DUS9LT0liWUtuaFhPVVFpQmRCSUpjeUZSLzEvSGxqSXJETnZ1YzhXVW4vWFozUUkvcGUwbVFHOUZqY1o2YVVORUZRcGxWNGI4cE5JNzBiWTJrTExOcXBGa3A1SlpNc1VHVVZob1Z4K3Z2S2d2RlladGJtdnAyUzQ5c1EvSGgyRjdNRFgzU3lpdHp3NitlUUd0UFVIQktmVjExVzZGcFpHQ3JqZm95WkkxeWRpa0daWXJKWTE2bkNSd2tKejYreldUZ1NrcW16VjJTTkZPcFZiaDVBc1Bvc3dQNzk2RlB5T2tkTkw0eGJsaDI2TW5qYjI3ZndhK2Ewa3R3MGpWT0lyMitBNm5iWkR4YmJmUnpDaVZscHRFOVdrM21yTkc2VzlrVkFtNFJsRldPcHpoc1UrZGVZT1V6RGRnODZNTTZzUmhvRGYwUFhTdWs2dVJQMHNyZVFGdFBrTitqWi9yZ3puc25wVVJHMjluZ0w0MWNrdmpNcE02MUdxRnJpa1lqS2pnb3dMZnlwVktDUTNiWW9pVkt1NXVwZ2RWREVSNEhmeG1QNy80UWFIWDIvSytjZnkxbTVoVGtPRUE4VUwrcHBXUEh3Q0N2dlhHTmpvZjZ1cHZxYWlvTFRTUk5xMDRKd3BSWnNtbXFSSzNCUHh1TjdsYkI5VWFqdlh6SmNjRWh3MTlkVTJ2TmpKSUw2ZGhQM3ZSaHNkYU1PUXZPWDJJWktUbERqeS9RMXRzbmtrb3A3UVIrZjFsL3dQT1RrRlFyLzlWR21Wa2xNY1pDZ05VTmVQcFRKbGZaQlNqNXNtbUJRM2I0eWVjdXV6TTVPVThnK09iUVR6OXVzZUxza3hhZGYrM3RqSlpUNVlkSDNRMkIxbzRkMWxjdGQzUTNienlBK1pseG1BYXFpYUpTZFZrYWM5TWs0RnFndEh1Y0xaQTJPRUp2enFublhyaXMzZ3Jjc25NLy9ZRVVhMDZmdmVBclM2NU5sdXdRK1cxcWJ0dk9MenVIeFUyMFdIL05mMTFmZWVCVjVnWUptWUJZakZqWEQ5VkdLVlk5WThvcUc2T3N6eXRqY05TbUhuWHlxV2RlZE5GRlM1WXRXM2JoaFJlZWUrcW5qMG9GVGJKRDU4NC8vOXFVaFVadFBTUXZJVG55RGJJTUpuekE4VnVka3BHeC9EWkJOYVV1OGtBekpDZmtpbHdqR0g1Rk5UblRaRmJnY3JXRFpuOEIzS2NiMzVaUEh2aGpFQzc4NnNJVEdqYTF0QVVIa25TMUFMK25EZ2grcXcyZ1V2aERRMGxuNG16cWF0bUdlMDRhR1RZWVFCZmtvbitnQzFqMm5PVEpEcGt6L3h4d24yNlpvTnNsUnR3dWp6L1EzcU4rWkZXNnFTamMzVlJnZnF0RlA1YXNubXFKa2dyTFdJMVhzOFZGV3NMbWRrTU9TWkFoZVBnMUVCVlg1QXFpT05VT216dS85TG83WEl3VzBoOG5SMTdxSVhrSlJuamF5ZEJSUHdyNVo2SDg1eG9qR2N2eUxidTZIUHhpTytGRndEV1NTaTY2bml4MEFJQWpObTMyRjg0NS96b21OK0k3M1c1SmdLNEdYMHQ3TDc4TmsydVAzZjVYQ1AydGtSbytSVVdYYXRTNEFUWmVBNHhhbU9BSU5uOGp1bDFvQU4vL1VKMW1VcEUzZytMdmdpVy9JQUVQQnowS2tzblF0UUdTbDQ3Z29Dby82Wk1JZmR2enlNOXdQUzRKUG5OdkpSczBDRlFlaGFSeWQyTWpDWERrQlEzMUluTDFWVlhyVHk0MHFDUTJDNHEvNis1d3M2QW5RaDgxVnoxRVAvekJWSjZ5eU5WN2VEQzhQUi8rczlJb2x0eDd1dGpnZHBSVU1tcCtEakJFNzBDNnFkQ0VVdHIwV1NSN2NibGtaakpDMUhNV0ZCOEVaeGRzaFJSQmYzWHZIajg1d3pDd1M1N3NKNkduR3ZLVVBZMkNHbjlsNUQ0OGZ2TVYzR2I4Ny96emwvelNyWmdjQXQwYmNNYzE3MjhSdDByVEVCZ0piOS82ekx2QWI3V3hBa2lqSXlYTkhwV3R3R2FMWDBCakNQMk43ZWhtMmVqQWh3cE5KWDFEeGQ5MWJwNXVHczNsYnZBSE9ucjZlTjFBMDdvb0VRQUFBOFJKUkVGVW5TYnZCNFVSekcvaXJodXBGOENOOTJsWmljM1VVV2xaTklEZ2RxTitFOFpLR0VhNXBiV3I2OTVDMDhqWWNQRjNuU0k3ZzNrRFVMdXJuK0NTN3Y5RC85MWJuNTBRZnIreFZvdWdLS0JRVENaOVZWZkpycGJYQ3VqREEyMkNtOEJIS3ZIR3hvc0x6U0ZibXpGMy92ay8vcVdiZGJxWS9XZXREOXpuRHJWMnB4VThZN2c5UjM1cXYwbVZyQ0FMUEVtRVo2b1ZBRzROWkNib1loemxKRVU0THJ5UEZScEFiallOWFhyNHNkdGwxaDZiQU82enJUYzBHR0YzL3B1ejBPejVyVEUzZmVhWDNjeGc2N2JpS05ZcUtDbmtzUHErVk9pV254ZzdiTTU4VnZ3bE1lRFgyaUg4Sjc1cUcrR0ZJTHI3SmJ4OVcxTmRYV1VtZHlwVmpwTWJWbGNwTHROQ1h2SnlWWTl2Yk43V3pUOUlFbXhNWWU4VGJzeG16d1g1M1pHTUhmYWZLUDcxaXZLUGZBa1ZjNkcwZ3UvdWhCS2ladndjZEUxeUlBWnhXZmMrOHo2U2pVMWJ1NE9HRDl1Rmt6SGIxTmg0NzNHRmJ1bDN4YWJOUnNWZlV2bmhtdEM3Q2ZMUFlNUjQxVTg4WTE4YTdON2FuRUtFbFFZQVNkbndDOXRxcmxsVDkyeHo5NDZ3NVNkOGVwT3I3VjcwUFY3dlk1c3haMzZwc2Znem1SY2lJTXBBa3hZUXBDZ01iN2NRNFJvRElha0xLL1VIUGVxZWFtN3I3ck1HRm8zdUhncjF0Z2VTWXp2dC9ZMk5HMlF2cGRlTmc4L3Q5bmdEcmUyOXdRSDZOUXpTaDR2b3pXanNRMzVVaEtEQzFWWlNzK3E3SWhOcjZrQmZXN3UzSitNRkpYVW8yTlBla2lxeU5kNTczbkdGYnM4ODJ5RnpGdkRpTDdVRXZZRkFlMGVROUtKRkZPVXBWNVRRNTcvRFlRaUhuYzNOejJ6Y1dMZXhybTY5aks1bTQwWTA5ZG1tcG0wQXF5L1ZSMWNId3FHdTl0YVV3TEN0T3UvNFFqZGp3UXlLdnd0K1BKNzdGQWkzNEsrM0dHUTNVU2hmK0pmYng3OHBzSjZPMWkzakU4UFFQdjBlNnVKNnQyemE3QzhzdXVESDZlRkQ1c01xSkFnanBDRE01UXNYQmdkQ3ZWMnR5YU9Za2RuRnB4MDNTY0phbW9iN3p0S1VIMU9oTDRBdUJnYkRHWHh4Q2JYZGtZRlFxS2VuTlhVUVUrMWVZUFpldUFoUUdKdWRnZnRrdGdGMTlMYTJkM1gxaGtLaG9hSElrQm5rME1EQVVBVEQ2dXBxVFNPQ0dYVjJhWkZaV29hS3Y5SjAzV2REOGdadlNUTm9KYmQ3cnpqdjVQZDRSMlFCN0RCMDQ4UTQvRFo0YzBTVEZObXFTeFllWDVSWkxuWVl1TTlrNFMrRjNMSzJWVmVjdC9CanhiUnh3Z3lGdnlYWGJuZ1g1YmJxaWtzV0huZDRvWS96L1dvSHpaNUxIZWhFWVFzQXNOTk9QcnFvc2Z6WXRLT09YN2p3MGt1dnVIRlZWclJ1dlBHS1M4NWJlTnJ4UnhlcnNnTGE0VWNmdC9DMDh5NjU1TktMVjkxNDQ2cFZOOTVyb0lTbXd1UFNpeSsrK0x5RkM0LzdXTkVkSHRqMndUd204djhQa20rckZzS1NuQ1lBQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSI0OSIgaWQ9InBhcmFsbGF4X29jdG9jYXRzaGFkb3ciIHdpZHRoPSIxNjYiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUtZQUFBQXhDQVlBQUFCUTY5S01BQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBSFhSSlJFRlVlTnFFWFcvRWJsZDJYMnUvcnhCQ0NDRWs3a2pkdW5WSjNYSEhNQlZDS29SVXhqQzBPcWFVb2ZwaFZOTXZqYUUxTmJTRzlrdERDYUg2SVJLbFk5SVpNem9hdlZxOXhGeXVpVVl1SVNibWFvaUdFQzdoMmF2cm5MMzNXcisxOWo1dmJqeDV6L09jYy9iWlorKzExNS9mK3JQNWg2LzhLUlVTb3Yyai8yY21rVUlzUXN4VmYyWDl6OC9wLy9aanBxci9GZjF2dTZiWU5WczcyL2Z0NjNiOWRuNzhmdnhQcjRmMjJ0VU1iYlluQ3Y1Zis1SDdWN1hmaGF2ZHNiOEh6KzF0L2RQWGcyczU5RS83OGJqMjR5SG96d1A2dVdMdFRuMXJ6eHBOY1c4RjI5N0hwTjN6a2Q3N3dSalBiWnkxdlZ0OHdmajRlN1J4RW1KcnVaM244Sjc3SExIc2ZhejdQZHM4bkdqZC83TDNqdE1jNWZGcXYwai9mK2wzbnZiMjkrdTJCcXIzbzlKWmVDYis4M1BGeGluVDJUa1NwUTBDaVQwQUwyYkJBYWRPMFAxMkZuaEFoUW55aVdGY0FQdGdTeWZHVXlDcWNSd0hVR3dpOXVQK1BLU3BRSlRjKzBGMFRTKzZUOXU1MWs5ZDFkL3YxOU1QYXg4dTlRbDhSSzk1ZFBSenZGZUJkNlcwUkdMZllFSmdNZGpRd0tRakFXNUV1V2p2TTIzajdmNHU5N1NQNzJ4OTFIN2QwWFkrMWQvdTZuVWY2dC8zOWZQeGVQYTR2eEdKejBWZTZJUEkyM3pVTnA4N3c1SERkMnlMV1B5ZXJXOWp6TWNZZFJvWVJMZS9HOGNXZlF5cTB3bWN0Ym5YcytkRXJiSDJVclc5bUZCcWRMeHJlN0h4NHJTdjFOaUI4RUw3WCs3RFVvRzRxUk9XMktwcUU5R3VMWDNnQ05vYUszUGlvcFd2YWJ1WGRZQTJqblpKZjd1c253ZFo2bFg5Zm4vbUxzaWxrWUJzcExkK0NSS0tEdE5HdkFjVDE4YkE3eStoemNGZGF1ajNpcHZBK2Z1MGpldjJPOWNuVVJMeHhOSGtqcmIzcVI3ZjFxNThvdjI4b3ovZTFvLys1VTlvakoxMFJycU5iU2ZPSVJIYXU1WEFkSERoc2ZXeDJvSnEwck96Qys2MDBOc1M1aFhmUDNqZlFiQmovTnJ4K1dESkJBL2Z4Ym10S0dnV3VBRnlPT25rNTlkdTk1NXMrZ2EzYk53WVdYZ1RxVTRnUGtBTTUvWExBNTN3dGdtNzNNWHFaVDExZGJ4SUhBRHhRVGNGSUl2Zmcwa1FpU0t4Q1B4V1lMV0xjY3BHYUZuOGNUcy8xSXh0OFhkT2cyME1GU0F1RXBRMG9ENXhYUkh5bFQ1LzE4ZFAvdTcxbzQxQTlWaTVMcjNkaUpYZTArbDlmNGhqSnd6dlUxYUpkc25XSlp4SkNLazJya1ZBZlBNSk9SbjBCK2NKVlNkSmROTytuODlDYXJCWWdjRnRFeXpzZWhIRGd3ZGhqNGtiMzIyRjJjbzdXVmVOYTNBUTBQZnJQVi9leEswZVg5UGpLM3I2aWg0L3doUUhQYWdaL2JtMTY3WmIzMG9pZk83M2NoS3AyRjdrcDlYR2IzQUhUbUp4ZlBmM2RYSEhTVVhhM2wzcWdnakx6STJqeEdtaWVmU0JnbUtEMTFXekQ0RFJQTncvVDBaOVZUN1RlOTdXRnQ3Wk9PNm1KdWd6YnFxT2VIZHJ0cGcrSy9acERJQVRJVkd3SVV6bjdHTSsrbCtNNkpGSVY1elo3Wlh6cUdRM3BUbm9LNW45Q2lXaTRERFpxR3lqaWlCR05HRXlMK3NUdjZKL3Y2d0Q5cVErKzVxTHg1b20yWFVtVnhFcWlOOUJURGg0dGROOVZ4Rm9WaEdPREswcVRVUzVxR1BqNWlVWUlETHh1YVVCMDNWZTE1VFhLa0lrSU5CTlJTWVZZVEFRQnIzOXlPQUExYUNwQ3lUWHV3VHk5bG51YW1zMzliRnY2WHZlMVBsN1M5ditqS3lmTWkwY05MU2tjOXJLcFM4YmxJRElFR1F5VG9QT0tNQXhaWWlseE1aZG9RYzJUclhUOTFDdTJZd1lYQTF1dFpsQmRFa0g5Rms5ZmtaUFA5VldzeVJyMXBWM1JzNktrejRXa0pSbStVc1d5MlRpUEM0d0RoTTU4QURUczZWenArMWRWQ1M1dU91TGR1ZHVUV1NaQVNhekpqV3JOVFVZT24zSldMOTlvbDE5R2h5SGtvNHROczZuUk1BMUVPV1JKQWdMUlNaeCtxZys0K3Y2OSt2TzJlb04vZk9tMHNBTnBZc2JVUUx1bkFiRXY0dDg3M3ZpakRJbVdwYnF5K2pUZWVZWXd3Z3g4UUFLNlhpRlFid0ZwZ0dObTQzYjdGYWM4UDM2OUdmMWwyZTF2WTBZSDBjOXc1OVJUQk1Nbkt5LzdEVFFYYW8xRWMxR0RoVzR5TkNOQmlHMVNSTVlxQUVaRFU1OE1vcGlVRVZzZ0x2UlFHaXh5N3pxTXhkR0x1bXdpNHRBdkg4c2VKNHNlRFp1UHhsTlhDZWRsRzNSTkNob3lkbEZBcGQzaHNSSlJPOE01S21Pa214R2xoS24vRXgvKzRGTytBZlVSZnhZOGdXTUt6R3BCdStVRmh3bHpJWEhtUHpySzMreWQycUlMVnhKamxOeTRwVEZST1BpMzRQNlVXTGszOVZybm0xNjQ0RzRDdmpuNkJ4YS9BaHI5SUUzTEZXZ1Q3UTBIUEE1SkZHM0MvQVVjT1c5ZmNQanVDK3l1dEFCNHhKemlLdE1YSG1Gc1Y2TVY5TG5Zb0daSTA4R0UwZmkyL3UxVUIyaVlSTFJ6QmtXaTFxNHFpSzNsUG04b1hUd2VrY0JKZ09uMFpNYndmNCtiS3BqWGppTlVYUXVXUkFLb0dJY3gxNFNNU2V1SmxZNnBkK25MV3dpNEVmNitULzl2S2JOZjIyRGF6Z0pOd0h3WVhDM2FwTlpBeFkzcnEyN3lDWXdBQ1N0T0o2bXE0bGJKNklzTmh5ZWlxZ0VpUlBsZ0s0eWlENzBKRlFUU29kZlJodnRXaHVmZ05HS0xXNlhIRUlPNGZqa25NSzdiZThraTNmRk1SMVFEU0lKTnRZU05lSG1BS0VnRGJ1MUI2cUZKRWVJWXhyNmpPdEtOOS9WbzNmMXZkN1ZHLzlDZjM0a001RnFSdEFwTUxaQlI3ekEwY3Y4b2h3VUprNFF5c1pCZHF1OE5YaFZ6Lyt0SHYxS2lmaWY5Y3JudElObmJUVVVJQTZmUm9SdlVMeGxDTDBORG9EMUltQ0UwTVFwODZTeGlhV0l6NDFuN2xJQytrRUpxNlBrNVhEQ09adTlQZUJ3YVAwZCtwUHJrTnQ5dTZyQlpLSjhxQVp1NGZPRU9HQ2ZkK0I2WVpBeTl0aUE3UUlTS0hNbE5LaWtqNFZyNEZHMVFJWlNrNDNDNElYYklienY2anY5cjU3NWtmYjNlVzMvakFHcmRwWXlveEI1SGtybVprSUlpNVRKRXVzNm40cHEray85OVgvMDJ3dDZ4OFBqSlp1SG9CSEcxcUhva2NBbitjdjdaSkJOL0pqWWVkVktHT0JoaU93dkw1endYSm00cWtGYUUrR1VsWVVBZXB1akNTNVI2bVQ0QkJDY3grS1M3ZzBaK0o1TSttR0ZzVjRCMHlpdW14SjExdCtKRTljY0FMZ0VhQnk1Wi9LaGRjbFlnbXdiaXc3UmgvSGV0UzlTSmdGZHYwdVpzdi95bkg3L29SNzhTajkvM3RVN3dHUTVvUlZPZVVObkxkRXQ1UDVRRjNGdDBIcW52cWJIUDlmam4yellXTlBkc3A0bnk1Y2IvbmRKQk9DY2s0TlAxMFFTMWJDV01xRU5RaEZ5ZlFXSkRQdld4R2l5QWhQV2xya3VUKzREV0xqTWFmSTRFcDVJSVA3Mkd4OW9pcklVMWNpaEtTeWowOFFOd3dJV3dKK2gzd1BPaStPTGNCOVAzajBqUmx1Y0N3L1lXRVExNlBjcTF1V3Y5Vm0vMU9QdjZlZWhScmhBSDRLU1IweE5LcEpXVTJTaTNKd2ZWSi9TU2ZxRi92QXZPaURYMGRlWkRRb1RLdjNseG9BTktDcU1uUlRVanBLb2tBalZMQ1pURUJGQVg3RE00bUpYOHJrbUpadDJ6dEltaVEzdGRJSndXSC9sWmhzTHpSZmJ5aVhIMFgwTGhDb1RzSFFDN0ErZEZ5VXMzb3YvUmE5ZHZzZFVEVWxjRnFRV3d6ZzU3bHducjltOGFLTEh4eGVqUEtqSDM5RTJmNm5IMzlFcjdnc0wzNHpHamhKdmhxSUVuVTFzY0FmRjYvRS82ZC8vMEZOUDRFQXpHQmhvVU5pQWN5T28zUnZCYkNLREdOcVkzSWtVakJhaWk5eDFLU0FDM0dlVGlBWGdPZDdUSjBqNjhoRTJ2ekhDVG5zYmxaZEdDK0sxSmhvbENNWDJUb3QzalJZdUVtb0ZSa0VBK1pBYkZZaXhqak5TbGo1cHpvaUNTSUNKb2dSeGwzU2MzMW5kQ1I0dktSY3VscTYvUHFEdGZrOWIvb1VlUHkxSnZSb0xZRGZHU3dleGF4OGMrTGZCUGUvcVRkL00rRnp1R0JJVXVwZDRRQmFTRlcraGdZSm00bmJDaUJ3MERvcGNzRkpsTm1qTTJpMEw3aDZORnVwZ3RYUmRhRmpSUEhTZnJNUUxIUmd0RXRRTjdpTFM5Tk91YzV0eFZoUEt3QUpQS1JPVVJsVERtS0FxRXoxTVVSa3FhUTU1SVlWRU9BVFlCRGR0Sm5zSTk0dkJpVjJDMllJVHBLRXJldnp2K3RtWTN2MFVFSjd1VmgzY3hGMXZkS1l2dkZuYXIyMUtxK0RERjlZd0FzQlpEK1J1ZVhMUWc2SnhzZXVJM1lJWEMrSHFBOFJzdjgrRFV2cEU4MlFocjFad3NVQ0ZEcCt3VFA0YUJNUUhzRis0Z2daWnpjK1BRUnpSdU1DRktvRUxEaVBCaUZQRXhzaDFWdTZPTFFGLzlDa1lIMGdvd2JnVW4xZ0dDR2kyQVNDVWNBb1ZGQXQrR2YxcWM3QkdVZmY1WWo1OHh2Q21ZVWdrUUlqZjFOLytXNDhlUnpSa041eHhZQnYxMHI5cHgxN3dsVjJKK1poRkl4ZU1rek5IeEdUUGljRVNZTUVQZzJyWHlZU0RjaDV4UUEvT0NNSEM0L2tzVXg4SHNhVFZDOXdJcFlaQWdHL2tRdWExWVVyaFl0Rm5mWVFEY3VKMlBKQ01qbXk0M2RHNXRrbWpPb0V0UVRYaEdnS29hWEcxdjNPWmRWM2hwVmNwRVAwQ3ZXQ2hTWitQcWdNQkU0bVN1Y1hKOHM4M1l4cXg4UUlpWWxPRVh0dGsvK1FQaFZXK0RNdGFLTkZFQ3d1WjZ4enltemlkcldJR2tJb0JsQy9pTHJka3lTSFJzT0Z6RURDd0lQSUJKcmRyYURLY2dvdlRydVBKNmw2cERvTWIranZXSlpGNERPclF5WWZmMklGMk44YkVQSFJIdk1JNWVwYlhrb0p4T0NFeGNzaCsydHlKaFNOR3cwb09SVDVpbzQzREMzanUrdXl4UExRNVovVDRpVEZIWmF4SS9mSHY5YkxuK2NDcndsUVBRQnNCT0tsTUNySkhITkVVc0NDVFNCMUdVMG5HR0UycnVoa3RaY2s1M0pNaWh2VTFZRHQ2b1hZeHpUWEVSTmJnYVNtZ2owWVlTWUtUZ0JlK2JiZHFrWU9oZmo1RXAwTnFqUmdOK0o2OFArQmdFRm5BYlk0TEI4ZUF5SXlMZGtKRG8yc2dETFBUcFNZbTRvdGZtQTd1b2FCYkJqeFVWbEtYSDlSelAya1FFelVjVXovUDZSUCtlT1ZuSmdoMEZTcVREakh5ZW9iK1ZRaDBydUZlV29TSnhaVUt4Ris1cDF5Y0FWSDAvQldKb1dQTXg2a1BBNnB5TmFNdXBOWGN6dkRJQ0VST0ZRZzh5Smp2YWxGUThqMnZJSzloSGFOSHJIQkVBbnpjeE5KUFVBSjRueTUyUXF3SkJyMTdZdnAra0F5OEZ1M29LZzdwSVp4dzRKd0hab0U1ZFVKR3V2UjlWRC9mTjZWSFQzNS90bmpqaW13Nms0dGY0eklRcDRjdXlNQlpoaCtPVUdjU0VEbVFWOVFuQjFNdUJuUlJ1SVpCbU1RaWNEYWM5SFZVVFlaV1N2Q0VUTzY3QUI5RlhRdDFOZ2JERFkyZjRIT25NaTNRaTRJMENDSjNNRVNSODZJTDNKNFhpNmFBYTdtRTlCRktJTHhRREV5T1RvdVlSc0lINFhWMXdtT1J1TXUwY1BwWS9MN080MVhWMk1xVDJ3R0twekhCV2RRVWlCVWMxbGlNcHU2K1pDYWJuTEVpbklBbDVJNkVTYWdkR3NrcmRRRmRETmJuOEVaTUNFTzFvWUtvcVFDR1MxYzlnaCtZS1dXNmxCRDBJQkJ3RXFMSUplS3JBOHZNcVJZWEdaRVZVWWJSdG94WXpBT0RKeGhvaDdhenFVY3QyYXNhcG13NVNVQXdqa0pJUURXeUt4TTlWWU43ZW44YXZTeEJlSFRDVElBVm4rbDB2ckNKOHFkWFdYYVNwQUFucmpqRVUrQjZUSlloeHdzOUNPK3Zwb1ZoM2t0dlIyZ0t0MFZJQTFNSlBEeU9BbWZ4MUdHRzNKK3NtTmQrTG9iSG9ZK2Nla3pxeXYzYUhBZ1lyZVRJeEQ1cHdpWnlPYmdQSTllUXZwQ0hZV2NLVlJ0RWlqSDVDNnM0aEwzTlZvQjUzcExVQVJIcWdTMHNocUc2Sk9Dc0FCaXp3RWcwUkIzY0dEMGRMRWhlcW1LdFgvVFUxdEtqQ0l3TzYwK296UHBJV3BVbGVvbjY2ajREaHNZZ3Rrb1l4SUh3eDJpV05VQWRYWHVZb1RpLzg3REdNVHJibFhhMGtOMlRVMm4yRzgvSWhFd2lpMU44SThJNkl5OS93ejFrNGFVSnJ0UVJyWldNbFBZN1QvN3NISnpoekVJbVJ3Y3RKRjVXS1JBWlFJZUk0N3B1ZTdRRlZ3SU43TThVWGlJVVk0Rm1hSW9odW1weXNyQmMyczdjYzVZNi9MWFZRTjA1VnE1T0NyR3N1RnZ0VnFaZFh4ZURFWFV5ZzBrQW9FYVlKSHNZT0JDTDY2Nm1pekdIRUxoY2hJQlRUR1ZXOG1uU3EwcFNYV1Rwb25Oc3NpMFF4R2lERmM2Y2dpQm0zVEpQZGt4eW04UEhQREdRSnlTRUpuRU1EQ1lrOW9uNXJFT29Zc2RuQnh3bU5pcW5FRXVheHlUZ29VekJlSzIweWxPU2UxdExkN0lvREg1WUJFTlpEdnlnTWhGZDAwRnBBWlBVb0VzWnB6US90UVJ2aFVmUnRHK3I1SzNoZVhBaUxTbW5CYWFocFh3QUI1OXoxVjEzcW9rYjFnVnhISnN0d2N1VEMwdDAxUUQxK0dpZzBOS3pGU2UvVEFzaTYrRFp5a1pHZ0ZGZ3FJZWlSUE81bFJDbVZ6Q29PenNlRW9RMWhlUUZGMm1PK2R6UHZiMjVKTi9RenlrbXQ4TUUxNWtiMm91a1VQb1FnVDZ0Uk5Ea1dBNzBUZFRsWkdFZzFQQnNFeWtTTGRBUk1MdGFaRjVsUkE2TUVJKzBsamtNZDlidUpHTzNuQUxEWk9tRkdmNnJhYUZCcXNISWFYSzBJaytrV0tUOHlndEV5VUFKK2ZFaUlmR05sOGxodERTeThsZ01ITnRENldUMk5NRWlZNkhsSW9QRis0UE5KWGxYcjN6Vk5id09KWERQQWw2QXd6a2tYa0p1SkMvMURQZkVzTG5kREJMcWY5dDFFZlFPRTh3Y244MjBkdkVsSDNXZW1CeVVhOG8vV084ZWg4bG1xWEtvOHROVWxaR1VoekdGQWI3SmdiR21ja1J1dlBMNVoxR09vSGtzNVZPWDZrQU1wY3NxQjAvb2gwaVprWUs5cnlYRUlPUUkxYUgrRGFjSDZybGlLRUQxOGV0cE00VXFSRkNZZExtcm4zOG9IWXA0VWJ2MWlRV2hjZzBCbkVleEtBTjBqMGFEeHpmbWdTaGMzWjJYQ0I0ajJkMXJRd0dmTkhFbTRIT1dOVlN5QXNESFJFd0JJVXlnVjFNZ01GTVJoR0lGRHNJUVBqbTJNQk4zWmx5SVVtQml4WFRFSSt3MUJ6ckVzUkNRSmlWeDdiVWJOQ2FycGNKY1JsU25HTUZhWktuS1lGa3V0OWFsRzMrelk0SXhka0dDZC9FdjllaGVhWjRPM3FqMDk3U1ZVeURHWHZTcUJwZVlFK3hZS1NzOVloWjk0bVZTd0NzMElvaFFSQ0RjNEFPVzZ4d05tQ2JwVVFFdmpGWXJvZ1p6d08vczk4WGdWV0lKRVRzSWkrQXpzOVZxWVdzeUE4cWxRemg0UGNKMkdOMnpjdUxsc1hCcFVxa1oxOFVqMWkvd2hSOUJUZHlEcUJtOGVSVEU4TUU5NHBtdEF6cGNNYlFKZEdkK1hiKzkwaUxZTzNhbEYvOVViL2xXY1BqM3FPc2Nzem5udXBTbEFuK1JSd05EOXpPWHlHQjRuaGpVcTNMTTVzcHF4WFNObGRYcVB2Mmtrd3BhclpPQzdnbHQ0b0JTNDVJMGNhYTE0Wmlpckxyb3g1eWk0T1NRRkEzS3ZERFlvaFRJa05GY1gya1ZrRmlnN3pFcWpKZEZDMm5DVEVNL0pZWUZvb1FBeDhWUGRaeit3Q3J1alVpZVBtSC9xRTE5VmY5K0duT1RlZUhTdXdqZ1BacUVFNlNUWnRGQ0VFZklNRHdlZW85cHJyUUlXaTFKSDh2NkdocHlrb3lpb1F0aDFtQko1UVRYNytlRTZQQlZqVkZJaDhaVzlxSFBzWTNaU1BHK1k5YW9XRFpweEVoZEpZb2l0QUNhd2xOWW54ekdiSHFrZllseGxSTks0dVpkQ1hDUnF4dUVNWnN2NjExS2QrV3pZVVM3NjZGUHV0NzJobjc1b242NzR3K1dvQU11Z3dGQy9VT1ovS1VDbFRjcUZHd0s0REhYVUozRGM1TTc4VXNTSzZrM1BtbGQ3MDFjQ2d1MW9ndldqS0tlckZZV2FicXJYSEswSFpEQXhsVzVYdWRNbEY1T1JWS09lM1poVnN4UURNYU9lUDlxQXJMRjFaVG90NVlKYlZnRklzOVNxcHF3ODRVdlNWMGJlVjExR2RtVURPZU5FUDlvKyt3MWt0QmpOUFNCV0FTRzN0T0x2NlMzdjBUSjlJK0ZCR1RoKzNRT0pMM3kxNHdYUWpHRHJtTmxRd1g5NlR5NXNPVEFrdlQ0MFYzdEVPZkV3ZklGeDVLSDMwWGNycUFGeW5XcFRvUVVaSmJrYXo0T3B2V3lNMEpFY3dYUEtaNFNLamVYN001RXp4a3VQT1IwUFp3dVJNaUh5blYxQ2ZPRWNMcFIra1djSStmd1A1UnlHVnhmTE03YjJ0NXY2YTh2MTBYWVhNSHFiZ1VTa2JUcHJVN050emZ1cWQ5dm9kVVlTYTFNOVgxR09MMTNQb0xESlZRbFBwbVN2WFJCR3RqTWsvaEZ2QzRiTHpGQ2ZvWk5SckRzV3I5bElvUTR1blhxaXpKWHpTaEx3NjFDcUZlTWJjVndQQXJ1em1FVW9MSGkrZXErUUtaQ1kwdHhtcnhabFNGU1BwWmx6RlkvTFdKTVRTWHBYaTB2V3NZSGttc0Yrdk1uZWs3cGlyK283ZDFhNi9CbTFBS1lYRG5VQ3RLL3QvWDdsN1ROYitueCt3THBvYUVLY2NpQmNVQTJleE1RM2tCclBJckRYZ1p3Q2J0d0NNbnlHTVcxcVZVUE1nZkRYOGxHVUZtNktFc290bFdXVlRNUVpMYUEzWklKTVZ1MWZLSGxqRjZ0WWtoR09Zd3BDQjR3ekNFZnFTakIxWmc1ZVZtWU5yd0tUNE40MFFvdXpFSUhOYVh1NlQwcWdlazM5TnhMV1FVUWtCUzlkSTJBL2lhQUw2Ykt1S0ptUE11djZ6WGYwTS9iRnZMR3ZQUnlJTHV2SWRLY0puMXFQdytGNVVVOEdXemxKMFk0QldNQ1Y1bWNobkpJV2FhWURnaHJDcTVnQmk3TzRLVTZDd012SEhWcjlLNll3MERtd050UnlHcE85cWNMQzFtTjlPb1NVaHhtdzJ5a2ZYRHdaSlZrekNSSk1USkVWeUZxVkpZNlBYcjVTaysycXpFQWFLc2IvM2Q2L0FYYUpiQjh1RUpnUXZTVmlGYzN5QkFRQjkrcHBUaWNkTEJmMWNaK1U4OTlWZi8rZUg2TDJadFFGcGw0cHUrTVFnUUlzYkRRc3A1UlRpUGdkYUtWNzY0QVFzYnl6VG1sN3A1QXh3V1BTdTlDdFRxZ0o3aCtSaWxXTlpBeTF3aDRwY1hMeVRJZFpXMWcxb1ZYS0cyNmNJampTbEFGZUJVdE5SWGxMWWVlc3BuVCtyUDZtTHl2N2J5b3YzOUJmL3N6bmZDUDF1OVhRckV5WTFvclIvdDRaWGNOOGlyNjZBMXQ2SGYwODFoRDYrbXVUQllqUVRCcUxLczNlek1xQW5CelFEQ1VkMkdvRUxlSzJjUWtxMXh6VXJvMTdjU0FwZjlRSjBaSFpZVzZQMld4SU5aUlF2bTNraXJtb1RQaUtHNTFSYVN4ZWtxTktRMVFvakhqdUJHeU85SjdFUWlWQ2ZESFJSMWRqM3M3OTdUOVYvWGRmbHVQZjAwL2Y2TjNmanhxajFZcE0zS0JCaElqQjJaWnhBbENTV3ZHVW9GNXZacHY4NiswazQvcEdHdUgrS1crM1Vjb3BKcnh1YnFvOGxaVDlkMHdnVHlYdkE2UVRvcmlXYTlxMThIY3VsMkJ4UFVnKzFOUzZVU2FkTWZNSFpGN0UwUjNZeHByc2ZGeC8vL0tFVEJsYVk2WVJxRUF1ZTI2bnZEazBvM3Y4bmtJaDFpY2FKZ0xKaWpGTXlBZityR2UrMFA5KzVqT3lUZjA3NXU1Zk04dXNZcUFQbDNBem9CMG1ENG01NE1JUmhLV0tmcGNsM0YrVnN4MTFCM0NnV1I2VXgvMHBoNS9XKy81aWw3M1BPMFZQYlpLd2dSaDJWSE1GRENPNW5BMVlQbGpoV0dtWHhZL0hSdk0raVpQVmRPSWlNcjBuYUNRL1VVdXZKSktVMDh1emVIT2t6VU1odmdwNXBLdnRtMFprZ2FUMW9TeVRRQnpaUVZwUzBBbmlOWWJLZVM4bjJ5eEx6WlMrRlRiM0tvS3Y2cWY3ZThuSVQ1WGVMNUgxczZXcVVMeUtIV04rVHBXbzFjNDFWeDN3OFlKZU0wcHdGSzlxZDl1Nm5OZTFDK1BzK3gxMTUvUnlYcGFaK3lob2R2WjlodWhBb1dYcmVaRlRYZXpCbVVPZ3NWd0x5eFN0ZHBWTFJlNGN0QkpsdGFvOVZOaUJRNi9NdTRneDFJRHI1dHdYeWpZZ3J1Ym9hakVldXQ4WUNralYxNVZSSEVWQzdCWGNlNXF4YjRnaDZ1a0tubDY2b2IrZGtQbjdJYmU5K2FxMm5JTFdSUzNJV1JkMHR1M0E2RlVqdFVqdHM2RE5jUlE0OUlha25rc1dMb3E0MG45WTRlak9MaG0xR3d3MDh2NnJKZjdpdGgyUzNoR3I5MjJUdm1LM3Z4SXFFQkJFVitNOVNucjV4UytkMTA0aHJDaGpobExaNlBJQ3Z2dmJLS25GdkJJK1NQMnlTcXU4aVFYVzRKWFlwMTVTamxBalpnTDFFSVhkem55a2RTb3FYNjdFMFRjY1EyNU9oWWZxeUd2UCswKzhwbU84VnM2eHNwYzZMK1VVRGJSL0tuSFhBN083ZmhDMXFzdFM3WDNrUmMwWmR4ZXZHcjE4SVNkRDBnanVza3FiS3gwbXYza2tOOHRZRHhVaTRxR1BRL1ozV0xnK2JtbEUzRExWNXRjMG1lcDZEL3RoTXB0cTQvN1VQRnVlU1Z0MFJTS29zcDM1NklBYnNmdDZ2Sk9EbklvT24wSGo3UEEwVU1FZTFBNWVCS1YrZnVxVGpvdkFrMkNHSjVDNldUSmdZSzZJbGoyV255anFMMm1hbDBRN243OWUzcThnZDBiSWQ3VXVYbXJRQlFZNXVnekJLOFlrU1VKR25lMU9NcmhndkhtV1YwNFI5K3pWVHdiN0x2VXhYWWhmZFZJbVh4dEJTeHN0TkJ0WlVJTjhJM2JpQVhSeWdjNk1SOW9wMTRIVHJodE5EcDJRWHRDajYvcXM3YmpoOTFUQlFWSDVTeFpuNm5pbWZSbmhueHBEczRCT3RqaFlTN2RTb3N0V2xMd2hLRUJkUXJhaUhucnRORHQzQi9kSkdMMDBkZXdEMmVGRWdzbGJENUxNNngxU3dudGpyYXdFZUsyUzlxZGZhcy9hcXR2cUQxamJuTHRTbFBuc0pBWXh3VjJ2R2NsaFkxYWd3NDhrbWxBTlRoZjU2K3dCUXZQSzMrT1pGbHRKSVMrYnR2TDBLSnR5SFFST2hqczVtWGFOdkxrbjdYQjVoRjhzSlVTVVFMbGE3VC9wU3ZLVFM5ejI5THZBTGp0SlppRnB2eWt1QmxWM0draEt1WjFPZGk0elNEUnZMOU8zSzJDUFI5ZmVITHhWdFR0a284QXR5Z3B5NkJrR2p0RGZLeHR2S2ZYYmZ0SnZyTnhRejNlQ1BDOURCMEpHRUFDVy9leFpIZElYVWloYm4xVTNtTkhpbTJvUllFSWM5bDBOUDd5QnF3RjFJcnp3NENNdkx2c0FsNndqakp1UnJyZXdKTUJFckdrTllzY2t1Q1VtMk9pQ2JhZjNpeEFlWXYyM2JzbzQzVFh1OWk2b2hkdld6bGYyam1zMEVPNktCN1hDZGlxMlYwTjI2ZUVSU1VoY0pqSjl3TWFCV0ZYYmtPY2tDaHF4U1k5TUFDSkFEY3N4a25mZy81OTJLRzVMU1R4amo3MHBML2Y3cnowSGIzL0h2Y2RlU1VSQkc3a2xiZklzMXBSWThGVVY0dFdVZmtoRWtuRTNKelp0UnZGOXd6bTA3U1ZDaE51eUhxZU8zN0VBYWNCQTBLa3NCSGRhYkVwRXkwZ0U0YWE3TEtNSE1xYktnMEQ2M2hIWGJyVmphaGJCT2dDYzNhZjdlKzViUk45MXRVRElHTFRxUjdRNHl0amIwVi9KNzRlWXdsaTV0KzgwWkxoZmgvb2J4OVJUSWY5V0x2NFBxZ2tXOGR1OXpiZTBmUDM5SjZkMk9JMjNkeTJaazVxQzZjTTB6R2NkZXowMXQ4dDY4RWVoVVMydDZXNVpJVmdON1lLMFU0bnBlRXpZeWZIYUUxVWsyeUJqQmpZTk85akQ4Ly9GMkFBRHAvOS9rR0I4V01BQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSI3NSIgaWQ9InBhcmFsbGF4X3NwZWVkZXJzaGFkb3ciIHdpZHRoPSI0MzAiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWE0QUFBQkxDQU1BQUFBZjFaTXRBQUFBQTNOQ1NWUUlDQWpiNFUvZ0FBQUFYVkJNVkVYLy8vK3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3ZGMHF2QUFBQUgzUlNUbE1BRVJFaUlqTXpSRVJWVldabWQzZUlpSm1acXFxN3U4ek0zZDN1N3YvLzZxYXVOd0FBQUFsd1NGbHpBQUFMRWdBQUN4SUIwdDErL0FBQUFCeDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdSbWx5WlhkdmNtdHpJRU5UTkFheTA2QUFBQW5oU1VSQlZIaWM3VjJMbXFvNERGNk9nK2dnZzRoWWtXbmUvekdYVzlza2pkZFJBVFZuOXhzdWJVbi9QMG5URnZXLy84WW1RUmpPdzBabVEydnlFU3J6TUlyakpNdHlwZlpLS2QwSnRQKzFSNkNWMm03U1ZSZ01yZXA3U2hCR3F6ak5za0lwME9aZngxRlBVVTlZeXhXZ0MycWJycUtQd3oxRGFwSnFKOXFxQSthRXlkRTdZTmxycEN5eWVCa08zYUdYbEo2azBnS1B2YVVuZ1I5aW5tUUcyNnVseW42VzgwK0l2SWVFaTFXNlZiOE1ZaHo2dWxQQUJJQWR0RnlVaEo1TFJwdzdxMVNleHVIWDBCMmVwc3lpT04xMHpnUU9WdWhvY0R5QjQwWFRzb1FWZHhjMHZVbVpiVVR0c2pqNmhNZ0xaYlpNc24zcHNBVUxQcUN3Wm5JSFlMeHdocWdMTWtaZGV6eDA2blpnUzVhZkxQS29CR0c4M2lyTWhBaHZqN0JGR1RDTnpNZnVRSGUxeitvUStXRU5TUkRGV1ZFNm1HejJCZ3c4N1lZcGZJdTVDcTFBWXFWMExoODYwanZqVVBrNi91VCtZWnk1UEFJWWR2akVPWXI5dzExT0lOY2QyMVJFdUllemtqUFRnM0wzcnJsL3c1UmcweDVDSkNhU2dPYVZodjQvVXdFNFdaZ2MyNURna1p4Yy9ydzI5MytiRURsYnBzckhTSk5CeTJWOEdIU3dUUEdabE1VZmdKNWpkbmdOTy9naFduQkFGZjNZWGV0eS81Y09rVkZhVkFqaHYxazViY0FNTkF4L0MrL3BPSGZrQnZacXBwUWxmSjlucXhmTS9jT2ZBbzlCR0JCLzNRRUF4VHpBUmJrNzRJdm5TR0dqa3o5QUlzVklUVWRTejcwZkZzcGlrN3pNd0JhdVM5SmZCZ1YzSEo4Ym9JWEl1RWFKZXNUc21kd2t4ZEg2Y1d0aGxjclNWZmh2YUx6L0lrRlNlcEdOZ21DdDlrUm9rb0toVUJ4TVdPU1hKV3Z3SFJMY3JBekZQVHF4NEEvRi9tYUNndHFtOFdLU2kxcHhSYnZKd2REWWtydDRpWGwwdG81YXNLRk5ZQi9EVEk4QUdRVFJoWTl5SkVnZXArb1lnOUEvQ2lhNDdwOWFxM3ZXWW9Udk84d3hqNjA5b1VNNmthUGVUMHpORytza216eW9MSm5JdW45QklSZkJCczJqSlBBb3BVV0lIU3JtS1RSbFFIRDcxTkFabk9oRWFGeXkrYWQ3TUtuc25kZ0lZSlg3clhQLzFjaHoveUF0d1RBZ0dqYWNRTlJIa2NRcGkvbWdxeDNlYmE4NDROQ3N0Y3F6TVM5cXpkZkg0M3dQQ1RkNDdtOElRT3RVUW5oRGYxempBZ21lSmw1TW93OEFYSStWRXVic2lPa1RNNWR1M1g5b2Nud0pGRU4zdW83aExzcytmME9tV2FsTk1xWjEvK1doOXhVZklBcSt0RXRQTUFlVGNYa1dUc0gyREVCd3NiNGlNQ1dHRzJQMytWRHYvSVRMT0E1Yk53K2lCRzAzV3AxSHRhM2wrd2JUNTZtWnBLcHovKzluaFVpemV6VzFwSTBiQXE4SzNGWFJlclBVQVVsd2M2NlRSN1lZeXYwbStYNW83aDhzOCtyZEk5cTlEYkJxdGtibmp3aVJTZlh5SnQvdjBTQ1dIcmFyUmh1b0I3Yk5mUWUyaU1NQTRzbWpGdWs4cDdFVkhhaVRULzN2bWZ1dkt2Y1VvNEMxR1Jxa1NDRkJoRGlJSFFCMTNNT0NzM3pmMVNUVUgxTm5pQlhPU21WL3ovMW5XeEJVQWsydWd0LzNYcWxEc2NuVzhTcit5USttZjZkRG1wUTVZclBRdEFWM2pWS1BFZWE4R2Fma1BrakdYeERyT3ZDdEhsSUhIS1dtSld5TnVIZWtxKzE1MWF6N1I3ZXYrNGY1Q1RyQS9lTjBxSXphU3AzKzUrcERCM29tNlNlUSsvWEFWdHk2b2QwU2hycHhTUWlvVWprY2g2dE1XWFZ4eU9GcDVkODJPVFF2N2VkNzlqbENieTZPSGlmTVZYN2V0ZVphcWh0ZVp2MUtLOWN3Q0ozR3VybCtxbTJ5a0RLZmVjTVpTSFVkWUlKQlRuNTRjbld1dGMxbVEvdWE5LzJEMVVFTURqaGZRRWdpMWFwaXM1STRDK08wK05WY2VPN1Bua2x5TXdNT2lGemErd2dySVAvTFJvZXB0WWJqdVl4dnM0eDlxakhXaGt3cnVCcG5sbFgzbDYvN0wvSktFd0VTSm80bzJKMFVSeDR4KzI3ZW8vcWsrNllTZFVyQ0syN2xzRXVYNTBrTDRyMmtxR3ZUbVRwWHR6elI3R3laN3BnbGNCallrZ1c2WjNwNTFMaE5iZUR6YlRTTU9HMmw5UnZVaW4zMFVhTkNqZldxRVh2eEl4UUFVWVhwaHFvNFBydWJWWkZHNTk3M0NkY1ZnZS9pTk81Y2t0Tnc1dDdXMGROSzQ0Q3JwUEZ6aWVzQmFSV1hwU1Q2VHlCS0dWV0wrRndhOHMyREl2VW5pclNWaTNMU0p0ay9NSTIxZnVYMVEvZGdVdGs3UVZHQSsxOTJOaXhHR2ZFeHdiSUpyUFhmNGhLMkhHZWw5cHNrclR0b0dTYjZEVVBrOXZ3N2tPNmxVQU9ORDY5VGYzZnQ0a3J2WjJPUFJkNU5VaHg1TlhKVVFBSEFaWWtHUjc4eHFpZjJBMXVtV2w0QTZTeXhNMTdhUzYvMzZ4dVh3dnBKdFd0eFBQTlhlNDM2aDlPQW9JdkxQR1M1SmIwSXoxbFNzTTV6YTZ5bG1OOUdWaS96ZUtPY2x0aHRHSVFHUCtZeHZqY3k5NklPNkFsSFY3UGlkSUJqMW91dENjOUN1R0swcXFBTVVwbEVFL1BVNUVJMC95MjcxSU5Ram5EYTNtVnZZQjVuZTVMaEhJY1hhOElpamxTdm0yZ2p6SVVneDdEQjBBa2dYekdrdStCSXlwSVFJdmZQazh0aHJnZWE5a05EZnJBbzRudHV2OVdUNmwzMWlZV2kyY0h1T2l6REpLL0F0VjlQNC9MdlI3eVc4UFh0SnRVT1g2YTlTNzBRQTd5RHBOZnNqTlFBeWdLN2lRL1I4NnpoRUhkOTRNY1Byd2Q3RmlWWnNmOHRsY29lK3dtYmVsSk4vUGtOczNlOHdORWVMUjZJOXoza1h6OUJrK2Zsem41SndOUWttQkxFa0c4QlJXZ1M4L0xWMEh4Y0lzR2k0UXpiS3dpOWNYMTlrY1JDVTdvYnVXVHVOUTVwRjBJd0JSNnlPTTd6bTZUNDA2YTI5aG1TWFdHbFFIdHh3a1JEMTdGYUp2WkJ3U0JhZFJNMFJoTVBnc0J1WTVJYzlJSS80Vk1BQjVudnpqSURCR3RERmtKZUtBN0dMWDMxOFRPYVl2blErTjhrWWNQWmk0WTdvcFExeHU1dk5kNFBLNTJWOWh0WlNQTHg2dW5JYnpRMDVuOFZzK3RKaHlhTmd5QVpSRHpVZ0I5cXFiaUh1Q21QNHFRL29qR0QrT3Zrc1JyaFI4cHVrWTR6OEx1TUZ4ZUlQN0RVZ3hrOUQ1VThOZ0k5bE1Pd01FTTJuSm53aGg2QWZaZTJZc2tzSnBabW5KYXZmbEk5dGdnbU5PVlVFb3Z4ME4wMmZOSDJ5ZFRrYTVsc1M5NXZma3dBQkkwelAxTEVSOThDeUNvNHQ4R09SNFpLWVA1MTNWSm5tVXo2QzFwT1NyOVQ3VnhLc0hKNVZDTG9NdFlHbkpJWHIraFpWQUs3ZU9XeklTMFZza3dCeE9zYXgwcmtQWTk4RTArbEU4N2VyNU4vVWJMQlg3ODR0VUdzekpmaithVDZzOFIrWlNZSGE1UnI3a2F6UTM3WGJjU0pTYk1RNGd3Zk5FY1JrVEw0cmtxNVRhTDM4eXBmbWxmMjZmdVRCajl2ckdLUTB2eEE0Z2VUYkR4SHMvMWo0a2ErRXJYOFh2U205VHZKekU3UU9IQW5Vell2NDZDSDNtalZrZXd6akhoa2MyVzFlZWZ3ZDFLYU4wSituNXJoYVZRUFVJbFd5andaK3o3eDhESmJycmVsSld1Z2phK3FTQmVmZ2VwaXFTZG8yNUtuMEJ4bDdHeTBHTTdCaWZ1UlZyeFFDVDFUbjRIcUptbGVKU2EvWk1DSExreUEyNFp5V1I4amtLVXd3RzYzMGUrbGxtd0hrSy92TkM4NXVveUwzdHRzZm81RDM3RTBuYmhWVldTckY5a0pHWU1FaTUvTzBlU0UwQVk5N0RoNEg4MmJHcmpLOVh6cUUvd2VJdVlIZWY0Mk9GbXBtbSswZU4xRjliRkl1R3krSjRSNkY4dElUcThyZHIvZzhTSHFtVElMNDJSVDdCa3BKMWZtSzFWa1NUeU43OGgrVlFuQ01JN1Q1a2Vlelc4OEExNXAwa3J0c213ZHg0dFBLakZPbWZVL29QNDhML29mZUZpRjk2cEU1dVFBQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLWludmVydD0idHJ1ZSIgZGF0YS14cmFuZ2U9IjUwIiBkYXRhLXlyYW5nZT0iMjAiIGhlaWdodD0iMTIzIiBpZD0icGFyYWxsYXhfYnVpbGRpbmdfMSIgd2lkdGg9IjMwNCIKICAgICAgICBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBVEFBQUFCN0NBTUFBQURFelN6YUFBQUFBM05DU1ZRSUNBamI0VS9nQUFBQmdGQk1WRVgvLy8vanlaejAyS1cycEh2ZHhadTJwWUxueTVmdjFxV0ZlbDdWdTRPbG1uYXNuSHV5bjN1S2ZtTGV4WmJWdnBTRWUyTGt4NVRzMjdMU3VJWEdzNHZGc0lyWnhKYnMwYUxQdkpPNnA0UHAyckhselozV3ZZM1B1bzdkeTZEYXlhSE90b1Rkd1pKdWFGdkpzbjZsbFhQdzFLQzJvM2ZXeFozRXJZU29tbnVla20vSHNvU2VrbStBZG1Lb21udWNqbTNPdFl2bjE3R2Nqbk9sbFhPNnA0UEtzSWpTdUl0N2MyTzhySVdFZkdtU2gzT05nMlYxY0dHVWluVHQwSnlkazNGemJHSFB1bzdrejZHSmYydm4xcTNxMWFUZno2bWFqbm0ycEh1eW4zdTJwWUt5bjN2UHVvN3MwYUxPdFl2U3dKbThySVczbFhLbGxYcTlxNG5keFp2VnZwVGV4WmJQdW83U3VJWEVyWVI3YzJOMWNHR0VlMktvbW51MnBZTFB2SlBHczR2V3ZZM091SkY4ZFdtTmdteHliRnVPaEhHNnA0T3NuSHZPdUpHc25IdUVlMkxGcm4zR3M0dkhzb1RGc0lxNnA0TzJwWUxLc0lpMnBZTFp4SmEycFlMYXlhSFp4SmJHczR1c25IdmJ2NCt2bkhhbGtHNkpmMnQvZVd4OGRXbDBYcVJHQUFBQWdIUlNUbE1BLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9FYnYvLzNmLy8vLy8vMFFpZC8vLy95SkU3di8vSXU0aVJQOGlSUC8vRWN6L00vLy8veUozZDRpcXU4emQvLy8vZDRpcXUrN3U3dTRSRVNKRW1hck0zZjhpTXpORVZYZUltWm1xdTd1N3U3dk16TjNkN3U3dTd2Ly8veEVSRWRxVlVFWUFBQUFKY0VoWmN3QUFDeElBQUFzU0FkTGRmdndBQUFBY2RFVllkRk52Wm5SM1lYSmxBRUZrYjJKbElFWnBjbVYzYjNKcmN5QkRVelFHc3RPZ0FBQVVyVWxFUVZSNG5PMWRDME1UVnhiZU1ETk9yR1FtRVVnSUVDQ0tpb29GUWVVaEtqNjJpSSt1aW1odGk2OTJwYmkyZHEyUDJ0YjJyKzk5bmNlOU13TkpWSUpkRGlUenpHVHVOOS81em5mdmpQaVBmMno3K1BlK2RwL0JweFgvUHYyZmRwL0NweFU3Z0RVWk80QTFHVHVBTlJrN2dEVVpUMDcvY252bzljcjZhcnRQNUJPSnRkZVg5dlpkR2h3Nk5QaHlCN0xONDkzMXZYMTcrL29rWWtPRGh4N3NPTEpONGkrSmw0cExnNE5EZzBQbkY5cDlSdHM3Rmd5LytqUmlJaThmdFB1VXRuZXNIOStyRVpPVFFZblkwRnE3ejJrN3grTHh2WDBDc3IzSEpXcDdMdzBOSFJvYWZMMGpZOW14THNYcmVCKzhTWUlORHUyVXl1eDRMUlgvZU4veDR6b3Z2NUJKT2JpallwbXg4SVdLUXhEL1V2R20zYWUxYmVQaTA4ZVBlM3NmUHliQXVsWGNtbS8zbVczWFdKUnFMME9ML3Q0dmhOc1hzYVA2V2ZGT2FyNHFreXI2dmhoUzVyWGRwN1dOUXp2V1BxbjRFckVoSmZvcjdUNnJiUnkzZGJlb1Q3UHNrbUNYaU12dFBxdHRISXQzWjVUSDF6RXpNeWc1OWxlN3oybzd4eTl2dGR4TDFDNjllaVVCK3orMFlkUHozODNOM2JweTVjcjk4em9ldlhuMDhNV0xodzkvdWk5V1h2bGhibTU2M2xUQ3AyK1BIemQ0OVEyK2ZTVTAvL1dmN1QzNUxZejVpM08zN2orL0cwZCtmNlZEUnRqQjQ4RFpYUmhSVkIrNCsrTFpsYW4vdnRXZVFpQTJPSFJDTU96L29tTzA3K0t0cHovL0drY2NKd09XbklRSVhNaEJVM0cwODdVd1grVnlMTU9ySHZyYjR6VTlkK3ZxcjdGZlFSNkZPQTBKcnBCdHJSQm1KUWxZS2U3VkVmZDYxZDd6N1c3UXg0eUx0NjUyeDlFRkN3Nzg3V0FRaHJBTmFIZFdveVhpWk9ldU9GWm9pZmUvTTJBQ3JJbHlQNGZLMHF6UUFzekJUc1ZaU01sZEtodDdkVXIybGt1UGxpZmIzYmdQSGZ1ZVBQMDE3dWRjQ20zTlNnQVUycHd6ZXRhL3EzN3k5ejl1MW5vMVhESWw0N0pLMVVmTHMrMXU1QWVMZldldTFuSkpUaVVCeVFpMjQ4bWJOMi8rY1dTOHBzQ1NxSFVLaG1FZHZiYjJkK2lEUDdrYTUxSmFqeUpGVzBLaVY4ajNnZmV3NCtiTjA0WDhrWkZpcjRKTE1jeUxKNGFwZ3BZZUxYM2FtRTMvY0xjZldzdFN6eVdYcFY4bUt1S0g1dFRQcVQveStYeHhaQ1N2ODlHa3BHRGRLSE1kcGZPZmY3S1l6VDNNSVFxaXZUTDZSZVQ2YzM0dUoxOStWSTVVbENPL1hDN3J1YWhzVmtMb1JiRzJIQWpBOGdLd1dGVkltWkpDOUNmeXAvKzRlYW9rZ2pBYmEzZlRXNG1sTi8wQ0h3bU1iTEl2TVJMUnJ5R3JYS2lZQ0NtSVVxRjBhV3BacjlPN1ZUcUwrYUlDVE9kanI3SVZFOFY4L3ZUUlU4T25aQXlJK08yM2VuM2dwelB0Ym45ejhjMXlKTEM1WVBCSTJDcWVpRXpWY0UwWTBocW1ZcldpWWxqUjFFamx3K0p1U2J2Q3lNMEJ5YTFTVkJjeDhOdkF3S2xmcjN3NnFmbm5BeHVWa0wwNzFzc1cvelF6d1hlUEM1Q1N2ZHFJcVpRVXdpWWd1K2wwb1hhVjZqOTkzMjRrR29wM3QxTWtQY05OaElsZFdla01rK2oxL3k0QjAvb1Y2NjVSdDhJclh5d011NGdKek81T3RSdU5UV1B4dHAxMllYcmJRdzVrQXNUVWFxcHoydmVVaHZWcUoyWVlKcU00a0FSTXhOM3RYVFFuYjNkWXFtT2xtcHVTaEFxNWU3ZGJhZStoWnZxcld2QmxwYXdTWUwvYjNOcUZSWFBnaDRWMnc1SVZiaks2VFU3alhqcVYwdVlSTi9IUi9raHJXUFdHQVd3OEpTRXhUdDFxTnpLcDhmVTZCNEw3MURDUllra2k0YjU4eDFRZ1lYSkIrTG1lN25KdC9QZmZSK3RaV0JtZTNkMkdMbU10Z3oxcFRVL3RTYnBrU294a3NKVGxIKy9ueU5Cc3lWb2RmYm5OS3ViaTlmVFdaOWdFenNNVWtCdnBtQk51TG1DcEhDdkY5N2VSK3YrMW5pTHBZZUtkVlFJcUF3eXBrUDI2NEc3a2UyM0FTalF0V2V1M1QxNnVkVGpoakVNa1lIVFV5QUVvbVl3dVFubzMzSElneWE5U0d1ZEtQeSswR3lvWjM5ek9VcGN0STkxWk8vc2NxckUxMjRGa3F5NFRuSXFYWms1ZHNuUWt3bkprWVVlWTJtbWk3UzVDbVhKV3Y5SnV2TmFiWVVJbVhwU2NJYTFKOE5ISlZYYklzd1RKWnFDOWFLdjIvK2tVeDdUSXFuN3BwVEFNelM5aG1Wa3pRL2lFVUxIRzQ4M0Y5dUcxYUxFanpTV2tOM2R6MnhCYXRpdjFjeGJkZU42QjRDZTFUQzlHYlRQK2E4NTFwaHpNVXFXTkFOcHdVNWlHRzd2MWU1WmdLU1ZkckZVTkJLTDMyNE9YSzE4ZGlaYWxBb2F5bGxZTzRJQ3BSeUVTODR4VnJ3TU42RmVKb0h2ZURyeHV1MjFKWDNBMGpGZEdPNSt6SW5UZFJrakFJZVFWQ1lhVmlDbHdzVTF0a0g0dTk2SFRQSnNQRGQ4eFNsc2JncFl4eEJoVXVHb2pacVZoK09VV0k3Wnd2ZGxDMWtpa3BHaURDbG5aTUNQYmo5akM5UTVLbEE2U25TeXJHdHFrMlNCck0zSE0zazBpMkl5dkFNUzJFckRydkFFV1BEWldZV3FYS2RsNlc4U2RMWGlFUkZiVGx4NXdpRlJ5WjBySlFaOHRmTzVuSmRVMldMTU5EMmRaWmM5ZGtiZ01XUjNPL21UZWxaS29zWGs1ZWJaVmVEMUlSU2l4emlaRWtoZnBhTHQxMUQ1MGF1a0lTZk5UMUtyRS9ZUzlmV2xyOEZwSEliWXFZb2U3MkVBa2lMWGhBYks3VFdHR1RtM2l6VXBiTW5peHVrR3IycFdYWndHZUp2T3k5TTNIeCt2ckNseGVjRUo0dVpNNEpueFRZdE9HNHhqcGtUUXBZUlplbThhamp3L1lTNnQxV1VtWkRWdVdscjFQeWExWVFLWEtsYk1kTjM1bzRYODNPVG01cUYrTGs0dmk5NEZzYzBVenJGTHBxQnlvSEJDaEhzUlJzK3E5b2xhbzFXcnhRbjlGUHNxakhuY1NjenJVWEw5NkJrcjlWdnB6NnNrZTlTdGZ0ZEhSSHZFalE3NVAxQjdYTW1MaXBJanVreXBPMVFic2tNdTEyc0FwTlZlRGRYVVR2OTMvUEJIdm8yeDM5R05LZnM0M3ozVHBpSHhjOXRXUG52aStmdTdMTE90ZGM3NTUyTWxzTVFjMEc5VkNCQnZNanZvdzNZSG5lWUg2a1ZNdkNBSTl4UlZxUmk4RmFxdjVBRzQwbjhDOXZJQXRzYjBET0thYS92YzlDSWJ0ODFsakpUQnEyV2VJcVhiNmdLMEZwOCtPa3NzaG1yQS9BazFJcWpVOTBIWUxNWThCRWNEcWdCcXROdW9WZ0tqQnh1eWw4ZlZjbElNQVZnVFYxZ0ZiVlcyTFdFdW9QWnhqUkF6ZWJwK3Y4M01NS0FNWDRzZVppdEVUMkt6d0dJVVlnelJBUWNCSjR4QU9ZQ0pzR01TR3VNQTA4Vjc5cm1YQTFvRXUyQTVmRTB5dWlOZ200Z2pTaU5DVk9aY2pVdm8rN2FjVFVyT1c0YXBlUFl4YzFDVE9FVnhET3pFK0p2S1A3NUZJVklUZTg2cHpMUU8yQW5ReVZNRWtndVRFek5JVEJ5ZGI1d0JnSDVJUjNoRndIek1lR0JaUTR6QmxIQkNSVlFSTWdHQVJEQ2lHc0FyejBPUGZJSCtxclk5aDN3R1FHSGx5dk0wY0gyc2YxbllIU1ZVSFVPc2lKek1SVWw4Q1psT0JwVTFnc1Fiekx5RFpJOUFzaE5rbXlFcllrYVpYVzhYclhSSXF5QjRmMVJwMmlhalpGZ2NwQi9GZ3pnSmxOVjBMc1REcU1YVm5PSGdXbVl4aWVkMnhMTjM5Rnk1YytPYy9MM1EyRVB4SStpSWdBMSsxQ3RpYWFWd0U0c1BVektJVUppM0RnU2tWMEkzQTlzRlNSRmcrdUQ5UjRJOXlEbkdTRWFFZ3djVE1LTU0rK216ejZPVElzd29pWDlWV0J4ZlhjMWJ3a3NqNVpuUEZLWGRzUWRkYktyRGlveEVEaytpcmR4aEZxQ3pORGl6QXdFVUZWZlo5RFFFRy9vVGxJeXhVVy8ySFN5dGNXVnl3SW5qTGdmTmtkQUlVcktRakFHR0dYRVlTM053b1NoSkxRS3ZJc1RaNlhrUlhzVUdHc1hyQ0RpUlZ2MVd2ZjRkemh6a0kzNGZjaW9ocUpya2lxS2pRZnF5cm1JYyt3NVR2QXBscElCNWxaUTVkdU9YdTBWTElhVXgrc1p5RjBzakluczdPUFllQllXZ28wUFNhTC9tOE5id20yK2hhdGVnMzQxb25rS1crWmxnaEwzL3krVUtob0ovbGwyODlQZDNkQVdOWXdyV3FMMml4YzdSR09xUml3NTZmRFNxbEYyTEYwRFM5Uzh4aW00eXcxNDNHZW42bVB4TjBHNUgwZ1dFRkNWQ2hXRENQcGVjVmVnS3ZIZzJZWFgzUm0rbWNiQTJ3ZFpzd0taVWZDSmRqc3dsbHN2Wml0Y0JVWUYwSkNGM2dtMy9EOGhCTzVhZmVIeWoyRGZnR0h3RXI1UFZ2b2FpSUprRVRnSFV6d0FKK0JUeGpPUGJzQ1JaYUFtd2x1OXVTVWdrQkYySVZkS05BNmVqanZzTkxOayt3M2ZCWW9qQVB3UzBGY0VLK1JYaGRrR0g1b2tSSlo2YUNySUNBZmJZbk5ZeEhhKzBSNHNoUXdFMHFuNnNWNVJWQVFJempDUEhFWTNYUlpoNGIySkNBVVEvYVVJcjhHSXhSR05tUnJhemplVENHNlhUVVVpYkoxdFBkMCsyZE96SSt2b2Y2U3VqLzFjRVVZQzExamladDdteEZid2c3OWpLcUhyVkFad3FQdzJaeUdLa3hFWmZyY1ZtODFlUHg4WE5IamlpdDE2QVZKYmtBTUsxaGFmVENZM2xQV3dGc1RaLzd4eDZVeU16dXdFMlVUbWIzU2F1eE5IVERJYUpZTTZ4ZzRNb1gxVC9mVXBCSmhnVWpSODZkMjdOQmRudmVMNjBBdHU1elZDUjBBSjdWWk00bEg2eUVSYStjYjYxaXhaRjlYbS9qVjZjS0hXMkxhQzdEYUZLTjYzRWMxK1UvNmowaUNBWU0wMEFCY0VyRFJrUjBCakF5Wm5jYzNxTno5REtqSVZUaElOOCt6b0IxcDQwSjhndzZOYXhmcm1aMDUwaitjK2Q0UkRGTU9RbXNsSG5ETUZZbHMyMUw5VmdMZ1BuQXE1eWw1QnVaYytJZVM5eUlPR1hMSUI0Y1A4QTFYMmdZWG4zbzcyV2JjN2tpZ290bFJMOEExbFZxbUhZVk9pV2g4dzE5THh5OHhpOXNwWE8wU1BiYm1IczBBMXh6eUkrQjRyTUVCY09tSWZGcE4vc29ORnlCbjVBcHllMUVBQllWUnZCeFhOQkRBR080a0FZd0pWMG1LdzNUR0dBZWFWWnlJTEtWTXJtMk5lYUJWMXVkN1VDMnFtc2VyQnprSzB4ckorQ0NRTmNvVHk2c3FCMS9nYnBHSGg2YWtSZ2RTd3RqaUE5UXB5SnFsYVZkRENsWDVwM3NvcExnSThjNG9GWTZBNlJPUWJUSFVDR0IwS1NKbjI0NEVUS3UrbFVnM1djTXM4QnlSM2RQTkEvWVN3V1VzZ05SQW9hY0dlV3plRWRvK2g4Q2JEaDV5QnAzOUJWS0c3WnpGTDQ3QWx0aE9wQUYyYVBVbUZGZjBnWWJxNlJSZ09iTDVEZlVDamFxaDB5aGhqbnRsYU9DUG1xV2JSckFuMXJKcllzQ0x3WjZuNGhyZW9BTVl6N2ZJMExvalhBQjJHZ0YybjJkblhrckpiRkE4dEVLdmFyYTlEOS9XSDJmbTlZNUJpaXlEemZaR1pneGRCSEZWb3BzNUFHUUoyVlRUNEJoRXFJaTJWYzVkTUZzQlJOQUdtcER2V3o2cjZ0Y2RyT3dkVEZLSElnTjNXYmZSbzhTbDUyUHIzbzRKTWFVZThDY0VURk1ld28xV0ZIRXZpU2xwQWJIdHNTNnM5WFpkT2Zvd1pia0hmSFY1MGpLdHlnajd4anBpSHQ2N1lUQkd6Vk1tMVVZckZDQVFVcGFsaGo3WHVCV1d1Z2MzU0U4R0ZKSWdjaEhzNEQreW14a3lZdU9BY29IcGFYUGR1WVpEeCtOWXA2Q09ETEtSdzBEdDdzVTFPWGZOZUlEaUlVQzJIeGpYaFZnUjhibGFBVkxTTkl4R0diem1oMUQvSG9yeVpSamx0ZkFGL25SUm9NVUxqV1VJZ1ZWK1ZlZzZxSkhLYnVTNHdVMTVKbzNCc3gweFVuRGlFeFlVdmczQnRQTkFiWktOc0hwMVdROGEyT3prVGpqcy9KcVB1NHIwSWg4Wk80Wnhjb3hvUUVrby9zNmFQeFpZUWprblNOMUdIRDZoYUlleWpkanJtcE1IMnpGWnk3MDFnVUltdTRjWFVZZ0dDNk1BclNJS1dZVHhnS09TcUNWM3l4ZDJmNkdmeEhJRms3UVVTUU51bWxuTFZMZXNZd2FWdEFXalByZmFqeE04bStQM1h0WHM1eGhuVTEyamxZd25TS0dGcnVGaEd6enVWVFpYVXVyU2pEalFYaG55SjJjbEFFaVp3RHhzRFdJWVE5bFRKVHI1VGl1MThiSDVmQU9xTDJpbWV2RFByTlQvREEvak1yd0pqdEhkelp2VVFwWkxDaDg0SlhaRWU5aHlrMTBRNU0rYlBVVmNsR2FVZ1g4U1RBaUdJQTZxaGptMnpkQndMMFdkRjlTMklwejU0Nm9JZXJBS2lsWWVmVmJjNTJqZHpsTFYzQWtZUXVMWmdTQXBJcC9vZ3FvZmFyeVR5Nlg2d09DWWVmT1FmY1JpU1lMSmU4YUJVejN2VVRSYks1enRJcVhIMHBqaTJNMENDSVNVbS9hL0dHeE9Na3diczJoQ0Zoak5PWUJDK3A4bXh0SGFNUmtTdmJnZUJqZEMyWjlWUVNzcWM3Uk9qU1hld25PSzF2RGsyUTAyOTVqcExhTXpvc0t2MmtlalZrd0Y2czJsTlgzUUpYRVRJUkJub0xWbDJRcFNDTWlXSWliSzVNckNmWGE2SllyeVJZZzVUTXEwdWRoSDh0UjRFZDRKVldBTWZJNHQxelo2SUtIS0tyT2tiNU1obUZGNkVrV2pLMG9KQVlRdmN3aHQrWWVzTGhqVGgxeWl6K0daTGlUczBJN0FhWmlob1pjd1FpYlJwN0pLeU8xUERLWUFKQ3pBTWxreGhBamxwSkY4Sy9DaXhYWmJiWk85bm5pTDlvNnNhcVpCeXplTmV6SHVVdGdFbTdoeUtZR3pRaHh6N1l0ZGZCY3JoLzNzTVB0Y1lxcDE2ZzZFTHZ6YllpRk9xYXFKR21ZeHlNZ0xxdWNiQUt3dFZiZEppVWxGZ2lHTDdNVzdFaDJDY1o2RXZNaEYzU1pTYmVKUWlkZlZYVUVkUHIwTElyV3NYeVJqN2hDa21OdXN1eVh4MnJpNlhONDlKRHlDYVZuUzRaMjVEUnVibWpINkpqS0RFcEphMmduUmNQb3RrQ0FhZ2JhV0gzU09HQXJRQzVVR2R2R0VvbG81a00vWlJkam5ySGJiVXpDR0xsWW9Zc1p3L0o0N3hzSGVxek90M1ZrcWk2STRzOVRVOThmVzJnTU1Hd1pFY25wTzNMS1djbklMWWI1SEthbWhxZXgrK2N4RlVIa0Zaa01yQVpjZmtUVTVCR29MNmtGckFEUG8rUnQwYmNQeCs1RUtiSldSN3QyNys3cTZ2cHEvLzZEbDZmR3ZwL2R4TW0rbTV5Y1dsdGJXMTlmUDcreThxYmNlQzc1U0R6Y2FKZEtGRWZmdlNqRVlsOHdqQ1NNeWo0alFtb3VuWlFmNWs4Z0Z0SHZxeUVlQXN3aG1JeHF0WHBDeEwzUm84TWl1Z1JlS3N4VUxBdnNMaDlzbEhmN1ppY25WOWZXbHBmWEgxdzcvN0ljV2RYelF6K0lJbVpqM3JtelBCbmhseGpvRjJVeTUrY3NXMEVQb2hTdHUwWlZGU2RtWm1hT0hqMDZmSFM0YTNoNE55Q0VXQ0ZhRm5MeVRXSW5lWGVzOFI3VS9Qems2dXJxNWVYbEI5ZXVuWmQvM2gyS0oyWVZLUmRMTjdZT0lhTzkwYWJrWW9TS095YVFMdEovckFMYUN6REFsTllyaHAwV01UNCtQakx5ZG1ibTNyMGJYdlhHcUtRUUE2SkxUYnJNYkZjU3BpNXJ4WmY3OXo4N2VGQ1FUYkN0Q2Nqc1dKaWUvbDRndUx5OC9QemF0YnNDd1RKUE1TYUtEclBVY3ZMV1VVeUp4d3lFdzZqa3JTUDV2SURXTUltUGlCT0NQNHBBWFRZQ0xuMEFMVVJQd2dZN3ZKQUFYVDQ0TmpVMmUyd3pMV3M1OW4wM1B6MDN0YnAwWmZuWmo5Zk8xK0pZa0xDSnpuc2NFSGNDcHNocEQxaWdBTTJjdURjOFVUdFZsU0FaM2VGNGRObE02ZXB5bVFPeGYvLytLd2NQTG8yTmpSMmJiZDkvenpJOVAzMXg3c3phMHRMeTh4OS9yQTMwcWpUMlVlUWdNWTNkSDhCRVROcDlCVSsxK2tvbzBEMnBRRUtnaDVFWXU1MlVTZ2xMenJzMFFETER4a1F0UFBaMTJ3RGFMUFo5TnoxNzVzemMwdExTc3grZmYxbXJEY1NnaEpKK05WNGJnMnFnQ0NRVldpZllicmZOa0VwZHU1MVVBMTFpYTc0eUVpUUFPamE3QlgrSzRXUEYvUFQ4azdrenQzNVl1di96ODRjOUoxN05uSGgxVCtOakFOTE1BZjUwdWNnNERDSUpBbzBlbS9xMmRZM2U3akhib055a3BacklzUHNITHdzSm1qbzIyOHF6aEo5azdPT0psckJERnBoS295OGZYQk5GN05qc3QrMCs4YmJGVjFrOEVoTDBrOUpvNlJ1LzNiNGF2ZFd4SC9sbEpFaGsyT3kzZjFzSmV2OFFKbWhNYUhTN1Q2T0IrQitDL0tPcjBoNHBkQUFBQUFCSlJVNUVya0pnZ2c9PSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLWludmVydD0idHJ1ZSIgZGF0YS14cmFuZ2U9Ijc1IiBkYXRhLXlyYW5nZT0iMzAiIGhlaWdodD0iNTAiIGlkPSJwYXJhbGxheF9idWlsZGluZ18yIiB3aWR0aD0iMTE2IgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIUUFBQUF5Q0FNQUFBQzZSUTlrQUFBQUEzTkNTVlFJQ0FqYjRVL2dBQUFCZ0ZCTVZFWC8vLy9reVptMXBJRGV4cHI3M3Fxbm1uYWxsbkdubW5uMzNhcWpsWG4xMmFuc3pwaTdwNFBVdlpQdTFhWFB1bzZ0bTN6cjBhTGZ4WmJOdDR4eGJXT1VpbTZ5bjNsN2MyTnNhRjIrcklTdG0zeW9tNEMybzN2MjJLU3puVytybklHZWpHdXFsbTNaeEpaeGJXTjBiRnZVdlpQdjBKdm56WjJNZm1QQXJZcTdwNFBYdm83UXU1TEZzb3ErcklSc2FXRHgwNTdFcllLem5YQ3NtbktGZTJxb200Q1BnV1NNaEczUXU1S2NrM09sbG5HamxYbDdjMk56Y0dlSmYyMTdjMk9KZjIzRnNvcVVpbTYrcklTY2szUEFyWXAvZVdsL2VHV2ZrbnJHc0l6QXJZckdzSXljazNQTnQ0elh2bzY3cDRQcjBhTFF1NUs3cDRPbWsyemZ4WmJaeEpiRXJZTDEyYW51MWFXd20yNzUzS2ZtemFIbnk1YU1nM04vZVdtZmtucWFqbm1VaVhTTWhHMk1nM09ybklHamxYbVVpbTZVaVhTTWhHMkVlR04vZUdXMXBJQ2FqSE9GZTJyR3NJeTdwNE9WaG1lK3JJU3RtM3lubW5tZWpHdVVpbTZWaG1mVXZaUFF1NUxOdDR6ZXhwclB1bzdHc0l5N3A0T3luM21tazJ3Ky9NVjBBQUFBZ0hSU1RsTUEvLy8vLy8vLy8vLy8vLy8vLy8vL1JQLy8veUozL3lJUjd2OUUvLy8vUkhlNy94RWl1Ly8vUkhmdS8vLy8veEgvLy8vL0lqTkVWYXFxek13UkVTSXpWWGVJdTh6ZElpSXpabVozZDRpWnFydTd1N3ZNM2QzdTd1Ny8vLzhSRVNJaUlpSWlNek16TXpNek0wUkVSRlZWVldabVptWm1abmQzZDRpSWlJaUlpT21hcjFjQUFBQUpjRWhaY3dBQUN4SUFBQXNTQWRMZGZ2d0FBQUFjZEVWWWRGTnZablIzWVhKbEFFRmtiMkpsSUVacGNtVjNiM0pyY3lCRFV6UUdzdE9nQUFBRnpVbEVRVlJZaGVXWGgzc2FSeERGdlN6SEhRc2N6VUVLQ0ZWa2lJTktGRVcyNVJaRmNWd2pKRnZOVHUrOTkrcC9QZk5tQ3dmY3hZb3NmOG4zWmNCM2dqdnY3OTdzbTlubDFLbEh4TnlqYm5nQ01mN1Uvd1U2OTI5QWwvNUw2WDNucTQzZjV1ZC91ZjNacFNjQVJYcC9HQi82OHExZkQ0SUhZWFA1VEM3M2VtNzMxcHNuRFlYUzlkTURYNzI5blZaQm1rSXBWYzRoWHIxODh0Q0xBOUNmQWlJcWZ0TS8xV3dUZGE5MG90QzVJZWlsYmFoa29ZQUc5T2N5aXoxSjZKRFNOdzQxS2cwd3ZSVE9UVkMzSGd2endjYkc3WkpyZm9OS0x4OHFUbXM2SUJ4VCtjUHlZMUp2SHFnbXhyaGxQcFBTcTU0cm0yMVd5RnlYWkR6R0dWQy9PU2J5OGpZUDFLUkJkcTlZNkRudmdybjhjd0FDWlJjKzRya2xVOEZYSVp2NHh2R2cyMHFMZUVEVVBTNTc2a2puZkFOOUQ1Y1VweFpZZmVKc2E2bTd4MkorQ1NJa0JDRlYvWmFGV3FWYlNydEk2ZHdxN1NqT0RjOXE3bGlGYzJEbXl6dzZFdHhQNzFJakRLa2RORlV6UkRUNXRrREJVVW9iT0xkM1ZORDQ2dXJxalFaaTZtWVlsc3ZsMThvSVFiRTNUMUVSVWtpRXdFbmdqSU9zZHJ2ZGdyUXgreXpIdDZjNXh1aWwzd2xiZ0JKR0VHWTBHazg0aFA0aytpZGgrUHhuUG5Xa0dJdUgydEcwQUl2UVdBc1hScUZSaXkrT3hreUUyb0dseWQrd1BQMUlmZUU2d1NlaDlCL25tS0I1c1pqSlpqTmVER3VoNmxQVWs2QlRGaVZkSXFXRldxUjBhdnNaWjJnMW02RlhETFJZb1F1WnpFUVNWRVNzYVUvbWk3SnlFZXBUd0UwK1ZSQmFhWUZHem1ZbllxQ3loa3UxMVBVRTl6cnZHSjNXUkVLRzZIRksyVFZGVnlhZFUxUXJad0dWa0VORHgwQVhBYTBuS0cxRWpDUDdKNkdoS3RyZmJjOExTS25RMEJyeVc0K0RWbW0yczM2eWV3Y3Q1R1pYaXRCMkhUUjJkRUR1OFJHb1dNVFFNVTRxaWdJbTFmdTdraEd1VEkxNzlKR2dRZGd1dDh0NDYwNFZtUFF5VkVwMlVpWU9Xc2tpVXE4a3VGZEdLbFZFZkNwSWFhQXF2dWQ3bnVmalFFZHU5VENTVG04QlJvcHhVbEdJT2wzSzFCSkxwbDkrSXRKOTZIT1pVbG9obEllaTgvbHNvTkxNcWN3Z1JpZVZvSGxVVXoxSnFlMHh3cHJXYVE5cC9tYVpDSlVzTlRCR2trOXpla1VkL3ZWam9MS0t4L0VUNW5UQXZKRmxSREEwWGRFd3BCWUgzaHhGb0lzWWV0UkpSWW5NMDVWazkwYTdqc3N1bDB3NlBXczFjblk5TGhxNGw2R0NlMUoyMUVta3RNS040OU1FYUg5RmtXNE4wVThDYU1WbVZ4OEhvSFFYZWhMYTNZaFMxRERGRi9GejZ0cXNOR0RoSE1WUWRxNXYwRjZnVE1tWTlGYllTU005cVlnbEFkQVhFK2JVcmN2V1NxNFhjM3AxWGkwM01FcDVUbkZYSGUxaHhMN2tYcm1BSkx5VWxONzR6b0Qwa3F4WnJkVFRaY29sbzFKZG8xU3drMkpXTnlndDRIRmVUb1FLbDFqaFZsTDhVUTQ0dld3aTB5SzRIMGJjSzZxWk9DZVJVdlFra2pyOE05T2sxNVZMWkxYV1NUYnUxUnExWE94M0F6dW51SkY3MG9pVGloaXNqaVhvYWdLMHZ6RnhENkMxYS9mYUt1VVU4N0xqb0xnNTFrbVlVM0VXVW1PZFZMSXJkdjlnOWk1VXAwclhxZS9BbnUxSVRpbnB5WTQyd2lKRzdRRWE2NlRTWU9lTEZLd1E1WFNrSStsNXhaSWU5TjFMdCtmMUdqWVlWWXh5SG5NYTY2UkdaRjltNTlXdXFyVEthQ01abWI1THIxT0tIb3V4UjVYU1poM0dqblhTRkV0c2kzYTd1TEN3c05pMVdua1JWMWhsVEhLMVlHeGJWQlRLcS9XSWs0cWNySXZ3V0p5VHBsZ2RwcXJLZVluMmYxWnFTbFJuMStlZmlZQmVNMFlTZXQ4MzVLUWlwNjBIYUp5VHVHUWtWa2tOalc3UnNIT29HQnNacmRpdDhNYnNtcTVUR2Ura0lydWlsOVNUU3Z3ZjAwNnBiVW5PU0VhaWJRN1lLRm1sMm01NWJCNkduRlRreDk1Qm9jWTVTZGNwdWx2VjJzNzFDbHVuRnVyYk9lMEt1Vzk2citteDJXRW9IbWNXTlpPZG1aNWU2MXh2UmFGTHErL1NyOFR6RkgvODJidDd0L2NNeCs4N08vUXpjZmZ3OEhCUE55VGRnUDIrZS9lTlVpa0szTzVxRTRpYWlmeHppT3J6aUpXVnlaVkp4UHJNdyttdk81KzBZanRqVWx6NTZNT1BYNkI0Ly9OU28vSGRuVHZmOXpZM04zdTkvZlgxOVh2MzdrOWk2SlhKK3pNY0Y2WTVmdXgwMXRZNmE1MVdxelhXY3JTL0FHU2hqNW5vR3JaTUFBQUFBRWxGVGtTdVFtQ0MiPgogICAgICA8L2Rpdj4KCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8Zm9ybSBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIGlkPSJzZWFyY2giIGFjdGlvbj0iL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxsYWJlbCBmb3I9InNlYXJjaCI+RmluZCBjb2RlLCBwcm9qZWN0cywgYW5kIHBlb3BsZSBvbiBHaXRIdWI6PC9sYWJlbD4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSI+CgogICAgICAgIDxpbnB1dCBjbGFzcz0iYnRuIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPgogICAgICA8L2Zvcm0+CgogICAgICA8ZGl2IGlkPSJzdWdnZXN0aW9ucyI+CiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvbnRhY3QiPkNvbnRhY3QgU3VwcG9ydDwvYT4gJm1kYXNoOwogICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vc3RhdHVzLmdpdGh1Yi5jb20iPkdpdEh1YiBTdGF0dXM8L2E+ICZtZGFzaDsKICAgICAgICA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2dpdGh1YnN0YXR1cyI+QGdpdGh1YnN0YXR1czwvYT4KICAgICAgPC9kaXY+CgogICAgICA8YSBocmVmPSIvIiBjbGFzcz0ibG9nbyBsb2dvLWltZy0xeCI+CiAgICAgICAgPGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHRpdGxlPSIiIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVJwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1RXRmphVzUwYjNOb0tTSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZNVFpDUkRZM1JFSXpSakF4TVVVeVFVUXpSRUl4UXpSRU5VRkZOVU01TmlJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk1UWkNSRFkzUlVJelJqQXhNVVV5UVVRelJFSXhRelJFTlVGRk5VTTVOaUkrSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2tVeE5rSkVOamRDUWpOR01ERXhSVEpCUkRORVFqRkRORVExUVVVMVF6azJJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1V4TmtKRU5qZERRak5HTURFeFJUSkJSRE5FUWpGRE5FUTFRVVUxUXprMklpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtTTTlNQ0FBQUErNUpSRUZVZU5yRVYxMUlrMUVZM3M0K2RkT3AyOVE1YjBvcENnS0Zzb0tvaTVLZzZDSWh1d2k2ekxKTG9ZTG9wcTRxc0tLZ2k0aTZDWUlvVS9xNWlEQUtzNnN5b1M3NklSV3R5SitwN2NkdDdzZjFQR09EK2UwYzNkeWdBeC82N1p6elBNOTUvODc3R1lkSFJnM1pqTVhGeGVwUUtOUzZzTEN3SnhxTk51RnBpTWZqVnM0WmpVYS9wbW1qZUQ2VmxKUzhOcHZOVDRRUTdteHdqU3NKaUVRaW0vMSsvOWxnTUhnSXI1b2h1eEcxV0N3OVZxdjFjbEZSMGRDcUJPREVsVjZ2OTBvZ0VEakdkWWJWalhocGFlbmRpb3FLMDdDSVI3WkFxRTQ5UFQwOUJQTDJQTWdUQnlRR3NZaVpsUUQ0dU1YdGRyK0p4V0lOaGdJTlloR1QyTXNLZ01ybTJkblpYZ1JYaGFIQWc1akVKb2RVQUh4dXg0THVkSEpFOVJkRWRBK2kzSnV6N2JHSGU0bWhFOUZOcmd3QkNMaXJNRlY5T2toNWVmbEZoOFBSNW5LNW5EYWJyUjJCTkpsS08wVDM1K0xpNG40Ky9KKy9KUUN4aG11NWgzdUpvWE5IUGJtV1pBSE1zaFdCOGw1L2lwcWFtbWFBZjB6UEREeDFPTlYzdnVyZGlkcXdBUUwrcEVjOHNMY0FlMUNDdlEzWUh4SVc4UGw4NXhTV05DMWhBRERJdjBySUUvbzRKMGsza3d3NHhTbHdJaGNxM0VGRk9tN0tOL2hVR09Ra3QwQ0ZhNVdwTkpsTXZ4QkV6L0lWUUF4Zy9aUlpsOXdpSEE2M3lEWWllTTdEbkxQNUNpQUdzQzdJNXNndFlLSkdXZTJBOHNlRnFnRkpySmpFUFkxQ24zcEo4LzlXMWU1VldzRkRURW1GckJjb0RoWkpFUWtYdWhJQ015S3BqaGFocU4yMWhSWUFUS2ZVT2xEbWt5Z3JSNG80QzBWT0xHSktyT0lUS0I0amlqemRYeWdCS2l4eUM1VERRZG5rL1B6OHFSdzZvT1dHbHNUS0dPUVc2T0g2RkJXc3llUHhkT1hMVGd4aXllYklMWkNqeitHTGdNSUtuWE56YzQ5WU1sY1JkSFhjU3d4RlZnVEluUWhDOUczM1VoTm9KTHVxcTZ0MzQ1cDl5M2VVeThPVGs1UGpBSHVJOXVvNGIwN0ZCYU9oc3UwQTRVbmMrVDFUVTFOajNLc1NTRTV5SjY1anFGMkREZDhRcVdZbUFacklNMlZsWlRkblptYjZBYnBkVjlWNmVjOXpuZjVRN0hqWXVtZFJFMEpPcDNNaml0TzRTRmErY1p6OFVtcWUzVENiU0x2ZGZrUi9rV0RkTlFsNUludVRjeXNPY3BGVDM1WnJiQnh4NHAzSkFIbFpWVlcxRC82MzRWUnQrRnZMQmdLL3Y1TFY5V1MrMTB4TVRFd3RSdzdYdnFPTCtlMlE4VjNBWUlPSUFYUTI2L2hlV1ZuWkNWZmN5S0hnMkNCZ1RwbVBtallNOGwyNEd5YVVIeWFJaDdYd2ZSOUVyRThxSG9EZm4yTFROQVZDMEhYNk1GY0JJUDhCaSs2RjZjZFcvRElDa0FOUmZ4OTlmRVlGUTdOcGg1aS91UWlBMjE0Z25vN0srZ3VoYWlLZzlnQzYyK004ZVI3WHNCc1lKNGlsYW02MEZiN3I3dUFqOHdGeXV3TTFvSU9XZ2ZtRHk2UlhFRVF6Sk1QZTIzRFhyVlM3cnR5RDNEZjh6L0ZQZ0FFQXpXVTVLdTU5WkFVQUFBQUFTVVZPUks1Q1lJST0iPgogICAgICA8L2E+CgogICAgICA8YSBocmVmPSIvIiBjbGFzcz0ibG9nbyBsb2dvLWltZy0yeCI+CiAgICAgICAgPGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHRpdGxlPSIiIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVJwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1RXRmphVzUwYjNOb0tTSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEVRVU0xUWtVeFJVSTBNVU14TVVVeVFVUXpSRUl4UXpSRU5VRkZOVU01TmlJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRVFVTTFRa1V4UmtJME1VTXhNVVV5UVVRelJFSXhRelJFTlVGRk5VTTVOaUkrSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2tVeE5rSkVOamRHUWpOR01ERXhSVEpCUkRORVFqRkRORVExUVVVMVF6azJJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1V4TmtKRU5qZ3dRak5HTURFeFJUSkJSRE5FUWpGRE5FUTFRVVUxUXprMklpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtoZlBSYVFBQUI2bEpSRUZVZU5yc1cybU1FMlVZYm9kdHQrMjIyMnUzNVFoZW9DQ1lHQlFsaWdJSmdrWkpOUHpnaWdvYVRFajhBZEZFTWZBRGZ5QUJrZ1dpaVdjaWVLNFMrUU9pSEFZVWoyaE1OS2dZbEV1anBOdHR1OXZ0dGJ2ZHcrY2hVMUs2TTUzNXB0M3ViSENTeWV6UitiNzNlYjczK3Q3dnJmWHN1Zk9XNGJ6Nit2b205L2IyM292bk5OdzM0YjV4WUdBZ09EZzQ2TWJ0NG1lc1Ztc1dkMXFTcEhoZFhkMmZ1UC9BZmNwdXQ1L0E4OHh3eW1jZEJnTHFlbnA2RnVSeXVXVjR6dS92NzU5UXlXQmp4b3o1dDc2Ky9ndW4wOW1LNXhGeWFrb0NBUFNhVENhek5wdk5Qb1lWYmg2TzFZS0dSRjB1MTNzTkRRMjdRTXpmcGlBQUtqMGxuVTYvZ0JWZkFaVzJXV3B3d1Z6eTBJZ1AzRzczRnBqSTZSRWhBR0E5cVZScUExYjltVm9CVnlJQzJ0RGk4WGcyNCtkVXpRaUFiUy9zN094OEcyby8zbUtDQytadzBlZnpQUUVmY1ZqWXJBUlgzZGJWMWJVdEhvOGZNZ3Q0MmYrTXAweVVUVlFiZFdzQUhWc2lrZGlIa0hhUHhjUVhRdWZYZ1VCZ01SeG1lOVUwQUF4Zkg0dkZ2ak03ZUY2VWtiSlM1cW9Rd0VRR0E1N0FjNUpsbEZ5VVZaWjVja1VFZ01WeHNLMmpsU1l6SStRWEpzaXlqek5FQUp5SkF6Yi9LUWE0MWpKS0w4cE9ETVFpVEVBeW1YdzVuOC9QMElqRDNiaDdSZ29nNTlhYW54aUlSVFZ2Vi9vajB0bkhjYS9XTXJWd09Ed0IzcmFUR3h6a0JnL2duWlZhcEZWNjJXeTJuNUFPNzBITS81d2JKMFFuWHlRU2FWUERJdU5aelkwVjNudEhNd3hpd0hBMEdqMk5wN2VjSUJEZ2FEQVlYS0NRSk0xRGhyZ0ozbmh1bGNQYmw4ajRObUhlNDZYL2c2MGZ3YnozYWV3amtxRlFhQXFlYldVMUFPcXlRd3Q4SWQ2cUVITWM5N3p1N3U3RkdHc243SEFpVnVvc1Z3N1AzNUMxbmNjZGdTQ3hvcDFkSGVac3dtZkhNbnhCbzZaVGsrak44ZGwvdkY3dldvZkRzYStNTE45b0VVQk14T2IzKzFlb0VzQlZ3NlptdWE0OXI4WW1oQUtEaUVQY013QnN4TWlxUStpeHpQRnhaeXFScFhBUkcvWU9yMU9iRkowZ1Vza1hCYmFtY1IxT0ttTVV2RHhIUkF1OC9MbVkzakZMTVVwRnF6OUh4RzY1c21ZSmR5S3lFQ094RGlFQWUvcDFnakYyb29uaXZaQXN4VmdsMmRhYTRFUVdDVzZKNTVxRkFGRlppSldZTHhOUXkycU9TVXpHUnN5WENVREllbGl3QUhFTzRXU2xXUUJSRm9aYWtYY0ttQ1hteVhBS3MwVmU5dmw4cTQyV29JWXBKVTRoVjNoS2NOczhtOWdsN3AveFE3M2VGNWtCNGo1bU5yV21USlJOd0F6cWlWMUN4alZUWkNJa0VxK1oxYlpGWlNOMkNlbm1WQUZWeTRQbHo4eEtBR1dqakFLRms2bENCTURSL01KakxMTVNRTm00M3hBaVFLVGFBKzkvd2V3aERqTCtKVkkxa2tUU1NPVGNLYk1Ud1BxRVNBb3Q2ZG42RnIxZ0h3VkpqdTZJUnV5aUJ5UHVVVUJBZzVER2tBZ0JteGx2ZGdJRUs5Z0Rrb2hkWS9CSm80Q0FHMFI4bWlSU3NHQUJrZ1ZRczRLWHUwOThJZ1VYU1NSc0ZBb0taaVZBVkRZMldVaWlQVGpZUmk0MUt3R2lzckdzTHRsc3RoOEZpd256MmZCa1F2V2ZSdGxFM2lGMnlXNjMveUNhY1haMWRXMDJHd0d5VEZhUmQ0aWRKbkNLSFJhQ3hZUkhvRzVMVEtUNlN5aVRvUDFmSkhibUFZUFlSUjBVblpRdE1uQTZzMHpnK0daQmx0MEdkbzdFUEhncEUzUTZuWjhZeUxoYzhYajhNSmgvYUtUQVkrNUZQQUtITEU3UmR3dVlKWm1Od3p5Q01rQkNZeUtST0pCTUpsOUIvUFhYQ2pqbUNtRE9WekgzZmlQcE9iRVdHcW9LZTRFQmw4djFobHFzZEx2ZDIzbWt4SE05cGM5a01wbW5vOUhvZVRpaTdld2JIRVpQUHgxenRMUzF0VjNBbkd1TWppTmp2YlFGdUh3NnpEbzVCeTdkVFBBUU5CZ01MclJhclRrU2xzMW1ud1Q3dXdwOXZpcng5UXpiVy9IdVYvajVkL2IrNmpuaUtsbGxQOGxrZU9OSkRrK2RxOUdzUVRuQzRmQjFoZU8wSzQ3SHdlN1dkRHI5bkFLZ1h3T0J3SEkrQzQ1SHRqMWQ2c2Q0MjlUVU5FY21VZGMrUFJhTEhjdm44N2RYVzR1Z3pkc2FHeHVmTDk0TkZ2OXppMUo3R1ZiaGx2YjJkbmFKM1NWcnhmYytuMitOVHNaNy9INy9NcjNnNVhkU0lIeUpTSDFQWis3ZlRveWwyK0VycWlsZ1o0TmFMWUI5Z29WR2FIalI5M0h2MVpyVTRYRHNGVDIwa0gzUE9iemJXazBDZ0cxamFjVklVbkFRYjlGK1ZleHlMTXprcGNMdjBJSlY3QUhRSU9DQVVZSHg3djVxZ1NjbVlIdFRxU0F5WkxFSlRLMjJCaWU0aXEzeHNxcG00U0FmOUhxOWEyRG5KNHVMSzNTRVVMY2RSdnAzaTN6SHlTcXBmaWN4RWRzUWMxTnJsWVhYdlIrTzdxQVNTZXpYQitoMVN1VW9tZ2c5TEw4QlVvVjQ3NDlFSW9sS2grRWlxV21xVkVabERnSGtzMnB4SHc3eFRxVVF3OUo1TmNBWE9LMTBBR0lvWjZabGk2Slk2WjFRNDYxS29aNE5pS0xIYXJXK0tEc3hsRFVQSFo1elBRWnFVVkRQSnNUcWI1bjltYWxicEFoOEMyWFhETGw2MitXWklERlJVbE5WT2l3ZW5jbk5VM2FRRWtMK2NETVNvTHZabzJmUUI3QUpzc05BdUZ1dm9ybERWVmtrZzJJODcram8ySzJRQVZwaERyZnlWaUs1VnF0TzM0T2theFhDcCs3ZHJkREJDQWR1Ym02ZWlkWCsyV3dxVDVrb213aDRZUUxrK0g0YUU5M2g4WGcyZ3ZIZWtRWk9HU2dMWlRMeURUTEo0THg5L0taV0tCU2FpblQ0SXkzRnFRQmZuVVpSNDJQS1FGa3NCcjlRS1ZYQ1B1c0QzT2lBL1JrUTVrUDhxVi9KbDFXeXdBcC82K2RjbVBNMnpMMVVyVWFoZTRKcWZuV1dLWEl1bDN1VWJmUDhuakFGTFcxT0ZyM2dkRnRaNzJjTkgrUHRRVDcvYnJXK05YcUpBSGgweTlWOC9VL0ExVTdBZndJTUFEN21TM3BDYnVXSkFBQUFBRWxGVGtTdVFtQ0MiPgogICAgICA8L2E+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvX2Vycm9yLmpzIj48L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K) + format("truetype"), + url(data:font/svg;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGNvbnRlbnQ9ImRlZmF1bHQtc3JjICdub25lJzsgc2NyaXB0LXNyYyAnc2VsZic7IHN0eWxlLXNyYyAndW5zYWZlLWlubGluZSc7IGltZy1zcmMgZGF0YTo7IGNvbm5lY3Qtc3JjICdzZWxmJyI+CiAgICA8dGl0bGU+UGFnZSBub3QgZm91bmQgJm1pZGRvdDsgR2l0SHViPC90aXRsZT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+CiAgICAgIGJvZHkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWYxZjE7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICAgIGJvZHksCiAgICAgIGlucHV0LAogICAgICBidXR0b24gewogICAgICAgIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgICB9CiAgICAgIC5jb250YWluZXIgeyBtYXJnaW46IDMwcHggYXV0byA0MHB4IGF1dG87IHdpZHRoOiA4MDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB9CgogICAgICBhIHsgY29sb3I6ICM0MTgzYzQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KICAgICAgYTpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CgogICAgICBoMyB7IGNvbG9yOiAjNjY2OyB9CiAgICAgIHVsIHsgbGlzdC1zdHlsZTogbm9uZTsgcGFkZGluZzogMjVweCAwOyB9CiAgICAgIGxpIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgICAgbWFyZ2luOiAxMHB4IDUwcHggMTBweCAwcHg7CiAgICAgIH0KICAgICAgaW5wdXRbdHlwZT10ZXh0XSwKICAgICAgaW5wdXRbdHlwZT1wYXNzd29yZF0gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiA3cHggOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgY29sb3I6ICMzMzM7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0IGNlbnRlcjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwwLjA3NSk7CiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZS1pbjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZS1pbjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CiAgICAgIC5idG4gewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIGNvbG9yOiAjMzMzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRTsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgjRkNGQ0ZDLCAjRUVFKTsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoI0ZDRkNGQywgI0VFRSk7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgfQoKICAgICAgLmJ0bjpmb2N1cywKICAgICAgaW5wdXRbdHlwZT10ZXh0XTpmb2N1cywKICAgICAgaW5wdXRbdHlwZT1wYXNzd29yZF06Zm9jdXMgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBib3JkZXItY29sb3I6ICM1MWE3ZTg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgNXB4IHJnYmEoODEsIDE2NywgMjMyLCAwLjUpOwogICAgICB9CgogICAgICAuYnRuOmhvdmVyLAogICAgICAuYnRuOmFjdGl2ZSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoI2VlZSwgI2RkZCk7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCNlZWUsICNkZGQpOwogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKICAgICAgICBib3JkZXItY29sb3I6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5idG46YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkY2RjOwogICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjYjViNWI1OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTUpOwogICAgICB9CgogICAgICAjYXV0aCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB6LWluZGV4OiA1MDsKICAgICAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTMsOTUsMTIwLC40KTsKICAgICAgICBwYWRkaW5nOiA3cHggMTBweDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMTBweDsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMHB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgM3B4IDAgcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgICNhdXRoIGgxLCAjYXV0aCBwLCAjYXV0aCBsYWJlbCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuYXV0aC1mb3JtLWJvZHkgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQogICAgICAjYXV0aCBpbnB1dFt0eXBlPXRleHRdLAogICAgICAjYXV0aCBpbnB1dFt0eXBlPXBhc3N3b3JkXSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgd2lkdGg6IDE3NXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogOXB4OwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OwogICAgICB9CiAgICAgICNhdXRoIGlucHV0W3R5cGU9dGV4dF06Zm9jdXMsCiAgICAgICNhdXRoIGlucHV0W3R5cGU9cGFzc3dvcmRdOmZvY3VzIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSgyNTUsMjU1LDI1NSwuNSk7CiAgICAgIH0KICAgICAgI2F1dGggLmJ0biB7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICB9CiAgICAgICNhdXRoIC5idG46Zm9jdXMgewogICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSgyNTUsMjU1LDI1NSwuNSk7CiAgICAgIH0KICAgICAgbGFiZWxbZm9yPXNlYXJjaF0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgI3NlYXJjaCBsYWJlbCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDIwMDsKICAgICAgICBwYWRkaW5nOiA1cHggMDsKICAgICAgfQogICAgICAjc2VhcmNoIGlucHV0W3R5cGU9dGV4dF0gewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICB3aWR0aDogNzA1cHg7CiAgICAgIH0KICAgICAgI3NlYXJjaCAuYnRuIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICAgIHdpZHRoOiA5MHB4OwogICAgICB9CiAgICAgIC5sb2dvIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW4tdG9wOiAzNXB4OyB9CiAgICAgIC5sb2dvLWltZy0yeCB7IGRpc3BsYXk6IG5vbmU7IH0KICAgICAgQG1lZGlhCiAgICAgIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICBtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLAogICAgICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzogMi8xKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICAgICAgIG1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLAogICAgICBvbmx5IHNjcmVlbiBhbmQgKCAgICAgICAgICAgICAgICBtaW4tcmVzb2x1dGlvbjogMTkyZHBpKSwKICAgICAgb25seSBzY3JlZW4gYW5kICggICAgICAgICAgICAgICAgbWluLXJlc29sdXRpb246IDJkcHB4KSB7CiAgICAgICAgLmxvZ28taW1nLTF4IHsgZGlzcGxheTogbm9uZTsgfQogICAgICAgIC5sb2dvLWltZy0yeCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgfQogICAgICB9CiAgICAgICNzdWdnZXN0aW9ucyB7CiAgICAgICAgbWFyZ2luLXRvcDogMzVweDsKICAgICAgICBjb2xvcjogI2NjYzsKICAgICAgfQogICAgICAjc3VnZ2VzdGlvbnMgYSB7CiAgICAgICAgY29sb3I6ICM2NjY2NjY7CiAgICAgICAgZm9udC13ZWlnaHQ6IDIwMDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luOiAwIDEwcHg7CiAgICAgIH0KCiAgICAgICNwYXJhbGxheF93cmFwcGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLWluOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLWluOwogICAgICB9CiAgICAgICNwYXJhbGxheF9maWVsZCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgaGVpZ2h0OiAzNzBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfZmllbGQgI3BhcmFsbGF4X2JnIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAtMjBweDsKICAgICAgICBsZWZ0OiAtMjBweDsKICAgICAgICB3aWR0aDogMTEwJTsKICAgICAgICBoZWlnaHQ6IDQyNXB4OwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgd2lkdGg6IDk0MHB4OwogICAgICAgIGhlaWdodDogMzcwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiBpbWcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9lcnJvcl90ZXh0IHsKICAgICAgICB0b3A6IDcycHg7CiAgICAgICAgbGVmdDogNzJweDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9vY3RvY2F0IHsKICAgICAgICB0b3A6IDk0cHg7CiAgICAgICAgbGVmdDogMzU2cHg7CiAgICAgICAgei1pbmRleDogOTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9zcGVlZGVyIHsKICAgICAgICB0b3A6IDE1MHB4OwogICAgICAgIGxlZnQ6IDQzMnB4OwogICAgICAgIHotaW5kZXg6IDg7CiAgICAgIH0KICAgICAgI3BhcmFsbGF4X2lsbHVzdHJhdGlvbiAjcGFyYWxsYXhfb2N0b2NhdHNoYWRvdyB7CiAgICAgICAgdG9wOiAyOTdweDsKICAgICAgICBsZWZ0OiAzNzFweDsKICAgICAgICB6LWluZGV4OiA3OwogICAgICB9CiAgICAgICNwYXJhbGxheF9pbGx1c3RyYXRpb24gI3BhcmFsbGF4X3NwZWVkZXJzaGFkb3cgewogICAgICAgIHRvcDogMjYzcHg7CiAgICAgICAgbGVmdDogNDQycHg7CiAgICAgICAgei1pbmRleDogNjsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9idWlsZGluZ18xIHsKICAgICAgICB0b3A6IDczcHg7CiAgICAgICAgbGVmdDogNDY3cHg7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgfQogICAgICAjcGFyYWxsYXhfaWxsdXN0cmF0aW9uICNwYXJhbGxheF9idWlsZGluZ18yIHsKICAgICAgICB0b3A6IDExM3B4OwogICAgICAgIGxlZnQ6IDc2MnB4OwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgoKICAgIDxkaXYgaWQ9InBhcmFsbGF4X3dyYXBwZXIiPgogICAgICA8ZGl2IGlkPSJwYXJhbGxheF9maWVsZCI+CiAgICAgICAgPGltZyBhbHQ9IiIgY2xhc3M9ImpzLXBsYXhpZnkiIGRhdGEtaW52ZXJ0PSJ0cnVlIiBkYXRhLXhyYW5nZT0iMCIgZGF0YS15cmFuZ2U9IjIwIiBoZWlnaHQ9IjQxNSIgaWQ9InBhcmFsbGF4X2JnIiB3aWR0aD0iOTQwIgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQWdBQVpBQmtBQUQvN0FBUlJIVmphM2tBQVFBRUFBQUFVQUFBLys0QURrRmtiMkpsQUdUQUFBQUFBZi9iQUlRQUFnSUNBZ0lDQWdJQ0FnTUNBZ0lEQkFNQ0FnTUVCUVFFQkFRRUJRWUZCUVVGQlFVR0JnY0hDQWNIQmdrSkNnb0pDUXdNREF3TURBd01EQXdNREF3TURBRURBd01GQkFVSkJnWUpEUXNKQ3cwUERnNE9EZzhQREF3TURBd1BEd3dNREF3TURBOE1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd00vOEFBRVFnQm53T3NBd0VSQUFJUkFRTVJBZi9FQUxZQUFBTUJBUUVCQVFBQUFBQUFBQUFBQUFFQ0F3QUVCUVlJQVFFQkFRRUJBUUFBQUFBQUFBQUFBQUFBQVFJREJBY1FBQUVEQXdNQ0F3VUdCQUVHQ3dnQ0F3RUFFU0V4QWhKQlVXRnhnWkdoQS9DeHdTSVQwZUh4TWdRRlFnWUhGMUppMGlQVEZCVnlncExDTTJPRGt5UWxOYUt5VTZPek5FVlZjMFJVcEJZUkFRRUFBUUVEQ2dRRUJRVUJBUUFBQUFBUkFRSURVd1FoTVpIUmtxTFNCUllYUVZMaUJxRkNRd2ZoZ2hSa0ZWRVNZaE16Y1lILzJnQU1Bd0VBQWhFREVRQS9BUG10K0tMNmZIeU13RHU5U3FsVUZ0QlJBeklsTUJzSGRWREMxVU9CMjRRcGdORlloOFVGQmFmYWlKVEFDcFBaVkR0QTBReVlXbEVwaGJNcWh4YVVRNHRQZFVweGJQZElsTTNaV0pjbkZzMFFNTEZTbkZ2a2dZVzBWaUNMVlVweFlvVXdzQ3FHQUhaQTJKUU5naVV3dENzS1p1RWhSeEtJT0JWREN5VURZYnBFbzRxcFRZaUVCeDRTQnNVSUlzS3NCd1FFV29VY1ZZZzRxUlJ4NFZUT0J4NFNBNG9yWWNJZzRJTmlnT0tGSEJGbzRIWkV6bHNPRXdaYkRoQ2pod3BWSERvbFBpMkFSRyttRmFOZ0ZBY0FsR3dDVWJFYkJBY1JzaHl0aWcyUENpaGlxWWJCS2NyWUlOZ29vWUJFWTJLNE01REJRYkJGREU5VUkySjJSUXg0VWdHSVZnR0NnR0NLQjlORG5ENmFJMzB5cGxjQmdkbEZwY0ZVREJSV1BwcUxrdjAwU2hncEZwY09FVXVLWk1CanVFZ1hFS1pYQmNPRUFOdkNpMHB0NFZDbTE5VkZwVFlVS1RBNkptR01nYkRzNmk4eFRZWjl5aGdoczNESXVTL1RVS1EySXVRTmdVQ0gwNnFMVXpZVUF4bWtKbGNGTnFrQ1k3UWk0NVNHeXVudVJZUWc2NjZxQlRiMzJTS1EydHA0SUFiZENvcERidUhLR01seFBDaWtObGVFcWx4RGNxSTQycXk2T2VWQU50U2ltYngyUkRNVG90SW9BM1E2b0dBOEVUSmhhNjBpZ3RVS2ZFbGlkVlVPQTVnTWlVMkpRcW1JOEVETS9Lc1RPVGkwN2VDcVU0dFpXRk5pcmhGQU5WSVV3dFZpVXdDb1lXcXBWQmFvVXd0VlEyUEREZEF3dDNRTUxBT1VRemNLNHdHQUtzUXdzUU9MT0VEWUpoTW14UWhoWXFSc0ZVTmdnWVc4S0xqSTRoVklMSkRtTmlxRGloUnhSS09IQ0ZNTERzZ09IS0lPQ0tPQ0lPQ0dSd1VVY0ZVNUJ4VUsyS3BZT0NRcllIWkFjT0VLT0hDbk1jdVJ3T3lzSzJCUTVXd1JHd1VhYkJWR3dRSEJCc0ZGYkJWR3dLaXRod2dHSENEWWNKbGNaRDZaMlFvL1RRLzNCZ2hXK21WS0I5TW9WdnBwUnNDZ0dQQ2l0andnMklRREVJQmdFVU1BaHpoZ2lsd0tHQXg3S1FvWThJQmp3Z0dDQVlGWld3TUNpMHVCUkNteENnYkZGTGdQeFFMOU1iS0tHSENCY09HNktSUU5xUTVpR3hGTGdtVEJUYXBGSWJVVXBzNFFMaHdtY0xqSkRhUm9wQXBzZWFJdEw5TlFJYkRxb3BEWU82QmZwaFRLNEliT1BCUlU4V2h1NkJjWmhSUzR0MlVVcHRlRXF4TTJtcjkwQ0cyQ2lrTnAyZDFDRk5xZ1hFN0lPRUNCSFJkSE9tQWJwb3FoZ1BGVVVBNDZJaDJsWEFjVzdVM1JEZ2EwNFZRNEd5QnhhL3hST2M0REtvZkdWUTR0bjdFUlFXalpXSWNXL2VpbkZwMVZTbUZ0RlVVRnBTTFRDejhWV1RpMVFPTFVEQ3gxVU1MUUZZaHhic0VEQzFBNHNWU21GZ1FwOFVPVWNWVU5nZGtoVGl3b1VSWWRsVU1MQ25NYzVzUHdRTjlORW80QkNtd0Njb0l0R3lBaTNoQTJPeUZnNHBDamdpWnlZV0haSVVjRlFjRVFjQWl3UmFFU05pRVVjUnNnTGNKQm1WaVpIRXBqQm5MWWxGYkVwakJrY1NwQ3RpVlFjRHNvRDlNb045TXFsYjZaM1VvUDB6dWxHK21kMHlZeVAweWhXK253b1ZzT0ZTaGg3TW9vNEZFREZJVnNVaXRpa0daU0dNZ3lvemNLQVk4SU5paWhnZ0dDaFF3NVZLMzB3b29mVEc2STMwK3FMUXc0VUF4YlIwQU5vMlRsVnNVU0ZOaUx5Z2JFQzRJcFRhaXRodzZoQzRwQURaeDNVVXVCVkMvVEtsVU1EdW9GTm5aRkxnRXFGTmcyVVVwc1VVaHRiUWRVaWxOb0tnUTJJcERZb0ZJM3FpbHdmcWdRMm5aUlNtMkpVaTBoc1U1em1JZlRLVlNHMzhGRkliUEZSVXpZUHZRSmRiNGxSU1k2TWdCdDZsUnBOalJDRkkxMVVNRUlkbzdJdUU4ZkJCNXJUMTFYYkRnb0J4QXFVRkFQUFJBNHQ0VkZBTm9iVlZLY0JFT0xVUTR0VkljV3loektDeHFqaFhuVG1VRm8wQ3NRNHRkQlFXdHlyRXprd3QvRlVPTFVpWnlvTFJzeUpUaTNoREdUQ3k0NktwVGl6ZEE0dDJWU25IcGxBNDlPanp3cWhoWVB2UU9MT0ZVUGh1RVF3c0d5RlBpMmlZNVZ6eUdGdkNzUXd0NFFvNG9oc1VCeFFoc1VpamdpR3c0VmhuSnNOV1VEWUJFRVdoVUhIaElEandtTUdSeEtRbzRGQVJZcVFjRVFmcG9wc0FwUnNBcWc0RFpBY09FTURod2dPUENGYkZBY1hRYkU3SURpVU9Sc1VnMlBzeURZb05pVUsySlFIRTdJVnNUc2ZCQ3RnZGxGSEFvbERDNUZvL1RLSTJDaTViQlVyWThJZ1lqWlJSeC95VWcyUENSUXhHeVRJR0FRYkJJWURBSkFNQnNtVEFZY0tSYTMwK0VLSDB5aTVENmR5RFlKem5NR0ExVVVNQWlVRDZZVXFoOVBoQXVIQ0tHS2dCdFJTNDhJa0tiUXB5cUJzN3BWS2JPQ2dVMkhaQXVISGRGREFySzBwOU5BaHNSU215c0tCVDZZMlVxNXdRK253b3BEWndnWEhjS0tRMklFTnFLVTJoUlV6WndVQ0d3N0lFTm1yTEs0SWJFcXBtd3FMU20xU0xTR3p4MlV5cVdDQUcwS0ZUTm8yMFJhbWJXUlFZZmVvUjVZQUhETHRLNVV3QzFHVkJhM3hRcHdGV2FvTFRzZ3BiWStpRlVGaDBGVlRKeFlVU3FDemRWRkJZN1NxaWc5TUN0VVRPVGl3S29vTEFoVkJhTnU2RlBiWndybE1LQ3hRcHhhT3FzUTR0T3lxR0ZpQjhlRllIRmhWUXc5TkVPTEFnWVc4S3dQZ2diQUltVEMxQTJQRElvNEtvY1dkMEtZV0loc0FnSXNHeXFHRnZDTHlHd0tJSTlNb1UzMDkwb1Awd2xEQ3diSURpTmxjSmtjZXlBNG9EaW5NZkVSWWdPQ0E0QkFjQWhXd1NnNGNJZzRjSURpcU5od29vNGxCc1VRY0VHd1JSd1NwbHNGRmJGV0ZvNGxBTVNvRGlxWWJGQnNWSVZzZUZSc1Rzb280blpCc09FQXhWR3dDbEd3Q1ViQUpTTjlNSU45TUlOOVBaU3JBdzRSZVVNRVF1Q0RZS05TaGdxZ0cwN0tLMkhDQVlJQjlOUUQ2ZktpME1FQXdRREFiSXVNbHdHeWlnYkJzZ1hBS0lHQ0tVMnFSUzRxWlhCY0VvVTJjSlZMZ2RrTUZOaDJRS2JGRklmVEc2S1hCUXhraHNDZ1UyRFpGcEQ2WVVVaHRHb1Vpa05qb0pteFFJYlVYQkRZNmN5ODZSdFFJYlB4V1dvUTI5MURDWnNHaU5jaERieDNVRXpaM1FJYkRzb3BEWjk2aWx3UXJ5UmJ4Qzc0Y0txTFFKMVFQanRDcVpVRnBaRXpsVVdwQlFXNjZxcGs0dDRWZ2NXa3E0VEtvczNSRkJhOUtLb2NXYWxVVUZ2RUlLQ3p1aUtDM2hJaHhhckVPTENxSEZxdU1HVGkwbEVPTENxSEZpSlRpdzZCVkREMHlnZjZhVXB4WndvVXdzS3FVdzlOREdWQjZTVU1MQXFoaGFORkZNTGRGWXlPQlNGTmdxRGlFRE5zRUJZcENqaVZVRVdFb1hKc0VCd0tRbzRjSmd5YkFvRGdVcURnbEJ3U2c0SlFjRUJ3NFFIQkFjVUJ4U0ZiQklEaWtLd3M0U0djamh3a0sySEFRSEE3QUlEZ1VXdGdkMFNqaHlnMkNVYkJCc2VGT2RlWWNUc2h5dGlka0d4NklnWUlyWW9OaHdpdGh3VkViQTdGVWI2WlVxeHZwOUVBK255cFZiNmFVRDZhVWJCQ3Rnbk9jelk4SUJqd2hBeFVxeHNVQXdRREJDbCtud3lOY2pmVEtJWEFxS0dCUmNaREFLQWZUNVVBK21xRlBwalpSYVhCQU1PRWhTNHFLVTJxS1UySUVOcWtVcHRLQlRhZ1EyS21DR3cwV2N0RU5oMlNITVUrbWRrQ213N0taWENac1VpNElmVDVRcFRadXBuRFdNcG14U0NaOVBoS3FaczRVQ0czaEZJYk95S25pUTdxWlhDWnRkUVR1c0tLbWJkR1VWTTJLS1hFN0lQSlllSzdZY09RNHRjcWl3dG9vR0Z2REJhd3lxTGV5Q2x0cDdiS3BoVzIxK2RrRkJhdFl3emxRV0ZDcUN6UmtTNE9MRlVxb3NRVUZpdURLZ3NUQ1p5b0xPRlVPTE9FS2NXRFpYQms0dDRWakp4WWdjV2dhSVU0dEd5SVlXdWhuQnhad3FoeFlnWVc4T2dZV25aQTJCMlZUNG5IcDdwVUhCQ213UU1MQ3FVUjZhSlREMHdnWVdEWlV3T0kyVWdaaWtCeEtzQndLSWJCRkhCUU1MZUZZbGJEaE1HY213T3lmRStBNEZDamdoeWpnbEJ3UWpZSURod2hCeDRWQnc0Q0RZcUtPSlFiQkV3T0tLMkJRbzRGQ3RnZGtLT0IyUXJZS0ZIQkNoOU5Vby9UVUszMHlsQXdRSERoQnNDaEF4S2hHeFQ0ck9Sc1RzZzJKMlFiRTdJTmlkbEJzZUVVTVVHeFNMUXdVR3dDRmJDMUNoZ0V5WUREZ0tEWW9GeE95SzJKUURIaEFEYWhDNEJBRFlpd3VIQ21jbU1CZ2RrYURBN0ltQXc0VWlsUHBwQ2x3U0xTL1RRS2ZUVUMvVEd5UUQ2WTJVeXVDSDB4c2lrTmhDaGdwdFVVaHM0UlNHMUFodFJTR3poUUlmVEtLUTJIYnVvcWQxaWlwbXdxWnlFTmlMaktaOU1LS21iTmxGVE52Q0ttYk9GQWhDbWNLbmRhZndVVkkyb1NsYjNVMFVpdkdGcTcxd3FndFZSWVc4Smd5Y1d1emFxb3RiYVB2VlJRV3BneW9MVldjckMxa0RpM3VpS0MxV0lvTFZZWnlwYmJSRXFvdE5LcThoeW5GcFZRNHNLcUhGaEtxS2owMUtIRmlCeFlnY2VtRVNtRm9FTXFoeFp3cUhGaUJ4WndrUy9Bd3RWaUhGcVl3b2kxV0liQkF3c0NwbkJzUnNvUWNTZEZjcGd3c0taTVpOOU1vRytueWdPQ2xEWUtvT0FRTmdOa3ljbzQ4SVp3T0tFSEVvbzQ3SlVnNG9vNDhPcWc0Y0tBNG9EandnT0tKeXRpclNEaW9zYkZTTFJ4Q3FRY1JzaG5EWThJUWNlRXdSc1VpOHpZb1FXUWpZOElrdzJQQlJjeHNUc29zSEhoQnNUc2xTRGlnR0NBNGhGYkVLRFloRWpOd2d6Y0ljN053aXMzQ0FNZzJLRFloUURIc2l3TVVHd1FnZlRPeUFZSFpSYUdCN29OZ3FCaHlwRmJBS0lHQTJSUXdHeVF1V3c0UlNteFJjRk5xSURLcURicVVnWWhDQWJPRVVoc095Wk1GdzdLS0JzS0JmcDhzb3BUNmZzRW9VMktLUTJjS0JUWU5rTVpoRFp3b3ZPUTJNaWtOcWl3aHNVRXpheXFrTnFpeE0yY0lFTm5DeTBtYk9GQk0rbVNpcG16ZFJVelorS2hVallpODVEWUNwVlN1dENLbWJSUmxCUEVQUlppMTR3Qzd1Q290TVF0TXFDMG5SVXExdHFGVkZsRmNKbFMyeWlxSzIyZGdsUlVXRFh3UkZiYkJzbVRHVkJZQm8vQzBpZ3M0VlJVV0pFVUZxc0RpMUV5b0xGVTVUaTNaSUhGaW9vTEcwU0ljV0hRS3dPUFRLWU1udzZLcGt3c1JLY1dJR0hwcTBPUFRDSWZFRFJTZ3R3cVF3dFJEQ3hSVEN4S1F3dFZRY1V5WU1MZUVJSXRlZ1ZEWUhaUmVRUllxbE5naVVSWUVLT0k1U2c0alpBY1JzaEJ4UWdpMUZnNHBnemhzVUJ4Q0lJdEhWRkhEaEVvaXc3SlJzT0FsQndLVlJ3NVJLMkEzU2c0RGxRbzRqWlZLMkkyVXl1R1liS296RFpSV2JoQVc0UVpnaThyTWlNeUsySVZSbUNpdGoxUUhIaEJzRkl0YjZaNFZoV3c2SVZqNmFGYkJJVU1Bb3JZQlZHdzRDQVluWlJXWWhFWmxNWVhJTWhHWUpCc2VFV3RnK25pb0I5UGhER1FQcCtPaUtIMHlvdEtiTnlnR0NEWWhRZ1lEWkFEWU5rQXdRS2JObEdpWW9BeUFZaFFMaHdxRndPeWpSVFp3b3BUWWRVUXVDS1UrbXNxbWZUVm9VMjdxS1EyQlFxWnM0VXl1TWtOcWlrTnZDR01wRzFGSWJYU0Nac0tpcEczaFJVemFwRlROaEZGRlNObkhaUVR1c2VWT1plZEkyNkl1RXpaQ0xoUEZTTFhqaTNSZDNuVkZ2WldDZ3QyVnhoTXEyMnF4RnJiVUZSWXlyT2NxMjJjSUsyMkxUS2dzVkZSNmFDZ3NWUlVXVVJLY1dCRVVGbkNxS2l6aEE0dENFT0xTVlVPTEFnY1dyVVEyQ21ES2c5UGhWTGc0c1FOaHdpbXhLVkREMHpxaG5KaDZZM1JENEJDbUZnNm9sSEViT25LcHNlRVF3c1ZJYkJBY1VCeFFnaTFET0RZOEZDRGdkbFFjRUJ3VXdaTUxGU3RnRktEZ0ZVb2kwZFVLT0EyVW9PSEFRcHNWVWJIbFJSeFFqWXFvMklVV0RpRlNOaUVnekRaUlJ4NFZRY2VFSTJKMlNLT0pTRFlwQnNlVUJ4Q1F5MklTR0J4R3ltZVE1Mng0U0RNaGpETWl4bUNKQlpBTVFnT0kyUld3NFVHd1ZHdzVVbzJHNVNnWUhkQnNFbzJIRHFWUXhHeURZQlJXd0dnQ3FCZ29vWUlCaWl4c1NoR1k3SVFNZUVHdzRVQXdTaGZwbFJRUHBvWXlIMHdoUzRCVC80di93QkRBYktLR0kyUURBSWxLYkVVcHRVVXVLQlRhaWxOZ1JDR3hGeFNtd3FGSWJPRVVoc1VDbjA5bEY1RXpaM1JTR3hSVXo2YW1Wd21iRkFoc0NMeXBteEZTTm9VQ0d3S0xoRTJ0MFVhVE5tcUNKdFpSVXphNmlvbTFGSmlvcnhyYk4xNkhuV0ZqNlFyaEZSYTJpQ3R0bkNJdUxXcFZYQ1pVdHMxVlJZV3Fvb0xWVVZGdkNvb0xEc2xSVVdIWkVxZ3NLQ2dzVlRLZ3NWRkJZNkljV0FLMUZCWndnY2Vud2xJb0xGVXprMktKRGkxS1F3c1FNTEVEaTNoRU1MZUVYUElZV0haVkRZSGRBdzlOTTVNR3c1UkRDd0lEaUZRUllnT0lRTmloUnhSS09LR0J4N29jNXNVR3g1VklPTzZnMklRTUxlRlFjVHNrR3hPeWtYQWl3cWc0RXBBZnBuZEFjT1VSdnBoRkhBSURnRXBHRm9UQmtjZUVJMlBDRFloQm1DTERNaEdZN0tVSEU3SWxiRXBWd09KU25NMkNVck1FcEF3R3lVZzREWktOZ05rcEJ4NFF3R0tpdGlOMEkySVFiSGxDTmlnMkpUSTJCMENISTJKVUd4Uld4UkF4Q2l4c0J5ZzJBUWJCVElHUENaTUFRZ0RJb1l5aDhBd1FERlJZR0o2cW96RlFBMm91QzRncUxuRUEySVlBK21pVXA5TXFaYXhrTUNpRXhVeTFnTVFnVTJBcUJUWWlreFFLYmU2QlRhaWtObkNaTUVOaFVqUkRidXBCTTJKQWwxaENpcG0zaFRPRlR1OU5Gd21iRkZUUHBxQ1JzUmNaVE5pTFVyckZGU3V0R3FtVlN1czJVWENKdFV5cE1aVUhqQ3dydTRLaXh0VmFtVnJiTjBGaGFleXVFeXRiWU5sVVZ0dGZvZ3RiYnd0TXFDMVVWRnFJcUxVUlFXcW1WQlp3aVJTMnc3S29xTEcwUkRpd2xVcWx2cHFsVUZpSmFZV29oeFlvcHhZRlVOaU5naUdBVmhUQzA3SVU0c1FNTGVFUTJQQ0FzaXdjVlVoc1ZRd3M0aFFIRGhYbVRuTmdmOEFDZ1lXSGdJRGdkMFFjRVVjQWtCRm8wZFdBNGNJR0ZuQ0FpMUVqQzNlVVVjUkNFSEhoQVdRYkU3S1ZSeE95ckk0bFNxMktVSEZLTmg0cFNqaU5sS0RpTmtvMkEyVEJrY2VBZ09KNklOaW9OaXFOanlnMktBNGxNbUd4S2xWc1NsQnhQQVJLMkI0U2pZOHFWV3g3cFJzRTVUa0hEaFVyWWdhS0x6aGlOa0xCWWJLMUF4NVFiR0VvR0pSV3hLWEJ5c3hTa0RIaEtSc1VLMkNGWTI3S0xXeFFiRW9BMVZGRERnSkNoam95TEdZZUNobkRZOElrQmhzaEFJN3FMQU52Q29VMkZGd0JzT3lrS1hFcEZERklSc2VGSUZOaUJUNmZDQkQ2YW1Xc0JncWxLYkZsU214Q2tObkNqVktiR1JLVTJoRGxJYkVWTTJiS0tRMjdvcWQxaWdrYlc1VEs0VE5xZ2tiU0ZscE0ydWlvbTFTcWxkYjRKbGNZU3V0UXdqZGF5aXBYV0tMVXNTbzFYa0MzWU91enpxMjJIWlZGN2JDZWlHRnJiR1ZTcWl6bFhDWld0c0dpdUV5cmJZclVWRmcyUkZyYkJzaUtpM1pYR0RLZ3RWUlVXb21UZ0t3VXRzVlRLZ3RSREMxQ0hGcUdUaTNoMFE0dEowVndad1lXSFpBNDlNOU9GUlFXZmVpR3dDUW80cW9ZV1NnWVdEWjBXbUZpcUNMZUZBK0pWUWNlVUlPS2l3V1ZnT0oyS0VIQTdLNXlZd2JCQWNRcFNEakt0UWNKcXMyTGFPQ3RTdGdBZDFDbXhHeVVIR0tKUnNkNFVVY1R1aVVjUXFNdzZvQ3lJTGNJUUFPRkdzNEhFN0lDTFNxallvc0hIbEVqQzBhcUxHeENFSEVJUm1HeUVaZ2dMSU15RVpvU0hNekpCbVFnc2hHYUhVV05pVXlSc1VTTmlnMkowUll6SFpDTWJUc2d6SFpDQmp3b3JBSmd5eklrWmtpaXlad015VEl6VFJBTVVBeFNyR3hNcGdnWW5aQnNlRlViQkl0YkJDNEtiUEJSYUdIS2N4enRpZGxVREZsRmJGUWJFZE9VeVlERkFwc1VYQlRiM1JTa0lBeWl3ckltY1FwdDRVVWh0UlNtMDdJRU5xa1VwdFVPWWhzUUppVkdpRzNoVUliT0ZLcVpzSVFJYmV5Z2tiRkdzWlNOaWhValp3cGxVcnJWRlR1dDRVVkUyc2lwWFdxS2diVzZLVllUQ2FwU1BGdHRYVnhYRnFvdGJhckU1MWhidXJobkt0dHJyVVJhMnp1bElyYlp3cWkxdGhSRmhZZWdWd2lnc1Z3WlZGaVJNcUQwMVVVRmdDQ2d0VlJRV2NJSEZvMlZqSnhhVWdjV1VSVGl4RWg4VlVGdUVpbUZoMlZRd3NRT0xEOXlGTUxEOTZGTmh5bFEyQVF3TEJBY2VGUVJZb3VUQzBCS2tNQWRFcEdaS0N5bFdDeWN5YzRpM2hVSEVxRkhGS2dpM1JBY2ZKRmc0OHFvMk81UWJFS0xCeENFWmhzZ0xEWkFVTUFneUtJQlJHeE95UmFPSlZSc1NvRGlVR3hRSEZLTmg3QkN0Z3BSc0VXNUVXb05pQkxvbktPTUlZYkZGYkdBaDhXYmRCaGFrS3pGQm1QM0tOTXhWUnNTR1JXWkVabE1yaG1QUkFjWUtxTmlOZ2dHQVJXd2RRbzRiSzFBTmgyVVZtYlJXcEdaUldZS1FCa0dJRG9ZdzJJVkF4NVVVR0txTTNDRUJrVU1lNlVBMitDaTRManloQXhPM2RBR0tpdGlpQmg5enFMbkpUYjJTaFRZaS83aTRxTFF4Q0lYQUtLUTJLQlRZaWtOcUVLYlZCTTJwVmladFJjRU5xZ21iTmthd2tiV1VpMU0ycUNOMXFLa2JWRlJ1dFVoVXJyVkZSdXRSVWJyVkZxV01xTlBJdHRvdXpndUxSc3JoRjdiZFdXc1laeXNMZUVGcmJZUk1yVzJxNFJhMjFWRlJhcmhNcWkwN0trVUZuQ0N3czNDdkl5Y1dub2dwYjZaUXpsUVdKaE1uRnJxbk1vTEVvb0xCc2lIeEd5SEtJdDRWU0hGcm9waGIyUkRpM2hWQkZxWXlad1lXaENHYmhBY1RzcUd3UW9pMUNpTFNhcVVOalJLRGdpVWNWS0RpRUJ4R2dRRmtCWlV4aG1Rak53aXdVU01oQnhPcUsySlFIRW9YQTRvallwUWNmSkFjUWhobVVvT1BEb0Rqd2cySjJRSEVvUmhhZGtNdGlka0d4S2lqZ1ZZTmlVTVliRTdvUnNESG1nMkJLYzV6RGdVR3dKUUhBOElOaDBRSEIwbzJKNnBSc2VFb3d0NFRCbHNmSkNNeGZWU3JHNmhWSXpCUlFZYklNQUVNc3dRWnZGRkRFb1ZtS0RNVVZtUWpOQ0ViRWJLVWdZZUNEWWRHUURFcFJtUVpsQ3MzZEFNUnNsR3dqM0lCaWxJRGJxa0RIWlF3R1BDTHlGeEVvb0cxbEFGWWdFQ2l5cFRhZ1UyK3hSYVFoRktSd3BGS2JVaUVOdlpSYW1iV1JhUWhRSmRiMlVpMU0yOEtpWkNnbWJlRVZFMnFOWVRJVUViclVWSzYxU0toZGFvSlhCUlVMclVWTnBRcnlyYlYwYzE3YkZhTDIydXJ6TXJDd0lsWHRzZFV5c0xkbGNNNVd0dHBFcW9yYmFxUlcyMUJVV3NpS0MxMVV5cGJZaGxRVzhLcGhRV0haRVV0c1AzcW9jV0lHRnBLQng2WTNRUGdOVlVwOEFoZ1JZTm5RTXdWUVc3S0tMS29ZQTZJZzRsU3JqQmdPNlVnNGxBUmFoa1dSRFkwS0VIRkNOaXFvNHFGYkhoREFpMUtaSEZBUllFd1p5TEFHaUlLVWpNZ0l0SlFIRkNEaHVxTmlvc2JFSkFSYWhrV1FacFpBV0tISXpJRGlnemRZUXJBSVpGa0diVGJWQ015QXNoQWI4RVVVU00zM0lyTjk2SXlLM3NVR2tGUWpONElSbVJXODBJTElrWnRFcWkzSFpLakFKVElZNnFMV3dFb1ZzQnVVR3dDRnl3czJUQm1oaWRrUm0wb2k1dzJpRVpnZ0RJTVFtVEFNVzl5aThqTTJpSzNaVkFiVlJRTnZLQVluc2tLQ0l5UVp1NmtVR0NVZ1k3S2hUc3lBTjl5RkJwYXFLVEhsQXJNcEZDRVFEYU5GQWh0UmFRanlSYVZsQ0ZOcUNkMXFpcGtLS1FnRkRtU3V0VVZNaEZUdXQvRkRDTjFzcUxqS1pDS2hkYW9xVndVRUxncEdrYnJWRndqaWg4SG5XMjhMb3hsZTIwN0tzcjIyRktpOXRoVkZoWm9sUmEyeFdwbGEyd0tvcmJZTmxVcXd0QTBWVG41MUJhbUV5c0xRQWlIQVZGTGJWVXlvTGVPaWdabFE0dC9CVWh4Yjl3UkRZb21NSEZ1eUtZV3FvT082Qmhic2lHRmlVRVdpWVpTcmtjVUJZT2dJdEtxUTJJMUtFRUFiZEZGaklHYmhWQkZwUXkyS0tMSWtGa0J3T3lBNEZBY0FoekNMUnNoekRqOTZpaXlxTXlVRnVFR1pCbVJZTFZTSXpkMEdZS2pNa0c4dGxGYmhBVlJwUVpDTXlETXBneXpiU2hCWktSbThFVm1hcVZPZG04RUdiVlRtVzBXR3F0Um0vQlJXYmhLQ3gyVlJtVUkzZEZaQ0NoR1JJeklyTXBCdWlvM1ZRWkFLYUtLeW9LSUVhcUt6QlZBTnZMS0tCQlFCajlxcU1nQ2k1WmtLRFZRQlVaUlFaOUVBYlpDQTFYUUJJQXlrR0lIWkFHMUN0UXBHNkJTS3NpNHlCdDdJRU5yZmNwRm9JRk5xZ1FpdkdpTFNFZmdpMGpLTGtodFFUTnFoVXlGSXFkMXFDUkZZVWFTSVFSdXRVWEdVaUZGUnV0VEs0UXVDeXFGd1NLbTBySzhyZ3RIQzZZdzU1V3RDcVpYdEN1RVh0dGhET0Y3YllXbVhUWjZIcTNCN2ZUdXVCL2lBTExPZHBweHo1dzFqWjZzODJNdW4wL3dCSCtwdmZEOVA2dDdWQXNKK0N6bmlObnA1OVdPbkRXTmh0TlhOcHowWmRObjdkK3V1TFcvby9YdUpvQjZkeis1WXp4bXh4aS83OVBUaGNjSnRzNW4relYwWmROdjdUKzVhL3QzNm4vdXIvQUxGai9JY052TkhheDF0LzBQRWJ2VjJjOVRwSDdIKzhRMzdSK3NPMytnOVQvTldmOHJ3bSswZHJUMXRmNHppOTFyN09lcDBXZnk5KyszaDdQMlg5ZmNON2YwM3FuL21yR2ZPZUIwOCszMmVQNTlQVzFqeWpqZFhMalliVHNhdXAwV2Z5MSsva2dmN2ovWGg5VCtuOVFEeE5xbWZQT0F4K3ZzKzNwNjF4NU54K2VUL28yblkxZFM0L2xiK1l0UDJUOWIxK2pmOEFZcy81L3dBdjMrejdXR3NlUmNmdU5mWnl2Wi9LUDh5WEJ4K3kvcXUvcGwvQmM4L2NYbDJQMTlIUzZZKzMvTU0vbzYraGYwLzVPL21XOHNQMmI5UUN6emFMWDhTRm5WOXplVzQvWDA5SzZmdHp6SFA2T3BVZnlYL00vd0QrbjlhT2JmOEFPV2ZWSGxtKzAvajFOZW1mTXR6cS9Eclgvd0QrRi9tcXYrNkwrL3FlbC9uckhxM3l2Zlk2TlhVM2o3Vjh5M09lblQxcTJmeUYvTmwvNWYyZy93REc5YjBSNFA2Z1dkWDNoNVZwL1c3dXZ3dGFmdFB6UFA2UGUwOWEzOXYvQU9iZi93QlQxLzAvNmY4QTFpejZ5OHAzM2QxK0ZmU1BtbTU3Mmp4Sy93QnUvd0NiR0gvbDFrNmZXOUwvQURsejlhK1ZielBaMWRUcDZPOHozZU8xcDZ6Mi93Qk92NXBOMkovUStuYnZjZlc5Tmg0WEVxWis5dks4WTVOcG5zNnVveDltK1o1L0pqdGFldGIrMi84QU5Bai9BR2IwQi8yMXF4NjM4c3orYlYyY3Vub3p6TDVkUGF3cFovVFgrWjczZjAvMDFoMEI5WUgzQXJPcjc1OHN4OGRXZjVXdFAyVjVqbjRhY2Z6SEg5TXY1bllISDlLeC93Q3RwLzdLejY4OHQvNTluK0sraVBNUCtQVC9BQVhIOUx2NWloL1YvUkFtdHA5VzV4NFdGWXo5L3dEbDJQaHRPemp4TitodVB6OGRIVG5xTmIvUy93RG1Fa2Y2YjlDSmJJK3JmOFBUZFRQN2dlWFkvTHRPakhpWEgyTHgrZmpzK25QaFVIOUxQNWdmL3dDOC9id0puNm5xdEgvWkxuN2hlWC9KdGVqVDQzVDBIeDN6N1BwMWVGUzMrbGY3NFRkbit1L1FXZ05TNzFibmYvc3dwcS9jUGdmaHM5cDBhZkZsZFAyRnh2eDE3UHAxZUZUKzFYN3lCLzZoK2lQUStwL21MUHVId2U3Mm5kNjJzL1lQR2J6UjN1b3cvcFgrN3Y4QU4rNC9vN1JvUjlRdi93Q3dGTS91SndudzJXdnU5YTQrd2VMK08wMGQ3cVYvdFQrNW1uN24rbWl2eTMrOW1XUGNUaHQxcjZjTmUzL0U3M1IwWkVmMHAvY2lRLzdwK21BSnFMYnlaVXorNG5EYnJYMDRYSDJCeEc5MDlHVmgvU2o5WFQvZkhvLzkxZC9uTEh1THNkenE3V09wdjIvMjIrMDlHZXRoL1NuOVdmOEE4dDZMN2ZTdSsxUGNYWTduVjA0NmoyKzIyKzA5R2V0YTMrbEhybi84MVlOeDlBeC84eGMvY2JSdU05cjZYVDIrMTcvSForcGovU24xbkEvMzFZUVlmNkJyL3dCNG51Tm8zR2UxOUo3ZmE5L2pzL1VzUDZUWE1IL2ZRQ2FqL1pvSC93QTBMR2YzSHhlVGgrLzlEZVAyOXpPWGlPNTlUZjJtSkxmNysxbi9BTUxwL3dCOHA3ai9BTnYzL29QYjMrNDduMW5zL3BQWTUrcCsvWE5vMzZZVysvMVNzNnYzSHo4T0g3LzB0YWYyOXg4ZHYzUHFQL2FqMFhQL0FKM2ZWdjhBb0IvckZuM0cxN2pIYXo0V3ZiN1J2ODluNmhIOUovUmRqKzkrcEd2K3pqL1dKN2phOXhqdGZTdnQ5bzMrZXo5VEQray9vQmlmM3U4aU1oOUFEenpLWi9jYmFmRFlZN1dlbzl2dG52OEFQWi9pcC9hajlHLy9BS3Q2MVA4QTRWdjJySHVMdHR6cDZjOVRmdC9zZDlxNk1kWWorbEg2TjJQN3Y2NGYvcTdmdFQzRzIyNTA5T2VvOXY4QVk3N1YwWTZ3UDlLdjBRTEg5NDljUi84QUN0ZjNwN2piYmM2ZW5QVWUzK3gzMnJveDFyZjJxL2JQL3dCbitxZHRyUGN5NSs0dkU3clIwNWI5QWNQdmRYUmhqL1NyOXJIL0FPVC9BRlZXZkd6N0ZQY1RpZDFvNmNyNkE0YmU2K2pEZjJwL2EyLzlVL1V2d0xOT3llNG5FN3JSK1BXZWdPSDN1cm93cGIvU3o5bXhlNzl3L1czWGF0OU1lV0JXTS91SHhsNU5ucys5MXQ0K3dlRW5MdE5mZDZoL3RaK3luLzhBdi9yWGZmMDkyL3dLZTRmR2J2Wjk3eEw2QzRUZWErNzFCL2F6OWxsdjNEOWFTS1Q2ZitZcjdoOFp1OW4zdkVub0xoTjVyN3ZVSi9wWit5bW43aCt0ZUlmMDlmOEFpSjdoOFp1OW4zdkVlZ2VFM212dTlRZjJ0L1ppVy8yLzlhK2srbjMvQUlFOXcrTjNlejczV2VnZUUzbXZ1OVFuK2x2N0xiWDl3L1dlUHA5LzRGUGNQamQzcys5NGowRHdtODE5M3FFLzBzL1pSUDhBdkQ5YVFlZlQxLzRpZTRmR2J2Wjk3eEw2QjRUZWErNzFCL2EvOWxrSDlmOEFyUTM4VCttM0JteFgzRDQzZDdQdmVKUFFQQ2J6WDNlcFgrMTM3QkFQNno5ZUNRNy9BRlBTOTMwdml1ZWYzQzQvNU5uMGF2RzM2QzRINTlwMDZmQzM5ci81ZmRqK3MvY0FZTGZVOUwvVXFlNFhtSHliTG8xZU5mUVhBL1B0T25UNFcvdGYvTHpUK3MvY0dQOEExbnBjZjlTbnVEeC95YkxvMWVNOUJjRDgrMDZkUGhFZjB0L1lDeC8ydjl3RDArZjB2OVVudUZ4L3liTG8xZU05QmNEOCswNmRQaGIrMS84QUw3RnYxZjdpZiswOUwvVko3aGNmOG15Nk5YalBRWEEvUHRPblQ0Uy8ydS9ZV1A4QTR6OWYwUHFlbC9xazl3ZVArVFo5R3J4bm9QZ2ZuMm5UcDhKdjdYL3kreFArMS91TWY5WjZYK3FUM0I0LzVObDBhdkd2b1BnZm4yblRwOExmMnY4QTVmOEEvd0RML2NIbkgvU2VscC8yU2U0UEgvSnN1alY0ejBId1B6N1RwMCtFbDM5THYyTmhqK3UvWFdscGUvMGk5S2Y2TUxXbjl3dU8rT3oyZlJxOFRPcjdDNEw0YTlwMDZmQ0g5clAyYi84QVlmcmVDL3ArN0JYM0Q0emQ3UHZlSm4wRndtODE5M3FBL3dCTHYyYlQ5ZjhBckNXa1A2ZGYrUXI3aDhadTluM3ZFZWd1RTNtdnU5VGYydS9abS84QXYvMXp5Q3g5UC9NVDNDNHpkN1B2ZUk5QmNKdk5mZDZtL3RkK3pNVC9BTGYrdE9vbjAvOEFNMVQzRDR6ZDdQdmVJOUJjSnZOZmQ2bS90ZCt5cy84QXQvNjNrUDZmK1pLZTRmR2J2Wjk3eEo2QzRUZWErNzFOL2E3OWxqL3gvd0N0OGZUbzMvQVQzRDR6ZDdQdmVKZlFYQ2J6WDNlb1A3WGZzOGYrUC9Xa3M3ZyttM25ZbnVGeG03MmZlNnowRndtODE5M3FLZjZXZnRidVAzUDlXTFpZWTJFKzVieCs0bkZmSFphUHg2Mk0vWVBEZkRhNi93QU9vdjhBYTM5cnIvdlQ5U3hEZ0czMHg4RmZjVGlkMW82Y3A2QjRiZTZ1akFEK2xuN2FXLzhBTlAxTGsvNGJObjJUM0U0bmRhT25KNkI0ZmU2dWpBWGYwci9RUDh2N3Qrb0FPaDlPd24zaGJ4KzR1M25Mc2RQVGxuUDJCc0x5YmJWMFlKL2F2OUVJL3dCNyt1Ly9BUEZhM3ZWOXhkdHVkUFRucVQwQnNkOXE2TWRZaitsWDZLUC9BRGIxd1RwOU8ySTZwN2k3YmM2ZW5QVWVnTmp2dFhSanJKZi9BRXAvVHY4QUorOCtyYUcvaTlHMHoveXd0YWYzRjJrNWRoanRaNm1OWDdmN084bTJ6MmNkYVkvcFY2SkQvd0MrNytmOUFDMy9BTXhYM0YxN2pIYXo0VTl2OUcvejJmcU4vYWowQ1A4QTF5L3A5QWY2eFBjWFh1TWRyNlQyL3dCRy93QTluNms3djZVMkZoWisrRUE2bjlPQy9UL1NCYXgrNDJyNDhQMy9BS2NzNS9iN0h3Mi9jK29wL3BRUVAvWGYvd0RWK3oxbHIzSC9BTGZ2L1F6N2ZmM0hjK3NwL3BVWmI5K24rRUg5S2E3ZjlLcmo5eHY3ZnY4QTBIdDkvY2R6NmlmMnE5YVAvT3JPZjlBZjlZdCs0dWpjWjdYMHNlMyt2ZjQ3UDFFL3RYNnBwKzllblIvK2hMZisrcjdpNk54bnRmU250L3IzK096OVNYOXEvd0JaUC9tL291UCtydSsxYjl4Tmp1ZFhUanFZOUFiWGZhZWpQVzM5cXYxcGR2M2YwSUxIL1IzYWY4WlBjVFk3blYwNDZqMEJ0dDlwNk05YUovcGIrNXYvQU9wZnB1dU4vd0JpNmU0ZkRiclgrREhvSGlON3AvRVA3WGZ1TE9mM1A5TU9jYi9leWU0WERiclgwNFBRUEU3M1IwWlMvdGQrOEVPUDEvNlBIU2ZVL3dBeGI5d3VEM2UwN3ZXeDZDNHZlYU85MUIvYTM5NWRoK3YvQUVRMHI2bitZbnVGd2U3Mm5kNnowSHhlODBkN3FTdS9waCsvQjIvV2ZvQ0IvbCtxRC84QVM1VzhmdUR3SHgwYlRvMCtKeno5aWNiam0xN1BwMWVFRC9TLzkvRnBQKzAvdDVPdG85VDFYLzhBcEs0L2NIeS9QNU5wMGFmRW1mc1Rqdm4yZlRxOEtYOXNmNWhML3dDbC9SUWYvaTMvQU9yWFQxOTVkL3B0T2pIaVo5RGNmL3JvNmM5U1YvOEFUWCtZN2FIOUplQlUyK3FZOGJRdGFmdnp5N1B6NC9sL2l4cSt5UE1NZkpuL0FQZjRGUDhBVGY4QW1RUTM2YXJmOUx2L0FNVlgxMTViL3dBK3ovRlBSWG1IL0RwL2dnZjZlZnpNSC84QUQramN6dVI2dHE2ZXQvTGZtMWRuTEdmc3p6SDVkUGF3VzcrbmY4emluNlgwcnovaEhyV2ZFaGF4OTcrV1ovUG5zNVp6OW0rWlkvSmp0WVNQOVB2NXBnSDlCWngvcHZUL0FNNWI5YStWN3pQWjFkVFBvL3pQZDQ3V25yU3Uva0grYWdXSDdhTDRxUFg5QnA2M2hheDk1ZVZaeC82eitYWDRXYy9hUG1lTS93RGwzdFBpU3Uva0wrYXdELzVTWXEzcmVnZkw2aTFqN3c4cXp5ZjkzZDErRk0vYWZtZU9YL3E3Mmp4SW4rU1A1cEgvQU9JdkgvYWVsL25yZnF6eXZmWTZOWFV4Nlc4eTNPZW5UMW8zZnliL0FETUNSZCswZXE5dXhzUG1MbHJIM1I1Wm5sLzd0UDQ5VEdmdHJ6SEdmL0hWK0hXbGYvS0g4eVdzL3dDeit1WG93Qjl4VzlQM041YnEvWDAvajFNNSszUE1kUDZPcjhPdHpuK1ZQNWpmL3dCSC9WZjhoYTlSK1hiL0FFZEtlbi9NTnpxNkVUL0xQOHdpdjdMK3MvN20vd0N4Yi96M2wrLzBkckRIK0Q0L2NhK3psRy8rWFAzNjA0bjlrL1hFN0Q5UDZoOTFxMWp6dmdNL3I3UHQ2ZXRuUGszSFkvUTJuWjFkVG52L0FHRDk4dEQzZnMzNjYwYm45UDZvL3dDYXRZODQ0TFBKamI3UHQ2ZXRuUGxQRzQ1OWp0T3hxNm5PZjJiOTNZay90WDZ3QVZQMFBVL3pWci9LY0pubTIyanRhZXRuL0c4Vmo5TFgyYzlUbXUvYXYzR2YvTC8xUC9kWC9ZdC8xL0RielQyc2RiUDlEeEc3MWRuUFU1aitoL1dBbi93bnJCb0krbmRIa3Q0NHZZNTV0ZW5wd3huaGR0OGRHcm95NTcvMHZyMmxyL1E5UzA3RzBqNExXTnZzODQ1TldPbkRPZGp0TVo1ZE9laHkrcDZWOWpaMlhXdnVHVzlPckdybXpoTTZjNDU4T2U0SWlGd1JVYmdzcmhGcFNLL1NQcC90SDdWYmM5djdaK2x0MGowZlRIL05Yd1BWNWp4V2NjdTExNS9tejF2dVdueS9odFBOczlIWngxTzMwdjJ6OXZ0dUJ0L1EvcDdUTWowN0Eza3NaNDdpTTRtZHBxNmM5YmVPRDJHTTNHalQwWWR0bjZIOUlHUCt5ZWk0bTM1QTc2YUxubml0cm44K3JweTNqaHRsajh1T2pEdXQvVCtqSCtpc2ZYNVJIa3VmL2JyL0FOYzlMZU5scC8weDBPdTIxbUIyZ3JtNk9teTBnQjQyVUhSYmJwWGJRcUtyYmFkU1dmeVFWdHRQeXRYUUg3a3F1aTIxNFp2YjdWQllXNkNBK3lnc0xUREdLTWdZU1NCMlpXQnhhUVEwZys5S0tnTVJYN0ZBNHRKZmh3N29IdEZPNm1Rek9IRWcxS0tZV3NRR2cxNm9oc1hJTnhJWi9Qa0lLTUJBa25UMkNnQXRZZjRoQVlRdzFWb2NBZ00wN2pud1VVV053STNpVkJtSWdIeDA3S2tHU0NScng1NklDQWJ0R0dnTW9wbWNBOFFTZ0dGekNrU09xQXV4ZDZqV1BhcUFzUU5SUWN6cWdPSk83UTRNZmVnYkZxQnh4NG9BUnBJQjFvemZnZ1lXOGttZWlET1RJcHFaRmFVUWJnQ0JUelFZM1VBTHlCNHBFRWs2czRsaHY4RVVDUUhZc2RIb2dJb0E4eDI4VUFEZzhieE82RFBkc2VkTmUvdlFHanZvSUNBQTNrQmhXcGtvTUJRMWN4dHRWQTBuRVFmRGtJTVFaZXZmUktNYklORE9wMzI4VW9BQURoOUErbW4ySlFSYXpBa1BvWTNwVktOak1XaHRlbmRLQTM1ZFhOUS90b2dhSkxrQm5HeWdOQTgwbCtVQUF0ZjhvSkJnZEVHMG0xMk1hb01RSUxWWUViYWhBYmJRQkFqVTBRYkVQM21Vb1hFQzF6OHplUGVxVWFIaTBCaTdvTXdBeUwyaXNRZTZvTjF1alBQSVVvd1ozaVRYbW5LRFlnTnVkZHRkRUFZdzRsNUkwVkdhMzhwM2dQeWcySmdPWnA0YXBSbW1wQjFKMkhnbENzWEV5S0U3TWRPeUFrQjhYNVowR3dKMTQ1U2pNeGlsUzBzZ3djbHd4RWpKdWlBbVJJQmZSQUlOMFYxWW9NQ0FETDhuVkFvSkRCM1BqRlZVYTNFVWUycmluZEE1TGNiOTFGQVRJR013Z1c0QVBKY0F0dHNxakFOSWdPZmw2MWVxaWppREp0cno5cUJUYUdEZ3dYTUE3blJBSjFxTFhKUUM0T1RFYXRKUWFnR3cwTzdvTmlCSURrNm9FeGhyYXY4QWw5L3VWR2E0RURGNGtqUi93VUFaMkpreSt5QUFYVUpqTFNlYThJakFFaDIwOW9RaFFjclM0eC93elBpVVFYRndKQTJjdXlLVWk2USs3T2lBYmFXa1lrQ05RZUZRcGRpekVNVkZUeG1yVHJ2MVZRT0NLVkNLVEdQbEJFZmxaS2laQlpoT3cwZnFxRXhMa3kwZ1dvSjNEWWN5VlFwZnNOUzJrRklKM1dCd0RNMVVDWFdrMDBoMEhOalc3V1c5Z3RDVndjR0R1NkNPSFZ2dFJJaDZsb2M3dElmZE1JaGRiVVUyOEZSeStwWlpkYTF3RjFwMHVEaGF4bk9NM0NaeGpQTzVMLzAzb1haQStqWmMvd0NZWWd2NUxwamJhOGMyclBTeG5aYU04K01kRGp2L0FFUDZNdjhBK0Y5RmpYL1IyMDhGdkhGYmJINTlYVGx6L3B0bG44bW5vdzVQOTJmdHp0L3NINmZyOUt4dmN1bjlkeEc4MWRyUFd4L1JiRGQ2ZXpqcVZzdGVlMUY1YzVlcDFXVzYxM1VvNjdSdzdlOVFYdEJndjNTcTZiTGE2NktWWFJZS1U0RlZFWHRtSWNlM3hSVmhiRTBlVXFyMlcxSmdOVlNpb3RlZ2FEOWlsRjdRU1F4alErOVNpZ0JOSWtzRlE0a01KSnB0MVNpZ3RlQ0dJa3FVTmF3dGNTR2pzcUtXNnpOMUFkblVvWmhhQVRTSEk0VUZNV2MwcVNaanpTcWJXS2dPaUd4QmNFeThOVktDQTVoMjVIbTdLVU93TEVpU2xVSkltTFNXMCtLQWdOMEZSYkhWV3FObzAyMDYwU2pZQUM0Znd1NXRTaG1IeW5rbDlqNUpVTlVHQlNYNGJoS29XdmlBUmoxaUVCeGwzYzZoMlNoamFDTVNab1NmYVVvTGw2U05RMnFERVUxdEtVWW1oSUxFeGJxZ3dMZks4Qmc0R3ZWQUJKRC9BSm5MZElTZ3V6eUFSK1k3T2d3eWVhSFR0d2xCME1NUlVIeVVvemFBVVp3ZnNWb0lINXBZWEZ4NUtVQ2tNZVdsS00xcHRtWEx0MFNoclJhUnU0aUpsTTVCTHlCNGs5MUtBTWlCVVJWV2pQSURBN2pUM0tBdmtkUmkxRHVnelNEQTZWU2dNVGpxMVcyU2pDUmJMQTE1NnBRSEFMU0RiRHpzcU5hQzFYY05JU2hxR2JtZm55VW9RQ0xpeExuODJ5dEJMWXYrTG9DQXhjZ2d0RFVDVVlrQ2hkNUpQc0VHY2NBdzRkOVdTalFEOG9acHVhT3lVWVFBNWdNQnV4UVlOcEVSdjI2SlFURGg2YTAvRlFZVUFFUFY2OWtvV3BEYUJ5Ulh3cm9xREw0NnM4Q0ZLTjhyZ3N4QWdmWXFNK29nYm1sZnZRQzU1QUxpNGJWcVlLQXZxRFdRVHB1VUJFbHhCb3gwOEZLTSt1VFFRNkFTSkU4RWl1eW9Ja0VEU0FlenVvQStwdDZBNzlTcU0xUTh2SHM2VUtCYmFBRHQ1cFJyZ0RMdUJyMVRHUmlOUXpEWG9FbzBnYm1BSmg5VmFBd2VrdE4ycVViS3QxTGVZRlVCdEpPTVBBYytLQkhEczVCdVoycDQ5a1F3b0hMUE1kUWxVSFlnQXlYT081ZmRBUTVjYTZIVGdoS05VTnFQNFovRktBd2M1U2VSSHU1U2pHMDF0TlM1Sm4zSlFKMGMrK2ZzUUFFMElQVTZEUkFwWWw2ODhKUU1hTVNBREk1NnBRc3V4M24zcFJtRk12eTFsNnBSaHZMYWpVY01vZ0hrTytuNHBRRERoNTl2ZVVvRkpZbmJsMWFGT0pobUxvRXVacE5EQlFJYlNIMlNoQ3h5RnI3RStaVnFFYmNNL3dDWS9pbEVyclE1M2VvOFZhRUlEZ2tzWmNPL1pLSnMvd0FwRlBibE1oU0JJSVo2ZE95bEViclhtUnF6VlZvamVIZG5mZWlvaGVDWERkRXhrUkxQZHhwK0NJNTdyWklacFZvNXZVQUVzejZGWEdVYzkvc1ZhT2U4YUhzRVJ6NEYrMVZhT2V4NEtLNjdBdzgyS2c2Yk5uclRkQjBXbW14cW9yb3NCZ1ZJMVVIVGFUdTcwQVVWYTBVMGFqVFFxbUY3Y2lXbloxRmRGdVRidW9MV3ZUMjZxQ2drdlU2RDI2S2lrd0IzSFZRUGFEQW1KMjhVRkFOS1cyd3lCZ0dEVVBuS2dwYlYyY0UrY29waHViV0lMMnZ4dWlLeVI4djJkVVVYWU9UQUU3K1NnWVpQQmRCaGJ1Y3F3ZkJBUVFiUUNXRFNIMjZvTTBzMU5Ib0dRRUVXM1FJYjgzRUt3TzVOZkF4UFZSV0pKM0owY0tqRVE0aHhCTEFkVVF3L01KK2FVVVNTU3dKR2hjYklBNWR5WWtBZThlU0l4L2l1Y2tpb1BEb0M1TWhpTitSc2lzTGk3Q20zVFJJRGJveEpEQ1Bib3BrQUM1cTAvTStpQXVEcWFTMUprSUgzYVR4MVVBTkFDV0dwOW9BUVk2eXgzYjdOVlFYazVVRE1YVUdkeGROYWJJRkJKQUFJZVpZZUtvWndaeTJrYmZpb0JrWHhCTHZ0NGxJTUtraU1RMlNBZ2xvTHZyOWlBRnkvekFHNm9JZGlnTGtrblIzZnArQ0FBMmc3UHZXRUd5dUlBYW9JNFNBbGdXWnpKWmtHa05vR0p4cktFWW00aUMrZ0xmWWczRnBGcDFqNElRQUN6RUIyRGEwNm9RSDFCckxpdjJxd2EwMExPNGZXdWlCaVhpNVFaeUdEalJ3S29BTWdXZ3N6ZFB1UU54dDJIYnhRS2IySUJKRVZhTzFVZ3hKSmpVVjBRWjNJMEpMa0lOa1E0RGNrb0NYTlpod1c4WVFZWEVtcnNIaElOK1YycnFneExPeHEycUFaUVFmbEJqcDJRWTNIK0VaWmZsRVU3cEFYTkR6M0QwUVp5U01nNUkyUUFFaHhIVGIzSUMrUmVRZjhUZmFnRnhKYTBGcm1mM0pnWUdrbVdEa2JkZXFEWEZpQ2JxQUVEcDRLZ3UxQzMycURFbGhMQTFKajdFQXV5L2h0a01BUm9xR3E4Y053VkF1dW1SRk5ZVkNrTURjQ1llSWpWQ01aT2dOTFNQRkFKQWk0c1pCNnFnNjlJSStDQUZ5SGYvZ3pycDVvUURlUkRsOStVZ0ZRd0RBd2RDNkpERnJ0OW5vaWc0TEFNV21aUUFCLzRnOVdHcUVMZGtNZ1F3b1NPVVJuSWcxbHRpaWxhbFROQVcrelZFYlI3YUNDQ1ZCaTVmVW1nTkVBWTh1UkwwOGtBTlFDSlBIdHVvRmk0U2EwSjUyVklSeUFXUFNkZTBxb1M0RWdzNzY5K2lLUXcwdFRiNERoRUJ3UVFhME82S21RUkR6N29xNnFKM09OWFBDQ1ZSTUVlMnFvVWlLbmt1Z2tRV3BOMnlnZ2NnVExnNktpRnhMN0FWUVF1ZDlpeDlxTFNaUzlRUFdEN2JKZ2MxKzFEVkVjdDRKbnc2TFFoYy8yQkVjLzhYeGJ5VkhONmVtcjZxanJzSDJyTkhTS0FWbG0xVVYwMjBmUVUwNFJYVFlKYWgwUG1wUjBXT0dlZDMwM1VGcllxNEJaTTVWYXdUcVRLRG90QTFocWFVV1ZXdERHdlZFVmVuU0RLQmdDMnhmcWxWUUNndGhwTG1maWxSWEVHbFdZdHpWU3FlME43dndRVXRjTkRVZ1RDQmd4N1U1NVFFQWtuNXVROVZBYlhjM00rZ1pCVThRZEI4RkJ2emFFZ2x1eW8zeWhpTmZCaXFvZm5tb2FJOHBUbUdycCthcE1hNklLRUdDQUhNTWRlaUJuZHFGdDJvb01UMlozdVpBS0VtcEZHMGo3a29MYXRRNkpRb09WWG1oTk9pb2I1aWRIMTJQQ2x3Q0dZUm80TllOZkpLTXdOcmtQUHUxT3lVT1RUUjlDb0E4RnJYZlQ3ZXJvQXprUzlyd0NQc1ZvemxzZ1BscWR5b0RMN3pUaEFDWEpkbVppTlVCbzB1Q2FjSUI4cEZwdVlqZjIzUUJpZDMzSDJRclF6Z2dFT1cwOC9jb01LRnRLZmNnQUpJcVNTUk5PVUJiSXUwRFdQQktCeUJKMGFvSjhFb05XZjVoQlpBQVp4ZHJXWnVxQXcxcDM3NklGYTRzd0xHaEVNNm9ZUER1SWtTOHFBaHpJYWxVR3hhTWZDUHhTakMyQXhadllKUmdDQ0FBM1BSQmlLUERHbWhLQm1jT3hiK0RSQU1RV0JPWEIreEtNUmFRd2RuZWlERzBPd0JvR1AzaEJpTFFJTWhnSDk5RUF1QmN0Um5jaDZWUUEyczRtVG8zVHFsR2E0VjFodnZRRWc3RnBMYWRrQWtFT0dZUXhIZEJzZnpBQnkwOWRuU2pINW5rd1pIeGhBT0NESFZLQzl1Z2dVSUZFQXVJQkRna3RHdEhRRW1TUEVHblB2UUE0a2k1NHEreXRCakpqWGFXWlFZc0hmMytiMVFDUmFBQ01qQXVQanFsQnE3R0dnMWZwS0RDVEFMUHpWdFhRRW5qNVRVKzlBQS95a0dsU1dqaEFJcVNTTHFrVUNBc0FKUHlpQ0s5RW9QOEE3MHNEMVFBa2lOTlNmZ3lBRXZCR3NidlZBR0RNYlFDekVobnI4VmFNYlJvTm1xKy9zeVVKVVFZR2s5MWFHT2dxU1hyM1VBZHlBWGx0bFJvdU1PQVgwanVnTk5LQ2lsQUJKQllFQWVNS2pNN3c1RXpBMWRRSmNHZDM2VkRkT1VBbWtHd0NkVW94aDNOQkRhRHgzUUtEUnlkQXdPdFVRRDh4TDlSVWNJQTBRWVA1WTIrOUFwRVFBR3A5bWlEWEJ0Q3pHUlZBalBvUkVVWmxSSWdmbU1FT2xDT2RmUFFSVkJPNmgwSTBLb2tTNFBFT3lJV2F6QmdGQks3K0lDb05kMEVyZzBWOTZLNTc3ZmxJaDFxb2hjV1pnMmsvWW1CRzZzenlsUnpYQUV3NVpVYzk0RjNMSFRsVWM5MERkcWhFUllaTnFxamxzRGZGQjEyZ1BTZENvcTl0V0x5ZllJT3EzckgzcVpWMDJ3SG82bVIwV3dRNHFvdUZyQUg1ZmVxRG90dExEVjlOZ29MMjFPKzBxS29CRFVJOXRWVVBhQmsybnVVVlFPeGt6QTY4S2l3ZVhrbUZrT0psM1l6d2djRUI3clpHeUNnRDlEN2JJSGdFdTRlVUdETVM3MmlCdm9nYU1uSUxVT29oUUcyak9BQm9rVXdNZ2Jud1pBdG9KSWt5STVIWlVVMGtoekRiKzNSQVhyb2Q3ZkZRYlVHWkdtc2ZjcUNYRE16dFVxQlFITWdQTDg2VVZHSmNDb0x3Z1lXT0pBaUcyZnJ3cFJoYkRqNVMwQm9sQTdhMUJVQUZ4TGFCcGYyMVFBTzdzU0RMTzgrM0NCZ3dlR0FGVVVEVzZmOEFoRmtSc1F6UVlITC9BSElNWERTUUtVZjdVRFNBQTdlMElwSUlwU0JSajd3cWc3Z3lLL1lvTVRKeEVDa3h1RUJvU0QvRjdNaWppWW1wZDQzUkRZd1pvYUJGREVkRHYwOGtRd0UwSWJlWDJSUWNRUUg0N0ZFQmpBQVpnSURmZWdZdVdGdlY5RHFnRGFsMzIxWW9DYTArVm43bEJua2JFc2RrVnJLQ1k3U2RVeWhTUVE0cVF3YXJxZzBlR0EwWlFFRXlKQjhXUUFCeFB6Uzg3b01KRGdraG81UGlnSjFKY3RJQVFLd2dIWFNubDNRTmk4L21MdTJqOFFnRGh4SWgzRDZsQmhWelBoeFJCb2NNQzVBb0dlaW8xcFlNWHBPdkNnSXRoNjNmd3ZvMmlBUUpMeCtZMUNBd1lBWUNHNVFBdVRJb2UrNkEydHpNZ2Rhb0VZd3pER3M3ZEZRU1FTMFpNOVBlb0NMUURvRytLS1VDR0l4SllOS3FNUTVBTjJNU0EwTW9EaVJKbHBMNmRFQUZwQmt5SGNOeThGQUNhYXVXQTNiOEVCaWdFZUNLUndTUVd5R2xkV1ZRVGthZFlMbFFiVTFxMnlBMXJOcGpZb3JPVElHdmlpQVdxTGd6Z2x1eUFzSUlqWWpYcWdHVTRNRFNPZGhUWkFmbGh4NzJicDNRQnpEd1N3ZjR5RUdBeUV3WkJJalZBdU5OSWIyWldnT1B6RWtSeTNaVVp3WGF0M1NmZW9CSUhYY3VGUWVDQ3hsNm9BU1JwMGF2RGlFR05vMEdzalNabFFUSllnVkxVZGpLb3hyL0FKVFMvc0hRWTFMR3VvVVFwZGdMWGhqY0tJTVFLa0E5ZEVDRVYvdzZnL2NxRnVBbG5BdUtCQ05vbHFhN29KM0hYeExJRUlKZWhjVmZSVVR1REVuVTYrM1JCSFV1ZW5LQlFETGwyVEtZU1lWRTkwVkM0VE92d1ZSekdDd29YY0R3VkVTTmkwUENJamZSNjhLNEhMY0hCam9mWXE0SE5kVWh2RkJKamszbWpMazlQRm5BNURhcldSMTJlK2l6bFY3ZHhYUW9ycnRIR3lnNkxTSnUzK0NtUmExaHlOS2ZCRmRGZ2gzQU8raWc2QUdCMVlleFJWN2F3WVVEaHBBN29tRGkwd3dxYXZ1bFZjQUdHcFQ0S1VNSGU0MEdzb0xXZ1hPTjZqb2dhVDhyaHhYd1FNOVR3N01VRE04bWVtNlVQU2dEWXNRWXB1b0c2M0FPSjJkRllIV0hQOFBDRERRVk9nb1B1UVVoM2w3YWo3SFFBT1FBUTJ4Z3dxQ1hPckEvbDRPaWcxYW1tdkowSVFBT2JpOFhBMEc3Q1ZRd0FHVXRqK1lLVU96UGMwMEE2cVZRMUp1RGJieWlNS3NHY0IyYWZGQW9PcERsbmNhc2ZpZ2Y4MEdXcU5FQUZHREVFZGtWb3BONFB4UkdJZ01CREcwYklNYlM0TGR0QWxHWUY5OUJYeEZFb05odXUwWURTcVpEQUVSMEhQVkF1Skx4SUVQdUtIVkF3QUFFRWsxOFBCQmlRWEZEYlB0MlFFZ2tDQVJVZ3oxWm5RRjJJY2hoN1VRQmc3aXByZDA2cFJoaTF0UThPWU1ib0dhR25YM29wWEdJTkRpKzZJMXJVTFBieStwQ1pDdXdoNE9ueEJWRGdzdy9DYUtBUVdNYmdBUFB2UWFrRUJoK1p0Z05PaUE2dVFlQWVtaUtYOHhJZlNXUkRFUFNDQUdRQnlDejVDNlFISFJBSERQU1p1alhka0JxQjdFOTBDdEJ0Tno4KzhxaHBuVWpUUit5Z0labmNBZVVJTmt6aXJrc1hRS045bmR1ZFlRWnF1R3lZQnhwUmtCRU1mNGpYUjI2SU5FT1dOQ2FPZzM4TWtBRVQzM1FBdzRINVdJTE4zUVlseVNOOFJ6eDVvRC9BSk9wZDd0dGlneE1rdXdERGhCbU10QTAxNFFEVS93bmV0WDVRTkJobzhrVXJzWHh0eUlqZnVpR0ZYQmZZYU1nQWNtUnkwb01RQ1habzIvQkJzWGtING9wV3VmY0VzUTRoRUtiVExtUUdmaEtDNEppNzVSTS9lZ3pPeGw0ZjR5T2lEY0Z0dlowVUFMYVBzQWRSOWlJMHZjNEJJaW1pQm1GYUV2S0tVa1dzSFBNN3dpTUF4eURNWkozU2dPUkRFa09BTmExaEF4eGVXTTdvSmtFRFVROTBLMENvYTMrR0lmZ2NxalFIWUVONEFxQWt2cklnZHdneElvYm5yd2dCdEJ1THUvajk2QkFEYVFOOVBqdWd3YzNGOU9yRkJwQmpTczlVQ3pMaVRReW9pY1d1eExXajh1M1ZhRzZGaVJRb0V1YWJTVzJISGdnUXVZZHRlNkNWd0FNMEpvZ1FnMEpQbXJSTWlDYXNnam8yb01nRlZNa3VEaHpXamxSVUxpR3ViVVA5cXVFYzl3WUZvMUFLQ0JET1NYYVNxSVhCb1p0dkJFYzE0RHlRVHd0RGx2RnZtZEZSSmk3K2JLTXVPdzlDcm5DdW15NkJxVklPcXdqWXkwK2FLNkxDOGlQUFJTRHFzdTFhQ0ZtQzFwQlBjUHFGWXJvOU15ME85T2lrRjdidEFLMUNtY0t2WmNLMERNa0RPNWlIb1BZSUtXa0VrVlllZEVIUURpQ2FuUUtRTmFUVjRhZGZaMUlLaTVzdEJRSDNwQTlwTEdqczc5ZWlRWXlHeEllcCt4VVVFUEZhNkR1czVHYzFrblcwSDRTckEyV3B0YktvUENSUmVoSTdEY29IQnR0QUJiWUJJR3lGQkpQMkpBcHV5WVl0cHQyaElOa0hjbXNXbnJza0JOemlRWmhoeWtCQjFMaHRBRytHcWdkMkxnZ0FicUtVWFVhMW0vTUEzaDRxeEJ5QWNzVzJmbnF5a1ZuMUlBMmMwVlJzbU54bTVxSkJzZ0h0bzVqZndTQVNhMU1iSGRCc3FBV2dFSHoxU0E1Um83UVhpU2tHeUIyWVQ4VWltbGhrU0tleEtSREF0TEdmdGhTREc0TzV0SWVjdGZjckJudWNtUzRZU2cyVEQ1akpnRGs3S1FESUQ1V2JRZ3pHenF3SE5zaXpCbmd4cWZOSUJrMXJDalNhKzNpa0I1M2tuZEJqY1pOdHVRTzMycEFjaGJTMmRCcnlwRkM0aHc0QmVBVEd2S3VFQzY0bWdvL3kxTkV4Z0EzQ3RkWmFPVWdkNU1BdFE2OTFGSzh1enZyb1ExZk5WR0JKdUp4Z0QyaEFjaUFUb3pnRXBBTXlERWdod1k4VWd3WnpCM3RuUW9ObU1RS0VWbVFrQnlZZ3NKaHpIWmlrR2VlZWRnVVZoZVNCY1lCbC9ibElBQ0EvVUZoQ0lOdHpuOHJPS1BEZEVneHVnbDRNQnArMUlHTWlqRlJTa3k1RUdDNkl4dTRMNm5SV0RaQ2Zta2lOUWtHQmdERVpFRHlicWtHTnhGQXphN2U1SUM0Y0h3TDFVaWdiZzlHWXhNVW9yRURMVVFRS2M5MGdkM1lIdnlvcFhlQUc2ZTlFWVhSK1ZnSGZYc3JBY2dDSERsb2V2dEtrVmpjV2RnK2x2d1NJQXVrSFJtRFVxckJpU2FUYnFEcS9LQXdEU2J0SVp4S2lnNHVmR0c3RjFVQTBMUTFDL2VpUUtjaERlRTdjSUZCR05vTFhDMDhGL0ZBUWFTeHRqNElNU3doM2NrRGt4OFVCZlJnKysyenFSUXlJZURkcmI3NnF3SEwrS2dBbjJaSUZCRFhSMkJKUkFjbHZsY0RVUDhBRklHZUNHWjdpd0ZVQkYrcEVOOHMxOFZJcENDR0xjTWFOcXFoY2dEcThselIyQ3NCek5vMEZlaVFDNjlqc0FhcEFRU1I0dWVhSUZkeVNDQ1F3cktRSmtBOE5wZDREWklBYnNpd3JhWFNBVzNPTGlJZHBKKzVUT0VZM0Fzd1lrdjVKQWo2V2dFVFF0UmFnVzR5ekZtMU5WSUV1SUFIeXRvd1NDWnVsM2d3Q2tDWEVzSEhVZFZjQ054dUlJZzdFUXJCTjhuaUMwS0NkOXpBRzdWbUtzRXJyZzcwY0pqQTV5VEQxYVZSelhHV2JqYVBCV0lqZGRYYzBEcEVjMTEwdFdycXdjdHhNblg0S3dRbW5kK1ZVY2RraVJHbHcrQ0k2clhiZmQxS3JvczNaNkhaa3F1cXc2YUNHVW82TFpBWnJ0SVVIVGEzeWs3cFdsN0RBZU42N2FLQzlzVm5VbjRLVVhEL0FEdFZTZ2hqY0hCM2YzSzBXdHBJbHFkVktLaUF4WmdZUFRsU2lvSUFGSE5BZ0laZ0JJMUc3cTBWcXdJRHY4cWxEUHJvVFRkQTdzSGFPZkhsUU1EUGFUenNpZ0JpOFBOUE4xYUN4ZVMrcHFQaWxGYUJuSWxTaFhKbkZ3RE82b0ltQmM3eWZKS01hTmFXZ3kreVVDNEdCM0JuUjlFeGtPZEFBd1ptRlhVbzJSQk9SalRmM29EYkpOTnZDdnZVb0FjRUI2VkFhT1hoV2hxQURzNmlzSGU2SzBQc3lVTFNsb0JrbDU3cTFCK1l0TU4zVW96dk52VnQ2TXFOOHNHM3Q4V1NoclJMWEI2a09wVk51d2VyQUZoMENVQ2FnZ2dSYTMybFdvTE5xNElabTBHaVZRR0krWXlHY0ZrcUMvWnkvd0J4VVVRN2swYy9kS1VBUFVPWm8rNlVFUEJvR3A4QWxBQkpBT2hGWG5vZ0lBSWExZ0tnaWpwUmdhdUcwYngxUVpoVUFUOFVvVUhaM1BCZmZWVkdCaHgrWWhBMW9MRVhUdnQ1cVp5cFNYdWNiZmxKYlhaVkJhRy9LSm1nOEVvQkQzQjVMT0IxU2d0L0VCSkx1ZkJTalBiTHlKY3ZzZ3dnMU56T1hqVHdWcWpsR1RBdjdCUUxhMnpCbUlJMDZxMUdEOTR5OEVvMmpFRTNTQUN6OFRSS01TQVlEQncramFPZ0lFRnFiQm1QYWlsQkJkeVkwS0tUUWdHWlBzVmFoaXpBRXVUUXhLZ0F1T1JKb05hY2pSVUVjVFRWaTZnMHM5WmVzSlJ0aVRpRExLMEFzNUJBWXRSS01BS3l4a2tKUXdPaGd0VGhSUUJEM2dpVCtiOFZVWTNBSG5icW9CQWd3S0RyVjlsYUM3Z0VnVFEwZFJRTE5BZGdJZDQ0VnFNVHFZWjVFMFFFd1dKY0hRNi9CQnBiNW8zSTgxS0M4Z2paanhzaWdRN2lBbENBaDIySmN1MCtLQmRnQWZsN04wVnFHN0V0N1Y3cUtBYVgvS2V5VkdJZDdpQzRwMjBWb0lic0tNTjFLcFM0TkdENGc5MFJucHFOT3N6NUtobkpJZ2lIZFJRZlV5N1AwUUFBR1lKRStUVlZxRUdSTCtmRzBPclFRemdURWg1U2hRWXVCMWo3dXlCNjBlM2luS2lsRHNRNGpRVFhSVkV3YU0xSmhBU1dCaHF5Z1FPR0xQRW5reVZNNVJtZVNRWG9kZXlVSWRTN2lySGxXaGJtTEF5UVpQWktGTGRDOG12WjBvbGNBUVcxTmErS1VUdUZJa2UxVmNaRTdpYmlSdnA5NkNVd3c3SUVQQkhCU2lGeGRtZGdTNFZ3T2U4aDNCbWFLb2hjWElpbXFvamNTVEJZaW80UkhOZEJvdzFLVWNsOURDMVJKNXJHNzZvamp0MW1xcU9xMmV4aFJYVFkwR3JzeWl1bXc2TWU2ZzZMWGFRNWFDbVIwV3p6S2pTOW1wbUM3K1NndmJwYzJyUFJNaTl0U0FTWE92S2dlMldMMTNwMlFWdGVkZjhBRUVGUVEyeDBQM0tCd1NSTnJBMWxCUzJMY1RNUitDQ28za0NnMTk2RE9CL0V3QjZvS09DeDBtTnBxc2pXczROc2JSdktxNEIzRkdNRVBNUFhkVU1IQTNMVTIrQ0I1WWdVME11b0NSazBzMG44Q2d3cEJlMC9taDVRRVVyeGtSMlpCc2dHZXV3MFBzVWltQm9DYW1DLzJxQWwyWjIzQmxoMVFhYUZtdUFHT2oxS0F2RnBBamM2QkJqYzJySG1pUUJnQ0IzTStDQlE1TENMQ3hEQkVZQnF4RWNJSEpodFJYU3FLVjVJeVl0QTBSQkVFVUVtVVU0a1d1VE5iZ2QwUVhiWEozSWJZb29Ha0Y3YUVsRUZ5RGJrZFB4UWE2QVlJZVNhb285OVkrQ0JXRG1IZ09LZFNpRGFRSUdtaE81UlFEeTRkcEIxazBRWm5ZbHlkUlhaRVkxdDJCY0h6bEFab1FRNXJzaWd4TEVWZzFpbXFJTkk4L3ZSU3M0dGRpQlFEeThFUVRiSS93QVdwWkFRd2M5d05lcFBLS0R1UVdja005c3hyNW9qTnJVR0JFQUlyR0t6T2orTElneFI4Vy9LSDE5aWl0OHphZ2lHSm5yeWd6aDJBSlpwMHFnQVlnaXI2Nm4ycWlNYXpTZUJSMEduRWtDb2pwMlJXQSthVEJwNzBCSmNaQXRGQnFnQk5vb1NDN3RVb2pFU1cwMkFyb0VCRHVjUXdFTkNLQWt3Q0FlR1krd1JHY2xzWG80Z0lwcEduQjE2SUFHTldOcG1KZnZ3aUFBNzFCb3huZXFEQzdvUVB6RGQrRWdJSHpRd0FEQUlvU0xvbi9KZHkzTDhvR01EOG9veGVBM21nQUJ0Wnk0Y05ETWlGY000bDZtUU9kRURHZEJhd2g5T2lLQmd0V1lJMzI4RVJtSVlQUVNOQjRvQytoZDl4Q0t4TU5UVDRJSW5ndmlISTl0MFEwaDJMMmlEMFJXWUFoeXdPanMyeURPSUFrRDJqc2dMaVRVR3VxQWFtTVdFYWxBUVdBQmsvZWdFQ3NSSmhFWm5GdTdPYlR5Z3dxNHRZbXQzUjRSUUlJQW1nbXBSQ1FhQmpQbG9GUXBZUER3SEQ3YU15b1lUV2Q2VVpRSFNKZUNTSitDS0JhMjBnSHJOSDNSRXlLU2RSa1BOQWZsWjNkeS9YUkF2ekNJYmlpSUJNY0NSMGxBaGVBQUhOUTIzNHFoYmcwdExWKzlCTzZBMVhMa2RFQzNZbGh2TEJRUk5HcnJ2UlVJUTFSbHozOFZSRVRzNW9kMENFbHdmTHpRUXVJWjJudXJoRWJ5SDJKUHhSWE5kdnpFTFNJMzhBR0tLWVJ6WHM4enMvbXFPWDFCV3J3N0tpR3VQbDhWVWNmcG1udEpUS09xMDBBTE5WUlhSYVdIYU95VlhYYnFBM0Rickk2YlphSElTaTFydVExR2I3VXF1aTJlRzBVcXVnRjZnL2Vwa1ZEZ2drbHpvbEZRU3hZNlFWQlFFT0c0WUNrNnBSVUd2QjdoMEZBSkxWMENnZTB1QmI0N2V4U2lnTG1qdzRTaGlDTXBMbVVvYXlEV0E1ZFRPUXhlTGQ0YmJsS0dKTVBIZEdnWUFia3lUOTZ0UVJjS1RNQTdUb3lCbW9HRE81OXhZSlF3Wm4vaTFyN2xLb09CaXdZYnFvMVdZNndSdnFsR3QrVzVuWUVsZ21jaHhjQU1oSUdnOXBXVk1YTUF0OEVvVnlDSUkwQXI0N0tvelUwYlQzYmJLVWJRTU9kQ0ExS0pWRU9CRWh0SVNqQjl3U0dGZmJkS0ZwYXpqTFFzUUNQWXExQmN1N1VQbDcxRll4RzRxQTlHMlNobk1HUzlTUEJLTUxueGNPMVhyd2xEWlBQNVdEZ0ZBZG5xYW5WS05RQUFzZllwUU1vTlEwYyswb01HR3VSREVxb01rMGdST3FsVnVUWFVhcFFSekpKcFZrb1c2NXJhYWFTeXFNYVRCNk9XMVVVZnlpNlhJTGo3MG96aTE2VFE3dHVnem5RNk05VUcxTGVESlJpUkJhWXIxKzlLQTRJQk9veUo4enlsUUdZQzFtYXBOQ3JRUVJXUXhFNytLaWllV0lNSGRLQTV0QmVXbVJTT0ZRUVFIRDR0UFJRQUVoN1pKMys5QVNJSWZZVUh1U2dGbmtFYjdkVW8zNVFSK1lBc3pQWFJLTXpubXBIVHYwU2dpb05RQkIzZnFsQlptY3ZTdmdsQWF1NU1kNGRLQUhBK1puZW85L21yUVE4QWpjbmhTalVEaU8xVDVwUm9kekV0YTJxVUVWcElnRktBQWVtNDZwUUN3cmNmbUJsS01DY20wUDVuanVGUWNwbHdYWmxBQ0NYSU5Rd0lLVUVWWi93RGhCS053UXhJbEFBekM3RmdIYnVsUVgzaVpQR2lLVW5FT0JJNWo3RW9YV1RRaUtwUWRpWEFkQUdJQTRFc1BjbEJreEJaNnp3bENzUWJvR0xUTmQvY3JVRTRnZk5JQVlrNmdLVlNuOHh1eWEzVWZGbGFoaVNTdzZqMmJoUlJJRGl1NENVWWJtbFFVb1hJaVNHQTNoVUt4Y3U5elVTakFHQUtEbjIwU2hRdy95ZDIrUGlyVU0yTUJnS2txVlFGd2U0dkZGUUxpSGZtVktKa3dibUo0QktxRE1GMmg3a29YOHR4aUttNTZBcVZBdUlCYkZ1RXdGbUNISklyd3JRcElQUStFcFJPNlRzeno3MG9TNG11bzltUVNKRGdidjh3bnpDb2lUb1BieFNoWEJnQ2RRZ2pjMDZnUTRWb25jV05PakpqSTViaVE1RkdyVlVSdUpmdFRXVmFqbnZERjlOdnhTbzVyMkxzUnFGUnpYbmpoV2lML0FETS90VktqaHNOQTc5RlIxV0ZoNHFEcHRpNmhQdHlvcnF0SjNiUlFkRnBBbVozUWRGcEZCektpcldOb2VvS21WZE5taGM5VDdsTWkxaDBZaHBQUGdvS2FNMUZROXJzQURJRlVGckNiZ0RYY0prT0dhM0ZuZU5VRlFSRlNlZUZrTUM3Q2owSTNDb29DQ0hxQUJUZFFNNTBKSm9mZWltY0VadXdVUm90ZWFsM0tLSWZUb2FrZTlVRTVNQ0ppbXFLZDd1aHF4KzVBUXdCYlFoajdGQmdSb0lKZW01UVlFalZ3RDdoS0F2UXM3d2VPRUd0ZzFrZ0ZNZ1BhV05BOGthdHgyU0lwUjNsNkFVOGxGQnlDWmNPU1JxZ3pOK1lPSHFVQmR5eGdzOEgzS0FBa0M2cFl3VHFYVkJNbDNBSFh4b2dEUVFDS0Z3N1VkL01vQTlDeDBacTlLb2hqU0RwRE1vckJqTE0xVUFBYTRrUTVvNm9iSWtCeTVxYlQ3Y0lNQ1R5RFJCaGRXSXAyMlFPTHJYZ2dhZGgrS2cwRm5Ja0JoOEZRSitaeUJzZGtHK1V1Q0tubVMyNkROQmUwUitYYUVCaXBJNmtLREZqQnFhY1ByS29ITGZMY1g0UUY2L0syb29GQU5DR0FKMDl6cWdpNE9YT3hIZmhTQUc2VFhqVFRkVUgrSFJ3MkxvTUdvRFVUOEdRQm9MRUJqWHcxUWFIRG1zekh0VkFmbURiRGZSQUl1SUxtRFNtcURTU0FaTFNXUVlYV3VXRWhtZndTQXRKSUFKRmE4SUF4THpMU0FJcFRaQVM3T1N4R3ZUaVVCSUpZMHE1aHg3MUF0c0NKR2cyNTNWR01TekE3VjVFSU5CTWRlcHI4RUdCdW5JRXRJQVpBZFhxNWZTSXFnRlJjelRvS251Z3hKazIxWjNhRDBRWnpMQ0trYmxrQ2s2UlB5eDdGRU9LSFEzYisyaWlnNEllTmlRL3VRQVh3QUM1YVJ1cU5sVndBSDhVQ202NEFrZUk1MWhBWG5sbjY5MUFvcEJEYXY0UDBWR0prU0hHaitLRGJ3SzFHL1FvQTVjVmo4emVWRUIvNHJnVTQzNVFFdVFHTldKUDJLQUMxdHpqSWZUb3FNNUkwSU1jSURITmFOT3lnVnc1RGdCNGJnS2hRV2RnUzB0MTRWRy9pM3U0S0FYQWdFaHdBUHphdHFpRzRhQTBuaEZBRnc4VUxIYnVnREFPQWNYbktpSVZ5U1JRRXNaazhlU0FSdFVPWDdvck5JZVJzaUJKMWxtMW9vRnlBY0ZxTzRub3JBdFhraDBRTGlBd2NEYUVDRWlDd2FpQkhZT0pmMktDUmVYa2lmRjFvVHV1N21qbjdrRWJtb2VIT2lER21qMVpRYzVnVXltaW9sY0R4eDhWUnozR3JTL3ZWSFBkY0pCb0tPaUkzM09DOEFWWlZITGZRaWRoN0ZVYzE5MHR0VklJc2MzaXF0UndXWEFibHlxT3F5NEV1enlvUjAyM05KcFJSWFRaZjdleFJYVFpmRDhRb1IwVzNDbmtvTDIzaHhxUVZGWDlPOE96NktDd3VBa09ZZ0lLaTd0Vm0zUWg4M1k3bW00UVd0dkowK1U5RkZoN1M0OHNmd1ZwRDIzTTRwdkg0cVpGUVJXYmhSUWg4Mkx1L0ZQZWhGTXJmR3ZocWdFTzJMN0lRd0l1SWJhbjNxY3hEWk9XYldQTkJueXBHNWFIblFxMVJ5SElQUmtHRjRZUkJiWVEzM0lSVE4yK2JFN2NuM29NYmlDWW5wNElNYnFRekFFQ0QyQ0FPR1lGalFnVmhDTnZwdG9aYnpRaG5iSUN1aFFqWmt3ekJvSUZGSURrTGhVaDlOWWxDR2UyU1o2OVZDTTRxQTFEQ0VBMzJ1NVljL0JVRjZQYVcyanpVR2NuZ25WQ01TQXhla3YwcWhBZGdEaTIxdXgrOVVqTTBoejVKU0M0bHh5VEZWQ01UUWdGM253OGtJQmFwSkdwUGJSVWpBZzVQYitid0xoQ0RreGVyVnBEZmFvQm1RSU1FUzlDcVF4dkFFaGdEVGRsQU1pU2FqVXQwOEZTRG1MV2YrSTdvUXd2RWo1bWhvVVdCbmJvQ3hrOHVpUnN4cFV5MzRLa1kzZ2sxQkZXZ3lnWTNENWhicUtId29vUWNnNThrV0Z5dG5YWExxaVFjcldkMkVzU1dRZ0EyM00rOEZDQ0xuRTJrQnRkMEFvUXdrUmE0anlWSXh1WUYzSU1FN3VvTmtKZTJha0RoVVlnQVVhZEQ1aFNrWjdSYWJkYXhvNnBBTndhSGNib1EyVnRzeTdValQ4VkZqWlduc1EvdEtKQzVUMGNBMXIzbFVqWjJBc0hCUHZRZ1puVVFaSlkrRVZRRWVwYkwydTVnMWNCUURJRVltMDFCWXREeXFSc3dkQzVwN1ZVSXh2dEJOckJ5STgraW9OMThBaWorOVFoY3dhdkViY2hDRmUwdXpIUUg0S2tFWFB1SEpaMEJCSmFPaFB3VUlMdzVsdG9qeFJZUjdTUkQ2WTkyVlF6aHkvQkZ1cWhBQkFERmlIcFNCOTZwQmNRY2QyYWpLQlhjVUljMUhUVlVna2dSQkR3RG95RUM2NzVYQjZqUVIwUWEwL0tTQVRCMDhxb1E3aDVNajJvb3NJRGF4TzRENitleXFSczNKWit0S0pBcElsaXhNeWVteW9CSllmeEhVY2FvUXd1bVFSUmdnVUVnVE5hZFpRaGlhdlI1VUlSeGFhOHNBL2RXa1kzQWhuSXhpcUVLYm5aZ1FYa2dmYWdEdk5zQTFDVUFYR0lmaWhVUU1tK1lUSHpTaEFMR1dKZXJLa0M2OFd1UzhTZ21TRDgweUphQWhFM3JjUTRFalJVaE1uT3JBeFZBdVlFVUFyc2dpYncxSGJUbXNPaEV5UUduMktxUk80Z2FPemJPaEVpWCthUStua2hFTHJ3QzVnbG05eW9oZGRvQ1J6cXFJbTRUMVJFTDdnSEwxb2c1YnlKNnkzaXRFY3B1Z3pLcUl2OEFNK3IxYmxCNTl1bWoxVlIxV1I0MVVWMVdYTUE3cURvdHUxQnBKVVYwV2tSTk5kMEhWYWZ4NVVWVUVrQjRmeVVGN2JwQTMyZUVWY0Z6V0RwUmxCYTB5S0hidW9LaGhJMUtBdTdpaDJRVnRMU0lmWDJLQ29aalU2RUlHQnBNYUhaQTl2eXM1cVhsUlRod3hZUkxCQTRJSkVpM1VQdHNnTTJ6VVZQUkE3aWpEcnhvcEFRZE9JQktnSUJFR2hOSzZLMFl5MFRvVlZHcm1mOEFKKzN6VUJGMUNYSXVMcWhnWEpZTVJUU0RSUUFCZ3dEdTg2ZVNvTE14cnp2c2dZQ2VqK2FnVXdYSjBZbWs4cWdBQ0E0Sk1HZHArS0Jzc1NOSDh0MUlHeUxRSDYwU0RDaG94cDAwRElDVG93TVQ4RkFBS3pxOFJYb2cwUVJxZFBZSU1BRDh3Y1pQQkc5VUIyTFBzRHVnTEdMcUhVSU1HQStVUnVLYm9GL016aDNoOTkwQnRCNVk5aW1SaUFXQi9objdFQUphbElmcU4yUUVrRWdnaUgxUUFtVFVrVWQrM0ZVQm5RVlBRZDBBMUJKRGswOW1RR2RpVFNmZWdBQklvMTNzK253UVlPenNhMDEzMFFZT1JjL3pBME9qSUN3Sitad1E3ejhVR0w2Rm9xZ0J1ZCtLRHk1UUFISWhqQWVXMTZxaDV0R3ptQlRzb01Td0Rqa0JBcHUvTVNUREV0cDBLQS9NNWFBSzhlOUFBN3NYSFBVOGJvQ0NkUVNhQTZ4OXFBRUNUL0NZYlJBSEIrVXlZWjllNm8xdnpPRDhzdUJyS0JpNExHWG9HcXlnQmN0TWd0YVhaejJRRWtzQ05OWVFiSnhGQVdZaElNQk5wTGtqWDNvQWFzWlA4UTA4VUJJRHllUUNIaEJ1TVh0TzBvQk4wQWdqeFFGNjdTekZrRzVrUDlyb0FaYmZTTlc1RUlDU0FhMTFoQUFIajVXZU53Mi9SQnR3NC95bTJsQVh1Y0VNQUlQWHlRYXBJWWh4SXFnRjJ4cTJ6cGdZRUV5QklodGxSaGNEVC9qYTlsSUZGdzBBbHpsM2Z1ckJtTVBKcTdJTS9EdnAwTkVBZWgvTnNYMVZHNWJyYjBRRG4rRTE5bVFHNE9RMTJMRk1ERTBBSlBNMTJkUUtYdWgySG1xRkFkaE9Pcjc5MEFJdHJVZGtHQkpGck9keitLbVVyRXZhWERsbklRS1MzekNaRW9BQTVCZWRCc0ZRamlKRmREN2tBTHVHb0hjb0ptNlFBV0d2TElFSmloQUduc1ZSTXVMaUhyVGRFS1NCSGlUc2RIUlVTUTlRUUlBNkloU1c2RGJoQkkzY3p1Z2lTR014TGFLaUYxem1BWTNWRXJqbzVlUm9pWmM5eFoyMGxVYzl4Qk1VNFZ3T2U0MDNWUnpYa1MzY2JvaUx6NXFqZ3RPblJCZXk0a2JFVkdpbzY3TG1qdXNqb3RJTEVEcHNvdUhSYmRYbnlRZE50d2lYR2lpdWl3OU5uMlVGUTNqQlNxdmFRd08yL3ZVRmdRMENuaENDMWhhdEFwVk80L2hseUE5VVF6ajhwYUtPZ3NMbkczdHNvcHcwNmxxNmNLMFBrek5NY3FCaFVsaE5UOEVvZk5pN3ZRY3FCeGRRT3p0S0RCcnF5VFVLaDhtWUNtcnFEQWlTOHZBQ0J5OUFJT3RlNmxDN3N4RlIxNVZvWVhVYnpFQWFvcmJrVERJQUhCTE9BSjlnclE0dUFFdUorYloxQVhCL2lySU5ENW9OakRsbm1hOUVvYVNKY1JYWW9NU0FkQnVnRUF4SnFUK0oxU2pPeEp1TGhvQjRRQVEybEF3UWIvSmN0RWpjVlpBNzBZQUFhcUFQYlZoQlk3aFVaeUhBTHZEdFZBd1l1QTh1NTFoUUZ5RzY4ajdrQUVDSGN2RzBJTWJycDFhUzJ6L2NuSUN3RVVsNkpRcEJjYzBFanFsQmFUQWN3RDdjSlFkZEpHKy91UUNrcytNamZtVW9ZdURWcXYwUUQvSjBMNGlsUE5CaC9raG5sNFRPUUFOQ1B5MFNqZktBMVlEYjhJTS96T3hjQ2o4NklOUU1TSWdQd2xETzdmTE1BNjFRTFYyaTRRNC9CS0RTQXcwM2hLQVhhanpBNDdwUnQ3V1l1WFBIZ2dERUF6aVNmSFJLR2NRMVFXOFVHTXNkejhQTktBeGt0aytoNFNnaCtESHk5VzBRYVpMdHNOOW42b0JOU1dMZ003SU5Sd1QzNUNERUV5Qk5DRDFkS0RqYUgwSURrOGVTVWFRR01Bc1BIb2xHNW9icXY3a0FBSUpFRUhzeVVGZ3pNNVlreEQwU2dBMm5yMTFRRTBCRWRlVW9BTnBiajhvaGtERW5ScDFxRUFpMTI2alp4Q1VBazFjV3RSQm9CSkoxbG5RRElPL2pvZ1VremtLR0NIM3F5b0xnbVhnd2d4M2RwZC93U2dHQ0hhNE1hOFYwUWFvWUVGNTM4MEdGVHJGZFgzU2dPN2hvZVZRWW1wcUJQS2dQVWh4VG9sQ0c3Y0F2US9CQURjNWswTFIwUUtYckFBM1BnVmFNNHFMaHJQdmpzcFJuWUFnSEUxWktqQUJpQVNDN1AxVW9WOFM0RDZlU29CTEZ5Y1FnV0FUUnorWDhGUUxyZ1lJY0IvbXFnbVNERnRBWVFLWnEyM2hzbENFbTQxSGNVVlFEV3JrMUtWVXJpS1VxeVVTeWtoMmJyUFJFSzdTUHcrS0NkMTJvQW9XQ0NkeFo5WkdTWVZDNjRTZTdxb2lkeitDdEVMcmlUQkIzTG9qbnV1RTdFczZvaGZkQkloNVZITVNRL2xzcXk1N3lKMDJUQWcvei9CVWNOaDRRWHROUEpCMDJFd2VuWlFkTmhnUEhmVlFkTnBBUFdxaXIySGJTb2hUS3VpMHNYTkc5aWd1QzdSRlhVRlJjWGQySDhJNVNLdGFXN1NWQmVkTkpvaXFBZzY3T1ZCVEtIWnVhcGdFWFdrUzgxNit3VmlLNUFzOGlmSlJUdkRsMjh3Z2NsZy9MaEJuWWh4TkdGT0I1cUlybHZ3NVVVNzY2R3BwQ0FpNm00Z2JGVUVraWEvQkFUQk5HOW5VREM0RVZKL3doSUNDU1M0Qkd5RERRdTRCbnJ5b0NLbHV4M0d2dlZXaTVjK0tEQ1dKQUhQZEFQbVlzZm1GRENCOG1saFN1K3lBNVczRHNlblpBV2FQNFdrL1lnd2MxWU5CRys2QldNQXQ5amJLZ2h2NGd3RkNXOEZCcXRRY0VWVkJjeTFKRHFETzRKQi81TWxCcXNZUHR6c2d3TmFPd0JDQXVZY1RvREtBR2dkeTd4MlFITXVBZC9sMzdza0dkeVlZaitKL2k3b0M0ZHJZMGNxQWd5UkxNNTlnZ3dMaTRzdzBQeFFIUVBhelNpaFp3WURVa2RreWc2SEVoejRQOTZCVGFDSGZrTkhTU2dKY0NBS2RIWkFkUTVyUUlBenVEU2hMb01aZmlhODhJQ1NXWWFRUitLQU0ybnpYVlFHQ0tWMUUwL0JCbWlvSTI1cTZBQXp3SzhOUHhRWXhXQmQwcUtJR0pMZ2luaWdTTFdNVjZ0dktjNDBrTUxXREdXbWlBaGk1QlltaDBJQ0FBN3dhdElkQXpRUXdtcGFFQXR0YTBqTFdYSHdUSXhGemsxZURPaUFGOURzTzlKUU01REE2KzNLQlhCY2JRRzM3SU5rQ0NSMGZ2eXlRR0NHYWdRS1N3ZHZtMXVIMnF3TG1DekVndUdId1NBNUZ0WHJNVDdCSUFST1FMajdXUWFRWEdzSHNnWWtpR2ZreFJBcEFMeVhhRzZvQzhFZzVUSDJJTUJVblF1NDBRRWlXTXgwUUJqTEFRN2FzZ0RTUzdobTMxUUEzaDNGcjdublpBUVRvOGpYUkFsSEVBbVNkMEJjU05SdE9pQlhCTWwybHVxRFN6ZzhudWlESWR1Zzh0bEFscEEveVFHZy9lZzF6bWRxR2txZ1ZaMzNZb0ZsM2JhV1ZBeStVa1BxK21wUUtiaUp1MW8wbFFMazQxM1FUZGlTK1IyL0ZVSzhUZEFpT3lvVTNFRGlrd2dtU2FhYjBRSmsrc1ZKVmdRelNZVW9XKzZ2Uk1ZRXJqRWxpYXFqbnV1WVZab0lDSWhkY0RyM1Z4Z0pkY3p5eDFDSWhjVzQ0VkhOZGRyb0toVVF1SWVqSWlGOXc2N2xWSExmU1FxT2R5K1hrcU9HeTduV1FxT3EwOWhxc2k5bHpCbkdxRHB0TE4xb29PcTB2clBDaXJlbVNkWisxRlh0dUlEYndvTDIzTy93QVVGeGQ5NmlxQW1SUXNKUVd0dTdjeHBFcUN3TUFFMTBLQ3R0emFuL2cvY29LUWFBa0V5bUZGOFdEeDJWNTBPTGdYYmVnNTFoUlRpNFFLRFVHZVVGRGNkMkVVVEFZT09wbGxBUm9DV2VrN0lIekRaYWE4NklDTHRUcFRpdWlCN1RNZ3Z2djJVQkZETW1vTS9ZcUNRUVB6TnNYWkFjajBpcHBLa0JZVVljOUhRRmpjQjhWQVFXbW02QU94ZlE3MDk2b0lMNnNHWU43MFd0cUN6Tkxpbk82QW1BU0ttc0ZBUVRPTndKWjJRWVhYVVBFY2RrQkpOSmYvQUJCQVJkVG5Xbmlnd0ZkcnZFK0tBbVdtTjZVOEVHbXBvSkc2QmNtSUpETUtoV0JneGY1WjZWZFFaMlpxKzI3SUEvWXdDTzJpQVFaSW02Z2QvRFJBMHMzOEpFRWExUWFYaldqelNxREYySnFXM3AzUUYydUVzL21VQUZ3ZG4vS1lGYTBRWVBwZTRhb3JYb2d6dTVvYlk2SUE1dEpZTytuWGxBMlJZdnREbElDREEvaWp5VUN1UTdBdUFkS2txZ2d0UU5hUHlvTm5RczdhVVpJR3lZQ0lBYmhsSUJrWEpZRWF2VldCWWdFQmlhQ0E2QTZIVTA2ZEVHeWdRQ0drVDdrZ0dRa1UzSjI1bElDRHE4Vy9tMjltUUI2M0EwQkh0Q0JnYm50ZmFCOXFEWkd0V2dKQWx4T2haenI0cGdGeUhxLytJSU5xTGlBeHFlbXFEQUY5Q2RmWjBHL0xPanlOdVVHSm83UitaQUdNT0FZbzZERmhPbThJQ1FNcE10RG9NU0FETzduVWNvRG8waGhFSUFBWVA1dUQ3RkFBSW1uTU9nSkxNV2E3UnpYdWdWL3pFdEFtS3NnSnVERndSSGFFQ0VtaGNrMUlEODZxakVzOXpuYTRpTklVR0pvTFE1R3NJTUlma01idnhRTFVFQUlnZ3NkUnNpczRyVnFzOVFvZ2t0SkxDU2dtYmgzWjNWZ0dSNERsdG0yVmcwWkVFbWp2OEhRSzdIckRqZXFBRXVQbG9XSU1vQVNDWjFxZ1EzUkJ4MytNb0ZKRlM1WWE5VUNrM1B0YTFGUXB1R2djdlRUMmxBaHUvd0FwN2g3VVFUdUkrd2NEUkVUZVR1U0NEMXA1cWdFdERObHA3QlFJYnBJSis1QkkzQU5NcWlWMXp4cTBvSTNYU2RlRlJFbHBFYVA5cUlqZGRKSlBib3FPZTY2UUhmYjRLaUZ4aG43ZkZCSzY1aHA5aUk1YjdoNzRWUnpYM0h1YWhVUm5ieVZSNTl0N056UkkwNmJMeEduVlNEb3R1R3JkMUVkRmwvQ0s2YkxtYlhkVEpGN2I5ZDRQMktSVjdiNVNDOXQ0RDlhN3FSVjdibWY1b09zQkJZWHVKQm80VUZMYjdSRHpza1ZXeTVnMjFQZW1jRVh0dUJFdWQzbFFoaGZRMDl0a2dxTGd3ZGpvKzZoRE84ZzlPcXBEQWwzQWQ2TzZrQnlBaDMybVhRUGJjSGNmbFBzSVFWekJJY2N1WW9nSnV4cFRWSUdCQWwyTFVVaEQ1TThFaHZKUld6cTBuWTZLd0cyOEF2YnRJNVJEL1UxYUQybElyV3NSQkxtcExWWkVobkRTSEFOU2dJdUxnTVEzUlNLd3ZHMU5qTWNKQmhjRHF6eTlFaUdCZC9tbnozVVdCazlCMmI4S3FqUjh4cXgvTFFleklHeUJrU3dFNlIxUVlseVhqZjNJb2x0V2NDVDl5RWJLSEFMa0pCamM1MXRwSVNEQytjWnBCUHM2REc5bk9tNDFrS2tObUhZQ1FJSHRSUWdpNEVTT0k2SU5rQUxtRDl0WDJTRENoZm41UndoR01FeWVBSGhDTkdvSkxGMElQeWdEeEhDRVk2alFVSG5DRUQ1WEFZOEFSeWhHZHEwcFQzb0M0Y0RXbmF2ZElCRU5VQ0RxaEJCRHMwTlJDQ0M4MGZWQ0ZGd2Y4eExRd1NBQW1mbFlHQXFHb055TlQwM1VJQXVkNCtWMmhJakF1TmJuQW43a1ZoYzRseSt1amVhUUVtQkUrSlFiSnREb2tHY094UExkU2d4a0hWNmdCQ01DemxqTWthbEJubGk1YitKQUhja2FWWThvUmhOcmgySWpWdk4wSUphakc0OG9SamNHcEZTeVFDUVhENmh6WDJkQ05sQUJNNzhnS3dIVVNXTSs3b29SdHVCMFFqQzRGbjFNRHpsSUJrQXhkdUlRZ1pTUUFTOEVhT3lFYjZqbUpGRWdHUkl1WU1YMS9GQU0rWDJTRFBvV0lFWTdKQXVUT1N6RVFQdVNCd2JRQnFiWTVRS2IzRkMvdHV5UkdGeGlDSmNxQVpTMGdiYU4zUWJJVURsbVlpbmtrQXpBbXJucUt3a0NtOEc0TlV2TE9yRVlYR2hIQXFFZ1YySDVRK3NkbFJzN0pHclVTREcrWmFScHVvcGNpeGhoV0ZVaGN3U0dwbzBhSUZ5RzdXcy9aRmhjc1dreFVVU0lWNmdURWoyS3BHeWJuY29zVE53QUxVMk82SkNaYXN3SmZRSUZKSmQ0WXdnVTNCM1lsaitiWlVUTjQ3NitOVkFsMXhBcVE4a21WWUozM0VBdEoxTy9aQ0kzWGhwcXpFaFdDWnVFUzVyMVFTSkZyc0hPdnQzVG5SRzYrV2ZwYnVyRVF1dm1uZElJWDNrUnhYN2xSQzY0U1Ryb2lPZSs4U0dmVmxjWUVMNzViaGlxT2E2NE9UcndxaVAxQTlmYnFrVjV3dTFXaDBXWEdObEIwMmw5WlV5TDJIc2c2QmM3Q25LaXVpMjU2Ky95UVhzTlF6Z3lvTFczR3J1OGh0VVZlMjZYSm5RZEZCWVhrVWtpb1FXRnpnT0s2Y0tCM0FZYWlRaXEyMzFhU0Q3a2lyVzN2cjgya0tDb05OQ0RSUU1DVHBUUVFDZ3BsTVFCTGU5UVBrWUwxWnVWVU01NjZHRkNqTzdpbktLSXVNQjIyWlVPQzFRd29GQlJ4MGM2b01ianlXWVI1cEF3TXZNbVZCc3RUdDE0UVBrQng1ZFVCQlk4RW4yNklHeU13MVBNN0lEbEUxRVBLQm9QSm9VQUFNZndzMUQ1SUdtMmhqV0VBQkxpR0FNSUd5ckRFRG5WU0RGbWNTYUJBYU1JSERJTS9MT3c2KzlGWnY0ZEgyU2pWdUxpSG1mZ2xHY0IzY1FTd1BjKzlVTTRkaEVPNTJDaXN4SUVrYW9CcGN3b3hBVlJ0S0VEUWRlaURFa0VnWFN6c2U2QTUxQU1jZUtRRUVrQnJwYmlpS1VHSWFEWGtvaGpjWkRzMHVneElGczFxZ1ozSkRIdklSUXUwSWpRbHBDSU9RWTg2ZkZSUy9MRDZ1NnFHTE14SUQ2OVVBY01KWWFGQm5BNWlFR3l4MklQNXFvQTRCTTBKblpCZ2JkYmdXZkkwOXFvR2UwQWFBYWo0cUtEZ1VrRWd2M1ZHY0Nza2wvR2lJeldrQjlOZHVpVUFGNEpxR2VKWkFjclkyZXJOS0RYRUFjR0FQdVFMaytqeTJxREVrc1l0R3AxOW5RYk5nNUxBRmdQaHFneE56U1hMVjIrNUZhUkpPVGtEYnRDSUZ4bHRScjNRWUQvQUJHbnQ1b0dZUS9ZYUJSU3RSdEQ1YUtnWEFEZ0dvMFJCY1hNNTVrVDBVRzlpRFJLQStySVZ1QWU1cWdCWm5ZZk5xSW9VUmhBY2wzcktET0JxWU5hSUE0SU9xb1hLNHNLeExPL2drREJpSEJpam9GSkV2QUJGZVVDdmJUUVJYMjNRQTNuYkdRMnRLcEFDWkxuaGg1SUZ5WUVpMmp0UGlnQUphSEhYcG9nVncrcGQzT3lCY3RYRnBxT1NyQnJpUXhxYU9VQ1B0OHVxb25reEFGUlRYaEFNaVlxMVRzaFFkbUR0eCtLSUUwZ2tNQWdtYm1ocGFuQVJTRWg5ekxvRXl0TkNYSmRCSTNGb2lWUk0zNmduVS9ja1JFa2loZDZLaERlTis2UVJKYUlHd1ZSQzY2U01wMlFRSkZYSExLaVJKQlluMkNJNTc3bmRxMEtEbnZ1TWpmZFZFTHJ0M080Q281N3l3YUdkTUNPZXJuZFVlZGJmcERhS282UVcrS2l1bXk2ayt3VXlyb3N1Z0FhS0lzTHFEeVFkRnQza2l1aTI0MDAxVUY3Ym45dmVvS2kvdVVWWVhtTjlIaFFYRi9uK0tpcVczT3dCWVJEYUlpZ0pxTzN3Q1ZWTGJpR085Um9FeUtXK3BUbWg2N0tLcm5FMFFQYmNkejdlS2dwYmVYWWpycktCOGpCbG05dFZLR0JFUzU0VnFRenhzODdJTUxqQWN0VGFpQnhjZXAzRzBxS2JJbG1MdjdRclFSZThRSGtlS2dZRU1TSHRhZzJLQXVYQUZESSs1QStXbTBGUUVYbDRNZnhlQ0E1RUF3UWFsdmdnTnBvQTl0WjBRRVhFZnhPZWRVQk44dmk1R2hxZzJSdDhZYm1WUVJYWXVYZWEwVW9ZRWwyREFCdGtHeWJ0UTcrd1FZRWdraVFUSVFISmhNYXVnTnBCMzdzYXFBNUNSNGtSN1VSUmMxY0Z6SEtBT3dpU0lBcDJsQmlYZGl4TzJyb0RxR1p6MG9sQUpkNWQrTmtwUkJsN3BhUVNsR0pZa20xM0VuNFVTZ2s3bjdJcTVaS0JsSWhpWCs1Q2pBSWZSMlNnRmhxWllNRmFvQmlYRW00eWFRbFF3dURPS2VYZFJXSmJiTFFkVlJnZHRhSDNsa0JkOGdJTFVLZ1dqMFBFRHhaV28xV0FjdHI0UWlzekJ5UG1ZVDdPbFJpWEw2TithaURHSzZiNzZKUVhPaHJweS9WRlo1Z3ZFQUlBWkVOME9nSGRFWXdiYVRBQVFHT3BHaWxWbkRCaS9UN2tRQ1JNenE5YUpSaVNIT3I2ZkdxVUF0VXR3WGJvclFTK2trR2FhOGxTak96REVqYmZ4U2pGKys5SCsxS0FDVHIyYmZkS0NTV3FIQTEreEtNWEpabmZWMG9HVlM0Y0g4VVFwT2pHUHQ0Vkd5YVdaaEhSQWNpOGtQN1VVVW9OYXZwQ3FNYmlIWVNmZ2cwV3V3WXNLSlFOUHpaZTFPNlVMa0RvMHd4WlViTXV4RUNIMWhRWWtzSmQ5VUM1TkFaMmxqNG9vWlhQMTBLSVUzbVppcjhEWlVLYndLdjRtRUdKZUFRQWE5MEFOd3RrelBVeWdVM0VNd2MwU2hNN2dhU2R1cW9CdUpJMjFNaFFKY1pwOENxZ1NIbGhvTk5VQ3V6R216c0dTa0tiNS81eUtRM2tQdEpMb0VKSjFxZ1EzR04vTlVUTi96QVVRU041WXM3MUtvbWJ4cVhlbmRFcWQxenpvSzhJSW02bXBHcXFJRzRzUzVCbm9xSlhYbWRqdkNHY28zWE81MENJaGRmdUtLam51dloyTTBWRVRkcThvaUY5MVpvZzU3N21Id1ZWelpsMVVjTnQxUGVxam9zdUxCNFVGN0xtZzkwVjAyMzkxRmRGdDlDN2NxUkY3Ym1adkZCVzIvUUlyb3N2MU1kMU00RnhjMVRHZzFVRlJjeFB2UlZCZHMxWjdJTDIzdVBlOExJcUx0ak9wZjNvS2k0R2xSdUhSVGczTnZ1RkZVRjVZYWNPa0ZCYzFTZXFDZ3ZlamthKzlBNHZwM2I3RkF3dklveEd5UU9Mb0xEN1VEZ3hvOVN5aVFSZGtONWYyZEFYSkJxUi9DVlF6L0t3SFVjS0tZWGlLRHA3a0J5Ymx3WVFOazlEd1NnSXVjM0IzRjN0c2dNRG9LRFpBenpSMzJVQmR4VjliWFFFWENTWmVUdFJBUmZXZys1QVhBQjVZUjhhb0d0dU5ScWFiZFhSUkZ4cS9HNkFndTNpQ0VHQmFXTGJEMkNJT1Z0WHFZWkJvSk8zbWd3SUlZTkhLQXM1SWQvYmhBWGNtaDJDa1ZnOXN0eWV5SU84VFEzSXBRZmxOejFkMis5V0laMkFCcnVTcEZadzRKMGNNa0FCQTRBYUoxN0lHY0F1YXZDQUFqemVqSDRJRGtKWXVBSFo1OTZET0pKWXRKUWI1UTRkbjM1UVlFVmd5d0tnMEVFL3dBT3JWVlJpQzVnRUFmbEZVVXdiam5yUlFMcUM3QVZKOFZRWG5XS2pmelVHeDI3aXFBQnhXMlpvcU03blkwT2lCWERFTzFLbmRFTUxnenU3T1QzbElyTU1lZmVVQU53dEprbHFwRUdIcUc4VDdrVXJ1eGR1QVlSQmNhUzFCOEVBeU5kTlFka2d3TXphemx3TmVxUldmV2pWT3pCa0FGMFl0M1pFQUUzTngycUtxakFNMHZvVzJIUkFTQlhZeDJSUWNGaS9JTzRSQUJBTVB1MUVDNUZ6ZFY5TlBqb2dMazFZWEZuOXlBRXVKcnBzNkFaQjNmVFl2Q0JjZ05Ob0hDRFpYQm9lYWZnZ0dRQUlPakJBajJtR1pqdnZvcURrYUFNYWxTREVsNW5ZS2hDZWRLOEhsQUNSRVFVQ205K2p2SEhWQXVRTGhtQ0JYTk5RWktBVm9STlVSaVJBTE1OQ2dVM05yVVNQd1FoRGVKQkRhVENSU1hYdVNKY0t3SWJoOHhpTkVDbStSOHpjSUptOGlrQTEvRkJJM0VocXVxRXljZ1BvVVJNM0FTT2pjcWlkMTNMa29pUnVEdFRqelZFVGVld1FSTnoxOFJ5cWlSdmg5Qm9FRVRlckJ6MzNseTMySmdRdU83Y3FvbGZjUjk2RG12dWFXVndybXV1QkpvcWhNa1N2TXR2YjRLanBzdW9QRlFkQXVjTnFsRjdiMmlqS0s2YmIrL1JSVjdiMzZpcWlMVzNNMHBSWVhlM0tLdGJmUWJLQzF2cUQ3Vys5QllYQ0pwK1lLS29McWNHUXlVVnR2cHlKK0tDNHVkZ2VxelZVRjdrelQ4VURpNTNjTlBpZ3BsTCtXNlZUajFIUHRSUVA5UVBhL1lHc29IRjhoeTducjVvS0crQXo4dEtBNWtOVW5iMkNDZ3VucHlvSHlvTnBVb0l1MGgrTnVWYVF6dkZPcURXeDkzeFJEWkY5aXpzb3RFWHMxUGRQUlVFWE9Ia1RRNnFVSEtBWEJHOUZhRGtMV2VZOCtFb2NYQjkzTlcxQ2xHZWdkK2ZmQ0JzeUJQbitDRFpWZ2dvTWJnOW9pR2hBMmJzTW5OUTZneExnNURIWHNsRE8ycysycVZSRE1kQ2FzbEFjU3gwRWF5bFE0dUQxQm1UMVNxRjF4RTdPd05VUXprUzNzVXFnNEhRQ0xod2xRMlEzYzZIcjBSUWZhZndTb0k0b041N0pWQVhXZ0V3d3F5cUREa3dXcnA1OUZLckMwNUVnNytLVkdiRUFWSGlsR2tmTXhKYjViZGU2S3ppMTMxMUVWVG5CZVhjQVVCUEhWQmlhZ0ZydUNnQmRnSGNtbnhTb010QjRhaVZSZDlTZ3prMUlIZDBDZ212RGpTT1VRU1NTOVdFalVKUmdmZUtsRkJta3M5VXFNWWw2VUZFcWk4VVl0ck05RUFpQnRMTWxRZG5Qd1NnRWlndVl2UjM5bVNqRWlCRFVLVlFCaUNlVzlpbFJuQkRDWHF5VUFrLzRYNFBYZEtEbE14dTFKU3FEbDMwRkQxU2daeUhkQUhET1RSeS9LVkFKSHlpSWlVcWdDS05YUktqT1RiU3UrcVZRTjdDMFAzZlJFRElYRnc1YWlLR1k2TXFnRjNHMXVoMTJRQnp1eno4S0ZBRGNLQWRpRmFCa0cwblhSS0JkZG83VWJWU2dDNWdCTDdKUXVSRW5TczdwUXQxSmx0RDlxdU1qTzBtSTlwVUtYZ2dkVmFrYkt1KzZWWVRLbXdlcFVvVStwclI2RUtpWkx5STRKUUtibUJQRVA1cTBJYjJGVHc2VVROd0pNajdpZ21iM0xBUE92a3FGdUprdWxDWFhnTXc3SWhEZkkvRHlRU043Wkh3S29qZGV3YXJiS29sZDZnMyt4Qk0zUnY1b0kzWE00QmQ1Q3RSem03bzZ0RWpmSTAyUVJ1dmQyMTFSRUxyaFFGdG00Vm9oZGQzVlZ6MzNEZnNsUkM2NEI1blpXb2xuejdPZzg0RUtvdlplSVNLNmJUVHlXUmUyNEVRYW9xMXR3ZmRRWHR2Y3hwQ1JWN2I5NE9xZ3VMcTBQS0lzTG5JVVZTMi9rTnVndUx4QkJISTBVZ3NMb28vVW9LQzZoWjlsRlV0dm94ZGdnc0x4RXp0WFJSVkFkak9oMFFVRjdORWJCQlFId0NnTHlHcjdlOUZVRndBMjFJNFFPTGdEejhLb0tmVW9RSE9wQ2tEQTAzWmtEZ2dpWVFFWEE4Ykhva0Q1TlV1OUFkMUJRWGJsem95Z3d1Z1Zlam1vVkRPd2tsZ0tvQzRNMElxK2lJTGg1OE4wV3R3UzVad2d6d0JRR1NVREV2VXhzZk5BNHZvQVdod0ZGRVhGcXRvOWFLb3p2ZDQ5VVVSY0RMdHh1aU1HY01YYlFjSUdlNW8xM1VVUVRWaTdSN1FneHVGQnJvZmZDUWFDSzVjZVNJUE1BN09pbWR5Wm5WdFlVQWZVQlZCZGpPc3ZxRkZGeFg4enh2RW9ObHFXR3o2ZVNBdUoyS0JYSHpHbTU2OVZRUTRZTzVJamhBWEVmTTBuVlFaM2NDNE03MVZERW1RNDZlYWdXS3RGU1hWQkJwTTA4RkJwb1M3N29OSll2MEpMSUJPVE83YUtnOFNOajVLRGFTV2doL2VnR1JhQysra0RkVkJkMkl1SUdpaWpsTzdlS0FHV1l1QU9FQWc2aUJMYm9Oa0tndUliU1VBZDdpZHVYUUhLMEJtWWVYZEFvdTNHL2k2RFoxZmFRMnFxTmJkUnFDUVRVcGxSRndMYjhlMnFnUVh0clRXT2lzUmkwQUdwbmZaRmJJUzlOVWdBSXVCYUpuV1U1Z0FhanJIZ2tBZTZyeExOOTZvQklnUmFaZDBRTXBJMkZXUU1idFBCbEZJN1Y2QW1lNnFGSkJhcGI0ZEVBSkR5SE50RUdjbGhUY0JBamhvWnp0N0JBUWU0aVVLV0FRUEdLNklnRWd3dzZmZENBRWgrdTNqNW9zQndBUkkyMFFJYnBjM1RvZEVDbTRFRXM0M29rQzVCMjNvVlFsMTRkaVdxZ0J1RElJbS9hTjlhOUZZRkpCY21XM1FJOUQ0a2xFS2J3SkpaMGhVemVDM05GWUltN1hmVHA0SWladUlHNUtvbmRkTEFzWUpSVTdpNEwrM2lpSlhYQVFJTlJ2c3FpSnYwUGJaSUkzWGlwTGJCVVNOd0w3SUlHNGdFUDNWNTBTdUxjc2lvWFhiOUZSejNYQjJIc0VSRzY0TldsVlJ6M1hVWXp1cmhFY2tIbTIzazYwV21WN2JpV2U3UlJWN2J6dlJJcm90OVE3dHVwQjBXM25lQW9LMjNrYW9MMitvWW10Q0tLUnBhMzFEWExTZ1VGaGZ1VVJjWGRTVkZVelAzb0syK29RV2VLQkJZZW9abnVGQlVYblV4b2dvTHp2RXNvdFZGeGlTNXFVRkI2aElJQm5SOWV5a1UzMURMRnl6d2lLNTNkWmtvcW4xQ2FIaFNCODZkVURDN0lzOEVJR3pKaXZhUE5GcGhlWGNrU2Zkd2dlMzFDN2d4U050RkJRZXBjN2t1S01VREM0NG1XSVFFM2tobitLQnhkY0IrWnBVQitvYUFqbUhTQmhjTlRPb1FISzV2ekE3Z29Rd0lJbGgyM1NrTTlXdXFkTjBCK1orRUF5Y055elFnd3ZMVERpWjBRSEl2VjBCenVabmJvZ1AxS3RBUUhNdCtZRjZuUkEyWkFreUpNSUFMbWRvWnlnWTNOQUpmUW9NTGk1dWNjb01DMUNIMUh4UUVYRnFscExrb0NMak5yOVI3MEJ5dUx0Qk5TRkZESzRPNWNING9ObGNBekRWMFFSZmN3RHpzaXRrNW1LUDBRTmxERXRGVkFNaUpMa25UUlZDNWtFQnRlTkVnYk9URWFrd2tVQVdNRm5EeDdrQnlySWZhSTJVZ3oxa0YzNnFnNUU5RkJzbmVRVzhmQkF1UkxFMU5GUmpjejEzTktJTmxyVnZnZ0l2Skw4VlNBQzgxSGM2Y3BBYzdnV2htaElGRjJMa0NUcWlCbVhZNjZNUFB4VmdJdnVJcVFkV0hYcXBCaGRjd1p3SGRpZ0RtSkk0WjlGUm5JaklPS09nMlJxSm1HWlJReUpkcERDUGdxaGN5U1NhVkgzSU5uY0hMa1BOSDdJQm1SSnZIS0tHUmR6RHM2SVhNdzRnMURhYUlNTDdnSUxnR2pJQTl6QnpXb0xlYURBbG0ycXlEWkVqYWRQd1FBbHhXa002RGZVZ1lsMEM1bDVJY0NSQ0JjMlo3aHVnWE80dklEMThFQU41ZzVid2tDNUVQS0JEZVphSE9vVkNpODF5alJreUUrcGNTUzhHaFFUTnpsZ1hkVUEzazFKYm5WQXBKSDhURFpLaEQ2ak52cTI2UXFaOVM1ZzViWm1kV0JUZmNBUGJ3UVRQcWVmbWlKbjFDSnkzVmdtYjdtbTd2UkJNK29YSTl5RlNONTBMYmxWRTdyejAzKzlCRzcxYnZhaXNFcnJ5NGt4cWdsZGZxTklRUnV2OFZVUnU5UWpXRVZFMzNLb2hkZlYwRWJyelI0VlJ6M1huZnlWRUxyeVhEOUZSSEl2OGRVUjU5dHkxbEY3YnQ2N0tLdmJmMjRVRnJiajFSVjdiK1doUWRGdC9sb3BCYTIvWXUraWtWYTI2amQwRnJiNTM0VVZZWHlCWFdxUVdGKzVmaFFWeWh3UU9VRkxiNHIzMFFVdHZZekZPaUN0dDUzRFBCVUZoNmxKMGRsSUhGdzFadFVXcUFrU0tJR0YraDluUlZjd2RaMGRRT0w2c2VVRDVVbnVnZTMxSmNsZ3BCUUU4ZTVRTUxnWEdvMFZCZm8yb1JUWkZvOXZGQTR2SjFhVklHejUzWThvQ0x5dzIzUU83aVoyWkFSY1RVaHpIZElEazhhYmFKQTR1WTlWQVRlUThNQnNpbUYrTENVUWNycWpYeVFISUdvZjRJTUxnSGR5ZnRRTVFETUI0ZEJnSGN2SGdnMmcwWmh1Z2FYaDZxS1hMU3JDYUVxb0pJbzRab2J6UUZ6UUVHN2RBSGQvbHJ0N2JJTmxxMnJvSHpjUDNxb3JabVJvQlRoVUZ5NG5xaU5NSHgwS0FpOTRBZ2VTZzJSZG5lWE5mYlJWUU54MUlhcUlPV25pTlVBRzdEaEtHRjAwb2FxS0J1cnJ1T2lxTVNXZ0NQWUlDKzRvWFFLNUcyNVFGNkZqQjFRWi95aUFVQUJ1dEh4SHZRRis1TkFVVURleEZOMjZvZzVORGRrVUNURE9RL3NVUU0zSmx5UEpGRElqZmZyNElnT1dZMENEWkdEUWlIcWdEblFRMm5rZ3preVBmQ0FPV2FTVDJRRXc1Y3NkbEFIRHc0NHB3cUJVTUlmN0daQWZ5dVcycDFSUXlPek5RSWdaVmo3WlFESmdDM1JwUUEzbU5XOXFLS1hJbG5BWXZKbFZBTjBjYXdnUTNSOHhmcXFBYnJuQkZQWjBnVjJJYW1yb0ZON3UxTjBBenJ1ZFRyN2tDWlZqc0tJRnlOUnV3UFZVSTVsdmxxN29nRzdsNlFLb1VtY2MxbElGdXZBR2dHenBBaHVNc2ZGVUlib0FwV2lCTHJtRVIwNFFTdXYwVlFtVGpjSUptK3BCZEVwRGZOZWdRU3V2QWVxb2xkY1gyNStDQ1YxNm9uZGN4RG1VRWlleUNOMTh3YTdLd1J1disxQkkzTTUwMlZSRzY4cEVjOTE3bDFvUXZ2OGxSRzY2citLSWpkY3lDT1UxbFZIQ0M5REt0VlVYdFhkRWRGdC80S0t2YmUvWlFWdHUxQjdJTDIzd2ZNS0t0YmRNSUwyMzdkbGtXRjZpcVczS2l3dkxnOHFLdUx4dXlncGJlNDhLSUtaQ0FUWFJBOXQ5UEJCVVhtSkVRU29LaSthbDJoQlFYbmJ6VUZjeDMyUlRDNllyVW9IeUw4VVowRGkrc3RPek1vcDhnOHhvdzJvZ1llcE5XZWpoRVVGek04ajRxS2Y2bXJraHFwQS8xQlV3YUJBUmRHb05JUU5sVjlhTkZORW9Ma2F5QktLWVhYVXFEVkF4OVFCdUtieXBBYzMxTDdqWkE0djFwMVFObnQxYWlBNXZVTzN2UUVYQXc0ZlVIMkNBNXhYdU5GQTJZRllCcG9nSXZvZFVCellFN1VsMEJGN2dFZU5hb0d5M1BmOEZGYk55ZGtRUjZna3g0aFVBbHBNK2RFQnlEd0VCQkZYYnNvTURrNG5lWTltVkdlMEVPV2ZkQm5EU1lLQW5zNEtnTTBvU2FlOUJuTHM1MUNvd094NElVR2ZUVFJBQVMwbm5zcUdjN3ZxZTZpZzVhb0xPZ09SazAyQmhFREtQdEgycWpaSFFucHFvTTh0bDJIaXlBRnlLMXE2bzJScFJ5OVpHaUF2TXpJVUdMeTBvb09DZHk2SXhMN2RFQXJRZ0RhcW9KTm9jOHpDZ0JJbGoyWjBvMlFxOFZsVld5RnNtQzZpQmJjSW9IMFRJR1pyNEtqSDFHTW1xZ1VYVmtIOEt4dXFwVGVIZ2pseWlOazNWM2RBTTdtdTl6VjNRS2J5Q0piZzY4b0JucTRBMzhsUURkekFRREtocEVxQmNoR1dncUZRbjFEVXhMVDVJQmRjQnF3NHAwUUxrWVlkUnhvcUE5eGwyNFU1QXB1WWttYXkreXFVdVpyUjZiUnlnWDZuZHlnWDZqTzZCRGNha29FeTJMa1ZWQ1pQd3pPTkVDRytoMW9nUzY2NGlyS29RM2FIczIzWkFoOVNmZVVSTStvVzVWRWplQUt3UHdRVHV2THh1NUxvSkcrdTVWQ0c2WlBtZ21iL05CRzYvYnNORlJHNzFEMm51Z2tiMEVUYzNEaFZFYnJ3L0lWUkc2NTVNa2FxOHdqZjZua21CQzY2SlZSRzY5a2dqZGVxSlpvT0syNUVXRndLaXFXM0ZVV3R1Q2d2YmZ5cEJhMjRhRkJXMjl2Y29xOXQ0KzVCYTI5bWVpa0ZyYnRCM1VWVVhDSmRDcWk2TmtWVzIra3pzb0tpL1NyNmFJS2krbXU2Z2NYTUlMSUtDN3F4MlFVRjd3Q2dvTHdRT04xQlFlb05Jb1NrRGk5d3pPeWdwa0g2L0JGTmJjK3JFbVVEWmtQWGNzZ2Nlb1F6OXdpbkY0TldmbFFQbFNmc0NBaTZyVk9uM0ZBNHZBR2cyNktRUGxWaVlDQnhjRHArS2dPUUhRR1NnTDFZNjFWcW1OL05kMUNpTG9aK3U2QmhkWHlDQTVsaUdxZ1lYOHQwUU5uSXJ3U2lnTGhMMUZTRVEyVHdZMmxBY2hSMk4wRkFSZTdUcTZnT1lvUUowS1FGeVF6UVpxaW1GNzl0VWdHZTFkZFVnSjlSbTJTRFpnenJQVHVrUVJlZGV4OW5SUnlBTDZEcHlvQ2J5Uk5DelFndzlSdWVJcWcyVDZTRFJWQnpJY3VHTWVDaWdMd1hMOXc5RlVINmprc1lDSzJldEVHeTNycCtDSUp2Rlk0VVVCZkFkbnBzcWpaTStyQkJqY1dZbnVvTm1LUVBoeXFvRzlvbzc3K0tJMzFLQUd0YUlvaTQvTkpJT2lnR1dtcG1OVUM1QjRwVXVxQzlwNDNEcUJjNWR3VzNvcU5tZCtFUmpmcU81YlpJb1pjRXZVTWlCbEVrUkwxU0FQSkxoeVdQVkFEY0hreU9GUUxpNWZiUk1EWkFQTkhsMFVEZlE3S0JmcWZORURVS29COVNoZXFLWE1WQjA5NklCdml1dmRBanhOV1k5MVJqY3dFUFNRZ0J1NHJDZ1hObWU1dmlxaFRjOUtlL2hBdjFHaHp5VWdRMzZDdkcvZElGTjJnTDlTNm9YSUFvRU44TlNZNkt3SWJ4cFhoQWg5Ui9scDE4RWlVaHV0MU9xRktiMmwzNVFKZDZsWmtIb2lKM1hoaEx2QVZ4Z1R1OVJ0ZXpvSm00Q1FXVkNaYTcxTElKbTRPN3VReUNkMTRWZ2tiNnp6S0NWMS9iUjNRU3V1cWRkMVJJM0JFVHU5UVRxUm9rRUxyNnRxcWlOMTZvamRjN3owUVJOMi9aVkVicis3cXdSdXZFcEJDNjVVSTQ0VGxSeFczQlVXdElVRmhjR1FPQzNJUVh0dUc2aXEyM2FvTFczRHJ3b0tpN3dSVnJiMUJlMjRSd29xb3ZiM3VpS2krQUhVZ3JiZEZVVlFYczJoU0tvTG04RkJVWHUyNFFWRjFQSUtDZ3UwZWdyMFFPNTdJR0Y3YXVnZTIvZG1yN0ZNaW92Qmd5TmxBK2ZNR2lRT1BVa2lWQTR1NWNVOEVVMlV1Tm9LRk01MUE5dEVVK1JqVTdvR0Y0MExNYUJBMlRhdVJwUkE0dUVCMmFoK3hRTUw1SmVOdkJBd3ZMOERYM3FRTWJoVjVRTUw5YTZwQTJSWlFFWHdLODhvR3lGWHBWQUgxck5TZmJaVmFKdTNKWi9naFRpN1dwVUFGMjRiZVhWZ2JKOWU2Z09iT08reUJzZzVMdngwUlJGekJoQmFXUkF5Z2gyZUoxQ0JoY3pEd2ZSRkUzaG9JZnhJUkdGd2d4eWdPb1lNd1p2dlFESjIwNklHZTA2dDRoUUFrRmhXWlpVRTNhRXhNS0F1MDFJMUtvQXVrUys4b00rcjlkblFZRUFrZzhNNkt3Z0VPVzFSR2R5NExBYzFRWUZuQU1qbEJpZjhyU2JuQVFZa2J0TEhsQmdROEUreFJRZHEzYXlpTTRBYUdhaURQRUIrc29BOEhRQnk0NklCa0dveG9FQnp0ckRTL0xvQWJvRGtCdGtVTWdLTzVVUUhha0hZMFZBeUVtcDBDREc3WXNaUVROMUtuelZCeWxsQU05QWFVTmRGWVVNalN2M0lBN1VMVi9GRUFsenY5bWlBRzdWakdpZ1hMVmhxN1RWVURQVWQrNkJUZWRRUGdrQzVHdFR1VUNtL2xtZ1R1ckFtUUxBblJBcHY4cENvVTN0U2VuM0lGTjhnSUVjMTFiVkVLUzFOV2hBcHVBZVdKMVFJZlVML0FCUkV6Y0tFdG82c0NHNEViOG9KbTlqd2RWUk0zT09xQlRjWjBtT2lCTXgzQ0Nadk1oK2pxd1N1dmw5a3dKbSt1dktRU053STNWNWdodSs4SWxTdXVoaVVFYnZVKzVXSWpkZlh6VmdqZGU3OElKRzUxU3BYWFNpSTNYT2doZGZLc0VpU2EwVlJPNjZ1cUNiL0FESXJoQjVWUlVYY29MVzNVOTZndGJjb3FnTzBxaWd1UkZyYndvcTF0L2lvS2k0SFdsVUZiYjI5ektMVmJiMEZSZDVJTFczdzFWQllYMEhtb3B4Y1BCQlFYUytwUlZMYjVyUlFVRitsU0I3a0ZSZURMMFVENTYrQ0J4Yyt3ZEtLWkg3MERDN1YyWlFQYmZUVlVQbU4vYnNvSEY0ZGhFZFVENTdrY0VLQnhmVjQ0UlRaQ0pvZ1lFVm9hSVV6MGNUeWdZWDlqc29waGVBTnh2OEFpcUNMdzRZMGRBK1lrY1FGSUNMcnFrMTZvR0Y0M0dqSUd5ZXBmL0NvRG13N29HeUI2L2FnT2VzMSsxQXc5UVRxZFFwQnNnekVQcVVEWlBMOU9xQWd3SE5VQUJOU1J5RUJjVFFkS3BWYkpuMWhVb2cwbHdFQUYyd0xtb1FwZ1hyMkpVR3pCblFVZEFUY3phYythRFpGaWZBZmc2QTVNQkFCS0FaYVRSZ2dZWGdnTVliWFpJQm56MEJRRVgwbWFrZkZCaGU0WWdFYklCbUNaTHZRTXlBNWc2c0RvZ1UzTVF4alp2aWdJdmloSENRYkpvQlpBdVpGRHJxWFZHTnpzQ1J5UHhVR3lsdkJCc25janVnMlhMTnNnR1hnS3NnQXVPN2xrS0dUYXdOU0ZTczRocUVxRFpRSjdCRUxrSVBtcUFTNE9qRm8yVUdQcU53RWd4dUxON1NnUTNralk2S2daaDl4b1VDbTVuMktCVGZVdlVDRlFNb0lmZ2xBcHZFa0h3UUtTQjR3Z1hQc1FxQm1UWHAyVUN2K0NxRU53Y3VTNDBRcFRjSk5TVUNtK3JWUkM1YVAwS0JEZlhyS29UTVVKZEJQNmp2elVxaFRkWFZCUEtvMHA0b0VONURaSHVnVTNzSGV1cUNadllUVFVvSm0vd0M1VVNON2paQk0zUHIxS29RMzFjb2xUdXZHL1JCRzcxSG9xaVJ2VmdsZGVCVHNnamtTNkJEY0J5aUkzWE9xSTNYcWlGMTNkVkV5V1FUdXVlaUNOMXhaMFZOOVhWUnhpNS90UkZBVVZVWEtLc0w0UVZGNTBVRlJjL0NCeGNSMFJGYmJxYW9xd3ZLZ3JiZm83cUNvdWtOQ0NndkxUb2lyVzNxQjdiOUVGaGZEYXJLcVczOG9LQzlCUVhTN3FLY1h2WFJCUVh2ckFUbUZNd0pLQ2d2MTNVZ2NYdDk2QnhkRHUycUJoZFZBNHVOT3lCaDZuTktsUU9MK1dtVUQ1cEEyVDBMN3VvcGhlMHYwUU9McTZiblhaQXd2ZUQwWkFYQU1TZ1lGeU9KUW81RUVCeFBpaWlMeURXRURtL1YrRkFmcVE3OUdWQnpxQnJIUlFNTHpEbVhraElObVQycUJ1a0Q1SFF2T3lnT2JmYWdPWnBNMFlvQWIzNkJVUG1MUVM5Qlhvb05rOUQxS0JzeXdrZzZHcURmVTJralIwZ09iM0NXR2lEWjZhTlJBYzMrSUtESDFHcVdtcVFiTHZLUU5rRFh3VWd3SWFaMVpJQWJpSFlxamZVM0xKQ3NibmdkRUd5dEk5d2RCbmtiQnBRSElOQVBRcVFESXQ3Z3JBTW5kbUZEeXlRQTN0UXVkdUVnYkwzdW9CbTdpSzZLd0Erb3hEcEFQcU5EaGpxZ0dmTmRVQXpGQ3hCcFZCdnFFVktCY3lYUFlGQU1qTXZjZ3pqd3BXRUF5SUZZQVpBdWJhejFWZ0dRUHhTQlRlOHdZZDlrZ0J2YWtFNm9Gekk0NFFETHpxcUZOMnBobEFDZVlWUU1nOWVHUW9HOERYelFJZlVvTit5QkRlK3VxQlRjYWFJaFRld0xUdXJBaHYvQkFwdlBkRlR5TTFtSVZRaEkxS0JjaFB6UTlFQ20vU2lDWnZjbXFRSWZVWi9lZ21idXAxVkNHOHM1N29KbTdzRlJNMytLSlVqZnlxSm05NjY2SUozWHowU0NWMSttaXNSSzY1VVROeUlsZGZ5Z2tidWVGUkUzOHBCSTNFbXFvUzY1a0VycmtFYnIxUkc2NTBRanlxT0lYZUswS1czMFV5TFczcGtWRjFGbFZCY1ZSUVh3b3F0dHlDb3U4VkVpZ3VRVUYxUElvVlVYZmVpcTIzK2VwVUZSZTRIS2tGQmZ4S0NndW95TFZMYjlWTXFwYjZtK21xUVVGK3RGQlFYbnBORWdvTDlTem9IeTViWlJUaTVtOFVGQmVmQkE0OVNka0RpODc5MUJRWDhkRUJGdzAyb2xEQzU5ZXlCOGpMUzJpZ0l2WnRocVZRNHZNVmhSVC9VN2JJZ2oxTmFuN1VnY1gxVWdiSTZtbEVVMlo5dDBCRjVuVUdxQnMyRDZsQWNoSW1FRFpRL0tnT1ErS0ZFWEZoUWdxcXdKZnVvRG1mSlVObTNiaFFiT200RDlFREQxRzZoQWM5a0JQcWVTUWJOajNiVklEbUIzMDgwZ0F2ZmJubElHelBRSkFYZ0NkcXFERzRrSFRzckJoZnNleWcyVW1hNmZhZzJmK1VPVWdPVGJ4US9ha0F5dXE4YWhCdnFhbWxkRWhXemJWZ0tRa0JGMEJrQXpxMGI4SU5uTWsvWTZzR054TFNSdWtBemh5VEtRQTNNWTJvNkE1UHFWQXVlclVvT3FzR0Y3YVVnbElCbVF3ZWxkRUFQcURkdEhTQWZVT3pqVkFNL0RRQUlCa2RDeklGRjFOQlYxUnNqcnFvVWh1YXBOdk82cVZzbUJJTmQzUXJHNE1kRkFwOVNPMHFoVGZRNm9GTjVBREVnK0tJVTNCMFV1WW9OS3F3TDlUVklGTjRFVkhYNzBRbWZMY2ZhZ1Uzd1pndlJVTGRjWjVUQVhLSlBjSUZ6QW9YUlNtOW45cW9oVGVKOTZLbWIzUkV6ZnUvQnFxRU4wbC9GQW1iOG9FTit5SWtiMzdLaVo5U0tzZ25kZFhmZFVJYnVTZ21idkxSVkttYjZnSUpYWCtDUkVycjlsUkkzK1NvbWJ0YUlpWnVRU04zRW9KbTlWVWplZ2tiaWZzVlJNM0JCSzY5RVR6bXFvNUFWUlVYSUhGMVBlb0tpOEpCWVhLUU9DaXFXM0lLQzc3bEJZWHFLb0x0WFJGQmR5Z2NYSUsyMzdhcVpWUzIvNzBGUmYrS2dwYmVkL0ZCUVhqd1JhY1hhK2FCeGYwNktLb1BWaXZWSUtXM3hWbEJRWCtYdlNCeGZ2UlFPTHRhSUh5b1FZSlJUZlVQMnBCVDZqdE5WQVJlT1ExVUZCZHpVU2ltRjZJWVhnOXRFRGk1cUhwc29vNWJ0eXFnaTVta3NDZ1lYdzcxVURDOXp1UWdiNmxmSW9HK3B6T2lSUnpjZE5rZ1lYQXRvMGhFTUxpb3JDOTZSelFxb2I2bGFCOUgxVVVjMzZJRG5RL0JBY3cxUTJxQWk4TUhrb0RsdVowUWJJTXo5a0t3TE9INklVY2lSVnJrQkJZTUNHUUhJN3dvdEUzeWVLb0JrWWFkRUJ5SUFNY25nSU5sTFFnd3Z1NENEWm5YeFFiTXVBRDFsQU1ycXZ6Q29PUnA1cUFaTkQxUUY0K0NBWlZEVjJoQnNnWXExQXFCbGNYN1FkMFNoa2RUMVFyWjZka2kxc3RUNG9sYkpRb1pDWWQ2aUZRTXh2MVFBM2huRTZvQjlSb2pwOXFBWnV3OEFRZzMxR01tU2dYTUJ0VHFnUStyV1dDc1J2cWFlU1FLYjJMa0RxaWdmVUViVjZJRnprNjhJaE16d05tUURPdW5SVUxrL2ZSUlN1eE9pcUFieHYzVUM1NmVhcWxOK3RBaUVOMjVIT3FCVGVLYm9wRGV6ejVxb1EzNnBBbVRQUFVvRk4zZm1FRXplREd1cXFGTi9MdFJTQ1J2Zm56VkNHL2xCTTM4cXdJYjlVUk0zdHFxbFROOVVFN3I1clRSTVlFcnI5YUtpZDEvS0NadjdLd1ROMzRvaVp1YlZCTTM3VlZWTTNwQkUzT3FoQ1ZCTTNLb2ticFFTTnlvVEpVY3dMb2huUVZGeWlxQzVCUVhxQ3R0eUNndUJVVlFYTWdvTDBWUVhJS0M5UVVGMnlpUTR1Vm9vTGxLcDdiMkFiVFJCUzIvZndRVUYxTjFCUVhzMnFVVXR2ZG4xVVZRWDh2dUVENW5aRk9MK1hVRGkvelFVRnczNUtCeGZPL0NnY1g3dytxQnhmQUxkUWdZWEU2c2ltRnpJR3pZYmNsQTR2cktCaGZRS0JoZFBXblpBOXQ4UXdHdXpLS2JQZW1wS0lPVG9wc3BkK3lWQnlBRlhaRk5rWk5FcUFMdzBFOU82b2JKaTd6cW9waGUweHdnSnY2OVVRVGZIdlNxYjZnRzhCUUg2aFBYVk9RTjlRYlJ1Z09ZYXZKUURLWExIbDVRRVhqUWs2Ym9nbThoZ0poRkhJUFZ5Z3c5U2plT3FCczRyMFVDNVZNRGNoVUVlcFNTNDBkQWMzbC9idXBRUjZoNFlvQUx5d2IyWktEbWRJU2pabHlhN0lNYnlBUGlnR2NUVTBsQnM2N2psQU02c1FTcU5tWUhMQkFENm1oTG1wUFJCc3oyMENnMlpWQU40RE9aMEhDQVpna3oxbEF1ZVNJT2FLWE45ZXljZ0dhQlI2Z0kzODFRUHFOOFVRQmZGWlJTbS9VU0NnWElRMjZxQWJpZXFsQUpETVM2dEdOd09wNTZLVUtieEZRMnFvR1pPclRLaWxONEtJWDZtanNxcERlQVBnaUVONDA4VlFwdkwxcG9vRnlKMVY1QWh1QmsxMlFBM2dNaUVONW5WQWh2bmRBaHY0VkV6NmpvSm0vdG9nUTNuUlVJYjkwU2tONnRSTTNvSm04Ym9KbTlVVE43OG9FTjNLQ1p1MjhVcUVOeXBFemZ5aXBHNVVUTjZDWkxvaVp1UkU3cjFSSTNjb0ptNzdncUptNVVJL0tnNXdWVVVGeWdaQStVSkZVRjFGQTR1L0ZVVnR1VXpnVkZ5aXFBb0dGeENDZ3ZCVVZRWGNvS0M0YjlsQlFYY3BBNHVvaUhGMzNvSEZ5aXFDK2t1ZDBEaStzdWdvTHFTb0tDOHRWQTR2ZXRVVTR2NTgxQ25GemU5MFU0dSs4SUcrcFJJS0QxS2JDcnBBMllDZ29MMkZVREMrUnJ5cEEyVDBxRURDN2xrVTJYdmhBMmZLQWk2dm1nY1hzL0tpbUY2SU9jbWFJR0Y0cVBCa0REMUJSNlFVaW16VUd6cDVsVkJGd3A0SW92czhJQ0R6NElObHNRZGtEQzR0dXlnMmJieG9pTm5Bbng0UlJ5TlhaNmpsQWN1ZWlEWlJXaUE1dzdnOEZBUmUrcUFaeTJUN2gwQnpuM3lndzlUUjJPM0NBL1VKYlZJalo3bDNvaXNiL0FNQWcyWkZVQnk1WUlGemZVYXpzZzMxSzY4SURuejVvQjlSNGVRZ3h2TzdJRXpWaURtVklyRzQ3c2dHZmlrQXo3dVlWaUJsUi9KUld5WmdHQTBLQVpXaldORlFEY1RxZVFnMmRXN0ZBTTY2YnBBdWV3NkpBdWUvdlFLYjlhd2cyWTNaQWh1SEhLcUZQcUFjZEVnVTM2U1dDUUxuMlFEUGxrS1EzRDdWU2hteWdUUGRWQ205aXpvRnpyNXVnbm1PaDNWQ20vdWdRMytWRUV6ZDd0VlVLYm5jT2hTRzlwUVROL3dCcUlRM29KbThWVkNHL2FFRXllVlFodTVRSWJpaUprb3NJYjlrZ21icHE2b21iMEV5WFpWQ1pBSUptOUVTTjBLaVpQWlVJYm9VRXlYVndFSlJNbHk0N29PY09xSEJLWkRnbmxRVWRBd0tLY0U4b0tBbllxQ2xwS0NnSm1DeUNnSjJLaW5IZ1VEZ25aRlBhVHNncUNkQW9IQk94VUZBU2RFRGduWXFJY0V6QkNvWnpzb3AzdTJQS0NnTjJ4UU9EY05EeWdvRGRzZmdvSEJ1R2poQTR1Tkdvb3BnVFZpZ1p6czZCZ1RFRkZVQnUyZlpBd3V1L3dsQTJSMlFPRGREQThxQmdidGlnWUc0YUU3b0hCdTBIVlFFa3hDS1lFN1ZRRjdwZ29DQ2Vhb0M5MUdLQndiNWEzdWlpOXdxQ2RuUUZ6RUZFRitQSkE3M2FncUt6M2FnOElqRWw1RG5SMVE3M01ZVVVBYjVnOTBRMlYyeDZJclBkc1VRU1N6RVA3ZFVWbnVtSjdvalB4Q0F1ZEIwMlJXYzYybEJuWjZ4eHdnem5RUnFPRVFYTE14UldjN0ZRQjNvNDZiS296bjcwVVgyQjZoUUJ6dCtDcUE1YWlET1JwVkJnYnR1aklBU2EzQXRzVVZudUZBZUVHeXVNQUZ0VUFKdWVpQUUzYkVuUkFIdWNCa0FlN1lvQTkyMXlCWHVZd2lBNUdoOEZSc3Jxc1pVaWtOMTBRZkIxUUNUc1cxcWlGT1QwbEFEbEZVQ3ZjOGdsQUhPZ0tCU2JobzZJVjd0QkhDb0JOMnlCQ2Jub2U2QmNycGcrQ0JDYm5vVlFoTjJvSUtCQ2Jtb1VDdWR2SkVLU2RrQ0c0aUdKN0toQ1RzaUZKT3hSVTN1YWhib2dRbS9ZcW9rU2RwVEFWenNxRUpPeEtJVWs2Q09GQk56c3FwQ1RNRkJNazdGVVRKT2dLcUVKT3FLUWxFSVNaZ29KRW5aVkV5VHNVQ0VuYnVpcGtuWTlWVUlYUUlUd2lFSlBMb0ZubFVmLzJRPT0iPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0icGFyYWxsYXhfaWxsdXN0cmF0aW9uIj4KICAgICAgICA8ZGl2IGlkPSJhdXRoIj48L2Rpdj4KCiAgICAgICAgPGltZyBhbHQ9IjQwNCAmbGRxdW87VGhpcyBpcyBub3QgdGhlIHdlYiBwYWdlIHlvdSBhcmUgbG9va2luZyBmb3ImcmRxdW87IiBjbGFzcz0ianMtcGxheGlmeSIgZGF0YS14cmFuZ2U9IjIwIiBkYXRhLXlyYW5nZT0iMTAiIGhlaWdodD0iMjQ5IiBpZD0icGFyYWxsYXhfZXJyb3JfdGV4dCIgd2lkdGg9IjI3MSIKICAgICAgICBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBUThBQUFENUNBTUFBQUFPVFVDOEFBQUFBM05DU1ZRSUNBamI0VS9nQUFBQkRsQk1WRVgvLy8vTXpNekZ4Y1VBQUFDMnRyYVRrNU1BQUFEVzF0Yk16TXk3dTd1dnI2OW1abVpVVkZST1RrNEFBQURXMXRiTXpNeVptWmxDUWtMVzF0WnJhMnRtWm1iVzF0YkZ4Y1d2cjYrRmhZWGUzdDdXMXRhMnRyYVptWm5lM3Q3VzF0YkZ4Y1dscGFYZTN0NjJ0cmF2cjYvbTV1YmUzdDdNek16RnhjVzd1N3ZtNXViZTN0N016TXp2NysvbTV1YmUzdDdXMXRidjcrL201dWJlM3Q3MzkvZng5UGJ2OHZUdjcrL201dWIvLy8vMzkvZng5UGJ2OHZUdjcrL2o2ZTNpNk96ZjVlalYzK1RVM3VIUjIrREgxTnZHMDluRjBkZTZ5ZEs2eWRHM3hzK3N2Y2VkdEw2UnFMV0VuYTEwbEtWcGlweG1pWnhiZ0pOYWZwUlFkWXhLYzR0Q2E0TTlhb00yWW5zeVlYb3dYWGpGcTBOL0FBQUFXblJTVGxNQUVSRVJJaUlpTXpNek16TXpNek5FUkVSRVZWVlZabVptWm5kM2QzZUlpSWlJbVptWnFxcXFxcXE3dTd2TXpNek0zZDNkN3U3dTd1Ny8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy85SDJCOVZBQUFBQ1hCSVdYTUFBQXNTQUFBTEVnSFMzWDc4QUFBQUhIUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkdhWEpsZDI5eWEzTWdRMU0wQnJMVG9BQUFJQUJKUkVGVWVKenRYWTFqRTdlU1R4NTN2TndYM09HV3V4Y083c2lEZDd4Y29ZUVhycFZDYVFOckIrdzRNU0h4N3Y3Ly84aHA5RGt6R3EyOXRnbTBSUzNZdTVZME16L05qRWJTN0xLMTlkbktZTEFYeTJEdytmajRBc3JPZzZjdnRkYktGdi94OHRtRG5jL05WNi95bUxEdnY2NGd3czdlSWU4b2xQL2JXNkcveHlwamJDVysrcFpEN1docW5XZ2Y5TzVsOEN5MjFoSWtUM3Riem1HQ1E0Y3UrL1BWdXd3aTk5cjlnWTlIdDI3MTZtVG5XUnhJam9VTzk1NzFHOXRCcmgyNk4xOHJsSDFKZ0R1M2J2YnA0OEVoYXB3cFIwQkVQMWlCTDAzKzlPUnJsUkxOeGY4SDVmbXRXemVXNzJIN3dMT2VHWXBtM3crMmUvQ0YyZ2ZON2NmWFNtWFhFeVFEKzdDUFd0NCt3TG9odUE1MDcrQjJMNzVNZDlpcjllTnJ0ZkpVNFB1SFd6M1U4dmFoYjRqVlEyZDkrbkwwcjB0Miswem9vQmRmcTVWdEJvZWwvbDBQdGR3NTFKbllOQUJodi8zajBueng5cm9QWHl1V0J5b3JXbjI3dkZwdUgzVHJBd25PckFMOStQZDkrQ0xkOWVCcjFjTEZzUnozVU11blNlcmdsTW1OQkVXTWNiNWZuaStLOGpXWXl3NGRCdmZSWTVMZkZiUXJWeEoyL2VmbCtNcmMwVFVFSDN1U0hNdFA4dHRvVW94V3ppZFo5TVZOWS9xZmUvQ0ZzTHltNE1NVGpYUjdUUElobGtOVGk5YmNUTUxrRXl2cTV3djdUL0ZkV2dOY1EvQnhPeEx6MmduOEx6L0ozMWFDZlpCQVJpdHVMUGJxVHdzN0ZzS1lhd2crOXRNd1JERjZlSzNvOURTMUVpbzh2dlM2OG1JQmhYMmhtMnZ3cGtrdEVlSGxKL2tkMnBJRzEzUWhFKzNKZjN6VFRlSXdqejE2QlVVcmxyc3FtcjZPSXZ4cGFiVmtvNWhrZi9Iay92MXY3OXkvLzlmdmo1U1NWRWMvN3h6cXV4S1V5L08xY25sS0NMcS9sdzgrdGc4UnowZ0ZucHV3S1pRN1Q0NXlaUUdJN25UMS9BelZEQTM3QkVVcmxtM05sZHFVdnk2dGxydXNwWGNPZndJY2J0NjhZWHE1Y2VQR3pXOStqTXFIcXovcUVHNDcxa0xyN3VYNVdybGt3UlNRWDM2U2YwWWJJamhJRC8vMG85TUlPdWw4MzZIOHU3algvbnl0WEE3b3hHZ3Z2bDk2R0xiRlNBemdZQjM4d3hISEhNcWRNcGtEYWx5MjFmSjhyVngyc2pGUWZTYjVYV2xSKzEwT0I2ek5VSXdXTEtkc01IamFpdVVhZ284OXNrVHc2cjY4MTlySDJoR2l6enZpTUI0S0EvNjhLTjhlcmhZd3ZJYmc0NldneGowbStiRDlqWnd5YkZCSWJEK2dBdnJ3cWtUb0pkSGIzbnl0V200blU0a1RvbDUra2lkYUhZYXhzRUd4alNFUGE1MXZDd04rbTY1MWJNTWVmSzFjOW9saTlBMCs4dG5XZkJTYkg4UnFTZFJIQlFsSmxIZDl3UWVPMWVNS3RNY2svMWpsNWJ2U0tENWdKcUN0YlMza0s1WnJDRDVZVE96S3Q4c1B3d0Z1NmR2Zkx6VWZVRUxXRUY3SUl0NVZQQkl6Mzc3NTlPcnhGT1BnbCtWOUp2bER0QzRKcS9weXpNVDB3MTdLbFo5RnhGTE5hd2crdG5NR2UyM0lTZnZmUDVUWjl0dTBlQzVTZHlRODJINi93L3dhTmdwMzA2U0FSbXg1dFJ5RVlReGUwdnovdHpMYnovZ1N4alM0TDlXVzFoRFhFWHhrKytxcTN5bmxYY3F4L1hoU3htT1A2NkxCOGFGVSt3QVBrdTdQMTRwbEJ3a1RTNTlKZmc4MzlkK2VsSWN4VGpESS96NFJwTnpKdURMQVhVUHc4WURSQmJYdnRTRzNGNlJEckJlbkYyTmVLUGdJVVphRXh3T01tUThUcjJXalVEUHVWTTlKbnF4QmZXZGRlS2lzNkw4SjFWK3lSWkh1eTlkcTVYWWtHdU5GbU9SdlVkN1RtT1k5SFBDRnNRSjdLL0s5dzR3QS9oTHd1RTNzeFAwZkZ3R0RiRDRVK0ZxdDRPQXlyTUhqSkUvSDBvSW00SUg0RHFWckhKWGl1NGFTZmp4bUNFUEorRUxUL0liZzJEckVSaG8ySklMWFFuZ0VEY2tkR29OTXUxcGxQSVJjQ0NFZ080eFZVcWdpOGFVaXhZM0FjVGRLa2Z5OWpzSGxBSlBVZnVSbFBPaElkbkhINjhKVmhzZGQ5SFBjNVVaOGtTQUdNTnNRSHZ0VUZFc2tUZko0SEx5Q0NIamt4dHlKUjR3MXUrcW5wVzN5cDR3dmVoaXdHVHkyR1YrMjcvdXhiejRYMk4ycERJLzRLL1lmWlpxNU84M3Jid2NZOEJFdzVZc0dhaHZDWXplUVJYaWpTWDZRaGRZTC9JY3ZQM1p4ZHhERFdGM0VZemZocThNNkFQTkZJeDR0NnUwcWhlOWZ3N3oySkRuREFWRkpaK2tTSHByYWdGbkFkK0tSYUlXdnZQNkJVbndnRk9HTE1DM3I3UXBsaHcyVC9mSk42bnFRRDVPRUJ3L24xSXV1TVBKQWNLaXMxeENqSk1nMFNaRmllTWpqdEVLaHNicWovZ0xGeElQa3pUd29YZmFTcEZ5RUI1SkQxRHE4NjV3d1JueUY0Q0NodFJFOFVGNTRIR0M4d3pBSWFDVCtjcnJJVHNLZkpmRW85bnFJZnNxQ0Q4U1hLdmF3VXJuTmFaTGdZeXZvaDE0V2o4amtNbmgwOUhvYmo0TDIzb253UmRSV2J3cVB2d2ltVDNZWXdsWlA1emd3VE9IcmowdnBoMHJ5MEY3L2dyQU5jeEhuaXp2NlRlQWg1WnJjeHgzemRVSlhQQmFtUlN0QUZ4NXAwRXNvbzBjQ2d0dksrU0ptdXBINTlpNFRGZ2pUSFlaQmlrMENkMHZFSDFxSXZ6TThGSmx3U2E5M1NXZFpVTFNWeFlrYm1sLzJNNUQ1YWVBQWpidXYxakhmcGpIdmpBWnlXWmcwaEM5ZmNyNVE2ODNnc1UxbGNGZmZrSDZ4dmVpU1hyTEFlYUUxYTlLcCs0YnI1L3Y5bXVkbkQzQnp2U0U4ZHZrWXFPdzBjTUM0RXVrZWFMTE1XTGo2RnBMSVNEeTdpK25wSWw5MGtiRUJQS1RudXRqeHhnQU5vaXJSVGNkenFmS2Z5dHpSMDI4bkR6bWVlRWI2Yzk4NFh6bWthK1BCYzAyeVNYNUwzT3NzNElHeTlrMWtMeCtva0Q1VFRLem9mbUhpQ3htaXdCZkwyMXdiRDVxSjRRby8zcUR6V29IdUhobEpWKzZYOThjR3ZLN1M1SGppQVY4Y1NueHBydG5ycitjT2tyVkVxSGtxRW83WC9aR3lnQWRIVmNrSEtrRmVWRTNINmdtUEE3U3M4YlN6dkhHMjd0NUVQSFpiWlVOditIcnlQM3U0NEFRTUhhcTRuOUlUbzdzSXRGRDN1ekllZXlvNm1xZ3BqeEllYUY4OWtaWDV3Z1FGdnZxVnh5aEd4eWV2dWZlUHpLUFpUYW4wVFBFZ3lSV2JkQ3hnbnRLWldibWdPRlovek9RVVJzMnh6RzRITFY3MUxRRTRWcytmRHNYaXlaLy9FU1hZWnI5YmgxckdnejN1Wk52ZFNlcDBxUG8rRVJCL0FycUlyMzZsUkNialFIeW9SMk9QS1QyQlhFb0o4NFIxK3FPdE03eEJmdTZFSW92VkNQa09UOTZOUi9KSTJEZXg0QkZUUXh2L21zd2dCeVIwY3BYRUUzc29BK0xFM1FVT3g3Q0lKT0JpU0JBY2tzSHFsZkVRaGtCQ3ZxUStpTzVqVWwzN0diSkE5ekdlckh4ZjMxRThKTExTWTRxNUIxR2RNMzAzSHBxUW92TWJCcU9nUFlqdWJtQXZhWTh4Z1FKYkI3eFBwZkQwRXN3cGZ4Q0M4c1BRMlFBZXBNdUM5aEd1S1h1SUxzdlVjSjArbEIwSW1VNmpzOEY0UkpuNVRrT0dURjcwbW5pUXJzUXBKaVhDSm9QSS9GWjhMaHM1K3hleXdlekhucE5NSk5tc0pDK2Y1UXJzciswLzhIUWxreEk1STNUM2NRY0J2L3NTWDJLQy9uTWNXM2FRbENjNlAxTGgxR1J0L1NEZW1kRkN6T0M2bk81ZGFUeC8rQmVCNmdHdkIwUWZVanh5QXcyTTRBaVNNUmZQUXpabEwxUWlhYWFob0dHNllzYW0rajVuYkorNDNOQWpXYnhtNUhETnNyVzR2OWZ4SDN4R3lHYVR5SVV3SXpDNlQ4VVo0ZnUveStDUVpnU2FZb3VyOU5OWWQ3MmVmbVJpY3RpbGlTZW5lemY3M2FxMDNzVVU3NUxFenFUNWRQRksrU3FyQklVbGxZM1lDK0l4VjJpUkFUWU9oM2lJVUl2RC9RZUR3ZmJXWUxDNy8xTHg0bnVpVzRFUzNjQ1NzREdabFUzZ1FVZStBQVN1b2prZWU3eUZTajVQc3orc1BLRjdQV20yRUhoWVFwWFhpOGRTZUNGTlpvcW9oRUo4Y2orTzMrNVE0bGlZV2dDek8zUW5SK0FoM2xsbTFEWTB2eXhTQ2NVSGlOSGRVMW9FTmN2ell2UWcyK1JtQjE4bC9vcnJtVlh4Mk5xNnRiamN6L2xLUHhLNjJ5Rkd6YlV0Z1NISmVTZmI2RnVlTHh5TUZmajZoSGc0Y1VwMEh5U042ckhhZ0l4anZ0QlpraS9XNS9wNExGRUdTVGNUM1VMZGJOOHJBdEdCem90YksrMEQ1M25DbThvL1hVQlhVeU5WSGVmb095bWlZR0dUOEZvWTM2ZitkclhoSEpCTml1NXgybVFaVU1HVTZqcm5JTWZ5R01UeWZ2WERGWjlYNE9jTjE0Z0hWL1lPdXYrVjBDUEJXWEhMNzlGcTFzTE95ZlRDRStPTmxRR202RVRyb3Z1L1VXYkJaZVNtOTN4bDV6ZEliSVUrcnhNUExGY24zZjltMlJNWklsaG5IcTArRnd4b1o5ZG9MOW51WVRmZC84d0RydmdkZXlGbGR6MVdmdGdwenlPL1JqeW9oQXZvL3RzTFVUdThlaWVUZWZIdE9wRUM5cWNML2Z3R3l3QVQxVXVOdzQwLy8xQ3dHSFQxdzZQMUFxZUlSd0xrdXZTRHZWaG9DYm8zSC8zUWZRcnMwRmpud2NBc3YvQ0xuRzlEdVhIcjRYTytSRTRmengrdUgxVVB5TlBkMStrLzZCQXZTL2VHV1dJOGVaR3Y4Rjg4dWIrUk5jWWdHNmJyd1dONzhPLzNXVm1TN28yYlJ1bzc5eDgraWVYaC9UdCt3WFZ6N1JYWDZueXRXMjdraTh1bG05NjhtVGUrdVQ0WTYvSzFKdUdzOUd4K001YWVUVDhwWDEvTDEvSzFmQzFmeTlmeXRYd3QxMS91N2grRUpXWmFqWlJLY1p1TFhQRTlMNzU1SkhjdG5LelJSVjg2Wk1ySWtab0ZLcUhhd2Y3ZE1obzc0dkVJMnRkQXR6QUxQZmIvR085c1dTdDJRcmtnUDVmMjFmSXVSSFpkODRNL0Z1QjRVTXBncEwwSzI4RFpqY0s1SS82cWhidWNTSkk3MjJMSis0NlZrZjRzbDJndi83dE1meUhObHN0RDRBSWdIYzZyZEhVZ1E1WDN6WDlQbkhJQ1RFM0VSTHZBMTJNQmpudUJGQjZVa3VKMmZjbzBBK2VFVGZJNHJrQ0hDYkZPQ2orcnlpamV5K0Q0dzB0Y0Z6ZkFuUWpqTE9pOXJBMXMxR1haU2s5b3hOL0pienEvNlc4a3ZhSTJMb2xseW1IMkQzZnR5aU1rZVlMb1p2aXdTcFJFbHlQN2w0N0VYc1FPR2krRVZFYUc4SmJqejY5Mk9SNzdHWS9jaFJXc3YrU3hzaXBGYjdoaWtrd2FyK1dqQXFYRXFWeXJmWTRITVpmclVOR29ZaDF5TUFYOGhMUDhTNDVIbHR2MUsxSDBqSlhDRDVSOW5kM2hlQkRZYUtPYzh5ekJGWjFsRnhoa1BXWDZSUXdnNDVrMlh5WWxPMVlrZlhLV2toZ1pIbGkySlZJNGtmVDljdnp6V3l6SHY2Q0FDL3J0SWltQmdkUEs0TE9FaDhoTnJvY0lEVVcvZHFnMGo1UlZBa0ZKUXN1Q1VsMVBGcEFOdXhnRHN6N2p1RXQ0Y014aUR3SXBGWlUxdDNic09SWU5uc3duSlVnRzRST3RCNHYya2xEeEY3K1BJRlhXRHpxaVJTZUVuUXYra1EwQVlpeTIvVkk5YjQ0SE53cnhJdDM5amJuZDhueTdzSy9QYmVxVWNsbVRXTFZ1aFJUd3dKMmpZUlY2U1NRa05vZzEvRnBza0s5d0VXT2Z4bUZSbm9oRW9zSWx3eWNrWlowclVFSE01WlVveHZwZWpzZVhzTEFxTnRHa0hURWxvbE5ZdTRqMVVuM1VpdGluK2JqSDhQak5ydFVFL2pBWHNkOTdYRC9rTWN0TVdFZU9DU2VValFJWXhBUGtQNlRMQXY5WWxFelk1TkNFRUwzQUswYjNYb2FIUUZnTGQ5TTE3L1NUN3Z0U3VvSUtaSklyaVgyaGxzb0E2Yk1XUk9KazlXVmlqTFRFUzV3bGxsQjF2bGdwb1lrSUJ0RksrTnRheUdRaVlhS0d2N3M5czNzSUR6dzJSSm01QUw5bHlPNWgvY2duSWNvV01aR3lHUkxPdWdYbkZscTAxV1JGdVIrazdLMFpydDNEOFhwWng1ajNVR3JXdG0wOXlXdkppaXJKSm9PWnlkdmhvZzBQVFRQWnJJdjJKcE94U0JmbUlIM1ROUGJ2dW1uUEhSN3RCSGVwRzNTRHg3bVRwbTBFQ0phS2M0ZUdJaHNLUitlOHFlRXJ0d2x5UmJHS0pEdmkzSHRrUFNmcGtLRnNnR2d0SGpYOE5kUHFkRzd3bVpDS3BzcWtvSm1BUjczcVlWTmxPazQvYUdER2dYQjZCVU9BMVUwU3NxeTFxVEpSd1h0aHZVK3NrN2pSbVlVRFZBTUFhV1pXZk1zVzhqa053d1BiMktRQm1WYnpPVU9qQmxoeno1TlNBTW5OKzV4NzZSK1F5T3ZhTW12YWQ2TnFhbENwcW1GYnorQkhvekpVUHlhVHlVZ1UyTnlvekk5Ri81VHJKckh1a1VFZVY1OGx1NHdteXJSUy9wb0U0N3REck1LQXpyZXBwdjliR3p6TUhhUDB3RmdUOEtnbkNiK3lQaFpNVU9BYkR5RGFQWmt3UEpDZk1wb3pJZjVnSXd1TWd6OTBQS3B2djc0ZFZRcVVIaFJYdlIyK2dYdkpuMzdpelRLS2g3Wit5c3RuckhjaVUxdGpzOHpBVVg2bGhxOWtSVEdNTlVrZzYxL04vMmZXU01ERkJEN0hIMXJyZjl2UTY4ZzZZM3Z4MDNUdWZtdEMzekJUWGI0L016M04zdnZleHhlMnlzWFlOS2w4WDYybk8vT08zWTZGYy9OTmMxWjVQcUZsM2M2blIxanNmZ3M5Z0dNcnE4YSsyNDRtYmUxRmhQOHRHRERqdEdPNG5yVjJzQ3hzVnQ3YTJwanRvckl6TlhUeTA3eUdPUnVFQ1AyZjIxNHN0czNZRWdNOXRMWEFHS3JXLys0Wk9mZDBiZHpoZkR4MDUxdENQQUJONTYrU0FQMEN2b050dEg0UlhMOU9uVnJGalZVTVlTZEVQZi9aWEo1K2JKeURmUTFRMkNGc2d3bS9PWWVaQ2ZDWXRoYW8ybUFYdURpOWJCTWlyNkdEMExQNTgxcTltVjM2emx6OTAxbkF3MXc0OVlDNlY5RHlaNjk2NXM0VWpTT1RxSFB0YUxVRHZkQWFmUVlZSW5nVEhBaUEvNWhXMVFpR3hQa1JONTVnVmZWa1dJMThaVWZjbXBvcHhsZytqRVpWRlZ5QzlqMDFaNlBocVF0ZzFNVEFPYW1HSTFCSGUyMDZmb3VZQTJtUDNKV0JkV3A2bXpTK3BkR09pYm0rTVBna2EwQjJRZHgvWmk5S0JUaEtyeGlodFVIMGRGVkhHL1poaHd0SWJLMGphMEJOYWg2Z05MS2N3cWZSK3JTcU5BMGdvdEcxaTY1QURYVUVHUEJ4eWhHS0YxNGoydDZmQk5SUDI5U2kxK1pUZ0dPTDIwcEVFSGZuNTVjd3FqNzhzcDh3dmJRdU9IcHY5T044OG9hT2k0dkhsTG93bjlPVG55Zy9NR3RxSkg5UUhtK0Evam9acWg4SUhYaFFDUTlENWVjeHhFa1hIQVFWL1NyREJkMk5jRWd2Z09lZVY2ZEF3T05SVzU4R1dtMmIrM0ZUSDYwdi9EaXRVT3N3Y21NYjc3ZXp5VSt4VzZXOXhWbGNWRkJESFRVd3FxVWZwTVl1NGxURXdhdW10dmJTWE5iV2Y0eGQvV0FsbWd5UEh5VHNOM1R5SGNSZWttSFJUenUvTkdrS05WSUVYUTMrSTB5Q3gzTTc3VFROYVdwdW13TE5xZk9HOWVYYmhIYmpwZUw2RWZ4SmRLWU9FRGNRa1NTNk5iRjlKM2RhTUF5ZHdNVUZ3U0g5Z3pYY2dJSWhZeW5zbkJmaU1xL2VTcjgrdmJRUkEweUNIcnhKWGZ2WlpueG1KNDcyTW5vNEhWWWhBWThRYk1DS1FPTjR6QTBNV2loNGp4dVJnOG1tYWVjaEhNbEdsaFd5VU1Cd0xQZHE0T0FFN0IwZHpDUG9oNDRCcTZrZGpkanJPSm1xaHhPRFYzc1NxUVhMOHl2bTVEOGEyR0hSQVo4dzMwV0N5VVNiT3JZOG14eW44Y3lsQ0IvRTJjSmZCeVRuY3FubWRCTWp4RVRlbnlZLzE3UjJmWFBheGhqVUwzMnNBSFp0L0twTlB0RjVJT3RIbkFWRy9haTlQNjA5V2MrOVZSdlBRKzFzdHFudDN0VFkxS3hVcjBRcDVYc20ya0hPbzFBbGhJeTFsOVlIM1ZvaDhhUDZoc1ZFMjE0Tmh5WUlhSnQ1SEFUVHRIWXVZbDZaM3liQkVkcmZXelJ6bTNzbnhxOU9UYVdwb2ZBT3BEUVVwcVBocThEWXBlbjRwRHEycFB6VTYzazR1bXJyRCsrcWtTSHhTMUwyYUpmSU56SkFtSGJ3Vjg2S3FJN1BJZks3UEhWM2JGVFpuQitmZnJUemhiMWh0SGQyYkpYWVJmTGcxU3g2eDNaMzBUUlY0WmUycmwvN25rOXQvRGw3QzA2bnJhR0R5eGo2V2lmejZzcGVWSDZRSUY1ckcwY1M0dnFaNDhFcTNzU3ZaMEpJVkJwWmVtSCtvdHBCNGc5ZHlBbWFPQjg1Y3ovTldydkdxTTdkNnNxR1gvRDcwQnFRMjBtN2ZPWFpHYlcyOXN4T29hM2JlaHdySHpXNytMdXBaaTdJcnd4OFZ6NWNueDliZnNZMkNCOEdSbDVCRUFOOHpCeTAxY3pOWjhEWTFHMXFPang2SExGdjVYaHd6ZUNRVEp3a00rWHhnSVZrTTVxNXUzYkx5REpuN1FiRTk0dE02R1prV1lSdEU3ZVlNMEg3aVFySzdOY2p3NWxkaUZpeGY1bk9UYTM1OUxVblBUeHpQWHVyUGdKL1BQTTgxQzN3QUUydHJDZG5qbzlKYmhOSXJtekFPUjZTUWlqMW0wc0RVdEtLSHo0elBBcDhKaWhJUDh6MXl1VDV6MXFwenFWbHpqL1YxcXdHOG84cTlxMEt1eDJwbGlhTjNaOGlIdVVtY3NINGVZSEZLbDBkRUxFTHM2STRMbW9UVHdOWkRycnc2TklybmFURy9XWkNhTVF0WlZtVEZwOTA0N1hjYzViWlVmQWZuOGQ0dndDUUJUd0lCaDFEUTZ4RFJVWkY2MDRWTWkwVisxNU9qaTdtd3QyZUU0Rm9MenI3RzBtVjlwU1EwV3IwUHlZU3g2dkxxUEY0Nm5RbjQ0TDRDQzdYaHZJSkN2NkRtOVh2Sm1FcXQ1Y3YxclFGYWJEeXJ1WS8rVUIzMkl2UTFXOC9KaXZOTDd4RFptYWE2aUluUEhTeE8xUFFKWlpUQXRlaVRlazRIcEl1NWZmRUxnUnlVdnl4QVNiY3VkUFNURVFOU0c1RmszN2phSVJoWUo0TTgxSWN3d1ZYU3JRWDdCd0NPZmExczB0M3QycmRXaGNKeTFvSGZTWDB4RDQxbGIxb29sSlhVbmNaN3FRczBJOTh4WitiWE9JNURxRjZOUTJiWXNpYmtEYlV2VVphbXZkSGUxYVJOMmFMdEZlRjFMbFlnNG5xcnVYNWRuM3ZEM3Q5UlBTTmVQOEk0U2ViNWlVOEV2L1Vpa3Z5U090UHZPWE1EWG1kOVdlSG1OamZTRXpLekJPdUMzZ0lyZGhRTEl5QjhGNTRjU0N4QWlHMWNBU3dVcE9oU2ZUOFhjR0VOV25yNnlNRnk3Z0k1QXJ6TFdJbzlnSmYzTGxHcTN4eWdiSnBoazRUeGhmMnlNTm5YUGhOUlhNZDlncmRwRlBEanRubHFhdGs4OURhNXVLOXB6bStDUGtPN2N4M2FUcS84bDBxdHhGbS9oL2FMY1c2R1dxN2hRYmJZRmZUbjVYYnF6Ujl4aTFIREYyR0VBV3hoQWRIbWhhN04yamtkM3VUTFJ3OXdaYXY5cnVJY0h0KzVQU2pkcnVuelVXUXB2STNBTWdQOXFiYkdBeWJ2dnJVbldGYVJNNTlsellENU9xVmw4UEpXOE5tTGZSajVEMmFOMzVuZW43a2NrOHNYbzZWS2d3OGMwbE1OSHlaejdlaXNRVFhmejZITVorcDJWVmIxL09aTnA5Tk16K0hYSTNXN1JXMzlSUklRbzZDRmJYMm0rdktiYTdiSGRWMFFGUDdWakM0cjYwUXRnL1l2VGRkK2ozeUppUnhLTHYxRHB2NWRpdisvRmhCSG9rZkc2aDAraEhVdzI2MHcxYjlNVk9PSmVMbGtqL0ZiZ0ViMmxIcmpvZ24vbk5zUG8rVVBiSnJKcU5oUEd3Qi96RWNqZExoQ3pTSFU0QlJOWHgvYVV3R3JvMjRObkVrSFU5Q3VzZlVuNGJDMGZla2dpU09lSDZqbEsvcmo3aTF1bXJiaTJvVURubDB5QzBBZzZaSjA5S3NLTmhPSWY1UVdZTXc2WnkxN1puNUJwWnVQdFdaKzRobmk2YytMblc1R3k2VktLcHNPTnlIVEJtNFZUYzRZVE5NU2Y0WVg0ZFVrZE53VEtjOEhnNlhab0x4Q1NsdDRWQ3NhVU91SFMyTDVvWGNYaGlXQkVOdGp3S05RcnkyVm51a2ptcW5KbzZmMXluandndWpnM0FLZzRieUpmUXY0Mm5BbzNWSC94RTF3QWU2YkZFU0IwdjBDRWVjOFFpVkp1ZHdJRFNQZGpPa2N2M0EwN2o3Um1iK1YvYTQzbWE2TldOdHpVVTdJZHBMWi81ajVmWEM0WkVTQ0RFZTdtWTF2WFRXNzQ3dm00YlZhai9HL0lDQWg4Vk8yMVFScmFPZXhMUGVodURCaEZpaVpQcXhjSkkrQTgvMXdjNjNaOHBaajNMQ05OWS9UdjExVFVVUEY4R1k0Qm9PMGV6OFJJN3ovVkJiZTNHdWNocDdjSGpZczJGNmFEeXAzYmx3U0ZhSy9vTkZJbmhCdFF3ZUZBREo1WXhoYWpQc25CdGhYcmROR3hJY1c1ZHhNWFQxZy9FYlhHcU1oNWZZYXNMWVRqZnpzOWFtTThTc1JZZWFUUVVBSmJ5S1NSemVCV08vNFhEUkxvTk9wZnN4S2FWdmRDZjZEeVV2aFZ3NUFrOXFCUG5Ga0o1Wkp4TGtQNXU4d2FMYlhLY0pkb1plV1lLbk5ENzVhdncyNkhoVWVmOXBVODNPSnNjS2p6RlBNY1ArMURhdWZVNUkwQnVkWWtsU2RQZ3QrQlYvdnh5UDhkYXgxWm5WWXJDVnhuN2FNcmJoVWFJYitET1JZbktHWWJLWndZRjlUT3ZRUG5samJNYitUV29LMTNDb1Rabnd1YjRqckIvT0JOMnpENURqcVNIMjg4a29YYm9nUmZveUh0SmtIYStzbXJmdjFJa05KSjI1NkZjbU1QdHdZZ0tCcXZvNStIdnovUXcvRzJSSDNzUWtBQ1JrUzF3MTdlVkpOUnFGcEEySXcwNnFhdXBuNDU5TUlIN3gzblF5Z2lRT3o0ZHBjekdzeHZNd2owRGM4YTZxM3MzOUpEUzNmWXpuRFhyb1FwU2pzRXJyaUQvNDBJUnlCSFB0M05LTzV1SzAyNGFLd01kYm40RUFsL09VVkRscFE2NzdGVFE3YTVxd1hHa2cxanoxMlEyd0FQQnpSdVBTQUpKb1V4K2ROODZ2K3NHeGY4WXd6MDFkdkEvNTJ5NCtWVWxCY2dDQ2gwMUZubTh4Rk5UOC9BelRnTXVIeU9CTWhTNm5YaGhnZmxTN3JCQ1lNZCtrM2lBUHo5Ni9zcHdlejEzT0NQeGREMDAzMHdCSTY0VzM0WDBRM1haek5QY3dlM3V4VFBpWUhpcTgrdUFCZ2R1anlGd09SR0dUTXNPRHpDNUszQU1Hd3paTFVzaXdSNUdCT2psemtnRWVyWmZzWW5JVVc3dU1aZU1BNHMzak00OEkySkh0MlNlUGhPeTBkMmRPb1NheEMvVWFVa0l1VTNLNEhuOEFkYmdZZS82T3BtYU44M0ZpMTArVlNzTWI0d2cwM3BuV0NQYUM5N0VvTm5rbm12V28wemxOUGlBcU9kbmlYRzV2aGV3MFRDOWp4SzFUNGgwZWR2b3dTaWUyY3RQZy9zRCtWZlNucExiWUZIMVEvNXN0Q3NKM2tteXBSZDYwajA0RXJFanRKbnZJVlJvQ09mS1NSZXVZWDNSV1g1NXd1TnpDYU9Pdm1nUWo0UWZ1NS9WRjQ1WjU0WGZTb1NmMDNxY2NwbDdRUURHbDVjT0g3MmR3U2ZIWXVwdnIxTlRRcnhFUDRzZ1NyYmRtYmgyZU5YVXp6dHNHbVY3Qm5ENmVRNUFzd1o4TVdkSXdZc3JjZ29yMklpRzZBVVZ4KzBFZlR3dVdBRThyK2tuNklqVEMvSHZZUjM0RHpabExGa1NzcXlpeS95Q0NyQXQ1K0Q1MHdzNm9yOFFBK2d6RGl5TWtDUGZaSS9zZ1dPMm4xNHdWZmlHd25CUlk4TmxMNCtFdTF6a3BxRndzTnN0bENGek5JRzN5UW80ckF5SDdHQjBzRzRsMDZZcjVMQ2J4UXRlL0FBOUZ0VUlMUGdVelcvcmtsOGozY0MwT0d3NlNMbVlqSUJ3NHluUjE3RHBRMFpwWHRSUTc4TUJLbTgxTGd1c1FHQ244SkRzaFdsdXZrRnhSRFlkSFVxV2NENGxyU3l6SFEvU0ZuSGpHZmE0SnJ2TElMay9rU1JQZGRMYTBuaStjUUNnLzVEOXpSYU1XbFkxTUtSNWJXc0V5K3BHTS9XdG9sMTVDRmNwUlpROG5pSWRyMDhxNFFBVXhwOXl6Zy9FSUtsYnJxOTlDL0NISXJmT21Rb2RDTGZYbW9vN0xzdzc5ZXZ1aFNkVmNyUWE5d21LaGZybEhiazBKUzVZVjlNdVdRdnhCKzhqWUozeGxQNlJMdUdaQktUZS9jQjAyWEZXWXZOaHJaekt3TmYwYjFnSW5FWVNWRDRJRlBLUmhadTNwY0dWM2tkdlg2U2xKSGF0SmZmT0hTZUd0R1JVeTJVVkJjM2pZTU54RVVqQWNrSjBSU2UzOWhmTXQ3YUNJa3NCaWNITllVRFNiTWx4aXRTNFNIYjlaMk1VMVlscDBZOVdnYXFJRGMwVThaR2RCdVZ0cVRwejRSL1FEeGFJOHlLeW84U01XUGgyZUhwSFMvRkp3UDFxNWZhL21nM3NxMHE0bUp0TjU2eDhUZEVrUE5rTWhPZ1o0WXhBMC9YbHFkMyt1cG5ZM0ZEWjJYRUxFYTE4TjVoZS9Qd2I3MExWN2hCU2kvSG95K2RpMmwrRzVJdGZTbll2NythUnlDUkJ1eWg1L3NKdE1GM2F2Q3RZQUgwL2dUQU1PSktSUkp2Y1c2a2RvRklDM0hiczlUZTFlY1dRNEQrbUVFL2Rhb2JhNU9vb2pGUXpiN3ZUWkkzdDRCNFUrbXZzOXROcnVwY0plWWcxNCtFeTg4NloxSnl0MjFlTTNUUzlzTHNrdjg1QW4wVFFSajladkV5cllUNnI5dml6Z09mUGYyYlFmaEtNMnMrRDVseHdXcFZ1L0FleGVTWEhzeVRWMmorOTFHMW1aeGtnOG5LeE82L2llcnFuMkc4Tk9MdGlMOVFlOVozWjc5TncrSXVqa2VlTnpPU3hKdTRpYnRxbWN2M0Y2L25aMjZaL2YwNy9VZm1mYktOQXY3aWxGOTl3YW51YlNLRE1aQzNnd3Y0UmFRTXJDY0RTSjV3aHdVSGh4VXMzaE9OKytibUpVVlI5Y2tvUFhEei9md29uQUVESWlYUHJDdksxdG9zSUhlK2tUQWV5bTlJZGRGWUVZQUFBSEFrbEVRVlJYdG0wYm5rU0ZYZm41dURxNTlIa1BjNXZpTUJyNkl3WHY3VUVyM2xwZ2JkckVxSW9zQXVobm8ycU8zOUdSaVJrbVBpa2VvMkF3SCtnWHFBa1BHeFRxYzRnZXdzdTBJRlNNQVcxNHVOMmZSQWZIRnc1YVhhS0NkZ2VPUm1rYXY5cVA4YW4yRklMaDZTYTg5Y0MvVDBJUjJGTm1ZeHZ4Z0FjWTdXczNpRnZPbkt1c0gxMW5sYjZSUzBJSWVMalg0UVJzM0kvTkJmSWZEY1hETWQ3NEJBNTBhdHRPamM2ZitUZWNoSk00N1U5N3phZC85QitOT3dyWXdHMEhkWExycGRZZGJlcWExRk5SbzdLenlpNy9rUU1ZZ2hlYm85QWtQT0t6NjI0RUw1MnBqMFAxK01hUDFqOWQ3Z0VnOEVDMTJwNzBwNlA4Rm10Z1JNNy9BQjJGcDlzZG9aamdHVGZ4K1JHdnZSbllDcENrd2RlZGVMQzJxVXhiOTZxZUJtbHorQTFrcSszUDAwUXBaRHcwNlNTK1FWeEM0cDM3dE9rUzZjQzJRZlpTSjBHMWUwdUl3Y0VmOVFlempQWmk4ZGJPQVdtVkZrSWxuY2MrdFJ5ZjZnUUpmcHdGRW1DYWVuNFd6NHNkSHpwTUpWRG1LRU1ocGJsNEFNTGhmb1A5aDI5N0ZaL0V0c1BiSUl0RXdJYWhpSy8xc24vZzRYWExxMzFEUUtxbmxjT1B6Q1FLSzRYQ1UwYVhmcVJXcVo4THcvTDRPREZGRWw1QUpwZWhnRHF4L2czVTI1MjhCL0ZpSW9zUFQwRGZ4ekhHU1BpaDFCcXZBVEZsS3J4UHd2S0gvYWt6NEpBcVV0Zml1eDRqSEdUUVJUdzRscWlYSnI1SWdWazNGRGhjcnJoZUJuRW9BRkVxK0RuQ0JMb1UzaFhpSzJpTk5RZytMLzJwTVRybjF0UmU2Z1NvVG9TVFlHRjhNemxMLy81TEFDRGZnSjdYSnZxdGhwVi94WStOQmx0ZngyVW9uSmk1ZjFTOWpwYnQzOXFoSVNoNVA2eE9ya3k4b3B5aW5ReXI5eUZSd2ZsRGlOSzhTMDBVVXY0bE9BWUZyK002TlN5MGJIN3gvdlM5Y1VQVHlyNGxvN0ZIVnVIbzJ3Z3ptNTJmWmlJUlJHUjdLZWZTbjdtNDBEcUsyVEhFcHpWa3o4WUp0NEYxQnhvUmQrZ0M2YlhqSnFZbTJNVFZlRm1QbFk3VnpQcW52am9OYjgwNGZ3c1VHc2p3UHZadjJkQW1YbzhCL0NSdytpYVNzZnJqNDFGNFM0Wjd5OXY1T0tnTU92cUxQZ1FaVVVrL2tHV1I4MkQzanFUV0JlMFZyQnRncmprUHZidWtoNURNcHYxYjlsd01OM1huRGJWWGdHbkk5WURMb1Z1U25LdWZQanFlengxWWxYdmxvVUZtbUU0cmpxL0NraVQ2QmY4eVB5dnMyeXUvRUpqREMzUGdMWUJOZXRPVGUwMEhkaUgwQ0VXS3gyaU1FckYwRFk3UHJtSUdTbVgzUFFubzd5QWpxS25qYXlhcUlDaW94QVVzTFM1Q2lnUms3N2Z0aHpIME8zTEozZWN1S1dTbTNZdG40VjBma0JsbEJuc0duK2JMRE1ibzUrbGxFL01nZE1URHZyOVloNVd6WFRpN2xQZndkaUh0V0NYYVFVUmNLbjlNcjdMMXYxVEovUm5wUU5ybWlOVTBpMC96VGpwSWFuNG4wRm13UDVidkpKUG9kaG14dVhxV3VGN3Mram43TFU4UjI4VFIyWUw0UTdZYmdVaHlNY2xMYVNKRUJDYTRwNUxrSkVSZ2NLS3I5eTJjdG9oS0x6Sk8yUytOTU1kajNVR1RHVmh6MEZpMW8yb0VLWWIyTFVzTWRHSnFPYUU0VTJCK1NCSDBvOXNCRjh6a09wOTJnd2V0N0h4NkVvUXE5ODEvVDV4eUF1NTdJZjdJdWVuaDZNcGxEVWZuZjRYUHlrMDE3VmhzdmQ3TEF4Yk5Md3o2SE51QzNtUURySVhia2ZGK3gwZERtRURuMCtPY0h1NDU4YWZUbll3TElwQVd6eXMvdTd6aHQwOGhMeVpGdkk5dkllcUhaQ21NamFBdE9xdVRsVGlaa0lOWDNCRFpReEhqRExpOFd2WXp1eUU1UHE3L09SNWZoSXNJdjNKd051RWlNb1hFWlZFOGh0R1hSZ2dOdGNvZ2xFVEhWWmlDWjBxVDZpWVNDYnBscEJSWVRvWWxhSGN4UHMxUGFnVHF1TW9YTnl0bjZwWHBHdTRrL0Y2SVA2UWVjV015YUtLN2lUOFNtNURHSkJjSm81QTZrUlVpVmlCYXF2aGxnVkwyazRoSEhMb3ZmRElvU3NWdlNKakk3Y3Y2a1ErZ1FFcm85SE9zWmFRcmRLTUlIVWRHUG05QUhQN2EvM1hPM2xaVThLZWZTMTBGMGpxL3F6R2U4VlBIYW91Y0JMNU82bHJ3SDB4MWRXaVVnNUZxZG9Lem1VQko4MTgrVGVCYzhoOVVmM3N0RVhPaklQVVFTT1Z4RlAyVkJLdXNEQVNPZ28xUXl3cTNPdU14MytBTDIvN0FYemE5L1ZGOFA4enYxRndXdkIrWE1aV3pUVzBuMU1TVitZRGtOLzJOQkRxRm4yc0F1ZDl0Y1d5b2FJZ3FLWHJwZlVxL3Mwa1dGY0ZlZUNjYVM1c2pKSnFwYkNVNkRtcVhGK0lDc2k0RWNoc01BRGtlaDc4cjc1blQ1WGk4RERVazNTcGE2K2VOb1FUY2MyWlVSQ2ZxQ1ZFbzkrY2x4Mk5ma2QrVElrcktLc3VBVFNwSktxeTN4ZENBQzBhMXRUekF5emtKaWtHdUwvc2NqMTNjeVcvU0lpS3Mwakp0bCtQeGh4OG9rVUwvekg1K0t6NzNjSnZqc1hVUGs4R0tJSTZReEFiWjRoRFlWVkZpeWp4cVJnWE4xK1g0Z285ZGgxRnI0V2ZQc3J0OUw0TmphK3V4S0NSaHRVamhWNzVyK0ZpQVkydHI3MWVtNUVteEVMQVpHVzdIakNCYzdZbHdiRzM5OGVCVDd1akxHdWZIWGtLUWQ1MVkwZlNHUXRDRSs1aytvSnFVeXNGT0FRNXdJdnNIdmhGQ3BJdEpURExqUUJBeE9JL1NhSEpnQ3RxRGZsOXZwanQ0SnJtT3JhMy9CNzJMOTlDQ3JGSDNBQUFBQUVsRlRrU3VRbUNDIj4KCiAgICAgICAgPGltZyBhbHQ9IiIgY2xhc3M9ImpzLXBsYXhpZnkiIGRhdGEteHJhbmdlPSIxMCIgZGF0YS15cmFuZ2U9IjEwIiBoZWlnaHQ9IjIzMCIgaWQ9InBhcmFsbGF4X29jdG9jYXQiIHdpZHRoPSIxODgiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUx3QUFBRG1DQU1BQUFCWWdoOElBQUFBQTNOQ1NWUUlDQWpiNFUvZ0FBQUJnRkJNVkVYLy8vOVNPQ3hTT2pIL3dwOEFBQUQrd0o0SUNBaFdQakwvN3RETVFqai8vLy82NjgzNHZadVptWm1WY2wrYmRtTjdLQ0l4SVJyMzkvZFVRanBSUzBuRlFqaEtNaWhwdGFWUVJVRXpKeUF5SXg0NktTRjhMU2RBS3lKU09DeFVRanFjaW5jUUVCQlNPakZTT2pIenA0dFNPQ3oveHFaU09qRmtURUJVUWpwU09qRzdxSlAvK1BRcEhocFNPakZTT2pIODcrano0Y1JxVVVSRE1TbFRTVVJRUlVGVVFqci8xci8vMGJBYUVnOVVRanFIWkZMLzU5bk9URU5UU1VSU09DeU5mR29qR2hkZFYwd3BLU25HbDN5V2xKS1VoM2Q0WWxNNU9Ua1FFQkRlejdmTHZLV2RqNGh6VzB4SVFqLzA1K2JicDRuV1psWlRTVVJUU1VSU09qRlNPakhvMTd5TWduNStiRndaTFNsV1BqTDM1OHYvNHNMNXc2WFd4S3lKY21GM1ZrWWhGeEl6TXpQODZNeW5uSWkxakhSWG1Zd2hJU0VZR0JoU09Dd0lDQWo1MHJ2ZWhuK1NibHFSTUNsV1BqSUlDQWdBQUFDTFpXSkFhMkkyWFZSUlMwa1FFQkJVUWpwTE9DL3h0NWJscXFXdmhuQk5oM3NwUkQ0SUNBaFdQakttTk5vekFBQUFnSFJTVGxNQS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1JCSC8vLzhpLy8vLy8vL3Vadi8vZDRqLzNmK3EvMVdaLy8vL1pydi8vLy8vSWpOMy8vLy9NLy8vL3pQTS8vOFJNLy8vLy84UmlQLy8vLzhSLy8vL0VVVE03di8vLy8rNy8vLy8vLy8vL3lMLy8vLy9SR2E3M2YvLy8vK3E3dTcvLy84aWQ1bXEvLy8vLy8rcTdrRkNOa3dBQUFBSmNFaFpjd0FBQ3hJQUFBc1NBZExkZnZ3QUFBQWNkRVZZZEZOdlpuUjNZWEpsQUVGa2IySmxJRVpwY21WM2IzSnJjeUJEVXpRR3N0T2dBQUFnQUVsRVFWUjRuTVZkaDBQVXlCbzMyVTJDN2dMQzB2dkNvemNCUVJFYkZsVFVzL2ZlRmZYT2UvcTg0b24vK3B2Mmxaa2ttNngzbkNOdVN6TDV6VGUvcjh6TWwyVFhyc1RTTnJueTIvejgrUEJnWlgveUR2OWU2VHA2clhLb25nTUdQVjBpK1RJK2VYV25nR1dVcnNtcEd4ckd0MnU1RHhyeGZJUGVsMysrZDJ5d2JRY3hKcGEyeW04REhpdDVoVjlCNkpHdlAvcStQMTQ1c2FOZ3JkSldtY0tlVi9MenZCczV4WGZkczR0b2dVRHZmUnY1bC9oZitjM1h2Yzc2My9OV2NoM2I1YkZqdE9oTkIzampSM2NZOTY1ZGh6VE43YUowTDVmbzU3Q3hyUEh3NFZoK3pma2U1SUxudm9OWi8rQkgzbVNlR3Fib0NIVjhSRTJSLzY5WGRnajU4b2lsb1Q3RExZWG9YODlUeVhYZWJNWjdVSjBka1g3WDhDakt5UGZRVGtBelZFdnk4R1lBbSt6cm82RVpSS0pqZFhtTmJPUnpvd3l0ejg3bWE4bHJFSGw0ZytxSkdndTFpQytSYWRlYmZ3eisxY0ZqRnNVUmJveTZ2MmRYMXVhenVwU1JqRWhod2ZDTGplUC9xMTFOMS81cmxjcmN5c3J3c1BpclhEdlVsZFRyUjFldUUrcUlSRVp2K3F6cSswQU84Tmhsa1cxcmZPZ0ZLQ054T0czN0QxVUdWNmJ1amxyNkFvd2J1RHMrUEN5YWRIVC8vN3IyTDFlR3gydHBsbmlOZkx1YTJ1SlM1NDk0eCtHSmdVTklJZkYvWU81YVY5ZitydjlWS3BYSmxlSDVlWTkzbXBhWWo4ZXlob0FzWEJFREp5UEVqaFVxOWN1MmN5ZTRjRDJmTk1DY3pvL1lSZ01qQWw3eVF5TW1SZFlraGc5Kzg0MVk5QWtpNHFrUG5OZTFER2Z6QmlwVFZVZStMU1BlRWo4bXVpU2MvQVBnc3drUitiVFZ3R2ZIUnNTdDhaemd0VHg1OGYwRWtGWUE0a01mZU1nQWppcExoZFJoWEdsanhNcWhzVlNsajVKeXordlp0YnFpZHJodkgrZmk5VzBoY1owQW1nS2tiRGQxdzFZb0ZoZERrMkk4OWxKdGN4SnVFS3Z2MFU1NENoOTBoZmFsbXJzeXdZUFBxRk1xaG1ldWdRTklZQWQ5MTlMRUZRZmE3aGdxTDQrNWVXUEFjVExiQ21UTzZydW5CcnZJZE15U09qZGMwbHNUSzJON00vbjVhQno4d1V6d3Z4am9sdEx3dnVVQThJdyttVURlSU9ncWlFODg2Z1ZxVEJTRHpGdkRPbW9rRS93VU94VDV3ZXFKdUEwbVlZR1p0KzJGaFlQMmp6eFh4M2xYeFE2RW83TnQ1VWltQUJ5end0VFNKY0kvN09QbU04R3Y2RFBxSVFCUjFSbFNnaEh5bmY5T2cwbXFyTGVpeU5wT1crTEthelhURzgwRVArZDlCeHYvcGM3SUJEOXA2NXJqQ0puVmlmY0kyODFxVklvQXFBTkFhMkpuVVI4cFVNdjBVcFAvZ0lUaWRBVkUzeGVTbWJjbzAwdFZvRVpYQms3MDdYUERZZ1RJeEJ3ZnhpbDRWRWVFUitCWGxFbGlIQ1ZLNXRSTFJWY1ZBUUlLOWhnelZBTXRFMmsxeStCS0hramJjckFveW5vc2NwcW1Ec2djZkZZU3RGM2h3TkExNWhrNUVOdi9wRWlROUNTdUVqeTJjV1B5elBpZ0F0WDczajhSeCtJM05pTGpmVmpYVURCekFxSHlmU01GUUtIdHZ3bGNDQVZZRm1wRkZBL2h1QXpzM2pFL1pnWTNrMTdteklFdG5pUnI2TE9UK2d3eXR6czhtc2lhT1REVlpZSWYvSHNHZ2NCMTlNN096dmJNenZiMkxuRlFmMGVqTWtleHc0WWhrVk9ISlpVNEdpWk5lV0QzYWxnc0Z1Vi9YY0xxNnV4c1Arc0p2VitkVVY1bVdEbHV3ZFhIbWJsT1YzSStCYmtlMEVTZXQzODFEQlZ5ODZZL3FQZlYyU1VHQ1d2a05kZVllL2t0Qy93M3U3VStWcFUzSE8rdm9yak5hMGcveU5hczl6bzlsanNBbXNyQWZwVVlFVmNmUDNXRWhudDByQlpENG91V1BtT1A3b0p3MXFuYU1nRHA5aUlyb0ovMFlxajUycFNYRVRyMGhpUnMwd2dqZjZZRFlyT0dYMi9va0RYWCt1WnZEZVdla0pCcmMwZkE3eUFCNU9YT0w3V3hML3VzTXMvdVNTOXordkVKeDZzbHIxK2dQN0FOZ2o5aGk2bFpLMlVFNHZiTmVRd0szcDZNMVpIcjN6T2ZZbmJyV05YY0NGa0RHTnZKOElTNkZGZnptQzdxZXkvRFZnN2Jwc21aRnZhc0xXNi9kQmhJdG4xbjFLY09nUzFWZ3UwbFRBc245RXVOdUJLWE1kVng5UVZjSFNIeUJHWE54QjlTTTRoSXhXcUhaOVdlR1l3UHBBK21qakZ2bVdOVVJ1QWpJWGN1YWk1aDNnS3VzK3BMVlZVVjJUT3pIdGdDNm1nUGJFV3F6c0k0Sk5tQzg0cE01WXp4VmNhWGtDTW5OVFdjS2xwN1BzRWVKSGJXbk1GS0M0dEhJMHZlcUp3V3Z5M3ppUnI4eEdKTEdCWkR1eE5DQ3pPM205MGNvRTlTdDZUR1lIMUxUb0tva0RsSGNXaUdaQTZ6ZTdqVVVjUUVXUGNBM3hpaVZpdzVYakdpWmtUMitmUSt5UmJuR0lQc2s4ZzU1MU9XamZxTGFHakl0SWVFRCtuRDJvWEtMYndWcUE2eGtweGZuQXRKY3dqWE9FbVlOREFlQU1KRWFrR1dheGlHWW9RcUpOYURGamdkZ3ZKZmhaUHlLWFVmeGM5N1dHRkowdGszY1U0WXM1TzFNclhPOFZoNmk4eXhnalh1ZCtYL1dhKys4V1o4VGJQTHBZZzFNY083MHQ3UGw2UXB1a1krM283NFJnclYrcGxjNHFiTytzMVBaUDJJNVVvVFVLYk9tSVkyR081VTR5eXhyQ1Z5QzJpQ2hMZDB6Z0NKVVBpdXAyb2JZTnBDcjM1MnJETnJDWkhMT013ZDY2em5INmJKTCs1WXRzTDRIUzgxUEZTSFk4UHI4VkRVakY2c1A4OGF5emNIL0c4MldES1l4aVJhTFdHS0ZEMEp3YnlFWU5LdElJenN1bXRzUW15aXNmYlk0eVNtbEdsQmU5S3lUZHZBaEJrTkhNWWtXN01Pem5XU2Q0enI5aGVyQTlTeFZaU0lFMVJ4Sm1PeFIrS1YrQTVjeHVtdWU5VUpIVUh3SVJOMnlCbFNMUExBbWY2djI1aDVTK0kyd2c0dXB4emtlWmRnT3dBY09TWXJLa2FWUmJOTys0UldpNHM5eGdQV0h1QWJLTmFVcTdQdW5SMFJlSHJFOElSQnlSOFJBR0xMcElaNHdoelJJWjhFNllwdnRzUWQxd1ZmZTllcVJYZkg4SENlQTZFc0RRbXRIYXJXckczdGRUMit0amFJcGk4aUk1VWo4V1BXUmt5eG8rTlJRNk1BamdyenFFRVRKL2Y0amFYWC9zSis5K3FZaGE4NjhpVk91eUZCbmtGaHNZNUJJU1A5RFdwaXFubWlMVGgzdVdReEpDU1ZaR3BxaFExeHZsaTdyRnZXM0ljR2VBbHpseU9jOGd4dS90WFZKNHp0Rm4ydG9BQ0J1d2FVTjBzZnUrVGxYVHM4WmxsNVpCTjJFeGxFczAxckEzTzM0R1hxTUlnTUxtK0NLVldyajNuWDI2R2wrSXpnVjNnREUybGo5NmY1MElPNlo0bWYyRzNQc1RMVjRPYUlZVmN4RGp0NXJSa01IRS9kTlh2V21iZXhhZ1BsY3JTTk8rZ0U5bysxaVRmOENXTXFuVHhwUVIwMWRvRGcxWkhEMHpHN3ZyNys1RWx2OXlweHgyNkFMVlpzQjlCc3ZidTNXNVRlSGhaeGRqakdNWFdLZXBEMDlYdFdGeDgzaWRMOEpRZ0toWUw4Zi9uVWw2YTFDYjkzTlRYRVhPK2RXRnhyZW5IcXNqaWdYTkJGSGxrb24ybytvMHhYT0p0MzVYblkxbGVHUFZkU3hQdm01cWJtNWxNSUlkQkFWRE9hUlRNV0p5WW11cnVYeE92RTR2dW1KZ2tad0Fid1Y5YmZ5bVZ4OEl2RjNxb1lqVFBSK2JGMVFvSUJBY0pnRFc3Z0lwbnBPdXJWcUZuSXZibjVjbEFBSVJJeThSSUU1VUFMMlB3WUJId1hMWEE0ckN4MkR5NkxqcHlZdGJoaHdiSFk0TjAxNENHNXlXZCtEQTJMYmJLWTVwd1J5QVg4c2pvNWh4WW9vQUhyQ2ZsZDdRZHRvUTFtTDdHaFhHNldQSXpRb0hsa3MrRUw4enNRM2N4bkNkbjhaRTlBTkVub1RWKytTOGp5Qi9rYVlCUGx0eStTaDQvalFtYlVJWVVZWU1ZbVRpcldYMnlLQ2VkMEl5bjNwdVpUZFBJQWNBY0diRUR0Z0VZRThLRWNBT3ZoaUVMaGhhenhNU3BjWkRzZTBtRDl5WUNIRGttWVdJcjVCaHdwckNuc3paZUo3VUVaVlJIQUJoWjFBdDRqdkZteXFlTHJLVW1iTlVPUXpOUUJqZjBxNElhSUlOY0NuVVF1L2l6cEVvWHhVNWtvWG1hUUEvTUYyeXJmTHdzdGFsN0xteHpEUmlJeGdERVBpL1dwMm9XdGtkaS9sSmtjT1pJQTJnVG9BN0pFbGw2dzk4dFNqUjV6dmhKTDRwT09Hdnl5aHpUelBCWjMxVFErYTVJMFRjYkthekRFZys4MFBoSzhVbGd1ODFUalk4ZVVhWXZtVUFkRU5ZcjV6ZHBRWHRZaUxKUEhJV3hhSzdVcEl0cG9zNGlrS2tPdktjbUx2bHkwdEszR1pEMzVLRTRuN2xiVDh2a25tamN1bkQ1OStzS0JNYkowWkdvTVNSUzhNdmRjQmJTUEpPK3haNGYzemV3N2ZNQklmaUp2cEtMQkQxdSt4L25DcTJBdTRsR2pLdWYzN0RtTXhDMERTNmhJeDE5R20xSkFFcUZxQnc4Tzd6Rmw1djVscVVXUjU4N1FlZWgwTlhadEdRZnNhRDZ4QVI3MG1sM2ZhUTErVTU3MFlBR1FNeU9KT2hwSVM0N093R0NXUHluemVHQm1ENVZOU1VTU0Y1b09VRWhyUm0rVW9nUEhyR2ZsU2l4cTdJMlg5bWowRWhHejhtUUhVZURnbnJTT0dwVW9IMmdGNFBMRDVtbWhTTlRWcUdaSm50TjdBK0R0K01VV3MyVTZZY010QTE2ZmUrWmdHUXdPTit2TTJhSWhSV0twYjIvM2NPeXRtNDJubTk4RGFKT0VRR2Qxa3RKTStzb1VwMG0rY1BnMFVsNlZmZHdPWWhjNFVRMXBMUVFHWXpNU2RXc3I0TjlzYkx5d1JoSk1ENGRsTWRNSFUzVmZyYUpaYyt2V2VlajF3NEdLdUl5UUEzSkk1UUxpUlp1UGpuZWZPWHptOEQzRnY0ZWkwalA2RE5tSllZTW8rWHc5aFJzRWEwNy90Mi92M3ZZamw2WHdCSVl4c05XZ2tHWEY3TUFRUEVEV1kwZ2dsRlZEdi9SdXR5aFgvdHl6NTd3QXYxakxRQ3VRNXFjSzBRYmhNUUduajkyRjFQdjY5dmIxeVpNZVZudzliQTFJSE90WXBrMzBVOWtJL3UyUjNlMjcyOFhmbFVzU3ZEWDhUOHcrTUIyeVRBcHI5UTk4QWVmbUt2dkZ4Z3Q5RXZ6UDRyUzdqNmdlMy9NQXVleEVPUmc1QkdBcVRXaWd0Zld0Rkh1NytuOUZjbEZKcmZZa3F3Wm1KaXRYb0RVKzV4VTM3ODVTMWExR1FSbFJmdDZ0T2x3SjhCazYxZ0FNZW9BQlFZRTFSemRBY0Y1NXAwdEgybmRqV1JOc3RFUllLNW5DTEM5TVFtUHlPdWJHL3dyS0NQRG12SDlxZ3dNYWlreUh1RXUvQlhZL0ZNWmFwYmE4MjgzSzNsdU50d3hiZkR5cFJRS0NCUU9waW1mRDlPdytpckhwekdrbCtMNmZ6VGsxY2Nhc3lGSkx2VXlpTjNTU2JTdXJqY28vTFpncWxCamErL29hajF1U0kybmpiK0F6SWQyc3kwR1o1V1p2L1hjdnNhWWRSSCtnVGplckZGMElYdXFxYWNIZXZsdG51SXJWY3JPUXBYakM3cGRhQ1JlcUVzUDR2Y2pXSzlyVUIrUTcwUnRwdTE3R3lKMmFzRSt3Wm9hVFJvRGZ1emJCQkFnc1RVeSt3U251VWM5aU9sOWNVUzlhYnlBbC92WnBqYjJQVkUzeVpsK2dHY0hzREhBR2dtWWFyWWdQcldCcWRwUGs5L1pSb0dMbU00Q3MzRWZLRjF3RS80MHppL1ZVY3BMUWhWc1NPZGdhZGVxM1VvcDFqVHZLWTVJMWYzTHc3VDhMNjZ0UG5wZ2tCTzhhelJ5QVgwbGU2VFBIYW91Sk9ac1QydGIwRWVVTjZhMlF2WXoySEExT3dkZ2kzYTZETXBxeGJNM3VuNFZNbUhUVHZJeGV5c05VczBIV291VENmTmh4QVg0dkdFclQ0WmUxdVVHaWF5TVBnSU1nWVpRdVk0UFdLMGgzQmo3MS9CNHovRFREUGVuRldvZUFZeEhTNmNZMXkxREs4azRpR2VPaEw0MEkyYnhJbVVYSHlyOWVvZllyOEgxOVhzTHlrMGJqczk0US94bDRKL2lrVnRqWGJJaS9pY2JHdFQ1UzEzWUVMeVZQWVFEWFZnako0TE5xd3dFWkExL1p6WXNDYjNtWEd1dVNGVWFieUVHZU9tby8zaWc1YjdORzBFYUU1UTkwT0NtUmxRTWlpWTdweXdGVENFdnlSQnlnallQZnBZNytHZk0rUnJ6OHlRYW5OZmcrcHE2Z3NKcnVBY0VHd2NOYm1mQUhVbUgzdkd0WGRiUWo1eDBNMUFEZitzbkhvRkxsSkhLbU9NZFlsNjlPeUVHSWxEeUxwNVNwM0ROREZwMEZZd1VkaENIdGNSaUlwcEp6WHByS3lMTForTW0xbUNENUV5NXl6Mk42bzE5Z2RIVmJnSmRPcXM5aTZ6N2xwR2oyQ2RsZVkzVEZuSlJsS25QYURsZ01QTW9DVHdQY2p1cFkxc0Z4R1hNLzNzdU5mTHNNRDFybGNJUmlBSEswTENBMkxUQTd5UWJQSElGWVhvSHYyL3ZZWXhFQU45QkFYdndkY2crR0xlU3M2UW5aS2hzUy9IOHBOR2czbEc5dFBWQW9HSU1lbEdIcUdDZHNpUHpvdzNSZzFzNnFrWUZaam13Vi9RSzVsYU5PLzdndFlOK2paZ24rZE4vUG5QSkg5a2tjWTl5a2E2N1huQ3c3SU1lKzkxai90UXZ3all0NTcvbGd4aUxMakNLOGo4REc4Tm42eGFZTFN2U1d1djRwc2U4TGtPaDhBTWhNUFU0YTZPMFAxQ2p3SFpQODdqNDlHTEZ3cDgzV3Q1R2haREdiK2NETWt4bjN5cldLaTAyS040MVhFSDI3SGdhMjNnZWdFQld6UGlEcmlmNjNFT2lBL3RJUmh2NjlHZ2JHNW11b05jeGxHdGJjUU01WTNJcHdmL2I3V3JQaXpmbExSMURSMURpcVZVYzJBYkMrQU85bFdqRXJ3ekRMYkhxclpwdmVIa0ZYZlVYTzIxeTBVNUlZMDYzNFlDQmhFSmk4ZGtibGZYUFRrSnFpdkFUTzhjb2xQZlhCK1pKajdVemFuSDFxeXVmdEVRMjkvZDNNVGVsRUxLTmlKUjN3MUlKUkNPWmpXc3A2QUdNaS9WVXVoNmdweXRiV1ArVkpqL3pacXFjWkh6Q241QXhXQTdRN2FDZTFJaC9VazN6NzNzbHVsSk5PbDBUVkZ6eHlrNVJkRTdzeTM5eDhBdkNDUCtXK09EYXNra3ZlRzQzbkJYYXBvM3FTVHBiN1phSzJrWE9PWWRWaG1LUzh0S0JtdWxzRmVMT3NRMXpSbjl4aDFSVGFtaG90ZENJMnRRSjRZVk5LVzRzY0psckxJTytDQ1J3MVEvNjRjdVZkT1VpTDJNWm1jSlpWdFVHQUg1TFR4Tmo1NmN2ditnNlFjMmxKWE1RWTFCSmZyM28zTDhDa3RDa3pZOFpyd3VvMnlQcy95ZzM4b1hrQ0l4TFVZQk9kVVYydGpSZEUvYnFYVTBkeVdzUjZJUFc3TFdqUEdsQ1JwelkxdmxlcmFBOW10T2lOM0dZT2toZFNiaFlib0MzcUZZZ05iRjhid0pRZlRuSHZtWmJWTC9yVytTMnpqWnQwT0Q5Z2R3eE5JWHZnMVNKV3lacGFPRmI5VFp4NXdKY1BBbVMwZURjZTJPUldJSEF6Y1N4M2VkdHE1S0FjM1F1NVBMcVd4M0R2Ti9wYXo4VkZheEw3QzNIU1p6TkdaRFBQSHFTdlYyb1BkTVdlTjZEUVUzNGZPd3pxTTNPZzhFWFNjczJ6QVpNTnBCa2xYMThzWlM1WW9Cc2lldlloVmozZW9oVE5LVGt5R2p1Z0Z5REhUSTVCT1dBZVZ2dWtRa0U3Ly8rd0Jkb3lDQjRHNXVYQzJMM0QrL2J0Ty94Vy9QUkZKaCs4Wis3ZXg3UTNicjU5NzRhMmxHODRVQ3MyYzM3V2NZYTE2cDJkUkNOTStKRjNWb2dBNDFpbUFEakEra1BsTTZ4aC82ZExkQndHMzdac1BXZ2NxUWxmRjMwdlJIT0tKaUN6NTRRaEtDZ1hhSkVoNEc4QnplZ3J5amROY0NGYWFXVUV5ZHdydDIwMHhoR0xMS3dQNVZlWkZIZktHdTRGeUhPVktHYVliYWR1NVZzcE9hVXpuUkxqRWpDRXBnMHc1VlRKRlpGQkRaR21UWUxOemgrUkJlVnlFQis1QkM5VXdvckxXVGNpMDJoeCtEMFNEMnJBTkxvOTRxdk1zaTlKazc0RjZuMG0xOFQxSE56SFRPS3JqMzk4a1p4WnpMR2VJMGVwZE5YRkwzeExRbWN4NytYTDJLeVp0Rk1CS2dlc0VSaExJcU1wbkFGVEJIb0xSY0MvTENqemZwSG82Y2pmZzFCRmF5Qy9rUDBYYUo1dnROT1N1T1hjZkcraXVla1BOSXJrbGdKUVQ2c2RScndCYWJLaFR4bTlydnpwanhkTk9rc29aMHF3ZFVIdk1QVkw5ZzBhSGplOXNNanlYVWtIcExSSzdNM05rT0NVblhRZ2dubjc4cm9LVC9CektFUzNUakU3bkduK0kxdXE1Zi9ZeFJqTG9JQ0hRT2NJc1RlZjRaQk5UT0xreWJCRVAvZXV6bTFUZGR3VDZQR0xyRWk5RUJ6WmJaY3JhUXViUXV4ckVkcEF5N3R5N0tDOWZ1SmRibzVldDlpQmVCT0k0eTJlc2dDWVRxRFdDT0xFd050TzJFeUxqRDA0dFhHYngxWnVQQk16SDJsMzZLbU1NdFRXTVc2cWtCZE5Iemg0Y0d3TXdjUlRoWUlZYlFwT3F0RFl3ZnZQSGw2NHpkSW4rUWxTVTRWU2IwbzFPY3BhR3lYVVNTSVlLcFVhU3MvdXl6YVFjV1EyVThjMmhhRGdhSzl4V0FjUFBHc29MVHkvSGRVUjBzb2RCbXJkeXV6UWVBYmgwQVpjZk5qUUlCb2d5clA3YjJVTFRGQ3YrVkJtZmNCVVFRZkVCKy9MdzBybkgvR0FDczdvMnovWUNwQndGMnFyZEExYU42T3VrWmc1ZEs5QmdSYzRSQ2NjT0RoR3VvdHFISkFGTlUxNWNPQ1pPdXJtRUUxazVMejcySHoySFdaMzdkcS9jZ3lPWm5Md3VTaVVPWnFZTG1ua3NvaDMxUUJ5cE5DTU11UE4ySDNkWDZYcFJXWmNjdDJCOTVmY0QwMW91ell5Q2p5c3NTcDY1cUZDWXBvZ1B5eThIVXRmMXptb29aY2FOcy9FUElrZENUQXg2WThqZWFUT0cxQVpHV1dWSmRQeDBhYkNyTml2Y0pWSzl3K094UlJVZm41d0g3VGt1ZVZIczI5b01ULzVYUTg2dVRvNU5aQ1JnWE44czRHS3dpYng0MGpKMkZEQmRkTTNEVGZQUU12Skd0WllxUit2OVlpV24xNXZGWXZGN1hPdmZrclpvVXMyZ0ovUDllQUF2MlJlNVB2RHhUQU1aK1dWUk4zcWNxckZCZWlnOHhNV1NmQlRVbDdoOVpYbEZGQ0dIRnY2TXFBNzFlSzVrNmw3N1I4Y1Q3UDZzZ0czendOb01FQU5EWnNYcTNoMTFPbzBkc29RNzBMTHlqc3oyNk1qbFV5eVBGWFhNWDN0N094OEdSYTMwdUh2MnJVOE9KK2VoSFJ4V2hIZTZvS2JpK1lTdTZWTitHbmhERStuNGROMFhEU2o0NE9IOGowT1owdGVpdlZSZ085Y0Y2M1lmbHByM3hQTDh2a083aVNnRnRiaTgzdEdIMEg0cFlacGRSdVEyL2RLMkJ6T1A1K1R4THhkbnhvOG1pYnd0bGVmWHpuU1BhbDY5dXZIVDFWOWZkN3JqTWFlV0I0K1p0a0M0STRYRGQxVU5wOHA3MEpVREMvb1BoRmZiMDZreitQZXVEc3lXS241V0lXVEgwUXZWcmZQV2orK3BxdEFxMTgvZlEyMzB6U1hOYUF5UE0vSVE3Sjc5TEFCN2I3VzBOdlRhSW9XRnAyOVZac0g1a2ZtS29rUHc3RExVNG53WmVkZld6YjZwOXR3QmVKTFJmM3R6SXBVMlYrWm00SWtLYnA1NDhWcFF4SGRBUXYzOE9POWkxeFgvQTZ2NDgxd0piL3ZPU2RCL3RYWitaY0w3N1c1a2xWczYveExFRDkzamJzcTNmMzk2a3BLV3VXL1NOSnYyRndBTTFScTJFQ3BkL1QzOXJSMHR4ekxycDZWRHhKZ1ZZajN6aXRueThsZnRmQ3JkNVI5TzVlL3ptR0JvcVZuaWU3RUoxNm1TeXJnRVRaOWdUVDRQQ0p2NmU1cGtVZlZCZjZzdnM2eit2R3Y2cGE3N2VrV3V3TkFtS20xVk5wYVJPa1IvM283MFA1Rnp6WG02UVVUTWNpbVhOVFkrOFh1M2QwdHZUMDl2YjMxZ0QrSjE4aUh4WmhGUEx0bGNOLzUrUExqblYvUEpsV1FXTHlPcGFYZWJ0bUVsbjY0RkhmaXViUTYwd3ZBSHZFM0xUZDE5TGIwdHZUMzYzNWlXVzY1d05PVndYSFJQdjJWbExhem1wdjJKNHk5NjFqcTcrbnBWdUlYanY3UmRNTzk2WnNsNW5UUGVGR0hFRGUyVCtyc3R6b2VqSGV5YUs3Zy8vZzFTU2VmZmxCM1QvdjZzdlBscDdEb2FrVmE2VUpQSXh2UUsrR0x4a3hzYkU0LzFMelhwbWJUOS9vbGNxTVdacDB4KzNiNFdGNlpVT09PME5nWTZlVjJmaCtPbnRGOEQzekRxNnlNUkVVRDVJM0pqZzlObDByTTJ3NTE5QnVkdHNaSDJZOVJzTUdIb1Foa1BoV1RkdmhNZHgrYkZkNGpWNmZlUmVRWTdTd0pDWjhaV21nb29laExEUk1kc04zMytNMHZjend3aDRNdkZvWGtQNFdKYm5RYmlGV1ZnaG5OTVFUb1NoNExkVXdNYlVLQUxCdHdrM2NPamlUbFgxNzA1OHdGL2VITHpqdkZSSE55Vm5tQ1l2V1R1ck9ZL3lZYi9RaERZd0VjT2cvalc5bUlhUjRXUUVDbTNxTjh6UGtKYjVwUXZSTVdrd01ZUmZ2aStsZHpwc3lIWTNTNTRrU1FHOU1zUGk1dE9Pa3kxRTQvR3M4enhqdEhOK0lRLzFKMjJsWWEyd1B4WHRZOW1NYzlZSytiQUhEOHVSbjJxYitMMUNueGxNM1I3QURuRmR4a1JybXBKR3NqeTFsRkxUcFY3VTZkOHdpMVQ4U1IrSTlmS0ZGWTB4QkJFSms4L1o1RmZCbTlHQ3Y0c2ZOT21CcTlmQlk3ckxMQnhuaU5JYzBobStZY2tIOTh5TXpRcUJrbWE3ZUUwZXBvelljUnZxSTdtaWhMbVRyZSswbHluc080bm1ydmx3ZHFYSXozYU9nZURrdFVVRlpqQ0N3M3phYytrNkR0ZFpIaXJyOVNmSlFwbi9GbWRFQ0dsQm5DeVJ0OCtzSitFYlFadW9kemdXQnNPTHZpQ1JxamMwbm42ZnA5bHQ5NjVpOFJzdGVJR24rQ2V5dVJiRzRNeHNabko0N2VUWkdoa2YxeDRhVndOdWU1TFEwRG1ld1BOT1ROb0RXbTZwTFRYaTE0S3huWmhqdWZ3bDlyV2FkelZhdENmYnBqZzhTZXRxTnpkelB2UzNCOENDZlNSSERBMm1nY0ZHdUpNVk4wMXJ0M2Y1bWZQMmJVdXNwdk95UGZhb2JyWjZzcCtVUHlxWVZUZCs4eUdSSUprQWpRNW8waGJXblVpUHc0cDd6UGVvR1R6alFmaDVYS21QbzlHTEdZTytoczFYWUwyNzVWcHg4L0s3RWs5ZFlRR3hmQXhvdHkyL0ZnZWJ0QTFMN09iZ3Yxc2ZOak1TdmNuUU4zQXhZOFY2b2o2YUFhVFEwOWh6a3lJZmt6S0dXZjE4S1F1N1pJWDlZaUtucENsQkdXNW1QbStQb2EwN3VFQXY0bUxrYjJQUnFhMWdOQVZTNnkvU3dyd3oyYkpSdWNlYTJHY0JNeEVVOTJaZy94S3JhRTY3anhQMnlKdkl0RDAraGVHeG9XYzJVcVc1VkJYOUJOLys1MHZyeVQ3cDlzOEo3RlBxczVJS2NheXpHUGhzN1RNS3BoSXNlVmI5QUZ6bnc2VEFub1diSHNpWUdLblN6MFhjcTJNYlRKUmxJVGVYS2I0WVRXdlE4OXhmYnFSekdzRG5OTnlWUjg1d3ptbERVeXd0MkdSVVBTUndIOGtxc2hiRS9BN2RRRlk2MStKWGs1S1ZBdGhwK3pzV3ZhL0IwejZma1hoNTRqYVVRVG9ycDdEbXhjdnhuNmllRlRtR3N5cVlMU2NLa040dmFkYzFnV1JKYmJROU13QXBURlVSd3pBblJhaE42Sjk4T3NZdnVucjJINElWTlhFYnpQcW9qWllIWW0wRGE3QWRIeG9ZY1V6cGNhdklTSFA4UU9ZbUUrMXVoM2YrejhxaDFyemhrcW5sS1BwK0Q4Wk9kbHZHRzRSR1N6VUNxUmwzTEFNazhWVzFsM2JxZjg5YS9PcjhMWWJQVjAxd1crRG5QbVdjdURzcWl3REdmTEZ1cHVQRHFwcng4Rlk3YTZXM3BhY2owL1h0K0puaEg3ZXg2UCtjZ2FCQzQ0MlQramxYRXIrNGNkeUd1Uzc5VndxNldscDZlbHBTWG5jK3NQZVNoUXJLck94MHMrZW00bVBoUnRGdmgyWDkzbTgrcktRSUxWeHgvd3Q5RVdPYU1zWjNGekxrTWM1VFhGSEQrZTBJaU10WU1jLyszbnVDQWlHbkRUcXN3MzJYbVYzM01rbFBXMlNPUnlRai9uSXZneUliY3BrU2dxNHIzaGtQeDI4VGtBTDhINDJ5Ty9EZmZkdXpvM3lxckJhdms5Y2Z1NzFUcEVkMjlMUHV6MmcxNWNvTGFtcFpnOWIrSzVnYTcrTnMyK0FQQUdvK2dVbW42M1BpTjV0WFFoL25LQ3Yyb2Ria2RudnZVci91UnFuWCtCcHZvYU5IaVBVWVNmclczUXBJZHBFam5YMS9XM2RIZjN5S1dMTnpuQjd3SWczRm5ENlhQNnJvMlNXWkZWaVFobWh3aHFjTTYzUEpYcXU1YUV2aXJPNTU0TUg3VVUzcEdINnRyUnFia1J6NFBvM3MyQkZhcXljWS9aK2ZNa1dvMHNwbnh0bUY4RjlSbFY2bWd4SmFlbGxMZnI4UUdaYlg4MUo4MEV5NHBYNDVLTlJ3dTRsRjhTNEowbDh5VExzVHdGRHN1YStWU2tGOFltTDNaNDJDYzM1dVFZeDBFR1hUVWNvM2Q3MHhCZXZrN2JQUE5USGtmZU5ubU05Z05oOUN0VFdjZXlaOXUzQkkrblFZM1E5Rk9iUjFFWmNnZStMV0pnSnBjRmJTUHIrNmxaTkYwajN6eG04Y1dIcFo1ZUdSelVzWEE0aDhuL1ZpNzd3TERWMzE0Tnp4dWRaNXgvcnBDd25Ja2FjY3FKeWV0V1N6dWtsK3Jwem85ZDNjK1BlUjlkZm5kMUJzUU5wTEJPT20xUy9tQzJ6OU9TMElGU2JUbTJUWTU3YVBtOS9sNWhMZk12dk1teWY0VGpqcno1dWZqeW1zVXI4Sjd3dzNPVXU1enRjNnhYSnBZVEZVZ05FMzZxdTdlK0xBVlp1aVpYeHVkRkdWbEp5ZDlCTWpCOVJQT3p3VkxPTm54MjJZRjh5MzZXdWp4L1pYQllBQmdmbnF3ekxURlhJVkVtV0tmYm1GWFdVRHJ1aHUzWmp5UGY4Vkx6cnVPTDkzQ0N1L1RJOHozN3BzYy9Hcm94bFdrWmV2N05CcHp0TzhOYXA2L1V6cmU2dnFQZ2FUQVVjL3UxSWY4QUFBTUpTVVJCVkF1ZTl4QUZiN0pWK0hSaGJtZS9VK1VxNXpnS0hIK0IzRExCK1FsdWFkUmU5U1NyN0VqWmIxd1hCbE1RVXVvZmhpaExkQUoraDltcU9oSW1kcWgwR1VoV0IrQXFrLzhJeDRFTmxPVU1DbDVIcnNyT2xLUGN2anZncExtaCtYa1BvbFFNdHdheXE5L1pjZzNEMXNSTXp3aW0rMHIzYUJ1YXBqcHluSGFrMEh3c3lOT2l0UWNSdlp6NThOd0xhR3BkdVBLdmdLKzFKQVcyc3FTbmJZQk42SUIvdExtWjlOeGlSemZuUVY5dkpoalV6RWQ2N3p6NCtGUUZLOU13ZmJDUXNIcndvNk1ibEx5NzdtR1dhbzZmbHdtdHBYc1BONUl1eC9tdXEwRCt1YUtuOFowbjlESnV5S1FCdWZCNEx1UzRvZnhnalYyMjBmaUkwT0JjRDBNTjNrbkUwUHo1d1JwN0ZHZTRtU0ZobVllellSSEFKOHhlWlR5UWZLZkxDaE96ajF5bkpzaXNBWm1HZHk3czl5Q21KUEhmeUt4L0o4dityR2ZScmhaRGxZWjNydGpMWUtQZDJZbXhYZTR5WGp1Y1Y0OWVWUWxWcjJXeW9CM095NitEV1NmWXdiSWNaYkRHRjZ4UktSb25aYzVhZk1Yejk2d3o3R0I1dytjN2pPS2lVa3FrL1pDVWRMYTR5anNFUzc0cm9YYWtEQkNEdVgwa2RQS2h0M3JkZHl0a3Y1T3ovWUZEUVRNbmxKNmNXQzBXZjlXN2ZpNTIyQ01XWGFacW4yRG55c210ZFVjOXpUc0dBaDJDTlNiUjRXbXh4OEp0RlAwSERVak95b3pqZmt1TUtGbFkwcGN1Q2k1TTJWNzEyTElJa0NkOXJuZ255OU10OHh4aks1eVBlRHM4UHl4U3l1L0pzTVBzWUYzVytDTWloTFl0OHdTOTlhWDByQzBSbFgyZ0xQZHpUNnplTVZyN0kwai9pajBIZnJWN3lTT2Z5bXg1YU9VUXRtMzFKeWoxandEL0ZCTjd3NjF6SjNlMUhWcTV6cW12c3NsNlVWdk5NV0VIN1FHTi9TR0I1ZFBQMjl2YjV6Ni9Qb204YURzME1zQWIwQkc2VjBlZUZOR1pNeGdjL1lGZXlpbXdHaVpMVHhoUFpUdjU2MncvYjU4MzlZUEhVblk1Rjg3Mjl2ZjNkOHZNcW9SMHNLZGJRa1ZhV3BiNis1ZjZ1MGQraUpsTUwwOHhZVG5sVXZLZnp0RXpRT3U0N1BOZkthL2h3YW9mVWpNSVQyN2g5ZmovSnJJYzViUE9idi8xZGEycnNFOXVtMVQrZncxV3Z2TFR0dUJMalZzbm1ITDIxZmFIOEVQZXl5WnJsZjhEYmdKNFN6dUp0TG9BQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSIxNTYiIGlkPSJwYXJhbGxheF9zcGVlZGVyIiB3aWR0aD0iNDQwIgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFiZ0FBQUNjQ0FNQUFBQTZYazRWQUFBQUEzTkNTVlFJQ0FqYjRVL2dBQUFEQUZCTVZFWC8vLzlObWNDVGZtdVVlMk9RZDJLTWRXR0djRnFFYlZxRWExSk5tY0NiaEd1Y2YyaWJoR3VjZjJpVWUyTkhoYWlRZDJLZmluRkptOGFqaFd1YmhHdWNmMmlEZVcyUWQyS0JkbXVNY2xxS2JsbHpZRXhKbThhamhXdWJoR3VjZjJpTWNscUtibGxKbmN0RW5NdWJoR3VjZjJpY2ZXS1FkMkpDaGF4Sm5jdEVuTXVqaFd1YmhHdWVnV1djZjJpUWQyS2poV3ViaEd1ZWdXV2NmMmlVZTJPTWNscUtibGxJb2RHamhXdWJoR3VlZ1dXVWUyT01jbHBFcE5kQm9OT25pbXVqaFd1ZWdXV1VlMk04aXJpTWNscHNXa2hEcDkybGpYT25pbXVqaFd1bGhHU2VnV1djZldLVWUyTTRpNzZWZUYyVWMxbU1jbHFPYjFOQ3ErRkRwOTJ0alhDbmltdWpoV3VsaEdReWk4V01jbHBQcmR4THJOMUNxK0ZBcXVNOXF1TS9xT092a0c4N3BlQ3RqWEN0akd1bmltdXFoMm8ybjl1amhXdXJoR1NsaEdRMmx0S2NmV0l2a3RBdmpzMHlpOFVxaThzdGljV1VjMW1UY1ZScFVrSmtVVUZhcmRWVHJkaFBxTlN2a0creWozQ3RqR3V0aVdlbmltdXFoMnFyaEdTZWdXV2NmV0l5aThVeGlMK1VjMW05cG9xOXBJYTFuWUpncmROaXJOQmFyZFZxcXNlem1uMndtWDVhcXRDVm5aV3RsWHEwazNOYXBNeFRwcytzazNhMGtXNnlqM0N2a0crempteW1rWFpUb3NpdGpHdWxqWE5TbmNPdGlXZFFtNytuaW11cWgycWZpbkZObWNDcmhHU2Nobk9qaFd0UWxyeDVqcEdsaEdTYmhHdVVoSFdlZ1dXbWZtR2NmMmlNZ25pVmdXMmlmRjJjZldLVGZtdElqclZDakxTY2VsdVVlMk9EZm5oQWlMZVZlRjJQZW1SNmVucVFkMkk3aDdxWmRGbENoYXlVYzFtTWRXRTZoYlowZVh3Nmc2K1RjVlNNY2xxT2IxTTZnS2FHY0ZwcWRYMktibG1NYTFPRWJWcGhjNEdFYTFKZWNYK0VhRTR5ZWFLRFprOThhRlNEWkV3eGRKNVJiWUY1WkZKN1lrc3djSloxWVU5RGFvTjVYa2x6WUV3dWJKTjBYRWtwYXBNNVpZRnpXVU5zV2toclYwTXpZWDh0WDM1cFVrSm9VajVrVVVFcFhIMWpUenhnVGo5aFREcGJTanBSUWpaU1FqTk1Qek5MUERGSE9TMUNPREJFTnl4QU5DczlOQzg2TUNvM0xTZ3dLU2t0Snljdkp5VXJKQ1IvN2k0d0FBQUJBSFJTVGxNQUVSRVJFUkVSRVJFaUlpSXpNek16TTBSRVJFUkVSRVJFUkVSRVZWVlZWVlZWWm1abVptWm1abmQzZDNkM2QzZUlpSWlJaUlpSW1abVptWm1acXFxcXFxcXFxcXFxdTd1N3U3dTd1N3U3dTd1N3U4ek16TXpNek16TTNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDNkM2QzZDd1N3U3dTd1N3U3dTd1N3U3dTd1Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9XQlZWbGdBQUFBbHdTRmx6QUFBTEVnQUFDeElCMHQxKy9BQUFBQngwUlZoMFUyOW1kSGRoY21VQVFXUnZZbVVnUm1seVpYZHZjbXR6SUVOVE5BYXkwNkFBQUNBQVNVUkJWSGljN1owTFlGdGwyY2U3RFM4TXhzZGdFMFZ3b094VFVXRnNNSENJQ0tLdVhKU2JPb0cweFNHS2pHME9BYm1vM053WUtEYlluS1drQmpzR210b09FeVhJR05SVXZyVk9Pa3RwQ3kyakk1aG1UYnV5cERsalkwM3A5N3ozOXozbkpNMmxKSVBtYVpxY2U4NTVmK2YvWE41emtwU1VIQkIyME96WmN4YWNzdUNVUmFXbHBZdGdZUGJzYVlYZXBhS2xzdW1mV0hCTzZROSs1TEt5SDVSK2ZrYWg5NjlvWnB0eDBqbmYvWVVsTWNsK2ZzSGNRdTluMGJoTm5iT2c5QWUxNHpFanRzRno1N2tmS1BRT0Z3MTB0bUI4bVFtcjlTQzc4OHdpdW9MYTFMbm5aQUFOREdQekJOcGZXSFY0b2ZkOTh0cU1MeTdKQ0JyajlrSTBGdFAxZ1lXRjN2OUphVlBubHY0OFUyclVUd1pqY1YyUDYvSG84WVUraU1sbnM4NjVQWE5xTHBjYmM5UDFXRHlPNEExL3ZOREhNY25zODlaRjJ2aUd1TFdEMlBTOSsvZnBNZEJjb1k5a1V0bWNMRnlrQU9jSFh2cklXQ0l4c2djR3ZsYm9nNWxFZGtyVzJMRGdRcm9PM01iR1JzY1NlOEJaRnZwb0pvL056WjRiaW5CK1NFdjJBYld4eE5qWTI4Q3dLTGs4MmZUTXFqYkZVRXJaQXdFT21DRkxqQUc0M1lVK29NbGlwZGx6UTU2eWZsaVB2NFg4SkxiOVFLNllXT2JGRHN1Qkd3TFhvc2VHRXdrYzRaQzdMUHJLZk5sWGN1Q0dRdHgyUGI0SGdDVkdzYnNjM2F2ck54WDZrQ2FIM1pFanVLR1l2bzg1U25qWkg0OFZTN2w4MkNkeTRJWnprMWg4K08zUlVVSU5uT1hJY0Z6L2NLRVBhakxZb2x6QWJZQmlJSzdIOWljZ24wd2tjSXdiZ1JxOG1KM2t3YzdQQlJ5Nm1oT1A2WWdicVFiQVl2RjRNVHZKZzJYYlI4bkF0VUg1alpKS3ltNXNiRTh4cmN5TFpkOUxTY0MxQXpod2thT2pPTVNOam8zdTBlTS9MZlJCVFFiTG9kc0VnK3ZTNDNHZVVpS0w2M29SWEI0c0YyNElYQWRVM0tTRVN5Undjcm0zQ0M0dmxrc1pSMXhsVEI5RDVGaUdzbmU0Q0M0ZmxxdXJiSVAwSDRVNDVpNkxNUzVQOW9NY3diWG8rdkE3Vkd5amtGNG05c1NLNVVBKzdMczVndHVFeWdHVW1JeWk3a29BRnl1V0EzbXhuSHBPMFBYdm1CNGZTWkRycU9nYXdUdmdPb3MzNmVYQmNyajhUZTd3aWc3cisra2xuVEhjNWFYSGkxMWVlYkNwYVg0NndNbzJJSEI5cUI3QTFIQUh5djZZSGl2ME1VME95L2pPWldINEh1WTJkT2ZDS0hhVHlHSHVMZDY3a0NlYmt5TTR2eDZMN1VkT2NoVGpBMDlaekUzeVkxa1hCQnZJcHowRzlmaGVFdDhnc3h5SngyUEZFSmNmbTVVbE56Zmg1dW1BQXVBZDdDZEg4YldCNGdYd2ZObm5zd05IdVhtOHd6SFVlWUp2R0JvcDNpdVVUNXVUVGI4WEU1ekgwd09KNUg3YzMvVU91cE81ZU9OQy91eVF6UHRQYWprM2oyOFlkTFlmRmQ5NzQ3RllVWEI1dFRuWFpxczNzRllBRjl1N2Z4OFVCdnFiaFQ2U1NXZHpNbEtkUjdGZVFCWkRINC9UbzhXVU12ODI0NHZweHJwYWo4R0N5RnZHOWZodzhST3BoYkZaWDBuajVpRVROckRtYUZ5UDZUODl1dEFITUlsdCtuaGZ1bUNCRFZtZzQ0cGM1WGJFRWNkODhwT2ZPdkhFWS81blFvNWtFdHFNazBwWnN1SjJqNnMyYkhlZGUxUU9iempsaU05KytYSmJ1UTJzdkx6TVp2dis1ZC84Nm1lSytMS3pHU2VkOGQxZnVPdkJFSmphMmcwR1ZBME45Y1E4bmp0em9YYndNYWQvM1ZaZVZsRnVRMzlsdHZJS2dHZXpWZnp3aHU5OTlUTVRkemlUekE2cFQ4dE96bkx6VXdCYVdYazUxaG9nS3dPMWxZUGtrT29xeXN0L3VITGxpbThXMldWbjZZRzdLSnROVC9uVWx5OUQya0xra01qSzhUOTZZSVl3OFAzbEs1ZXYvTWxYaXo0ekM3c3pMWEMrakwvRzYrRFBuZ1dneWl1UXZJakdzS3NrbytYRWIxYllnTnhLWUZlVVhlWjJWM3FTKzNSR0d6MzR4SzhqalZFK2pCaVdIRmFiamZoS0NIYVlIS0Q3WGhGZGhyWnN3bjNsbEUrZVZVWjRsU0UwRlFoaEJYREM0UTNUb3krWTdROVhJbmRaUkpleHBRbnVyblMzZDh6cGx3RXM3QnJMeWxoY294NFNNY1RScmdLbGwvaGhLNytCU0E3c204VllsNEZkbEI2NCt1UFMyZGpCbjcwY3lheU0wcXF3RVY2a0FFQVNoRUVtTjF6VUFkc2Zyc1MyWXZueUlycE03Tncwd1gxci9FMGRjMVlGSlNJbElyWUtDaEVxT1F5THVrcVV0WlJoak11cDRsWWdmbDk5OTQvNGZXSm5wZ2x1UEY4NTVjVEx5MW40UXVrSGZpWWUwa1lyT1JiZ3lzcUk2cERuQkExZXY1SW1LUGpsZTBYUnBXZW5wZ211UG1YZnlSRmZ2cXlzekNhbEhzUmI0amdHY01yS0tGUThCWGQ3b1FFY0EyM2ZCMmpMbDlNNFZ4UmR1blp5dXVET1RicUpLWkQ4WTF3b2FGV2dCQktSdys2eXJJSm5rallxUDZaTEV1R1EwMXhPOVVhRXQ3d291clRzdUhUQkpmT1ZSNXgrR2U3S3dqS2lBSm5Dc01PMHNYNHV0RVNGalVSQWxyNmdseHVvMUpqa1ZxNHNWZ2JqMitIcGdyUDJsY2VjSlVveUJLK3NERFJIMGVBWVYwYjdUaWdtaEJRWEF3d3R6TDJCUWFNVlhkRmRwbU1mU0J2Y21hWjFwM3pxNjFoVVJHaTQ0SzZ3VVhWVmtIU2tnbDRXb0I2eWpGSXVzNG1jeFhiOWNsbHY1TFhvTHNlMXRNRXRNNnc0NWNUTEtMUUtrb2lVRVFHVjJjcElueGF1cnl0UXRDdkRBaU9kelRhTVdzNWtybWZFaEsrRTRxQkliaHhMczdNU1RQblZnWU5Qdjd5aW9seEtPQ29xU0Q5eUdWVldXVVVaODZGb0hndHlWSS9rRWdIcHg3eCtwV3lNM2srSzVGTGJzclRCblNwV091SXMyZ1ZpWTMwZzViUjJveTgybEZyQ0U0dHZtRm9GelZmb2FyUmlLTCtlc2xwQmFuQWE3MWFzS0tZb0tTM2RQcS82K2p1L3NmanF4WXUvQVk4cnI3cktScHFmeUFrbEpUYkd5TVpreHk4SDJPakZieVk5UkJHVkRUU0p1VjZJalNDRWttQUZHaXlTUzJGSFhwZzJ1SHFId3c2UDN6NXczMzMzcmIwUDIvMFAzbnpMTGJkY2VTVnd2S3FDd1NLbEFldEhyaUJkSmxEUzJmQUY4REpTZnVNMGhYUm0za0QxUnZ1K2xtTnlhTGpvTFNXYmV1U1JKOHliZC9ZM0ZpKzkrdXBiSFdDdTlNRzVHRGJHRFFiSTBGcnlkUDk5OTk5eTh5MVhYWGtsOHBJNGtKSCtTaFlKY1RKakl4a2xtbDJCVTlBYmxxK2dsY0J5MG9leWtqT2M3T1NtSDNuc3ZIbUxGMTk5dGQxaHg2cEJUMWcvRHZ1NjlNRjVLRFpyVzRzZWE4a0wxZVA5OTkrQ0JJa2RLN3BxWU9QWHcySENWVDhqOXJ2bi92blBwLytKN0xsN25ydm5ucnZ2UmdHT09zMFZVd3JkZElXd21ad1dBc1NJMlNrd0IrRm5kNlFQN2s4UFNDcFRFS240MWlyall2VCsrNUZqdlFYQit0MUQrTzkzRHozMHU0Zi96MkQvQUlMM2dQWldyRmkrOG51RmJzUTgycUhIemp0ajhiZVhFbFlVbDRPK0NHeVlKbmxlNTNyY016NjF1ai85OGRHSERJZ1FsTFgzU1FUWHFrOEdwR3VWbGRlQ0lHKysrZWFmUFl6VmhvQXArUDU1ejkzSWQwNkNQcFRwcythZHZYanBiVVJWNU9GZ0drUEk3T1NaRGlpaWd5RU4zUXViR3Rzamp6eHNBbmVmdGU0azUybXBQUm51NzU5ODhtbGtUejczOUhQRUNFZFEzajNnTmQvSHFlWDBtVURzYWhHMnFER3g4UWVoU0wwbDA1NkQrbEV5NG5SWjh3TnNqejc2eUtPUENCSnJpZHBNek5aSzJoUC8wb0pyK1dRNitpaUNCZy9LNzJreSt2VFR6OEhqdVh2dXZ1ZVVZMmNlT2JYUWJUekJOdk56b0RFSHA4SndNQ3AyaWFQaU0rMks0dGdDd3FGcVRsZHRyU0NJc0QyQ0h3OGFTQmx3eUFxalUzNFA5dWpmL3Zia2svLzRGOWpMcjc3NitxdncvL3F1WGJ2NjBYLy9xNisrOGNhckw3Lzgwci8rQlo3eWFjazR4aitSbmJ4MTZkSnZMMTU4OXJ4NW56dnl5RU1MM2ZEWjI2RW5uRUZFWm1mZVQwUXdPL09RZHNGTWNZc083aTBaWDdHK1FZeWFjOTF2SDNnWURBRjQrT0VIZWZKb1lRL0JJbzhBb2ljUkl1RHpPbkRaUlFtUlZ6SU9MM1FTZm1XemliMyt4aHN2di93eWJBQjg1Wk5QSXhVK1dhMkVhWHBtYWt1WExsMjhlUEc4ZWZObUhqbnJ2U0hJWStjdFhxcGxyeVo4MkZ5T1FxdXl4NVJXZ2dMQVdrMFBBaVlDNmFYWFgzLzFEUzZoWFl4VnY0UmtKNW5XVDZmdEZLQVlXdkxZU2NaMjloUEkvZjJ2di9IeVMvOHdPblR4SWc3aFZzenhqSG56VHBnNTg4QVQ1UFRQbmIxVWFtYTczUzZVaFllWnBwVE0wVzZYRGxFa0sweGhLajA1ZDdFN2Z2c0F6ZjN4ODROSVVCalU2d1JMdndHQUVCWGoxcy9JOUROOTliT0Yrdmx5UW9Ga25aMFNVVFNyeHM0OWlKM3RvOTB1T3hoNlJNTFgzTVlkNjh4Wk13c0xiZFlaMzduVklVaklzbENIcFFNeHpaTlRTV1ZkMVNoSlVtNC85UHRIUVZndjBialVMMkJoRnFMTm1YSVVwTklJVnlERmh0ZnRaNjRURDRMU0VMVitCaDB2dXZQdjhvN1p4ZW1tK2hHTFF4QmgzcjUwNlRYRXNSNDdhK2IwUEZJNzRleGJ4YTZySHMzWS9sa2ZtK3dsMFdEbEEzLzgyNzllZWxWUUVHSVJVdXMzamxCZjJNOEljVHE3K3Z1NWgreG43SVJ6WlZ2WTJTLzVVWmp3eWhQS3ljWU9nejNieGY0cWgyYm5oKzR3SEI0KzRsdVhYdk1kSXNoWjcyS21jOEozYmpNaGtvNUJzSkdreE9jcGFZakttcnRNYVl4dXBHRkx4eXU3V0NPSzV0L0oxZE5QZlJwVHhpN2gzdEJpbkFpUlVqK2x2NU9LcVI4dkw5Rmx1UHZsYytTL3J6ei9aNFZGMHZNMTJXbk1ZcjdLVlRsdThuTE5OZC9HQWZMWUNjUjR3cTM0UFp6YU9nMVNQQ2ZZT3Z5SEh1cmVhckpEWkpPVVk1R3l5V1FIRFlzNHV3WUczdVIrRVRmeVR0elMvWFNjUWxCZElzMDRjRnJCVlNQQU14K2ExdG53MzlkZWZQNEppR3lhZVQvRmVTYWEzcTdSZzlQVWs1VEhmcWxWRFBRMTg5bWdYWE1OYVBGejJTTThhTmFjQmZOTHgvK0psWFhybk1vYmMzQ21STkh1a0p1Q0hhM2lXUENydStIdm0xOTg4YlhYZHJJRzMwWGhHWEozUHFGZlRrcjZXWDdaVDVVbGdweEVxSitubUV4bS9idGVlKzJWLy94Nzg1L1h5K2VabEN1UmZkYzBBMFhwU0JVSHc0U2xISnJaVXB6MDRFN25uWkFKdjBQbXppLzlVWVpmNCtUa1NHU0hyL0ZwbXZGSU5iSFBWdWNwMmN5Nnh4NzcrK1ovdi9qS2EvL2w2Y1JPcGlwR1pLZWd3dEpHbGorcXBDWFBTSlQxR3RoLy9nT3NOai94MkdNMWJFK1p1K1k3SXl2UExyR1JUa0kxZ3NrRE1tSk5MQ3U1VDZVL1YyNGtOdUhXNzV4eHdyZ0p6YlE1aTc2YjlUZk9POFdiU3lDTWc2bGR2MmF4UERtODlZODlzZmw1TEVTTENFYkpxSlUxTDgvNkVTS1EwNHZ3dDNuejVyOC9CcHpVZDlBTWI2Y0pvWEVCR1JLUmlUeEJaVjlrNTQxajUrMWhSL1Era2J6T24xWjZlN2JRR0x0eGt4Rk5ucWJ4cHFFdVUxcURQOFFXTkxhb0hhU0k3SW5OMlA3OUl0aC9udDhzMjUvSkV1dG9HMDlJK0xFWW5vQXowckFDTzExVTc0bUhyem5qV0V0dXMzTDZkUWVqN095RzNTdG91RkQySjcwY1NScGxPNjBSQWNublhoNU9Vc1VkM0hhMm1kMGhFOEhONWZHNHlmc3FJU0FYMDZ6R05IbFVTNzU0VWhQN1pMMkNsbVR1K0p1M214WXg3NlF5VDFPejEvSGU0Zll6Vko5NVVFNC85VWFOZkZsSjByZCs3N1pXTWt0OUhIenpGcGJ5YkRabTMyd0NYZW1jYVJLNEJibGpxL1Y0TmdWM3Z4bHBjNWwzeGRNV2pBU0RiVzJCVFI0UDNSVkZsZFFQcGRFTTVpTXpLazZUanBjcDFIeE9hSnJHNkpwbUd0NVNuYS9KMjArOXIxYmVRbU5IcWlVN1lEWkxTN1o1MTEzaUp0T3B0K2VLamZ6NDh6RDZtcnVoeDFuYjBMZHlkWVlqa2NnZ3N2QWd2RzRQdHIyd2FaT25WbXBYdHErYWVUK1ZjYW54akFldkpXdE9hV3VhdVRrMGVVOE5ydGc4UVRPK3AzbFhOWFZjMnJabVZydFlTdDE1dmhHTGhUMWU3N0pES0xoVGN0YWJ4MU0vcE1kajZHdnVZbEczY2hTMUlVU0wvaU9BRVVJd01oZ085bXhyM3VUenVPVEQxNVRETll2VHlEZEpITFFVaE9WcHJwbHd5VnN3bjByRzA4VklqNnVldjU5MUVMQU1DV3hOdW1NV083ekJDM2JYeHdpNFhDTWM2SzFoS0s3SDBkZUJna1hrMDhVVkhDUnFHeVRrQnRVUk10NFg3R3hyM2xUdmNScE9UK1dvTmU1bmt1aEtvczNlMy9JVTUrcE9HaHMxOGFKdVdqa3ROT05xeVp5bzdLS3RkdHpCZHNpd2t2d21aTGJiZzdoNWZYZGh6YzNJblpzbkNGNXllTy8rdC9mcUlMdUFkTHAxRXJWRkpHSlljYXFGdzFTVU95QVVnaC8xV0o5dXBwYVFYWXdtUFpTbVZaYXhFSmdzRzR0MXBWaHBjcUxLdUh5T0pUdTFsTVhWelJuMlFWa0Q3NFlMcVBud0E3emxSS1Fta0U2MklMR05KQkpqby90aXczcFV2R005OTVNVWtFQW1DekdzOGtTWWc3MFlZYTN4SUNRMXBtMUpwV1dZYXhrMURVc1k5aUZQSHNHSnRlWkQwQWc3OU4xMEYrUUlEaHhsRkFRM2duK2RiMnh2VEIvMjh4M1lnV0JRZGxSNEVZYUdxMDlhSkRMSWwyVm93OXQ3MmxvZ0ZMcU5CNWk1V1lVNGMxaTBqbmJHWlkyNlVNNEY2OEEyL3VsbXBWU25pemhJckRUMjZsdVdlNGp6NEYvczF2R1A0TURmTzVDZ0JCMU9oeE5kK3ZFUkJtRU9qS21LNUptUlNGaVNHUStDaW12RkkyRTBJOUxYMndFbEJRcUZFQXpoQ2Yyajk4SG1RUDAyZUk0R1l4cWVqbHNYejlYd1hDZHVHNmZHMWlEcjQxRUh6L1RKSnRFS2JDazh4b2Z4ZHVtR05iUWY4RS8zUkNOSHpkNExUM1RRdDNHUTllSE5ISnFUN2FlRDc0cURIb0htWkhzQTcrSnliL0RJdEJnN0dQV1g1UGdqdERqQ1JmWDRIdng3WWFPZ3VyM3g0U2c1R3MzWm8vakVTQVFESTdBaXhoU0ZUbGkvdXJLcTdxbm16dTE5SWd1bE5NTmNxMEVhQ3AyczJmRVR2S0dHR3dDL29vZkdrQkkyRHJLVVJocWRya2VhM2tIYmt6V3lnNTRKR21sYzBwNmFwdkUzYy9MVjZUSjhGbjNGQU9oMHlwVHRINTZKQnpVSG0rdWdlNDduSTJJTkFJcVQ4c3BEZVBpREpkTnpFeHhFdUVBOHB1OVBFR3lKTWZUalJSNXlXcm9pSEpoSUlTTmNjZUZCaVIrREcxNzlLMmEvcm55c3JtbnI5aUNUWTRSdFNRcVB3UjVhRlRvMVJsRnFmaWRtQ1ZQZGJ0S3hVMXVMdjFBWUVkQTByamlObmZnYVdZVzFONXFERnlWTGFGakRnZ1BYajFDbVJyWkgvekJxSFAzNE9hU3g5M0x5M1NVS1JqTmRlRGNiYUJqemNXSStpUjNSbnZkYk9TZVYwQm9oU0NYeGI3eVJYK21MeFdQTjVKaDlTaWFpSnBiZ1A4T0RFZVl6S1dDVXV6VDl5bVJyS212cW5tM3EzcTZBeCt1RnVWejdlbWtvRko1TmFoZlM0QzVYTFhJUStPQWJHaHBnY0lNYmd5UnVqdW1PdGpyRlorSFpOS296Nmxlb3BqUUhWNy9HM3RSQmg1bWJwTjZRc1VhRHlHdWhnc29qcUppY296UWRtLzlMSHl3cG1aMHp1T0c0L3ZZWStUMU1rRnhpVHp6ZVEwN1RabzZFaVN2Q0JRTTVpUVZOVlhJbVcxMVpUZDBvQzMvQ0NRK0c2WmFETzlwd0tGekhHNHNwVWFPTjZGd0hiWVcrdkZzNnB4V1FHaGVYeHM4REloWGlqa1dvcEdHTWgxbzBtM3BGVFV6aXorUUZvY0kvYU5JZ3dUQ1lUd2xxc3AvMDNmdTFENkZxSURkdzhQNEI5Q08wQkJ2NlJkUEVQbDBQa3Azc01URGg0U3lNSlNPcmpTWWhhS0F1T1RoaHY2bXNxMnZhaGdpbXlFcEpLSHpjNDJTdWprcEY0NjJwMGRNZG5jVmVuOThQRC9LRTI0eVN4SnJVbUhTRnB5U25BWTF2WEhsYzd3Nk52Uk1XRlJhN3g5dmdoYTJqOE9YemUvRjc0WGRGNFF4UFJxUGtCWFlBVDBaTElmUGlXWDUvSUJ5TlJtLzZXa25Kb1RtQmcvTzJKeDdYcWRydzcyTHVIOVozazBNSWNoOUl1aW1Gb3hzY3BNRXF6Q1FYNFpsa2R6cmdKRGU2dnE2cG1icFI2b1M1dnJuZ2Q2QlE2RWVoa0hvcExoSHVVZUZZYWlFbGFFRDgvRGpHK01rRHM0UVdxd2YvS2tSSmNpQ2FiUEM0NVNCbmN5MFJOSlkwT1EvODlJeEFvM0NPd0F2ZXNzL3I1M014Rmk5N04zSUtJWDQrcER5MElwN1hHaVgyOFpLcHVZSUx4WFFkYVcwTWdRUFZqY1QxS0RtTU1NdjZPWmNJQzBrUlhnZEVCREl5TWJ3bUkzS0tHMjNxN0E3ejgwTktlYmdNdzVETk5BZDhIcGRUVS9NRWpldUY1Z2dVbWRmSFd0elB6MzBpU1Qrb3grdWhoa0tVd0lObUMxNWVDWXlFaWVxYUFQSDVEQ3Q2cVJyUmFsNnlMaHFuM0c3NjBVZExTbks2aUFyZ2R1djZQbExEb1Y5V1RDUkdZbkVDempXK3VnWUZXTjRQSFU3TFY2YXdTdXhHdTRNc2FFcHhWUFROaEVOQlZCVTJlRmdTSWpKM3JrSk0wR3ZRZ1U4MHZnL0poZzF5S0lxNmlJL3pLdE1saU9vYVJGMkNxOStyTElIODVKc0lXKy9QcTZvK1VsS1MrUys4U2ZZSDlEdnJVQXlNa2JRU1FseGlSSThQWTlkZWk1dUtGRzVTZnduSlRTSmNacVppd1NLdnpNNllHeFZCa0o4NHNnc1hWU0VqcHdubmgveWhHNWRWdkFWOTdNWG44M25sZGxiYW15emtsU1p6TGZuOE5NREpNUXhzeTViV2pxNVFLTlM3UlZHbWRGSU1BTGJCK3FwcURHNVJMdUE4bm5vOXBvOGthRmFKZERlaXg0YnhJZGRLWjdrZ0kvVjI4VlJDMGwzR1FTNGRRMjcwbWFiTzdXRlpkUkpLMnNFekdFSTlwQUVFMGNVVEdtRnVpSUZlcVVVNUdDOXpwRjRmMXlTV0tJNVJmS1pmV285THFiR2xwYTJqTjlRM01CQ1ZySzlSQnVkbFRyWU5jZnRERmJLUDVGakllVHorT1BvRld2SWI2eWpHamUxbk1jNXRLdDlFeVIxSjBZUjlFdzVPR0xqUnZ6WnZ3OTB5VE8yRFFvOWg1dFlSeGlENDBoY0NVQnA2NUR3RzVPZHBJSkhJSjNQdythUWtVUUxEdkoxd2dUQVEyTkxhMWhNTVJSUllpdTBPc0szSjRYSUk1dFJWTVhEWi8rb3pCcmRKQjNDSUdqVndsUmdjSENUdnBzS3VFa3VLOVpod1RHRUZIQzRJQmxOVWNoTm12d1kzMnJ5MU81aG1QMm9RVllkRWpJK3Z3LzIrakFkcFZ0bmorYWxIVkVZRExWdmEyanQ2Z3dNRGcwbHB5VFlrVGdwYU8zaDlLRE5wUTlUQVZVSnlVakkzSjNBQlhZOFRZZ2tzdThTK21ENklQMSt3TGlnSEZCYmh3aUxTS1dtN3BMbnMwc29zYlhWbFRkMHp6WjNkOU00SzRTRlNYb01LN3RnUkRvV0NvWjZ1OXZhdXJxNzJMUzNZQWkwdGFLZ1ZUMjF2NzRBbEJzSURRMm1od2hZT2QzZnYySTJHZ2dwM1REQUVrMnVJNERDNGt0S3N1Ymt4T0ozK3lEcVIzRnU2SGlhZXBZMERrL3ExaE9ESXFSM21DM0hMS3poaEtCdEZDUHVVTWw2eGlESWpmUjdqcUN2YzE5bloxTFN4am9pcHFxWVBUUTM0alFaQWU2amdzS3NzbVpyMWxSMm9CdnpjVlNad25FdnMxZlVlQXE1WnVFQng3RGlmNUVrbVRUSERnOEtyRmd5Y3NOVzRva0Q1cUZvS3lyNEN4bmJuaEtzdjNObTl0Zm1wdWhwQ0FqOVZvMGQxVlUwa0trdU94cmd0TUxHK1NsWmN5VUhabGdSUWV2cjBlSHdFWlpPNGlJTW5HSDhCdTBxbmgzaEdjdkJoZXV6aE1PMGV4ZzNBVWdFbDJTdzRPTW5XUUVKYTE0eHJDdE5scGl6QURZV0QzWjFOejI2c1l3Q3FxcXVycXhnM3pxOE9MZHRvRUZ3N1RLdG1DMzJFM3VtVlpVMkFPZzJHNC9IOVk3aXpDenZNZDNROVZrK3pzSkFJWkpsSUx4L0pTUmIyYTRpR2YyMXU2dXp1RHBMZFRpOTJRYkFNZG5kdmEyNzZ5OGFhS2l1clZoUkhucnBoeFM0RHVKNW9OTVJYK2lpN3VYSk9OaDBvdUVNdUd0ZmZSbGQwVUl3RHliMGRpdzI3TUxaMXpnQmh4WHQ5RGZBaTVwTVlCLzVDRTByTGZsTlpXZDNjM0x3Vk9NS2pHeVFKMXRkSlJqcWJrZjIxRGxCVlc4SVNlcFA0U1NTUjVNSit0Ym9QMFp4U0JWZHkwS0xhVExtUjMxcVA2UEY5WXdsQ0xqR2EyS1BId3F6dWNmV1JleWpEQ2pSRHpJK1EyeXdIbWZZR093dk5KRzJyRkhxUkJTVEVROUZVcTU1UTRhWElycnFhRFVHVWUxTUpjbjUvT0JwOWxpOHV3SldVSEpKcGRrbjZWM3NnT3hrbFBTZWpvNG1SZUZ4djRSWHJKdDREcVdabXhreHRrTVZCTlBoc29YbWtiWlVLcW1TaU11akplcjVocExvdGFzb3JvVngvaWk4Z2d5c3BPYlEwRTlYUjN4SGVRbS9OR3h0RlllNnR1QjV6ZzZ0MDRUOW5qem1uNW4wV3ZIS1RYQ2x5bHpXRjVwRzIvVG9GQW10V3htbUtwMlNJMGVCR0FOZXVnb09RdXBFdi9wRVMxYVovTWUxWVJ4eWx4OU13SEl1L1JZcUIwYkVSUGE2SE1ESVU1MXhPZDFCS0dkWGJZdVhZaHk4ZTBKS3U3d0ROVFN4c2pXVmlVVzN3bjlWOGpxVlo2N1Vhd1BXWXdEM082WDYweEdRbnBkY0Z4cmg1UEdFZDkxYmlwSEtmUGh6M3cxd24wMXh0ajBnOXBLd2tIREZtS254a2E2RnhwRzlya29DUS9LT0liWUtuaFhPVVFpQmRCSUpjeUZSLzEvSGxqSXJETnZ1YzhXVW4vWFozUUkvcGUwbVFHOUZqY1o2YVVORUZRcGxWNGI4cE5JNzBiWTJrTExOcXBGa3A1SlpNc1VHVVZob1Z4K3Z2S2d2RlladGJtdnAyUzQ5c1EvSGgyRjdNRFgzU3lpdHp3NitlUUd0UFVIQktmVjExVzZGcFpHQ3JqZm95WkkxeWRpa0daWXJKWTE2bkNSd2tKejYreldUZ1NrcW16VjJTTkZPcFZiaDVBc1Bvc3dQNzk2RlB5T2tkTkw0eGJsaDI2TW5qYjI3ZndhK2Ewa3R3MGpWT0lyMitBNm5iWkR4YmJmUnpDaVZscHRFOVdrM21yTkc2VzlrVkFtNFJsRldPcHpoc1UrZGVZT1V6RGRnODZNTTZzUmhvRGYwUFhTdWs2dVJQMHNyZVFGdFBrTitqWi9yZ3puc25wVVJHMjluZ0w0MWNrdmpNcE02MUdxRnJpa1lqS2pnb3dMZnlwVktDUTNiWW9pVkt1NXVwZ2RWREVSNEhmeG1QNy80UWFIWDIvSytjZnkxbTVoVGtPRUE4VUwrcHBXUEh3Q0N2dlhHTmpvZjZ1cHZxYWlvTFRTUk5xMDRKd3BSWnNtbXFSSzNCUHh1TjdsYkI5VWFqdlh6SmNjRWh3MTlkVTJ2TmpKSUw2ZGhQM3ZSaHNkYU1PUXZPWDJJWktUbERqeS9RMXRzbmtrb3A3UVIrZjFsL3dQT1RrRlFyLzlWR21Wa2xNY1pDZ05VTmVQcFRKbGZaQlNqNXNtbUJRM2I0eWVjdXV6TTVPVThnK09iUVR6OXVzZUxza3hhZGYrM3RqSlpUNVlkSDNRMkIxbzRkMWxjdGQzUTNienlBK1pseG1BYXFpYUpTZFZrYWM5TWs0RnFndEh1Y0xaQTJPRUp2enFublhyaXMzZ3Jjc25NLy9ZRVVhMDZmdmVBclM2NU5sdXdRK1cxcWJ0dk9MenVIeFUyMFdIL05mMTFmZWVCVjVnWUptWUJZakZqWEQ5VkdLVlk5WThvcUc2T3N6eXRqY05TbUhuWHlxV2RlZE5GRlM1WXRXM2JoaFJlZWUrcW5qMG9GVGJKRDU4NC8vOXFVaFVadFBTUXZJVG55RGJJTUpuekE4VnVka3BHeC9EWkJOYVV1OGtBekpDZmtpbHdqR0g1Rk5UblRaRmJnY3JXRFpuOEIzS2NiMzVaUEh2aGpFQzc4NnNJVEdqYTF0QVVIa25TMUFMK25EZ2grcXcyZ1V2aERRMGxuNG16cWF0bUdlMDRhR1RZWVFCZmtvbitnQzFqMm5PVEpEcGt6L3h4d24yNlpvTnNsUnR3dWp6L1EzcU4rWkZXNnFTamMzVlJnZnF0RlA1YXNubXFKa2dyTFdJMVhzOFZGV3NMbWRrTU9TWkFoZVBnMUVCVlg1QXFpT05VT216dS85TG83WEl3VzBoOG5SMTdxSVhrSlJuamF5ZEJSUHdyNVo2SDg1eG9qR2N2eUxidTZIUHhpTytGRndEV1NTaTY2bml4MEFJQWpObTMyRjg0NS96b21OK0k3M1c1SmdLNEdYMHQ3TDc4TmsydVAzZjVYQ1AydGtSbytSVVdYYXRTNEFUWmVBNHhhbU9BSU5uOGp1bDFvQU4vL1VKMW1VcEUzZytMdmdpVy9JQUVQQnowS2tzblF0UUdTbDQ3Z29Dby82Wk1JZmR2enlNOXdQUzRKUG5OdkpSczBDRlFlaGFSeWQyTWpDWERrQlEzMUluTDFWVlhyVHk0MHFDUTJDNHEvNis1d3M2QW5RaDgxVnoxRVAvekJWSjZ5eU5WN2VEQzhQUi8rczlJb2x0eDd1dGpnZHBSVU1tcCtEakJFNzBDNnFkQ0VVdHIwV1NSN2NibGtaakpDMUhNV0ZCOEVaeGRzaFJSQmYzWHZIajg1d3pDd1M1N3NKNkduR3ZLVVBZMkNHbjlsNUQ0OGZ2TVYzR2I4Ny96emwvelNyWmdjQXQwYmNNYzE3MjhSdDByVEVCZ0piOS82ekx2QWI3V3hBa2lqSXlYTkhwV3R3R2FMWDBCakNQMk43ZWhtMmVqQWh3cE5KWDFEeGQ5MWJwNXVHczNsYnZBSE9ucjZlTjFBMDdvb0VRQUFBOFJKUkVGVW5TYnZCNFVSekcvaXJodXBGOENOOTJsWmljM1VVV2xaTklEZ2RxTitFOFpLR0VhNXBiV3I2OTVDMDhqWWNQRjNuU0k3ZzNrRFVMdXJuK0NTN3Y5RC85MWJuNTBRZnIreFZvdWdLS0JRVENaOVZWZkpycGJYQ3VqREEyMkNtOEJIS3ZIR3hvc0x6U0ZibXpGMy92ay8vcVdiZGJxWS9XZXREOXpuRHJWMnB4VThZN2c5UjM1cXYwbVZyQ0FMUEVtRVo2b1ZBRzROWkNib1loemxKRVU0THJ5UEZScEFiallOWFhyNHNkdGwxaDZiQU82enJUYzBHR0YzL3B1ejBPejVyVEUzZmVhWDNjeGc2N2JpS05ZcUtDbmtzUHErVk9pV254ZzdiTTU4VnZ3bE1lRFgyaUg4Sjc1cUcrR0ZJTHI3SmJ4OVcxTmRYV1VtZHlwVmpwTWJWbGNwTHROQ1h2SnlWWTl2Yk43V3pUOUlFbXhNWWU4VGJzeG16d1g1M1pHTUhmYWZLUDcxaXZLUGZBa1ZjNkcwZ3UvdWhCS2ladndjZEUxeUlBWnhXZmMrOHo2U2pVMWJ1NE9HRDl1Rmt6SGIxTmg0NzNHRmJ1bDN4YWJOUnNWZlV2bmhtdEM3Q2ZMUFlNUjQxVTg4WTE4YTdON2FuRUtFbFFZQVNkbndDOXRxcmxsVDkyeHo5NDZ3NVNkOGVwT3I3VjcwUFY3dlk1c3haMzZwc2Znem1SY2lJTXBBa3hZUXBDZ01iN2NRNFJvRElha0xLL1VIUGVxZWFtN3I3ck1HRm8zdUhncjF0Z2VTWXp2dC9ZMk5HMlF2cGRlTmc4L3Q5bmdEcmUyOXdRSDZOUXpTaDR2b3pXanNRMzVVaEtEQzFWWlNzK3E3SWhOcjZrQmZXN3UzSitNRkpYVW8yTlBla2lxeU5kNTczbkdGYnM4ODJ5RnpGdkRpTDdVRXZZRkFlMGVROUtKRkZPVXBWNVRRNTcvRFlRaUhuYzNOejJ6Y1dMZXhybTY5aks1bTQwWTA5ZG1tcG0wQXF5L1ZSMWNId3FHdTl0YVV3TEN0T3UvNFFqZGp3UXlLdnd0K1BKNzdGQWkzNEsrM0dHUTNVU2hmK0pmYng3OHBzSjZPMWkzakU4UFFQdjBlNnVKNnQyemE3QzhzdXVESDZlRkQ1c01xSkFnanBDRE01UXNYQmdkQ3ZWMnR5YU9Za2RuRnB4MDNTY0phbW9iN3p0S1VIMU9oTDRBdUJnYkRHWHh4Q2JYZGtZRlFxS2VuTlhVUVUrMWVZUFpldUFoUUdKdWRnZnRrdGdGMTlMYTJkM1gxaGtLaG9hSElrQm5rME1EQVVBVEQ2dXBxVFNPQ0dYVjJhWkZaV29hS3Y5SjAzV2REOGdadlNUTm9KYmQ3cnpqdjVQZDRSMlFCN0RCMDQ4UTQvRFo0YzBTVEZObXFTeFllWDVSWkxuWVl1TTlrNFMrRjNMSzJWVmVjdC9CanhiUnh3Z3lGdnlYWGJuZ1g1YmJxaWtzV0huZDRvWS96L1dvSHpaNUxIZWhFWVFzQXNOTk9QcnFvc2Z6WXRLT09YN2p3MGt1dnVIRlZWclJ1dlBHS1M4NWJlTnJ4UnhlcnNnTGE0VWNmdC9DMDh5NjU1TktMVjkxNDQ2cFZOOTVyb0lTbXd1UFNpeSsrK0x5RkM0LzdXTkVkSHRqMndUd204djhQa20rckZzS1NuQ1lBQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSI0OSIgaWQ9InBhcmFsbGF4X29jdG9jYXRzaGFkb3ciIHdpZHRoPSIxNjYiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUtZQUFBQXhDQVlBQUFCUTY5S01BQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBSFhSSlJFRlVlTnFFWFcvRWJsZDJYMnUvcnhCQ0NDRWs3a2pkdW5WSjNYSEhNQlZDS29SVXhqQzBPcWFVb2ZwaFZOTXZqYUUxTmJTRzlrdERDYUg2SVJLbFk5SVpNem9hdlZxOXhGeXVpVVl1SVNibWFvaUdFQzdoMmF2cm5MMzNXcisxOWo1dmJqeDV6L09jYy9iWlorKzExNS9mK3JQNWg2LzhLUlVTb3Yyai8yY21rVUlzUXN4VmYyWDl6OC9wLy9aanBxci9GZjF2dTZiWU5WczcyL2Z0NjNiOWRuNzhmdnhQcjRmMjJ0VU1iYlluQ3Y1Zis1SDdWN1hmaGF2ZHNiOEh6KzF0L2RQWGcyczU5RS83OGJqMjR5SG96d1A2dVdMdFRuMXJ6eHBOY1c4RjI5N0hwTjN6a2Q3N3dSalBiWnkxdlZ0OHdmajRlN1J4RW1KcnVaM244Sjc3SExIc2ZhejdQZHM4bkdqZC83TDNqdE1jNWZGcXYwai9mK2wzbnZiMjkrdTJCcXIzbzlKWmVDYis4M1BGeGluVDJUa1NwUTBDaVQwQUwyYkJBYWRPMFAxMkZuaEFoUW55aVdGY0FQdGdTeWZHVXlDcWNSd0hVR3dpOXVQK1BLU3BRSlRjKzBGMFRTKzZUOXU1MWs5ZDFkL3YxOU1QYXg4dTlRbDhSSzk1ZFBSenZGZUJkNlcwUkdMZllFSmdNZGpRd0tRakFXNUV1V2p2TTIzajdmNHU5N1NQNzJ4OTFIN2QwWFkrMWQvdTZuVWY2dC8zOWZQeGVQYTR2eEdKejBWZTZJUEkyM3pVTnA4N3c1SERkMnlMV1B5ZXJXOWp6TWNZZFJvWVJMZS9HOGNXZlF5cTB3bWN0Ym5YcytkRXJiSDJVclc5bUZCcWRMeHJlN0h4NHJTdjFOaUI4RUw3WCs3RFVvRzRxUk9XMktwcUU5R3VMWDNnQ05vYUszUGlvcFd2YWJ1WGRZQTJqblpKZjd1c253ZFo2bFg5Zm4vbUxzaWxrWUJzcExkK0NSS0tEdE5HdkFjVDE4YkE3eStoemNGZGF1ajNpcHZBK2Z1MGpldjJPOWNuVVJMeHhOSGtqcmIzcVI3ZjFxNThvdjI4b3ovZTFvLys1VTlvakoxMFJycU5iU2ZPSVJIYXU1WEFkSERoc2ZXeDJvSnEwck96Qys2MDBOc1M1aFhmUDNqZlFiQmovTnJ4K1dESkJBL2Z4Ym10S0dnV3VBRnlPT25rNTlkdTk1NXMrZ2EzYk53WVdYZ1RxVTRnUGtBTTUvWExBNTN3dGdtNzNNWHFaVDExZGJ4SUhBRHhRVGNGSUl2Zmcwa1FpU0t4Q1B4V1lMV0xjY3BHYUZuOGNUcy8xSXh0OFhkT2cyME1GU0F1RXBRMG9ENXhYUkh5bFQ1LzE4ZFAvdTcxbzQxQTlWaTVMcjNkaUpYZTArbDlmNGhqSnd6dlUxYUpkc25XSlp4SkNLazJya1ZBZlBNSk9SbjBCK2NKVlNkSmROTytuODlDYXJCWWdjRnRFeXpzZWhIRGd3ZGhqNGtiMzIyRjJjbzdXVmVOYTNBUTBQZnJQVi9leEswZVg5UGpLM3I2aWg0L3doUUhQYWdaL2JtMTY3WmIzMG9pZk83M2NoS3AyRjdrcDlYR2IzQUhUbUp4ZlBmM2RYSEhTVVhhM2wzcWdnakx6STJqeEdtaWVmU0JnbUtEMTFXekQ0RFJQTncvVDBaOVZUN1RlOTdXRnQ3Wk9PNm1KdWd6YnFxT2VIZHJ0cGcrSy9acERJQVRJVkd3SVV6bjdHTSsrbCtNNkpGSVY1elo3Wlh6cUdRM3BUbm9LNW45Q2lXaTRERFpxR3lqaWlCR05HRXlMK3NUdjZKL3Y2d0Q5cVErKzVxTHg1b20yWFVtVnhFcWlOOUJURGg0dGROOVZ4Rm9WaEdPREswcVRVUzVxR1BqNWlVWUlETHh1YVVCMDNWZTE1VFhLa0lrSU5CTlJTWVZZVEFRQnIzOXlPQUExYUNwQ3lUWHV3VHk5bG51YW1zMzliRnY2WHZlMVBsN1M5ditqS3lmTWkwY05MU2tjOXJLcFM4YmxJRElFR1F5VG9QT0tNQXhaWWlseE1aZG9RYzJUclhUOTFDdTJZd1lYQTF1dFpsQmRFa0g5Rms5ZmtaUFA5VldzeVJyMXBWM1JzNktrejRXa0pSbStVc1d5MlRpUEM0d0RoTTU4QURUczZWenArMWRWQ1M1dU91TGR1ZHVUV1NaQVNhekpqV3JOVFVZT24zSldMOTlvbDE5R2h5SGtvNHROczZuUk1BMUVPV1JKQWdMUlNaeCtxZys0K3Y2OSt2TzJlb04vZk9tMHNBTnBZc2JVUUx1bkFiRXY0dDg3M3ZpakRJbVdwYnF5K2pUZWVZWXd3Z3g4UUFLNlhpRlFid0ZwZ0dObTQzYjdGYWM4UDM2OUdmMWwyZTF2WTBZSDBjOXc1OVJUQk1Nbkt5LzdEVFFYYW8xRWMxR0RoVzR5TkNOQmlHMVNSTVlxQUVaRFU1OE1vcGlVRVZzZ0x2UlFHaXh5N3pxTXhkR0x1bXdpNHRBdkg4c2VKNHNlRFp1UHhsTlhDZWRsRzNSTkNob3lkbEZBcGQzaHNSSlJPOE01S21Pa214R2xoS24vRXgvKzRGTytBZlVSZnhZOGdXTUt6R3BCdStVRmh3bHpJWEhtUHpySzMreWQycUlMVnhKamxOeTRwVEZST1BpMzRQNlVXTGszOVZybm0xNjQ0RzRDdmpuNkJ4YS9BaHI5SUUzTEZXZ1Q3UTBIUEE1SkZHM0MvQVVjT1c5ZmNQanVDK3l1dEFCNHhKemlLdE1YSG1Gc1Y2TVY5TG5Zb0daSTA4R0UwZmkyL3UxVUIyaVlSTFJ6QmtXaTFxNHFpSzNsUG04b1hUd2VrY0JKZ09uMFpNYndmNCtiS3BqWGppTlVYUXVXUkFLb0dJY3gxNFNNU2V1SmxZNnBkK25MV3dpNEVmNitULzl2S2JOZjIyRGF6Z0pOd0h3WVhDM2FwTlpBeFkzcnEyN3lDWXdBQ1N0T0o2bXE0bGJKNklzTmh5ZWlxZ0VpUlBsZ0s0eWlENzBKRlFUU29kZlJodnRXaHVmZ05HS0xXNlhIRUlPNGZqa25NSzdiZThraTNmRk1SMVFEU0lKTnRZU05lSG1BS0VnRGJ1MUI2cUZKRWVJWXhyNmpPdEtOOS9WbzNmMXZkN1ZHLzlDZjM0a001RnFSdEFwTUxaQlI3ekEwY3Y4b2h3VUprNFF5c1pCZHF1OE5YaFZ6Lyt0SHYxS2lmaWY5Y3JudElObmJUVVVJQTZmUm9SdlVMeGxDTDBORG9EMUltQ0UwTVFwODZTeGlhV0l6NDFuN2xJQytrRUpxNlBrNVhEQ09adTlQZUJ3YVAwZCtwUHJrTnQ5dTZyQlpLSjhxQVp1NGZPRU9HQ2ZkK0I2WVpBeTl0aUE3UUlTS0hNbE5LaWtqNFZyNEZHMVFJWlNrNDNDNElYYklienY2anY5cjU3NWtmYjNlVzMvakFHcmRwWXlveEI1SGtybVprSUlpNVRKRXVzNm40cHEray85OVgvMDJ3dDZ4OFBqSlp1SG9CSEcxcUhva2NBbitjdjdaSkJOL0pqWWVkVktHT0JoaU93dkw1endYSm00cWtGYUUrR1VsWVVBZXB1akNTNVI2bVQ0QkJDY3grS1M3ZzBaK0o1TSttR0ZzVjRCMHlpdW14SjExdCtKRTljY0FMZ0VhQnk1Wi9LaGRjbFlnbXdiaXc3UmgvSGV0UzlTSmdGZHYwdVpzdi95bkg3L29SNzhTajkvM3RVN3dHUTVvUlZPZVVObkxkRXQ1UDVRRjNGdDBIcW52cWJIUDlmam4yellXTlBkc3A0bnk1Y2IvbmRKQk9DY2s0TlAxMFFTMWJDV01xRU5RaEZ5ZlFXSkRQdld4R2l5QWhQV2xya3VUKzREV0xqTWFmSTRFcDVJSVA3Mkd4OW9pcklVMWNpaEtTeWowOFFOd3dJV3dKK2gzd1BPaStPTGNCOVAzajBqUmx1Y0N3L1lXRVExNlBjcTF1V3Y5Vm0vMU9QdjZlZWhScmhBSDRLU1IweE5LcEpXVTJTaTNKd2ZWSi9TU2ZxRi92QXZPaURYMGRlWkRRb1RLdjNseG9BTktDcU1uUlRVanBLb2tBalZMQ1pURUJGQVg3RE00bUpYOHJrbUpadDJ6dEltaVEzdGRJSndXSC9sWmhzTHpSZmJ5aVhIMFgwTGhDb1RzSFFDN0ErZEZ5VXMzb3YvUmE5ZHZzZFVEVWxjRnFRV3d6ZzU3bHducjltOGFLTEh4eGVqUEtqSDM5RTJmNm5IMzlFcjdnc0wzNHpHamhKdmhxSUVuVTFzY0FmRjYvRS82ZC8vMEZOUDRFQXpHQmhvVU5pQWN5T28zUnZCYkNLREdOcVkzSWtVakJhaWk5eDFLU0FDM0dlVGlBWGdPZDdUSjBqNjhoRTJ2ekhDVG5zYmxaZEdDK0sxSmhvbENNWDJUb3QzalJZdUVtb0ZSa0VBK1pBYkZZaXhqak5TbGo1cHpvaUNTSUNKb2dSeGwzU2MzMW5kQ1I0dktSY3VscTYvUHFEdGZrOWIvb1VlUHkxSnZSb0xZRGZHU3dleGF4OGMrTGZCUGUvcVRkL00rRnp1R0JJVXVwZDRRQmFTRlcraGdZSm00bmJDaUJ3MERvcGNzRkpsTm1qTTJpMEw3aDZORnVwZ3RYUmRhRmpSUEhTZnJNUUxIUmd0RXRRTjdpTFM5Tk91YzV0eFZoUEt3QUpQS1JPVVJsVERtS0FxRXoxTVVSa3FhUTU1SVlWRU9BVFlCRGR0Sm5zSTk0dkJpVjJDMllJVHBLRXJldnp2K3RtWTN2MFVFSjd1VmgzY3hGMXZkS1l2dkZuYXIyMUtxK0RERjlZd0FzQlpEK1J1ZVhMUWc2SnhzZXVJM1lJWEMrSHFBOFJzdjgrRFV2cEU4MlFocjFad3NVQ0ZEcCt3VFA0YUJNUUhzRis0Z2daWnpjK1BRUnpSdU1DRktvRUxEaVBCaUZQRXhzaDFWdTZPTFFGLzlDa1lIMGdvd2JnVW4xZ0dDR2kyQVNDVWNBb1ZGQXQrR2YxcWM3QkdVZmY1WWo1OHh2Q21ZVWdrUUlqZjFOLytXNDhlUnpSa041eHhZQnYxMHI5cHgxN3dsVjJKK1poRkl4ZU1rek5IeEdUUGljRVNZTUVQZzJyWHlZU0RjaDV4UUEvT0NNSEM0L2tzVXg4SHNhVFZDOXdJcFlaQWdHL2tRdWExWVVyaFl0Rm5mWVFEY3VKMlBKQ01qbXk0M2RHNXRrbWpPb0V0UVRYaEdnS29hWEcxdjNPWmRWM2hwVmNwRVAwQ3ZXQ2hTWitQcWdNQkU0bVN1Y1hKOHM4M1l4cXg4UUlpWWxPRVh0dGsvK1FQaFZXK0RNdGFLTkZFQ3d1WjZ4enltemlkcldJR2tJb0JsQy9pTHJka3lTSFJzT0Z6RURDd0lQSUJKcmRyYURLY2dvdlRydVBKNmw2cERvTWIranZXSlpGNERPclF5WWZmMklGMk44YkVQSFJIdk1JNWVwYlhrb0p4T0NFeGNzaCsydHlKaFNOR3cwb09SVDVpbzQzREMzanUrdXl4UExRNVovVDRpVEZIWmF4SS9mSHY5YkxuK2NDcndsUVBRQnNCT0tsTUNySkhITkVVc0NDVFNCMUdVMG5HR0UycnVoa3RaY2s1M0pNaWh2VTFZRHQ2b1hZeHpUWEVSTmJnYVNtZ2owWVlTWUtUZ0JlK2JiZHFrWU9oZmo1RXAwTnFqUmdOK0o2OFArQmdFRm5BYlk0TEI4ZUF5SXlMZGtKRG8yc2dETFBUcFNZbTRvdGZtQTd1b2FCYkJqeFVWbEtYSDlSelAya1FFelVjVXovUDZSUCtlT1ZuSmdoMEZTcVREakh5ZW9iK1ZRaDBydUZlV29TSnhaVUt4Ris1cDF5Y0FWSDAvQldKb1dQTXg2a1BBNnB5TmFNdXBOWGN6dkRJQ0VST0ZRZzh5Smp2YWxGUThqMnZJSzloSGFOSHJIQkVBbnpjeE5KUFVBSjRueTUyUXF3SkJyMTdZdnAra0F5OEZ1M29LZzdwSVp4dzRKd0hab0U1ZFVKR3V2UjlWRC9mTjZWSFQzNS90bmpqaW13Nms0dGY0eklRcDRjdXlNQlpoaCtPVUdjU0VEbVFWOVFuQjFNdUJuUlJ1SVpCbU1RaWNEYWM5SFZVVFlaV1N2Q0VUTzY3QUI5RlhRdDFOZ2JERFkyZjRIT25NaTNRaTRJMENDSjNNRVNSODZJTDNKNFhpNmFBYTdtRTlCRktJTHhRREV5T1RvdVlSc0lINFhWMXdtT1J1TXUwY1BwWS9MN080MVhWMk1xVDJ3R0twekhCV2RRVWlCVWMxbGlNcHU2K1pDYWJuTEVpbklBbDVJNkVTYWdkR3NrcmRRRmRETmJuOEVaTUNFTzFvWUtvcVFDR1MxYzlnaCtZS1dXNmxCRDBJQkJ3RXFMSUplS3JBOHZNcVJZWEdaRVZVWWJSdG94WXpBT0RKeGhvaDdhenFVY3QyYXNhcG13NVNVQXdqa0pJUURXeUt4TTlWWU43ZW44YXZTeEJlSFRDVElBVm4rbDB2ckNKOHFkWFdYYVNwQUFucmpqRVUrQjZUSlloeHdzOUNPK3Zwb1ZoM2t0dlIyZ0t0MFZJQTFNSlBEeU9BbWZ4MUdHRzNKK3NtTmQrTG9iSG9ZK2Nla3pxeXYzYUhBZ1lyZVRJeEQ1cHdpWnlPYmdQSTllUXZwQ0hZV2NLVlJ0RWlqSDVDNnM0aEwzTlZvQjUzcExVQVJIcWdTMHNocUc2Sk9Dc0FCaXp3RWcwUkIzY0dEMGRMRWhlcW1LdFgvVFUxdEtqQ0l3TzYwK296UHBJV3BVbGVvbjY2ajREaHNZZ3Rrb1l4SUh3eDJpV05VQWRYWHVZb1RpLzg3REdNVHJibFhhMGtOMlRVMm4yRzgvSWhFd2lpMU44SThJNkl5OS93ejFrNGFVSnJ0UVJyWldNbFBZN1QvN3NISnpoekVJbVJ3Y3RKRjVXS1JBWlFJZUk0N3B1ZTdRRlZ3SU43TThVWGlJVVk0Rm1hSW9odW1weXNyQmMyczdjYzVZNi9MWFZRTjA1VnE1T0NyR3N1RnZ0VnFaZFh4ZURFWFV5ZzBrQW9FYVlKSHNZT0JDTDY2Nm1pekdIRUxoY2hJQlRUR1ZXOG1uU3EwcFNYV1Rwb25Oc3NpMFF4R2lERmM2Y2dpQm0zVEpQZGt4eW04UEhQREdRSnlTRUpuRU1EQ1lrOW9uNXJFT29Zc2RuQnh3bU5pcW5FRXVheHlUZ29VekJlSzIweWxPU2UxdExkN0lvREg1WUJFTlpEdnlnTWhGZDAwRnBBWlBVb0VzWnB6US90UVJ2aFVmUnRHK3I1SzNoZVhBaUxTbW5CYWFocFh3QUI1OXoxVjEzcW9rYjFnVnhISnN0d2N1VEMwdDAxUUQxK0dpZzBOS3pGU2UvVEFzaTYrRFp5a1pHZ0ZGZ3FJZWlSUE81bFJDbVZ6Q29PenNlRW9RMWhlUUZGMm1PK2R6UHZiMjVKTi9RenlrbXQ4TUUxNWtiMm91a1VQb1FnVDZ0Uk5Ea1dBNzBUZFRsWkdFZzFQQnNFeWtTTGRBUk1MdGFaRjVsUkE2TUVJKzBsamtNZDlidUpHTzNuQUxEWk9tRkdmNnJhYUZCcXNISWFYSzBJaytrV0tUOHlndEV5VUFKK2ZFaUlmR05sOGxodERTeThsZ01ITnRENldUMk5NRWlZNkhsSW9QRis0UE5KWGxYcjN6Vk5id09KWERQQWw2QXd6a2tYa0p1SkMvMURQZkVzTG5kREJMcWY5dDFFZlFPRTh3Y244MjBkdkVsSDNXZW1CeVVhOG8vV084ZWg4bG1xWEtvOHROVWxaR1VoekdGQWI3SmdiR21ja1J1dlBMNVoxR09vSGtzNVZPWDZrQU1wY3NxQjAvb2gwaVprWUs5cnlYRUlPUUkxYUgrRGFjSDZybGlLRUQxOGV0cE00VXFSRkNZZExtcm4zOG9IWXA0VWJ2MWlRV2hjZzBCbkVleEtBTjBqMGFEeHpmbWdTaGMzWjJYQ0I0ajJkMXJRd0dmTkhFbTRIT1dOVlN5QXNESFJFd0JJVXlnVjFNZ01GTVJoR0lGRHNJUVBqbTJNQk4zWmx5SVVtQml4WFRFSSt3MUJ6ckVzUkNRSmlWeDdiVWJOQ2FycGNKY1JsU25HTUZhWktuS1lGa3V0OWFsRzMrelk0SXhka0dDZC9FdjllaGVhWjRPM3FqMDk3U1ZVeURHWHZTcUJwZVlFK3hZS1NzOVloWjk0bVZTd0NzMElvaFFSQ0RjNEFPVzZ4d05tQ2JwVVFFdmpGWXJvZ1p6d08vczk4WGdWV0lKRVRzSWkrQXpzOVZxWVdzeUE4cWxRemg0UGNKMkdOMnpjdUxsc1hCcFVxa1oxOFVqMWkvd2hSOUJUZHlEcUJtOGVSVEU4TUU5NHBtdEF6cGNNYlFKZEdkK1hiKzkwaUxZTzNhbEYvOVViL2xXY1BqM3FPc2Nzem5udXBTbEFuK1JSd05EOXpPWHlHQjRuaGpVcTNMTTVzcHF4WFNObGRYcVB2Mmtrd3BhclpPQzdnbHQ0b0JTNDVJMGNhYTE0Wmlpckxyb3g1eWk0T1NRRkEzS3ZERFlvaFRJa05GY1gya1ZrRmlnN3pFcWpKZEZDMm5DVEVNL0pZWUZvb1FBeDhWUGRaeit3Q3J1alVpZVBtSC9xRTE5VmY5K0duT1RlZUhTdXdqZ1BacUVFNlNUWnRGQ0VFZklNRHdlZW85cHJyUUlXaTFKSDh2NkdocHlrb3lpb1F0aDFtQko1UVRYNytlRTZQQlZqVkZJaDhaVzlxSFBzWTNaU1BHK1k5YW9XRFpweEVoZEpZb2l0QUNhd2xOWW54ekdiSHFrZllseGxSTks0dVpkQ1hDUnF4dUVNWnN2NjExS2QrV3pZVVM3NjZGUHV0NzJobjc1b242NzR3K1dvQU11Z3dGQy9VT1ovS1VDbFRjcUZHd0s0REhYVUozRGM1TTc4VXNTSzZrM1BtbGQ3MDFjQ2d1MW9ndldqS0tlckZZV2FicXJYSEswSFpEQXhsVzVYdWRNbEY1T1JWS09lM1poVnN4UURNYU9lUDlxQXJMRjFaVG90NVlKYlZnRklzOVNxcHF3ODRVdlNWMGJlVjExR2RtVURPZU5FUDlvKyt3MWt0QmpOUFNCV0FTRzN0T0x2NlMzdjBUSjlJK0ZCR1RoKzNRT0pMM3kxNHdYUWpHRHJtTmxRd1g5NlR5NXNPVEFrdlQ0MFYzdEVPZkV3ZklGeDVLSDMwWGNycUFGeW5XcFRvUVVaSmJrYXo0T3B2V3lNMEpFY3dYUEtaNFNLamVYN001RXp4a3VQT1IwUFp3dVJNaUh5blYxQ2ZPRWNMcFIra1djSStmd1A1UnlHVnhmTE03YjJ0NXY2YTh2MTBYWVhNSHFiZ1VTa2JUcHJVN050emZ1cWQ5dm9kVVlTYTFNOVgxR09MMTNQb0xESlZRbFBwbVN2WFJCR3RqTWsvaEZ2QzRiTHpGQ2ZvWk5SckRzV3I5bElvUTR1blhxaXpKWHpTaEx3NjFDcUZlTWJjVndQQXJ1em1FVW9MSGkrZXErUUtaQ1kwdHhtcnhabFNGU1BwWmx6RlkvTFdKTVRTWHBYaTB2V3NZSGttc0Yrdk1uZWs3cGlyK283ZDFhNi9CbTFBS1lYRG5VQ3RLL3QvWDdsN1ROYitueCt3THBvYUVLY2NpQmNVQTJleE1RM2tCclBJckRYZ1p3Q2J0d0NNbnlHTVcxcVZVUE1nZkRYOGxHVUZtNktFc290bFdXVlRNUVpMYUEzWklKTVZ1MWZLSGxqRjZ0WWtoR09Zd3BDQjR3ekNFZnFTakIxWmc1ZVZtWU5yd0tUNE40MFFvdXpFSUhOYVh1NlQwcWdlazM5TnhMV1FVUWtCUzlkSTJBL2lhQUw2Ykt1S0ptUE11djZ6WGYwTS9iRnZMR3ZQUnlJTHV2SWRLY0puMXFQdytGNVVVOEdXemxKMFk0QldNQ1Y1bWNobkpJV2FhWURnaHJDcTVnQmk3TzRLVTZDd012SEhWcjlLNll3MERtd050UnlHcE85cWNMQzFtTjlPb1NVaHhtdzJ5a2ZYRHdaSlZrekNSSk1USkVWeUZxVkpZNlBYcjVTaysycXpFQWFLc2IvM2Q2L0FYYUpiQjh1RUpnUXZTVmlGYzN5QkFRQjkrcHBUaWNkTEJmMWNaK1U4OTlWZi8rZUg2TDJadFFGcGw0cHUrTVFnUUlzYkRRc3A1UlRpUGdkYUtWNzY0QVFzYnl6VG1sN3A1QXh3V1BTdTlDdFRxZ0o3aCtSaWxXTlpBeTF3aDRwY1hMeVRJZFpXMWcxb1ZYS0cyNmNJampTbEFGZUJVdE5SWGxMWWVlc3BuVCtyUDZtTHl2N2J5b3YzOUJmL3N6bmZDUDF1OVhRckV5WTFvclIvdDRaWGNOOGlyNjZBMXQ2SGYwODFoRDYrbXVUQllqUVRCcUxLczNlek1xQW5CelFEQ1VkMkdvRUxlSzJjUWtxMXh6VXJvMTdjU0FwZjlRSjBaSFpZVzZQMld4SU5aUlF2bTNraXJtb1RQaUtHNTFSYVN4ZWtxTktRMVFvakhqdUJHeU85SjdFUWlWQ2ZESFJSMWRqM3M3OTdUOVYvWGRmbHVQZjAwL2Y2TjNmanhxajFZcE0zS0JCaElqQjJaWnhBbENTV3ZHVW9GNXZacHY4NiswazQvcEdHdUgrS1crM1Vjb3BKcnh1YnFvOGxaVDlkMHdnVHlYdkE2UVRvcmlXYTlxMThIY3VsMkJ4UFVnKzFOUzZVU2FkTWZNSFpGN0UwUjNZeHByc2ZGeC8vL0tFVEJsYVk2WVJxRUF1ZTI2bnZEazBvM3Y4bmtJaDFpY2FKZ0xKaWpGTXlBZityR2UrMFA5KzVqT3lUZjA3NXU1Zk04dXNZcUFQbDNBem9CMG1ENG01NE1JUmhLV0tmcGNsM0YrVnN4MTFCM0NnV1I2VXgvMHBoNS9XKy81aWw3M1BPMFZQYlpLd2dSaDJWSE1GRENPNW5BMVlQbGpoV0dtWHhZL0hSdk0raVpQVmRPSWlNcjBuYUNRL1VVdXZKSktVMDh1emVIT2t6VU1odmdwNXBLdnRtMFprZ2FUMW9TeVRRQnpaUVZwUzBBbmlOWWJLZVM4bjJ5eEx6WlMrRlRiM0tvS3Y2cWY3ZThuSVQ1WGVMNUgxczZXcVVMeUtIV04rVHBXbzFjNDFWeDN3OFlKZU0wcHdGSzlxZDl1Nm5OZTFDK1BzK3gxMTUvUnlYcGFaK3lob2R2WjlodWhBb1dYcmVaRlRYZXpCbVVPZ3NWd0x5eFN0ZHBWTFJlNGN0QkpsdGFvOVZOaUJRNi9NdTRneDFJRHI1dHdYeWpZZ3J1Ym9hakVldXQ4WUNralYxNVZSSEVWQzdCWGNlNXF4YjRnaDZ1a0tubDY2b2IrZGtQbjdJYmU5K2FxMm5JTFdSUzNJV1JkMHR1M0E2RlVqdFVqdHM2RE5jUlE0OUlha25rc1dMb3E0MG45WTRlak9MaG0xR3d3MDh2NnJKZjdpdGgyUzNoR3I5MjJUdm1LM3Z4SXFFQkJFVitNOVNucjV4UytkMTA0aHJDaGpobExaNlBJQ3Z2dmJLS25GdkJJK1NQMnlTcXU4aVFYVzRKWFlwMTVTamxBalpnTDFFSVhkem55a2RTb3FYNjdFMFRjY1EyNU9oWWZxeUd2UCswKzhwbU84VnM2eHNwYzZMK1VVRGJSL0tuSFhBN083ZmhDMXFzdFM3WDNrUmMwWmR4ZXZHcjE4SVNkRDBnanVza3FiS3gwbXYza2tOOHRZRHhVaTRxR1BRL1ozV0xnK2JtbEUzRExWNXRjMG1lcDZEL3RoTXB0cTQvN1VQRnVlU1Z0MFJTS29zcDM1NklBYnNmdDZ2Sk9EbklvT24wSGo3UEEwVU1FZTFBNWVCS1YrZnVxVGpvdkFrMkNHSjVDNldUSmdZSzZJbGoyV255anFMMm1hbDBRN243OWUzcThnZDBiSWQ3VXVYbXJRQlFZNXVnekJLOFlrU1VKR25lMU9NcmhndkhtV1YwNFI5K3pWVHdiN0x2VXhYWWhmZFZJbVh4dEJTeHN0TkJ0WlVJTjhJM2JpQVhSeWdjNk1SOW9wMTRIVHJodE5EcDJRWHRDajYvcXM3YmpoOTFUQlFWSDVTeFpuNm5pbWZSbmhueHBEczRCT3RqaFlTN2RTb3N0V2xMd2hLRUJkUXJhaUhucnRORHQzQi9kSkdMMDBkZXdEMmVGRWdzbGJENUxNNngxU3dudGpyYXdFZUsyUzlxZGZhcy9hcXR2cUQxamJuTHRTbFBuc0pBWXh3VjJ2R2NsaFkxYWd3NDhrbWxBTlRoZjU2K3dCUXZQSzMrT1pGbHRKSVMrYnR2TDBLSnR5SFFST2hqczVtWGFOdkxrbjdYQjVoRjhzSlVTVVFMbGE3VC9wU3ZLVFM5ejI5THZBTGp0SlppRnB2eWt1QmxWM0draEt1WjFPZGk0elNEUnZMOU8zSzJDUFI5ZmVITHhWdFR0a284QXR5Z3B5NkJrR2p0RGZLeHR2S2ZYYmZ0SnZyTnhRejNlQ1BDOURCMEpHRUFDVy9leFpIZElYVWloYm4xVTNtTkhpbTJvUllFSWM5bDBOUDd5QnF3RjFJcnp3NENNdkx2c0FsNndqakp1UnJyZXdKTUJFckdrTllzY2t1Q1VtMk9pQ2JhZjNpeEFlWXYyM2JzbzQzVFh1OWk2b2hkdld6bGYyam1zMEVPNktCN1hDZGlxMlYwTjI2ZUVSU1VoY0pqSjl3TWFCV0ZYYmtPY2tDaHF4U1k5TUFDSkFEY3N4a25mZy81OTJLRzVMU1R4amo3MHBML2Y3cnowSGIzL0h2Y2RlU1VSQkc3a2xiZklzMXBSWThGVVY0dFdVZmtoRWtuRTNKelp0UnZGOXd6bTA3U1ZDaE51eUhxZU8zN0VBYWNCQTBLa3NCSGRhYkVwRXkwZ0U0YWE3TEtNSE1xYktnMEQ2M2hIWGJyVmphaGJCT2dDYzNhZjdlKzViUk45MXRVRElHTFRxUjdRNHl0amIwVi9KNzRlWXdsaTV0KzgwWkxoZmgvb2J4OVJUSWY5V0x2NFBxZ2tXOGR1OXpiZTBmUDM5SjZkMk9JMjNkeTJaazVxQzZjTTB6R2NkZXowMXQ4dDY4RWVoVVMydDZXNVpJVmdON1lLMFU0bnBlRXpZeWZIYUUxVWsyeUJqQmpZTk85akQ4Ly9GMkFBRHAvOS9rR0I4V01BQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLXhyYW5nZT0iMTAiIGRhdGEteXJhbmdlPSIxMCIgaGVpZ2h0PSI3NSIgaWQ9InBhcmFsbGF4X3NwZWVkZXJzaGFkb3ciIHdpZHRoPSI0MzAiCiAgICAgICAgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWE0QUFBQkxDQU1BQUFBZjFaTXRBQUFBQTNOQ1NWUUlDQWpiNFUvZ0FBQUFYVkJNVkVYLy8vK3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3puVyt6blhHem5XK3puWEd6blcrem5YR3ZGMHF2QUFBQUgzUlNUbE1BRVJFaUlqTXpSRVJWVldabWQzZUlpSm1acXFxN3U4ek0zZDN1N3YvLzZxYXVOd0FBQUFsd1NGbHpBQUFMRWdBQUN4SUIwdDErL0FBQUFCeDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdSbWx5WlhkdmNtdHpJRU5UTkFheTA2QUFBQW5oU1VSQlZIaWM3VjJMbXFvNERGNk9nK2dnZzRoWWtXbmUvekdYVzlza2pkZFJBVFZuOXhzdWJVbi9QMG5URnZXLy84WW1RUmpPdzBabVEydnlFU3J6TUlyakpNdHlwZlpLS2QwSnRQKzFSNkNWMm03U1ZSZ01yZXA3U2hCR3F6ak5za0lwME9aZngxRlBVVTlZeXhXZ0MycWJycUtQd3oxRGFwSnFKOXFxQSthRXlkRTdZTmxycEN5eWVCa08zYUdYbEo2azBnS1B2YVVuZ1I5aW5tUUcyNnVseW42VzgwK0l2SWVFaTFXNlZiOE1ZaHo2dWxQQUJJQWR0RnlVaEo1TFJwdzdxMVNleHVIWDBCMmVwc3lpT04xMHpnUU9WdWhvY0R5QjQwWFRzb1FWZHhjMHZVbVpiVVR0c2pqNmhNZ0xaYlpNc24zcHNBVUxQcUN3Wm5JSFlMeHdocWdMTWtaZGV6eDA2blpnUzVhZkxQS29CR0c4M2lyTWhBaHZqN0JGR1RDTnpNZnVRSGUxeitvUStXRU5TUkRGV1ZFNm1HejJCZ3c4N1lZcGZJdTVDcTFBWXFWMExoODYwanZqVVBrNi91VCtZWnk1UEFJWWR2akVPWXI5dzExT0lOY2QyMVJFdUllemtqUFRnM0wzcnJsL3c1UmcweDVDSkNhU2dPYVZodjQvVXdFNFdaZ2MyNURna1p4Yy9ydzI5MytiRURsYnBzckhTSk5CeTJWOEdIU3dUUEdabE1VZmdKNWpkbmdOTy9naFduQkFGZjNZWGV0eS81Y09rVkZhVkFqaHYxazViY0FNTkF4L0MrL3BPSGZrQnZacXBwUWxmSjlucXhmTS9jT2ZBbzlCR0JCLzNRRUF4VHpBUmJrNzRJdm5TR0dqa3o5QUlzVklUVWRTejcwZkZzcGlrN3pNd0JhdVM5SmZCZ1YzSEo4Ym9JWEl1RWFKZXNUc21kd2t4ZEg2Y1d0aGxjclNWZmh2YUx6L0lrRlNlcEdOZ21DdDlrUm9rb0toVUJ4TVdPU1hKV3Z3SFJMY3JBekZQVHF4NEEvRi9tYUNndHFtOFdLU2kxcHhSYnZKd2REWWtydDRpWGwwdG81YXNLRk5ZQi9EVEk4QUdRVFJoWTl5SkVnZXArb1lnOUEvQ2lhNDdwOWFxM3ZXWW9Udk84d3hqNjA5b1VNNmthUGVUMHpORytza216eW9MSm5JdW45QklSZkJCczJqSlBBb3BVV0lIU3JtS1RSbFFIRDcxTkFabk9oRWFGeXkrYWQ3TUtuc25kZ0lZSlg3clhQLzFjaHoveUF0d1RBZ0dqYWNRTlJIa2NRcGkvbWdxeDNlYmE4NDROQ3N0Y3F6TVM5cXpkZkg0M3dQQ1RkNDdtOElRT3RVUW5oRGYxempBZ21lSmw1TW93OEFYSStWRXVic2lPa1RNNWR1M1g5b2Nud0pGRU4zdW83aExzcytmME9tV2FsTk1xWjEvK1doOXhVZklBcSt0RXRQTUFlVGNYa1dUc0gyREVCd3NiNGlNQ1dHRzJQMytWRHYvSVRMT0E1Yk53K2lCRzAzV3AxSHRhM2wrd2JUNTZtWnBLcHovKzluaFVpemV6VzFwSTBiQXE4SzNGWFJlclBVQVVsd2M2NlRSN1lZeXYwbStYNW83aDhzOCtyZEk5cTlEYkJxdGtibmp3aVJTZlh5SnQvdjBTQ1dIcmFyUmh1b0I3Yk5mUWUyaU1NQTRzbWpGdWs4cDdFVkhhaVRULzN2bWZ1dkt2Y1VvNEMxR1Jxa1NDRkJoRGlJSFFCMTNNT0NzM3pmMVNUVUgxTm5pQlhPU21WL3ovMW5XeEJVQWsydWd0LzNYcWxEc2NuVzhTcit5USttZjZkRG1wUTVZclBRdEFWM2pWS1BFZWE4R2Fma1BrakdYeERyT3ZDdEhsSUhIS1dtSld5TnVIZWtxKzE1MWF6N1I3ZXYrNGY1Q1RyQS9lTjBxSXphU3AzKzUrcERCM29tNlNlUSsvWEFWdHk2b2QwU2hycHhTUWlvVWprY2g2dE1XWFZ4eU9GcDVkODJPVFF2N2VkNzlqbENieTZPSGlmTVZYN2V0ZVphcWh0ZVp2MUtLOWN3Q0ozR3VybCtxbTJ5a0RLZmVjTVpTSFVkWUlKQlRuNTRjbld1dGMxbVEvdWE5LzJEMVVFTURqaGZRRWdpMWFwaXM1STRDK08wK05WY2VPN1Bua2x5TXdNT2lGemErd2dySVAvTFJvZXB0WWJqdVl4dnM0eDlxakhXaGt3cnVCcG5sbFgzbDYvN0wvSktFd0VTSm80bzJKMFVSeDR4KzI3ZW8vcWsrNllTZFVyQ0syN2xzRXVYNTBrTDRyMmtxR3ZUbVRwWHR6elI3R3laN3BnbGNCallrZ1c2WjNwNTFMaE5iZUR6YlRTTU9HMmw5UnZVaW4zMFVhTkNqZldxRVh2eEl4UUFVWVhwaHFvNFBydWJWWkZHNTk3M0NkY1ZnZS9pTk81Y2t0Tnc1dDdXMGROSzQ0Q3JwUEZ6aWVzQmFSV1hwU1Q2VHlCS0dWV0wrRndhOHMyREl2VW5pclNWaTNMU0p0ay9NSTIxZnVYMVEvZGdVdGs3UVZHQSsxOTJOaXhHR2ZFeHdiSUpyUFhmNGhLMkhHZWw5cHNrclR0b0dTYjZEVVBrOXZ3N2tPNmxVQU9ORDY5VGYzZnQ0a3J2WjJPUFJkNU5VaHg1TlhKVVFBSEFaWWtHUjc4eHFpZjJBMXVtV2w0QTZTeXhNMTdhUzYvMzZ4dVh3dnBKdFd0eFBQTlhlNDM2aDlPQW9JdkxQR1M1SmIwSXoxbFNzTTV6YTZ5bG1OOUdWaS96ZUtPY2x0aHRHSVFHUCtZeHZqY3k5NklPNkFsSFY3UGlkSUJqMW91dENjOUN1R0swcXFBTVVwbEVFL1BVNUVJMC95MjcxSU5Ram5EYTNtVnZZQjVuZTVMaEhJY1hhOElpamxTdm0yZ2p6SVVneDdEQjBBa2dYekdrdStCSXlwSVFJdmZQazh0aHJnZWE5a05EZnJBbzRudHV2OVdUNmwzMWlZV2kyY0h1T2l6REpLL0F0VjlQNC9MdlI3eVc4UFh0SnRVT1g2YTlTNzBRQTd5RHBOZnNqTlFBeWdLN2lRL1I4NnpoRUhkOTRNY1Byd2Q3RmlWWnNmOHRsY29lK3dtYmVsSk4vUGtOczNlOHdORWVMUjZJOXoza1h6OUJrK2Zsem41SndOUWttQkxFa0c4QlJXZ1M4L0xWMEh4Y0lzR2k0UXpiS3dpOWNYMTlrY1JDVTdvYnVXVHVOUTVwRjBJd0JSNnlPTTd6bTZUNDA2YTI5aG1TWFdHbFFIdHh3a1JEMTdGYUp2WkJ3U0JhZFJNMFJoTVBnc0J1WTVJYzlJSS80Vk1BQjVudnpqSURCR3RERmtKZUtBN0dMWDMxOFRPYVl2blErTjhrWWNQWmk0WTdvcFExeHU1dk5kNFBLNTJWOWh0WlNQTHg2dW5JYnpRMDVuOFZzK3RKaHlhTmd5QVpSRHpVZ0I5cXFiaUh1Q21QNHFRL29qR0QrT3Zrc1JyaFI4cHVrWTR6OEx1TUZ4ZUlQN0RVZ3hrOUQ1VThOZ0k5bE1Pd01FTTJuSm53aGg2QWZaZTJZc2tzSnBabW5KYXZmbEk5dGdnbU5PVlVFb3Z4ME4wMmZOSDJ5ZFRrYTVsc1M5NXZma3dBQkkwelAxTEVSOThDeUNvNHQ4R09SNFpLWVA1MTNWSm5tVXo2QzFwT1NyOVQ3VnhLc0hKNVZDTG9NdFlHbkpJWHIraFpWQUs3ZU9XeklTMFZza3dCeE9zYXgwcmtQWTk4RTArbEU4N2VyNU4vVWJMQlg3ODR0VUdzekpmaithVDZzOFIrWlNZSGE1UnI3a2F6UTM3WGJjU0pTYk1RNGd3Zk5FY1JrVEw0cmtxNVRhTDM4eXBmbWxmMjZmdVRCajl2ckdLUTB2eEE0Z2VUYkR4SHMvMWo0a2ErRXJYOFh2U205VHZKekU3UU9IQW5Vell2NDZDSDNtalZrZXd6akhoa2MyVzFlZWZ3ZDFLYU4wSituNXJoYVZRUFVJbFd5andaK3o3eDhESmJycmVsSld1Z2phK3FTQmVmZ2VwaXFTZG8yNUtuMEJ4bDdHeTBHTTdCaWZ1UlZyeFFDVDFUbjRIcUptbGVKU2EvWk1DSExreUEyNFp5V1I4amtLVXd3RzYzMGUrbGxtd0hrSy92TkM4NXVveUwzdHRzZm81RDM3RTBuYmhWVldTckY5a0pHWU1FaTUvTzBlU0UwQVk5N0RoNEg4MmJHcmpLOVh6cUUvd2VJdVlIZWY0Mk9GbXBtbSswZU4xRjliRkl1R3krSjRSNkY4dElUcThyZHIvZzhTSHFtVElMNDJSVDdCa3BKMWZtSzFWa1NUeU43OGgrVlFuQ01JN1Q1a2Vlelc4OEExNXAwa3J0c213ZHg0dFBLakZPbWZVL29QNDhML29mZUZpRjk2cEU1dVFBQUFBQVNVVk9SSzVDWUlJPSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLWludmVydD0idHJ1ZSIgZGF0YS14cmFuZ2U9IjUwIiBkYXRhLXlyYW5nZT0iMjAiIGhlaWdodD0iMTIzIiBpZD0icGFyYWxsYXhfYnVpbGRpbmdfMSIgd2lkdGg9IjMwNCIKICAgICAgICBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBVEFBQUFCN0NBTUFBQURFelN6YUFBQUFBM05DU1ZRSUNBamI0VS9nQUFBQmdGQk1WRVgvLy8vanlaejAyS1cycEh2ZHhadTJwWUxueTVmdjFxV0ZlbDdWdTRPbG1uYXNuSHV5bjN1S2ZtTGV4WmJWdnBTRWUyTGt4NVRzMjdMU3VJWEdzNHZGc0lyWnhKYnMwYUxQdkpPNnA0UHAyckhselozV3ZZM1B1bzdkeTZEYXlhSE90b1Rkd1pKdWFGdkpzbjZsbFhQdzFLQzJvM2ZXeFozRXJZU29tbnVla20vSHNvU2VrbStBZG1Lb21udWNqbTNPdFl2bjE3R2Nqbk9sbFhPNnA0UEtzSWpTdUl0N2MyTzhySVdFZkdtU2gzT05nMlYxY0dHVWluVHQwSnlkazNGemJHSFB1bzdrejZHSmYydm4xcTNxMWFUZno2bWFqbm0ycEh1eW4zdTJwWUt5bjN2UHVvN3MwYUxPdFl2U3dKbThySVczbFhLbGxYcTlxNG5keFp2VnZwVGV4WmJQdW83U3VJWEVyWVI3YzJOMWNHR0VlMktvbW51MnBZTFB2SlBHczR2V3ZZM091SkY4ZFdtTmdteHliRnVPaEhHNnA0T3NuSHZPdUpHc25IdUVlMkxGcm4zR3M0dkhzb1RGc0lxNnA0TzJwWUxLc0lpMnBZTFp4SmEycFlMYXlhSFp4SmJHczR1c25IdmJ2NCt2bkhhbGtHNkpmMnQvZVd4OGRXbDBYcVJHQUFBQWdIUlNUbE1BLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9FYnYvLzNmLy8vLy8vMFFpZC8vLy95SkU3di8vSXU0aVJQOGlSUC8vRWN6L00vLy8veUozZDRpcXU4emQvLy8vZDRpcXUrN3U3dTRSRVNKRW1hck0zZjhpTXpORVZYZUltWm1xdTd1N3U3dk16TjNkN3U3dTd2Ly8veEVSRWRxVlVFWUFBQUFKY0VoWmN3QUFDeElBQUFzU0FkTGRmdndBQUFBY2RFVllkRk52Wm5SM1lYSmxBRUZrYjJKbElFWnBjbVYzYjNKcmN5QkRVelFHc3RPZ0FBQVVyVWxFUVZSNG5PMWRDME1UVnhiZU1ETk9yR1FtRVVnSUVDQ0tpb29GUWVVaEtqNjJpSSt1aW1odGk2OTJwYmkyZHEyUDJ0YjJyKzk5bmNlOU13TkpWSUpkRGlUenpHVHVOOS81em5mdmpQaVBmMno3K1BlK2RwL0JweFgvUHYyZmRwL0NweFU3Z0RVWk80QTFHVHVBTlJrN2dEVVpUMDcvY252bzljcjZhcnRQNUJPSnRkZVg5dlpkR2h3Nk5QaHlCN0xONDkzMXZYMTcrL29rWWtPRGh4N3NPTEpONGkrSmw0cExnNE5EZzBQbkY5cDlSdHM3Rmd5LytqUmlJaThmdFB1VXRuZXNIOStyRVpPVFFZblkwRnE3ejJrN3grTHh2WDBDc3IzSEpXcDdMdzBOSFJvYWZMMGpZOW14THNYcmVCKzhTWUlORHUyVXl1eDRMUlgvZU4veDR6b3Z2NUJKT2JpallwbXg4SVdLUXhEL1V2R20zYWUxYmVQaTA4ZVBlM3NmUHliQXVsWGNtbS8zbVczWFdKUnFMME9ML3Q0dmhOc1hzYVA2V2ZGT2FyNHFreXI2dmhoUzVyWGRwN1dOUXp2V1BxbjRFckVoSmZvcjdUNnJiUnkzZGJlb1Q3UHNrbUNYaU12dFBxdHRISXQzWjVUSDF6RXpNeWc1OWxlN3oybzd4eTl2dGR4TDFDNjllaVVCK3orMFlkUHozODNOM2JweTVjcjk4em9ldlhuMDhNV0xodzkvdWk5V1h2bGhibTU2M2xUQ3AyK1BIemQ0OVEyK2ZTVTAvL1dmN1QzNUxZejVpM08zN2orL0cwZCtmNlZEUnRqQjQ4RFpYUmhSVkIrNCsrTFpsYW4vdnRXZVFpQTJPSFJDTU96L29tTzA3K0t0cHovL0drY2NKd09XbklRSVhNaEJVM0cwODdVd1grVnlMTU9ySHZyYjR6VTlkK3ZxcjdGZlFSNkZPQTBKcnBCdHJSQm1KUWxZS2U3VkVmZDYxZDd6N1c3UXg0eUx0NjUyeDlFRkN3Nzg3V0FRaHJBTmFIZFdveVhpWk9ldU9GWm9pZmUvTTJBQ3JJbHlQNGZLMHF6UUFzekJUc1ZaU01sZEtodDdkVXIybGt1UGxpZmIzYmdQSGZ1ZVBQMDE3dWRjQ20zTlNnQVUycHd6ZXRhL3EzN3k5ejl1MW5vMVhESWw0N0pLMVVmTHMrMXU1QWVMZldldTFuSkpUaVVCeVFpMjQ4bWJOMi8rY1dTOHBzQ1NxSFVLaG1FZHZiYjJkK2lEUDdrYTUxSmFqeUpGVzBLaVY4ajNnZmV3NCtiTjA0WDhrWkZpcjRKTE1jeUxKNGFwZ3BZZUxYM2FtRTMvY0xjZldzdFN6eVdYcFY4bUt1S0g1dFRQcVQveStYeHhaQ1N2ODlHa3BHRGRLSE1kcGZPZmY3S1l6VDNNSVFxaXZUTDZSZVQ2YzM0dUoxOStWSTVVbENPL1hDN3J1YWhzVmtMb1JiRzJIQWpBOGdLd1dGVkltWkpDOUNmeXAvKzRlYW9rZ2pBYmEzZlRXNG1sTi8wQ0h3bU1iTEl2TVJMUnJ5R3JYS2lZQ0NtSVVxRjBhV3BacjlPN1ZUcUwrYUlDVE9kanI3SVZFOFY4L3ZUUlU4T25aQXlJK08yM2VuM2dwelB0Ym45ejhjMXlKTEM1WVBCSTJDcWVpRXpWY0UwWTBocW1ZcldpWWxqUjFFamx3K0p1U2J2Q3lNMEJ5YTFTVkJjeDhOdkF3S2xmcjN3NnFmbm5BeHVWa0wwNzFzc1cvelF6d1hlUEM1Q1N2ZHFJcVpRVXdpWWd1K2wwb1hhVjZqOTkzMjRrR29wM3QxTWtQY05OaElsZFdla01rK2oxL3k0QjAvb1Y2NjVSdDhJclh5d011NGdKek81T3RSdU5UV1B4dHAxMllYcmJRdzVrQXNUVWFxcHoydmVVaHZWcUoyWVlKcU00a0FSTXhOM3RYVFFuYjNkWXFtT2xtcHVTaEFxNWU3ZGJhZStoWnZxcld2QmxwYXdTWUwvYjNOcUZSWFBnaDRWMnc1SVZiaks2VFU3alhqcVYwdVlSTi9IUi9raHJXUFdHQVd3OEpTRXhUdDFxTnpLcDhmVTZCNEw3MURDUllra2k0YjU4eDFRZ1lYSkIrTG1lN25KdC9QZmZSK3RaV0JtZTNkMkdMbU10Z3oxcFRVL3RTYnBrU294a3NKVGxIKy9ueU5Cc3lWb2RmYm5OS3ViaTlmVFdaOWdFenNNVWtCdnBtQk51TG1DcEhDdkY5N2VSK3YrMW5pTHBZZUtkVlFJcUF3eXBrUDI2NEc3a2UyM0FTalF0V2V1M1QxNnVkVGpoakVNa1lIVFV5QUVvbVl3dVFubzMzSElneWE5U0d1ZEtQeSswR3lvWjM5ek9VcGN0STkxWk8vc2NxckUxMjRGa3F5NFRuSXFYWms1ZHNuUWt3bkprWVVlWTJtbWk3UzVDbVhKV3Y5SnV2TmFiWVVJbVhwU2NJYTFKOE5ISlZYYklzd1RKWnFDOWFLdjIvK2tVeDdUSXFuN3BwVEFNelM5aG1Wa3pRL2lFVUxIRzQ4M0Y5dUcxYUxFanpTV2tOM2R6MnhCYXRpdjFjeGJkZU42QjRDZTFUQzlHYlRQK2E4NTFwaHpNVXFXTkFOcHdVNWlHRzd2MWU1WmdLU1ZkckZVTkJLTDMyNE9YSzE4ZGlaYWxBb2F5bGxZTzRJQ3BSeUVTODR4VnJ3TU42RmVKb0h2ZURyeHV1MjFKWDNBMGpGZEdPNSt6SW5UZFJrakFJZVFWQ1lhVmlDbHdzVTF0a0g0dTk2SFRQSnNQRGQ4eFNsc2JncFl4eEJoVXVHb2pacVZoK09VV0k3Wnd2ZGxDMWtpa3BHaURDbG5aTUNQYmo5akM5UTVLbEE2U25TeXJHdHFrMlNCck0zSE0zazBpMkl5dkFNUzJFckRydkFFV1BEWldZV3FYS2RsNlc4U2RMWGlFUkZiVGx4NXdpRlJ5WjBySlFaOHRmTzVuSmRVMldMTU5EMmRaWmM5ZGtiZ01XUjNPL21UZWxaS29zWGs1ZWJaVmVEMUlSU2l4emlaRWtoZnBhTHQxMUQ1MGF1a0lTZk5UMUtyRS9ZUzlmV2xyOEZwSEliWXFZb2U3MkVBa2lMWGhBYks3VFdHR1RtM2l6VXBiTW5peHVrR3IycFdYWndHZUp2T3k5TTNIeCt2ckNseGVjRUo0dVpNNEpueFRZdE9HNHhqcGtUUXBZUlplbThhamp3L1lTNnQxV1VtWkRWdVdscjFQeWExWVFLWEtsYk1kTjM1bzRYODNPVG01cUYrTGs0dmk5NEZzYzBVenJGTHBxQnlvSEJDaEhzUlJzK3E5b2xhbzFXcnhRbjlGUHNxakhuY1NjenJVWEw5NkJrcjlWdnB6NnNrZTlTdGZ0ZEhSSHZFalE3NVAxQjdYTW1MaXBJanVreXBPMVFic2tNdTEyc0FwTlZlRGRYVVR2OTMvUEJIdm8yeDM5R05LZnM0M3ozVHBpSHhjOXRXUG52aStmdTdMTE90ZGM3NTUyTWxzTVFjMEc5VkNCQnZNanZvdzNZSG5lWUg2a1ZNdkNBSTl4UlZxUmk4RmFxdjVBRzQwbjhDOXZJQXRzYjBET0thYS92YzlDSWJ0ODFsakpUQnEyV2VJcVhiNmdLMEZwOCtPa3NzaG1yQS9BazFJcWpVOTBIWUxNWThCRWNEcWdCcXROdW9WZ0tqQnh1eWw4ZlZjbElNQVZnVFYxZ0ZiVlcyTFdFdW9QWnhqUkF6ZWJwK3Y4M01NS0FNWDRzZVppdEVUMkt6d0dJVVlnelJBUWNCSjR4QU9ZQ0pzR01TR3VNQTA4Vjc5cm1YQTFvRXUyQTVmRTB5dWlOZ200Z2pTaU5DVk9aY2pVdm8rN2FjVFVyT1c0YXBlUFl4YzFDVE9FVnhET3pFK0p2S1A3NUZJVklUZTg2cHpMUU8yQW5ReVZNRWtndVRFek5JVEJ5ZGI1d0JnSDVJUjNoRndIek1lR0JaUTR6QmxIQkNSVlFSTWdHQVJEQ2lHc0FyejBPUGZJSCtxclk5aDN3R1FHSGx5dk0wY0gyc2YxbllIU1ZVSFVPc2lKek1SVWw4Q1psT0JwVTFnc1Fiekx5RFpJOUFzaE5rbXlFcllrYVpYVzhYclhSSXF5QjRmMVJwMmlhalpGZ2NwQi9GZ3pnSmxOVjBMc1REcU1YVm5PSGdXbVl4aWVkMnhMTjM5Rnk1YytPYy9MM1EyRVB4SStpSWdBMSsxQ3RpYWFWd0U0c1BVektJVUppM0RnU2tWMEkzQTlzRlNSRmcrdUQ5UjRJOXlEbkdTRWFFZ3djVE1LTU0rK216ejZPVElzd29pWDlWV0J4ZlhjMWJ3a3NqNVpuUEZLWGRzUWRkYktyRGlveEVEaytpcmR4aEZxQ3pORGl6QXdFVUZWZlo5RFFFRy9vVGxJeXhVVy8ySFN5dGNXVnl3SW5qTGdmTmtkQUlVcktRakFHR0dYRVlTM053b1NoSkxRS3ZJc1RaNlhrUlhzVUdHc1hyQ0RpUlZ2MVd2ZjRkemh6a0kzNGZjaW9ocUpya2lxS2pRZnF5cm1JYyt3NVR2QXBscElCNWxaUTVkdU9YdTBWTElhVXgrc1p5RjBzakluczdPUFllQllXZ28wUFNhTC9tOE5id20yK2hhdGVnMzQxb25rS1crWmxnaEwzL3krVUtob0ovbGwyODlQZDNkQVdOWXdyV3FMMml4YzdSR09xUml3NTZmRFNxbEYyTEYwRFM5Uzh4aW00eXcxNDNHZW42bVB4TjBHNUgwZ1dFRkNWQ2hXRENQcGVjVmVnS3ZIZzJZWFgzUm0rbWNiQTJ3ZFpzd0taVWZDSmRqc3dsbHN2Wml0Y0JVWUYwSkNGM2dtMy9EOGhCTzVhZmVIeWoyRGZnR0h3RXI1UFZ2b2FpSUprRVRnSFV6d0FKK0JUeGpPUGJzQ1JaYUFtd2x1OXVTVWdrQkYySVZkS05BNmVqanZzTkxOayt3M2ZCWW9qQVB3UzBGY0VLK1JYaGRrR0g1b2tSSlo2YUNySUNBZmJZbk5ZeEhhKzBSNHNoUXdFMHFuNnNWNVJWQVFJempDUEhFWTNYUlpoNGIySkNBVVEvYVVJcjhHSXhSR05tUnJhemplVENHNlhUVVVpYkoxdFBkMCsyZE96SSt2b2Y2U3VqLzFjRVVZQzExamladDdteEZid2c3OWpLcUhyVkFad3FQdzJaeUdLa3hFWmZyY1ZtODFlUHg4WE5IamlpdDE2QVZKYmtBTUsxaGFmVENZM2xQV3dGc1RaLzd4eDZVeU16dXdFMlVUbWIzU2F1eE5IVERJYUpZTTZ4ZzRNb1gxVC9mVXBCSmhnVWpSODZkMjdOQmRudmVMNjBBdHU1elZDUjBBSjdWWk00bEg2eUVSYStjYjYxaXhaRjlYbS9qVjZjS0hXMkxhQzdEYUZLTjYzRWMxK1UvNmowaUNBWU0wMEFCY0VyRFJrUjBCakF5Wm5jYzNxTno5REtqSVZUaElOOCt6b0IxcDQwSjhndzZOYXhmcm1aMDUwaitjK2Q0UkRGTU9RbXNsSG5ETUZZbHMyMUw5VmdMZ1BuQXE1eWw1QnVaYytJZVM5eUlPR1hMSUI0Y1A4QTFYMmdZWG4zbzcyV2JjN2tpZ290bFJMOEExbFZxbUhZVk9pV2g4dzE5THh5OHhpOXNwWE8wU1BiYm1IczBBMXh6eUkrQjRyTUVCY09tSWZGcE4vc29ORnlCbjVBcHllMUVBQllWUnZCeFhOQkRBR080a0FZd0pWMG1LdzNUR0dBZWFWWnlJTEtWTXJtMk5lYUJWMXVkN1VDMnFtc2VyQnprSzB4ckorQ0NRTmNvVHk2c3FCMS9nYnBHSGg2YWtSZ2RTd3RqaUE5UXB5SnFsYVZkRENsWDVwM3NvcExnSThjNG9GWTZBNlJPUWJUSFVDR0IwS1NKbjI0NEVUS3UrbFVnM1djTXM4QnlSM2RQTkEvWVN3V1VzZ05SQW9hY0dlV3plRWRvK2g4Q2JEaDV5QnAzOUJWS0c3WnpGTDQ3QWx0aE9wQUYyYVBVbUZGZjBnWWJxNlJSZ09iTDVEZlVDamFxaDB5aGhqbnRsYU9DUG1xV2JSckFuMXJKcllzQ0x3WjZuNGhyZW9BTVl6N2ZJMExvalhBQjJHZ0YybjJkblhrckpiRkE4dEVLdmFyYTlEOS9XSDJmbTlZNUJpaXlEemZaR1pneGRCSEZWb3BzNUFHUUoyVlRUNEJoRXFJaTJWYzVkTUZzQlJOQUdtcER2V3o2cjZ0Y2RyT3dkVEZLSElnTjNXYmZSbzhTbDUyUHIzbzRKTWFVZThDY0VURk1ld28xV0ZIRXZpU2xwQWJIdHNTNnM5WFpkT2Zvd1pia0hmSFY1MGpLdHlnajd4anBpSHQ2N1lUQkd6Vk1tMVVZckZDQVFVcGFsaGo3WHVCV1d1Z2MzU0U4R0ZKSWdjaEhzNEQreW14a3lZdU9BY29IcGFYUGR1WVpEeCtOWXA2Q09ETEtSdzBEdDdzVTFPWGZOZUlEaUlVQzJIeGpYaFZnUjhibGFBVkxTTkl4R0diem1oMUQvSG9yeVpSamx0ZkFGL25SUm9NVUxqV1VJZ1ZWK1ZlZzZxSkhLYnVTNHdVMTVKbzNCc3gweFVuRGlFeFlVdmczQnRQTkFiWktOc0hwMVdROGEyT3prVGpqcy9KcVB1NHIwSWg4Wk80Wnhjb3hvUUVrby9zNmFQeFpZUWprblNOMUdIRDZoYUlleWpkanJtcE1IMnpGWnk3MDFnVUltdTRjWFVZZ0dDNk1BclNJS1dZVHhnS09TcUNWM3l4ZDJmNkdmeEhJRms3UVVTUU51bWxuTFZMZXNZd2FWdEFXalByZmFqeE04bStQM1h0WHM1eGhuVTEyamxZd25TS0dGcnVGaEd6enVWVFpYVXVyU2pEalFYaG55SjJjbEFFaVp3RHhzRFdJWVE5bFRKVHI1VGl1MThiSDVmQU9xTDJpbWV2RFByTlQvREEvak1yd0pqdEhkelp2VVFwWkxDaDg0SlhaRWU5aHlrMTBRNU0rYlBVVmNsR2FVZ1g4U1RBaUdJQTZxaGptMnpkQndMMFdkRjlTMklwejU0Nm9JZXJBS2lsWWVmVmJjNTJqZHpsTFYzQWtZUXVMWmdTQXBJcC9vZ3FvZmFyeVR5Nlg2d09DWWVmT1FmY1JpU1lMSmU4YUJVejN2VVRSYks1enRJcVhIMHBqaTJNMENDSVNVbS9hL0dHeE9Na3diczJoQ0Zoak5PWUJDK3A4bXh0SGFNUmtTdmJnZUJqZEMyWjlWUVNzcWM3Uk9qU1hld25PSzF2RGsyUTAyOTVqcExhTXpvc0t2MmtlalZrd0Y2czJsTlgzUUpYRVRJUkJub0xWbDJRcFNDTWlXSWliSzVNckNmWGE2SllyeVJZZzVUTXEwdWRoSDh0UjRFZDRKVldBTWZJNHQxelo2SUtIS0tyT2tiNU1obUZGNkVrV2pLMG9KQVlRdmN3aHQrWWVzTGhqVGgxeWl6K0daTGlUczBJN0FhWmlob1pjd1FpYlJwN0pLeU8xUERLWUFKQ3pBTWxreGhBamxwSkY4Sy9DaXhYWmJiWk85bm5pTDlvNnNhcVpCeXplTmV6SHVVdGdFbTdoeUtZR3pRaHh6N1l0ZGZCY3JoLzNzTVB0Y1lxcDE2ZzZFTHZ6YllpRk9xYXFKR21ZeHlNZ0xxdWNiQUt3dFZiZEppVWxGZ2lHTDdNVzdFaDJDY1o2RXZNaEYzU1pTYmVKUWlkZlZYVUVkUHIwTElyV3NYeVJqN2hDa21OdXN1eVh4MnJpNlhONDlKRHlDYVZuUzRaMjVEUnVibWpINkpqS0RFcEphMmduUmNQb3RrQ0FhZ2JhV0gzU09HQXJRQzVVR2R2R0VvbG81a00vWlJkam5ySGJiVXpDR0xsWW9Zc1p3L0o0N3hzSGVxek90M1ZrcWk2STRzOVRVOThmVzJnTU1Hd1pFY25wTzNMS1djbklMWWI1SEthbWhxZXgrK2N4RlVIa0Zaa01yQVpjZmtUVTVCR29MNmtGckFEUG8rUnQwYmNQeCs1RUtiSldSN3QyNys3cTZ2cHEvLzZEbDZmR3ZwL2R4TW0rbTV5Y1dsdGJXMTlmUDcreThxYmNlQzc1U0R6Y2FKZEtGRWZmdlNqRVlsOHdqQ1NNeWo0alFtb3VuWlFmNWs4Z0Z0SHZxeUVlQXN3aG1JeHF0WHBDeEwzUm84TWl1Z1JlS3N4VUxBdnNMaDlzbEhmN1ppY25WOWZXbHBmWEgxdzcvN0ljV2RYelF6K0lJbVpqM3JtelBCbmhseGpvRjJVeTUrY3NXMEVQb2hTdHUwWlZGU2RtWm1hT0hqMDZmSFM0YTNoNE55Q0VXQ0ZhRm5MeVRXSW5lWGVzOFI3VS9Qems2dXJxNWVYbEI5ZXVuWmQvM2gyS0oyWVZLUmRMTjdZT0lhTzkwYWJrWW9TS095YVFMdEovckFMYUN6REFsTllyaHAwV01UNCtQakx5ZG1ibTNyMGJYdlhHcUtRUUE2SkxUYnJNYkZjU3BpNXJ4WmY3OXo4N2VGQ1FUYkN0Q2Nqc1dKaWUvbDRndUx5OC9QemF0YnNDd1RKUE1TYUtEclBVY3ZMV1VVeUp4d3lFdzZqa3JTUDV2SURXTUltUGlCT0NQNHBBWFRZQ0xuMEFMVVJQd2dZN3ZKQUFYVDQ0TmpVMmUyd3pMV3M1OW4wM1B6MDN0YnAwWmZuWmo5Zk8xK0pZa0xDSnpuc2NFSGNDcHNocEQxaWdBTTJjdURjOFVUdFZsU0FaM2VGNGRObE02ZXB5bVFPeGYvLytLd2NQTG8yTmpSMmJiZDkvenpJOVAzMXg3c3phMHRMeTh4OS9yQTMwcWpUMlVlUWdNWTNkSDhCRVROcDlCVSsxK2tvbzBEMnBRRUtnaDVFWXU1MlVTZ2xMenJzMFFETER4a1F0UFBaMTJ3RGFMUFo5TnoxNzVzemMwdExTc3grZmYxbXJEY1NnaEpKK05WNGJnMnFnQ0NRVldpZllicmZOa0VwZHU1MVVBMTFpYTc0eUVpUUFPamE3QlgrSzRXUEYvUFQ4azdrenQzNVl1di96ODRjOUoxN05uSGgxVCtOakFOTE1BZjUwdWNnNERDSUpBbzBlbS9xMmRZM2U3akhib055a3BacklzUHNITHdzSm1qbzIyOHF6aEo5azdPT0psckJERnBoS295OGZYQk5GN05qc3QrMCs4YmJGVjFrOEVoTDBrOUpvNlJ1LzNiNGF2ZFd4SC9sbEpFaGsyT3kzZjFzSmV2OFFKbWhNYUhTN1Q2T0IrQitDL0tPcjBoNHBkQUFBQUFCSlJVNUVya0pnZ2c9PSI+CgogICAgICAgIDxpbWcgYWx0PSIiIGNsYXNzPSJqcy1wbGF4aWZ5IiBkYXRhLWludmVydD0idHJ1ZSIgZGF0YS14cmFuZ2U9Ijc1IiBkYXRhLXlyYW5nZT0iMzAiIGhlaWdodD0iNTAiIGlkPSJwYXJhbGxheF9idWlsZGluZ18yIiB3aWR0aD0iMTE2IgogICAgICAgIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIUUFBQUF5Q0FNQUFBQzZSUTlrQUFBQUEzTkNTVlFJQ0FqYjRVL2dBQUFCZ0ZCTVZFWC8vLy9reVptMXBJRGV4cHI3M3Fxbm1uYWxsbkdubW5uMzNhcWpsWG4xMmFuc3pwaTdwNFBVdlpQdTFhWFB1bzZ0bTN6cjBhTGZ4WmJOdDR4eGJXT1VpbTZ5bjNsN2MyTnNhRjIrcklTdG0zeW9tNEMybzN2MjJLU3puVytybklHZWpHdXFsbTNaeEpaeGJXTjBiRnZVdlpQdjBKdm56WjJNZm1QQXJZcTdwNFBYdm83UXU1TEZzb3ErcklSc2FXRHgwNTdFcllLem5YQ3NtbktGZTJxb200Q1BnV1NNaEczUXU1S2NrM09sbG5HamxYbDdjMk56Y0dlSmYyMTdjMk9KZjIzRnNvcVVpbTYrcklTY2szUEFyWXAvZVdsL2VHV2ZrbnJHc0l6QXJZckdzSXljazNQTnQ0elh2bzY3cDRQcjBhTFF1NUs3cDRPbWsyemZ4WmJaeEpiRXJZTDEyYW51MWFXd20yNzUzS2ZtemFIbnk1YU1nM04vZVdtZmtucWFqbm1VaVhTTWhHMk1nM09ybklHamxYbVVpbTZVaVhTTWhHMkVlR04vZUdXMXBJQ2FqSE9GZTJyR3NJeTdwNE9WaG1lK3JJU3RtM3lubW5tZWpHdVVpbTZWaG1mVXZaUFF1NUxOdDR6ZXhwclB1bzdHc0l5N3A0T3luM21tazJ3Ky9NVjBBQUFBZ0hSU1RsTUEvLy8vLy8vLy8vLy8vLy8vLy8vL1JQLy8veUozL3lJUjd2OUUvLy8vUkhlNy94RWl1Ly8vUkhmdS8vLy8veEgvLy8vL0lqTkVWYXFxek13UkVTSXpWWGVJdTh6ZElpSXpabVozZDRpWnFydTd1N3ZNM2QzdTd1Ny8vLzhSRVNJaUlpSWlNek16TXpNek0wUkVSRlZWVldabVptWm1abmQzZDRpSWlJaUlpT21hcjFjQUFBQUpjRWhaY3dBQUN4SUFBQXNTQWRMZGZ2d0FBQUFjZEVWWWRGTnZablIzWVhKbEFFRmtiMkpsSUVacGNtVjNiM0pyY3lCRFV6UUdzdE9nQUFBRnpVbEVRVlJZaGVXWGgzc2FSeERGdlN6SEhRc2N6VUVLQ0ZWa2lJTktGRVcyNVJaRmNWd2pKRnZOVHUrOTkrcC9QZk5tQ3dmY3hZb3NmOG4zWmNCM2dqdnY3OTdzbTlubDFLbEh4TnlqYm5nQ01mN1Uvd1U2OTI5QWwvNUw2WDNucTQzZjV1ZC91ZjNacFNjQVJYcC9HQi82OHExZkQ0SUhZWFA1VEM3M2VtNzMxcHNuRFlYUzlkTURYNzI5blZaQm1rSXBWYzRoWHIxODh0Q0xBOUNmQWlJcWZ0TS8xV3dUZGE5MG90QzVJZWlsYmFoa29ZQUc5T2N5aXoxSjZKRFNOdzQxS2cwd3ZSVE9UVkMzSGd2endjYkc3WkpyZm9OS0x4OHFUbXM2SUJ4VCtjUHlZMUp2SHFnbXhyaGxQcFBTcTU0cm0yMVd5RnlYWkR6R0dWQy9PU2J5OGpZUDFLUkJkcTlZNkRudmdybjhjd0FDWlJjKzRya2xVOEZYSVp2NHh2R2cyMHFMZUVEVVBTNTc2a2puZkFOOUQ1Y1VweFpZZmVKc2E2bTd4MkorQ1NJa0JDRlYvWmFGV3FWYlNydEk2ZHdxN1NqT0RjOXE3bGlGYzJEbXl6dzZFdHhQNzFJakRLa2RORlV6UkRUNXRrREJVVW9iT0xkM1ZORDQ2dXJxalFaaTZtWVlsc3ZsMThvSVFiRTNUMUVSVWtpRXdFbmdqSU9zZHJ2ZGdyUXgreXpIdDZjNXh1aWwzd2xiZ0JKR0VHWTBHazg0aFA0aytpZGgrUHhuUG5Xa0dJdUgydEcwQUl2UVdBc1hScUZSaXkrT3hreUUyb0dseWQrd1BQMUlmZUU2d1NlaDlCL25tS0I1c1pqSlpqTmVER3VoNmxQVWs2QlRGaVZkSXFXRldxUjBhdnNaWjJnMW02RlhETFJZb1F1WnpFUVNWRVNzYVUvbWk3SnlFZXBUd0UwK1ZSQmFhWUZHem1ZbllxQ3loa3UxMVBVRTl6cnZHSjNXUkVLRzZIRksyVFZGVnlhZFUxUXJad0dWa0VORHgwQVhBYTBuS0cxRWpDUDdKNkdoS3RyZmJjOExTS25RMEJyeVc0K0RWbW0yczM2eWV3Y3Q1R1pYaXRCMkhUUjJkRUR1OFJHb1dNVFFNVTRxaWdJbTFmdTdraEd1VEkxNzlKR2dRZGd1dDh0NDYwNFZtUFF5VkVwMlVpWU9Xc2tpVXE4a3VGZEdLbFZFZkNwSWFhQXF2dWQ3bnVmalFFZHU5VENTVG04QlJvcHhVbEdJT2wzSzFCSkxwbDkrSXRKOTZIT1pVbG9obEllaTgvbHNvTkxNcWN3Z1JpZVZvSGxVVXoxSnFlMHh3cHJXYVE5cC9tYVpDSlVzTlRCR2trOXpla1VkL3ZWam9MS0t4L0VUNW5UQXZKRmxSREEwWGRFd3BCWUgzaHhGb0lzWWV0UkpSWW5NMDVWazkwYTdqc3N1bDB3NlBXczFjblk5TGhxNGw2R0NlMUoyMUVta3RNS040OU1FYUg5RmtXNE4wVThDYU1WbVZ4OEhvSFFYZWhMYTNZaFMxRERGRi9GejZ0cXNOR0RoSE1WUWRxNXYwRjZnVE1tWTlGYllTU005cVlnbEFkQVhFK2JVcmN2V1NxNFhjM3AxWGkwM01FcDVUbkZYSGUxaHhMN2tYcm1BSkx5VWxONzR6b0Qwa3F4WnJkVFRaY29sbzFKZG8xU3drMkpXTnlndDRIRmVUb1FLbDFqaFZsTDhVUTQ0dld3aTB5SzRIMGJjSzZxWk9DZVJVdlFra2pyOE05T2sxNVZMWkxYV1NUYnUxUnExWE94M0F6dW51SkY3MG9pVGloaXNqaVhvYWdLMHZ6RnhENkMxYS9mYUt1VVU4N0xqb0xnNTFrbVlVM0VXVW1PZFZMSXJkdjlnOWk1VXAwclhxZS9BbnUxSVRpbnB5WTQyd2lKRzdRRWE2NlRTWU9lTEZLd1E1WFNrSStsNXhaSWU5TjFMdCtmMUdqWVlWWXh5SG5NYTY2UkdaRjltNTlXdXFyVEthQ01abWI1THIxT0tIb3V4UjVYU1poM0dqblhTRkV0c2kzYTd1TEN3c05pMVdua1JWMWhsVEhLMVlHeGJWQlRLcS9XSWs0cWNySXZ3V0p5VHBsZ2RwcXJLZVluMmYxWnFTbFJuMStlZmlZQmVNMFlTZXQ4MzVLUWlwNjBIYUp5VHVHUWtWa2tOalc3UnNIT29HQnNacmRpdDhNYnNtcTVUR2Ura0lydWlsOVNUU3Z3ZjAwNnBiVW5PU0VhaWJRN1lLRm1sMm01NWJCNkduRlRreDk1Qm9jWTVTZGNwdWx2VjJzNzFDbHVuRnVyYk9lMEt1Vzk2citteDJXRW9IbWNXTlpPZG1aNWU2MXh2UmFGTHErL1NyOFR6RkgvODJidDd0L2NNeCs4N08vUXpjZmZ3OEhCUE55VGRnUDIrZS9lTlVpa0szTzVxRTRpYWlmeHppT3J6aUpXVnlaVkp4UHJNdyttdk81KzBZanRqVWx6NTZNT1BYNkI0Ly9OU28vSGRuVHZmOXpZM04zdTkvZlgxOVh2MzdrOWk2SlhKK3pNY0Y2WTVmdXgwMXRZNmE1MVdxelhXY3JTL0FHU2hqNW5vR3JaTUFBQUFBRWxGVGtTdVFtQ0MiPgogICAgICA8L2Rpdj4KCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8Zm9ybSBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIGlkPSJzZWFyY2giIGFjdGlvbj0iL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxsYWJlbCBmb3I9InNlYXJjaCI+RmluZCBjb2RlLCBwcm9qZWN0cywgYW5kIHBlb3BsZSBvbiBHaXRIdWI6PC9sYWJlbD4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSI+CgogICAgICAgIDxpbnB1dCBjbGFzcz0iYnRuIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPgogICAgICA8L2Zvcm0+CgogICAgICA8ZGl2IGlkPSJzdWdnZXN0aW9ucyI+CiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvbnRhY3QiPkNvbnRhY3QgU3VwcG9ydDwvYT4gJm1kYXNoOwogICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vc3RhdHVzLmdpdGh1Yi5jb20iPkdpdEh1YiBTdGF0dXM8L2E+ICZtZGFzaDsKICAgICAgICA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2dpdGh1YnN0YXR1cyI+QGdpdGh1YnN0YXR1czwvYT4KICAgICAgPC9kaXY+CgogICAgICA8YSBocmVmPSIvIiBjbGFzcz0ibG9nbyBsb2dvLWltZy0xeCI+CiAgICAgICAgPGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHRpdGxlPSIiIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVJwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1RXRmphVzUwYjNOb0tTSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZNVFpDUkRZM1JFSXpSakF4TVVVeVFVUXpSRUl4UXpSRU5VRkZOVU01TmlJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk1UWkNSRFkzUlVJelJqQXhNVVV5UVVRelJFSXhRelJFTlVGRk5VTTVOaUkrSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2tVeE5rSkVOamRDUWpOR01ERXhSVEpCUkRORVFqRkRORVExUVVVMVF6azJJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1V4TmtKRU5qZERRak5HTURFeFJUSkJSRE5FUWpGRE5FUTFRVVUxUXprMklpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtTTTlNQ0FBQUErNUpSRUZVZU5yRVYxMUlrMUVZM3M0K2RkT3AyOVE1YjBvcENnS0Zzb0tvaTVLZzZDSWh1d2k2ekxKTG9ZTG9wcTRxc0tLZ2k0aTZDWUlvVS9xNWlEQUtzNnN5b1M3NklSV3R5SitwN2NkdDdzZjFQR09EK2UwYzNkeWdBeC82N1p6elBNOTUvODc3R1lkSFJnM1pqTVhGeGVwUUtOUzZzTEN3SnhxTk51RnBpTWZqVnM0WmpVYS9wbW1qZUQ2VmxKUzhOcHZOVDRRUTdteHdqU3NKaUVRaW0vMSsvOWxnTUhnSXI1b2h1eEcxV0N3OVZxdjFjbEZSMGRDcUJPREVsVjZ2OTBvZ0VEakdkWWJWalhocGFlbmRpb3FLMDdDSVI3WkFxRTQ5UFQwOUJQTDJQTWdUQnlRR3NZaVpsUUQ0dU1YdGRyK0p4V0lOaGdJTlloR1QyTXNLZ01ybTJkblpYZ1JYaGFIQWc1akVKb2RVQUh4dXg0THVkSEpFOVJkRWRBK2kzSnV6N2JHSGU0bWhFOUZOcmd3QkNMaXJNRlY5T2toNWVmbEZoOFBSNW5LNW5EYWJyUjJCTkpsS08wVDM1K0xpNG40Ky9KKy9KUUN4aG11NWgzdUpvWE5IUGJtV1pBSE1zaFdCOGw1L2lwcWFtbWFBZjB6UEREeDFPTlYzdnVyZGlkcXdBUUwrcEVjOHNMY0FlMUNDdlEzWUh4SVc4UGw4NXhTV05DMWhBRERJdjBySUUvbzRKMGsza3d3NHhTbHdJaGNxM0VGRk9tN0tOL2hVR09Ra3QwQ0ZhNVdwTkpsTXZ4QkV6L0lWUUF4Zy9aUlpsOXdpSEE2M3lEWWllTTdEbkxQNUNpQUdzQzdJNXNndFlLSkdXZTJBOHNlRnFnRkpySmpFUFkxQ24zcEo4LzlXMWU1VldzRkRURW1GckJjb0RoWkpFUWtYdWhJQ015S3BqaGFocU4yMWhSWUFUS2ZVT2xEbWt5Z3JSNG80QzBWT0xHSktyT0lUS0I0amlqemRYeWdCS2l4eUM1VERRZG5rL1B6OHFSdzZvT1dHbHNUS0dPUVc2T0g2RkJXc3llUHhkT1hMVGd4aXllYklMWkNqeitHTGdNSUtuWE56YzQ5WU1sY1JkSFhjU3d4RlZnVEluUWhDOUczM1VoTm9KTHVxcTZ0MzQ1cDl5M2VVeThPVGs1UGpBSHVJOXVvNGIwN0ZCYU9oc3UwQTRVbmMrVDFUVTFOajNLc1NTRTV5SjY1anFGMkREZDhRcVdZbUFacklNMlZsWlRkblptYjZBYnBkVjlWNmVjOXpuZjVRN0hqWXVtZFJFMEpPcDNNaml0TzRTRmErY1p6OFVtcWUzVENiU0x2ZGZrUi9rV0RkTlFsNUludVRjeXNPY3BGVDM1WnJiQnh4NHAzSkFIbFpWVlcxRC82MzRWUnQrRnZMQmdLL3Y1TFY5V1MrMTB4TVRFd3RSdzdYdnFPTCtlMlE4VjNBWUlPSUFYUTI2L2hlV1ZuWkNWZmN5S0hnMkNCZ1RwbVBtallNOGwyNEd5YVVIeWFJaDdYd2ZSOUVyRThxSG9EZm4yTFROQVZDMEhYNk1GY0JJUDhCaSs2RjZjZFcvRElDa0FOUmZ4OTlmRVlGUTdOcGg1aS91UWlBMjE0Z25vN0srZ3VoYWlLZzlnQzYyK004ZVI3WHNCc1lKNGlsYW02MEZiN3I3dUFqOHdGeXV3TTFvSU9XZ2ZtRHk2UlhFRVF6Sk1QZTIzRFhyVlM3cnR5RDNEZjh6L0ZQZ0FFQXpXVTVLdTU5WkFVQUFBQUFTVVZPUks1Q1lJST0iPgogICAgICA8L2E+CgogICAgICA8YSBocmVmPSIvIiBjbGFzcz0ibG9nbyBsb2dvLWltZy0yeCI+CiAgICAgICAgPGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHRpdGxlPSIiIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVJwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1RXRmphVzUwYjNOb0tTSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEVRVU0xUWtVeFJVSTBNVU14TVVVeVFVUXpSRUl4UXpSRU5VRkZOVU01TmlJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRVFVTTFRa1V4UmtJME1VTXhNVVV5UVVRelJFSXhRelJFTlVGRk5VTTVOaUkrSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2tVeE5rSkVOamRHUWpOR01ERXhSVEpCUkRORVFqRkRORVExUVVVMVF6azJJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1V4TmtKRU5qZ3dRak5HTURFeFJUSkJSRE5FUWpGRE5FUTFRVVUxUXprMklpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtoZlBSYVFBQUI2bEpSRUZVZU5yc1cybU1FMlVZYm9kdHQrMjIyMnUzNVFoZW9DQ1lHQlFsaWdJSmdrWkpOUHpnaWdvYVRFajhBZEZFTWZBRGZ5QUJrZ1dpaVdjaWVLNFMrUU9pSEFZVWoyaE1OS2dZbEV1anBOdHR1OXZ0dGJ2ZHcrY2hVMUs2TTUzNXB0M3ViSENTeWV6UitiNzNlYjczK3Q3dnJmWHN1Zk9XNGJ6Nit2b205L2IyM292bk5OdzM0YjV4WUdBZ09EZzQ2TWJ0NG1lc1Ztc1dkMXFTcEhoZFhkMmZ1UC9BZmNwdXQ1L0E4OHh3eW1jZEJnTHFlbnA2RnVSeXVXVjR6dS92NzU5UXlXQmp4b3o1dDc2Ky9ndW4wOW1LNXhGeWFrb0NBUFNhVENhek5wdk5Qb1lWYmg2TzFZS0dSRjB1MTNzTkRRMjdRTXpmcGlBQUtqMGxuVTYvZ0JWZkFaVzJXV3B3d1Z6eTBJZ1AzRzczRnBqSTZSRWhBR0E5cVZScUExYjltVm9CVnlJQzJ0RGk4WGcyNCtkVXpRaUFiUy9zN094OEcyby8zbUtDQytadzBlZnpQUUVmY1ZqWXJBUlgzZGJWMWJVdEhvOGZNZ3Q0MmYrTXAweVVUVlFiZFdzQUhWc2lrZGlIa0hhUHhjUVhRdWZYZ1VCZ01SeG1lOVUwQUF4Zkg0dkZ2ak03ZUY2VWtiSlM1cW9Rd0VRR0E1N0FjNUpsbEZ5VVZaWjVja1VFZ01WeHNLMmpsU1l6SStRWEpzaXlqek5FQUp5SkF6Yi9LUWE0MWpKS0w4cE9ETVFpVEVBeW1YdzVuOC9QMElqRDNiaDdSZ29nNTlhYW54aUlSVFZ2Vi9vajB0bkhjYS9XTXJWd09Ed0IzcmFUR3h6a0JnL2duWlZhcEZWNjJXeTJuNUFPNzBITS81d2JKMFFuWHlRU2FWUERJdU5aelkwVjNudEhNd3hpd0hBMEdqMk5wN2VjSUJEZ2FEQVlYS0NRSk0xRGhyZ0ozbmh1bGNQYmw4ajRObUhlNDZYL2c2MGZ3YnozYWV3amtxRlFhQXFlYldVMUFPcXlRd3Q4SWQ2cUVITWM5N3p1N3U3RkdHc243SEFpVnVvc1Z3N1AzNUMxbmNjZGdTQ3hvcDFkSGVac3dtZkhNbnhCbzZaVGsrak44ZGwvdkY3dldvZkRzYStNTE45b0VVQk14T2IzKzFlb0VzQlZ3NlptdWE0OXI4WW1oQUtEaUVQY013QnN4TWlxUStpeHpQRnhaeXFScFhBUkcvWU9yMU9iRkowZ1Vza1hCYmFtY1IxT0ttTVV2RHhIUkF1OC9MbVkzakZMTVVwRnF6OUh4RzY1c21ZSmR5S3lFQ094RGlFQWUvcDFnakYyb29uaXZaQXN4VmdsMmRhYTRFUVdDVzZKNTVxRkFGRlppSldZTHhOUXkycU9TVXpHUnN5WENVREllbGl3QUhFTzRXU2xXUUJSRm9aYWtYY0ttQ1hteVhBS3MwVmU5dmw4cTQyV29JWXBKVTRoVjNoS2NOczhtOWdsN3AveFE3M2VGNWtCNGo1bU5yV21USlJOd0F6cWlWMUN4alZUWkNJa0VxK1oxYlpGWlNOMkNlbm1WQUZWeTRQbHo4eEtBR1dqakFLRms2bENCTURSL01KakxMTVNRTm00M3hBaVFLVGFBKzkvd2V3aERqTCtKVkkxa2tUU1NPVGNLYk1Ud1BxRVNBb3Q2ZG42RnIxZ0h3VkpqdTZJUnV5aUJ5UHVVVUJBZzVER2tBZ0JteGx2ZGdJRUs5Z0Rrb2hkWS9CSm80Q0FHMFI4bWlSU3NHQUJrZ1ZRczRLWHUwOThJZ1VYU1NSc0ZBb0taaVZBVkRZMldVaWlQVGpZUmk0MUt3R2lzckdzTHRsc3RoOEZpd256MmZCa1F2V2ZSdGxFM2lGMnlXNjMveUNhY1haMWRXMDJHd0d5VEZhUmQ0aWRKbkNLSFJhQ3hZUkhvRzVMVEtUNlN5aVRvUDFmSkhibUFZUFlSUjBVblpRdE1uQTZzMHpnK0daQmx0MEdkbzdFUEhncEUzUTZuWjhZeUxoYzhYajhNSmgvYUtUQVkrNUZQQUtITEU3UmR3dVlKWm1Od3p5Q01rQkNZeUtST0pCTUpsOUIvUFhYQ2pqbUNtRE9WekgzZmlQcE9iRVdHcW9LZTRFQmw4djFobHFzZEx2ZDIzbWt4SE05cGM5a01wbW5vOUhvZVRpaTdld2JIRVpQUHgxenRMUzF0VjNBbkd1TWppTmp2YlFGdUh3NnpEbzVCeTdkVFBBUU5CZ01MclJhclRrU2xzMW1ud1Q3dXdwOXZpcng5UXpiVy9IdVYvajVkL2IrNmpuaUtsbGxQOGxrZU9OSkRrK2RxOUdzUVRuQzRmQjFoZU8wSzQ3SHdlN1dkRHI5bkFLZ1h3T0J3SEkrQzQ1SHRqMWQ2c2Q0MjlUVU5FY21VZGMrUFJhTEhjdm44N2RYVzR1Z3pkc2FHeHVmTDk0TkZ2OXppMUo3R1ZiaGx2YjJkbmFKM1NWcnhmYytuMitOVHNaNy9INy9NcjNnNVhkU0lIeUpTSDFQWis3ZlRveWwyK0VycWlsZ1o0TmFMWUI5Z29WR2FIalI5M0h2MVpyVTRYRHNGVDIwa0gzUE9iemJXazBDZ0cxamFjVklVbkFRYjlGK1ZleHlMTXprcGNMdjBJSlY3QUhRSU9DQVVZSHg3djVxZ1NjbVlIdFRxU0F5WkxFSlRLMjJCaWU0aXEzeHNxcG00U0FmOUhxOWEyRG5KNHVMSzNTRVVMY2RSdnAzaTN6SHlTcXBmaWN4RWRzUWMxTnJsWVhYdlIrTzdxQVNTZXpYQitoMVN1VW9tZ2c5TEw4QlVvVjQ3NDlFSW9sS2grRWlxV21xVkVabERnSGtzMnB4SHc3eFRxVVF3OUo1TmNBWE9LMTBBR0lvWjZabGk2Slk2WjFRNDYxS29aNE5pS0xIYXJXK0tEc3hsRFVQSFo1elBRWnFVVkRQSnNUcWI1bjltYWxicEFoOEMyWFhETGw2MitXWklERlJVbE5WT2l3ZW5jbk5VM2FRRWtMK2NETVNvTHZabzJmUUI3QUpzc05BdUZ1dm9ybERWVmtrZzJJODcram8ySzJRQVZwaERyZnlWaUs1VnF0TzM0T2theFhDcCs3ZHJkREJDQWR1Ym02ZWlkWCsyV3dxVDVrb213aDRZUUxrK0g0YUU5M2g4WGcyZ3ZIZWtRWk9HU2dMWlRMeURUTEo0THg5L0taV0tCU2FpblQ0SXkzRnFRQmZuVVpSNDJQS1FGa3NCcjlRS1ZYQ1B1c0QzT2lBL1JrUTVrUDhxVi9KbDFXeXdBcC82K2RjbVBNMnpMMVVyVWFoZTRKcWZuV1dLWEl1bDN1VWJmUDhuakFGTFcxT0ZyM2dkRnRaNzJjTkgrUHRRVDcvYnJXK05YcUpBSGgweTlWOC9VL0ExVTdBZndJTUFEN21TM3BDYnVXSkFBQUFBRWxGVGtTdVFtQ0MiPgogICAgICA8L2E+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvX2Vycm9yLmpzIj48L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K) + format("svg"); + font-weight: normal; + font-style: normal; + } + .octicon, + .mega-octicon { + font: normal normal normal 16px/1 octicons; + display: inline-block; + text-decoration: none; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .mega-octicon { + font-size: 32px; + } + .octicon-alert:before { + content: "\f02d"; + } + .octicon-alignment-align:before { + content: "\f08a"; + } + .octicon-alignment-aligned-to:before { + content: "\f08e"; + } + .octicon-alignment-unalign:before { + content: "\f08b"; + } + .octicon-arrow-down:before { + content: "\f03f"; + } + .octicon-arrow-left:before { + content: "\f040"; + } + .octicon-arrow-right:before { + content: "\f03e"; + } + .octicon-arrow-small-down:before { + content: "\f0a0"; + } + .octicon-arrow-small-left:before { + content: "\f0a1"; + } + .octicon-arrow-small-right:before { + content: "\f071"; + } + .octicon-arrow-small-up:before { + content: "\f09f"; + } + .octicon-arrow-up:before { + content: "\f03d"; + } + .octicon-beer:before { + content: "\f069"; + } + .octicon-book:before { + content: "\f007"; + } + .octicon-bookmark:before { + content: "\f07b"; + } + .octicon-briefcase:before { + content: "\f0d3"; + } + .octicon-broadcast:before { + content: "\f048"; + } + .octicon-browser:before { + content: "\f0c5"; + } + .octicon-bug:before { + content: "\f091"; + } + .octicon-calendar:before { + content: "\f068"; + } + .octicon-check:before { + content: "\f03a"; + } + .octicon-checklist:before { + content: "\f076"; + } + .octicon-chevron-down:before { + content: "\f0a3"; + } + .octicon-chevron-left:before { + content: "\f0a4"; + } + .octicon-chevron-right:before { + content: "\f078"; + } + .octicon-chevron-up:before { + content: "\f0a2"; + } + .octicon-circle-slash:before { + content: "\f084"; + } + .octicon-circuit-board:before { + content: "\f0d6"; + } + .octicon-clippy:before { + content: "\f035"; + } + .octicon-clock:before { + content: "\f046"; + } + .octicon-cloud-download:before { + content: "\f00b"; + } + .octicon-cloud-upload:before { + content: "\f00c"; + } + .octicon-code:before { + content: "\f05f"; + } + .octicon-color-mode:before { + content: "\f065"; + } + .octicon-comment-add:before, + .octicon-comment:before { + content: "\f02b"; + } + .octicon-comment-discussion:before { + content: "\f04f"; + } + .octicon-credit-card:before { + content: "\f045"; + } + .octicon-dash:before { + content: "\f0ca"; + } + .octicon-dashboard:before { + content: "\f07d"; + } + .octicon-database:before { + content: "\f096"; + } + .octicon-device-camera:before { + content: "\f056"; + } + .octicon-device-camera-video:before { + content: "\f057"; + } + .octicon-device-desktop:before { + content: "\f27c"; + } + .octicon-device-mobile:before { + content: "\f038"; + } + .octicon-diff:before { + content: "\f04d"; + } + .octicon-diff-added:before { + content: "\f06b"; + } + .octicon-diff-ignored:before { + content: "\f099"; + } + .octicon-diff-modified:before { + content: "\f06d"; + } + .octicon-diff-removed:before { + content: "\f06c"; + } + .octicon-diff-renamed:before { + content: "\f06e"; + } + .octicon-ellipsis:before { + content: "\f09a"; + } + .octicon-eye-unwatch:before, + .octicon-eye-watch:before, + .octicon-eye:before { + content: "\f04e"; + } + .octicon-file-binary:before { + content: "\f094"; + } + .octicon-file-code:before { + content: "\f010"; + } + .octicon-file-directory:before { + content: "\f016"; + } + .octicon-file-media:before { + content: "\f012"; + } + .octicon-file-pdf:before { + content: "\f014"; + } + .octicon-file-submodule:before { + content: "\f017"; + } + .octicon-file-symlink-directory:before { + content: "\f0b1"; + } + .octicon-file-symlink-file:before { + content: "\f0b0"; + } + .octicon-file-text:before { + content: "\f011"; + } + .octicon-file-zip:before { + content: "\f013"; + } + .octicon-flame:before { + content: "\f0d2"; + } + .octicon-fold:before { + content: "\f0cc"; + } + .octicon-gear:before { + content: "\f02f"; + } + .octicon-gift:before { + content: "\f042"; + } + .octicon-gist:before { + content: "\f00e"; + } + .octicon-gist-secret:before { + content: "\f08c"; + } + .octicon-git-branch-create:before, + .octicon-git-branch-delete:before, + .octicon-git-branch:before { + content: "\f020"; + } + .octicon-git-commit:before { + content: "\f01f"; + } + .octicon-git-compare:before { + content: "\f0ac"; + } + .octicon-git-merge:before { + content: "\f023"; + } + .octicon-git-pull-request-abandoned:before, + .octicon-git-pull-request:before { + content: "\f009"; + } + .octicon-globe:before { + content: "\f0b6"; + } + .octicon-graph:before { + content: "\f043"; + } + .octicon-heart:before { + content: "\2665"; + } + .octicon-history:before { + content: "\f07e"; + } + .octicon-home:before { + content: "\f08d"; + } + .octicon-horizontal-rule:before { + content: "\f070"; + } + .octicon-hourglass:before { + content: "\f09e"; + } + .octicon-hubot:before { + content: "\f09d"; + } + .octicon-inbox:before { + content: "\f0cf"; + } + .octicon-info:before { + content: "\f059"; + } + .octicon-issue-closed:before { + content: "\f028"; + } + .octicon-issue-opened:before { + content: "\f026"; + } + .octicon-issue-reopened:before { + content: "\f027"; + } + .octicon-jersey:before { + content: "\f019"; + } + .octicon-jump-down:before { + content: "\f072"; + } + .octicon-jump-left:before { + content: "\f0a5"; + } + .octicon-jump-right:before { + content: "\f0a6"; + } + .octicon-jump-up:before { + content: "\f073"; + } + .octicon-key:before { + content: "\f049"; + } + .octicon-keyboard:before { + content: "\f00d"; + } + .octicon-law:before { + content: "\f0d8"; + } + .octicon-light-bulb:before { + content: "\f000"; + } + .octicon-link:before { + content: "\f05c"; + } + .octicon-link-external:before { + content: "\f07f"; + } + .octicon-list-ordered:before { + content: "\f062"; + } + .octicon-list-unordered:before { + content: "\f061"; + } + .octicon-location:before { + content: "\f060"; + } + .octicon-gist-private:before, + .octicon-mirror-private:before, + .octicon-git-fork-private:before, + .octicon-lock:before { + content: "\f06a"; + } + .octicon-logo-github:before { + content: "\f092"; + } + .octicon-mail:before { + content: "\f03b"; + } + .octicon-mail-read:before { + content: "\f03c"; + } + .octicon-mail-reply:before { + content: "\f051"; + } + .octicon-mark-github:before { + content: "\f00a"; + } + .octicon-markdown:before { + content: "\f0c9"; + } + .octicon-megaphone:before { + content: "\f077"; + } + .octicon-mention:before { + content: "\f0be"; + } + .octicon-microscope:before { + content: "\f089"; + } + .octicon-milestone:before { + content: "\f075"; + } + .octicon-mirror-public:before, + .octicon-mirror:before { + content: "\f024"; + } + .octicon-mortar-board:before { + content: "\f0d7"; + } + .octicon-move-down:before { + content: "\f0a8"; + } + .octicon-move-left:before { + content: "\f074"; + } + .octicon-move-right:before { + content: "\f0a9"; + } + .octicon-move-up:before { + content: "\f0a7"; + } + .octicon-mute:before { + content: "\f080"; + } + .octicon-no-newline:before { + content: "\f09c"; + } + .octicon-octoface:before { + content: "\f008"; + } + .octicon-organization:before { + content: "\f037"; + } + .octicon-package:before { + content: "\f0c4"; + } + .octicon-paintcan:before { + content: "\f0d1"; + } + .octicon-pencil:before { + content: "\f058"; + } + .octicon-person-add:before, + .octicon-person-follow:before, + .octicon-person:before { + content: "\f018"; + } + .octicon-pin:before { + content: "\f041"; + } + .octicon-playback-fast-forward:before { + content: "\f0bd"; + } + .octicon-playback-pause:before { + content: "\f0bb"; + } + .octicon-playback-play:before { + content: "\f0bf"; + } + .octicon-playback-rewind:before { + content: "\f0bc"; + } + .octicon-plug:before { + content: "\f0d4"; + } + .octicon-repo-create:before, + .octicon-gist-new:before, + .octicon-file-directory-create:before, + .octicon-file-add:before, + .octicon-plus:before { + content: "\f05d"; + } + .octicon-podium:before { + content: "\f0af"; + } + .octicon-primitive-dot:before { + content: "\f052"; + } + .octicon-primitive-square:before { + content: "\f053"; + } + .octicon-pulse:before { + content: "\f085"; + } + .octicon-puzzle:before { + content: "\f0c0"; + } + .octicon-question:before { + content: "\f02c"; + } + .octicon-quote:before { + content: "\f063"; + } + .octicon-radio-tower:before { + content: "\f030"; + } + .octicon-repo-delete:before, + .octicon-repo:before { + content: "\f001"; + } + .octicon-repo-clone:before { + content: "\f04c"; + } + .octicon-repo-force-push:before { + content: "\f04a"; + } + .octicon-gist-fork:before, + .octicon-repo-forked:before { + content: "\f002"; + } + .octicon-repo-pull:before { + content: "\f006"; + } + .octicon-repo-push:before { + content: "\f005"; + } + .octicon-rocket:before { + content: "\f033"; + } + .octicon-rss:before { + content: "\f034"; + } + .octicon-ruby:before { + content: "\f047"; + } + .octicon-screen-full:before { + content: "\f066"; + } + .octicon-screen-normal:before { + content: "\f067"; + } + .octicon-search-save:before, + .octicon-search:before { + content: "\f02e"; + } + .octicon-server:before { + content: "\f097"; + } + .octicon-settings:before { + content: "\f07c"; + } + .octicon-log-in:before, + .octicon-sign-in:before { + content: "\f036"; + } + .octicon-log-out:before, + .octicon-sign-out:before { + content: "\f032"; + } + .octicon-split:before { + content: "\f0c6"; + } + .octicon-squirrel:before { + content: "\f0b2"; + } + .octicon-star-add:before, + .octicon-star-delete:before, + .octicon-star:before { + content: "\f02a"; + } + .octicon-steps:before { + content: "\f0c7"; + } + .octicon-stop:before { + content: "\f08f"; + } + .octicon-repo-sync:before, + .octicon-sync:before { + content: "\f087"; + } + .octicon-tag-remove:before, + .octicon-tag-add:before, + .octicon-tag:before { + content: "\f015"; + } + .octicon-telescope:before { + content: "\f088"; + } + .octicon-terminal:before { + content: "\f0c8"; + } + .octicon-three-bars:before { + content: "\f05e"; + } + .octicon-thumbsdown:before { + content: "\f0db"; + } + .octicon-thumbsup:before { + content: "\f0da"; + } + .octicon-tools:before { + content: "\f031"; + } + .octicon-trashcan:before { + content: "\f0d0"; + } + .octicon-triangle-down:before { + content: "\f05b"; + } + .octicon-triangle-left:before { + content: "\f044"; + } + .octicon-triangle-right:before { + content: "\f05a"; + } + .octicon-triangle-up:before { + content: "\f0aa"; + } + .octicon-unfold:before { + content: "\f039"; + } + .octicon-unmute:before { + content: "\f0ba"; + } + .octicon-versions:before { + content: "\f064"; + } + .octicon-remove-close:before, + .octicon-x:before { + content: "\f081"; + } + .octicon-zap:before { + content: "\26A1"; + } + .date_selector { + width: 225px; + text-align: left; + text-decoration: none; + z-index: 9; + display: none; + } + .date_selector .month_nav, + .date_selector .year_nav { + margin-top: 5px; + margin-bottom: 5px; + padding: 0; + display: block; + position: relative; + text-align: center; + line-height: 20px; + } + .date_selector .month_nav { + float: left; + width: 55%; + } + .date_selector .year_nav { + float: right; + width: 35%; + } + .date_selector .date-button { + position: absolute; + top: 0; + width: 18px; + height: 18px; + padding: 4px; + color: #4078c0; + font-size: 12px; + cursor: pointer; + line-height: 12px; + } + .date_selector .prev { + left: 0; + } + .date_selector .next { + right: 0; + } + .date_selector table { + width: 100%; + clear: both; + } + .date_selector tr { + font-size: 0; + } + .date_selector th, + .date_selector td { + width: 32px; + height: 32px; + line-height: 28px; + padding: 0; + text-align: center; + font-weight: normal; + display: inline-block; + font-size: 12px; + margin-top: -1px; + margin-left: -1px; + } + .date_selector td { + border: 1px solid #ccc; + color: #4078c0; + background: #fff; + cursor: default; + } + .date_selector td.today { + background: #eee; + } + .date_selector td.selected, + .date_selector td.selectable_day:hover { + background: #4078c0; + color: #fff; + border-color: #33609a; + z-index: 10; + position: relative; + cursor: pointer; + } + .date_selector td.unselected_month { + color: #ccc; + } + .jcrop-holder { + direction: ltr; + text-align: left; + -ms-touch-action: none; + touch-action: none; + } + .jcrop-vline, + .jcrop-hline { + background: #fff url(/images/spinners/Jcrop.gif); + font-size: 0; + position: absolute; + } + .jcrop-vline { + height: 100%; + width: 1px !important; + } + .jcrop-vline.right { + right: 0; + } + .jcrop-hline { + height: 1px !important; + width: 100%; + } + .jcrop-hline.bottom { + bottom: 0; + } + .jcrop-tracker { + height: 100%; + width: 100%; + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .jcrop-handle { + background-color: #333; + border: 1px #eee solid; + width: 7px; + height: 7px; + font-size: 1px; + } + .jcrop-handle.ord-n { + left: 50%; + margin-left: -4px; + margin-top: -4px; + top: 0; + } + .jcrop-handle.ord-s { + bottom: 0; + left: 50%; + margin-bottom: -4px; + margin-left: -4px; + } + .jcrop-handle.ord-e { + margin-right: -4px; + margin-top: -4px; + right: 0; + top: 50%; + } + .jcrop-handle.ord-w { + left: 0; + margin-left: -4px; + margin-top: -4px; + top: 50%; + } + .jcrop-handle.ord-nw { + left: 0; + margin-left: -4px; + margin-top: -4px; + top: 0; + } + .jcrop-handle.ord-ne { + margin-right: -4px; + margin-top: -4px; + right: 0; + top: 0; + } + .jcrop-handle.ord-se { + bottom: 0; + margin-bottom: -4px; + margin-right: -4px; + right: 0; + } + .jcrop-handle.ord-sw { + bottom: 0; + left: 0; + margin-bottom: -4px; + margin-left: -4px; + } + .jcrop-dragbar.ord-n, + .jcrop-dragbar.ord-s { + height: 7px; + width: 100%; + } + .jcrop-dragbar.ord-e, + .jcrop-dragbar.ord-w { + height: 100%; + width: 7px; + } + .jcrop-dragbar.ord-n { + margin-top: -4px; + } + .jcrop-dragbar.ord-s { + bottom: 0; + margin-bottom: -4px; + } + .jcrop-dragbar.ord-e { + margin-right: -4px; + right: 0; + } + .jcrop-dragbar.ord-w { + margin-left: -4px; + } + .jcrop-light .jcrop-vline, + .jcrop-light .jcrop-hline { + background: #fff; + opacity: 0.7 !important; + } + .jcrop-light .jcrop-handle { + background-color: #000; + border-color: #fff; + border-radius: 3px; + } + .jcrop-dark .jcrop-vline, + .jcrop-dark .jcrop-hline { + background: #000; + opacity: 0.7 !important; + } + .jcrop-dark .jcrop-handle { + background-color: #fff; + border-color: #000; + border-radius: 3px; + } + .jcrop-holder img, + img.jcrop-preview { + max-width: none; + } + .code-frequency .addition { + fill-opacity: 1; + fill: #6cc644; + } + .code-frequency .deletion { + fill-opacity: 1; + fill: #bd2c00; + } + .cadd { + font-weight: bold; + color: #6cc644; + } + .cdel { + font-weight: bold; + color: #bd2c00; + } + .commit-activity-graphs .dots { + display: none; + } + #commit-activity-master { + margin-top: 20px; + } + .is-graph-loading #commit-activity-master { + display: none; + } + rect { + shape-rendering: crispedges; + } + rect.max { + fill: #ffc644; + } + g.bar { + fill: #1db34f; + } + g.mini { + fill: #f17f49; + } + g.active rect { + fill: #bd380f; + } + circle.focus { + fill: #555; + } + .dot text { + stroke: none; + fill: #555; + } + .tint-box { + border-radius: 6px; + background: #f3f3f3; + position: relative; + margin-bottom: 10px; + } + .tint-box.transparent { + background: #fff; + } + .tint-box .activity { + margin-top: 0; + padding-top: 100px; + } + .contrib-data { + margin: 0 0 10px; + list-style: none; + padding: 0; + } + #contributors .capped-card .avatar { + float: left; + width: 32px; + height: 32px; + margin-right: 5px; + } + #contributors .capped-card h3 { + font-weight: normal; + } + #contributors .capped-card .ameta { + display: block; + font-size: 12px; + color: #ccc; + } + #contributors .capped-card .rank { + float: right; + color: #767676; + font-size: 13px; + } + #contributors .capped-card .cmt { + color: #767676; + } + #contributors .capped-card path { + fill: #f17f49; + } + #contributors .capped-card .midlabel { + fill: #ccc; + } + .d { + color: #bd2c00; + } + .a { + color: #6cc644; + } + .axis { + fill: #aaa; + font-size: 10px; + } + .axis line { + shape-rendering: crispedges; + stroke: #eee; + } + .axis path { + display: none; + } + .axis .zero line { + stroke-width: 1.5; + stroke: #4078c0; + stroke-dasharray: 3 3; + } + .graphs .is-graph-loading { + min-height: 500px; + } + .graphs.wheader h2 { + padding: 1px; + } + .graphs .area { + fill: #1db34f; + fill-opacity: 0.5; + } + .graphs .path { + stroke: #1db34f; + stroke-width: 2px; + stroke-opacity: 1; + fill: none; + } + .graphs .dot { + fill: #1db34f; + stroke: #16873c; + stroke-width: 2px; + } + .graphs .dot.padded { + stroke: #fff; + stroke-width: 1px; + } + .graphs .dot.padded circle:hover { + fill: #4078c0; + } + .graphs .d3-tip { + fill: #333; + } + .graphs .d3-tip text { + fill: #fff; + font-size: 11px; + } + .graphs .dir { + font-size: 12px; + font-weight: normal; + color: #555; + line-height: 100%; + padding-top: 5px; + float: right; + } + .graphs .selection rect { + fill: #333; + fill-opacity: 0.1; + stroke: #333; + stroke-width: 1px; + stroke-opacity: 0.4; + shape-rendering: crispedges; + stroke-dasharray: 3 3; + } + .graph-filter h3 { + display: inline-block; + margin: 10px 0 0; + font-weight: 300; + font-size: 24px; + } + .graph-filter .info { + margin-top: 5px; + margin-bottom: 20px; + color: #767676; + } + .graph-filter .select-menu { + float: right; + margin-top: 13px; + } + h2.ghead:after { + content: "."; + height: 0; + display: block; + visibility: hidden; + clear: both; + } + .graph-canvas .activity { + text-align: center; + width: 400px; + margin: 100px auto 0; + color: #444; + border-radius: 3px; + padding: 10px; + } + .graph-canvas .error { + color: #900; + background: #feeaea; + padding: 10px; + border-radius: 3px; + } + .graph-canvas .dots { + margin: 0 auto; + } + .graph-canvas > .activity { + display: none; + } + .graph-loading, + .graph-error, + .graph-no-usable-data, + .graph-empty { + display: none; + } + .graph-canvas.is-graph-loading > .activity, + .graph-canvas.is-graph-without-usable-data > .activity, + .graph-canvas.is-graph-empty > .activity { + display: block; + } + .is-graph-loading .graph-loading, + .is-graph-empty .graph-empty, + .is-graph-without-usable-data .graph-no-usable-data, + .is-graph-load-error .graph-error { + display: block; + } + .svg-tip { + padding: 10px; + background: rgba(0, 0, 0, 0.8); + color: #bbb; + font-size: 12px; + position: absolute; + z-index: 99999; + text-align: center; + border-radius: 3px; + } + .svg-tip strong { + color: #ddd; + } + .svg-tip.is-visible { + display: block; + } + .svg-tip:after { + box-sizing: border-box; + position: absolute; + left: 50%; + height: 5px; + width: 5px; + bottom: -10px; + margin: 0 0 0 -5px; + content: " "; + border: 5px solid transparent; + border-top-color: rgba(0, 0, 0, 0.8); + } + .svg-tip.comparison { + text-align: left; + pointer-events: none; + padding: 0; + } + .svg-tip.comparison .title { + display: block; + padding: 10px; + margin: 0; + line-height: 1; + font-weight: bold; + pointer-events: none; + } + .svg-tip.comparison ul { + list-style: none; + margin: 0; + white-space: nowrap; + } + .svg-tip.comparison li { + display: inline-block; + padding: 10px; + } + .svg-tip.comparison li:first-child { + border-top: 3px solid #1db34f; + border-right: 1px solid #333; + } + .svg-tip.comparison li:last-child { + border-top: 3px solid #1d7fb3; + } + .svg-tip-one-line { + white-space: nowrap; + } + .day-name { + fill: #555; + } + circle.day { + stroke-width: 0; + fill: #444; + } + circle.day:hover { + fill: #4078c0; + } + line.axis { + stroke-width: 1; + stroke: #eee; + shape-rendering: crispedges; + } + line.axis.even { + stroke: #e0e0e0; + } + .traffic-graph { + min-height: 150px; + } + .traffic-graph .activity { + margin-top: 0; + } + .traffic-graph .activity .dots { + margin-top: 40px; + } + .traffic-graph .path { + fill: none; + stroke-width: 2; + } + .traffic-graph path.total { + stroke: #1db34f; + } + .traffic-graph path.unique { + stroke: #1d7fb3; + } + .traffic-graph .x.axis .tick:first-child line { + stroke: #1db34f; + stroke-width: 2px; + } + .traffic-graph .y line { + stroke: #1db34f; + } + .traffic-graph .y.unique line { + stroke: #1d7fb3; + } + .traffic-graph .overlay { + fill-opacity: 0; + } + .uniques-graph .x.axis .tick:nth-child(14) line { + stroke: #1d7fb3; + stroke-width: 2px; + } + .svg-tip .date { + color: #fff; + } + #top-domains .dots { + margin: 167px auto 0; + display: block; + } + #top-domains .favicon { + width: 16px; + height: 16px; + } + table.capped-list { + width: 100%; + line-height: 100%; + } + table.capped-list th { + text-align: left; + padding: 8px; + border-bottom: 1px solid #ddd; + background: #f4f4f4; + } + table.capped-list td { + padding: 8px; + border-bottom: 1px solid #eee; + font-size: 12px; + } + table.capped-list th.middle, + table.capped-list td.middle { + text-align: center; + } + table.capped-list .favicon { + width: 16px; + height: 16px; + vertical-align: middle; + margin: 0 5px; + } + table.capped-list .octicon { + margin-right: 10px; + vertical-align: -1px; + color: #555; + } + table.capped-list tr:nth-child(even) { + background-color: #fcfcfc; + } + table.capped-list.mini-icons .mini-icon { + margin-right: 5px; + color: #555; + } + .capped-list-label { + overflow: hidden; + white-space: nowrap; + max-width: 200px; + text-overflow: ellipsis; + } + .traffic-graph-stats { + border-top: 1px solid #ddd; + } + .traffic-graph-stats .summary-stats { + width: 100%; + } + .traffic-graph-stats .summary-stats:before { + display: table; + content: ""; + } + .traffic-graph-stats .summary-stats:after { + display: table; + clear: both; + content: ""; + } + .traffic-graph-stats .summary-stats li { + width: 50%; + display: block; + float: left; + padding-bottom: 10px; + } + .totals circle { + fill: #1db34f; + stroke: #fff; + stroke-width: 2; + } + .uniques circle { + fill: #1d7fb3; + stroke: #fff; + stroke-width: 2; + } + .top-lists .is-loading { + text-align: center; + margin: 40px; + } + ul.web-views li { + width: 140px; + } + ul.clones li { + width: 170px; + } + .markdown-body { + overflow: hidden; + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, + sans-serif; + font-size: 16px; + line-height: 1.6; + word-wrap: break-word; + } + .markdown-body > *:first-child { + margin-top: 0 !important; + } + .markdown-body > *:last-child { + margin-bottom: 0 !important; + } + .markdown-body a:not([href]) { + color: inherit; + text-decoration: none; + } + .markdown-body .absent { + color: #c00; + } + .markdown-body .anchor { + position: absolute; + top: 0; + left: 0; + display: block; + padding-right: 6px; + padding-left: 30px; + margin-left: -30px; + } + .markdown-body .anchor:focus { + outline: none; + } + .markdown-body h1, + .markdown-body h2, + .markdown-body h3, + .markdown-body h4, + .markdown-body h5, + .markdown-body h6 { + position: relative; + margin-top: 1em; + margin-bottom: 16px; + font-weight: bold; + line-height: 1.4; + } + .markdown-body h1 .octicon-link, + .markdown-body h2 .octicon-link, + .markdown-body h3 .octicon-link, + .markdown-body h4 .octicon-link, + .markdown-body h5 .octicon-link, + .markdown-body h6 .octicon-link { + display: none; + color: #000; + vertical-align: middle; + } + .markdown-body h1:hover .anchor, + .markdown-body h2:hover .anchor, + .markdown-body h3:hover .anchor, + .markdown-body h4:hover .anchor, + .markdown-body h5:hover .anchor, + .markdown-body h6:hover .anchor { + padding-left: 8px; + margin-left: -30px; + text-decoration: none; + } + .markdown-body h1:hover .anchor .octicon-link, + .markdown-body h2:hover .anchor .octicon-link, + .markdown-body h3:hover .anchor .octicon-link, + .markdown-body h4:hover .anchor .octicon-link, + .markdown-body h5:hover .anchor .octicon-link, + .markdown-body h6:hover .anchor .octicon-link { + display: inline-block; + } + .markdown-body h1 tt, + .markdown-body h1 code, + .markdown-body h2 tt, + .markdown-body h2 code, + .markdown-body h3 tt, + .markdown-body h3 code, + .markdown-body h4 tt, + .markdown-body h4 code, + .markdown-body h5 tt, + .markdown-body h5 code, + .markdown-body h6 tt, + .markdown-body h6 code { + font-size: inherit; + } + .markdown-body h1 { + padding-bottom: 0.3em; + font-size: 2.25em; + line-height: 1.2; + border-bottom: 1px solid #eee; + } + .markdown-body h1 .anchor { + line-height: 1; + } + .markdown-body h2 { + padding-bottom: 0.3em; + font-size: 1.75em; + line-height: 1.225; + border-bottom: 1px solid #eee; + } + .markdown-body h2 .anchor { + line-height: 1; + } + .markdown-body h3 { + font-size: 1.5em; + line-height: 1.43; + } + .markdown-body h3 .anchor { + line-height: 1.2; + } + .markdown-body h4 { + font-size: 1.25em; + } + .markdown-body h4 .anchor { + line-height: 1.2; + } + .markdown-body h5 { + font-size: 1em; + } + .markdown-body h5 .anchor { + line-height: 1.1; + } + .markdown-body h6 { + font-size: 1em; + color: #777; + } + .markdown-body h6 .anchor { + line-height: 1.1; + } + .markdown-body p, + .markdown-body blockquote, + .markdown-body ul, + .markdown-body ol, + .markdown-body dl, + .markdown-body table, + .markdown-body pre { + margin-top: 0; + margin-bottom: 16px; + } + .markdown-body hr { + height: 4px; + padding: 0; + margin: 16px 0; + background-color: #e7e7e7; + border: 0 none; + } + .markdown-body ul, + .markdown-body ol { + padding-left: 2em; + } + .markdown-body ul.no-list, + .markdown-body ol.no-list { + padding: 0; + list-style-type: none; + } + .markdown-body ul ul, + .markdown-body ul ol, + .markdown-body ol ol, + .markdown-body ol ul { + margin-top: 0; + margin-bottom: 0; + } + .markdown-body li > p { + margin-top: 16px; + } + .markdown-body dl { + padding: 0; + } + .markdown-body dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight: bold; + } + .markdown-body dl dd { + padding: 0 16px; + margin-bottom: 16px; + } + .markdown-body blockquote { + padding: 0 15px; + color: #777; + border-left: 4px solid #ddd; + } + .markdown-body blockquote > :first-child { + margin-top: 0; + } + .markdown-body blockquote > :last-child { + margin-bottom: 0; + } + .markdown-body table { + display: block; + width: 100%; + overflow: auto; + word-break: normal; + word-break: keep-all; + } + .markdown-body table th { + font-weight: bold; + } + .markdown-body table th, + .markdown-body table td { + padding: 6px 13px; + border: 1px solid #ddd; + } + .markdown-body table tr { + background-color: #fff; + border-top: 1px solid #ccc; + } + .markdown-body table tr:nth-child(2n) { + background-color: #f8f8f8; + } + .markdown-body img { + max-width: 100%; + box-sizing: border-box; + } + .markdown-body .emoji { + max-width: none; + } + .markdown-body span.frame { + display: block; + overflow: hidden; + } + .markdown-body span.frame > span { + display: block; + float: left; + width: auto; + padding: 7px; + margin: 13px 0 0; + overflow: hidden; + border: 1px solid #ddd; + } + .markdown-body span.frame span img { + display: block; + float: left; + } + .markdown-body span.frame span span { + display: block; + padding: 5px 0 0; + clear: both; + color: #333; + } + .markdown-body span.align-center { + display: block; + overflow: hidden; + clear: both; + } + .markdown-body span.align-center > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: center; + } + .markdown-body span.align-center span img { + margin: 0 auto; + text-align: center; + } + .markdown-body span.align-right { + display: block; + overflow: hidden; + clear: both; + } + .markdown-body span.align-right > span { + display: block; + margin: 13px 0 0; + overflow: hidden; + text-align: right; + } + .markdown-body span.align-right span img { + margin: 0; + text-align: right; + } + .markdown-body span.float-left { + display: block; + float: left; + margin-right: 13px; + overflow: hidden; + } + .markdown-body span.float-left span { + margin: 13px 0 0; + } + .markdown-body span.float-right { + display: block; + float: right; + margin-left: 13px; + overflow: hidden; + } + .markdown-body span.float-right > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: right; + } + .markdown-body code, + .markdown-body tt { + padding: 0; + padding-top: 0.2em; + padding-bottom: 0.2em; + margin: 0; + font-size: 85%; + background-color: rgba(0, 0, 0, 0.04); + border-radius: 3px; + } + .markdown-body code:before, + .markdown-body code:after, + .markdown-body tt:before, + .markdown-body tt:after { + letter-spacing: -0.2em; + content: "\00a0"; + } + .markdown-body code br, + .markdown-body tt br { + display: none; + } + .markdown-body del code { + text-decoration: inherit; + } + .markdown-body pre > code { + padding: 0; + margin: 0; + font-size: 100%; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; + } + .markdown-body .highlight { + margin-bottom: 16px; + } + .markdown-body .highlight pre, + .markdown-body pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: #f7f7f7; + border-radius: 3px; + } + .markdown-body .highlight pre { + margin-bottom: 0; + word-break: normal; + } + .markdown-body pre { + word-wrap: normal; + } + .markdown-body pre code, + .markdown-body pre tt { + display: inline; + max-width: initial; + padding: 0; + margin: 0; + overflow: initial; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; + } + .markdown-body pre code:before, + .markdown-body pre code:after, + .markdown-body pre tt:before, + .markdown-body pre tt:after { + content: normal; + } + .markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font-size: 11px; + line-height: 10px; + color: #555; + vertical-align: middle; + background-color: #fcfcfc; + border: solid 1px #ccc; + border-bottom-color: #bbb; + border-radius: 3px; + box-shadow: inset 0 -1px 0 #bbb; + } + .pl-c { + color: #969896; + } + .pl-c1, + .pl-s .pl-v { + color: #0086b3; + } + .pl-e, + .pl-en { + color: #795da3; + } + .pl-s .pl-s1, + .pl-smi { + color: #333; + } + .pl-ent { + color: #63a35c; + } + .pl-k { + color: #a71d5d; + } + .pl-pds, + .pl-s, + .pl-s .pl-pse .pl-s1, + .pl-sr, + .pl-sr .pl-cce, + .pl-sr .pl-sra, + .pl-sr .pl-sre { + color: #183691; + } + .pl-v { + color: #ed6a43; + } + .pl-id { + color: #b52a1d; + } + .pl-ii { + background-color: #b52a1d; + color: #f8f8f8; + } + .pl-sr .pl-cce { + color: #63a35c; + font-weight: bold; + } + .pl-ml { + color: #693a17; + } + .pl-mh, + .pl-mh .pl-en, + .pl-ms { + color: #1d3e81; + font-weight: bold; + } + .pl-mq { + color: #008080; + } + .pl-mi { + color: #333; + font-style: italic; + } + .pl-mb { + color: #333; + font-weight: bold; + } + .pl-md { + background-color: #ffecec; + color: #bd2c00; + } + .pl-mi1 { + background-color: #eaffea; + color: #55a532; + } + .pl-mdr { + color: #795da3; + font-weight: bold; + } + .pl-mo { + color: #1d3e81; + } + .ace_gutter { + background: #ffffff; + color: #999999; + } + .ace_print-margin { + width: 1px; + background: #e8e8e8; + } + .ace-github-light { + background-color: #ffffff; + color: #333333; + } + .ace_cursor { + color: #000000; + } + .ace_marker-layer .ace_selection { + background: #c8c8fa; + } + .ace_multiselect .ace_selection.ace_start { + box-shadow: 0 0 3px 0px #ffffff; + border-radius: 2px; + } + .ace_marker-layer .ace_step { + background: #c6dbae; + } + .ace_marker-layer .ace_bracket { + margin: -1px 0 0 -1px; + border: 1px solid #c0c0c0; + } + .ace_marker-layer .ace_active-line { + background: #f5f5f5; + } + .ace_gutter-active-line { + background-color: #f5f5f5; + } + .ace_marker-layer .ace_selected-word { + border: 1px solid #c8c8fa; + } + .ace_fold { + background-color: #a71d5d; + border-color: #333333; + } + .ace_keyword { + color: #a71d5d; + } + .ace_constant { + color: #0086b3; + } + .ace_support { + color: #0086b3; + } + .ace_support.ace_constant { + color: #0086b3; + } + .ace_support.ace_type { + color: #a71d5d; + } + .ace_storage { + color: #a71d5d; + } + .ace_storage.ace_type { + color: #a71d5d; + } + .ace_invalid.ace_illegal { + text-decoration: underline; + font-style: italic; + color: #f8f8f8; + background-color: #b52a1d; + } + .ace_invalid.ace_deprecated { + text-decoration: underline; + font-style: italic; + color: #b52a1d; + } + .ace_string { + color: #183691; + } + .ace_string.ace_regexp { + color: #183691; + } + .ace_comment { + color: #969896; + } + .ace_variable { + color: #ed6a43; + } + .ace_entity.ace_name { + color: #795da3; + } + .ace_entity.ace_name.ace_tag { + color: #63a35c; + } + .ace_markup.ace_heading { + color: #1d3e81; + } + .ace_markup.ace_list { + color: #693a17; + } + body { + word-wrap: break-word; + } + .focus-content { + width: 620px; + } + #site-container > .container:first-child { + margin-top: 20px; + } + .emoji-icon { + display: inline-block; + height: 20px; + width: 20px; + vertical-align: middle; + background-repeat: no-repeat; + background-size: 20px 20px; + } + .labels { + position: relative; + } + .label { + display: inline-block; + padding: 3px 4px; + font-size: 11px; + font-weight: bold; + line-height: 1; + color: #fff; + border-radius: 2px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.12); + } + .label:hover { + text-decoration: none; + } + .label-admin { + color: #666; + background-color: #eee; + } + .label-generic { + margin-top: -1px; + margin-bottom: -1px; + color: #767676; + font-weight: normal; + background-color: transparent; + border: 1px solid #eee; + box-shadow: none; + } + .label-recommended { + margin-top: -1px; + margin-bottom: -1px; + color: #60b044; + font-weight: normal; + background-color: transparent; + border: 1px solid #60b044; + box-shadow: none; + } + .label-neutral { + background-color: #767676; + } + .label-private { + color: #a1882b; + background-color: #ffefc6; + } + a.label-link { + border: 1px solid transparent; + } + a.label-link:hover { + text-decoration: none; + } + .label-membership-pending { + background-color: #c9510c; + } + .label-review { + color: #4c4a42; + background-color: #fceb9b; + } + .label-success { + background-color: #6cc644; + } + .label-coming-soon { + background-color: #f93; + } + .facebox { + position: absolute; + top: 0; + left: 0; + z-index: 100; + padding-bottom: 40px; + } + .facebox ul { + margin-left: 25px; + margin-bottom: 15px; + } + .facebox .facebox-staff-links { + margin: -15px -15px 15px; + padding: 10px 15px; + background-color: #f5f5f5; + border-bottom: 1px solid #e5e5e5; + } + .facebox .facebox-staff-links li { + display: inline-block; + margin-right: 10px; + color: #767676; + list-style: none; + } + .facebox .facebox-staff-links a { + font-weight: bold; + } + .facebox pre { + padding: 10px; + background-color: #eee; + border: 1px solid #ddd; + border-radius: 3px; + } + .facebox .shortcuts { + width: 860px; + } + .facebox .facebox-user-list { + margin-left: 0; + margin-bottom: 0; + max-height: 400px; + overflow: auto; + } + .facebox .lineprofiler { + width: 900px; + } + .facebox .lineprofiler pre { + overflow-x: scroll; + white-space: pre; + word-wrap: normal; + } + .facebox-popup { + position: relative; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.25); + border-radius: 5px; + box-shadow: 0 0 18px rgba(0, 0, 0, 0.4); + background-clip: padding-box; + } + .facebox-content { + width: 455px; + padding: 15px; + } + .facebox-content:before { + display: table; + content: ""; + } + .facebox-content:after { + display: table; + clear: both; + content: ""; + } + .facebox-close { + position: absolute; + top: 8px; + right: 5px; + padding: 10px; + -webkit-appearance: none; + background-color: transparent; + border: 0; + opacity: 0.25; + cursor: pointer; + } + .facebox-close:hover { + opacity: 1; + } + .facebox-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + .facebox-overlay-hide { + z-index: -100; + } + .facebox-overlay-active { + z-index: 99; + background-color: #000; + } + .facebox-loading { + min-height: 64px; + background-image: url(/images/spinners/octocat-spinner-64.gif); + background-position: center center; + background-repeat: no-repeat; + } + @media only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (min-device-pixel-ratio: 2), + only screen and (min-resolution: 2dppx) { + .facebox-loading { + background-image: url(/images/spinners/octocat-spinner-128.gif); + background-size: 64px 64px; + } + } + .facebox-header { + margin: -15px -15px 15px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; + font-size: 18px; + font-weight: normal; + } + .facebox-footer { + margin: 0 -15px -15px; + padding: 10px 15px; + border-top: 1px solid #e5e5e5; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + background: #fafafa; + text-align: right; + } + .facebox-footer .help { + margin: 0; + text-align: center; + color: #767676; + } + .facebox-alert, + .facebox-danger { + margin: -16px -15px 15px; + padding: 10px 15px; + border-style: solid; + border-width: 1px 0; + } + .facebox-alert { + color: #796620; + background-color: #f8eec7; + border-color: #f2e09a; + } + .facebox-danger { + padding-left: 40px; + color: #9c342e; + background-color: #f7d9d7; + border-color: #f2c4c2; + } + .facebox-danger .octicon { + float: left; + margin-left: -25px; + } + .facebox-separator { + margin: 20px -15px; + } + .facebox-staff-search .hfields { + margin-top: 0; + margin-bottom: 0; + } + .facebox-staff-search .hfields input[type="text"] { + width: 340px; + margin-right: 0; + } + .facebox-staff-search .hfields .btn { + margin-top: 29px; + margin-right: 0; + } + .facebox-staff-search .status-check-list { + float: none; + margin: 15px 0 0; + } + #facebox .billing-credit-cards { + margin: 0 0 15px; + } + #facebox .billing-credit-cards li { + margin: 0 4px 0 0; + } + .keyboard-shortcuts { + float: right; + font-size: 11px; + color: #767676; + } + .keyboard-shortcuts .mini-icon { + position: relative; + top: 2px; + margin-left: 5px; + } + .keyboard-mappings { + font-size: 12px; + color: #555; + } + .keyboard-mappings th { + padding-top: 25px; + font-size: 14px; + line-height: 1.5; + color: #333; + text-align: left; + } + .keyboard-mappings tbody:first-child tr:first-child th { + padding-top: 0; + } + .keyboard-mappings td { + padding-top: 3px; + padding-bottom: 3px; + vertical-align: top; + line-height: 20px; + } + .keyboard-mappings .keys { + padding-right: 10px; + color: #767676; + text-align: right; + white-space: nowrap; + } + .keyboard-mappings .platform-mac { + display: none; + } + .macintosh .keyboard-mappings .platform-mac { + display: inline; + } + .macintosh .keyboard-mappings .platform-other { + display: none; + } + .facebox-user-list-item { + padding: 3px 0; + list-style: none; + font-weight: bold; + vertical-align: middle; + } + .facebox-user-list-item a { + color: #000; + } + .facebox-user-list-item img { + margin-right: 5px; + border-radius: 3px; + vertical-align: middle; + } + .linejump .linejump-input { + width: 340px; + background-color: #fafafa; + } + .linejump .linejump-input, + .linejump .btn { + font-size: 16px; + padding: 10px 15px; + } + .linejump + .facebox-close { + top: 18px; + } + .repo-transfer-tip { + margin-bottom: 0; + } + .user-mention, + .team-mention { + font-weight: bold; + color: #333; + white-space: nowrap; + } + dl.form > dd input[type="text"].is-autocheck-loading, + dl.form > dd input[type="password"].is-autocheck-loading, + dl.form > dd input[type="email"].is-autocheck-loading { + background-image: url(/images/spinners/octocat-spinner-32.gif); + background-size: 16px; + } + dl.form > dd input[type="text"].is-autocheck-successful, + dl.form > dd input[type="password"].is-autocheck-successful, + dl.form > dd input[type="email"].is-autocheck-successful { + background-image: url(/images/modules/ajax/success.png); + } + dl.form > dd input[type="text"].is-autocheck-errored, + dl.form > dd input[type="password"].is-autocheck-errored, + dl.form > dd input[type="email"].is-autocheck-errored { + background-image: url(/images/modules/ajax/error.png); + } + .form-cards { + height: 31px; + margin: 0 0 15px; + } + .form-cards .card { + float: left; + width: 47px; + height: 31px; + text-indent: -9999px; + background-image: url(/images/modules/pricing/credit-cards-@1x.png); + background-position: 0 0; + opacity: 0.6; + } + .form-cards .card.visa { + background-position: 0 0; + } + .form-cards .card.amex { + background-position: -50px 0; + } + .form-cards .card.mastercard { + background-position: -100px 0; + } + .form-cards .card.discover { + background-position: -150px 0; + } + .form-cards .card.jcb { + background-position: -200px 0; + } + .form-cards .card.dinersclub { + background-position: -250px 0; + } + .form-cards .card.enabled { + opacity: 1; + } + .form-cards .card.disabled { + opacity: 0.2; + } + .form-cards > .cards { + margin: 0; + } + .form-cards > .cards > li { + float: left; + margin: 0 4px 0 0; + list-style-type: none; + } + .form-cards > .cards > li.text { + font-size: 11px; + line-height: 31px; + color: #767676; + } + @media only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (min-device-pixel-ratio: 2), + only screen and (min-resolution: 2dppx) { + .form-cards > .cards .card { + background-image: url(/images/modules/pricing/credit-cards-@2x.png); + background-size: 300px 31px; + } + } + .status-indicator-loading { + position: relative; + top: 3px; + width: 16px; + height: 16px; + margin-top: -4px; + background: url(/images/spinners/octocat-spinner-32-EAF2F5.gif) 0 0 + no-repeat; + background-size: 16px; + } + .inline-form { + display: inline-block; + } + .inline-form .btn-plain { + background-color: transparent; + border: 0; + } + html.no-dnd-uploads .drag-and-drop { + min-height: 32px; + } + html.no-dnd-uploads .drag-and-drop .default { + display: none; + } + html.no-dnd-uploads .upload-enabled textarea { + border-bottom: 1px solid #ddd; + } + .drag-and-drop { + padding: 7px 10px; + margin: 0; + font-size: 13px; + line-height: 16px; + color: #767676; + background-color: #fafafa; + border: 1px solid #ccc; + border-top: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + .drag-and-drop .default, + .drag-and-drop .loading, + .drag-and-drop .error { + display: none; + } + .drag-and-drop .error { + color: #bd2c00; + } + .drag-and-drop img { + vertical-align: top; + } + .is-default .drag-and-drop .default { + display: inline-block; + } + .is-uploading .drag-and-drop .loading { + display: inline-block; + } + .is-bad-file .drag-and-drop .bad-file { + display: inline-block; + } + .is-too-big .drag-and-drop .too-big { + display: inline-block; + } + .is-empty .drag-and-drop .empty { + display: inline-block; + } + .is-bad-browser .drag-and-drop .bad-browser { + display: inline-block; + } + .drag-and-drop-error-info { + font-weight: normal; + color: #767676; + } + .drag-and-drop-error-info a { + color: #4078c0; + } + .is-failed .drag-and-drop .failed-request { + display: inline-block; + } + .manual-file-chooser { + position: absolute; + width: 240px; + padding: 5px; + margin-left: -80px; + cursor: pointer; + opacity: 0.0001; + } + .manual-file-chooser:hover + .manual-file-chooser-text { + text-decoration: underline; + } + .btn .manual-file-chooser { + top: 0; + padding: 0; + line-height: 34px; + } + .upload-enabled textarea { + display: block; + border-bottom: 1px dashed #ddd; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + .focused .drag-and-drop { + box-shadow: rgba(81, 167, 232, 0.5) 0 0 3px; + } + .dragover textarea, + .dragover .drag-and-drop { + box-shadow: #c9ff00 0 0 3px; + } + .previewable-comment-form { + position: relative; + } + .previewable-comment-form .tabnav { + position: relative; + padding: 10px 10px 0; + } + .previewable-comment-form .comment { + border: 1px solid #cacaca; + } + .previewable-comment-form .comment-form-error { + margin-bottom: 10px; + } + .previewable-comment-form .write-content, + .previewable-comment-form .preview-content { + display: none; + padding: 0 10px 10px; + } + .previewable-comment-form.write-selected .write-content, + .previewable-comment-form.preview-selected .preview-content { + display: block; + } + .previewable-comment-form textarea { + display: block; + width: 100%; + min-height: 100px; + max-height: 500px; + padding: 10px; + resize: vertical; + } + .previewable-comment-form textarea.fullscreen-contents:focus { + border: 0; + box-shadow: none; + } + div.composer { + margin-top: 0; + border: 0; + } + .composer .comment-form-textarea { + height: 200px; + min-height: 200px; + } + .composer .tabnav { + margin: 0 0 10px; + } + h2.account { + margin: 15px 0 0; + font-size: 18px; + font-weight: normal; + color: #666; + } + p.explain { + position: relative; + font-size: 12px; + color: #666; + } + p.explain strong { + color: #333; + } + p.explain .octicon { + margin-right: 5px; + color: #bbb; + } + p.explain .minibutton { + top: -4px; + float: right; + } + .callout { + padding: 10px; + margin: 15px 0; + font-size: 13px; + color: #4c4a42; + background-color: #fff9ea; + border-color: #dfd8c2; + border-radius: 3px; + } + .callout strong { + font-weight: bold; + color: #000; + } + .callout h2 { + margin: 0; + font-size: 16px; + font-weight: 300; + } + .callout p:last-child { + margin-bottom: 0; + } + .callout p:first-child { + margin-top: 0; + } + .callout hr { + width: 100%; + padding: 0 10px; + margin: 10px 0 10px -10px; + background: transparent; + border-top: 1px solid #e5e2c8; + border-bottom: 1px solid #fff; + } + .infotip { + padding: 10px; + margin: 15px 0; + font-size: 12px; + color: #4c4a42; + background-color: #fff9ea; + border: 1px solid #dfd8c2; + border-radius: 3px; + } + .infotip p { + margin: 0; + } + .infotip p + p { + margin-top: 15px; + } + .dashboard-notice { + position: relative; + padding: 15px 15px 15px 55px; + margin-bottom: 20px; + font-size: 14px; + background-color: #fafafa; + border: solid 1px #d8d8d8; + border-radius: 3px; + } + .dashboard-notice .dismiss { + position: absolute; + top: 10px; + right: 10px; + width: 16px; + height: 16px; + color: #bbb; + cursor: pointer; + } + .dashboard-notice .dismiss:hover { + color: #666; + } + .dashboard-notice .mega-octicon { + position: absolute; + top: 15px; + left: 15px; + } + .dashboard-notice .octicon-organization { + color: #4078c0; + } + .dashboard-notice h2 { + margin-top: 9px; + margin-bottom: 16px; + font-size: 18px; + font-weight: normal; + color: #000; + } + .dashboard-notice p { + margin-top: 0; + } + .dashboard-notice p.no-title { + padding-right: 5px; + margin-top: 0; + } + .dashboard-notice .inset-figure { + float: right; + margin-bottom: 15px; + margin-left: 20px; + } + .dashboard-notice ul { + margin-left: 18px; + } + .dashboard-notice li { + padding-bottom: 15px; + } + .dashboard-notice .coupon { + padding: 10px; + margin: 15px 0; + font-size: 20px; + font-weight: bold; + text-align: center; + background: #fff; + border: 1px dashed #d1e5ff; + } + kbd { + display: inline-block; + padding: 3px 5px; + font: + 11px Consolas, + "Liberation Mono", + Menlo, + Courier, + monospace; + line-height: 10px; + color: #555; + vertical-align: middle; + background-color: #fcfcfc; + border: solid 1px #ccc; + border-bottom-color: #bbb; + border-radius: 3px; + box-shadow: inset 0 -1px 0 #bbb; + } + .badmono { + font-family: sans-serif; + font-weight: bold; + } + .select-menu-button:after { + display: inline-block; + width: 0; + height: 0; + content: ""; + vertical-align: -2px; + border: 4px solid; + border-right-color: transparent; + border-left-color: transparent; + border-bottom-color: transparent; + } + .select-menu-button.icon-only { + padding-left: 7px; + } + .select-menu-button.primary:after { + border-top-color: #fff; + } + .select-menu-button.primary:after:active { + background-color: #4a993e; + } + .select-menu .spinner { + float: left; + margin: 4px 0 0 -24px; + } + .select-menu.active .select-menu-modal-holder { + display: block; + } + .select-menu.select-menu-modal-right { + position: relative; + } + .select-menu.select-menu-modal-right .select-menu-modal-holder { + right: 0; + } + .select-menu .select-menu-clear-item { + display: block; + } + .select-menu .select-menu-clear-item .octicon { + color: inherit; + } + .select-menu .select-menu-clear-item + .select-menu-no-results { + display: none !important; + } + .select-menu.is-loading .select-menu-loading-overlay { + display: block; + } + .select-menu.is-loading .select-menu-modal { + min-height: 200px; + } + .select-menu-loading-overlay { + display: none; + text-indent: 100%; + height: 100%; + width: 100%; + position: absolute; + top: 0; + z-index: 5; + border-radius: 5px; + border: 1px solid transparent; + background-color: rgba(255, 255, 255, 0.8); + -webkit-animation: pulse 2s infinite linear; + animation: pulse 2s infinite linear; + } + .select-menu-loading-overlay:before { + position: absolute; + left: 50%; + top: 50%; + margin: -16px 0 0 -16px; + width: 32px; + content: "\f008"; + font: normal normal 32px/1 "octicons"; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; + text-indent: 0; + } + @-webkit-keyframes pulse { + 0% { + color: rgba(170, 170, 170, 0.1); + } + 10% { + color: #aaaaaa; + } + 100% { + color: rgba(170, 170, 170, 0.1); + } + } + @keyframes pulse { + 0% { + color: rgba(170, 170, 170, 0.1); + } + 10% { + color: #aaaaaa; + } + 100% { + color: rgba(170, 170, 170, 0.1); + } + } + .select-menu-modal-holder { + position: absolute; + display: none; + z-index: 21; + } + .select-menu-modal { + position: relative; + width: 300px; + margin-top: 4px; + margin-bottom: 20px; + overflow: hidden; + font-size: 12px; + color: #666; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(200, 200, 200, 0.4); + border-radius: 3px; + box-shadow: 0 3px 12px rgba(0, 0, 0, 0.15); + } + .select-menu-header { + padding: 8px 10px; + background: #f5f5f5; + border-bottom: 1px solid rgba(200, 200, 200, 0.4); + } + .select-menu-header .select-menu-title { + font-weight: bold; + color: #333; + text-shadow: 0 1px 0 #fff; + } + .select-menu-header .octicon { + display: block; + float: right; + color: #ccc; + cursor: pointer; + } + .select-menu-header .octicon:hover { + color: #555; + } + .select-menu-filters { + background-color: #f8f8f8; + } + .select-menu-text-filter { + padding: 10px 10px 0; + } + .select-menu-text-filter:first-child:last-child { + padding-bottom: 10px; + border-bottom: 1px solid #ddd; + } + .select-menu-text-filter input { + display: block; + width: 100%; + max-width: 100%; + padding: 5px; + border: 1px solid #ddd; + border-radius: 3px; + } + .select-menu-text-filter input::-webkit-input-placeholder { + color: #aaa; + } + .select-menu-text-filter input::-moz-placeholder { + color: #aaa; + } + .select-menu-text-filter input:-ms-input-placeholder { + color: #aaa; + } + .select-menu-text-filter input::placeholder { + color: #aaa; + } + .select-menu-tabs { + height: 33px; + border-bottom: 1px solid #ddd; + } + .select-menu-tabs ul { + overflow: hidden; + padding: 14px 10px 0; + } + .select-menu-tabs .select-menu-tab { + display: inline-block; + } + .select-menu-tabs a { + height: 20px; + padding: 5px 8px; + font-size: 11px; + font-weight: bold; + color: #888; + text-decoration: none; + line-height: 20px; + border-radius: 3px 3px 0 0; + cursor: pointer; + } + .select-menu-tabs a:hover { + color: #333; + } + .select-menu-tabs a.selected { + padding: 4px 5px; + border: 1px solid #ddd; + border-bottom: 1px solid #fff; + background-color: #fff; + color: #333; + } + .select-menu-list { + max-height: 400px; + overflow: auto; + position: relative; + line-height: 1.4; + } + .select-menu-list.select-menu-tab-bucket { + display: none; + } + .select-menu-list.select-menu-tab-bucket.selected { + display: block; + } + .select-menu-list.is-showing-new-item-form .select-menu-new-item-form { + display: table; + } + .select-menu-list.is-showing-new-item-form .select-menu-no-results, + .select-menu-list.is-showing-new-item-form .select-menu-clear-item { + display: none; + } + .select-menu-item { + cursor: pointer; + border-bottom: 1px solid #eee; + display: table; + table-layout: fixed; + width: 100%; + overflow: hidden; + color: inherit; + } + .select-menu-item:hover { + text-decoration: none; + } + .select-menu-item.select-menu-item-template { + display: none; + } + .select-menu-item.disabled, + .select-menu-item.disabled.selected { + color: #767676; + } + .select-menu-item.disabled .select-menu-item-gravatar, + .select-menu-item.disabled.selected .select-menu-item-gravatar { + opacity: 0.5; + } + .select-menu-item .octicon { + vertical-align: middle; + } + .select-menu-item .octicon-check { + visibility: hidden; + } + .select-menu-item input[type="radio"] { + display: none; + } + .select-menu-item .select-menu-item-icon { + display: table-cell; + color: transparent; + vertical-align: top; + padding: 8px 0 8px 8px; + width: 24px; + text-align: center; + } + .select-menu-item.navigation-focus, + .select-menu-item.navigation-focus.selected, + .select-menu-item.navigation-focus.select-menu-action, + .select-menu-item.navigation-focus .description-inline { + background-color: #4078c0; + color: #fff; + } + .select-menu-item.navigation-focus > .octicon, + .select-menu-item.navigation-focus.selected > .octicon, + .select-menu-item.navigation-focus.select-menu-action > .octicon, + .select-menu-item.navigation-focus .description-inline > .octicon { + color: #fff; + } + .select-menu-item.navigation-focus .text-danger, + .select-menu-item.navigation-focus .description, + .select-menu-item.navigation-focus.selected .text-danger, + .select-menu-item.navigation-focus.selected .description, + .select-menu-item.navigation-focus.select-menu-action .text-danger, + .select-menu-item.navigation-focus.select-menu-action .description, + .select-menu-item.navigation-focus .description-inline .text-danger, + .select-menu-item.navigation-focus .description-inline .description { + color: #fff; + } + .select-menu-item > .octicon-dash { + display: none; + } + .select-menu-item.indeterminate > .octicon-check { + display: none; + } + .select-menu-item.indeterminate > .octicon-dash { + display: table-cell; + } + .select-menu-item.select-menu-action, + .select-menu-item.selected { + color: #333; + } + .select-menu-item.select-menu-action .description, + .select-menu-item.selected .description { + color: #666; + } + .select-menu-item.select-menu-action .octicon-check, + .select-menu-item.selected .octicon-check { + visibility: visible; + } + .select-menu-item.select-menu-action > .octicon, + .select-menu-item.selected > .octicon { + color: #333; + } + .select-menu-item.select-menu-action .select-menu-item-text { + font-weight: bold; + } + .select-menu[data-multiple] .select-menu-item:active { + background-color: transparent !important; + } + .select-menu-item a { + color: inherit; + text-decoration: none; + } + .select-menu-item .hidden-select-button-text { + display: none; + } + .select-menu-item .css-truncate-target { + display: table-cell; + max-width: 100%; + } + form.select-menu-item > div:first-child { + display: none !important; + } + .select-menu-item.last-visible, + .select-menu-list:last-child .select-menu-item:last-child { + border-bottom: 0; + border-radius: 0 0 3px 3px; + } + .select-menu-actions .select-menu-item:hover { + background-color: #4078c0; + color: #fff; + } + .select-menu-actions .select-menu-item:hover > .octicon { + color: #fff; + } + .select-menu-actions .select-menu-item:hover .description { + color: #fff; + } + .select-menu-no-results { + padding: 9px; + display: none; + cursor: auto; + color: #767676; + } + .select-menu-list.filterable-empty .select-menu-no-results, + .select-menu-no-results:only-child { + display: block; + } + .select-menu-button-gravatar, + .select-menu-item-gravatar { + overflow: hidden; + line-height: 0; + width: 20px; + } + .select-menu-button-gravatar img, + .select-menu-item-gravatar img { + height: 20px; + width: 20px; + display: inline-block; + border-radius: 3px; + } + .select-menu-item-gravatar { + display: table-cell; + padding: 6px 0 6px 8px; + vertical-align: top; + width: 28px; + } + .select-menu-button-gravatar { + float: left; + margin-right: 5px; + } + .select-menu-item-text { + display: table-cell; + vertical-align: top; + padding: 8px; + text-align: left; + } + .select-menu-item-text:first-child { + margin-left: 5px; + } + .select-menu-item-text .description { + color: #767676; + font-size: 12px; + max-width: 265px; + display: block; + margin-top: 3px; + } + .select-menu-item-text .description-inline { + color: #767676; + font-size: 10px; + } + .select-menu-item-heading { + display: block; + margin-top: 0; + margin-bottom: 0; + font-size: 14px; + font-weight: bold; + line-height: 1.1; + } + .select-menu-item-heading .description { + font-weight: normal; + display: inline; + } + .select-menu-footer { + padding: 8px; + font-weight: bold; + border-top: 1px solid #eee; + } + .select-menu-footer a { + display: inline-block; + margin-top: 1px; + vertical-align: top; + } + .select-menu-footer .octicon { + color: #666; + } + .select-menu-new-item-form { + display: none; + } + .select-menu-new-item-form .octicon { + color: #4078c0; + } + .modal-backdrop { + display: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + body.menu-active .modal-backdrop { + display: block; + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: 20; + } + .dropdown { + position: relative; + } + .dropdown-caret { + display: inline-block; + width: 0; + height: 0; + content: ""; + vertical-align: -2px; + border: 4px solid; + border-right-color: transparent; + border-left-color: transparent; + border-bottom-color: transparent; + } + .dropdown-menu { + position: absolute; + top: 100%; + left: 50%; + z-index: 100; + width: 160px; + margin-top: 2px; + margin-left: -80px; + padding-top: 5px; + padding-bottom: 5px; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + box-shadow: 0 3px 12px rgba(0, 0, 0, 0.15); + } + .dropdown-menu:before { + position: absolute; + top: -16px; + left: 72px; + display: inline-block; + content: ""; + border: 8px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.15); + } + .dropdown-menu:after { + position: absolute; + top: -14px; + left: 73px; + display: inline-block; + content: ""; + border: 7px solid transparent; + border-bottom-color: #fff; + } + .dropdown-menu > li > a, + .dropdown-menu > li .sign-out-button { + display: block; + padding: 4px 10px 4px 35px; + color: #333; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + background: none; + } + .dropdown-menu > li > a > .octicon, + .dropdown-menu > li .sign-out-button > .octicon { + float: left; + margin-top: 1px; + margin-left: -25px; + opacity: 0.5; + } + .dropdown-menu > li > a:hover, + .dropdown-menu > li > a.zeroclipboard-is-hover, + .dropdown-menu > li .sign-out-button:hover, + .dropdown-menu > li .sign-out-button.zeroclipboard-is-hover { + color: #fff; + text-decoration: none; + background-color: #4078c0; + } + .dropdown-menu > li > a:hover > .octicon, + .dropdown-menu > li > a.zeroclipboard-is-hover > .octicon, + .dropdown-menu > li .sign-out-button:hover > .octicon, + .dropdown-menu > li .sign-out-button.zeroclipboard-is-hover > .octicon { + color: inherit; + opacity: 1; + } + .sign-out-button { + width: 100%; + text-align: left; + } + .sign-out-button > .octicon-sign-out { + padding-left: 3px; + } + .dropdown-divider { + height: 1px; + margin: 8px 1px; + background-color: #e5e5e5; + } + .dropdown-header { + padding: 4px 15px; + font-size: 12px; + color: #767676; + } + .dropdown-menu-content { + display: none; + } + .dropdown-menu-w { + top: 0; + left: auto; + right: 100%; + width: auto; + margin-top: 0; + margin-left: 0; + margin-right: 10px; + } + .dropdown-menu-w:before { + top: 10px; + right: -16px; + left: auto; + border-color: transparent; + border-left-color: rgba(0, 0, 0, 0.15); + } + .dropdown-menu-w:after { + top: 11px; + right: -14px; + left: auto; + border-color: transparent; + border-left-color: #fff; + } + .dropdown-menu-e { + top: 0; + left: 100%; + width: auto; + margin-top: 0; + margin-left: 10px; + } + .dropdown-menu-e:before { + top: 10px; + left: -16px; + border-color: transparent; + border-right-color: rgba(0, 0, 0, 0.15); + } + .dropdown-menu-e:after { + top: 11px; + left: -14px; + border-color: transparent; + border-right-color: #fff; + } + .dropdown-menu-sw { + left: auto; + right: 0; + margin-left: 0; + } + .dropdown-menu-sw:before { + left: auto; + right: 9px; + } + .dropdown-menu-sw:after { + left: auto; + right: 10px; + } + include-fragment, + poll-include-fragment { + display: block; + } + .pagination:before { + display: table; + content: ""; + } + .pagination:after { + display: table; + clear: both; + content: ""; + } + .pagination a, + .pagination span, + .pagination em { + position: relative; + float: left; + margin-left: -1px; + font-size: 13px; + font-weight: bold; + font-style: normal; + padding: 7px 12px; + color: #4078c0; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + background: #fff; + border: 1px solid #e5e5e5; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .pagination a:first-child, + .pagination span:first-child, + .pagination em:first-child { + margin-left: 0; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + } + .pagination a:last-child, + .pagination span:last-child, + .pagination em:last-child { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + } + .pagination a:hover, + .pagination a:focus, + .pagination span:hover, + .pagination span:focus, + .pagination em:hover, + .pagination em:focus { + z-index: 2; + background-color: #e7e7e7; + border-color: #e5e5e5; + text-decoration: none; + } + .pagination .selected { + z-index: 3; + } + .pagination .current, + .pagination .current:hover { + z-index: 3; + color: #fff; + background-color: #4078c0; + border-color: #4078c0; + } + .pagination .gap, + .pagination .disabled, + .pagination .gap:hover, + .pagination .disabled:hover { + background-color: #fafafa; + cursor: default; + color: #d3d3d3; + } + .ajax_paginate { + display: block; + margin-top: 20px; + } + .ajax_paginate a { + float: none; + display: block; + padding: 6px; + text-align: center; + } + .ajax_paginate.loading a { + text-indent: -3000px; + background-color: #eaeaea; + background-image: url(/images/spinners/octocat-spinner-16px-EAF2F5.gif); + background-repeat: no-repeat; + background-position: center center; + border-color: #c5c5c5; + } + @media screen and (-webkit-min-device-pixel-ratio: 2), + screen and (max--moz-device-pixel-ratio: 2) { + .ajax_paginate.loading a { + background-image: url(/images/spinners/octocat-spinner-32-EAF2F5.gif); + background-size: 16px auto; + } + } + .paginate-container { + margin-top: 20px; + margin-bottom: 15px; + text-align: center; + } + .paginate-container .pagination { + display: inline-block; + } + .tab-size[data-tab-size="1"] { + -moz-tab-size: 1; + -o-tab-size: 1; + tab-size: 1; + } + .tab-size[data-tab-size="2"] { + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; + } + .tab-size[data-tab-size="3"] { + -moz-tab-size: 3; + -o-tab-size: 3; + tab-size: 3; + } + .tab-size[data-tab-size="4"] { + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + } + .tab-size[data-tab-size="5"] { + -moz-tab-size: 5; + -o-tab-size: 5; + tab-size: 5; + } + .tab-size[data-tab-size="6"] { + -moz-tab-size: 6; + -o-tab-size: 6; + tab-size: 6; + } + .tab-size[data-tab-size="7"] { + -moz-tab-size: 7; + -o-tab-size: 7; + tab-size: 7; + } + .tab-size[data-tab-size="8"] { + -moz-tab-size: 8; + -o-tab-size: 8; + tab-size: 8; + } + .tab-size[data-tab-size="9"] { + -moz-tab-size: 9; + -o-tab-size: 9; + tab-size: 9; + } + .tab-size[data-tab-size="10"] { + -moz-tab-size: 10; + -o-tab-size: 10; + tab-size: 10; + } + .tab-size[data-tab-size="11"] { + -moz-tab-size: 11; + -o-tab-size: 11; + tab-size: 11; + } + .tab-size[data-tab-size="12"] { + -moz-tab-size: 12; + -o-tab-size: 12; + tab-size: 12; + } + .header { + padding-top: 10px; + padding-bottom: 10px; + min-width: 1000px; + background-color: #f5f5f5; + border-bottom: 1px solid #e5e5e5; + } + .header-logged-out { + padding-top: 15px; + padding-bottom: 15px; + } + .header-logo-invertocat { + float: left; + margin-right: 10px; + margin-left: -2px; + color: #333; + white-space: nowrap; + } + .header-logo-invertocat .octicon-mark-github { + float: left; + width: 28px; + height: 28px; + font-size: 28px; + } + .header-logo-invertocat:hover { + color: #4078c0; + text-decoration: none; + } + .logo-subbrand { + float: left; + margin-left: 6px; + font-size: 16px; + font-weight: bold; + line-height: 28px; + } + .header-logo-wordmark { + position: relative; + float: left; + height: 26px; + margin-right: 15px; + color: #333; + } + .header-logo-wordmark:hover { + color: #4078c0; + } + .header-logo-wordmark .octicon-logo-github { + height: 26px; + font-size: 32px; + } + .notification-indicator .mail-status { + background-color: #4078c0; + background-image: -webkit-linear-gradient(#7aa1d3, #4078c0); + background-image: linear-gradient(#7aa1d3, #4078c0); + background-repeat: repeat-x; + position: absolute; + top: -2px; + right: 2px; + z-index: 2; + display: none; + width: 14px; + height: 14px; + color: #fff; + text-align: center; + background-clip: padding-box; + border-radius: 50%; + border: 2px solid #f3f3f3; + } + .notification-indicator .mail-status.unread { + display: inline-block; + } + .notification-indicator:hover .mail-status { + background-color: #4078c0; + } + .site-search { + position: relative; + float: left; + } + .site-search form { + position: relative; + float: left; + width: 360px; + margin-right: 10px; + } + .site-search .form-control { + position: relative; + width: 100%; + min-height: 26px; + padding: 2px; + font-size: 12px; + display: block; + line-height: 17px; + } + .site-search .chromeless-input { + background: none; + border: 0; + box-shadow: none; + min-height: 22px; + display: inline-block; + font-size: 12px; + padding: 3px 5px; + line-height: 16px; + width: 250px; + } + .site-search .chromeless-input:focus { + border: 0; + box-shadow: none; + } + .site-search .chromeless-input::-ms-clear { + display: none; + } + .site-search .scope-badge { + display: none; + padding: 0 5px; + line-height: 22px; + font-size: 12px; + font-weight: normal; + color: #767676; + background-color: #eee; + border-radius: 2px; + vertical-align: middle; + } + .site-search.repo-scope .scope-badge { + display: inline-block; + } + .site-search.repo-scope .form-control.focus .scope-badge { + background-color: #e1eaf5; + color: #4078c0; + } + .header-nav { + list-style: none; + } + .header-nav-item { + float: left; + } + .header-nav-item.active .dropdown-menu-content { + display: block; + } + .header-nav-item.active .tooltipped:before, + .header-nav-item.active .tooltipped:after { + display: none; + } + .header-nav-item .dropdown-menu { + margin-top: 13px; + width: 180px; + } + .header-nav-link { + display: block; + padding: 4px 8px; + font-size: 13px; + font-weight: bold; + line-height: 20px; + color: #333; + } + .header-nav-link:hover, + .header-nav-link:focus { + color: #4078c0; + text-decoration: none; + } + .header-nav-link:hover .dropdown-caret, + .header-nav-link:focus .dropdown-caret { + border-top-color: #4078c0; + } + .user-nav { + margin-right: -8px; + } + .user-nav .header-nav-link { + height: 28px; + } + .user-nav .octicon { + width: 18px; + height: 18px; + text-align: center; + } + .user-nav .octicon-inbox { + font-size: 20px; + } + .user-nav .octicon-sign-out { + padding-top: 2px; + } + .user-nav .octicon-plus { + float: left; + width: 16px; + height: 18px; + font-size: 18px; + } + .user-nav .avatar { + float: left; + margin-right: 5px; + } + .user-nav .name { + float: left; + white-space: nowrap; + } + .sign-out-button { + background: none; + border: 0; + } + .header-actions { + float: right; + margin-top: -3px; + margin-bottom: -3px; + } + .header-actions .btn { + margin-left: 5px; + } + .enterprise .header { + background-color: #2a2c2e; + border-bottom-color: #121213; + } + .is-stats .enterprise .header { + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05); + } + .enterprise .header-logo-wordmark, + .enterprise .header-logo-invertocat, + .enterprise .header-nav-link { + color: #c8c8ca; + } + .enterprise .header-logo-wordmark:hover, + .enterprise .header-logo-wordmark:focus, + .enterprise .header-logo-invertocat:hover, + .enterprise .header-logo-invertocat:focus, + .enterprise .header-nav-link:hover, + .enterprise .header-nav-link:focus { + color: #fafafa; + } + .enterprise .header-nav-link:hover .dropdown-caret, + .enterprise .header-nav-link:focus .dropdown-caret { + border-top-color: #fafafa; + } + .enterprise .notification-indicator .mail-status { + border-color: #2a2c2e; + } + .enterprise .notification-indicator:hover .mail-status { + background-color: #d26911; + } + .enterprise .header-actions .btn { + border: 0; + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.25), + 0 1px 1px rgba(0, 0, 0, 0.5); + } + .enterprise .site-search .scope-badge { + background-color: #5b5f63; + color: #c8c8ca; + } + .enterprise .site-search .form-control { + color: #fafafa; + background-color: #4f5256; + border-color: #121213; + } + .enterprise .site-search .form-control.focus { + background-color: #55595d; + border-color: #000; + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.075); + } + .enterprise .site-search .form-control.focus .scope-badge { + background-color: #676c71; + color: #fff; + } + .unsupported-browser { + padding: 15px 0; + color: #211e14; + background-color: #fae692; + background-image: -webkit-linear-gradient(#feefae, #fae692); + background-image: linear-gradient(#feefae, #fae692); + background-repeat: repeat-x; + border-bottom: 1px solid #b3a569; + } + .unsupported-browser .container { + background: url(/images/icons/ie-notice.png) no-repeat 0 5px; + } + .unsupported-browser h5 { + font-size: 13px; + margin: 5px 0 2px; + padding-left: 48px; + } + .unsupported-browser p { + margin: 0; + padding-left: 48px; + } + .unsupported-browser .btn { + float: right; + margin-top: 5px; + margin-left: 8px; + } + .mobile-banner button.switch-to-mobile { + display: block; + width: 100%; + padding: 30px 0 45px; + border: 0; + background-color: #444; + color: #eaeaea; + font-size: 60px; + text-align: center; + font-weight: bold; + } + .mobile-banner button.switch-to-mobile .mega-octicon { + position: relative; + top: -8px; + margin-right: 5px; + color: #ddd; + font-size: 48px; + } + .accessibility-aid { + height: 1px; + width: 1px; + clip: rect(1px, 1px, 1px, 1px); + overflow: hidden; + position: absolute; + margin: 0; + } + .accessibility-aid:focus { + height: auto; + width: auto; + clip: auto; + z-index: 1; + top: 0; + line-height: 49px; + padding: 0 10px; + background: #f5f5f5; + font-weight: bold; + text-decoration: none; + color: #333; + } + .is-stats .accessibility-aid:focus { + top: 34px; + } + .site-footer { + position: relative; + margin-top: 40px; + padding-top: 40px; + padding-bottom: 40px; + font-size: 12px; + line-height: 1.5; + color: #767676; + border-top: 1px solid #eee; + } + .site-footer:before { + display: table; + content: ""; + } + .site-footer:after { + display: table; + clear: both; + content: ""; + } + .site-footer .octicon-mark-github { + position: absolute; + top: 38px; + left: 50%; + height: 24px; + width: 24px; + margin-left: -12px; + font-size: 24px; + color: #ccc; + } + .site-footer .octicon-mark-github:hover { + color: #bbb; + } + .site-footer-links { + margin: 0; + list-style: none; + } + .site-footer-links li { + display: inline-block; + line-height: 16px; + } + .site-footer-links li + li { + margin-left: 10px; + } + .billing-plans tbody td { + width: 25%; + vertical-align: middle; + } + .billing-plans .current { + background-color: #f2ffed; + } + .billing-plans .name { + font-size: 14px; + font-weight: bold; + color: #333; + } + .billing-plans .coupon { + font-size: 12px; + } + .billing-plans .coupon td { + color: #fff; + background-color: #6cc644; + } + .billing-plans .coupon .text-right { + white-space: nowrap; + } + .billing-plans .coupon.expiring td { + background-color: #df6e00; + } + .billing-plans .coupon.expiring .coupon-label:after { + border-bottom-color: #df6e00; + } + .billing-plans tbody > .selected { + background-color: #fdffce; + } + .coupon-label { + position: relative; + padding: 9px; + margin: -9px; + } + .coupon-label:after { + position: absolute; + bottom: 100%; + left: 15px; + width: 0; + height: 0; + pointer-events: none; + content: " "; + border: solid transparent; + border-width: 5px; + border-bottom-color: #6cc644; + } + .boxed-group-table .toggle-currency { + font-size: 11px; + font-weight: normal; + } + .is-hidden, + .has-removed-contents { + display: none; + } + .currency-notice { + margin-bottom: 10px; + } + .org-login { + margin-top: -30px; + margin-bottom: 30px; + } + .org-login img { + width: 450px; + padding: 1px; + margin: 10px -25px; + border: 1px solid #ccc; + } + .plan-notice { + border-top: 1px solid #eee; + margin-bottom: 0; + padding: 10px; + } + .auth-form { + width: 400px; + margin: 60px auto; + } + .auth-form .note { + margin: 15px 0; + text-align: center; + } + .auth-form-header { + position: relative; + padding: 10px 20px; + margin: 0; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background-color: #829aa8; + border: 1px solid #768995; + border-radius: 3px 3px 0 0; + } + .auth-form-header h1 { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + } + .auth-form-header h1 a { + color: #fff; + } + .auth-form-header .octicon { + position: absolute; + top: 10px; + right: 20px; + color: rgba(0, 0, 0, 0.4); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.1); + } + .auth-form-body { + padding: 20px; + font-size: 14px; + background-color: #fff; + border: 1px solid #d8dee2; + border-top: 0; + border-radius: 0 0 3px 3px; + } + .auth-form-body .input-block { + margin-top: 5px; + margin-bottom: 15px; + } + .auth-form-body p { + margin: 0 0 10px; + } + .two-factor-help { + position: relative; + padding: 10px 10px 10px 36px; + margin: 60px 0 auto auto; + border: 1px solid #eaeaea; + border-radius: 3px; + } + .two-factor-help .octicon { + position: absolute; + top: 10px; + left: 10px; + } + .two-factor-help .btn-sm { + float: right; + } + .two-factor-help ul { + list-style-type: none; + } + .flash.sms-error, + .flash.sms-success { + display: none; + margin: 0 0 10px; + } + .is-sent .sms-success { + display: block; + } + .is-sent .sms-error { + display: none; + } + .is-not-sent .sms-success { + display: none; + } + .is-not-sent .sms-error { + display: block; + } + .autocomplete-results { + position: absolute; + z-index: 99; + display: none; + max-height: 20em; + overflow-y: auto; + font-size: 13px; + list-style: none; + background: #fff; + border: 1px solid #c1c1c1; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); + } + .autocomplete-results .no-results { + display: none; + } + .autocomplete-group { + width: 100%; + overflow: hidden; + } + .autocomplete-item { + display: block; + padding: 5px; + overflow: hidden; + font-weight: bold; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer; + } + .autocomplete-item.selected, + .autocomplete-item.navigation-focus { + color: #fff; + text-decoration: none; + background-color: #4078c0; + } + .autocomplete-item.selected .organization-member, + .autocomplete-item.selected .ldap-group-dn, + .autocomplete-item.navigation-focus .organization-member, + .autocomplete-item.navigation-focus .ldap-group-dn { + color: #f2f2f2; + } + .autocomplete-item .secondary-label { + font-weight: normal; + } + .autocomplete-item .organization-member { + float: right; + padding-top: 1px; + color: #808080; + } + .suggester-container { + position: absolute; + top: 58px; + left: 10px; + z-index: 30; + } + .comment-content .suggester-container { + top: 46px; + } + .timeline-new-comment .suggester-container { + top: 52px; + } + .is-comment-editing .suggester-container { + top: 49px; + } + .merge-branch-form .suggester-container { + top: 39px; + } + .wiki-wrapper .suggester-container { + top: 93px; + left: -2px; + } + .suggester { + position: relative; + top: 0; + left: 0; + display: none; + min-width: 180px; + margin-top: 20px; + background: #fff; + border: 1px solid #ddd; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + } + .suggester.active { + display: block; + } + .suggester ul { + padding: 0; + margin: 0; + list-style: none; + } + .suggester li { + display: block; + padding: 5px 10px; + font-weight: bold; + border-bottom: 1px solid #ddd; + } + .suggester li small { + font-weight: normal; + color: #767676; + } + .suggester li:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + .suggester li:first-child a { + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + .suggester li.navigation-focus { + color: #fff; + text-decoration: none; + background: #4078c0; + } + .suggester li.navigation-focus small { + color: #fff; + } + .breadcrumb { + margin-top: 5px; + margin-bottom: 5px; + font-size: 18px; + color: #767676; + } + .breadcrumb .separator:before, + .breadcrumb .separator:after { + content: " "; + } + .breadcrumb strong.final-path { + color: #000; + } + .breadcrumb .zeroclipboard-button { + display: inline-block; + margin-left: 5px; + } + .breadcrumb .repo-root { + font-weight: bold; + } + .editor-license-template, + .editor-gitignore-template { + position: relative; + top: 3px; + display: none; + float: right; + font-size: 14px; + } + .editor-license-template.is-visible, + .editor-gitignore-template.is-visible { + display: block; + } + .editor-license-template .select-menu-git-ignore, + .editor-license-template .select-menu-license-picker, + .editor-gitignore-template .select-menu-git-ignore, + .editor-gitignore-template .select-menu-license-picker { + right: 0; + } + .editor-abort { + display: inline; + font-size: 14px; + } + .blob-interaction-bar { + position: relative; + background-color: #f2f2f2; + border-bottom: 1px solid #e5e5e5; + } + .blob-interaction-bar:before { + display: table; + content: ""; + } + .blob-interaction-bar:after { + display: table; + clear: both; + content: ""; + } + .blob-interaction-bar .octicon-search { + position: absolute; + top: 10px; + left: 10px; + font-size: 12px; + color: #767676; + } + input.blob-filter { + padding: 4px 20px 5px 30px; + width: 100%; + font-size: 12px; + border: 0; + border-radius: 0; + outline: none; + } + input.blob-filter:focus { + outline: none; + } + .markdown-body .csv-data td, + .markdown-body .csv-data th { + padding: 5px; + overflow: hidden; + font-size: 12px; + line-height: 1; + text-align: left; + white-space: nowrap; + } + .markdown-body .csv-data .blob-num { + padding: 10px 8px 9px; + text-align: right; + background: #fff; + border: 0; + } + .markdown-body .csv-data tr { + border-top: 0; + } + .markdown-body .csv-data th { + font-weight: bold; + background: #f8f8f8; + border-top: 0; + } + .too-long-message { + display: none; + color: #cea61b; + } + .is-too-long-error .too-long-message { + display: block; + } + .check-for-fork { + display: inline-block; + } + .check-for-fork img { + vertical-align: text-bottom; + } + .check-for-fork.is-error .check-for-fork-loading { + display: none; + } + .check-for-fork.is-error .check-for-fork-error { + display: inline-block; + } + .check-for-fork-error { + display: none; + } + .file-commit-form { + padding-left: 64px; + } + .file-commit-form .commit-form-avatar { + float: left; + margin-left: -64px; + border-radius: 4px; + } + .file-commit-form .commit-form { + position: relative; + padding: 15px; + margin-bottom: 10px; + border: 1px solid #ddd; + border-radius: 3px; + } + .file-commit-form .commit-form:after, + .file-commit-form .commit-form:before { + position: absolute; + top: 11px; + left: -16px; + right: 100%; + width: 0; + height: 0; + display: block; + content: " "; + border-color: transparent; + border-style: solid solid outset; + pointer-events: none; + } + .file-commit-form .commit-form:after { + border-width: 7px; + border-right-color: #fff; + margin-top: 1px; + margin-left: 2px; + } + .file-commit-form .commit-form:before { + border-right-color: #ddd; + border-width: 8px; + } + .file-commit-form .commit-message { + min-height: 100px; + } + .file-commit-form-heading { + margin-top: 0; + margin-bottom: 10px; + } + .quick-pull-choice .form-checkbox { + padding-left: 25px; + margin: 10px 0; + } + .quick-pull-choice .form-checkbox label { + font-weight: normal; + } + .quick-pull-choice .form-checkbox .octicon { + width: 16px; + margin-right: 3px; + text-align: center; + } + .quick-pull-choice dl.form, + .quick-pull-choice .form-checkbox:last-child { + margin-bottom: 0; + } + .quick-pull-choice .quick-pull-branch-name { + display: none; + padding-left: 48px; + margin-top: 5px; + } + .quick-pull-choice .new-branch-name-input { + position: relative; + margin-top: 5px; + } + .quick-pull-choice .new-branch-name-input input { + width: 240px; + padding-left: 26px; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + } + .quick-pull-choice .new-branch-name-input .quick-pull-new-branch-icon { + position: absolute; + top: 9px; + left: 10px; + color: #b0c4ce; + } + .quick-pull-choice.will-normalize-ref .quick-pull-normalization-info { + display: inline-block; + } + .quick-pull-choice.will-create-branch .quick-pull-branch-name { + display: inline-block; + } + .quick-pull-normalization-info { + position: absolute; + top: 34px; + left: 0; + z-index: 10; + display: none; + padding: 5px; + font-size: 11px; + color: #494620; + background: #f7ea57; + border: 1px solid #c0b536; + border-top-color: #fff; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + .merge-pr { + padding-top: 10px; + margin: 20px 0 0; + border-top: 1px solid #ddd; + } + .merge-pr.open .merge-branch-form { + display: block; + } + .merge-pr.open .branch-action { + display: none; + } + .branch-status { + padding: 10px 0 0; + border: solid #eee; + border-width: 0 0 1px; + } + .branch-status .octicon { + width: 16px; + text-align: center; + } + .branch-status.open > .build-statuses-list { + max-height: 370px; + border-width: 1px 0; + } + .branch-status.open .statuses-toggle-opened { + display: inline; + } + .branch-status.open .statuses-toggle-closed { + display: none; + } + .status-description { + display: block; + padding: 0 15px 10px 12px; + } + .build-status-single .css-truncate-target { + width: 80%; + max-width: 80%; + } + .build-statuses-list { + max-height: 0; + margin-bottom: -1px; + overflow-y: auto; + border: solid #eee; + border-width: 1px 0 0; + padding: 0; + -webkit-transition: max-height 0.25s ease-in-out; + transition: max-height 0.25s ease-in-out; + } + .statuses-toggle-opened { + display: none; + } + .build-status-item { + padding: 10px 15px 10px 12px; + background-color: #fafafa; + border-bottom: 1px solid #eee; + } + .build-status-item:last-child { + border-bottom: 0; + } + .build-status-item .css-truncate-target { + width: 80%; + max-width: 80%; + } + .build-status-icon { + width: 16px; + text-align: center; + } + .build-status-details { + margin-left: 10px; + } + .merge-pr-more-commits { + margin-top: 10px; + margin-bottom: 10px; + margin-left: 64px; + font-size: 12px; + color: #767676; + } + .branch-action { + padding-left: 64px; + margin-top: 15px; + margin-bottom: 15px; + } + .branch-action .merge-branch-heading { + margin-bottom: 2px; + } + .branch-action .delete-branch-failure { + display: none; + padding: 15px; + } + .branch-action.error .delete-branch-failure { + display: block; + } + .branch-action.error .merge-message { + display: none; + } + .branch-action-icon { + float: left; + width: 48px; + height: 48px; + margin-left: -64px; + line-height: 48px; + color: #fff; + text-align: center; + border-radius: 3px; + } + .branch-action-body { + position: relative; + background-color: #fff; + border: 1px solid #e5e5e5; + border-radius: 3px; + } + .branch-action-body:after, + .branch-action-body:before { + position: absolute; + top: 11px; + left: -16px; + right: 100%; + width: 0; + height: 0; + display: block; + content: " "; + border-color: transparent; + border-style: solid solid outset; + pointer-events: none; + } + .branch-action-body:after { + border-width: 7px; + border-right-color: #fff; + margin-top: 1px; + margin-left: 2px; + } + .branch-action-body:before { + border-right-color: #ddd; + border-width: 8px; + } + .branch-action-body .spinner { + display: block; + float: left; + width: 32px; + height: 32px; + margin-right: 15px; + background: url(/images/spinners/octocat-spinner-32.gif) no-repeat; + } + .branch-action-body .merge-message, + .branch-action-body .merge-branch-form { + padding: 15px; + } + .branch-action-state-clean .branch-action-icon { + background-color: #6cc644; + } + .branch-action-state-clean .branch-action-body { + border-color: #95c97e; + } + .branch-action-state-clean .branch-action-body:before { + border-right-color: #95c97e; + } + .branch-action-state-unknown .branch-action-icon, + .branch-action-state-unstable .branch-action-icon { + background-color: #cea61b; + } + .branch-action-state-unknown .branch-action-body, + .branch-action-state-unstable .branch-action-body { + border-color: #e2cc7a; + } + .branch-action-state-unknown .branch-action-body:before, + .branch-action-state-unstable .branch-action-body:before { + border-right-color: #e2cc7a; + } + .branch-action-state-merged .branch-action-icon { + background-color: #6e5494; + } + .branch-action-state-merged .branch-action-body { + border-color: #886ead; + } + .branch-action-state-merged .branch-action-body:before { + border-right-color: #886ead; + } + .branch-action-state-dirty .branch-action-icon, + .branch-action-state-closed-dirty .branch-action-icon { + background-color: #888; + } + @media only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (min-device-pixel-ratio: 2), + only screen and (min-resolution: 2dppx) { + .branch-action-body .spinner { + background-image: url(/images/spinners/octocat-spinner-64.gif); + background-size: 32px 32px; + } + } + .merge-branch-form { + display: none; + margin: 15px 0; + } + .merge-branch-form .commit-form { + border-color: #95c97e; + } + .merge-branch-form .commit-form:before { + border-right-color: #95c97e; + } + .merge-branch-form.error .commit-form { + border-color: #e97a74; + } + .merge-branch-form.error .commit-form:before { + border-right-color: #e97a74; + } + .merge-branch-form .merge-form-failed { + display: none; + } + .merge-branch-form.error .merge-form-failed { + display: block; + } + .merge-branch-form.error .merge-form-contents { + display: none; + } + .merge-button-matrix-merge-form .merge-branch-form { + display: block; + } + .merge-button-matrix-merge-form .merge-branch-form .merge-form-contents { + display: block; + } + .merge-button-matrix-merge-failed .merge-branch-form { + display: block; + } + .merge-button-matrix-merge-failed .merge-branch-form .merge-form-failed { + display: block; + } + .merge-button-matrix-merge-failed + .merge-branch-form + .merge-form-contents { + display: none; + } + .branch-action-next .branch-status { + padding: 15px 0 0; + border-top: solid 1px #eee; + border-bottom: 0; + } + .branch-action-next .branch-status:first-child { + border-top: 0; + } + .branch-action-next .branch-status.blank { + padding-top: 9px; + color: #767676; + } + .branch-action-next .branch-status.blank .status-description { + padding-top: 6px; + padding-bottom: 11px; + } + .branch-action-next .branch-status.open > .build-statuses-list { + border-top: solid 1px #eee; + } + .branch-action-next .status-description { + padding: 0 15px 12px; + } + .branch-action-next .status-heading { + margin-top: 0; + margin-bottom: 1px; + } + .branch-action-next .status-meta { + color: #767676; + } + .branch-action-next .completeness-indicator { + float: left; + width: 30px; + height: 30px; + margin-right: 8px; + } + .branch-action-next .completeness-indicator .octicon { + display: block; + margin-top: 7px; + margin-right: auto; + margin-left: auto; + } + .branch-action-next .completeness-indicator-success { + color: #fff; + text-align: center; + background-color: #6cc644; + border-radius: 50%; + } + .branch-action-next .completeness-indicator-problem { + color: #fff; + text-align: center; + background-color: #888; + border-radius: 50%; + } + .branch-action-next .completeness-indicator-blank { + color: #aaa; + text-align: center; + background-color: #f3f3f3; + border-radius: 50%; + } + .branch-action-next .completeness-indicator-blank .octicon { + margin-top: 6px; + } + .branch-action-next .build-status-item { + padding: 10px 15px 10px 53px; + } + .branch-action-next .input-add-reviewers { + max-width: 340px; + } + .branch-action-next .merge-message, + .branch-action-next .merge-branch-form { + background-color: #fafafa; + border-top: solid 1px #ddd; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; + } + p.recently-touched-branches-description { + margin: 0; + font-size: 11px; + color: #888; + } + .recently-touched-branches { + padding: 0; + margin: 5px 0 10px; + color: #4c4a42; + background-color: #fff9ea; + border: solid 1px #dfd8c2; + border-radius: 3px; + } + .recently-touched-branches li { + height: 36px; + padding: 5px; + margin: 0; + line-height: 23px; + list-style-type: none; + border-bottom: 1px solid #e5e2c8; + } + .recently-touched-branches li:last-child { + border-bottom: 0; + } + .recently-pushed-branch-actions { + float: right; + } + .recently-pushed-branch-details { + display: inline-block; + margin: 0 0 0 7px; + font-size: 13px; + line-height: 26px; + color: #a19e7f; + } + .recently-pushed-branch-details a { + color: #6b694f; + } + .recently-pushed-branch-details .css-truncate-target { + max-width: 400px; + } + .branch-name { + display: inline-block; + padding: 2px 6px; + font: + 12px Consolas, + "Liberation Mono", + Menlo, + Courier, + monospace; + color: rgba(0, 0, 0, 0.5); + background-color: rgba(209, 227, 237, 0.5); + border-radius: 3px; + } + .branch-name .octicon { + margin: 1px -2px 0 0; + color: #b0c4ce; + } + a.branch-name { + color: #4078c0; + } + .range-editor { + position: relative; + padding: 5px 15px 5px 40px; + margin-top: 15px; + margin-bottom: 15px; + line-height: 26px; + background-color: #fafafa; + border: 1px solid #e5e5e5; + border-radius: 3px; + } + .range-editor .dots { + font-size: 16px; + } + .range-editor .select-menu { + position: relative; + display: inline-block; + } + .range-editor .select-menu .btn-sm { + vertical-align: top; + } + .range-editor .select-menu.fork-suggester { + display: none; + } + .range-editor .branch-name { + line-height: 22px; + } + .range-editor .branch .css-truncate-target, + .range-editor .fork-suggester .css-truncate-target { + max-width: 180px; + } + .range-editor .pre-mergability { + display: inline-block; + padding: 5px; + line-height: 26px; + vertical-align: middle; + } + .range-editor.is-cross-repo .select-menu.fork-suggester { + display: inline-block; + } + .range-editor-icon { + float: left; + margin-top: 10px; + margin-left: -25px; + color: #767676; + } + .gh-header-new-pr { + margin-bottom: 15px; + } + .gh-header-new-pr .gh-header-meta { + margin-top: 5px; + border-bottom: 0; + padding-bottom: 0; + } + .gh-header-new-pr .branch-name { + display: inline; + } + .compare-pr-header { + display: none; + } + .is-pr-composer-expanded .compare-show-header { + display: none; + } + .is-pr-composer-expanded .compare-pr-header { + display: block; + } + .range-cross-repo-pair { + display: inline-block; + padding: 5px; + white-space: nowrap; + } + ul.comparison-list { + width: 350px; + margin: 25px auto 15px; + font-size: 14px; + text-align: left; + background: #fff; + border: 1px solid #ddd; + border-radius: 3px; + } + ul.comparison-list > li { + padding: 7px 10px; + list-style-type: none; + border-top: 1px solid #eee; + } + ul.comparison-list > li a { + font-weight: bold; + } + ul.comparison-list > li em { + float: right; + font-style: normal; + color: #767676; + } + ul.comparison-list > li .octicon { + position: relative; + top: 1px; + color: #aaa; + } + ul.comparison-list > li .css-truncate-target { + max-width: 200px; + } + ul.comparison-list > li.title { + font-size: 12px; + font-weight: bold; + color: #aaa; + text-transform: uppercase; + background: #fafafa; + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + .recently-touched-branches-wrapper { + margin: 15px 0; + } + .secure-branch-fields[disabled] { + opacity: 0.5; + } + .starring-container .unstarred, + .starring-container.on .starred { + display: block; + } + .starring-container.on .unstarred, + .starring-container .starred { + display: none; + } + .starring-container.loading { + opacity: 0.5; + } + .user-following-container .follow, + .user-following-container.on .unfollow { + display: inline-block; + } + .user-following-container.on .follow, + .user-following-container .unfollow { + display: none; + } + .user-following-container.loading { + opacity: 0.5; + } + .members .user-following-container { + float: right; + } + .close-button { + background: transparent; + border: 0; + padding: 0; + outline: none; + } + .code-list .file-box { + border: 1px solid #ddd; + border-radius: 3px; + } + .code-list em { + background-color: rgba(255, 255, 140, 0.5); + padding: 3px; + border-radius: 3px; + font-weight: bold; + font-style: normal; + color: #333; + } + .code-list .title { + margin: -3px 0 10px 38px; + min-height: 24px; + font-weight: bold; + line-height: 1.2; + } + .code-list .repo-specific .title, + .code-list .repo-specific .full-path { + margin-left: 0; + } + .code-list .match-count, + .code-list .updated-at { + margin: 0; + font-size: 11px; + color: #999; + font-weight: normal; + } + .code-list .language { + float: right; + color: rgba(51, 51, 51, 0.75); + font-size: 12px; + margin-left: 10px; + } + .code-list .avatar { + float: left; + } + .code-list .code-list-item + .code-list-item { + margin-top: 20px; + padding-top: 20px; + border-top: 1px solid #eee; + margin-bottom: 10px; + } + .code-list .blob-num { + padding: 0; + } + .code-list .blob-num:before { + content: normal; + } + .code-list .blob-num a { + color: inherit; + padding: 0 10px; + } + .code-list .blob-num a:hover { + color: #4078c0; + } + .code-list .blob-code { + white-space: pre-wrap; + } + .code-list .divider .blob-num, + .code-list .divider .blob-code { + background-color: #f8fafd; + padding-top: 0; + padding-bottom: 0; + cursor: default; + } + .code-list .divider .blob-num { + background-color: #f0f5fa; + line-height: 15px; + padding: 0 10px; + height: 18px; + } + .code-list .full-path { + margin: 0 0 0 40px; + } + .code-list .full-path .octicon-repo { + color: #767676; + } + .code-list .full-path .octicon-lock { + color: #e9dba4; + } + .code-list .full-path a { + color: #999; + } + .code-list-item-private .file-box { + border: 1px solid #fadda5; + } + .code-list-item-private .blob-num { + background-color: #fff9ea; + border-right: 1px solid #fadda5; + } + .code-list-item-private .blob-num a { + color: #a1882b; + } + .code-list-item-private .divider .blob-num, + .code-list-item-private .divider .blob-code { + background-color: #fff9ea; + color: #a1882b; + } + .codesearch-head { + padding-bottom: 20px; + } + .codesearch-head.pagehead h1 { + float: left; + width: 250px; + line-height: 33px; + } + .advanced-search-form h3 { + margin-top: 20px; + } + .advanced-search-form .flattened dt { + width: 230px; + } + .advanced-search-form .flattened dt label { + font-weight: normal; + } + .advanced-search-form .flattened dd { + margin-left: 250px; + } + .advanced-search-form .form-checkbox { + margin-left: 250px; + } + .advanced-search-form fieldset { + border-bottom: 1px solid #f1f1f1; + padding-bottom: 20px; + margin-bottom: 30px; + } + .codesearch-results .large-format-loader { + padding-top: 5%; + } + .codesearch-results .repo-list { + margin-top: -20px; + } + .codesearch-results .repo-list-name { + font-weight: normal; + } + .codesearch-results .repo-list-name a, + .codesearch-results .code-list .title a { + word-wrap: break-word; + } + .codesearch-results .repo-list-name em, + .codesearch-results .repo-list-description em { + padding: 3px; + font-style: normal; + font-weight: bold; + background-color: rgba(255, 255, 140, 0.5); + border-radius: 3px; + } + .codesearch-results .search-foot-note { + color: #999; + text-align: center; + } + .meta-search-links { + margin-top: 20px; + } + .meta-search-links a { + margin-right: 10px; + } + .codesearch-aside .menu .octicon { + width: 16px; + text-align: center; + margin-right: 5px; + } + .codesearch-aside .meta-search-links { + margin-top: 20px; + } + .codesearch-aside .meta-search-links a { + margin-right: 10px; + } + .codesearch-aside .filter-list { + border-bottom: 1px solid #f1f1f1; + margin-bottom: 20px; + padding-bottom: 20px; + } + .codesearch-aside .filter-list li { + position: relative; + } + .codesearch-aside .filter-list li span.bar { + background: #f1f1f1; + display: inline-block; + position: absolute; + z-index: -1; + top: 2px; + bottom: 2px; + right: 0; + } + .simple-search-page { + width: 740px; + padding-top: 100px; + padding-bottom: 100px; + } + .simple-search-page h2 { + font-weight: normal; + } + .simple-search-page h2 .mega-octicon { + vertical-align: middle; + } + .search-form-fluid { + position: relative; + } + .search-form-fluid .flex-table-item-primary { + padding-right: 10px; + } + .search-form-fluid .completed-query { + position: absolute; + top: 7px; + left: 8px; + right: 8px; + z-index: 1; + margin: 0; + overflow: hidden; + white-space: nowrap; + } + .search-form-fluid .completed-query span { + opacity: 0; + } + .search-form-fluid .search-page-label { + position: relative; + display: block; + font-weight: normal; + cursor: text; + } + .search-form-fluid .search-page-label.focus .completed-query { + opacity: 0.6; + } + .search-form-fluid .search-page-input { + position: relative; + z-index: 2; + min-height: 0; + margin: 0; + padding: 0; + background: none; + border: 0; + box-shadow: none; + } + .search-form-fluid .search-page-input:focus { + box-shadow: none; + } + .token-warning { + position: absolute; + top: 10px; + right: 85px; + color: #000; + } + .sort-bar { + border-bottom: 1px solid #f1f1f1; + margin-bottom: 20px; + padding-bottom: 20px; + } + .sort-bar .sort-label { + padding-right: 5px; + font-weight: 200; + font-size: 13px; + color: #666; + } + .sort-bar .select-menu { + float: right; + } + .sort-bar h3 { + margin: 0; + } + .file-editor-textarea { + width: 100%; + padding: 5px 4px; + font: + 12px Consolas, + "Liberation Mono", + Menlo, + Courier, + monospace; + resize: vertical; + border: 0; + border-radius: 0; + outline: none; + } + .container-preview .tabnav-tabs { + margin: -6px 0 -6px -11px; + } + .container-preview .tabnav-tabs .tabnav-tab { + padding: 12px 15px; + border-radius: 0; + } + .container-preview .tabnav-tabs > .selected:first-child { + border-top-left-radius: 3px; + } + .container-preview .tabnav-tabs .selected { + font-weight: bold; + } + .container-preview.show-code .commit-create, + .container-preview.show-code .actions { + display: block; + } + .container-preview.show-code .commit-preview, + .container-preview.show-code .loading-preview-msg, + .container-preview.show-code .no-changes-preview-msg, + .container-preview.show-code .error-preview-msg { + display: none; + } + .container-preview:not(.show-code) .commit-create, + .container-preview:not(.show-code) .actions { + display: none; + } + .container-preview.loading-preview .loading-preview-msg { + display: block; + } + .container-preview.loading-preview .no-changes-preview-msg, + .container-preview.loading-preview .error-preview-msg, + .container-preview.loading-preview .commit-preview { + display: none; + } + .container-preview.show-preview .commit-preview { + display: block; + } + .container-preview.show-preview .loading-preview-msg, + .container-preview.show-preview .no-changes-preview-msg, + .container-preview.show-preview .error-preview-msg { + display: none; + } + .container-preview.no-changes-preview .no-changes-preview-msg { + display: block; + } + .container-preview.no-changes-preview .loading-preview-msg, + .container-preview.no-changes-preview .error-preview-msg, + .container-preview.no-changes-preview .commit-preview { + display: none; + } + .container-preview.error-preview .error-preview-msg { + display: block; + } + .container-preview.error-preview .loading-preview-msg, + .container-preview.error-preview .no-changes-preview-msg, + .container-preview.error-preview .commit-preview { + display: none; + } + .container-preview p.preview-msg { + padding: 30px; + font-size: 16px; + } + .ace_editor.ace-github-light { + position: relative; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; + line-height: 18px; + } + .ace_editor.ace-github-light .ace_scroller.ace_scroll-left { + box-shadow: none; + } + .ace_gutter { + border-right: 1px solid #eee; + } + .ace_gutter-layer { + min-width: 50px; + } + .ace_nobold .ace_line > span { + font-weight: normal !important; + } + .ace_marker-layer .ace_step { + background-color: #fcff00; + } + .ace_marker-layer .ace_stack { + background-color: #a4e565; + } + .ace_marker-layer .ace_selected-word { + background-color: #fafaff; + } + .ace_indent-guide { + box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.1); + } + .details-collapse .collapse { + position: relative; + display: none; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease-in-out; + transition: height 0.35s ease-in-out; + } + .details-collapse.open .collapse { + display: block; + height: auto; + overflow: visible; + } + .comment .email-format { + line-height: 1.5; + } + .comment .context-loader { + display: none; + } + .previewable-edit .previewable-comment-form { + display: none; + } + .previewable-edit .previewable-comment-form .form-actions { + margin-bottom: 10px; + margin-right: 10px; + } + .previewable-edit.is-comment-editing .timeline-comment-header { + display: none; + } + .is-comment-editing .timeline-comment-actions, + .is-comment-editing .edit-comment-hide { + display: none; + } + .is-comment-editing .previewable-comment-form { + display: block; + } + .is-comment-loading .context-loader { + display: block; + } + .is-comment-loading .previewable-comment-form { + opacity: 0.5; + } + .is-comment-stale .comment-form-stale { + display: block; + } + .is-comment-stale .comment-content { + padding-top: 10px; + } + .is-comment-stale .previewable-comment-form { + opacity: 0.75; + } + .comment-body { + width: 100%; + padding: 15px; + overflow: visible; + font-size: 14px; + } + .comment-body .highlight { + overflow: visible !important; + background-color: transparent; + } + .comment-form-textarea { + width: 100%; + max-width: 100%; + height: 100px; + min-height: 100px; + margin: 0; + font-size: 14px; + line-height: 1.6; + -webkit-transform: translateZ(0); + transform: translateZ(0); + } + .comment-form-textarea.dragover { + border: solid 1px #4078c0; + } + .discussion-topic-header { + position: relative; + padding: 10px; + word-wrap: break-word; + } + .comment-form-error, + .comment-form-stale { + display: none; + padding: 5px 10px; + margin: 0 10px; + font-weight: bold; + color: #900; + background-color: #ffeaea; + border: 1px solid #e2a0a0; + } + .comment-form-error.comment-form-bottom, + .comment-form-stale.comment-form-bottom { + margin-bottom: 10px; + } + .comment-form-stale { + margin-top: 0; + } + .email-format { + line-height: 1.5em !important; + } + .email-format div { + white-space: pre-wrap; + } + .email-format .email-hidden-reply { + display: none; + white-space: pre-wrap; + } + .email-format .email-quoted-reply, + .email-format .email-signature-reply { + padding: 0 15px; + margin: 15px 0; + color: #767676; + border-left: 4px solid #ddd; + } + .email-format .email-hidden-toggle a { + display: inline-block; + height: 12px; + padding: 0 9px; + font-size: 12px; + font-weight: bold; + line-height: 6px; + color: #555; + text-decoration: none; + vertical-align: middle; + background: #ddd; + border-radius: 1px; + } + .email-format .email-hidden-toggle a:hover { + background-color: #ccc; + } + .email-format .email-hidden-toggle a:active { + color: #fff; + background-color: #4078c0; + } + .comment-email-format div { + white-space: normal; + } + .comment-email-format .email-hidden-reply { + display: none; + white-space: normal; + } + .comment-email-format blockquote, + .comment-email-format p { + margin: 0; + } + .blankslate.conversation-limited { + padding: 20px 0 10px; + margin: 15px; + } + .locked-conversation .write-tab, + .locked-conversation .preview-tab { + color: #ccc; + } + .commit-sha { + padding: 0.2em 0.4em; + font-size: 90%; + font-weight: normal; + background-color: #f5f5f5; + border: 1px solid #eee; + border-radius: 0.2em; + } + .commit-partial-notice { + margin-top: 20px; + margin-bottom: 20px; + } + .commit-paginate-container { + float: right; + margin: -5px 0 0; + text-align: inherit; + } + .commit .commit-title, + .commit .commit-title a { + color: #4e575b; + } + .commit .commit-title.blank, + .commit .commit-title.blank a { + color: #9cabb1; + } + .commit .commit-title .issue-link { + font-weight: bold; + color: #4078c0; + } + .commit .sha-block, + .commit .sha { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; + } + .commit.open .commit-desc { + display: block; + } + .commit-link { + font-weight: normal; + color: #4078c0; + } + .commit-email-flash { + display: inline; + } + .commit-desc { + display: none; + } + .commit-desc pre { + max-width: 700px; + margin: 10px 0; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 13px; + line-height: 1.45; + color: #596063; + white-space: pre-wrap; + } + .commit-desc + .commit-branches { + padding-top: 8px; + margin-top: 2px; + border-top: solid 1px #d1e2eb; + } + .commit-tease { + padding: 8px 8px 0; + background: #e6f1f6; + border: 1px solid #b7c7cf; + border-bottom-color: #d8e6ec; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + .commit-tease p.commit-title { + margin: 0 0 6px; + } + .commit-tease .commit-desc { + margin: -3px 0 10px; + } + .commit-tease .commit-desc pre { + font-size: 11px; + } + .commit-tease .commit-meta { + padding: 8px; + margin-right: -8px; + margin-left: -8px; + background: #fff; + border-top: 1px solid #d8e6ec; + } + .commit-tease .commit-meta .loader-loading { + margin: 0 0 -9px; + } + .commit-tease .zeroclipboard-link { + float: right; + margin-top: -2px; + margin-left: 5px; + } + .commit-tease .sha-block { + float: right; + color: #888; + } + .commit-tease .sha-block > .sha { + color: #444; + } + .commit-tease .sha-block > a { + color: #444; + text-decoration: none; + } + .commit-tease .authorship { + margin: -2px 0 -4px -4px; + font-size: 12px; + color: #767676; + } + .commit-tease .authorship a { + font-weight: bold; + color: #444; + text-decoration: none; + } + .commit-tease .authorship a:hover { + text-decoration: underline; + } + .commit-tease .authorship .avatar { + margin: -2px 3px 0 0; + } + .commit-tease .authorship .author-name { + color: #444; + } + .commit-tease .authorship .committer { + display: block; + margin-left: 30px; + font-size: 11px; + } + .comment-count { + float: right; + margin-top: 1px; + font-size: 11px; + color: #7f9199; + } + .comment-count .octicon { + margin-left: 5px; + vertical-align: middle; + } + .commits-listing { + position: relative; + padding-bottom: 20px; + margin-bottom: 15px; + } + .commits-listing:before { + position: absolute; + top: 0; + bottom: 0; + left: 14px; + z-index: -1; + display: block; + width: 2px; + content: ""; + background-color: #f3f3f3; + } + .commits-listing .discussion-item-icon { + margin-right: 5px; + margin-left: -1px; + } + .commits-listing .timeline-commits { + padding-left: 8px; + margin-bottom: 20px; + } + .commits-listing .timeline-commits:last-child { + margin-bottom: 0; + } + .commits-listing-padded { + padding-left: 39px; + } + .commit-group { + margin-top: 10px; + list-style-type: none; + } + .commit-group-title { + margin-top: 15px; + margin-left: -31px; + color: #767676; + } + .commit-group-title .octicon-git-commit { + margin-right: 17px; + color: #ccc; + background: #fff; + } + .commits-list-item.navigation-focus { + background: #f7fbfc; + } + .commits-list-item .commit-title { + margin: 0; + font-size: 15px; + font-weight: bold; + color: #333; + } + .commits-list-item .commit-meta { + margin-top: 1px; + font-weight: normal; + color: #767676; + } + .commits-list-item .deployment-indicator { + color: #bbb; + } + .commits-list-item .status .octicon { + height: 14px; + line-height: 14px; + } + .commits-list-item .commit-author { + color: #767676; + } + .commits-list-item .octicon-arrow-right { + margin: 0 3px; + } + .commits-list-item .btn-outline { + margin-top: 2px; + } + .commits-list-item .commit-desc pre { + padding-left: 8px; + margin-top: 5px; + margin-bottom: 10px; + font-size: 12px; + color: #596063; + border-left: 1px solid #e5e5e5; + } + .commits-list-item .commit-desc pre a { + word-break: break-word; + } + .commits-comments-link { + margin-top: 9px; + color: #767676; + vertical-align: middle; + } + .commits-comments-link:hover { + color: #4183c4; + text-decoration: none; + } + .commit-avatar-cell { + width: 47px; + } + .commit-avatar-cell.table-list-cell { + padding-right: 0; + } + .commit-indicator { + margin-left: 5px; + } + .commit-links-cell { + width: 230px; + text-align: right; + } + .commit-links-group { + margin-right: 5px; + } + .timeline-commits { + width: 100%; + margin-top: 5px; + border-collapse: separate; + } + .timeline-commits + .timeline-commits { + margin-top: 15px; + } + .timeline-commits td { + padding-top: 4px; + padding-right: 8px; + padding-bottom: 4px; + font-size: 12px; + line-height: 16px; + vertical-align: top; + background-color: transparent; + } + .discussion-item .timeline-commits .commit-author { + display: none; + } + .timeline-commits .commit-gravatar { + width: 16px; + padding-left: 10px; + } + .timeline-commits .commit-author { + width: 200px; + padding-right: 20px; + white-space: nowrap; + } + .timeline-commits .author { + font-weight: bold; + color: #555; + } + .timeline-commits .commit-message { + min-height: 0; + max-width: 550px; + } + .timeline-commits .commit-message a { + color: #555; + } + .timeline-commits .commit-message a:hover { + color: #4078c0; + } + .timeline-commits .commit-desc pre { + padding-left: 10px; + font-size: 11px; + color: #767676; + border-left: 1px solid #eee; + overflow: visible; + } + .timeline-commits .hidden-text-expander { + margin-top: 3px; + margin-left: 0; + vertical-align: top; + } + .timeline-commits .hidden-text-expander a { + height: 13px; + background-color: #eee; + } + .timeline-commits .hidden-text-expander a:hover { + color: #fff; + background-color: #4078c0; + } + .timeline-commits .commit-meta { + text-align: right; + white-space: nowrap; + } + .timeline-commits .commit-meta .status { + width: 16px; + text-align: center; + } + .timeline-commits .commit-meta .status.status-pending { + color: #cea61b; + } + .timeline-commits .commit-meta .octicon { + margin-right: 1px; + margin-left: 1px; + } + .commit-icon { + display: table-cell; + width: 16px; + color: #ccc; + } + .commit-icon .octicon { + background-color: #fff; + } + .commit-id { + color: #bbb; + } + .commit-id:hover { + color: #4078c0; + } + .full-commit { + padding: 8px 8px 0; + margin: 10px 0; + background: #e6f1f6; + border: 1px solid #c5d5dd; + border-radius: 3px; + } + .full-commit:first-child { + margin-top: 0; + } + .full-commit .btn-outline { + background: none; + border: 1px solid #cedee5; + } + .full-commit .btn-outline:hover { + color: #4078c0; + border: 1px solid #4078c0; + } + .full-commit p.commit-title { + margin: 0 0 8px; + font-size: 18px; + font-weight: bold; + color: #213f4d; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + } + .full-commit .branches-list { + display: inline; + margin-right: 10px; + margin-left: 2px; + vertical-align: middle; + list-style: none; + } + .full-commit .branches-list li { + display: inline-block; + padding-left: 3px; + font-weight: bold; + color: #596063; + } + .full-commit .branches-list li:before { + padding-right: 6px; + font-weight: normal; + content: "+"; + } + .full-commit .branches-list li:first-child { + padding-left: 0; + } + .full-commit .branches-list li:first-child:before { + padding-right: 0; + content: ""; + } + .full-commit .branches-list li.loading { + font-weight: normal; + color: #818c90; + } + .full-commit .branches-list li.pull-request { + font-weight: normal; + color: #818c90; + } + .full-commit .branches-list li.pull-request:before { + margin-left: -8px; + content: ""; + } + .full-commit .branches-list li.pull-request-error { + margin-bottom: -1px; + } + .full-commit .branches-list li a { + color: inherit; + } + .full-commit .commit-meta { + padding: 8px; + margin-right: -8px; + margin-left: -8px; + background: #fff; + border-top: 1px solid #d8e6ec; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + .full-commit .sha-block { + float: right; + margin-left: 15px; + font-size: 12px; + color: #888; + } + .full-commit.merge-commit .sha-block { + clear: right; + } + .full-commit.merge-commit .sha-block + .sha-block { + margin-top: 2px; + } + .full-commit .sha-block > .sha { + color: #444; + } + .full-commit .sha-block > a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #ccc; + } + .full-commit .sha-block > a:hover { + border-bottom: 1px solid #444; + } + .full-commit .authorship { + margin-top: -2px; + margin-bottom: -4px; + margin-left: -4px; + font-size: 14px; + color: #767676; + } + .full-commit .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; + } + .full-commit .authorship a { + font-weight: bold; + color: #444; + text-decoration: none; + } + .full-commit .authorship a:hover { + text-decoration: underline; + } + .full-commit .authorship .author-name { + color: #444; + } + .full-commit .authorship .hint a { + color: #4078c0; + } + .full-commit .authorship .committer { + display: block; + margin-top: -2px; + margin-left: 34px; + font-size: 12px; + } + .full-commit .commit-desc { + display: block; + margin: -5px 0 10px; + } + .full-commit .commit-desc pre { + max-width: 100%; + overflow: visible; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + word-wrap: break-word; + } + .branches-tag-list { + display: inline; + margin-right: 10px; + margin-left: 2px; + vertical-align: middle; + list-style: none; + } + .branches-tag-list .more-commit-details, + .branches-tag-list.open .hidden-text-expander { + display: none; + } + .branches-tag-list.open .more-commit-details { + display: inline-block; + } + .branches-tag-list li { + display: inline-block; + padding-left: 3px; + } + .branches-tag-list li:first-child { + padding-left: 0; + font-weight: bold; + color: #596063; + } + .branches-tag-list li.loading { + font-weight: normal; + color: #818c90; + } + .branches-tag-list li.abbrev-tags { + cursor: pointer; + } + .branches-tag-list li a { + color: inherit; + } + .branches-tag-list li .hidden-text-expander a { + background-color: #dae5eb; + } + .branches-tag-list li .hidden-text-expander a:hover { + background-color: #d1dbe0; + } + .commit-branches { + min-height: 18px; + margin-top: -6px; + margin-bottom: 8px; + font-size: 12px; + color: #818c90; + vertical-align: middle; + } + .commit-branches .octicon { + vertical-align: middle; + } + .commit-loader .loader-error { + display: none; + margin: 0; + font-size: 12px; + font-weight: bold; + color: #bd2c00; + } + .commit-loader.error .loader-loading { + display: none; + } + .commit-loader.error .loader-error { + display: block; + } + .historical-banner { + padding: 15px 20px 15px 130px; + margin-bottom: 20px; + overflow: hidden; + color: #333; + background: #fff; + border: 1px solid #e5e5e5; + border-radius: 5px; + } + .historical-banner h2 { + margin: 0 0 5px; + } + .historical-banner p { + margin: 0; + } + .historical-banner .illustration { + position: absolute; + top: 12px; + left: 20px; + color: rgba(0, 0, 0, 0.1); + } + .roses-divider { + margin-bottom: 20px; + text-align: center; + } + .file-history-tease { + margin-bottom: 10px; + font-size: 14px; + color: #7b878c; + background: #e7ecee; + border: 1px solid #d2d9dd; + border-radius: 3px; + } + .file-history-tease .author a { + font-weight: bold; + color: #000; + } + .file-history-tease .commit-title { + display: inline; + } + .file-history-tease .sha { + font-size: 13px; + } + .file-history-tease .loader-loading, + .file-history-tease .loader-error { + margin: 0; + } + .file-history-tease .loader-loading img, + .file-history-tease .loader-error img { + vertical-align: middle; + } + .file-history-tease .participation { + padding: 5px 8px; + font-size: 12px; + font-weight: normal; + line-height: 20px; + color: #666; + background-color: #fff; + border-top: 1px solid #d8e6ec; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + .file-history-tease .participation:before { + display: table; + content: ""; + } + .file-history-tease .participation:after { + display: table; + clear: both; + content: ""; + } + .file-history-tease .participation .quickstat { + float: left; + margin: 0 10px 0 0; + } + .file-history-tease .participation .quickstat strong { + color: #000; + } + .file-history-tease .participation a { + color: #888; + text-decoration: none; + } + .file-history-tease .participation .avatar-link { + margin-right: 3px; + } + .file-history-tease-header { + padding: 5px 8px; + line-height: 24px; + } + .file-history-tease-header .avatar { + float: left; + margin-right: 5px; + } + .commit-comments-heading h3 { + display: inline-block; + margin-right: 15px; + } + .commit-build-statuses { + position: relative; + display: inline-block; + text-align: left; + } + .commit-build-statuses.active .dropdown-menu-content { + display: block; + } + .commit-build-statuses.active .tooltipped:before, + .commit-build-statuses.active .tooltipped:after { + display: none; + } + .commit-build-statuses .dropdown-menu { + min-width: 400px; + max-width: 500px; + padding-top: 0; + padding-bottom: 0; + } + .commit-build-statuses .dropdown-menu .build-statuses-list { + max-height: 170px; + border-bottom: 0; + } + .commit-build-statuses .dropdown-menu-w, + .commit-build-statuses .dropdown-menu-e { + top: -11px; + } + .commit-build-statuses .status-description .btn-link { + display: none; + } + .commit-build-statuses .build-status-item:last-child { + border-radius: 0 0 2px 2px; + } + .commit-ref { + position: relative; + display: inline-block; + padding: 0 5px; + border-radius: 3px; + font: + 0.75em/2 Consolas, + "Liberation Mono", + Menlo, + Courier, + monospace; + color: #336479; + white-space: nowrap; + background-color: #e8f0f8; + } + .commit-ref .user { + color: #598a9f; + } + a.commit-ref:hover { + text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.2); + background-color: #2a5177; + background-image: -webkit-linear-gradient(#74a4d4, #2a5177); + background-image: linear-gradient(#74a4d4, #2a5177); + background-repeat: repeat-x; + border-color: #2a5177; + text-decoration: none; + } + .compare-cutoff, + .diff-cutoff { + margin: 5px 0; + padding: 8px 0; + font-weight: bold; + text-align: center; + border-radius: 3px; + color: #4c4a42; + background-color: #fff9ea; + border: solid 1px #dfd8c2; + } + .table-of-contents { + margin: 15px 0; + } + .table-of-contents li { + padding: 7px 0; + list-style-type: none; + } + .table-of-contents li + li { + border-top: 1px solid #eee; + } + .table-of-contents li > .octicon { + margin-right: 3px; + vertical-align: -1px; + } + .table-of-contents .octicon-diff-removed { + color: #bd2c00; + } + .table-of-contents .octicon-diff-renamed { + color: #677a85; + } + .table-of-contents .octicon-diff-modified { + color: #d0b44c; + } + .table-of-contents .octicon-diff-added { + color: #6cc644; + } + .toc-diff-stats { + padding-left: 20px; + line-height: 26px; + } + .toc-diff-stats .octicon { + float: left; + margin-top: 3px; + margin-left: -20px; + color: #ccc; + } + .toc-diff-stats .btn-link { + font-weight: bold; + } + .toc-diff-stats + .content { + padding-top: 5px; + } + span.no-nl-marker { + position: relative; + color: #bd2c00; + vertical-align: middle; + } + .symlink .no-nl-marker { + display: none; + } + .existing-pull { + margin: 10px 0; + } + .existing-pull .list-group-item:before { + display: table; + content: ""; + } + .existing-pull .list-group-item:after { + display: table; + clear: both; + content: ""; + } + .existing-pull .existing-pull-contents { + float: left; + width: 680px; + } + .existing-pull .existing-pull-button { + float: right; + margin-top: 3px; + } + .existing-pull .existing-pull-number { + font-weight: normal; + color: #aaa; + } + .existing-pull .css-truncate { + max-width: 700px; + } + .existing-pull .css-truncate p { + display: inline; + } + .compare-pr-placeholder { + margin: 10px 0; + padding: 15px; + font-size: 14px; + color: #4c4a42; + background-color: #fff9ea; + border: solid 1px #dfd8c2; + border-radius: 3px; + } + .compare-pr-placeholder p { + margin: 7px 0; + color: #6d6c60; + } + .compare-pr-placeholder .btn { + margin-right: 10px; + margin-bottom: -2px; + } + .compare-pr-placeholder .btn .octicon { + vertical-align: -1px; + } + .compare-pr-placeholder .help-link { + margin-top: 5px; + margin-right: -3px; + padding: 3px; + color: #9c997d; + text-decoration: none; + } + .compare-pr .new-pr-form { + display: none; + } + .compare-pr .contributing { + display: none; + } + .compare-pr.open .compare-pr-placeholder { + display: none; + } + .compare-pr.open .new-pr-form { + display: block; + } + .compare-pr.open .contributing { + display: block; + } + .contributing { + padding: 15px; + margin: 15px 0; + font-size: 14px; + color: #4c4a42; + background-color: #fff9ea; + border: 1px solid #dfd8c2; + border-radius: 3px; + } + #contact-github textarea { + height: 100px; + resize: vertical; + } + #contact-github .checklist { + font-size: 13px; + } + .heartocat { + display: block; + margin: 50px auto 0; + } + .documentation-results-wrapper { + position: relative; + top: -19px; + } + .documentation-results { + position: absolute; + top: 0; + z-index: 2; + width: 400px; + margin-top: 5px; + clear: both; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); + } + .documentation-results ul { + width: 100%; + } + .documentation-results ul li:first-child a { + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + .documentation-results .documentation-results-footer a { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + } + .documentation-results a { + outline: none; + padding: 5px 10px; + display: block; + color: #333; + font-weight: bold; + cursor: pointer; + text-decoration: none; + border: solid #ddd; + border-width: 0 1px 1px; + background-color: #fff; + } + .documentation-results a:hover { + background-color: #3586c3; + color: #fff; + } + .documentation-results a.selected { + background-color: #3586c3; + color: #fff; + } + ul.documentation-results-group { + list-style-type: none; + } + .contact-form-extras { + display: none; + } + .context-loader-container .context-loader { + display: none; + } + .context-loader-container .context-loader.is-context-loading { + display: block; + white-space: nowrap; + } + .context-loader-container .context-loader-overlay { + opacity: 1; + -webkit-transition: opacity 0.25s ease-in-out; + transition: opacity 0.25s ease-in-out; + } + .context-loader-container .context-loader-overlay.is-context-loading { + opacity: 0.5; + } + .page-context-loader { + margin-left: 10px; + display: none; + } + .page-context-loader.is-context-loading { + display: inline-block; + } + body.disables-context-loader .page-context-loader, + body.disables-context-loader .context-loader { + display: none !important; + } + .contributions-tab { + margin-top: 20px; + } + .calendar-graph { + padding: 5px 0 0; + height: 126px; + text-align: center; + } + .calendar-graph.days-selected rect.day { + opacity: 0.5; + } + .calendar-graph.days-selected rect.day.active { + opacity: 1; + } + .calendar-graph .activity { + margin-top: 0; + } + .calendar-graph .dots { + margin: 20px auto 0; + width: 64px; + height: 64px; + } + .calendar-graph text.month { + font-size: 10px; + fill: #aaa; + } + .calendar-graph text.wday { + fill: #ccc; + font-size: 9px; + } + #contributions-calendar rect.day { + shape-rendering: crispedges; + } + #contributions-calendar rect.day.empty:hover { + stroke: none; + } + #contributions-calendar rect.day:hover { + stroke: #555; + stroke-width: 1px; + } + .contrib-column { + padding: 15px 0; + text-align: center; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + font-size: 11px; + } + .contrib-column-first { + border-left: 0; + } + .contrib-number { + font-weight: 300; + line-height: 1.3em; + font-size: 24px; + display: block; + color: #333; + } + .contrib-footer { + font-size: 11px; + padding: 0 10px 12px; + } + .contrib-legend { + font-size: 11px; + color: #767676; + float: right; + } + .contrib-legend .legend { + display: inline-block; + list-style: none; + margin: 0 5px; + position: relative; + bottom: -1px; + } + .contrib-legend .legend li { + display: inline-block; + width: 10px; + height: 10px; + } + .new-user-contrib-intro { + border-top: solid 1px #ddd; + padding: 5px 20px; + font-size: 16px; + } + .contrib-square { + color: #d6e685; + font-size: 22px; + line-height: 1; + } + .contribution-activity h2 { + font-size: 18px; + font-weight: normal; + margin: 30px 0 15px; + } + .contribution-activity .select-menu-button { + position: relative; + top: -4px; + } + .contribution-activity.loading .contribution-activity-listing { + display: none; + } + .contribution-activity.loading .contribution-activity-spinner { + display: block; + } + .contribution-activity-spinner { + margin: 20px auto 0; + width: 64px; + height: 64px; + display: none; + } + ul.simple-conversation-list a.meta { + color: #767676; + } + li.contribution { + list-style: none; + padding: 10px 0; + } + li.contribution:last-child { + border-bottom: 0; + } + li.contribution h3 { + font-size: 14px; + display: inline-block; + margin: 0; + } + li.contribution h3 a { + color: #4078c0; + } + li.contribution .cmeta { + display: block; + font-size: 12px; + color: #aaa; + font-weight: normal; + } + li.contribution .cmeta a { + color: #666; + } + li.contribution .cmt { + color: #767676; + } + li.contribution .d { + color: #c00; + } + li.contribution .a { + color: #8cac29; + } + li.contribution .num { + color: #767676; + } + .subscribe-feed { + display: inline-block; + color: #333; + } + .subscribe-feed .octicon { + margin-right: 5px; + } + .new-user-panel { + position: relative; + padding: 18px; + margin-bottom: 30px; + font-size: 16px; + border: dashed 2px #ccc; + border-radius: 3px; + } + .new-user-panel-close { + position: absolute; + top: 10px; + right: 18px; + color: #ccc; + } + .new-user-panel-close:hover { + color: #666; + } + .new-user-intro { + margin: 0 120px; + font-size: 36px; + font-weight: normal; + line-height: 1.3; + text-align: center; + } + .new-user-heading-small { + margin: 5px 170px 20px; + font-size: 20px; + color: #888; + text-align: center; + } + .button-hello-world { + font-size: 16px; + padding: 10px 50px; + } + .welcome-guides { + position: relative; + padding: 30px; + margin-bottom: 30px; + border: 2px dashed #ddd; + border-radius: 3px; + } + .welcome-guides h1 { + margin-top: 0; + margin-bottom: 0; + text-align: center; + } + .welcome-guides .lead { + margin-top: 0; + margin-bottom: 20px; + text-align: center; + } + .welcome-guides .guides-list-item { + color: #767676; + } + .welcome-guides .guides-list-item:hover { + color: #4078c0; + text-decoration: none; + } + .welcome-guides .guides-list-item p { + margin-bottom: 0; + } + .welcome-guides .dismiss-guides { + position: absolute; + top: 30px; + right: 28px; + display: block; + padding-left: 5px; + color: #ccc; + } + .welcome-guides .dismiss-guides:hover { + color: #4078c0; + } + .guides-bootcamp { + text-align: center; + } + .guides-bootcamp p { + margin-top: 0; + margin-bottom: 0; + } + .guides-bootcamp .guides-list-item { + padding-right: 15px; + padding-left: 15px; + } + .guides-bootcamp .guides-image { + display: block; + width: auto; + height: 100px; + margin: 10px auto 20px; + } + .guides-bootcamp .guides-list-title { + margin-top: 0; + margin-bottom: 5px; + color: #4078c0; + } + .bootcamp { + margin: 0 0 20px; + } + .bootcamp h1 { + position: relative; + padding: 8px 10px; + margin: 0; + font-size: 16px; + font-weight: bold; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + background-color: #829aa8; + border: 1px solid #677c89; + border-bottom-color: #6b808d; + border-radius: 3px 3px 0 0; + } + .bootcamp h1 a { + color: #fff; + text-decoration: none; + } + .bootcamp .octicon-x { + position: relative; + top: -2px; + font-size: 16px; + line-height: 16px; + } + .bootcamp .dismiss-bootcamp { + position: absolute; + top: 9px; + right: 9px; + display: block; + width: 16px; + height: 16px; + background-repeat: no-repeat; + background-position: 0 0; + } + .bootcamp .dismiss-bootcamp:hover { + background-position: 0 -19px; + } + .bootcamp .bootcamp-body { + padding: 10px 1%; + overflow: hidden; + background-color: #e9f1f4; + border-color: #e9f1f4 #d8dee2 #d8dee2; + border-style: solid; + border-width: 1px; + border-radius: 0 0 3px 3px; + } + .bootcamp ul li { + background-color: #f5f3b4; + background-image: -webkit-linear-gradient(#fffff5, #f5f3b4); + background-image: linear-gradient(#fffff5, #f5f3b4); + background-repeat: repeat-x; + position: relative; + display: block; + float: left; + width: 24.25%; + height: 215px; + margin: 0 1% 0 0; + overflow: hidden; + font-size: 13px; + font-weight: normal; + color: #666; + border: 1px solid #dfddb5; + border-radius: 3px; + box-shadow: 0 1px 0 #fff; + } + .bootcamp ul li.be-social { + margin-right: 0; + } + .bootcamp ul li:hover { + background-color: #f1eea3; + background-image: -webkit-linear-gradient(#fcfce9, #f1eea3); + background-image: linear-gradient(#fcfce9, #f1eea3); + background-repeat: repeat-x; + border: 1px solid #d6d4ad; + } + .bootcamp ul li a { + color: #666; + text-decoration: none; + } + .bootcamp .image { + position: relative; + display: block; + height: 133px; + background-repeat: no-repeat; + background-position: center center; + } + .bootcamp .setup .image { + background-image: url(/images/modules/dashboard/bootcamp/octocat_setup.png); + background-size: 129px 96px; + } + .bootcamp .create-a-repo .image { + background-image: url(/images/modules/dashboard/bootcamp/octocat_repo.png); + background-size: 129px 96px; + } + .bootcamp .fork-a-repo .image { + background-image: url(/images/modules/dashboard/bootcamp/octocat_fork.png); + background-size: 178px 96px; + } + .bootcamp .be-social .image { + background-image: url(/images/modules/dashboard/bootcamp/octocat_collabocats.png); + background-position: center 27px; + background-size: 207px 96px; + } + .bootcamp .desc { + position: relative; + z-index: 2; + padding: 10px 15px 20px; + overflow: hidden; + text-align: center; + background-repeat: no-repeat; + } + .bootcamp .desc > h2 { + padding: 0; + margin: 0 0 5px; + font-size: 15px; + color: #393939; + } + .bootcamp .desc p { + padding: 0; + margin: 0; + line-height: 1.2em; + } + .bootcamp .step-number { + position: absolute; + top: -1px; + left: 10px; + font-size: 36px; + font-weight: bold; + color: #e4e1a8; + opacity: 0.75; + } + .user-repos .mini-repo-list-item { + padding-right: 6px; + } + .user-repos .mini-repo-list-item .repo-and-owner { + max-width: 100%; + } + .user-repos .mini-repo-list-item .owner { + max-width: 145px; + } + #example_octofication { + float: right; + width: 335px; + margin: 0; + } + .octofication { + margin-bottom: 15px; + } + .octofication .message { + min-height: 56px; + padding: 10px 10px 10px 50px; + border: solid 1px #4078c0; + border-radius: 3px; + } + .octofication .message h3 { + margin: 1px 20px 3px 0; + font-size: 14px; + line-height: 1.2; + } + .octofication .message p { + padding: 0; + margin: 0; + font-size: 12px; + color: #555; + } + .octofication .message p + p { + margin-top: 15px; + } + .octofication .broadcast-icon { + position: relative; + float: left; + margin-left: -40px; + color: #4078c0; + } + .octofication .broadcast-icon-mask { + position: absolute; + top: 0; + width: 10px; + height: 16px; + background-color: #fff; + opacity: 0; + -webkit-animation: broadCastMaskFade 1s ease-in-out 2s 2; + animation: broadCastMaskFade 1s ease-in-out 2s 2; + } + .octofication .broadcast-icon-mask.left { + left: 0; + } + .octofication .broadcast-icon-mask.right { + right: 0; + } + .octofication .notice-dismiss { + position: relative; + top: -2px; + float: right; + color: #bbb; + } + .octofication .notice-dismiss:hover { + color: #666; + } + .octofication-more { + margin: 5px 0; + font-size: 11px; + text-align: right; + } + @-webkit-keyframes broadCastMaskFade { + 0% { + opacity: 0; + } + 30% { + opacity: 1; + } + 70% { + opacity: 1; + } + 100% { + opacity: 0; + } + } + @keyframes broadCastMaskFade { + 0% { + opacity: 0; + } + 30% { + opacity: 1; + } + 70% { + opacity: 1; + } + 100% { + opacity: 0; + } + } + .github-jobs-promotion { + margin-bottom: 15px; + } + .github-jobs-promotion p { + background-color: #e4f0ff; + background-image: -webkit-linear-gradient(#f5fbff, #e4f0ff); + background-image: linear-gradient(#f5fbff, #e4f0ff); + background-repeat: repeat-x; + position: relative; + padding: 10px 18px; + font-size: 12px; + color: #1b3650; + text-align: center; + border: 1px solid #cee0e7; + border-radius: 3px; + } + .github-jobs-promotion p a { + color: #1b3650; + } + .github-jobs-promotion a.jobs-logo { + display: block; + font-size: 11px; + color: #767676; + text-align: center; + } + .github-jobs-promotion a.jobs-logo:hover { + text-decoration: none; + } + .github-jobs-promotion a.jobs-logo strong { + display: inline-block; + width: 62px; + height: 12px; + text-indent: -9999px; + vertical-align: middle; + background: url(/images/modules/jobs/logo.png) 0 0 no-repeat; + background-size: 62px auto; + } + .github-jobs-promotion .job-location { + white-space: nowrap; + } + .github-jobs-promotion a.octicon-info { + position: absolute; + right: 5px; + bottom: 5px; + color: #a9b8be; + text-decoration: none; + cursor: pointer; + opacity: 0.8; + } + .github-jobs-promotion p:hover .octicon-info { + opacity: 1; + } + #dashboard h1 { + margin-bottom: 0.5em; + font-size: 160%; + } + #dashboard h1 a { + font-size: 70%; + font-weight: normal; + } + #dashboard .notice { + padding: 15px; + margin-top: 0; + margin-bottom: 0; + text-align: center; + } + .news .release { + margin-top: 0; + margin-bottom: 0; + } + .news blockquote { + color: #666; + } + .news h1 { + margin-bottom: 0; + } + .news .alert { + position: relative; + padding: 0 0 1em 45px; + overflow: hidden; + border-top: 1px solid #f1f1f1; + } + .news .alert .commits { + padding-left: 40px; + } + .news .alert .css-truncate.css-truncate-target, + .news .alert .css-truncate .css-truncate-target { + max-width: 180px; + } + .news .alert p { + margin: 0; + } + .news .alert .markdown-body blockquote { + padding: 0 0 0 40px; + border: 0 none; + } + .news .alert .mega-octicon { + position: absolute; + top: 14px; + left: 0; + width: 32px; + height: 32px; + padding: 3px; + color: #bbb; + } + .news .alert .mega-octicon::before { + color: inherit; + } + .news .alert .octicon { + width: 16px; + height: 16px; + color: #bbb; + } + .news .alert .body { + padding: 1em 0 0; + overflow: hidden; + font-size: 14px; + border-bottom: 0; + } + .news .alert .time { + font-size: 12px; + color: #bbb; + } + .news .alert .title { + padding: 0; + font-weight: bold; + } + .news .alert .title .subtle { + color: #bbb; + } + .news .alert .gravatar { + float: left; + margin-right: 0.6em; + line-height: 0; + background-color: #fff; + border-radius: 3px; + } + .news .alert .simple > .octicon { + position: absolute !important; + left: 11px; + width: 16px; + height: 16px; + } + .news .alert .simple .title { + display: inline-block; + font-size: 13px; + font-weight: normal; + color: #666; + } + .news .alert .simple .time { + display: inline-block; + } + .news .alert .branch-link, + .news .alert .pull-info { + display: inline-block; + padding: 3px 7px; + margin-top: 5px; + font-size: 12px; + color: rgba(0, 0, 0, 0.5); + background: #e8f1f6; + border-radius: 3px; + } + .news .alert .branch-link em, + .news .alert .pull-info em { + font-style: normal; + font-weight: bold; + } + .news .alert .branch-link { + position: relative; + top: -2px; + margin: 0; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + color: #4183c4; + } + .news .alert .branch-link .octicon { + display: none; + } + .news .alert:first-child { + border-top: 0; + } + .news .alert:first-child .body { + padding-top: 0; + } + .news .alert:first-child .mega-octicon { + top: 0; + } + .news .git_hub .done { + color: #666; + text-decoration: line-through; + } + .news .commits li { + margin-top: 0.15em; + list-style-type: none; + } + .news .commits li.more { + padding-top: 2px; + font-size: 11px; + } + .news .commits li .committer { + display: none; + padding-left: 0.5em; + } + .news .commits li img { + margin: 0 1px 0 0; + vertical-align: middle; + background-color: #fff; + border-radius: 2px; + } + .news .commits li img.emoji { + padding: 0; + margin: 0; + border: 0; + } + .news .commits li .message { + display: inline-block; + max-width: 390px; + margin-top: 2px; + overflow: hidden; + font-size: 13px; + line-height: 1.3; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + } + .news div.message, + .news li blockquote { + display: inline; + font-size: 13px; + color: #666; + } + .release-assets { + padding-left: 40px; + } + .release-assets li { + margin-top: 0.15em; + list-style-type: none; + } + .release-assets .more { + padding-top: 2px; + font-size: 11px; + } + .news-full, + .page-profile .news { + float: none; + width: auto; + } + .activity-tab .blankslate { + margin-top: 10px; + } + .activity-tab .news .markdown-body blockquote, + .activity-tab .news .alert .commits { + padding-left: 0; + } + .activity-tab .news a.gravatar, + .activity-tab .news div.gravatar { + display: none; + } + .saml-signed-out-notice { + position: relative; + width: 450px; + padding: 10px 10px 10px 70px; + margin: 50px auto 30px; + border: 1px solid #eee; + border-radius: 3px; + } + .saml-signed-out-notice .mega-octicon { + position: absolute; + top: 30px; + left: 20px; + color: #ddd; + } + .saml-signed-out-notice h3 { + margin-bottom: 0; + } + .saml-signed-out-notice p { + margin-top: 5px; + } + .dashboards-overview-lead { + width: 700px; + } + .dashboards-overview-cards .boxed-group { + margin: 10px 0; + width: 100%; + } + .dashboards-overview-cards .boxed-group path { + stroke: #1db34f; + stroke-opacity: 0.5; + } + .dashboards-overview-cards .blankslate { + border: 0; + background-color: #fff; + box-shadow: none; + padding-top: 47px; + } + .dashboards-overview-cards .octicon-arrow-down { + color: #bd2c00; + } + .dashboards-overview-cards .octicon-arrow-up { + color: #1db34f; + } + .dashboards-overview-cards .graph-canvas .dots { + padding: 43px 0; + } + .dashboards-overview-cards .summary-stats { + height: 78px; + } + .dashboards-overview-cards .summary-stats .created_at { + color: #1db34f; + } + .dashboards-overview-cards .summary-stats .closed_at, + .dashboards-overview-cards .summary-stats .merged_at { + color: #4078c0; + } + .dashboards-overview-cards .summary-stats .totals-num { + margin: 0 7px; + } + .dashboards-overview-cards .summary-stats .single { + width: 100%; + } + .dashboards-overview-graph { + height: 160px; + } + .dashboards-overview-graph .path { + fill: none; + stroke-width: 2; + } + .dashboards-overview-graph path.created_at { + stroke: #1db34f; + } + .dashboards-overview-graph path.merged_at, + .dashboards-overview-graph path.closed_at { + stroke: #1d7fb3; + } + .dashboards-overview-graph .y line { + stroke: #1db34f; + } + .dashboards-overview-graph .y.unique line { + stroke: #1d7fb3; + } + .dashboards-overview-graph .overlay { + fill-opacity: 0; + } + .created_at circle { + fill: #1db34f; + stroke: #fff; + stroke-width: 2; + } + .merged_at circle, + .closed_at circle { + fill: #1d7fb3; + stroke: #fff; + stroke-width: 2; + } + .diffstat { + font-size: 12px; + font-weight: bold; + color: #666; + white-space: nowrap; + cursor: default; + } + .diffstat-bar { + display: inline-block; + margin-left: 3px; + font-size: 16px; + color: #ddd; + letter-spacing: 1px; + text-align: left; + text-decoration: none; + font: normal normal 16px/1 "octicons"; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; + } + .discussion-timeline { + position: relative; + width: 760px; + float: left; + } + .discussion-timeline:before { + display: block; + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: 79px; + width: 2px; + background-color: #f3f3f3; + z-index: -1; + } + .discussion-timeline .email-hidden-container { + margin: 3px 0; + } + .discussion-sidebar { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 21; + float: right; + width: 140px; + } + .discussion-sidebar-item { + padding-top: 15px; + font-size: 12px; + color: #767676; + } + .discussion-sidebar-item .btn .octicon { + margin-right: 0; + } + .discussion-sidebar-item .btn-block { + margin-bottom: 8px; + } + .discussion-sidebar-item + .discussion-sidebar-item { + margin-top: 15px; + border-top: 1px solid #eee; + } + .discussion-sidebar-item .select-menu { + position: relative; + } + .discussion-sidebar-item .select-menu-modal-holder { + top: 25px; + left: auto; + right: -1px; + } + .discussion-sidebar-heading { + margin-top: 0; + margin-bottom: 10px; + font-size: 12px; + line-height: 16px; + color: #767676; + } + .discussion-sidebar-toggle { + padding: 5px 0; + margin: -5px 0 5px; + } + .discussion-sidebar-toggle .octicon { + float: right; + padding: 5px; + margin: -6px -5px -5px 5px; + color: #ccc; + } + .discussion-sidebar-toggle:hover { + color: #4078c0; + text-decoration: none; + cursor: pointer; + } + .discussion-sidebar-toggle:hover .octicon { + color: inherit; + } + button.discussion-sidebar-toggle { + display: block; + width: 100%; + font-weight: bold; + text-align: left; + background: none; + border: 0; + } + .sidebar-labels .labels .label { + display: block; + max-width: 100%; + padding: 6px 10px; + font-size: 12px; + box-shadow: none; + } + .sidebar-labels .labels .label + .label { + margin-top: 3px; + } + .sidebar-milestone .progress-bar { + margin-bottom: 2px; + border-radius: 2px; + height: 8px; + } + .milestone-name { + display: block; + margin-top: 5px; + font-weight: bold; + color: #555; + } + .milestone-name .css-truncate-target { + max-width: 100%; + } + .milestone-name:hover { + color: #4078c0; + text-decoration: none; + } + .sidebar-assignee .css-truncate-target { + max-width: 110px; + } + .sidebar-assignee .avatar { + margin-top: -1px; + margin-right: 2px; + border-radius: 2px; + } + .sidebar-assignee .assignee { + color: #555; + font-weight: bold; + } + .sidebar-assignee .assignee:hover { + color: #4078c0; + text-decoration: none; + } + .sidebar-notifications { + position: relative; + } + .sidebar-notifications .thread-subscription-status { + margin: 0; + padding: 0; + border: 0; + } + .sidebar-notifications + .thread-subscription-status + .thread-subscribe-form { + display: block; + } + .sidebar-notifications .thread-subscription-status .mega-octicon { + display: none; + } + .sidebar-notifications .thread-subscription-status .reason { + padding: 0; + margin: 5px 0 0; + font-size: 11px; + color: #767676; + } + .sidebar-notifications .thread-subscription-status .btn-sm { + display: block; + width: 100%; + } + .participation .participant-avatar { + float: left; + margin: 3px 0 0 3px; + } + .participation a { + color: #767676; + } + .participation a:hover { + color: #4078c0; + text-decoration: none; + } + .participation-avatars { + margin-left: -3px; + } + .participation-avatars:before { + display: table; + content: ""; + } + .participation-avatars:after { + display: table; + clear: both; + content: ""; + } + .participation-more { + float: left; + margin: 6px 0 0; + line-height: 14px; + } + .lock-toggle-link { + color: #767676; + font-weight: bold; + } + .lock-toggle-link:hover { + color: #4078c0; + text-decoration: none; + } + .inline-comment-form .form-actions, + .timeline-new-comment .form-actions { + padding: 0 10px 10px; + } + .gh-header-actions { + float: right; + margin-top: 3px; + } + .gh-header-actions .btn-sm { + float: left; + margin-left: 5px; + } + .gh-header-actions .btn-sm .octicon { + margin-right: 0; + } + .gh-header .gh-header-edit { + display: none; + } + .gh-header.open .gh-header-show { + display: none; + } + .gh-header.open .gh-header-edit { + display: block; + } + .gh-header-title { + margin-top: 0; + margin-bottom: 0; + margin-right: 150px; + font-weight: normal; + line-height: 1.1; + word-wrap: break-word; + } + .gh-header-no-access .gh-header-title { + margin-right: 0; + } + .gh-header-number { + font-weight: 300; + color: #aaa; + letter-spacing: -1px; + } + .gh-header-edit { + margin-top: -5px; + } + .gh-header-edit:before { + display: table; + content: ""; + } + .gh-header-edit:after { + display: table; + clear: both; + content: ""; + } + .gh-header-edit .edit-issue-title { + float: left; + width: 760px; + padding: 6px 10px; + margin-right: 10px; + font-size: 16px; + background-color: #fafafa; + } + .gh-header-edit .edit-issue-title:focus { + background-color: #fff; + } + .gh-header-edit .btn { + float: left; + padding: 7px 15px; + } + .gh-header-edit .btn-link { + float: left; + margin: 9px 10px; + } + .gh-header-meta { + margin-top: 9px; + font-size: 14px; + line-height: 20px; + color: #767676; + padding-bottom: 20px; + border-bottom: 1px solid #eee; + } + .gh-header.issue .gh-header-meta { + margin-bottom: 15px; + } + .gh-header.pull .gh-header-meta { + border-bottom: 0; + padding-bottom: 0; + } + .gh-header-meta .flex-table-item { + vertical-align: top; + } + .gh-header-meta .flex-table-item-primary { + padding-top: 4px; + white-space: normal; + word-wrap: break-word; + } + .gh-header-meta .flex-table-item-primary .commit-ref .css-truncate-target, + .gh-header-meta + .flex-table-item-primary + .commit-ref:hover + .css-truncate-target { + max-width: 780px !important; + } + .gh-header-meta .state { + margin-right: 8px; + } + .gh-header-meta .avatar { + float: left; + margin-top: -3px; + margin-right: 5px; + } + .gh-header-meta .author { + color: #555; + font-weight: bold; + } + .gh-header-meta .noun { + text-transform: lowercase; + } + .tabnav-pr { + margin: 15px 0 20px; + border-color: #e5e5e5; + } + .tabnav-pr .tabnav-tab { + position: relative; + padding: 9px 14px; + font-size: 13px; + color: #767676; + } + .tabnav-pr .tabnav-tab.selected { + color: #333; + border-color: #e5e5e5; + } + .tabnav-pr .diffstat-bar { + padding-bottom: 3px; + } + .timeline-comment-wrapper > .timeline-comment:after, + .timeline-comment-wrapper > .timeline-comment:before, + .timeline-new-comment .timeline-comment:after, + .timeline-new-comment .timeline-comment:before { + position: absolute; + top: 11px; + left: -16px; + right: 100%; + width: 0; + height: 0; + display: block; + content: " "; + border-color: transparent; + border-style: solid solid outset; + pointer-events: none; + } + .timeline-comment-wrapper > .timeline-comment:after, + .timeline-new-comment .timeline-comment:after { + border-width: 7px; + border-right-color: #f7f7f7; + margin-top: 1px; + margin-left: 2px; + } + .timeline-comment-wrapper > .timeline-comment:before, + .timeline-new-comment .timeline-comment:before { + border-right-color: #ddd; + border-width: 8px; + } + .timeline-comment-wrapper { + position: relative; + padding-left: 64px; + margin-top: 15px; + margin-bottom: 15px; + border-top: 2px solid #fff; + border-bottom: 2px solid #fff; + } + .timeline-comment-wrapper:first-child { + margin-top: 0; + } + .discussion-timeline-actions .timeline-comment-wrapper:first-child { + margin-top: 15px; + } + .timeline-comment-wrapper .timeline-comment.current-user:after, + .timeline-comment-wrapper .timeline-comment.current-user:before { + position: absolute; + top: 11px; + left: -16px; + right: 100%; + width: 0; + height: 0; + display: block; + content: " "; + border-color: transparent; + border-style: solid solid outset; + pointer-events: none; + } + .timeline-comment-wrapper .timeline-comment.current-user:after { + border-width: 7px; + border-right-color: #f2f8fa; + margin-top: 1px; + margin-left: 2px; + } + .timeline-comment-wrapper .timeline-comment.current-user:before { + border-right-color: #bfccd1; + border-width: 8px; + } + .timeline-comment-wrapper .timeline-comment.unread-item:after, + .timeline-comment-wrapper .timeline-comment.unread-item:before { + position: absolute; + top: 11px; + left: -16px; + right: 100%; + width: 0; + height: 0; + display: block; + content: " "; + border-color: transparent; + border-style: solid solid outset; + pointer-events: none; + } + .timeline-comment-wrapper .timeline-comment.unread-item:after { + border-width: 7px; + border-right-color: #fff9ea; + margin-top: 1px; + margin-left: 2px; + } + .timeline-comment-wrapper .timeline-comment.unread-item:before { + border-right-color: #dfd8c2; + border-width: 8px; + } + .timeline-comment-avatar { + float: left; + margin-left: -64px; + border-radius: 3px; + } + .timeline-comment { + position: relative; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 3px; + } + .timeline-comment.will-transition-once { + -webkit-transition: border-color 0.65s ease-in-out; + transition: border-color 0.65s ease-in-out; + } + .timeline-comment.will-transition-once .timeline-comment-header { + -webkit-transition: + background-color 0.65s ease, + border-bottom-color 0.65s ease-in-out; + transition: + background-color 0.65s ease, + border-bottom-color 0.65s ease-in-out; + } + .timeline-comment.will-transition-once .timeline-comment-label { + -webkit-transition: border-color 0.65s ease-in-out; + transition: border-color 0.65s ease-in-out; + } + .timeline-comment.will-transition-once:before, + .timeline-comment.will-transition-once:after { + -webkit-transition: border-right-color 0.65s ease-in-out; + transition: border-right-color 0.65s ease-in-out; + } + .timeline-comment.current-user { + border-color: #bfccd1; + } + .timeline-comment.current-user .timeline-comment-header { + background-color: #f2f8fa; + border-bottom-color: #dde4e6; + } + .timeline-comment.current-user .timeline-comment-label { + border-color: #bfccd1; + } + .timeline-comment.current-user + .previewable-comment-form + .comment-form-head.tabnav { + color: #8e9597; + background-color: #f2f8fa; + border-bottom-color: #e1edf1; + } + .timeline-comment.unread-item { + border-color: #dfd8c2; + } + .timeline-comment.unread-item .timeline-comment-header { + background-color: #fff9ea; + border-bottom-color: #f1ede3; + } + .timeline-comment.unread-item .timeline-comment-label { + border-color: #dfd8c2; + } + .timeline-comment.unread-item + .previewable-comment-form + .comment-form-head.tabnav { + color: #8e9597; + background-color: #f2f8fa; + border-bottom-color: #e1edf1; + } + .timeline-comment:empty { + display: none; + } + .timeline-comment .comment + .comment { + border-top: 1px solid #e5e5e5; + } + .timeline-comment .comment + .comment:before, + .timeline-comment .comment + .comment:after { + display: none; + } + .timeline-comment .comment + .comment .timeline-comment-header { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + .timeline-comment-header { + padding-left: 15px; + padding-right: 15px; + color: #767676; + background-color: #f7f7f7; + border-bottom: 1px solid #eee; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + .timeline-comment-header .author { + font-weight: bold; + color: #555; + } + .timeline-comment-header .timestamp { + white-space: nowrap; + color: inherit; + } + .timeline-comment-header code { + word-break: break-all; + } + .comment-type-icon { + color: inherit; + } + .timeline-comment-label { + float: right; + margin: 8px 0 0 10px; + padding: 2px 5px; + font-size: 12px; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 3px; + } + .timeline-comment-label-spammy { + color: #bd2c00; + border-color: #bd2c00; + } + .timeline-comment-header-text { + max-width: 78%; + padding-top: 10px; + padding-bottom: 10px; + } + .timeline-comment-header-text code a { + color: #555; + } + .timeline-comment-header-avatar { + float: left; + margin-top: 10px; + margin-right: 5px; + } + .timeline-comment-actions { + float: right; + margin-right: -5px; + margin-left: 10px; + } + .timeline-comment-action { + display: inline-block; + padding: 10px 5px; + color: inherit; + opacity: 0.5; + } + .timeline-comment-action:hover { + opacity: 1; + color: #4078c0; + text-decoration: none; + } + .timeline-comment-action .octicon-check { + height: 16px; + font-size: 18px; + } + .compare-tab-comments .timeline-comment-actions { + display: none; + } + .discussion-item-ref .commit-gravatar { + padding-left: 2px; + padding-right: 5px; + } + .discussion-item-ref .task-progress { + display: block; + margin-bottom: -2px; + } + .discussion-item-ref .task-progress .progress-bar { + margin-bottom: 0; + } + .discussion-item-ref .task-progress .octicon { + font-size: 16px; + } + .discussion-item-ref .discussion-item-body .title { + margin-top: 10px; + } + .discussion-item-ref .state { + padding: 1px 5px; + margin-top: -4px; + margin-left: 8px; + font-size: 12px; + } + .discussion-item-ref .state .octicon { + width: 1em; + font-size: 14px; + } + .timeline-new-comment { + max-width: 780px; + margin-bottom: 0; + } + .timeline-new-comment .comment-form-head { + margin-bottom: 10px; + } + .timeline-new-comment .previewable-comment-form .comment-body { + padding: 5px 5px 15px; + border-bottom: 1px solid #eee; + } + .discussion-item { + position: relative; + margin: 15px 0 15px 79px; + padding-left: 25px; + } + .discussion-item + .discussion-item { + padding-top: 15px; + border-top: 1px solid #f5f5f5; + } + .discussion-item .author { + color: #555; + font-weight: bold; + } + .discussion-item .timestamp { + color: inherit; + white-space: nowrap; + } + .discussion-item .label-color { + padding: 2px 4px; + font-size: 12px; + font-weight: bold; + border-radius: 2px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.12); + } + .discussion-item .label-color a:hover { + text-decoration: none; + } + .discussion-item-icon { + float: left; + width: 32px; + height: 32px; + margin-top: -7px; + margin-left: -40px; + line-height: 28px; + color: #767676; + text-align: center; + background-color: #f3f3f3; + border: 2px solid #fff; + border-radius: 50%; + } + .discussion-item-icon.octicon-pencil { + font-size: 14px; + } + .discussion-item-header { + min-height: 30px; + padding-top: 5px; + padding-bottom: 5px; + color: #767676; + line-height: 20px; + word-wrap: break-word; + } + .discussion-item-header .avatar { + float: left; + margin-top: 2px; + margin-right: 5px; + } + .discussion-item-header .discussion-item-private { + vertical-align: -1px; + } + .discussion-item-header:last-child { + padding-bottom: 0; + } + .discussion-item-header .commit-ref { + font-size: 85%; + vertical-align: baseline; + } + .discussion-item-header .btn-outline { + float: right; + padding: 4px 8px; + margin-top: -5px; + margin-left: 10px; + } + .discussion-item-body { + margin-top: 5px; + } + .discussion-item-link { + color: #767676; + } + .discussion-item-link:hover { + color: #4078c0; + } + .discussion-item-entity { + font-weight: bold; + color: #333; + } + .discussion-item-entity:hover { + color: #4078c0; + text-decoration: none; + } + .discussion-item-ref-title { + margin-top: 0; + margin-bottom: 0; + line-height: 1.2; + } + .discussion-item-ref-title .issue-num { + font-weight: normal; + color: #767676; + } + .discussion-item-ref-title .title-link { + color: #333; + } + .discussion-item-ref-title .title-link:hover { + color: #4078c0; + text-decoration: none; + } + .discussion-item-ref-title .title-link:hover .issue-num { + color: inherit; + } + .discussion-item-context-icon { + display: inline-block; + line-height: 22px; + margin-top: -2px; + margin-left: 10px; + } + .discussion-item-help { + color: #767676; + } + .discussion-item-help:hover { + color: #4078c0; + } + .discussion-item-private { + color: #a1882b; + } + .discussion-item-rollup-ref .state { + margin-top: 2px; + } + .discussion-item-rollup-ref .discussion-item-context-icon { + margin-top: 2px; + } + .discussion-item-reopened .discussion-item-icon { + color: #fff; + background-color: #6cc644; + } + .discussion-item-merged .discussion-item-icon { + padding-left: 2px; + color: #fff; + background-color: #6e5494; + } + .discussion-item-closed .discussion-item-icon { + color: #fff; + background-color: #bd2c00; + } + .discussion-item-head_ref_deleted .discussion-item-icon { + padding-left: 2px; + color: #fff; + background-color: #767676; + } + .discussion-item-locked .discussion-item-icon, + .discussion-item-unlocked .discussion-item-icon { + color: #fff; + background-color: #333; + } + .discussion-item .renamed-was, + .discussion-item .renamed-is { + color: #333; + font-weight: bold; + } + .discussion-commits .discussion-item-icon { + padding-top: 1px; + } + .discussion-commits .discussion-item-body { + margin-top: 0; + margin-left: -31px; + } + .discussion-item-toggle-open { + display: none; + } + .discussion-item-toggle { + float: right; + color: #767676; + } + .discussion-item-toggle:hover { + color: #4078c0; + text-decoration: none; + } + .discussion-item-toggle .octicon { + vertical-align: middle; + } + .outdated-diff-comment-container .discussion-item-body { + display: none; + } + .outdated-diff-comment-container.open .discussion-item-body, + .outdated-diff-comment-container.open .discussion-item-toggle-open { + display: block; + } + .outdated-diff-comment-container.open .discussion-item-toggle-closed { + display: none; + } + .new-discussion-timeline + .previewable-comment-form + .comment-form-head.tabnav { + background: #f7f7f7; + padding: 6px 10px 0; + border-radius: 3px 3px 0 0; + } + .new-discussion-timeline .previewable-comment-form .draft-indicator { + position: relative; + top: -1px; + } + .new-discussion-timeline .previewable-comment-form .comment { + border: 0; + } + .new-discussion-timeline .previewable-comment-form .comment-body { + padding: 5px 5px 15px; + border-bottom: 1px solid #eee; + background-color: transparent; + } + .new-discussion-timeline + .previewable-comment-form + .timeline-comment + .timeline-comment-actions { + display: none; + } + .new-discussion-timeline .closed-banner { + position: relative; + margin: 15px 0 -15px; + height: 19px; + overflow: visible; + background: #f3f3f3; + border-radius: 0; + border-bottom: 15px solid #fff; + } + .new-discussion-timeline .composer .timeline-comment { + margin-bottom: 10px; + } + .new-discussion-timeline .composer .timeline-comment:after { + border-right-color: #fff; + } + .new-discussion-timeline .composer .comment-form-head.tabnav { + padding-top: 0; + background-color: #fff; + } + .discussion-timeline-actions { + border-top: 2px solid #f3f3f3; + background-color: #fff; + } + .discussion-timeline-actions .merge-pr { + padding-top: 0; + border-top: 0; + } + .discussion-timeline-actions .thread-subscription-status { + margin-top: 20px; + } + .discussion-timeline-actions .thread-subscription-status .mega-octicon { + display: none; + } + .donut-chart > .failure { + fill: #bd2c00; + } + .donut-chart > .pending { + fill: #cea61b; + } + .donut-chart > .success { + fill: #6cc644; + } + .donut-chart > .error { + fill: #767676; + } + .early-access-survey-question .other-text-form { + display: none; + margin-top: 0; + } + .early-access-survey-question.is-other-selected .other-text-form { + display: inline-block; + } + .setup-header .large-file-storage-header { + font-size: 44px; + } + .git-lfs-setup-list { + padding: 0 15px 15px; + margin: 0; + font-size: 14px; + list-style-type: none; + } + .git-lfs-setup-list li { + margin-top: 10px; + counter-increment: step-counter; + } + .git-lfs-setup-list li::before { + content: counter(step-counter) "."; + margin-right: 10px; + font-weight: bold; + } + .git-lfs-setup-list li:first-child { + margin-top: 0; + } + .explore-head .container { + position: relative; + } + .explore-content { + margin-top: -15px; + } + .explore-content .blankslate { + margin-top: 15px; + } + .repo-collection > ul { + list-style-type: none; + background: #f7f7f7; + border: 1px solid #ddd; + border-radius: 3px; + } + .repo-collection .author-gravatar { + float: left; + margin-right: 10px; + background: #fff; + border-radius: 3px; + } + .collection-stat { + float: right; + margin-left: 10px; + font-size: 12px; + color: #444; + } + .collection-stat .octicon { + margin-right: 5px; + color: #a7a7a7; + } + .collection-item { + position: relative; + float: left; + width: 50%; + height: 70px; + padding: 15px; + } + .collection-item .octicon-x { + position: absolute; + top: 10px; + right: 10px; + color: #ccc; + text-decoration: none; + } + .collection-item .repo-name { + display: block; + font-size: 16px; + font-weight: bold; + } + .collection-item .css-truncate-target { + max-width: 380px; + } + .collection-item .repo-description { + margin: 0; + } + .explore-collection h2 { + margin: 0 0 10px; + font-size: 18px; + font-weight: normal; + color: #2a2a2a; + } + .explore-collection h2 .select-menu { + position: relative; + display: inline-block; + } + .explore-collection h2 .select-menu-button { + font-weight: bold; + cursor: pointer; + } + .explore-collection h2 .mega-octicon { + vertical-align: middle; + } + .explore-collection .see-more-link { + float: right; + margin-top: 7px; + } + .explore-page .see-more-link { + font-size: 14px; + color: inherit; + } + .explore-page .see-more-link .octicon { + margin-left: 5px; + } + .explore-page.marketing-section { + border-bottom: 0; + } + .explore-page.marketing-section .thread-subscription-status { + border: 0; + } + .explore-page.marketing-section .signed-out-comment { + margin-left: 0; + } + .explore-page .language-filter-list { + margin-bottom: 10px; + } + .explore-section { + position: relative; + padding: 40px 0; + border-bottom: 1px solid #eee; + } + .explore-section:nth-child(even) { + background: #f9f9f9; + } + .explore-section:nth-child(even) .repo-collection > ul { + background: #fff; + } + .explore-section:first-child { + padding-top: 0; + } + .explore-section:nth-child(odd):last-child { + padding-bottom: 0; + border-bottom: 0; + } + .explore-pjax-container { + position: relative; + } + .user-leaderboard-list .follow-list-info { + margin-top: 12px; + margin-bottom: 0; + font-size: 12px; + color: #666; + } + .user-leaderboard-list + .follow-list-info + .css-truncate.css-truncate-target { + max-width: none; + } + .user-leaderboard-list .repo-list-item { + padding-top: 10px; + padding-bottom: 0; + padding-left: 21px; + border-top: 0; + } + .user-leaderboard-list .repo-list-item .repo-description, + .user-leaderboard-list .repo-list-item .repo-and-owner { + max-width: 530px; + } + .user-leaderboard-list .repo-list-item .repo { + color: #5c5c5c; + } + .leaderboard-list { + margin: 0; + list-style-type: none; + } + .user-leaderboard-list-name { + margin: 0; + font-size: 18px; + font-weight: normal; + } + .user-leaderboard-list-name .full-name { + margin-left: 5px; + font-weight: bold; + color: #5c5c5c; + } + .repo-snipit { + display: inline-block; + margin-top: 7px; + } + .repo-snipit:hover { + text-decoration: none; + } + .repo-snipit .octicon { + font-size: 14px; + color: #767676; + } + .repo-snipit-name { + max-width: 200px; + color: #666; + } + .repo-snipit-description { + max-width: 300px; + color: #767676; + } + .repo-snipit:hover .repo-snipit-name, + .repo-snipit:hover .repo-snipit-description { + color: #4078c0; + } + .leaderboard-action { + float: right; + margin-top: -3px; + margin-left: 10px; + } + .leaderboard-list-rank { + position: absolute; + top: 25px; + left: 0; + width: 20px; + font-size: 11px; + font-weight: 300; + color: #b9b9b9; + text-align: right; + text-transform: uppercase; + } + .leaderboard-list-item { + position: relative; + padding-top: 20px; + padding-bottom: 20px; + padding-left: 35px; + border-bottom: 1px solid #eee; + } + .leaderboard-list-item:last-child { + border-bottom: 0; + } + .leaderboard-gravatar { + float: left; + width: 48px; + height: 48px; + border-radius: 3px; + } + .leaderboard-list-content { + min-height: 48px; + margin-left: 58px; + } + .collection-page .signed-out-comment { + margin-left: 0; + } + .explore-mail-tease { + padding-top: 20px; + overflow: hidden; + background: #202021 url(/images/modules/home/octicons-bg.png) center + repeat; + border-bottom: 1px solid #ddd; + } + .explore-mail-tease h3 { + color: #fff; + text-align: center; + } + .explore-mail-tease img { + margin-bottom: -5px; + } + .newsletter-frequency-choice { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + margin: 40px 0; + list-style-type: none; + -webkit-flex-flow: row wrap; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -webkit-justify-content: space-around; + -ms-flex-pack: distribute; + justify-content: space-around; + } + .newsletter-frequency-choice .choice { + position: relative; + width: 25%; + } + .newsletter-frequency-choice .choice > label { + display: block; + height: 100%; + margin: 0 10px; + font-weight: normal; + text-align: center; + cursor: pointer; + background: #fff; + border: 3px solid #eee; + border-radius: 4px; + } + .newsletter-frequency-choice .choice:hover label { + border-color: #4078c0; + } + .newsletter-frequency-choice .choice:hover h3 { + color: #fff; + background: #4078c0; + border-color: #4078c0; + } + .newsletter-frequency-choice .choice.selected label { + border-color: #6cc644; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); + } + .newsletter-frequency-choice .choice.selected h3 { + color: #fff; + background: #6cc644; + border-color: #6cc644; + } + .newsletter-frequency-choice .choice.selected p { + color: #333; + } + .newsletter-frequency-choice .choice .notice { + position: absolute; + right: 0; + bottom: 1em; + left: 0; + z-index: -1; + font-weight: bold; + color: #6cc644; + text-align: center; + opacity: 0; + } + .newsletter-frequency-choice .choice .notice.visible { + bottom: -2em; + opacity: 1; + -webkit-transition: opacity 0.15s ease-in-out; + transition: opacity 0.15s ease-in-out; + } + .newsletter-frequency-choice h3 { + padding: 10px; + margin: 0; + font-weight: normal; + background: #fafafa; + border-bottom: 1px solid #eee; + } + .newsletter-frequency-choice h3 input { + position: relative; + top: -2px; + margin: 0 3px 0 -19px; + } + .newsletter-frequency-choice p { + height: 7em; + margin: 15px; + color: #767676; + text-align: left; + } + .explore-signup-entice { + position: relative; + padding: 15px; + font-size: 14px; + background: #f7f7f7; + border: 1px solid #ddd; + border-radius: 3px; + } + .explore-signup-entice h3 { + margin-bottom: 10px; + font-size: 18px; + } + .explore-signup-entice-inner { + position: absolute; + top: 3px; + right: 3px; + bottom: 3px; + left: 3px; + padding-top: 30px; + text-align: center; + background: rgba(247, 247, 247, 0.9); + } + .explore-signup-entice-wrapper { + max-width: 500px; + padding: 5px; + margin: 0 auto; + background: rgba(247, 247, 247, 0.6); + } + .explore-signup-cta { + margin-right: -10px; + font-size: 13px; + vertical-align: middle; + } + .explore-signup-cta a { + font-weight: bold; + } + .explore-signup-cta .btn { + position: relative; + top: -1px; + } + @-webkit-keyframes fadein { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @keyframes fadein { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + .explore-marketing-header { + margin: 10px auto 30px; + text-align: center; + } + .explore-marketing-header.is-animating { + -webkit-animation: fadein 1s; + animation: fadein 1s; + } + .explore-marketing-header h2 { + margin: 0 0 5px; + font-size: 32px; + font-weight: normal; + } + .explore-marketing-header .lead { + margin: 5px 0 0; + } + .linux .show-mac, + .macintosh .show-mac { + display: block; + } + .linux .hide-mac, + .macintosh .hide-mac { + display: none; + } + .windows .show-mac { + display: none; + } + .homepage .container { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + } + .homepage .header-logged-out .primary { + display: none; + } + .homepage .site-footer { + border-top: 0; + margin-top: 0; + } + .marketing-section-depth { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 10; + height: 30px; + background-image: -webkit-linear-gradient( + transparent, + rgba(0, 0, 0, 0.15) + ); + background-image: linear-gradient(transparent, rgba(0, 0, 0, 0.15)); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + } + .marketing-section-signup { + text-shadow: 0 1px 3px #222; + background: #202021 url(/images/modules/home/octicons-bg.png) center + repeat; + padding-top: 80px; + padding-bottom: 80px; + position: relative; + } + .marketing-section-signup .heading { + margin-top: 0; + padding-top: 10px; + font-size: 70px; + font-weight: normal; + line-height: 1; + color: #fff; + letter-spacing: -1px; + } + .marketing-section-signup .subheading { + margin: 10px 0 0; + font-size: 21px; + line-height: 1.5; + color: #fff; + } + .marketing-section-signup .subheading a { + font-weight: 500; + } + .form-signup-home { + float: right; + width: 320px; + margin-left: 40px; + } + .form-signup-home .text-muted:last-child { + margin-bottom: 0; + } + .form-signup-home dl.form { + position: relative; + margin-top: 0; + margin-bottom: 10px; + } + .form-signup-home dl.form dd + .text-muted { + margin-top: 5px; + } + .form-signup-home .btn, + .form-signup-home dl.form input[type="text"], + .form-signup-home dl.form input[type="password"] { + padding: 10px; + font-size: 16px; + border-radius: 5px; + } + .form-signup-home .btn { + border: 0; + } + .form-signup-home .btn:focus { + box-shadow: + 0 1px 3px rgba(0, 0, 0, 0.05), + 0 0 12px rgba(255, 255, 255, 0.75); + } + .form-signup-home dl.form input[type="text"], + .form-signup-home dl.form input[type="password"] { + width: 100%; + margin-right: 0; + border-color: #fff; + } + .form-signup-home dl.form input[type="text"]:focus, + .form-signup-home dl.form .focused .drag-and-drop, + .focused .form-signup-home dl.form .drag-and-drop, + .form-signup-home dl.form input[type="password"]:focus { + background-color: #fff; + border-color: #fff; + box-shadow: + inset 0 1px 2px rgba(0, 0, 0, 0.075), + 0 0 12px rgba(255, 255, 255, 0.75); + } + .form-signup-home dl.form.errored dd.error, + .form-signup-home dl.form.errored dd.warning { + position: absolute; + top: 100%; + left: 0; + right: 0; + z-index: 5; + margin-top: 2px; + font-size: 12px; + font-weight: normal; + padding: 10px; + border: 0; + text-align: left; + border-radius: 3px; + background-color: #333; + color: #fff; + } + .form-signup-home dl.form.errored dd.error:after, + .form-signup-home dl.form.errored dd.warning:after { + position: absolute; + left: 10px; + bottom: 100%; + height: 0; + width: 0; + content: ""; + border: solid transparent; + border-bottom-color: #333; + border-width: 8px; + pointer-events: none; + } + .form-signup-home dl.form.errored dd.error:empty, + .form-signup-home dl.form.errored dd.warning:empty { + display: none; + } + .form-signup-home dl.form dd input.is-autocheck-successful, + .form-signup-home dl.form dd input.is-autocheck-errored, + .form-signup-home dl.form dd input.is-autocheck-loading { + background-image: none; + } + .form-signup-home dl.successed:after, + .form-signup-home dl.errored:after { + position: absolute; + top: 15px; + right: 10px; + text-shadow: none; + font: normal normal 16px/1 "octicons"; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; + } + .form-signup-home dl.successed:after { + content: "\f03a"; + color: #6cc644; + } + .form-signup-home dl.errored:after { + content: "\f02d"; + color: #bd2c00; + } + .form-signup-home dl.is-loading:after { + position: absolute; + top: 15px; + right: 10px; + display: block; + width: 16px; + height: 16px; + content: ""; + background-image: url(/images/spinners/octocat-spinner-16px.gif); + } + @media only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (min-device-pixel-ratio: 2), + only screen and (min-resolution: 2dppx) { + .form-signup-home dl.is-loading:after { + background-image: url(/images/spinners/octocat-spinner-32.gif); + background-size: 16px 16px; + } + } + .text-muted .notice-highlight { + color: #fff; + } + .text-center { + text-align: center; + } + .marketing-section-img { + display: block; + max-width: 980px; + margin: 40px auto; + border-radius: 5px; + border: 1px solid rgba(0, 0, 0, 0.25); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.15); + } + .marketing-section-enterprise { + overflow: hidden; + max-height: 375px; + padding-bottom: 20px; + margin-top: -1px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); + background-color: #614381; + background-image: -webkit-linear-gradient(#202d5f, #614381); + background-image: linear-gradient(#202d5f, #614381); + background-repeat: repeat-x; + border-bottom: 0; + box-shadow: inset 0 10px 20px rgba(0, 0, 0, 0.1); + color: #fff; + } + .marketing-section-enterprise.marketing-inline { + margin-bottom: 30px; + } + .marketing-section-enterprise h1 > a { + color: inherit; + text-decoration: none; + } + .marketing-section-enterprise .marketing-header .lead { + color: #cecbda; + } + .marketing-section-enterprise .marketing-button { + display: inline-block; + margin-top: 20px; + margin-bottom: 20px; + padding: 9px 15px; + border-radius: 4px; + font-size: 18px; + background-color: #1d6ac8; + background-image: -webkit-linear-gradient(#45b3f3, #1d6ac8); + background-image: linear-gradient(#45b3f3, #1d6ac8); + background-repeat: repeat-x; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.25); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + text-decoration: none; + color: #fff; + } + .marketing-section-enterprise .marketing-button:hover { + background-position: 0 -10px; + } + .microsoft-callout-section { + position: relative; + background: #515d81 url(/images/modules/microsoft_callout/azure_bg.png) + no-repeat center top; + background-size: cover; + overflow: hidden; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + } + .microsoft-callout-section .container { + position: relative; + } + .microsoft-callout-section .content { + position: relative; + z-index: 9; + padding: 80px 0; + color: #fff; + text-align: center; + } + .microsoft-callout-section h2 { + margin-top: 0; + font-size: 42px; + font-weight: 300; + color: #fff; + } + .microsoft-callout-section p { + color: #fff; + margin-bottom: 15px; + font-weight: 300; + } + .microsoft-callout-section .microsoft-button { + display: inline-block; + padding: 7px 15px; + font-size: 16px; + color: #fff; + background-color: #6f0974; + text-shadow: none; + border-radius: 3px; + } + .microsoft-callout-section .microsoft-button:hover { + background-color: #920d99; + text-decoration: none; + } + .microsoft-callout-section .bg-animation { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + .microsoft-callout-section .cloud { + position: absolute; + } + .microsoft-callout-section .cloud-1 { + top: 200px; + right: -50px; + -webkit-animation: cloud1animation 6s ease-out 1s; + animation: cloud1animation 6s ease-out 1s; + } + .microsoft-callout-section .cloud-2 { + top: 150px; + left: -60px; + -webkit-animation: cloud2animation 6s ease-out 1s; + animation: cloud2animation 6s ease-out 1s; + } + .microsoft-callout-section .corner { + position: absolute; + top: 0; + right: 0; + } + @-webkit-keyframes cloud1animation { + 0% { + -webkit-transform: translateX(-50px); + transform: translateX(-50px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + } + @keyframes cloud1animation { + 0% { + -webkit-transform: translateX(-50px); + transform: translateX(-50px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + } + @-webkit-keyframes cloud2animation { + 0% { + -webkit-transform: translateX(50px); + transform: translateX(50px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + } + @keyframes cloud2animation { + 0% { + -webkit-transform: translateX(50px); + transform: translateX(50px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + } + .issue-list em { + font-weight: bold; + background-color: rgba(255, 255, 140, 0.5); + padding: 3px; + border-radius: 3px; + font-style: normal; + } + .issue-list .title { + padding: 0; + min-height: 24px; + font-weight: normal; + font-size: 18px; + line-height: 24px; + margin: 0 80px 10px 0; + word-wrap: break-word; + } + .issue-list .title .mega-octicon { + position: absolute; + top: -4px; + left: 0; + width: 32px; + color: #888; + text-align: center; + } + .issue-list .title .closed.mega-octicon { + color: #bd2c00; + } + .issue-list .title .open.mega-octicon { + color: #6cc644; + } + .issue-list .title .merged.mega-octicon { + color: #6e5494; + } + .issue-list .description { + margin: 0 0 10px; + line-height: 20px; + overflow: hidden; + } + .issue-list-meta { + margin: 0; + list-style-type: none; + font-size: 11px; + color: #999; + } + .issue-list-meta:before { + display: table; + content: ""; + } + .issue-list-meta:after { + display: table; + clear: both; + content: ""; + } + .issue-list-meta > li { + display: inline-block; + margin-right: 10px; + } + .issue-list-meta a { + color: #333; + } + .issue-list-meta .octicon { + color: #838383; + vertical-align: middle; + } + .issue-list-item { + border-bottom: 1px solid #f1f1f1; + padding: 0 0 20px 40px; + margin: 0 0 20px; + position: relative; + } + .labels-list-item .table-list-cell { + width: 100%; + } + .labels-list-item .label { + display: inline-block; + height: 34px; + padding: 0 10px; + margin-right: 5px; + font-size: 16px; + font-weight: bold; + line-height: 34px; + text-align: center; + border-radius: 3px; + -webkit-transition: all 0.2s linear; + transition: all 0.2s linear; + } + .labels-list-item .label .octicon { + margin-right: 3px; + } + .labels-list-item .label:hover { + opacity: 0.85; + } + .labels-list-item.open .label, + .labels-list-item.open .label-description, + .labels-list-item.open .labels-list-action { + display: none; + } + .labels-list-item.open .label-delete { + display: block; + text-align: left; + } + .labels-list-item.edit .label, + .labels-list-item.edit .label-description, + .labels-list-item.edit .labels-list-action { + display: none; + } + .labels-list-item.edit .label-edit { + display: block; + } + .label-description { + padding: 8px 10px; + color: #767676; + } + .label-delete-confirmation { + line-height: 34px; + } + .labels-list-actions { + margin-left: 60px; + } + .labels-list-action { + float: left; + display: block; + color: #767676; + padding: 8px 10px; + } + .labels-list-action .octicon { + margin-right: 2px; + } + .labels-list-action .octicon-pencil { + font-size: 14px; + } + .labels-list-action:hover { + color: #4078c0; + cursor: pointer; + } + .new-label { + display: none; + padding: 10px; + margin-bottom: 15px; + background-color: #fafafa; + border: 1px solid #e5e5e5; + border-radius: 3px; + } + .new-label .label-edit { + display: block; + } + .new-label .label-edit:before { + display: table; + content: ""; + } + .new-label .label-edit:after { + display: table; + clear: both; + content: ""; + } + .new-label-actions { + float: right; + } + .open .new-label { + display: block; + } + .label-spinner { + display: none; + float: left; + margin-left: -35px; + margin-top: 9px; + } + .label-edit:before { + display: table; + content: ""; + } + .label-edit:after { + display: table; + clear: both; + content: ""; + } + .label-edit label { + display: block; + margin-bottom: 5px; + } + .label-edit .error { + float: left; + margin-top: 8px; + margin-left: 10px; + color: #f00; + } + .label-edit.is-valid .color-editor .octicon-check { + display: block; + } + .label-edit.loading .label-spinner { + display: block; + } + .color-editor { + position: relative; + float: left; + width: 100px; + } + .color-editor.open .label-colors { + display: block; + } + .color-editor-bg { + position: absolute; + left: 0; + z-index: 10; + width: 20px; + height: 20px; + margin-top: 7px; + margin-left: 7px; + cursor: pointer; + border-radius: 3px; + } + input.color-editor-input { + width: 100px; + padding-left: 34px; + border-color: #ccc !important; + } + input.color-editor-input:focus { + border-color: #51a7e8 !important; + } + input.color-editor-input:focus ~ .label-colors { + display: block; + } + .invalid-color-indicator { + display: none; + position: absolute; + top: 7px; + left: 7px; + z-index: 11; + width: 20px; + height: 20px; + line-height: 20px; + font-weight: bold; + color: #fff; + text-align: center; + } + .label-edit-name { + width: 40%; + float: left; + margin-right: 10px; + } + .label-colors { + position: absolute; + left: 0; + float: left; + display: none; + width: auto; + margin-left: 0; + padding: 5px; + } + .label-colors:before { + left: 8px; + } + .label-colors:after { + left: 9px; + } + .label-edit, + .label-delete { + display: none; + } + .label-delete-form { + display: inline; + } + .label-delete-form.loading .label-delete-spinner { + display: block; + } + .label-delete-spinner { + display: none; + margin-top: 10px; + margin-right: 10px; + float: left; + } + .color-chooser { + display: table-row; + height: 25px; + list-style: none; + } + .color-chooser li { + display: table-cell; + width: 1%; + } + .color-chooser li:hover { + position: relative; + z-index: 2; + outline: 2px solid #fff; + box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.25); + } + .color-chooser .color-cooser-color { + display: block; + width: 25px; + height: 25px; + text-align: center; + cursor: pointer; + } + .repository-lang-stats { + position: relative; + } + .repository-lang-stats ol.repository-lang-stats-numbers li { + display: table-cell; + width: 1%; + border-bottom: 0; + text-align: center; + padding: 11px 5px; + white-space: nowrap; + } + .repository-lang-stats ol.repository-lang-stats-numbers li span.percent { + float: none; + } + .repository-lang-stats ol.repository-lang-stats-numbers li > a, + .repository-lang-stats ol.repository-lang-stats-numbers li > span { + color: #999; + text-decoration: none; + font-weight: bold; + } + .repository-lang-stats ol.repository-lang-stats-numbers li .lang { + color: #333; + } + .repository-lang-stats + ol.repository-lang-stats-numbers + li + .language-color { + display: inline-block; + width: 10px; + height: 10px; + border-radius: 50%; + } + .repository-lang-stats ol.repository-lang-stats-numbers li a:hover { + background: transparent; + } + .stats-switcher-viewport { + overflow: hidden; + height: 38px; + } + .stats-switcher-viewport .stats-switcher-wrapper { + position: relative; + top: 0; + -webkit-transition: top 0.25s ease-in-out; + transition: top 0.25s ease-in-out; + } + .stats-switcher-viewport.is-revealing-lang-stats .stats-switcher-wrapper { + top: -38px; + } + .repository-lang-stats-graph { + display: table; + width: 100%; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + overflow: hidden; + border: 1px solid #ddd; + border-top: 0; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .repository-lang-stats-graph .language-color { + display: table-cell; + line-height: 8px; + text-indent: -9999px; + } + .list-group-item { + position: relative; + display: block; + margin-bottom: -1px; + padding: 8px 10px 10px 40px; + border: 1px solid #e5e5e5; + } + .list-group-item a:hover { + text-decoration: none; + } + .list-group-item:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + .list-group-item:last-child { + margin-bottom: 0; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + } + .list-group-item.closed { + background-color: #fcfcfc; + } + .list-group-item.selectable { + padding-left: 60px; + } + .list-group-item.selected { + background-color: #ffffef; + } + .list-group-item.navigation-focus { + background-color: #f5f9fc; + } + .list-group-item .list-group-item-summary a { + color: #767676; + } + .list-group-item .list-group-item-summary a.quiet { + color: #999; + } + .list-group-item .status { + position: relative; + top: 2px; + margin-right: -9px; + float: right; + } + .list-group-item .type-icon { + vertical-align: middle; + position: relative; + top: 1px; + width: 16px; + text-align: center; + } + .list-group-item .assignee { + float: right; + } + .list-group-item .assignee img { + display: block; + border-radius: 2px; + } + .list-group-item .labels { + display: inline-block; + top: -2px; + margin-bottom: -2px; + margin-left: 4px; + } + .list-group-item-name { + margin: 0 60px 2px 0; + font-size: 15px; + line-height: 1.3; + word-wrap: break-word; + } + .list-group-item-name .type-icon { + float: left; + margin-top: 1px; + margin-left: -24px; + } + .list-group-item-link { + color: #333; + } + .closed.octicon, + .reverted.octicon { + color: #bd2c00; + } + .open.octicon { + color: #6cc644; + } + .merged.octicon { + color: #6e5494; + } + .list-group-item-summary { + margin-top: 2px; + } + .list-group-item-summary p { + margin: 0 0 5px; + } + .standalone .list-group-item-summary p { + margin-bottom: 0; + } + .animated-ellipsis-container { + display: inline-block; + overflow: hidden; + height: 12px; + width: 12px; + -webkit-transform: translateZ(0); + transform: translateZ(0); + } + .animated-ellipsis-container > .animated-ellipsis { + overflow: hidden; + display: inline-block; + vertical-align: bottom; + } + @-webkit-keyframes ellipsis { + from { + width: 2px; + } + to { + width: 12px; + } + } + @keyframes ellipsis { + from { + width: 2px; + } + to { + width: 12px; + } + } + .large-loading-area { + text-align: center; + padding: 100px 0; + } + .context-loader.large-format-loader { + position: fixed; + display: none; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin: 0; + width: auto; + padding: 190px 0 0; + font-weight: normal; + background: rgba(255, 255, 255, 0.8); + border: 0; + z-index: 9999; + text-align: center; + color: #767676; + } + .context-loader.large-format-loader.is-loading { + display: block; + } + .request-reviewers { + padding: 0 10px 10px; + border-top: 1px solid #ddd; + } + .request-reviewers h3 { + margin-bottom: 5px; + } + .request-reviewers .label { + vertical-align: middle; + } + .request-reviewers p { + margin-top: 0; + } + .request-reviewers .input-block { + display: inline-block; + max-width: 340px; + margin-right: 10px; + } + .request-reviewers-autocomplete .autocomplete-results { + border: 0; + } + .request-reviewers-autocomplete .autocomplete-results .typeahead-result { + display: block; + width: 300px; + } + .request-reviewers-autocomplete .octicon-jersey { + float: left; + width: 24px; + height: 24px; + margin-right: 10px; + margin-left: -34px; + line-height: 24px; + color: #767676; + text-align: center; + } + .suggested-reviewers { + display: inline-block; + color: #767676; + vertical-align: middle; + } + .suggested-reviewers .requested-reviewer-suggestion { + margin-right: 3px; + } + .request-reviewers-list { + margin-top: 10px; + } + .request-reviewers-list:before { + display: table; + content: ""; + } + .request-reviewers-list:after { + display: table; + clear: both; + content: ""; + } + .requested-reviewer-item { + float: left; + padding: 5px; + margin-right: 4px; + line-height: 20px; + color: #555; + background-color: #eee; + border-radius: 3px; + } + .requested-reviewer-item .avatar, + .requested-reviewer-item .octicon-jersey { + float: left; + margin-right: 5px; + } + .requested-reviewer-item .octicon-jersey { + margin-left: 3px; + line-height: 20px; + } + .requested-reviewer-item .remove-reviewer { + display: inline-block; + padding-right: 3px; + padding-left: 3px; + color: #bbb; + vertical-align: middle; + } + .review-bar .octicon-check { + float: left; + margin-right: 10px; + color: #6cc644; + } + .review-bar .complete-review-actions .review-bar-form { + float: right; + } + .review-bar .complete-review-actions p { + margin-top: 6px; + } + #quick-issue-modal { + display: none; + } + .quick-issue-modal-footer { + margin-bottom: 0; + } + .quick-issue-thanks { + display: none; + font-size: 18px; + } + .quick-issue-link { + margin-left: 30px; + } + .quick-issue-body { + display: block; + width: 100%; + } + .quick-issue-form { + position: relative; + } + .quick-issue-form .suggestions { + margin-left: 0; + margin-bottom: 0; + } + .quick-issue-form .drag-and-drop { + font-size: 10px; + } + .clearfix:before { + display: table; + content: ""; + } + .clearfix:after { + display: table; + clear: both; + content: ""; + } + .right { + float: right; + } + .left { + float: left; + } + .centered { + display: block; + float: none; + margin-left: auto; + margin-right: auto; + } + .text-right { + text-align: right; + } + .text-left { + text-align: left; + } + .danger { + color: #c00; + } + .mute { + color: #000; + } + .text-diff-added { + color: #55a532; + } + .text-diff-deleted { + color: #bd2c00; + } + .text-open, + .text-success { + color: #6cc644; + } + .text-closed { + color: #bd2c00; + } + .text-reverted { + color: #bd2c00; + } + .text-merged { + color: #6e5494; + } + .text-renamed { + color: #fffa5d; + } + .text-pending { + color: #cea61b; + } + .text-error, + .text-failure { + color: #bd2c00; + } + .muted-link { + color: #767676; + } + .muted-link:hover { + color: #4078c0; + text-decoration: none; + } + .hidden { + display: none; + } + .warning { + padding: 0.5em; + margin-bottom: 0.8em; + font-weight: bold; + background-color: #fffccc; + } + .error_box { + padding: 1em; + font-weight: bold; + background-color: #ffebe8; + border: 1px solid #dd3c10; + } + + .marketing .pagehead h1 { + font-size: 30px; + } + .marketing .pagehead p { + margin-top: 4px; + margin-bottom: 0; + font-size: 14px; + color: #767676; + } + .marketing .pagehead ul.actions { + margin-top: 10px; + } + .marketing h2 .secure { + float: right; + padding: 1px 0; + font-size: 11px; + font-weight: bold; + text-transform: uppercase; + color: #6cc644; + } + .marketing .questions p { + font-size: 14px; + } + .marketing-header { + margin-bottom: 40px; + } + .marketing-header h1 { + margin-top: 0; + margin-bottom: 0; + font-size: 42px; + font-weight: 300; + } + .marketing-header .lead { + color: #767676; + max-width: 750px; + margin: 10px auto 0; + } + .marketing-header .btn { + margin-top: 15px; + padding: 12px 20px; + font-size: 18px; + font-weight: normal; + border-radius: 6px; + } + .marketing-section { + position: relative; + padding-top: 80px; + padding-bottom: 80px; + border-bottom: 1px solid #e5e5e5; + text-align: center; + font-size: 16px; + line-height: 1.5; + } + .marketing-section:before { + display: table; + content: ""; + } + .marketing-section:after { + display: table; + clear: both; + content: ""; + } + .marketing-section h3 { + font-size: 21px; + font-weight: normal; + } + .marketing-section-stripe { + background-color: #f5f5f5; + } + .marketing-hero-octicon { + width: 100px; + height: 100px; + border-radius: 50px; + text-align: center; + border: solid 1px #e5e5e5; + margin: 0 auto 15px; + } + .marketing-hero-octicon .mega-octicon { + color: #4078c0; + font-size: 48px; + line-height: 100px; + } + .marketing-hero-octicon .octicon-checklist { + position: relative; + right: -3px; + } + .marketing-grid { + font-size: 14px; + } + .marketing-grid .column { + padding: 20px 25px 40px; + } + .marketing-grid p { + margin: 0 auto; + max-width: 90%; + color: #5a5a5a; + } + .marketing-grid .mega-octicon { + color: #4078c0; + } + .read-it { + padding-top: 50px; + text-align: center; + border-top: 1px solid #eee; + } + .contact-form .input-block { + margin-top: 10px; + margin-bottom: 10px; + } + .contact-form textarea { + height: 200px; + } + .checklist { + margin: 20px 0; + font-size: 12px; + } + .checklist > li { + margin: 15px 0 15px 18px; + list-style-position: outside; + } + .hanging-list li, + .hanging-icon-list li { + margin: 10px 0; + font-size: 14px; + } + .hanging-list li { + margin-left: 12px; + list-style-position: inside; + } + .hanging-icon-list li { + padding-left: 25px; + list-style-type: none; + } + .hanging-icon-list .octicon { + float: left; + margin-left: -20px; + color: #767676; + } + .hanging-icon-list .octicon-check { + color: #6cc644; + } + .hanging-icon-list .octicon-x { + color: #bd2c00; + } + .logos-page h3 { + font-size: 18px; + } + .logos-download { + position: relative; + display: block; + float: left; + width: 32%; + height: 290px; + margin-bottom: 30px; + padding-top: 20px; + text-align: center; + border: 1px solid #ddd; + border-radius: 6px; + } + .logos-download + .logos-download { + margin-left: 2%; + } + .logos-download .gh-logo { + margin-top: 70px; + } + .logos-download .gh-octocat { + margin-top: 10px; + } + .logos-download-link { + position: absolute; + right: 0; + bottom: 0; + left: 0; + display: block; + padding: 15px 20px; + font-size: 16px; + font-weight: bold; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-radius: 0 0 5px 5px; + } + .logos-download-link .octicon { + vertical-align: 2px; + } + .logos-download:hover { + text-decoration: none; + } + .logos-download:hover .logos-download-link { + background-color: #eee; + } + .nonprofit-head { + padding: 100px 0 120px; + border-bottom: 1px solid #eee; + text-align: center; + position: relative; + overflow: hidden; + } + .nonprofit-head .title { + font-weight: 300; + font-size: 30px; + color: #767676; + margin-bottom: 20px; + display: inline-block; + border-bottom: 1px solid #ccc; + } + .nonprofit-head .title .mega-octicon { + color: #333; + } + .nonprofit-head .logo { + vertical-align: middle; + } + .nonprofit h1 { + font-weight: 300; + font-size: 28px; + line-height: 1.5em; + position: relative; + } + .nonprofit h2 { + font-weight: normal; + } + .heart { + width: 12px; + height: 12px; + background: #83d6c0; + box-shadow: + 140px 30px 0 #efa, + 120px -120px 0 #aded84, + 220px -60px 0 #ded, + 30px 240px 0 #ada, + 60px -60px 0 #d76666, + 60px -30px 0 #ff846f, + 60px 0 0 #f9a7a7, + 60px 30px 0 #ffc8c8, + 60px 60px 0 #ffd8d8, + 30px 60px 0 #baf2ca, + 30px 30px 0 #98eaac, + 30px 0 0 #80d896, + 30px -30px 0 #6dd085, + 30px -60px 0 #55be6f, + 0 -60px 0 #4cc2a7, + 0 -30px 0 #73d3b9, + 0 30px 0 #93e3cd, + 0 60px 0 #adf9e4, + -30px 60px 0 #ffe1b9, + -30px 30px 0 #ffd194, + -30px 0 0 #ffc86f, + -60px 0 0 #fd9ff0, + -60px 30px 0 #ffbaf7, + -60px 60px 0 #fccdf7, + -180px 60px 0 #9df; + position: absolute; + left: 50%; + top: 40%; + margin-left: 400px; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } + .heart.left { + margin-left: -400px; + -webkit-transform: rotate(-45deg), scaleX(-1); + -ms-transform: rotate(-45deg), scaleX(-1); + transform: rotate(-45deg), scaleX(-1); + } + .octo-earth { + position: absolute; + left: 50%; + bottom: -150px; + margin-left: -120px; + -webkit-animation: rotate 20s infinite linear; + animation: rotate 20s infinite linear; + } + @-webkit-keyframes rotate { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(-360deg); + transform: rotate(-360deg); + } + } + @keyframes rotate { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(-360deg); + transform: rotate(-360deg); + } + } + .nonprofit-steps { + margin-left: 30px; + font-size: 20px; + font-weight: 300; + } + .nonprofit-steps li { + margin-bottom: 10px; + } + .nonprofit-steps ul { + margin: 15px 0 0 20px; + list-style: square; + } + .nonprofit-section { + padding: 50px 0; + background: #f5f5f5; + } + .nonprofit-section h1 { + text-align: center; + } + .nonprofit-section .dialog { + width: 640px; + background: #fff; + margin: 30px auto 0; + padding: 30px; + } + .nonprofit-section .dialog h2:first-child { + margin-top: 0; + } + .nonprofit-section .dialog p:last-child { + margin-bottom: 0; + } + .dialog.edu-callout { + border: 5px solid #aec; + padding: 25px; + } + .dialog.edu-callout p { + margin-top: 0; + } + .dialog.edu-callout .mega-octicon { + float: left; + padding-top: 10px; + padding-bottom: 10px; + margin-right: 15px; + color: #418f65; + } + .add-on-table { + border-collapse: separate; + border: 1px solid #e0e0e0; + border-radius: 3px; + margin: 20px 0 40px; + } + .add-on-table td { + padding: 10px; + border-bottom: 1px solid #e0e0e0; + } + .add-on-table tr:last-child td, + .add-on-table td[rowspan] { + border-bottom: 0; + } + .add-on-table .add-on-name { + border-right: 1px solid #e0e0e0; + border-bottom: 0; + padding-left: 30px; + padding-right: 30px; + text-align: center; + width: 1%; + white-space: nowrap; + } + .add-on-table .add-on-name .btn:not(:last-child) { + margin-right: 8px; + } + .add-on-plan { + float: left; + text-align: center; + background: #f0f5fa; + min-width: 160px; + border-radius: 3px; + margin-right: 15px; + padding: 10px; + font-weight: bold; + } + .lfs-plan-price { + margin-top: 8px; + color: #7a7a7a; + } + .lfs-details { + padding: 7px 0 6px; + list-style: none; + } + .lfs-details:first-child { + border-bottom: 1px solid #eee; + } + .lfs-data { + width: 120px; + color: #767676; + float: right; + } + .add-on-logo { + display: block; + width: 240px; + margin: 10px auto; + } + .integrations { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + } + .integrations .site-footer { + border-top: 1px solid rgba(255, 255, 255, 0.2); + margin-top: -99px; + } + .integrations .site-footer, + .integrations .site-footer a, + .integrations .site-footer .octicon-mark-github { + color: #fff; + } + .integrations-illustration-container { + display: block; + height: 100%; + width: 100%; + color: #fff; + background: url(/images/modules/integrations/circuits@2x.png) center + bottom/1780px 295px no-repeat transparent; + } + .integrations-illustration-container .lead { + color: #0a4568; + width: 550px; + } + .integrations-illustration-container a { + color: #0a4568; + text-decoration: underline; + } + .integrations-intro { + background: url(/images/modules/integrations/circuits-animated.gif) + center 238px/500px 350px no-repeat #1781c0; + padding-bottom: 0; + } + .integrations-intro .lead { + margin-bottom: 350px; + } + .integrations-intro .marketing-header { + margin-bottom: 0; + } + .integrations-outro { + background: url(/images/modules/integrations/circuits-animated-flipped.gif) + center -74px/350px 262px no-repeat #1781c0; + padding-top: 0; + padding-bottom: 218px; + } + .integrations-outro .integrations-illustration-container { + background: url(/images/modules/integrations/circuits-flipped@2x.png) + center top/1685px 174px no-repeat transparent; + padding-top: 240px; + } + .btn.outro-button { + font-size: 20px; + font-weight: 200; + background: #0a4568; + border: 0; + padding: 10px 15px; + color: #fafafa; + text-decoration: none; + text-shadow: none; + } + .integrations-contact-info { + color: #0a4568; + margin: 40px auto 0; + } + .slideshow-nav { + list-style: none; + margin-top: 100px; + } + .slideshow-nav > li { + display: inline-block; + margin: 0 15px; + } + .slideshow-nav > li > a { + display: block; + height: 50px; + text-indent: -999em; + opacity: 0.7; + -webkit-transition: opacity 0.15s ease-in-out; + transition: opacity 0.15s ease-in-out; + } + .slideshow-nav > li > a:hover { + opacity: 1; + } + .slideshow-nav .active > a { + background-position: 0 -50px; + opacity: 1; + } + .integrations-tab-asana { + background-image: url(/images/modules/integrations/logos/asana@2x.png); + background-size: 137px 100px; + width: 137px; + position: relative; + bottom: -8px; + } + .integrations-tab-pivotaltracker { + background-image: url(/images/modules/integrations/logos/pivotaltracker@2x.png); + background-size: 278px 100px; + width: 278px; + } + .integrations-tab-zendesk { + background-image: url(/images/modules/integrations/logos/zendesk@2x.png); + background-size: 154px 100px; + width: 154px; + } + .integrations-slide-content { + height: 370px; + list-style: none; + position: relative; + } + .integrations-slide-content > li { + position: absolute; + visibility: hidden; + -webkit-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; + -webkit-transform: translateY(50px), scale(0.95); + -ms-transform: translateY(50px), scale(0.95); + transform: translateY(50px), scale(0.95); + opacity: 0; + } + .integrations-slide-content > .active { + visibility: visible; + -webkit-transform: translateY(0), scale(1); + -ms-transform: translateY(0), scale(1); + transform: translateY(0), scale(1); + opacity: 1; + } + .integrations-screenshot { + margin-top: 20px; + max-width: 100%; + } + .integrations-slide-description { + max-width: 600px; + display: inline-block; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + } + .integrations-logo-container { + min-height: 70px; + margin-bottom: 20px; + } + .integrations-imagelist { + list-style: none; + } + .integrations-imagelist > li { + margin-top: 90px; + margin-bottom: 50px; + } + .integrations-imagelist > li > p { + max-width: 470px; + text-align: left; + display: inline-block; + vertical-align: middle; + } + .integrations-logo-left { + margin-right: 40px; + } + .integrations-logo-right { + margin-left: 40px; + } + .features-next .lead strong { + color: #444; + } + .features-next .native-mobile-screens { + list-style-type: none; + border-bottom: solid 1px #d9d9d9; + line-height: 0; + padding-left: 0; + } + .features-next .native-mobile-screens li { + display: inline; + margin: 0 5px 30px; + } + .team-org-chart { + margin: 30px auto; + width: 470px; + } + .team-org-chart .mega-octicon { + vertical-align: middle; + } + .team-org-group { + border: solid 1px #ccc; + background-color: #fff; + text-align: center; + font-size: 16px; + padding: 10px; + margin-bottom: 13px; + border-radius: 3px; + } + .team-org-group strong { + color: #333; + } + .team-org-team { + width: 147px; + height: 120px; + display: inline-block; + vertical-align: top; + } + .team-org-team + .team-org-team { + margin-left: 10px; + } + .octicon-jersey-red { + color: #bd2c00; + } + .octicon-jersey-green { + color: #6cc644; + } + .octicon-jersey-orange { + color: #c9510c; + } + .team-org-members { + margin-top: 15px; + } + .team-org-members .octicon { + color: #aaa; + } + .team-org-repos .mega-octicon { + color: #bbb; + margin: 0 5px; + } + .team-animation { + -webkit-animation-duration: 12s; + animation-duration: 12s; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + .team-design { + -webkit-animation-name: teamDesign; + animation-name: teamDesign; + } + .team-dev { + -webkit-animation-name: teamDev; + animation-name: teamDev; + } + .team-marketing { + -webkit-animation-name: teamMarketing; + animation-name: teamMarketing; + } + .team-dev-design { + -webkit-animation-name: teamDevDesign; + animation-name: teamDevDesign; + } + .team-dev-design-marketing { + -webkit-animation-name: teamDevDesignMarketing; + animation-name: teamDevDesignMarketing; + } + .features-section img { + max-width: 100%; + } + .features-section code { + font-size: 0.9em; + padding: 3px 5px; + border-radius: 2px; + background-color: #e7e7e7; + } + .features-section p { + max-width: 750px; + margin-right: auto; + margin-left: auto; + } + .features-repo-count { + white-space: nowrap; + } + .features-content-right { + float: right; + width: 470px; + text-align: left; + } + .features-content-left { + float: left; + width: 470px; + text-align: left; + } + .diagram-icon { + position: absolute; + border-radius: 50px; + border: solid 4px #4078c0; + background-color: #fff; + width: 53px; + height: 53px; + text-align: center; + line-height: 55px; + color: #4078c0; + } + .diagram-icon-small { + position: absolute; + color: #4078c0; + margin-top: 2px\9; + } + .diagram-icon-branch { + top: -13px; + left: 81px; + -webkit-animation: bounceIn 0.6s ease-in-out 0.25s 1 normal both; + animation: bounceIn 0.6s ease-in-out 0.25s 1 normal both; + } + .diagram-icon-pr { + top: 89px; + left: 405px; + -webkit-animation: bounceIn 0.6s ease-in-out 1.8s 1 normal both; + animation: bounceIn 0.6s ease-in-out 1.8s 1 normal both; + } + .diagram-icon-merge { + top: -13px; + left: 843px; + -webkit-animation: bounceIn 0.6s ease-in-out 3.7s 1 normal both; + animation: bounceIn 0.6s ease-in-out 3.7s 1 normal both; + } + .diagram-icon-commit-1 { + top: 101px; + left: 240px; + -webkit-animation: bounceIn 0.6s ease-in-out 1.3s 1 normal both; + animation: bounceIn 0.6s ease-in-out 1.3s 1 normal both; + background-color: #fff; + } + .diagram-icon-commit-2 { + top: 101px; + left: 295px; + -webkit-animation: bounceIn 0.6s ease-in-out 1.4s 1 normal both; + animation: bounceIn 0.6s ease-in-out 1.4s 1 normal both; + background-color: #fff; + } + .diagram-icon-commit-3 { + top: 101px; + left: 350px; + -webkit-animation: bounceIn 0.6s ease-in-out 1.5s 1 normal both; + animation: bounceIn 0.6s ease-in-out 1.5s 1 normal both; + background-color: #fff; + } + .diagram-icon-discussion-1 { + top: 79px; + left: 488px; + -webkit-animation: bounceIn 0.6s ease-in-out 2s 1 normal both; + animation: bounceIn 0.6s ease-in-out 2s 1 normal both; + opacity: 0.3; + } + .diagram-icon-commit-4 { + top: 101px; + left: 515px; + -webkit-animation: bounceIn 0.6s ease-in-out 2.1s 1 normal both; + animation: bounceIn 0.6s ease-in-out 2.1s 1 normal both; + background-color: #fff; + } + .diagram-icon-discussion-2 { + top: 131px; + left: 542px; + -webkit-animation: bounceIn 0.6s ease-in-out 2.2s 1 normal both; + animation: bounceIn 0.6s ease-in-out 2.2s 1 normal both; + opacity: 0.3; + } + .diagram-icon-commit-5 { + top: 101px; + left: 570px; + -webkit-animation: bounceIn 0.6s ease-in-out 2.3s 1 normal both; + animation: bounceIn 0.6s ease-in-out 2.3s 1 normal both; + background-color: #fff; + } + .diagram-icon-discussion-3 { + top: 79px; + left: 597px; + -webkit-animation: bounceIn 0.6s ease-in-out 2.4s 1 normal both; + animation: bounceIn 0.6s ease-in-out 2.4s 1 normal both; + opacity: 0.3; + } + .diagram-icon-commit-6 { + top: 101px; + left: 625px; + -webkit-animation: bounceIn 0.6s ease-in-out 2.5s 1 normal both; + animation: bounceIn 0.6s ease-in-out 2.5s 1 normal both; + background-color: #fff; + } + .diagram-icon-discussion-4 { + top: 131px; + left: 652px; + -webkit-animation: bounceIn 0.6s ease-in-out 2.6s 1 normal both; + animation: bounceIn 0.6s ease-in-out 2.6s 1 normal both; + opacity: 0.3; + } + .diagram-icon-commit-7 { + top: 101px; + left: 680px; + -webkit-animation: bounceIn 0.6s ease-in-out 2.7s 1 normal both; + animation: bounceIn 0.6s ease-in-out 2.7s 1 normal both; + background-color: #fff; + } + .diagram-icon-discussion-5 { + top: 79px; + left: 707px; + -webkit-animation: bounceIn 0.6s ease-in-out 2.8s 1 normal both; + animation: bounceIn 0.6s ease-in-out 2.8s 1 normal both; + opacity: 0.3; + } + .features-branch-diagram { + position: relative; + margin-top: 40px; + margin-bottom: 50px; + } + .preload .diagram-animation { + -webkit-animation: none !important; + animation: none !important; + opacity: 0; + } + .mobile .diagram-animation { + -webkit-animation: none !important; + animation: none !important; + opacity: 1; + } + .features-highlight { + margin: 8px 0; + display: inline-block; + background-color: #e7e7e7; + padding: 10px; + border-radius: 3px; + } + .features-highlight i { + font-style: normal; + color: #4078c0; + } + .features-callout { + border: solid 1px #eee; + border-radius: 3px; + padding: 10px; + margin-top: 15px; + margin-bottom: 45px; + display: inline-block; + color: #767676; + font-size: 14px; + line-height: 1.4; + text-align: left; + width: 450px; + } + .features-callout > p { + margin-top: 0; + margin-bottom: 0; + } + .features-callout .left { + margin-right: 10px; + vertical-align: center; + } + .features-copy-minor { + font-size: 12px; + color: #555; + } + .svn-callout { + clear: both; + padding-top: 30px; + padding-left: 217px; + line-height: 0.8; + text-align: left; + } + .svn-callout-heading { + font-size: 18px; + margin-bottom: 0; + color: #444; + } + .svn-callout-logo { + margin-left: -70px; + margin-top: -1px; + float: left; + } + @-webkit-keyframes teamDev { + 3% { + border-color: #bd2c00; + color: #bd2c00; + } + 27% { + border-color: #bd2c00; + color: #bd2c00; + } + 30% { + border-color: #ccc; + color: #bbb; + } + } + @keyframes teamDev { + 3% { + border-color: #bd2c00; + color: #bd2c00; + } + 27% { + border-color: #bd2c00; + color: #bd2c00; + } + 30% { + border-color: #ccc; + color: #bbb; + } + } + @-webkit-keyframes teamDesign { + 34% { + border-color: #ccc; + color: #bbb; + } + 37% { + border-color: #6cc644; + color: #6cc644; + } + 60% { + border-color: #6cc644; + color: #6cc644; + } + 63% { + border-color: #ccc; + color: #bbb; + } + } + @keyframes teamDesign { + 34% { + border-color: #ccc; + color: #bbb; + } + 37% { + border-color: #6cc644; + color: #6cc644; + } + 60% { + border-color: #6cc644; + color: #6cc644; + } + 63% { + border-color: #ccc; + color: #bbb; + } + } + @-webkit-keyframes teamMarketing { + 67% { + border-color: #ccc; + color: #bbb; + } + 70% { + border-color: #c9510c; + color: #c9510c; + } + 94% { + border-color: #c9510c; + color: #c9510c; + } + } + @keyframes teamMarketing { + 67% { + border-color: #ccc; + color: #bbb; + } + 70% { + border-color: #c9510c; + color: #c9510c; + } + 94% { + border-color: #c9510c; + color: #c9510c; + } + } + @-webkit-keyframes teamDevDesign { + 3% { + border-color: #bd2c00; + color: #bd2c00; + } + 27% { + border-color: #bd2c00; + color: #bd2c00; + } + 30% { + border-color: #ccc; + color: #bbb; + } + 34% { + border-color: #ccc; + color: #bbb; + } + 37% { + border-color: #6cc644; + color: #6cc644; + } + 60% { + border-color: #6cc644; + color: #6cc644; + } + 63% { + border-color: #ccc; + color: #bbb; + } + } + @keyframes teamDevDesign { + 3% { + border-color: #bd2c00; + color: #bd2c00; + } + 27% { + border-color: #bd2c00; + color: #bd2c00; + } + 30% { + border-color: #ccc; + color: #bbb; + } + 34% { + border-color: #ccc; + color: #bbb; + } + 37% { + border-color: #6cc644; + color: #6cc644; + } + 60% { + border-color: #6cc644; + color: #6cc644; + } + 63% { + border-color: #ccc; + color: #bbb; + } + } + @-webkit-keyframes teamDevDesignMarketing { + 3% { + border-color: #bd2c00; + color: #bd2c00; + } + 27% { + border-color: #bd2c00; + color: #bd2c00; + } + 30% { + border-color: #ccc; + color: #bbb; + } + 34% { + border-color: #ccc; + color: #bbb; + } + 37% { + border-color: #6cc644; + color: #6cc644; + } + 60% { + border-color: #6cc644; + color: #6cc644; + } + 63% { + border-color: #ccc; + color: #bbb; + } + 67% { + border-color: #ccc; + color: #bbb; + } + 70% { + border-color: #c9510c; + color: #c9510c; + } + 94% { + border-color: #c9510c; + color: #c9510c; + } + } + @keyframes teamDevDesignMarketing { + 3% { + border-color: #bd2c00; + color: #bd2c00; + } + 27% { + border-color: #bd2c00; + color: #bd2c00; + } + 30% { + border-color: #ccc; + color: #bbb; + } + 34% { + border-color: #ccc; + color: #bbb; + } + 37% { + border-color: #6cc644; + color: #6cc644; + } + 60% { + border-color: #6cc644; + color: #6cc644; + } + 63% { + border-color: #ccc; + color: #bbb; + } + 67% { + border-color: #ccc; + color: #bbb; + } + 70% { + border-color: #c9510c; + color: #c9510c; + } + 94% { + border-color: #c9510c; + color: #c9510c; + } + } + @-webkit-keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(0.3); + transform: scale(0.3); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + transform: scale(1.05); + } + 70% { + -webkit-transform: scale(0.9); + transform: scale(0.9); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } + } + @keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(0.3); + transform: scale(0.3); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + transform: scale(1.05); + } + 70% { + -webkit-transform: scale(0.9); + transform: scale(0.9); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } + } + @-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + .segmented-nav-tab { + display: none; + margin-top: 40px; + } + .segmented-nav-tab:before { + display: table; + content: ""; + } + .segmented-nav-tab:after { + display: table; + clear: both; + content: ""; + } + .segmented-nav-tab.active { + display: block; + } + .octicon-list { + list-style: none; + margin-left: 26px; + margin-bottom: 28px; + } + .octicon-list li { + margin-bottom: 20px; + position: relative; + } + .octicon-list .octicon { + position: absolute; + margin-left: -22px; + top: 3px; + color: #4078c0; + } + .table-list { + display: table; + table-layout: fixed; + width: 100%; + color: #999; + border-bottom: 1px solid #e5e5e5; + } + .table-list-bordered .table-list-cell:first-child { + border-left: 1px solid #eee; + } + .table-list-bordered .table-list-cell:last-child { + border-right: 1px solid #eee; + } + .table-list-item { + position: relative; + list-style: none; + display: table-row; + } + .table-list-item.unread .table-list-cell-checkbox { + border-left-color: #4078c0; + box-shadow: 2px 0 0 #4078c0 inset; + } + .table-list-item.selected .table-list-cell-checkbox { + border-left-color: #767676; + box-shadow: 2px 0 0 #767676 inset; + } + .table-list-cell { + position: relative; + display: table-cell; + padding: 8px 10px; + font-size: 12px; + vertical-align: top; + border-top: 1px solid #eee; + } + .table-list-cell.flush-left { + padding-left: 0; + } + .table-list-cell.flush-right { + padding-right: 0; + } + .table-list-divider { + background-color: #f8f8f8; + } + .table-list-divider .table-list-section-title { + color: #767676; + white-space: nowrap; + } + .table-list-cell-checkbox { + width: 30px; + padding-left: 0; + padding-right: 0; + text-align: center; + } + .select-toggle-check { + margin-top: 7px; + } + .table-list-cell-type { + padding-top: 10px; + padding-left: 0; + padding-right: 0; + width: 20px; + text-align: center; + } + .table-list-cell-type > a { + display: inline-block; + } + .table-list-cell-type .octicon { + margin-top: 3px; + } + .table-list-cell-type:first-child { + padding-left: 10px; + } + .table-list-cell-avatar { + padding-left: 0; + padding-right: 0; + width: 16px; + } + .table-list-header { + position: relative; + margin-top: 20px; + margin-bottom: -1px; + background-color: #f8f8f8; + border: 1px solid #e5e5e5; + border-radius: 3px 3px 0 0; + } + .table-list-header:before { + display: table; + content: ""; + } + .table-list-header:after { + display: table; + clear: both; + content: ""; + } + .table-list-header .btn-link { + position: relative; + display: inline-block; + padding-top: 13px; + padding-bottom: 13px; + font-weight: normal; + } + .table-list-header .table-list-header-actions { + margin-top: 8px; + margin-right: 10px; + } + .table-list-header .table-list-header-action { + display: inline-block; + vertical-align: middle; + } + .table-list-heading { + margin-left: 10px; + } + .table-list-header-select-all { + float: left; + width: 30px; + padding: 12px 10px; + margin-right: 5px; + margin-left: -1px; + text-align: center; + } + .table-list-header-meta { + display: inline-block; + padding-top: 13px; + padding-bottom: 13px; + color: #767676; + } + .table-list-filters:first-child .table-list-header-toggle:first-child { + padding-left: 10px; + } + .table-list-header-toggle.states .selected { + font-weight: bold; + } + .table-list-header-toggle .btn-link { + color: #767676; + } + .table-list-header-toggle .btn-link .octicon { + margin-right: 2px; + } + .table-list-header-toggle .btn-link:hover { + color: #222; + text-decoration: none; + } + .table-list-header-toggle .btn-link.selected, + .table-list-header-toggle .btn-link.selected:hover { + color: #222; + } + .table-list-header-toggle .btn-link + .btn-link { + margin-left: 10px; + } + .table-list-header-toggle .btn-link:disabled, + .table-list-header-toggle .btn-link.disabled { + pointer-events: none; + opacity: 0.5; + } + .table-list-header-toggle .select-menu { + position: relative; + } + .table-list-header-toggle .select-menu-item.selected { + font-weight: bold; + } + .table-list-header-toggle .select-menu-button { + padding-right: 15px; + padding-left: 15px; + } + .table-list-header-toggle .select-menu-button:hover, + .table-list-header-toggle .select-menu-button.selected, + .table-list-header-toggle .select-menu-button.selected:hover { + color: #222; + } + .table-list-header-toggle .select-menu-modal-holder { + right: 10px; + } + .table-list-header-toggle .select-menu-modal-holder .select-menu-modal { + margin-top: -1px; + } + .table-list-triage { + display: none; + } + .triage-mode .table-list-non-triage, + .triage-mode .table-list-filters { + display: none; + } + .triage-mode .table-list-triage { + display: block; + } + .subhead { + padding-bottom: 20px; + margin-top: 10px; + margin-bottom: 20px; + border-bottom: 1px solid #eee; + } + .subhead-heading { + margin-top: 0; + margin-bottom: 0; + } + .subhead-description { + margin-top: 5px; + margin-bottom: 0; + font-size: 14px; + color: #767676; + } + .subnav { + margin-bottom: 20px; + } + .subnav:before { + display: table; + content: ""; + } + .subnav:after { + display: table; + clear: both; + content: ""; + } + .subnav > .right { + margin-left: 10px; + } + .subnav-bordered { + padding-bottom: 20px; + border-bottom: 1px solid #eee; + } + .subnav-flush { + margin-bottom: 0; + } + .subnav-item { + position: relative; + float: left; + padding: 7px 14px; + font-weight: bold; + color: #666; + border: 1px solid #e5e5e5; + } + .subnav-item + .subnav-item { + margin-left: -1px; + } + .subnav-item:hover, + .subnav-item:focus { + text-decoration: none; + background-color: #f5f5f5; + } + .subnav-item.selected, + .subnav-item.selected:hover, + .subnav-item.selected:focus { + z-index: 2; + color: #fff; + background-color: #4078c0; + border-color: #4078c0; + } + .subnav-item:first-child { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + } + .subnav-item:last-child { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + } + .subnav-search { + position: relative; + margin-left: 10px; + } + input.subnav-search-input { + width: 320px; + padding-left: 30px; + color: #767676; + border-color: #d5d5d5; + } + input.subnav-search-input-wide { + width: 500px; + } + .subnav-search-icon { + position: absolute; + top: 0; + left: 1px; + display: block; + width: 30px; + height: 34px; + line-height: 34px; + color: #ccc; + text-align: center; + } + .subnav-search-context .btn { + color: #555; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .subnav-search-context .btn:hover, + .subnav-search-context .btn:focus, + .subnav-search-context .btn:active, + .subnav-search-context .btn.selected { + z-index: 2; + } + .subnav-search-context + .subnav-search { + margin-left: -1px; + } + .subnav-search-context + .subnav-search .subnav-search-input { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .subnav-search-context .select-menu-modal-holder { + z-index: 30; + } + .subnav-search-context .select-menu-modal { + width: 220px; + } + .subnav-search-context .select-menu-item-icon { + color: inherit; + } + .subnav-divider-right { + padding-right: 10px; + border-right: 1px solid #eee; + } + .boxed-group { + position: relative; + border-radius: 3px; + margin-bottom: 30px; + } + .boxed-group .counter { + color: #fff; + background-color: #babec0; + } + .boxed-group.flush .boxed-group-inner { + padding: 0; + } + .boxed-group.condensed .boxed-group-inner { + font-size: 12px; + padding: 0; + } + .boxed-group > h3, + .boxed-group .heading { + background-color: #f5f5f5; + margin: 0; + border-radius: 3px 3px 0 0; + border: 1px solid #d8d8d8; + border-bottom: 0; + padding: 9px 10px 10px; + font-size: 14px; + line-height: 17px; + display: block; + } + .boxed-group > h3 a, + .boxed-group .heading a { + color: inherit; + } + .boxed-group > h3 a.boxed-group-breadcrumb, + .boxed-group .heading a.boxed-group-breadcrumb { + color: #666; + font-weight: normal; + text-decoration: none; + } + .boxed-group > h3 .avatar, + .boxed-group .heading .avatar { + margin-top: -4px; + } + .boxed-group > h3 .branch-name, + .boxed-group .heading .branch-name { + background-color: #e3e3e3; + border: 1px solid #d8d8d8; + } + .boxed-group .tabnav.heading { + padding: 0; + } + .boxed-group .tabnav.heading .tabnav-tab.selected { + border-top: 0; + } + .boxed-group .tabnav.heading li:first-child .selected { + border-left-color: #fff; + border-top-left-radius: 3px; + } + .boxed-group .boxed-group-bullets { + padding-left: 20px; + } + .boxed-group .tabnav-tab { + border-radius: 0; + border-top: 0; + } + .boxed-group code.heading { + font-size: 12px; + } + .boxed-group.dangerzone > h3 { + background-color: #df3e3e; + border: 1px solid #a00; + color: #fff; + text-shadow: 0 -1px 0 #900; + } + .boxed-group.dangerzone .boxed-group-inner { + border-top: 0; + } + .boxed-group.condensed > h3 { + padding: 6px 6px 7px; + font-size: 12px; + } + .boxed-group.condensed > h3 .octicon { + padding: 0 6px 0 2px; + } + .one-half .boxed-group, + .dashboard-sidebar .boxed-group { + margin-bottom: 20px; + } + .boxed-group .bleed-flush { + width: 100%; + padding: 0 10px; + margin-left: -10px; + } + .boxed-group .compact { + margin-top: 10px; + margin-bottom: 10px; + } + .boxed-group-inner { + padding: 1px 10px; + background: #fff; + border: 1px solid #d8d8d8; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + color: #666; + font-size: 13px; + } + .boxed-group-inner .markdown-body { + padding: 20px 10px 10px; + font-size: 13px; + } + .boxed-group-inner.markdown-body { + padding-top: 10px; + padding-bottom: 10px; + } + .boxed-group-inner.seamless { + padding: 0; + } + .boxed-group-inner h4 { + margin: 15px 0 -5px; + font-size: 14px; + color: #000; + } + .boxed-group-inner .tabnav { + margin-left: -10px; + margin-right: -10px; + padding-left: 10px; + padding-right: 10px; + } + .boxed-group-inner .tabnav-tab.selected { + border-top: 1px solid #ddd; + } + .boxed-group-inner .help { + clear: both; + margin: 1em -10px 0; + padding: 1em 10px 1em 35px; + border-top: 1px solid #ddd; + color: #767676; + } + .boxed-group-inner .help .octicon { + margin-left: -25px; + margin-right: 5px; + } + .boxed-group-inner .boxed-group-list + .help { + margin-top: 0; + } + .boxed-group-inner .flash-global { + margin-left: -10px; + margin-right: -10px; + border-top: 0; + } + .boxed-action { + float: right; + margin-left: 10px; + } + .boxed-group-action { + float: right; + margin: 6px 10px 0 0; + position: relative; + z-index: 2; + } + .boxed-group-action.flush { + margin-top: 0; + margin-right: 0; + } + .boxed-group-action > button { + background-color: transparent; + border: 0; + -webkit-appearance: none; + } + .boxed-group-icon { + padding: 4px; + color: #767676; + } + .field-with-errors { + display: inline; + } + .compact-options { + margin: -6px 0 13px; + } + .compact-options > li { + margin: 0 12px 0 0; + display: inline-block; + list-style-type: none; + font-weight: bold; + } + .compact-options > li label { + float: left; + } + .compact-options > li .spinner { + float: left; + width: 16px; + height: 16px; + margin-left: 5px; + display: block; + } + .boxed-group-list { + list-style: none; + margin: 0; + } + .boxed-group-list:first-child > li:first-child { + border-top: 0; + } + .boxed-group-list > li { + display: block; + margin-left: -10px; + margin-right: -10px; + padding: 5px 10px; + line-height: 23px; + border-bottom: 1px solid #e5e5e5; + } + .boxed-group-list > li:hover { + background: #ffe; + } + .boxed-group-list > li:first-child { + border-top: 1px solid #ddd; + } + .boxed-group-list > li:last-of-type { + border-bottom: 0; + } + .boxed-group-list > li.selected { + background: #e5f9e2; + } + .boxed-group-list > li.approved .btn-sm, + .boxed-group-list > li.rejected .btn-sm { + display: none; + } + .boxed-group-list > li.approved:before { + margin-right: 5px; + font: normal normal 16px/1 "octicons"; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; + content: "\f03a"; + color: #5ec051; + } + .boxed-group-list > li.rejected:before { + margin-right: 5px; + font: normal normal 16px/1 "octicons"; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; + content: "\f050"; + color: #bc0000; + } + .boxed-group-list > li.rejected a { + text-decoration: line-through; + } + .boxed-group-list > li img { + margin-top: -2px; + margin-right: 4px; + vertical-align: middle; + border-radius: 3px; + } + .boxed-group-list > li .btn-sm { + float: right; + margin: -1px 0 0 10px; + } + .boxed-group-list > li .btn-group { + float: right; + } + .boxed-group-list > li .btn-group .btn-sm { + float: left; + } + .boxed-group.flush .boxed-group-list li { + margin-left: 0; + width: auto; + padding-left: 0; + padding-right: 0; + } + .boxed-group-list.standalone { + margin-top: -1px; + } + .boxed-group-list.standalone > li:first-child { + border-top: 0; + } + .boxed-group-table { + width: 100%; + text-align: left; + } + .boxed-group-table tr:last-child td { + border-bottom: 0; + } + .boxed-group-table th { + padding: 9px; + border-bottom: 1px solid #eee; + background-color: #fafafa; + } + .boxed-group-table td { + padding: 9px; + border-bottom: 1px solid #eee; + vertical-align: top; + } + #ajax-error-message { + display: none; + position: fixed; + top: -200px; + left: 50%; + width: 974px; + z-index: 9999; + margin: 0 3px; + margin-left: -487px; + -webkit-transition: top 0.5s ease-in-out; + transition: top 0.5s ease-in-out; + } + #ajax-error-message.visible { + top: 0; + } + #ajax-error-message > .octicon-alert { + vertical-align: text-top; + } + .boxed-group-success, + .boxed-group-warning, + .boxed-group-info { + padding: 10px 15px; + margin: -1px -10px 0; + border-style: solid; + border-width: 1px 0; + } + .boxed-group-success .btn-sm, + .boxed-group-warning .btn-sm, + .boxed-group-info .btn-sm { + margin: -5px 0; + } + .boxed-group-success:first-child, + .boxed-group-warning:first-child, + .boxed-group-info:first-child { + border-top: 0; + } + .boxed-group-success { + color: #22662c; + background-color: #e2f9e5; + border-color: #bad3be; + } + .boxed-group-warning { + color: #4c4a42; + background-color: #fff9ea; + border-color: #dfd8c2; + } + .boxed-group-info { + color: inherit; + border-color: inherit; + } + .avatar-stack .avatar { + display: inline-block; + width: 20px; + height: 20px; + margin-right: -15px; + border-radius: 2px; + -webkit-transition: margin 0.2s ease-in-out; + transition: margin 0.2s ease-in-out; + background-color: #fff; + border-right: 1px solid #fff; + z-index: 2; + position: relative; + } + .avatar-stack .avatar:first-child { + z-index: 3; + } + .avatar-stack .avatar:last-child { + margin-right: 0; + z-index: 1; + } + .avatar-stack:hover .avatar { + margin-right: 3px; + } + .avatar-stack:hover .avatar:last-child { + margin-right: 0; + } + .conversation-list-heading { + margin: 35px 0 10px; + height: 0; + text-align: center; + font-size: 16px; + font-weight: normal; + color: #999; + border-bottom: 1px solid #ddd; + } + .conversation-list-heading .inner { + display: inline-block; + position: relative; + top: -10px; + padding: 0 5px; + background: #fff; + } + .simple-conversation-list { + margin: 15px 0; + font-size: 13px; + color: #999; + } + .simple-conversation-list > li { + margin: 0; + padding: 11px 0 8px; + list-style-type: none; + border-top: 1px solid #eee; + } + .simple-conversation-list > li:first-child { + border-top: 0; + } + .simple-conversation-list > li .title { + font-weight: bold; + } + .simple-conversation-list > li .num { + color: #999; + } + .simple-conversation-list > li .state { + margin-right: 3px; + margin-top: -3px; + padding-top: 2px; + padding-bottom: 2px; + } + .simple-conversation-list > li .meta { + float: right; + margin-left: 10px; + } + .simple-conversation-list.varied-states > li { + padding-left: 90px; + } + .simple-conversation-list.varied-states > li:before { + display: table; + content: ""; + } + .simple-conversation-list.varied-states > li:after { + display: table; + clear: both; + content: ""; + } + .simple-conversation-list.varied-states > li .state { + float: left; + width: 80px; + margin-left: -90px; + } + .pagehead { + position: relative; + padding-top: 20px; + padding-bottom: 20px; + margin-bottom: 20px; + border-bottom: 1px solid #eee; + } + .pagehead.admin { + background: url(/images/modules/pagehead/background-yellowhatch-v3.png) + 0 0 repeat-x; + } + .pagehead .account-switcher { + display: inline-block; + margin-top: -2px; + margin-bottom: -6px; + } + .pagehead ul.pagehead-actions { + z-index: 21; + float: right; + margin: 0; + } + .pagehead ul.pagehead-actions .feed-icon { + margin-top: 5px; + } + .pagehead .path-divider { + margin: 0 0.25em; + } + .pagehead h1 { + margin-top: 0; + margin-bottom: 0; + font-size: 20px; + font-weight: normal; + line-height: 28px; + } + .pagehead h1 strong { + font-weight: bold; + } + .pagehead h1 .avatar { + margin-top: -2px; + margin-right: 9px; + margin-bottom: -2px; + } + .pagehead-actions > li { + float: left; + margin: 0 10px 0 0; + font-size: 11px; + color: #333; + list-style-type: none; + } + .pagehead-actions > li:last-child { + margin-right: 0; + } + .pagehead-actions .octicon-mute { + color: #c00; + } + .pagehead-actions .select-menu { + position: relative; + } + .pagehead-actions .select-menu:before { + display: table; + content: ""; + } + .pagehead-actions .select-menu:after { + display: table; + clear: both; + content: ""; + } + .pagehead-actions .select-menu-modal-holder { + top: 100%; + } + .context-loader { + position: absolute; + top: 0; + left: 50%; + z-index: 20; + width: 154px; + padding: 10px 10px 10px 30px; + margin-left: -75px; + font-size: 12px; + font-weight: bold; + color: #666; + background: url(/images/spinners/octocat-spinner-16px.gif) 10px 50% + no-repeat #eee; + border: 1px solid #ddd; + border-top: 1px solid #fff; + border-radius: 5px; + border-top-left-radius: 0; + border-top-right-radius: 0; + } + @media screen and (-webkit-min-device-pixel-ratio: 2), + screen and (max--moz-device-pixel-ratio: 2) { + .context-loader { + background: url(/images/spinners/octocat-spinner-32-EAF2F5.gif) 10px + 50% no-repeat #eee; + background-size: 16px auto; + } + } + .pagehead-nav { + float: right; + margin-bottom: -20px; + } + .pagehead-nav-item { + float: left; + padding: 6px 10px 21px; + margin-left: 20px; + font-size: 14px; + color: #767676; + } + .pagehead-nav-item:hover { + color: #333; + text-decoration: none; + } + .pagehead-nav-item.selected { + color: #333; + border-bottom: 2px solid #d26911; + } + .pagehead-nav-item + .btn-outline { + margin-top: -1px; + margin-left: 20px; + } + .progress-bar { + display: block; + overflow: hidden; + background-color: #eee; + border-radius: 3px; + height: 15px; + } + .progress-bar .progress { + height: 100%; + display: block; + background-color: #6cc644; + } + .protip { + margin-top: 20px; + text-align: center; + } + .protip code { + padding: 2px; + background-color: #f4f4f4; + border-radius: 3px; + } + .protip-callout { + padding: 8px 10px; + margin-bottom: 20px; + color: #4c4a42; + text-align: left; + border: solid 1px #eee; + border-radius: 3px; + } + .repo-list { + position: relative; + } + .repo-list .participation-graph { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: -1; + } + .repo-list .participation-graph.disabled { + display: none; + } + .repo-list .participation-graph .bars { + position: absolute; + bottom: 0; + } + .repo-list-item { + position: relative; + padding-top: 30px; + padding-bottom: 30px; + list-style: none; + border-bottom: 1px solid #eee; + } + .repo-list-name { + margin: 0 0 8px; + font-size: 20px; + line-height: 1.2; + } + .repo-list-name .prefix, + .repo-list-name .slash { + font-weight: normal; + } + .repo-list-name .slash { + margin-right: -4px; + margin-left: -4px; + } + .repo-list-description { + max-width: 550px; + margin-top: 8px; + margin-bottom: 0; + font-size: 14px; + color: #666; + } + .repo-list-stats { + margin-top: 6px; + float: right; + font-size: 12px; + font-weight: bold; + color: #888; + } + .repo-list-stats .repo-list-stat-item { + margin-left: 8px; + display: inline-block; + color: #888; + text-decoration: none; + } + .repo-list-stats .repo-list-stat-item:hover { + color: #4078c0; + } + .repo-list-stats .repo-list-stat-item > .octicon { + font-size: 14px; + } + .repo-list-info { + display: inline-block; + height: 100%; + margin-top: 0; + margin-bottom: 0; + font-size: 12px; + color: #888; + vertical-align: middle; + } + .repo-list-info .octicon { + margin-top: -3px; + font-size: 12px; + vertical-align: middle; + } + .repo-list-meta { + display: block; + margin-top: 8px; + margin-bottom: 0; + font-size: 13px; + color: #888; + } + .repo-list-meta .avatar { + margin-top: -2px; + } + .repo-list-meta a:hover { + text-decoration: none; + } + .task-list-item { + list-style-type: none; + } + .task-list-item label { + font-weight: normal; + } + .task-list-item.enabled label { + cursor: pointer; + } + .task-list-item + .task-list-item { + margin-top: 3px; + } + .task-list-item-checkbox { + margin: 0 0.35em 0.25em -1.6em; + vertical-align: middle; + } + .about-header { + height: 300px; + background-color: #111; + background-image: url(/images/modules/about/about-header.jpg); + background-size: cover; + background-position: 50%; + } + .about-header.team { + background-image: url(/images/modules/about/team-header.jpg); + } + .about-header.press { + background-image: url(/images/modules/about/press-header.jpg); + } + .about-header.jobs { + background-image: url(/images/modules/about/jobs-header.jpg); + } + .about-menu { + margin-bottom: 40px; + border-bottom: 1px solid #eee; + } + .about-menu-link { + float: left; + width: 25%; + padding: 20px 20px 17px; + font-size: 18px; + color: #767676; + text-align: center; + border-bottom: 3px solid #fff; + } + .about-menu-link:hover { + color: #4078c0; + text-decoration: none; + border-bottom-color: #f5f5f5; + } + .about-menu-link.selected { + font-weight: bold; + color: #333; + border-bottom-color: #d26911; + } + .about-content { + padding: 0; + font-size: 18px; + font-weight: 300; + line-height: 1.5; + } + .about-content p { + margin-top: 0; + } + .about-content hr { + margin-top: 30px; + margin-bottom: 30px; + border-bottom-color: #eee; + } + .about-lead { + padding-left: 10%; + padding-right: 10%; + margin-bottom: 40px; + font-size: 24px; + text-align: center; + } + .press-mentions { + margin-top: 10px; + } + .press-mentions li { + margin-bottom: 15px; + list-style-type: none; + } + .press-mentions cite { + font-style: normal; + font-weight: normal; + display: block; + font-size: 13px; + color: #666; + } + .press-date { + margin-top: 25px; + margin-bottom: 0; + color: #808080; + } + .press-info { + margin: 20px 0 30px; + } + .press-info:before { + display: table; + content: ""; + } + .press-info:after { + display: table; + clear: both; + content: ""; + } + .press-info-link { + position: relative; + display: block; + padding: 10px 15px; + font-weight: normal; + line-height: 2; + background-color: #fafafa; + border: 1px solid #ddd; + } + .press-info-link:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } + .press-info-link:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + } + .press-info-link + .press-info-link { + margin-top: -1px; + } + .press-info-link .mega-octicon { + width: 32px; + text-align: center; + margin-right: 7px; + color: #aec0d0; + vertical-align: middle; + } + .press-info-link:hover { + z-index: 2; + color: #fff; + text-decoration: none; + border-color: #4078c0; + background-color: #4078c0; + } + .press-info-link:hover .mega-octicon { + color: inherit; + } + .hubbers-list { + margin: -6px; + list-style: none; + } + .hubbers-list:before { + display: table; + content: ""; + } + .hubbers-list:after { + display: table; + clear: both; + content: ""; + } + .hubbers-list-item { + display: block; + float: left; + width: 128px; + height: 128px; + margin: 6px; + text-align: center; + } + .hubbers-list-item img { + display: block; + width: 100%; + height: 100%; + background-color: #fff; + } + .hubbers-list-item .hubber-name { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + display: block; + padding-top: 100px; + font-size: 12px; + font-weight: bold; + color: #fff; + text-align: center; + text-shadow: 0 0 4px #000; + background-color: rgba(0, 0, 0, 0.25); + background-image: -webkit-linear-gradient( + rgba(0, 0, 0, 0.01) 50%, + rgba(0, 0, 0, 0.25) + ); + background-image: linear-gradient( + rgba(0, 0, 0, 0.01) 50%, + rgba(0, 0, 0, 0.25) + ); + background-repeat: repeat-x; + background-color: transparent; + opacity: 0; + -webkit-transition: opacity 0.25s ease-in-out; + transition: opacity 0.25s ease-in-out; + } + .hubbers-list-item a { + position: absolute; + display: block; + width: 128px; + height: 128px; + } + .hubbers-list-item a:hover .hubber-name { + opacity: 1; + } + .jobs-open-positions { + background-color: #f1f6fb; + border: solid 1px #d0e5f8; + border-radius: 3px; + padding: 20px; + margin-top: 10px; + } + .jobs-open-positions ul { + margin-top: 24px; + list-style: none; + } + .account-membership-form .become-a-member, + .account-membership-form .already-a-member { + display: none; + } + .account-membership-form.is-member .already-a-member { + display: block; + } + .account-membership-form.is-not-member .become-a-member { + display: block; + } + .cvv-hint { + position: relative; + padding-right: 15px; + } + .cvv-hint:hover .cvv-hint-tooltip { + display: block; + } + .cvv-hint-tooltip { + display: none; + position: absolute; + border: 1px solid #d0d0d0; + padding: 15px; + z-index: 1000; + background-color: #fff; + left: 100%; + top: -150px; + box-shadow: + 0 0 5px #ebebeb, + 0 0 5px #ebebeb, + 0 0 5px #ebebeb, + 0 0 5px #ebebeb, + 0 0 5px #ebebeb; + } + .credit-card { + border: 1px solid #ddd; + width: 250px; + padding: 20px; + height: 150px; + position: relative; + margin-top: 5px; + border-radius: 10px; + } + .credit-card.amex { + margin-top: 15px; + } + .credit-card.amex .title { + color: #fff; + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + text-shadow: + 1px 0 0 #ddd, + -1px 0 0 #ddd, + 0 1px 0 #ddd, + 0 -1px 0 #ddd, + -1px -1px 0 #ddd, + 1px 1px 0 #ddd, + -1px 1px 0 #ddd, + 1px -1px 0 #ddd; + position: relative; + z-index: 1; + top: -5px; + text-align: center; + letter-spacing: 1px; + -webkit-transform: scale(1.3, 1); + -ms-transform: scale(1.3, 1); + transform: scale(1.3, 1); + } + .credit-card.amex .card-number { + margin-top: 40px; + font-size: 15px; + display: inline-block; + white-space: nowrap; + position: relative; + } + .credit-card.amex .gladiator { + position: absolute; + left: 50%; + top: 50px; + margin-left: -35px; + height: 80px; + width: 70px; + border: 3px solid #fff; + box-shadow: 0 0 1px #aaa; + border-top-left-radius: 35px 40px; + border-bottom-left-radius: 35px 40px; + border-top-right-radius: 35px 40px; + border-bottom-right-radius: 35px 40px; + background-color: #e0e0e0; + } + .credit-card.normal .strap { + background-color: #555; + height: 20px; + margin: -5px -20px 15px; + } + .credit-card.normal .signature { + display: inline-block; + background-color: #e9e9e9; + white-space: nowrap; + font-family: "Brush Script MT", cursive; + height: 30px; + width: 150px; + font-size: 17px; + color: #aaa; + letter-spacing: -1px; + line-height: 33px; + text-indent: 10px; + } + .credit-card .cvv { + left: -7px; + top: -10px; + border: 2px solid #f00; + padding: 2px 5px; + line-height: 1; + font-family: monospace; + font-size: 10px; + border-top-left-radius: 20px 10px; + border-bottom-left-radius: 20px 10px; + border-top-right-radius: 20px 10px; + border-bottom-right-radius: 20px 10px; + text-align: center; + position: relative; + display: inline-block; + } + .credit-card .cvv span { + position: absolute; + right: 100%; + margin-right: 5px; + color: #767676; + } + .credit-card .text { + text-transform: uppercase; + font-size: 7px; + display: block; + line-height: 1.1; + font-weight: bold; + font-family: monospace; + } + .billing-addon-items table input { + width: 5em; + } + .billing-addon-items td { + vertical-align: middle; + border-bottom: 0; + } + .billing-addon-items td.fixed { + width: 150px; + } + .billing-addon-items td.black { + color: #000; + } + .billing-addon-items tr { + border-bottom: 1px solid #eee; + } + .billing-addon-items tr:last-child { + border-bottom-width: 0; + } + .billing-addon-items tr:nth-child(even) { + background-color: #fafafa; + } + .billing-addon-items tr.total-row { + background-color: #fff; + color: #bd2c00; + } + .billing-addon-items tr.dark-row { + border-bottom-width: 1px; + background-color: #fafafa; + } + .billing-addon-items .new-addon-items { + margin-left: 5px; + } + .billing-addon-items .addon-cost { + color: #767676; + } + .billing-addon-items .discounted-original-price { + color: #666; + } + .billing-addon-items .form-submit, + .billing-addon-items .payment-method { + margin-left: 10px; + } + .billing-addon-items .payment-summary { + margin-left: 10px; + margin-right: 10px; + } + .billing-credit-card .javascript-disabled-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1; + display: none; + background-color: #fff; + opacity: 0.5; + } + .billing-credit-card.disabled .javascript-disabled-overlay, + .billing-credit-card.unsupported .javascript-disabled-overlay { + display: block; + } + .billing-actions { + padding-bottom: 10px; + } + .help.billing-next-payment-help { + margin-top: 0; + } + .billing-extra-box { + border-left: 3px solid #eee; + padding-left: 10px; + margin: 10px 0 0; + } + .billing-section { + border-bottom: 1px solid #eee; + padding: 15px 10px; + line-height: 1.5em; + } + .billing-section.oneliner { + padding-bottom: 14px; + } + .billing-section.oneliner .action-button { + margin-top: -4px; + margin-bottom: -4px; + } + .billing-section p { + margin: 10px 0 0; + } + .billing-section .disabled-message { + color: #bd2c00; + } + .billing-section .action-button { + float: right; + margin-bottom: 5px; + margin-left: 10px; + } + .billing-section .octicon-btn { + float: right; + padding: 4px; + margin-left: 5px; + } + .billing-section .section-label { + width: 85px; + color: #767676; + font-weight: normal; + text-align: right; + position: absolute; + } + .billing-section .section-content { + color: #333; + margin-left: 100px; + } + .billing-section .pending-invitations-link, + .billing-section .subtle-link { + color: #767676; + } + .billing-section:last-child { + border-bottom: 0; + } + .billing-section.info-section { + background: #f9f9f9; + border-bottom: 0; + color: #767676; + overflow: hidden; + } + .billing-section.info-section .octicon-info { + font-size: 30px; + color: #ddd; + } + .billing-section .usage-bar { + margin: 5px 0 0; + background: #eee; + border-radius: 20px; + max-width: 304px; + width: 100%; + } + .billing-section .usage-bar.exceeded .progress { + background: #bd2c00; + } + .billing-section .usage-bar .progress { + max-width: 100%; + border-radius: 20px; + height: 5px; + background: #67d07c; + position: relative; + } + .billing-section .usage-bar .progress.no-highlight { + background: #999; + } + .billing-usage-summary { + margin-bottom: 20px; + } + .billing-data-usage-meter { + margin-bottom: 15px; + } + .billing-data-usage-meter:last-child { + margin-bottom: 5px; + } + .packs-table .desc { + width: 1%; + white-space: nowrap; + } + .pack-upgrade-plus { + color: #6cc644; + font-weight: bold; + font-size: 16px; + text-align: center; + } + .lfs-data-icon { + width: 15px; + color: #767676; + margin-right: 5px; + text-align: center; + } + .lfs-data-icon.dark { + color: #333; + } + .setup-wrapper .paypal-container { + margin-bottom: 30px; + } + .setup-wrapper .paypal-logged-in .paypal-container { + margin-bottom: 10px; + } + .payment-methods { + position: relative; + } + .payment-methods .selected-payment-method { + display: none; + } + .payment-methods .selected-payment-method:before { + display: table; + content: ""; + } + .payment-methods .selected-payment-method:after { + display: table; + clear: both; + content: ""; + } + .payment-methods .selected-payment-method.active { + display: block; + } + .payment-methods .pay-with-header { + margin: 5px 0; + } + .payment-methods .pay-with-paypal .setup-creditcard-form, + .payment-methods .pay-with-paypal .paypal-form-actions, + .payment-methods .pay-with-paypal .terms, + .payment-methods .pay-with-paypal .paypal-signed-in, + .payment-methods .pay-with-paypal .paypal-down-flash, + .payment-methods .pay-with-paypal .loading-paypal-spinner { + display: none; + } + .payment-methods.paypal-loading .loading-paypal-spinner { + display: block; + } + .payment-methods.paypal-down .paypal-down-flash { + display: block; + } + .payment-methods.paypal-logged-in .paypal-sign-in { + display: none; + } + .payment-methods.paypal-logged-in .setup-creditcard-form, + .payment-methods.paypal-logged-in .paypal-form-actions, + .payment-methods.paypal-logged-in .terms, + .payment-methods.paypal-logged-in .paypal-signed-in { + display: block; + } + .payment-methods.has-paypal-account .paypal-sign-in { + display: none; + } + .payment-methods.has-paypal-account .paypal-signed-in { + display: block; + } + .contact-us { + background-color: #fff9ea; + border-bottom: 1px solid #eee; + font-size: 12px; + padding: 6px 10px; + } + .contact-us .octicon { + margin-right: 5px; + color: #767676; + } + .paypal-label { + font-weight: bold; + margin: 15px 0 10px; + } + .paypal-container { + margin-bottom: 15px; + vertical-align: top; + display: inline-block; + background-color: #f9f9f9; + border-radius: 4px; + } + #braintree-paypal-loggedin { + background-position: 12px 50% !important; + border: 1px solid #ddd !important; + padding: 11px 16px !important; + border-radius: 4px; + } + #bt-pp-name { + margin-left: 20px !important; + } + #bt-pp-email { + margin-left: 15px !important; + } + #bt-pp-cancel { + font-size: 0 !important; + color: #a00 !important; + text-decoration: none !important; + font-family: octicons !important; + line-height: 1 !important; + display: inline-block; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + #bt-pp-cancel:before { + font-size: 16px !important; + content: "\f081"; + } + .payment-history .no-payments { + margin: 0; + border-top: 0; + } + .payment-history .id, + .payment-history .date, + .payment-history .method, + .payment-history .receipt, + .payment-history .status, + .payment-history .description, + .payment-history .amount { + width: 1%; + white-space: nowrap; + } + .payment-history .receipt { + text-align: center; + } + .payment-history .currency, + .payment-history .status { + color: #767676; + } + .payment-history .status-icon { + width: 14px; + text-align: center; + } + .payment-history .succeeded .status { + color: #6cc644; + } + .payment-history .refunded, + .payment-history .failed { + background: #f9f9f9; + } + .payment-history .refunded td, + .payment-history .failed td { + opacity: 0.5; + } + .payment-history .refunded .receipt, + .payment-history .refunded .status, + .payment-history .failed .receipt, + .payment-history .failed .status { + opacity: 1; + } + .payment-history .refunded .status { + color: #999; + } + .payment-history .failed .status { + color: #bd2c00; + } + .paypal-icon { + vertical-align: middle; + margin: 0 2px 0 1px; + } + .inline-form-action { + display: inline; + } + .boxed-group .boxed-group-content { + margin: 10px; + } + .billing-container { + width: 500px; + margin-top: 80px; + margin-bottom: 80px; + } + .billing-step { + margin-bottom: 50px; + } + .billing-step-title { + font-weight: 400; + padding-bottom: 10px; + border-bottom: 1px solid #e0e0e0; + margin-bottom: 15px; + } + .currency-container .local-currency, + .currency-container .local-currency-block { + display: none; + } + .currency-container.open .local-currency { + display: inline; + } + .currency-container.open .local-currency-block { + display: block; + } + .currency-container.open .default-currency { + display: none; + } + .plan-chooser { + margin: 10px auto 20px; + } + .plan-chooser.on-free .toggle-currency, + .plan-chooser.on-free .currency-notice, + .plan-chooser.on-free .plan-price-group, + .plan-chooser.on-free .coupon-notice { + display: none; + } + .strong-label { + font-weight: bold; + margin-bottom: 5px; + display: inline-block; + } + .plan-chooser-repo-menu { + margin-bottom: 15px; + } + .plan-chooser-repo-menu .price-label { + display: none; + } + .plan-chooser-repo-menu .btn-block { + text-align: left; + } + .discounted-original-price, + .per-repo.has-coupon .original-price { + text-decoration: line-through; + color: #767676; + font-weight: normal; + } + .billing-managers-abilities-list { + list-style: none; + } + .billing-managers-abilities-list li { + margin-bottom: 6px; + } + .billing-managers-abilities-list .octicon { + width: 24px; + text-align: center; + } + .billing-managers-abilities-list .octicon-check { + color: #6cc644; + } + .billing-managers-abilities-list .octicon-x { + color: #bd2c00; + } + .billing-manager-input { + width: 300px; + } + .billing-manager-banner { + border-bottom: 1px solid #eee; + background: #f9f9f9; + padding: 30px 20px; + overflow: hidden; + margin-bottom: 30px; + } + .billing-manager-banner .container { + position: relative; + } + .billing-manager-banner-offset { + margin-top: -20px; + } + .billing-manager-banner-text { + color: #555; + font-size: 14px; + margin-left: 210px; + } + .billing-manager-banner-text .btn { + margin-top: 8px; + margin-right: 8px; + } + .billing-manager-banner-title { + font-weight: bold; + font-size: 12px; + color: #767676; + } + .billing-manager-icon { + font-size: 180px; + position: absolute; + top: -35px; + left: 0; + color: #e0e0e0; + } + .billing-manager-feedback { + margin-top: 15px; + padding: 10px 10px 8px; + background-color: #f9f9f9; + border: 1px solid #e0e0e0; + font-weight: bold; + color: #666; + position: relative; + border-radius: 3px; + } + .billing-manager-feedback:before, + .billing-manager-feedback:after { + content: ""; + display: block; + border: 5px solid transparent; + position: absolute; + } + .billing-manager-feedback:after { + top: -14px; + left: 12px; + border-width: 7px; + border-bottom-color: #f9f9f9; + } + .billing-manager-feedback:before { + top: -18px; + left: 10px; + border-width: 9px; + border-bottom-color: #e0e0e0; + } + .billing-manager-feedback .octicon-question { + margin-right: 6px; + margin-left: 3px; + color: #c9510c; + } + .billing-manager-feedback .octospinner { + margin-right: 5px; + vertical-align: middle; + margin-top: -3px; + } + .billing-manager-feedback.error { + color: #911; + background-color: #fcdede; + } + .billing-manager-feedback.error:after { + border-bottom-color: #fcdede; + } + .billing-feedback-answer { + color: #767676; + font-weight: normal; + margin-left: 10px; + } + .heat1 { + background-color: #ffeca7; + } + .heat2 { + background-color: #ffdd8c; + } + .heat3 { + background-color: #ffdd7c; + } + .heat4 { + background-color: #fba447; + } + .heat5 { + background-color: #f68736; + } + .heat6 { + background-color: #f37636; + } + .heat7 { + background-color: #ca6632; + } + .heat8 { + background-color: #c0513f; + } + .heat9 { + background-color: #a2503a; + } + .heat10 { + background-color: #793738; + } + .blame-breadcrumb .css-truncate-target { + max-width: 680px; + } + .blame-commit, + .blame-commit + .blame-line { + border-top: 1px solid #e9e9e9; + } + .blame-container { + margin-top: -1px; + } + .blame-blob-num { + background-color: #fdfdfd; + } + .blame-commit-info { + position: relative; + width: 350px; + min-width: 350px; + max-width: 350px; + padding: 8px 10px; + vertical-align: top; + } + .blame-commit-avatar { + float: left; + margin-right: 5px; + } + .blame-commit-title { + font-weight: bold; + color: #333; + max-width: 230px; + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + line-height: 1.1; + vertical-align: top; + } + .blame-sha { + font: + 11px Consolas, + "Liberation Mono", + Menlo, + Courier, + monospace; + float: right; + } + .blame-commit-meta { + color: #767676; + font-size: 12px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + line-height: 1.1; + } + .line-age { + width: 2px; + padding: 0 1px; + } + .line-age-legend { + float: right; + margin-top: -25px; + font-size: 12px; + color: #767676; + } + .line-age-legend ol { + display: inline-block; + list-style: none; + margin: 0 5px; + } + .line-age-legend ol li { + display: inline-block; + width: 8px; + height: 10px; + } + #blog-main .pagehead h1 { + margin-top: 3px; + font-size: 24px; + } + .blog-title { + color: #333; + } + .blog-search { + position: relative; + float: right; + } + .blog-search .blog-search-input { + padding-left: 28px; + width: 200px; + } + .blog-search .octicon-search { + position: absolute; + left: 7px; + top: 9px; + z-index: 5; + color: #767676; + } + .blog-search-results em { + background-color: #faffa6; + padding: 0.1em; + } + .blog-aside { + float: right; + width: 200px; + } + .blog-aside .btn { + margin-bottom: 20px; + text-align: center; + } + .blog-aside .menu-container { + float: none; + margin-bottom: 30px; + } + .blog-aside .rss { + display: inline-block; + margin-left: 5px; + color: #999; + } + .blog-aside .rss .octicon { + float: left; + margin-right: 5px; + color: #c9510c; + } + .blog-content { + width: 685px; + font-family: "Helvetica Neue", Helvetica, Arial, freesans, sans-serif; + } + .blog-content h1, + .blog-content h2, + .blog-content h3 { + font-weight: 500; + } + .blog-content .markdown-body h2 { + font-size: 20px; + } + .blog-content .markdown-body h3 { + font-size: 18px; + } + .blog-draft-indicator { + color: #bd2c00; + } + .blog-post { + margin-bottom: 60px; + } + .blog-post-meta { + list-style: none; + margin-bottom: 20px; + color: #999; + } + .blog-post-meta .meta-item { + display: inline; + padding-right: 20px; + } + .blog-post-meta a { + color: #999; + } + .blog-post-meta .octicon, + .blog-post-meta .author-avatar { + vertical-align: top; + border-radius: 3px; + } + .blog-post-title { + margin-top: 0; + margin-bottom: 10px; + font-size: 32px; + } + #blog-home { + color: #ccc; + font-size: 15px; + font-weight: 100; + margin-right: 10px; + margin-left: -25px; + vertical-align: middle; + } + #blog-home:hover { + color: #767676; + } + .blog-post-body { + font-size: 16px; + line-height: 1.6; + color: #444; + } + .blog-post-body img { + padding: 3px; + border: 1px solid #d8d8d8; + } + .blog-post-body img.emoji { + border: 0; + padding: 0; + } + .blog-post-body iframe { + border: 0; + width: 100%; + } + .blog-feedback { + margin: 50px 0; + background-color: #fafafa; + border: 1px solid #ddd; + border-bottom-color: #ccc; + border-radius: 3px; + box-shadow: + inset 0 1px 0 #fff, + 0 1px 5px #f1f1f1; + } + .blog-feedback-header { + margin: 0; + padding: 10px; + border-bottom: 1px solid #ddd; + box-shadow: 0 1px 0 #fff; + font-size: 14px; + font-weight: bold; + } + .blog-feedback-header.with-twitter { + background: url(/images/icons/twitter.png) 648px 1px no-repeat; + background-size: 32px auto; + } + .blog-feedback-description { + margin: 0; + padding: 10px; + color: #767676; + } + .branches .page-header { + margin-bottom: 20px; + } + .branches .clear-search { + display: none; + } + .branches .loading-overlay { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + padding-top: 50px; + z-index: 20; + background-color: rgba(255, 255, 255, 0.7); + text-align: center; + } + .branches .loading-overlay .spinner { + display: inline-block; + } + .branches.is-search-mode .clear-search { + display: inline-block; + } + .branches.is-loading .loading-overlay { + display: block; + } + .branches .status { + display: inline-block; + width: 16px; + text-align: center; + } + .branches .status .octicon { + position: relative; + top: 2px; + } + .branches .pull-request-link { + top: 0; + display: inline; + padding: 2px 5px; + line-height: 1em; + } + .branches .branch-actions { + float: right; + position: relative; + top: -3px; + right: -4px; + } + .branches .branch-actions form { + display: inline; + } + .branches .branch-actions .octicon { + width: 16px; + text-align: center; + } + .branch-groups { + position: relative; + } + .branch-group { + margin-bottom: 20px; + width: 100%; + border-radius: 3px; + } + .branch-group:before { + display: table; + content: ""; + } + .branch-group:after { + display: table; + clear: both; + content: ""; + } + .branch-group-heading { + border: 1px solid #ddd; + border-bottom: 0; + padding: 6px 12px; + background: #f5f5f5; + text-shadow: 0 1px 0 #fff; + } + .branch-group-heading + .branch-summary { + border-top: 1px solid #ddd; + } + .branch-group-heading .branch-name { + background: #767676; + color: #fff; + text-shadow: none; + } + .branch-group-name { + color: #767676; + font-weight: bold; + } + .branch-group-heading:first-child, + .branch-summary:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + .branch-group-heading:last-child, + .branch-summary:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + } + .branches-view-switcher { + display: inline-block; + vertical-align: middle; + } + .branch-search { + position: relative; + float: right; + vertical-align: middle; + } + .branch-search .clear-search { + position: absolute; + right: 12px; + top: 9px; + color: #999; + } + .branch-search-field { + width: 250px; + padding-right: 25px; + } + .no-results-message { + padding: 12px; + border: 1px solid #ddd; + border-radius: 0 0 3px 3px; + color: rgba(0, 0, 0, 0.5); + text-align: center; + } + .branch-summary { + padding: 12px; + border: 1px solid #ddd; + border-bottom: 0; + color: rgba(0, 0, 0, 0.5); + } + .branch-summary:last-child { + border-bottom: 1px solid #ddd; + } + .branch-summary .branch-spinner { + display: none; + vertical-align: text-bottom; + } + .branch-summary.loading .branch-delete-icon { + display: none; + } + .branch-summary.loading .branch-spinner { + display: inline-block; + } + .branch-summary.is-deleted .existing-branch-summary { + display: none; + } + .branch-summary.is-deleted .deleted-branch-summary { + display: block; + } + .deleted-branch-summary { + display: none; + } + .deleted-branch-summary .css-truncate-target { + max-width: 500px; + } + .deleted-branch-summary .branch-name { + opacity: 0.5; + text-decoration: line-through; + } + .deleted-branch-summary .branch-spinner { + float: right; + position: relative; + top: 4px; + right: 5px; + } + .pr-details { + display: inline-block; + width: 144px; + text-align: right; + } + .pr-details .state { + padding: 1px 5px; + font-size: 12px; + width: 75px; + margin-left: 5px; + text-decoration: none; + } + .pr-details .state .octicon { + font-size: 14px; + } + .branch-delete { + display: inline-block; + color: #bd2c00; + margin: 4px 2px 0 8px; + } + .branch-delete.disabled { + color: #ddd; + } + .more-branches { + display: block; + padding: 6px; + width: 100%; + border: 1px solid #dae5eb; + border-radius: 0 0 3px 3px; + text-align: center; + text-decoration: none; + background: #f1f7fa; + color: #4078c0; + } + .more-branches:hover { + background: #e6f1f6; + } + .more-branches .octicon { + position: relative; + top: 1px; + margin-left: 5px; + } + .branch-details { + display: inline-block; + width: 490px; + margin-right: 10px; + } + .branch-details .css-truncate-target { + max-width: 240px; + } + .branch-details .octicon { + margin-right: 3px; + } + .branch-meta { + color: #aaa; + font-size: 12px; + line-height: 20px; + } + .default-label { + width: 150px; + text-align: center; + display: inline-block; + vertical-align: top; + } + .default-label .sha { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + } + .default-label .sha .ellipses { + color: inherit; + font-family: Helvetica, arial, nimbussansl, liberationsans, freesans, + clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol"; + } + .default-label .sha .octicon { + padding-right: 4px; + } + @-webkit-keyframes branch-bar-slide { + from { + width: 0%; + } + to { + width: 100%; + } + } + @keyframes branch-bar-slide { + from { + width: 0%; + } + to { + width: 100%; + } + } + .branch-a-b-count { + display: inline-block; + vertical-align: middle; + } + .branch-a-b-count .count-half { + float: left; + width: 90px; + text-align: right; + padding-bottom: 6px; + position: relative; + } + .branch-a-b-count .count-half:last-child { + text-align: left; + border-left: 1px solid #bbb; + } + .branch-a-b-count .count-value { + position: relative; + top: -1px; + display: block; + padding: 0 3px; + font-size: 10px; + } + .branch-a-b-count .bar { + position: absolute; + min-width: 3px; + height: 4px; + } + .branch-a-b-count .meter { + position: absolute; + height: 4px; + background-color: #ccc; + -webkit-animation: branch-bar-slide 0.3s ease forwards 0.5s; + animation: branch-bar-slide 0.3s ease forwards 0.5s; + } + .branch-a-b-count .meter.zero { + background-color: transparent; + } + .branch-a-b-count .bar-behind { + right: 0; + border-radius: 3px 0 0 3px; + } + .branch-a-b-count .bar-behind .meter { + right: 0; + border-radius: 3px 0 0 3px; + } + .branch-a-b-count .bar-ahead { + left: 0; + border-radius: 0 3px 3px 0; + } + .branch-a-b-count .bar-ahead .meter { + border-radius: 0 3px 3px 0; + } + .branch-a-b-count .bar-ahead.even, + .branch-a-b-count .bar-behind.even { + background: #eee; + min-width: 2px; + } + .capped-cards { + list-style: none; + } + .capped-cards .capped-card { + float: left; + width: 450px; + } + .capped-card { + border-radius: 2px; + border: 1px solid #ddd; + list-style: none; + margin: 10px; + } + .capped-card:before { + display: table; + content: ""; + } + .capped-card:after { + display: table; + clear: both; + content: ""; + } + .capped-card:nth-child(odd) { + margin-left: 0; + } + .capped-card:nth-child(even) { + margin-right: 0; + } + .capped-card h3 { + margin: 0; + border-bottom: 1px solid #eee; + line-height: 100%; + padding: 10px; + } + .capped-card > p { + border-bottom: 1px solid #eee; + color: #767676; + display: block; + font-size: 15px; + line-height: 100%; + margin: 0; + padding: 0 10px 10px; + } + .capped-card-content { + background: #f7f7f7; + display: block; + } + .capped-card-content:before { + display: table; + content: ""; + } + .capped-card-content:after { + display: table; + clear: both; + content: ""; + } + .clone-url h5 { + margin-top: 0; + margin-bottom: 10px; + } + .clone-url .input-group { + width: 100%; + } + .clone-url input.input-mini { + font-size: 11px; + color: #767676; + } + .commit-form { + position: relative; + padding: 15px; + border: 1px solid #ddd; + border-radius: 3px; + } + .commit-form:after, + .commit-form:before { + position: absolute; + top: 11px; + left: -16px; + right: 100%; + width: 0; + height: 0; + display: block; + content: " "; + border-color: transparent; + border-style: solid solid outset; + pointer-events: none; + } + .commit-form:after { + border-width: 7px; + border-right-color: #fff; + margin-top: 1px; + margin-left: 2px; + } + .commit-form:before { + border-right-color: #ddd; + border-width: 8px; + } + .commit-form .input-block { + margin-top: 10px; + margin-bottom: 10px; + } + .commit-form-avatar { + float: left; + margin-left: -64px; + border-radius: 3px; + } + .commit-form-actions { + text-align: right; + } + .commit-form-actions:before { + display: table; + content: ""; + } + .commit-form-actions:after { + display: table; + clear: both; + content: ""; + } + .commit-form-actions .btn { + float: right; + margin-left: 5px; + } + .commit-form-actions .check-for-fork { + line-height: 34px; + } + .copyable-terminal { + position: relative; + padding: 10px 55px 10px 10px; + background-color: #f7f7f7; + border-radius: 3px; + } + .copyable-terminal-content { + overflow: auto; + } + .copyable-terminal-button { + position: absolute; + top: 5px; + right: 5px; + } + .copyable-terminal-button .zeroclipboard-button { + float: right; + } + .copyable-terminal-button .zeroclipboard-button .octicon { + padding-left: 1px; + margin: 0 auto; + } + .logged_out.enter-coupon { + background-color: #f9f9f9; + } + .logged_out.enter-coupon .coupon-form-body { + margin-bottom: -20px; + background-image: none; + box-shadow: + 0 1px 3px rgba(0, 0, 0, 0.075), + inset 1px 0 #fff, + 0 0 200px #fff; + } + .logged_out.enter-coupon .header-logged-out { + background-color: #fff; + } + .logged_out.enter-coupon .site-footer { + border-top: 0; + } + .coupons .setup-plans td img { + vertical-align: middle; + margin-top: -2px; + } + .coupons .coupon-form-body { + width: 230px; + margin: 100px auto 60px; + padding: 20px; + font-size: 14px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + text-align: center; + background-color: #fff; + background-image: -webkit-linear-gradient(#fefefe, #fafafa); + background-image: linear-gradient(#fefefe, #fafafa); + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: + 0 1px 3px rgba(0, 0, 0, 0.075), + inset 1px 0 #fff; + } + .coupons .coupon-form-body .input-block { + margin-bottom: 15px; + } + .coupons .coupon-form-body .btn { + display: block; + width: 100%; + } + .coupon-icon { + width: 80px; + height: 80px; + margin: 0 auto 15px; + color: #4078c0; + border: 1px solid #dedede; + border-radius: 40px; + } + .coupon-icon .mega-octicon { + margin-left: 2px; + font-size: 48px; + line-height: 80px; + } + .coupon-signin-title { + margin-top: 40px; + } + .coupon-title { + margin-bottom: 20px; + font-weight: 500; + } + .coupons-list-options { + margin-bottom: 15px; + } + .coupons-list-options .select-menu, + .coupons-list-options .btn-group { + display: inline-block; + margin-right: 10px; + } + .coupons-list-options .pagination { + float: right; + margin: 0; + } + dl.form.developer-select-account { + margin-top: 0; + } + .developer-wrapper .setup-info-module .features-list { + margin-left: 16px; + } + .developer-wrapper .setup-info-module .features-list .octicon { + margin-left: -17px; + } + .developer-thanks h2 { + font-size: 38px; + font-weight: normal; + } + .developer-thanks .hook { + margin-top: 2px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 300; + color: #666; + } + .developer-thanks-image { + position: relative; + bottom: -45px; + float: left; + width: 400px; + } + .developer-thanks-section { + margin: 130px 0 0 470px; + } + .developer-next-steps { + list-style: none; + font-size: 18px; + font-weight: 300; + } + .developer-next-steps li { + margin-top: 10px; + } + .developer-next-steps li:first-child { + margin-top: 0; + } + .developer-next-steps .mega-octicon { + position: relative; + top: 5px; + margin-right: 10px; + font-size: 32px; + color: #6cc644; + } + .blob-wrapper { + overflow-x: auto; + overflow-y: hidden; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + } + .diff-table { + width: 100%; + border-collapse: separate; + } + .diff-table .line-comments { + padding: 10px; + vertical-align: top; + } + .diff-table .line-comments:first-child + .empty-cell { + border-left-width: 1px; + } + .diff-table tr:not(:last-child) .line-comments { + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + } + .blob-num { + width: 1%; + min-width: 50px; + white-space: nowrap; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; + line-height: 18px; + color: rgba(0, 0, 0, 0.3); + vertical-align: top; + text-align: right; + border: solid #eee; + border-width: 0 1px 0 0; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + padding-left: 10px; + padding-right: 10px; + } + .blob-num:hover { + color: rgba(0, 0, 0, 0.6); + } + .blob-num:before { + content: attr(data-line-number); + } + .blob-num.non-expandable { + cursor: default; + } + .blob-num.non-expandable:hover { + color: rgba(0, 0, 0, 0.3); + } + .blob-code { + position: relative; + padding-left: 10px; + padding-right: 10px; + vertical-align: top; + } + .blob-code-inner { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; + color: #333; + white-space: pre; + overflow: visible; + word-wrap: normal; + } + .blob-code-inner .x-first { + border-top-left-radius: 0.2em; + border-bottom-left-radius: 0.2em; + } + .blob-code-inner .x-last { + border-top-right-radius: 0.2em; + border-bottom-right-radius: 0.2em; + } + .soft-wrap .diff-table { + table-layout: fixed; + } + .soft-wrap .blob-code { + padding-left: 18px; + text-indent: -7px; + } + .soft-wrap .blob-code-inner { + word-wrap: break-word; + white-space: pre-wrap; + } + .soft-wrap .blob-code-inner .no-nl-marker { + display: none; + } + .soft-wrap .add-line-comment { + margin-left: -28px; + } + .blob-num-hunk, + .blob-code-hunk, + .blob-num-expandable, + .blob-code-expandable { + vertical-align: middle; + color: rgba(0, 0, 0, 0.3); + border-color: #d2dff0; + } + .blob-num-hunk, + .blob-num-expandable { + background-color: #edf2f9; + } + .blob-code-hunk, + .blob-code-expandable { + padding-top: 4px; + padding-bottom: 4px; + background-color: #f4f7fb; + border-width: 1px 0; + } + .blob-expanded .blob-num, + .blob-expanded .blob-code { + background-color: #fafafa; + } + .blob-expanded + tr:not(.blob-expanded) .blob-num, + .blob-expanded + tr:not(.blob-expanded) .blob-code { + border-top: 1px solid #eee; + } + .blob-expanded .blob-num-hunk { + border-top: 1px solid #eee; + } + tr:not(.blob-expanded) + .blob-expanded .blob-num, + tr:not(.blob-expanded) + .blob-expanded .blob-code { + border-top: 1px solid #eee; + } + .blob-num-expandable { + padding: 0; + font-size: 12px; + text-align: center; + } + .blob-num-expandable .diff-expander { + display: block; + width: auto; + height: auto; + margin-right: -1px; + padding: 4px 11px 4px 10px; + cursor: pointer; + color: #767676; + } + .blob-num-expandable .diff-expander:hover { + color: #fff; + text-shadow: none; + background-color: #4078c0; + border-color: #4078c0; + } + .blob-code-addition { + background-color: #eaffea; + } + .blob-code-addition .x { + background-color: #a6f3a6; + } + .blob-num-addition { + background-color: #dbffdb; + border-color: #c1e9c1; + } + .blob-code-deletion { + background-color: #ffecec; + } + .blob-code-deletion .x { + background-color: #f8cbcb; + } + .blob-num-deletion { + background-color: #ffdddd; + border-color: #f1c0c0; + } + .selected-line.blob-code { + background-color: #f8eec7; + } + .selected-line.blob-code .x { + background-color: transparent; + } + .selected-line.blob-num { + background-color: #f6e8b5; + border-color: #f0db88; + } + .add-line-comment { + position: relative; + z-index: 5; + float: left; + width: 20px; + height: 20px; + margin: -1px -10px -1px -20px; + line-height: 20px; + color: #fff; + text-align: center; + text-indent: 0; + cursor: pointer; + background-color: #4078c0; + background-color: #4078c0; + background-image: -webkit-linear-gradient(#5386c6, #4078c0); + background-image: linear-gradient(#5386c6, #4078c0); + background-repeat: repeat-x; + border-radius: 3px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15); + opacity: 0; + -webkit-transform: scale(0.8, 0.8); + -ms-transform: scale(0.8, 0.8); + transform: scale(0.8, 0.8); + -webkit-transition: -webkit-transform 0.1s ease-in-out; + transition: transform 0.1s ease-in-out; + } + .add-line-comment:hover { + -webkit-transform: scale(1, 1); + -ms-transform: scale(1, 1); + transform: scale(1, 1); + } + .is-hovered .add-line-comment { + opacity: 1; + } + .add-line-comment.octicon-check { + opacity: 1; + background: #333; + } + .inline-comment-form { + border: 1px solid #ddd; + border-radius: 3px; + } + .inline-review-comment { + margin-top: 0 !important; + margin-bottom: 10px !important; + } + .inline-review-comment .gc:first-child + tr .blob-num, + .inline-review-comment .gc:first-child + tr .blob-code { + padding-top: 5px; + } + .inline-review-comment tr:last-child { + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + } + .inline-review-comment tr:last-child .blob-num, + .inline-review-comment tr:last-child .blob-code { + padding-bottom: 8px; + } + .inline-review-comment tr:last-child .blob-num:first-child, + .inline-review-comment tr:last-child .blob-code:first-child { + border-bottom-left-radius: 2px; + } + .inline-review-comment tr:last-child .blob-num:last-child, + .inline-review-comment tr:last-child .blob-code:last-child { + border-bottom-right-radius: 2px; + } + .timeline-inline-comments { + width: 100%; + table-layout: fixed; + } + .timeline-inline-comments .inline-comments, + .show-inline-notes .inline-comments { + display: table-row; + } + .inline-comments { + display: none; + } + .inline-comments.is-collapsed { + display: none; + } + .inline-comments .line-comments.is-collapsed { + visibility: hidden; + } + .inline-comments .line-comments + .blob-num { + border-left-width: 1px; + } + .inline-comments .line-comments .comment-content { + position: relative; + } + .inline-comments .line-comments .comment-content .suggester-container { + top: 10px; + } + .inline-comments .timeline-comment { + margin-bottom: 10px; + } + .inline-comments .inline-comment-form, + .inline-comments .inline-comment-form-container { + max-width: 780px; + } + .inline-comments .ajax-indicator { + display: none; + vertical-align: bottom; + } + .inline-comments form.loading .ajax-indicator { + display: inline-block; + } + .inline-comments .comment-resolved-by { + margin-left: 10px; + } + .inline-comments .comment-resolved-by .username { + font-weight: bold; + color: #333; + } + .comment-holder { + max-width: 780px; + } + .line-comments + .line-comments, + .empty-cell + .line-comments { + border-left: 1px solid #eee; + } + .inline-comment-form-container .inline-comment-form, + .inline-comment-form-container.open .inline-comment-form-actions { + display: none; + } + .inline-comment-form-container .inline-comment-form-actions, + .inline-comment-form-container.open .inline-comment-form { + display: block; + } + body.split-diff .header > .container, + body.split-diff .repohead > .container, + body.split-diff .site > .container, + body.split-diff .gist-content-wrapper > .container { + width: 100%; + padding-left: 30px; + padding-right: 30px; + } + body.split-diff .repository-with-sidebar { + padding-right: 60px; + } + body.split-diff .repository-with-sidebar .repository-sidebar { + margin-right: -60px; + } + body.split-diff .repository-content { + width: 100%; + } + body.split-diff .new-pr-form { + max-width: 980px; + } + body.split-diff .new-pr-form .discussion-sidebar { + width: 200px; + } + .file-diff-split { + table-layout: fixed; + } + .file-diff-split .blob-code + .blob-num { + border-left-width: 1px; + } + .file-diff-split .blob-code-inner { + white-space: pre-wrap; + word-wrap: break-word; + } + .file-diff-split .empty-cell { + cursor: default; + background-color: #fafafa; + border-right-color: #eee; + } + .ghe-license-status { + padding: 40px 0; + font-size: 16px; + text-align: center; + } + .ghe-license-status .octocat { + width: 225px; + margin-bottom: 20px; + } + .ghe-license-status h1 { + margin-bottom: 10px; + } + .ghe-license-status p { + margin-top: 0; + margin-bottom: 5px; + color: #767676; + } + .ghe-license-expiry-icon { + margin: 5px 10px 0 0; + color: #ddb38a; + } + .enterprise .flash-global { + max-height: 90px; + overflow-y: scroll; + } + .fakelogin { + text-align: center; + font-size: 14px; + line-height: 34px; + background-color: #b33630; + background-image: -webkit-linear-gradient(#dc5f59, #b33630); + background-image: linear-gradient(#dc5f59, #b33630); + background-repeat: repeat-x; + border-bottom: 1px solid #900; + color: #fff; + position: fixed; + top: 0; + z-index: 1000; + width: 100%; + text-shadow: 0 -1px 0 rgba(153, 0, 0, 0.25); + } + .fakelogin + .header { + margin-top: 35px; + } + .fakelogin + #serverstats { + margin-top: 35px; + } + .fakelogin .cancel-impersonation { + color: #fff; + text-decoration: underline; + } + .file { + position: relative; + margin-top: 20px; + margin-bottom: 15px; + border: 1px solid #ddd; + border-radius: 3px; + } + .file .data.empty { + padding: 5px 10px; + color: #767676; + } + .file .data.suppressed, + .file.open .image { + display: none; + } + .file.open .data.suppressed { + display: block; + } + .file .image { + position: relative; + padding: 30px; + text-align: center; + background-color: #ddd; + } + .file .image table { + margin: 0 auto; + } + .file .image td { + text-align: center; + color: #888; + padding: 0 5px; + vertical-align: top; + } + .file .image td img { + max-width: 100%; + } + .file .image .border-wrap { + position: relative; + display: inline-block; + line-height: 0; + background-color: #fff; + border: 1px solid #767676; + } + .file .image a { + display: inline-block; + line-height: 0; + } + .file .image img, + .file .image canvas { + max-width: 600px; + background: url(/images/modules/commit/trans_bg.gif) right bottom #eee; + border: 1px solid #fff; + } + .file .image .view img, + .file .image .view canvas { + position: relative; + top: 0; + right: 0; + background: url(/images/modules/commit/trans_bg.gif) right bottom #eee; + max-width: inherit; + } + .file .image .view > span { + vertical-align: middle; + } + .file .hidden { + display: none !important; + } + .file .empty { + background: none; + } + .file-header { + padding: 5px 10px; + background-color: #f7f7f7; + border-bottom: 1px solid #d8d8d8; + border-top-left-radius: 2px; + border-top-right-radius: 2px; + } + .file-header:before { + display: table; + content: ""; + } + .file-header:after { + display: table; + clear: both; + content: ""; + } + .file-actions { + float: right; + padding-top: 3px; + } + .file-actions select { + margin-left: 5px; + } + .file-info { + float: left; + line-height: 32px; + } + .file-info-divider { + display: inline-block; + width: 1px; + height: 18px; + margin-right: 3px; + margin-left: 3px; + vertical-align: middle; + background-color: #ddd; + } + .file-mode { + text-transform: capitalize; + } + .show-file-notes { + display: none; + } + .has-inline-notes .show-file-notes { + display: inline-block; + margin-right: 10px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .file-blankslate { + border: 0; + border-radius: 0 0 2px 2px; + } + .octicon-btn { + display: inline-block; + margin-left: 5px; + padding: 5px; + line-height: 1; + color: #767676; + vertical-align: middle; + background: transparent; + border: 0; + outline: none; + } + .octicon-btn:hover { + color: #4078c0; + } + .octicon-btn.disabled { + color: #bbb; + cursor: default; + } + .octicon-btn.disabled:hover { + color: #bbb; + } + .octicon-btn-danger:hover { + color: #bd2c00; + } + .enable-fullscreen.btn-sm { + display: inline-block; + margin-top: 4px; + margin-left: 5px; + padding: 0 6px; + } + .enable-fullscreen.btn-sm .octicon { + margin-right: 0; + } + .new-file .enable-fullscreen { + margin-left: 11px; + } + .write-content { + position: relative; + } + .write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333; + opacity: 0.5; + line-height: 1em; + } + .write-content .enable-fullscreen:hover { + opacity: 1; + } + .fullscreen-overlay { + display: none; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: #fff; + text-shadow: none; + z-index: 1000; + } + .fullscreen-overlay .fullscreen-container { + max-width: 800px; + height: 100%; + margin: 0 auto; + padding: 30px 0; + } + .fullscreen-overlay .textarea-wrap { + width: 100%; + height: 100%; + position: relative; + } + .fullscreen-overlay textarea { + width: 100%; + height: 100%; + padding: 20px; + border: 0; + background: #fff; + color: darkgray; + font-size: 21px; + line-height: 1.6em; + resize: none; + -webkit-transition: color 0.15s ease-in-out; + transition: color 0.15s ease-in-out; + box-shadow: none; + } + .fullscreen-overlay textarea:focus, + .fullscreen-overlay textarea:hover { + outline: none; + color: #333; + } + .fullscreen-overlay .fullscreen-sidebar { + position: absolute; + top: 30px; + right: 30px; + text-align: right; + z-index: 1002; + } + .fullscreen-overlay .fullscreen-sidebar .exit-fullscreen, + .fullscreen-overlay .fullscreen-sidebar .theme-switcher { + color: #c3c3c3; + float: right; + clear: right; + margin-bottom: 15px; + } + .fullscreen-overlay .fullscreen-sidebar .exit-fullscreen:hover, + .fullscreen-overlay .fullscreen-sidebar .theme-switcher:hover { + color: #333; + text-shadow: 0 0 10px #fff; + } + .fullscreen-overlay .fullscreen-sidebar .theme-switcher { + margin-right: 8px; + } + .fullscreen-overlay.dark-theme { + background: #1d1f21; + } + .fullscreen-overlay.dark-theme textarea { + background: #1d1f21; + color: #a4b1b1; + } + .fullscreen-overlay.dark-theme textarea:focus, + .fullscreen-overlay.dark-theme textarea:hover { + color: #dbe0e0; + } + .fullscreen-overlay.dark-theme .fullscreen-sidebar { + color: #dbe0e0; + } + .fullscreen-overlay.dark-theme .fullscreen-sidebar .exit-fullscreen, + .fullscreen-overlay.dark-theme .fullscreen-sidebar .theme-switcher { + color: #a4b1b1; + } + .fullscreen-overlay.dark-theme .fullscreen-sidebar .exit-fullscreen:hover, + .fullscreen-overlay.dark-theme .fullscreen-sidebar .theme-switcher:hover { + color: #dbe0e0; + text-shadow: 0 0 10px #000; + } + .fullscreen-overlay .suggester-container { + top: 5px; + left: 0; + } + .fullscreen-overlay-enabled .wrapper, + .fullscreen-overlay-enabled #footer { + display: none; + } + .fullscreen-overlay-enabled .fullscreen-overlay { + display: block; + } + .previewable-comment-form .upload-enabled .fullscreen-overlay textarea { + max-height: none; + border: 0; + border-radius: 0; + } + #gollum-editor { + margin: 10px 0 50px; + padding: 10px 0 0; + border: 0; + } + #gollum-editor .comment-form-head.tabnav { + border: 1px solid #ddd; + } + #gollum-editor #gollum-editor-body { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + line-height: 22px; + margin: 13px 0 5px; + height: 390px; + resize: vertical; + } + #gollum-editor #gollum-editor-body + .collapsed, + #gollum-editor #gollum-editor-body + .expanded { + border-top: 1px solid #ddd; + margin-top: 7px; + } + #gollum-editor .collapsed, + #gollum-editor .expanded { + border-bottom: 1px solid #ddd; + display: block; + overflow: hidden; + padding: 10px 0 5px; + } + #gollum-editor .collapsed a.button, + #gollum-editor .expanded a.button { + border: 1px solid #ddd; + color: #333; + display: block; + float: left; + height: 25px; + overflow: hidden; + margin: 2px 5px 7px 0; + padding: 0; + text-shadow: 0 1px 0 #fff; + width: 25px; + background-color: #eaeaea; + background-image: -webkit-linear-gradient(#fafafa, #eaeaea); + background-image: linear-gradient(#fafafa, #eaeaea); + background-repeat: repeat-x; + border-radius: 3px; + } + #gollum-editor .collapsed a.button:hover, + #gollum-editor .expanded a.button:hover { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + text-decoration: none; + background-color: #3072b3; + background-image: -webkit-linear-gradient(#599bdc, #3072b3); + background-image: linear-gradient(#599bdc, #3072b3); + background-repeat: repeat-x; + } + #gollum-editor .collapsed a.button span, + #gollum-editor .expanded a.button span { + margin: 4px; + } + #gollum-editor .collapsed h4, + #gollum-editor .expanded h4 { + font-size: 16px; + float: left; + margin: 0; + padding: 6px 0 0 4px; + text-shadow: 0 -1px 0 #fff; + } + #gollum-editor .collapsed a.button span.octicon-triangle-right { + display: inline-block; + } + #gollum-editor .collapsed textarea, + #gollum-editor .collapsed a.button span.octicon-triangle-down { + display: none; + } + #gollum-editor .expanded a.button span.octicon-triangle-down { + display: inline-block; + } + #gollum-editor .expanded a.button span.octicon-triangle-right { + display: none; + } + #gollum-editor .expanded textarea { + border: 1px solid #ddd; + clear: both; + display: block; + font-size: 12px; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + height: 84px; + margin: 8px 0; + padding: 6px; + width: 883px; + resize: vertical; + } + #gollum-editor a.gollum-minibutton, + #gollum-editor a.gollum-minibutton:visited { + border: 1px solid #d4d4d4; + color: #333; + cursor: pointer; + display: block; + font-size: 12px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: bold; + margin: 0 0 0 9px; + padding: 5px 12px; + text-shadow: 0 1px 0 #fff; + background-color: #eaeaea; + background-image: -webkit-linear-gradient(#fafafa, #eaeaea); + background-image: linear-gradient(#fafafa, #eaeaea); + background-repeat: repeat-x; + border-radius: 3px; + } + #gollum-editor a.gollum-minibutton:hover, + #gollum-editor a.gollum-minibutton:visited:hover { + border-color: #518cc6 #518cc6 #2a65a0; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + text-decoration: none; + background-color: #3072b3; + background-image: -webkit-linear-gradient(#599bdc, #3072b3); + background-image: linear-gradient(#599bdc, #3072b3); + background-repeat: repeat-x; + } + .singleline { + display: block; + margin: 20px 0; + } + .singleline label { + display: block; + margin-bottom: 6px; + } + #gollum-editor-title-field { + border-bottom: 0; + margin: 0 0 10px; + } + .gollum-editor-page-title { + font-weight: bold; + margin-top: 0; + } + .gollum-editor-page-title.ph { + color: #000; + } + #gollum-editor-function-bar { + height: 26px; + padding-bottom: 10px; + border-bottom: 1px solid #ddd; + margin: 10px 0; + border: 0; + } + #gollum-editor-function-bar #gollum-editor-function-buttons { + display: none; + float: left; + } + #gollum-editor-function-bar.active #gollum-editor-function-buttons { + display: block; + } + #gollum-editor-function-bar #gollum-editor-format-selector { + padding-top: 5px; + float: left; + margin-left: 20px; + } + #gollum-editor-function-bar #gollum-editor-format-selector select { + margin: 0; + } + #gollum-editor-function-bar #gollum-editor-format-selector label { + color: #767676; + font-size: 11px; + font-weight: bold; + line-height: 17px; + padding: 0 5px 0 0; + } + #gollum-editor-function-buttons .btn-sm { + width: 30px; + padding-left: 0; + padding-right: 0; + text-align: center; + } + #gollum-editor-function-buttons .btn-sm .octicon { + margin-right: 0; + } + #gollum-error-message { + display: none; + padding-top: 12px; + font-size: 1.8em; + color: #f33; + } + #gollum-editor-help { + overflow: hidden; + padding: 0; + border: 1px solid #ddd; + border-radius: 3px; + } + #gollum-editor-help-parent, + #gollum-editor-help-list { + display: block; + float: left; + height: 170px; + list-style-type: none; + overflow: auto; + margin: 0; + padding: 10px 0; + width: 160px; + border-right: 1px solid #eee; + } + #gollum-editor-help-parent li, + #gollum-editor-help-list li { + font-size: 12px; + line-height: 1.6; + margin: 0; + padding: 0; + } + #gollum-editor-help-parent li a, + #gollum-editor-help-list li a { + border: 1px solid transparent; + border-width: 1px 0; + display: block; + font-weight: bold; + padding: 2px 12px; + text-shadow: 0 -1px 0 #fff; + } + #gollum-editor-help-parent li a:hover, + #gollum-editor-help-list li a:hover { + background: #fff; + border-color: #f0f0f0; + text-decoration: none; + box-shadow: none; + } + #gollum-editor-help-parent li a.selected, + #gollum-editor-help-list li a.selected { + border: 1px solid #eee; + border-bottom-color: #e7e7e7; + border-width: 1px 0; + background: #fff; + color: #000; + box-shadow: 0 1px 2px #f0f0f0; + } + #gollum-editor-help-list { + background: #fafafa; + } + #gollum-editor-help-wrapper { + background: #fff; + overflow: auto; + height: 170px; + padding: 10px; + } + #gollum-editor-help-content { + font-size: 12px; + margin: 0 10px 0 5px; + padding: 0; + line-height: 1.8; + } + #gollum-editor-help-content p { + margin: 0 0 10px; + padding: 0; + } + .ie #gollum-editor .singleline input { + padding-top: 0.25em; + padding-bottom: 0.75em; + } + #gollum-footer { + font-size: 12px; + line-height: 19px; + } + #gollum-dialog-dialog h4 { + border-bottom: 1px solid #ddd; + color: #333; + font-size: 16px; + line-height: normal; + font-weight: bold; + margin: 0 0 12px; + padding: 0 0 6px; + text-shadow: 0 -1px 0 #f7f7f7; + } + #gollum-dialog-dialog-body { + font-size: 12px; + line-height: 16px; + margin: 0; + padding: 0; + } + #gollum-dialog-dialog-body fieldset { + display: block; + border: 0; + margin: 0; + overflow: hidden; + padding: 0 12px; + } + #gollum-dialog-dialog-body fieldset .field { + margin: 0 0 18px; + padding: 0; + } + #gollum-dialog-dialog-body fieldset .field:last-child { + margin: 0 0 12px; + } + #gollum-dialog-dialog-body fieldset label { + color: #666; + display: block; + font-size: 14px; + font-weight: bold; + line-height: 1.6; + margin: 0; + padding: 0; + min-width: 80px; + } + #gollum-dialog-dialog-body fieldset input[type="text"] { + display: block; + margin: 3px 0 0; + width: 100%; + } + #gollum-dialog-dialog-body fieldset input.code { + font-family: "Monaco", "Courier New", Courier, monospace; + } + #gollum-dialog-dialog-buttons { + border-top: 1px solid #ddd; + overflow: hidden; + margin: 14px 0 0; + padding: 12px 0 0; + } + a.gollum-minibutton, + a.gollum-minibutton:visited { + border: 1px solid #d4d4d4; + color: #333; + cursor: pointer; + display: inline; + font-size: 12px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: bold; + float: right; + width: auto; + margin: 0 0 0 9px; + padding: 4px 12px; + text-shadow: 0 1px 0 #fff; + background-color: #eaeaea; + background-image: -webkit-linear-gradient(#fafafa, #eaeaea); + background-image: linear-gradient(#fafafa, #eaeaea); + background-repeat: repeat-x; + border-radius: 3px; + } + a.gollum-minibutton:hover, + a.gollum-minibutton:visited:hover { + border-color: #518cc6 #518cc6 #2a65a0; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + text-decoration: none; + background-color: #3072b3; + background-image: -webkit-linear-gradient(#599bdc, #3072b3); + background-image: linear-gradient(#599bdc, #3072b3); + background-repeat: repeat-x; + } + .wiki-wrapper .ie #gollum-editor { + padding-bottom: 1em; + } + .wiki-wrapper #wiki-content .enable-fullscreen { + right: 4px; + } + .wiki-wrapper + #wiki-content + .previewable-comment-form.write-selected + .write-content, + .wiki-wrapper + #wiki-content + .previewable-comment-form.preview-selected + .preview-content { + padding: 0; + } + .wiki-wrapper #wiki-content .comment-body { + padding: 5px 0 20px; + } + .wiki-wrapper hr { + margin: 25px 0 20px; + } + .wiki-wrapper.comment-body { + width: 920px; + } + .hooks-listing .boxed-group-action.select-menu { + z-index: auto; + } + .hook-item a:hover { + text-decoration: none; + } + .hook-item .item-status { + float: left; + margin-right: 8px; + width: 16px; + text-align: center; + } + .hook-item .description { + color: #999; + } + .hook-item .description .css-truncate-target { + max-width: 160px; + } + .hook-item .icon-for-success, + .hook-item .icon-for-failure, + .hook-item .icon-for-pending, + .hook-item .icon-for-inactive { + display: none; + } + .hook-item.success .icon-for-success { + display: inline-block; + color: #6cc644; + } + .hook-item.failure .icon-for-failure { + display: inline-block; + color: #bd2c00; + } + .hook-item.pending .icon-for-pending { + display: inline-block; + color: #999; + } + .hook-item.inactive .icon-for-inactive { + display: inline-block; + color: #999; + } + .hook-url.css-truncate-target { + max-width: 360px; + } + .hook-events-field .hook-event-selector { + display: none; + } + .hook-events-field.is-custom .hook-event-selector { + display: block; + } + .hook-event-selector { + margin-left: 10px; + } + .hook-event { + display: inline-block; + width: 310px; + margin: 0; + padding: 5px 0 5px 30px; + } + .hook-event .note { + font-size: 11px; + margin: 0; + color: #aaa; + } + .hook-event-choice { + font-weight: normal; + } + .hook-form.is-ssl .ssl-hook-fields { + display: block; + } + .hook-form .ssl-hook-fields { + display: none; + } + .hook-form .ssl-hook-fields #disable-ssl-verification-modal, + .hook-form .ssl-hook-fields .enable-ssl-verification { + display: none; + } + .hook-form + .ssl-hook-fields.is-not-verifying-ssl + .enable-ssl-verification { + display: block; + } + .hook-form + .ssl-hook-fields.is-not-verifying-ssl + .disable-ssl-verification { + display: none; + } + .hook-form .disable-ssl-verification .actions { + margin-top: -4px; + } + .hook-form .invalid-url-notice { + display: none; + padding: 7px 4px; + } + .hook-form .invalid-url-notice .octicon-alert { + position: relative; + top: 1px; + } + .hook-form.is-invalid-url .invalid-url-notice { + display: block; + } + .hooks-oap-warning { + margin-top: 0; + } + .hooks-oap-warning ul { + margin: 10px 0; + } + .hooks-oap-warning ul li { + margin-left: 16px; + } + .hook-secret .hook-secret-standin { + display: block; + } + .hook-secret .hook-secret-field { + display: none; + } + .hook-secret.open .hook-secret-standin { + display: none; + } + .hook-secret.open .hook-secret-field { + display: block; + } + .hook-deliveries-list .loading-message { + display: block; + } + .hook-deliveries-list .error-message { + display: none; + } + .hook-deliveries-list.is-error .loading-message { + display: none; + } + .hook-deliveries-list.is-error .error-message { + display: block; + } + .hook-deliveries-list .spinner { + display: inline-block; + vertical-align: top; + margin: 0; + } + .hook-deliveries-list .hook-delivery-item:hover { + background-color: transparent; + } + .hook-deliveries-list .item-status { + display: inline-block; + margin-right: 5px; + width: 16px; + text-align: center; + } + .hook-deliveries-list .item-status .icon-for-success, + .hook-deliveries-list .item-status .icon-for-failure, + .hook-deliveries-list .item-status .icon-for-pending { + display: none; + } + .hook-deliveries-list .item-status.success { + visibility: visible; + color: #6cc644; + } + .hook-deliveries-list .item-status.success .icon-for-success { + display: inline-block; + } + .hook-deliveries-list .item-status.failure { + color: #bd2c00; + } + .hook-deliveries-list .item-status.failure .icon-for-failure { + display: inline-block; + } + .hook-deliveries-list .item-status.pending { + color: #999; + } + .hook-deliveries-list .item-status.pending .icon-for-pending { + display: inline-block; + } + .hook-deliveries-pagination-loading-message { + display: none; + } + .hook-deliveries-pagination-loading-message .animated-ellipsis-container { + text-align: left; + } + .hook-deliveries-pagination.loading .hook-deliveries-pagination-button { + display: none; + } + .hook-deliveries-pagination.loading + .hook-deliveries-pagination-loading-message { + display: block; + } + .boxed-group-list li.hook-delivery-item { + padding: 10px; + } + .hook-delivery-item .hook-delivery-details { + display: none; + } + .hook-delivery-item .hook-delivery-details .loading-message, + .hook-delivery-item .hook-delivery-details .error-message { + display: none; + } + .hook-delivery-item .hook-delivery-details.is-loading .loading-message { + display: block; + } + .hook-delivery-item .hook-delivery-details.has-error .error-message { + display: block; + } + .hook-delivery-item.open .hook-delivery-details { + display: block; + } + .hook-delivery-item .loading-message { + text-align: center; + } + .hook-delivery-time { + float: right; + margin-right: 10px; + color: #999; + font-size: 10px; + } + .hook-delivery-summary { + text-decoration: none; + } + .hook-delivery-guid { + display: inline-block; + padding: 2px 6px; + color: rgba(0, 0, 0, 0.5); + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; + background-color: rgba(209, 227, 237, 0.5); + border-radius: 3px; + } + .hook-delivery-guid .octicon { + margin: 1px -2px 0 0; + color: #b0c4ce; + } + .hook-delivery-actions { + padding-top: 1px; + } + .boxed-group-list > li.hook-delivery-item .btn-sm { + margin: 0; + } + .boxed-group-list + > li.hook-delivery-item + .hook-delivery-details + .redeliver.btn-sm { + margin: 5px 0 0; + } + .hook-deliveries-list .error-message, + .hook-delivery-details .error-message { + margin: 10px 0; + padding: 7px 4px; + } + .hook-deliveries-list .error-message .octicon, + .hook-delivery-details .error-message .octicon { + position: relative; + top: 1px; + } + .boxed-group span.animated-ellipsis-container, + .boxed-group span.animated-ellipsis { + padding: 0; + } + .boxed-group .animated-ellipsis-container { + line-height: 1.3; + } + .hook-delivery-details { + clear: right; + } + .hook-delivery-details .error-message { + margin-bottom: 0; + } + .hook-delivery-details .tabnav-tabcontent { + display: none; + } + .hook-delivery-details .tabnav-tabcontent.selected { + display: block; + } + .hook-delivery-details hr { + margin: 10px 0; + } + .hook-delivery-details pre { + padding: 7px 12px; + margin: 10px 0; + background-color: #f8f8f8; + border: 1px solid #ddd; + border-radius: 3px; + font-size: 13px; + line-height: 1.5; + overflow: auto; + } + .hook-delivery-details .tabnav { + margin: 10px 0; + } + .hook-delivery-details h4.remote-call-header { + border-bottom: 1px solid #999; + margin: 20px 0 10px; + } + .hook-delivery-response-status { + display: inline-block; + padding: 4px 6px 3px; + color: #fff; + background-color: #bd2c00; + border-radius: 3px; + font-size: 10px; + line-height: 1.1; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + } + .hook-delivery-response-status[data-response-status^="2"] { + background-color: #6cc644; + } + .redelivery-dialog .pending-message { + display: block; + } + .redelivery-dialog .failure-message { + display: none; + } + .redelivery-dialog.failed { + color: #9c2400; + background-color: #efd0d0; + background-image: -webkit-linear-gradient(#f8d8d8, #efd0d0); + background-image: linear-gradient(#f8d8d8, #efd0d0); + background-repeat: repeat-x; + border-color: #da9797; + } + .redelivery-dialog.failed .pending-message { + display: none; + } + .redelivery-dialog.failed .failure-message { + display: block; + } + .redelivering-hook-delivery .error-message { + display: none; + } + .redelivering-hook-delivery.is-error .loading-message { + display: none; + } + .redelivering-hook-delivery.is-error .error-message { + display: block; + } + .test-hook-message .success-message, + .test-hook-message .error-message { + display: none; + margin-top: 10px; + } + .test-hook-message.success .success-message { + display: block; + } + .test-hook-message.error .error-message { + display: block; + } + .issues-reset-query-wrapper { + margin-bottom: 20px; + } + .issues-reset-query { + font-weight: bold; + color: #767676; + } + .issues-reset-query .octicon-x { + width: 20px; + height: 20px; + margin-right: 3px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #767676; + border-radius: 3px; + } + .issues-reset-query:hover { + color: #4078c0; + text-decoration: none; + } + .issues-reset-query:hover .octicon-x { + background-color: #4078c0; + } + .table-list-milestones .table-list-cell { + padding: 15px 20px; + } + .table-list-milestones .stat { + display: inline-block; + font-size: 14px; + font-weight: bold; + line-height: 1.2; + color: #555; + white-space: nowrap; + } + .table-list-milestones .stat + .stat { + margin-left: 15px; + } + .table-list-milestones .stat-label { + font-weight: normal; + color: #767676; + } + .milestone-title { + width: 500px; + } + .milestone-title-link { + margin-top: 0; + margin-bottom: 5px; + font-size: 24px; + font-weight: normal; + line-height: 1.2; + } + .milestone-title-link a { + color: #333; + } + .milestone-title-link a:hover { + color: #4078c0; + } + .milestone-progress { + width: 420px; + } + .milestone-progress .progress-bar { + margin-top: 7px; + margin-bottom: 12px; + } + .milestone-meta { + font-size: 14px; + } + .milestone-meta-item { + display: inline-block; + margin-right: 10px; + } + .milestone-meta-item .octicon { + width: 16px; + text-align: center; + } + .milestone-description-html { + display: none; + } + .milestone-description { + margin-top: 5px; + } + .milestone-description .expand-more { + color: #4078c0; + cursor: pointer; + } + .milestone-description .expand-more:hover { + text-decoration: underline; + } + .milestone-description.open .milestone-description-plaintext { + display: none; + } + .milestone-description.open .milestone-description-html { + display: block; + } + .milestone-actions { + margin-top: 8px; + font-size: 13px; + } + .milestone-action { + display: inline-block; + margin-right: 10px; + } + .milestone-calender-container { + margin-left: 30px; + } + .task-progress { + color: #767676; + text-decoration: none; + } + .task-progress .octicon { + margin-right: 5px; + color: #ccc; + vertical-align: middle; + } + .task-progress .progress-bar { + display: inline-block; + width: 120px; + height: 5px; + vertical-align: 2px; + background-color: #eee; + } + .task-progress .progress-bar .progress { + background-color: #ccc; + } + .task-progress-counts { + display: inline-block; + margin-right: 6px; + margin-left: -2px; + font-size: 12px; + } + a.task-progress:hover { + color: #4078c0; + } + a.task-progress:hover .octicon { + color: inherit; + } + a.task-progress:hover .progress-bar .progress { + background-color: #4078c0; + } + .issues-listing { + position: relative; + } + .issues-listing .octocat-search { + position: absolute; + right: 0; + height: 250px; + margin: -132px -4px; + -webkit-transform: scaleX(-1); + -ms-transform: scaleX(-1); + transform: scaleX(-1); + } + .issues-listing .table-list-issues .selectable:hover, + .issues-listing .table-list-issues .navigation-focus { + background-color: #f9f9f9; + } + .issues-listing .table-list-issues .issue-title { + width: 740px; + padding-top: 12px; + } + .issues-listing .table-list-issues .labels { + display: inline-block; + margin-bottom: 2px; + vertical-align: 1px; + } + .issues-listing .table-list-issues .table-list-cell-avatar { + padding-top: 13px; + } + .issues-listing .table-list-issues .table-list-cell-avatar a { + display: inline-block; + } + .issues-listing .table-list-issues .table-list-cell-avatar img { + border-radius: 2px; + } + .issue-title-link { + padding-right: 3px; + margin-bottom: 2px; + font-size: 15px; + font-weight: bold; + line-height: 1.2; + color: #333; + } + .issue-title-link:hover { + color: #4078c0; + text-decoration: none; + } + .issue-title-link:hover .num { + color: inherit; + } + .issue-nwo-link { + color: #767676; + } + .issue-pr-status { + display: inline-block; + margin-right: 3px; + vertical-align: -1px; + } + .issue-meta { + margin-top: 1px; + margin-bottom: 2px; + font-weight: normal; + color: #767676; + } + .issue-meta-section { + margin-right: 10px; + } + .issue-milestone { + max-width: 240px; + } + .issue-comments { + width: 60px; + padding-top: 13px; + font-weight: bold; + text-align: right; + white-space: nowrap; + } + .issue-comments .octicon { + margin-right: 1px; + } + .issue-comments-no-comment { + color: #eee; + } + .milestone-link { + color: #767676; + } + .milestone-link .octicon { + font-size: 14px; + color: #ccc; + } + .milestone-link:hover { + color: #4078c0; + text-decoration: none; + } + .milestone-link:hover .octicon { + color: inherit; + } + .issue-review-status { + float: right; + margin-top: 1px; + } + .new-issue-form { + padding-top: 20px; + margin-top: 20px; + border-top: 1px solid #ddd; + } + .new-issue-form .discussion-timeline:before { + display: none; + } + .new-pr-form { + margin-bottom: 20px; + } + .new-pr-form:before { + display: table; + content: ""; + } + .new-pr-form:after { + display: table; + clear: both; + content: ""; + } + .new-pr-form .discussion-timeline:before { + display: none; + } + .new-pr-form .discussion-sidebar { + position: static; + } + .new-pr-form .form-actions { + padding-left: 0; + padding-right: 0; + text-align: left; + } + .new-pr-form .form-actions .btn { + float: none; + margin-left: 0; + } + .label-select-menu .color { + display: inline-block; + width: 14px; + height: 14px; + margin-right: 2px; + margin-bottom: 2px; + vertical-align: middle; + border-radius: 3px; + } + .label-select-menu .selected .select-menu-item-icon { + color: inherit !important; + } + .label-select-menu .selected:active { + background-color: transparent !important; + } + .label-select-menu .select-menu-item.navigation-focus { + color: inherit; + background-color: #f4f4f4; + } + .label-select-menu + .select-menu-item.navigation-focus + .select-menu-item-icon { + color: transparent; + } + .label-select-menu .select-menu-item .octicon-x { + display: none; + float: right; + margin: 1px 10px 0 0; + opacity: 0.6; + } + .label-select-menu .select-menu-item.selected .octicon-x { + display: block; + color: inherit; + } + .label-select-menu > form { + position: relative; + } + .closed-banner { + height: 7px; + margin: 15px 0 15px 60px; + overflow: hidden; + background: url(/images/modules/comments/closed_pattern.gif); + border-radius: 3px; + } + .subnav .btn + .issues-search { + padding-right: 10px; + border-right: 1px solid #eee; + } + .merge-branch-heading { + margin: 0; + } + .merge-branch-description { + margin-top: 0; + margin-right: 160px; + margin-bottom: 0; + color: #767676; + line-height: 1.6em; + } + .merge-branch-description .zeroclipboard-link .octicon { + top: 2px; + } + .merge-branch-action, + .desktop-app-action { + float: right; + margin-left: 5px; + } + .desktop-app-action { + padding-left: 10px; + padding-right: 10px; + } + .merged .merge-branch-description .commit-ref .css-truncate-target { + max-width: 180px; + } + .merge-branch-prh-output { + margin-top: 10px; + } + .merge-branch-form { + padding-left: 64px; + display: none; + } + .merge-branch.open .merge-branch-form { + display: block; + } + .merge-branch.open .merge-message { + display: none; + } + .merge-branch-manually { + display: none; + margin-top: 14px; + padding-top: 15px; + border-top: 1px solid #ddd; + } + .merge-branch-manually h3, + .merge-branch-manually p { + margin: 0; + } + .merge-branch-manually .intro { + margin-top: 0; + padding-bottom: 10px; + } + .merge-branch-manually .step { + margin: 15px 0 5px; + } + .merge-branch-manually .url-box { + margin-left: 0; + padding: 0; + border: 0; + } + .merge-branch-manually .clone-urls { + width: 100%; + } + .open > .merge-branch-manually { + display: block; + max-width: 585px; + } + .branch-action-next .cancel-request-form { + display: inline; + } + .branch-action-next .merge-branch-action { + float: none; + margin-right: 4px; + margin-left: 0; + } + .branch-action-next .alt-merge-options { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .branch-action-next .merge-branch-manually { + padding-top: 15px; + background-color: #fafafa; + border-top-color: 1px solid #eee; + } + .branch-action-next .open > .merge-branch-manually { + display: block; + max-width: none; + } + .branch-action-next .branch-status:last-child .merge-branch-manually { + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + } + .branch-action-next h3 { + margin-top: 0; + margin-bottom: 10px; + } + .branch-action-next .copyable-terminal { + background-color: #f2f2f2; + } + #network .network-tree { + vertical-align: middle; + } + #network .gravatar { + margin-right: 4px; + border-radius: 3px; + vertical-align: middle; + } + #network .octicon { + margin-left: 2px; + vertical-align: middle; + width: 16px; + display: inline-block; + text-align: center; + } + #network .current-repository { + background-color: #fff6a9; + } + #network .network-graph-container { + position: relative; + margin-bottom: 20px; + border: 1px solid #ddd; + border-radius: 3px; + overflow: hidden; + line-height: 0; + } + #network .network-graph-container .large-loading-area { + position: absolute; + top: 0; + right: 0; + left: 0; + } + .page-new-repo .octicon-repo { + color: #bbb; + } + .page-new-repo .octicon-lock { + color: #e9dba5; + } + .page-new-repo ul.repo-templates { + margin: 10px 0; + } + .page-new-repo ul.repo-templates > li { + list-style-type: none; + display: inline-block; + margin: 0 10px 0 0; + } + .page-new-repo ul.repo-templates .select-menu { + float: left; + } + .page-new-repo .team-select { + display: none; + } + .page-new-repo .form-checkbox .mega-octicon { + font-size: 24px; + float: left; + margin-right: 5px; + } + .page-new-repo .license-info { + float: left; + margin-top: 5px; + margin-left: 10px; + color: #ccc; + } + .new-repo-container { + width: 700px; + margin: 0 auto; + padding-top: 20px; + } + .new-repo-container h2 { + font-size: 22px; + font-weight: normal; + color: #666; + border-bottom: 1px solid #ddd; + padding-bottom: 5px; + margin-bottom: 0.5em; + } + .owner-reponame { + position: relative; + } + .owner-reponame dl.form { + margin-top: 5px; + margin-bottom: 0; + } + .owner-reponame .slash { + float: left; + font-size: 21px; + color: #666; + padding-top: 32px; + margin: 0 8px; + } + .owner-reponame .icon-preview { + display: none; + font-size: 32px; + position: absolute; + text-align: right; + width: 100px; + top: 23px; + left: -115px; + } + .owner-reponame .icon-preview.icon-preview-public { + top: 25px; + } + .reponame-suggestion { + color: #34631a; + cursor: pointer; + } + .upgrade-upsell { + padding-left: 33px; + } + .cc-upgrade { + padding-left: 20px; + } + .featured-license { + font-weight: bold; + } + .license-container { + border-left: 1px solid #ccc; + padding-left: 15px; + } + .notification-routing .notification-email .edit-link { + margin-right: 10px; + font-weight: bold; + } + .notification-routing .notification-email .btn-sm { + float: none; + margin: -2px 0 0; + } + .notification-routing .notification-email .edit-form { + display: none; + } + .notification-routing .notification-email.open .edit-form { + display: block; + } + .notification-routing .notification-email.open .email-display { + display: none; + } + .notifications .list-group-item { + padding-top: 8px; + padding-bottom: 8px; + padding-left: 35px; + border-width: 1px 0 0; + } + .notifications .list-group-item:first-child { + border: 0; + } + .notifications .list-group-item-name { + display: block; + max-width: 400px; + font-size: 14px; + line-height: 1.5em; + } + .notifications .list-group-item-name a { + display: block; + max-width: 460px; + } + .notifications .notifications-more { + padding: 0; + } + .notifications .notifications-more > a { + display: block; + padding: 10px 15px; + font-weight: bold; + color: #4078c0; + text-align: center; + } + .notifications .notifications-more > a:hover { + text-decoration: underline; + } + .notifications .read .type-icon { + color: #767676; + } + .notifications .read .list-group-item-name > a { + color: #767676; + } + .notifications .read .notification-actions { + color: #767676; + } + .notifications .read .avatar-stack { + opacity: 0.5; + } + .notifications .read .undo { + display: block; + } + .notifications .read .delete { + visibility: hidden; + } + .notifications .read.navigation-focus { + background-color: #f5f9fc; + } + .notifications .muted .unmute { + display: block; + } + .notifications .muted .mute { + display: none; + } + .notifications .unmute { + display: none; + } + .type-icon-state-none { + color: #767676; + } + .type-icon-state-open { + color: #6cc644; + } + .type-icon-state-closed { + color: #bd2c00; + } + .type-icon-state-merged { + color: #6e5494; + } + .notifications-list { + float: left; + width: 100%; + } + .notifications-list .notifications-repo-link { + max-width: 500px; + } + .notifications-list .boxed-group .text-success { + position: absolute; + color: #6cc644; + right: 3px; + width: 210px; + margin-top: 4px; + text-align: right; + opacity: 0; + visibility: hidden; + -webkit-transition: + opacity 0.35s ease-in-out, + -webkit-transform 0.35s ease-in-out; + transition: + opacity 0.35s ease-in-out, + transform 0.35s ease-in-out; + -webkit-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); + } + .notifications-list .mark-all-as-read { + margin-right: 0; + margin-top: 0; + padding: 2px 6px 5px 10px; + line-height: 20px; + color: #767676; + } + .notifications-list .mark-all-as-read-confirmed .text-success { + visibility: visible; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } + .notifications-list .mark-all-as-read-confirmed .mark-all-as-read { + visibility: hidden; + } + .notifications-list .confirmation { + color: #666; + text-align: center; + padding: 0; + -webkit-transition: all 0.4s ease-in-out; + transition: all 0.4s ease-in-out; + max-height: 0; + opacity: 0; + overflow: hidden; + } + .notifications-list .confirmation + .list-group-item { + margin-top: -1px; + border-top-color: #d5d5d5; + } + .notifications-list .confirmation.mark-all-as-read-confirmed { + padding: 10px 0; + max-height: 300px; + opacity: 1; + } + .notification-actions { + position: absolute; + right: 10px; + top: 8px; + list-style: none; + } + .notification-actions li { + float: right; + margin-left: 10px; + font-size: 16px; + line-height: 20px; + } + .notification-actions .age { + width: 120px; + font-size: 12px; + color: #767676; + } + .notification-actions .undo { + display: none; + position: absolute; + top: 0; + } + .notification-actions .btn-link { + padding-left: 5px; + padding-right: 5px; + color: #767676; + line-height: inherit; + } + .notification-actions .btn-link:hover { + color: #4078c0; + text-decoration: none; + } + .repo-subscription-container { + margin: 0 auto; + width: 600px; + } + .repo-subscription-container .spinner { + float: right; + } + .repo-subscription-container h2 { + font-size: 22px; + margin-bottom: -10px; + font-weight: normal; + } + .repo-subscription-container .intro { + font-size: 14px; + color: #666; + } + .repo-subscription-label { + display: inline-block; + } + .subscriptions-content .repo-icon { + vertical-align: middle; + color: #666; + margin-right: 5px; + } + .subscriptions-content .repo-list form { + display: inline; + } + .subscriptions-content .repo-list .only-loading { + display: none; + } + .subscriptions-content .repo-list .loading .only-loading { + display: inline-block; + } + .subscriptions-content .repo-list .only-unsubed { + display: none; + } + .subscriptions-content .repo-list .unsubscribed .only-unsubed { + display: inline; + } + .subscriptions-content .repo-list .unsubscribed .only-subed { + display: none; + } + .subscriptions-content .repo-list .only-unignored { + display: none; + } + .subscriptions-content .repo-list .unsubscribed .only-unignored { + display: inline; + } + .subscriptions-content .repo-list .unsubscribed .only-ignored { + display: none; + } + .thread-subscription-status { + margin: 40px 0 20px; + padding: 10px; + color: #767676; + background-color: #fff; + border: 1px solid #eee; + border-radius: 3px; + } + .thread-subscription-status .mega-octicon { + vertical-align: middle; + margin-right: 10px; + margin-left: 4px; + color: #ccc; + } + .thread-subscription-status .btn-sm > .octicon { + margin-right: 1px; + } + .thread-subscription-status .reason { + display: inline-block; + margin: 0 10px; + vertical-align: middle; + } + .thread-subscription-status .thread-subscribe-form { + display: inline-block; + vertical-align: middle; + } + .subscription .loading { + opacity: 0.5; + } + .oauth-connection-illustration { + position: relative; + float: right; + width: 200px; + margin-top: 10px; + margin-right: 10px; + margin-left: 40px; + } + .oauth-connection-illustration .oauth-image { + float: left; + padding: 5px; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 6px; + } + .oauth-connection-illustration .oauth-image img { + display: block; + width: 75px; + height: 75px; + border-radius: 3px; + } + .oauth-connection-illustration .oauth-image.oauth-image-user { + margin-top: 20px; + margin-left: -20px; + } + .setup-wrapper .oauth-permissions { + margin-bottom: 25px; + border: 1px solid #ddd; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + } + .setup-wrapper .oauth-permissions-details { + background-color: #fff; + } + .setup-wrapper.oauth-restriction-wrapper { + padding-top: 0; + } + .ellipsis-button { + display: inline-block; + height: 12px; + padding: 0 5px; + margin-left: 2px; + font-size: 12px; + font-weight: bold; + line-height: 6px; + color: #555; + text-decoration: none; + vertical-align: middle; + background-color: #ddd; + border-radius: 1px; + } + .ellipsis-button:hover { + text-decoration: none; + background-color: #ccc; + } + .ellipsis-button:before { + content: "\2026"; + } + .oauth-permissions-details { + position: relative; + padding: 15px; + margin: 0; + list-style: none; + border-bottom: 1px solid #f2f2f2; + } + .oauth-permissions-details:first-child { + border-radius: 3px 3px 0 0; + } + .oauth-permissions-details:last-child { + border: 0; + border-radius: 0 0 3px 3px; + } + .oauth-permissions-details.oauth-public-data-only { + border-radius: 3px; + } + .oauth-permissions-details .markdown-body { + font-size: 13px; + } + .oauth-permissions-details .content { + display: none; + margin-left: 45px; + } + .oauth-permissions-details .content .form-checkbox { + margin-left: 0; + } + .oauth-permissions-details .content .form-checkbox:last-child { + margin-bottom: 0; + } + .oauth-permissions-details .mega-octicon { + float: left; + width: 32px; + margin-top: 1px; + margin-left: 0; + color: #767676; + text-align: center; + } + .oauth-permissions-details .permission-help { + font-size: 13px; + } + .oauth-permissions-details .permission-help ul { + padding-left: 20px; + margin: 1em 0; + } + .oauth-permissions-details .permission-summary { + margin-left: 45px; + } + .oauth-permissions-details .permission-summary .access-details { + position: relative; + color: #767676; + } + .oauth-permissions-details .permission-summary em.highlight { + position: relative; + padding: 2px 3px; + margin-right: -2px; + margin-left: -3px; + font-style: normal; + color: #4c4a42; + background: #fff9ea; + border-radius: 3px; + } + .oauth-permissions-details .permission-title { + display: block; + color: #000; + } + .oauth-permissions-details a.btn-sm { + float: right; + margin-top: 4px; + } + .oauth-permissions-details.open a.btn-sm { + background-color: #dcdcdc; + background-image: none; + border-color: #b5b5b5; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); + } + .oauth-permissions-details.open .content { + display: block; + } + .oauth-permissions-details.default:not(.delete) .no-access, + .oauth-permissions-details.default:not(.delete) .default-access, + .oauth-permissions-details.none .no-access, + .oauth-permissions-details.none .default-access { + display: inline; + } + .oauth-permissions-details.default:not(.delete) .access-details, + .oauth-permissions-details.default:not(.delete) .permission-title, + .oauth-permissions-details.none .access-details, + .oauth-permissions-details.none .permission-title { + color: #999; + } + .oauth-permissions-details.default:not(.delete) .mega-octicon, + .oauth-permissions-details.none .mega-octicon { + color: #ccc; + } + .oauth-permissions-details.default .default-access { + display: inline; + } + .oauth-permissions-details.full .full-access { + display: inline; + } + .oauth-details-toggle { + position: absolute; + top: 0; + right: 0; + padding: 20px 10px; + } + .oauth-details-toggle .mega-octicon { + font-size: 22px; + } + .oauth-details-toggle .octicon-chevron-up { + display: none; + } + .open .oauth-details-toggle .octicon-chevron-down { + display: none; + } + .open .oauth-details-toggle .octicon-chevron-up { + display: block; + } + .oauth-user-permissions .full-access, + .oauth-user-permissions .limited-access, + .oauth-user-permissions .limited-access-none, + .oauth-user-permissions .limited-access-followers, + .oauth-user-permissions .limited-access-emails, + .oauth-user-permissions .no-access { + display: none; + } + .oauth-user-permissions.limited .limited-access-none { + display: inline; + } + .oauth-user-permissions.limited.limited-email .limited-access, + .oauth-user-permissions.limited.limited-email .limited-access-none { + display: none; + } + .oauth-user-permissions.limited.limited-email .limited-access-emails { + display: inline; + } + .oauth-user-permissions.limited.limited-email.limited-follow + .limited-access { + display: inline; + } + .oauth-user-permissions.limited.limited-email.limited-follow + .limited-access-none, + .oauth-user-permissions.limited.limited-email.limited-follow + .limited-access-emails, + .oauth-user-permissions.limited.limited-email.limited-follow + .limited-access-followers { + display: none; + } + .oauth-user-permissions.limited.limited-follow .limited-access, + .oauth-user-permissions.limited.limited-follow .limited-access-none { + display: none; + } + .oauth-user-permissions.limited.limited-follow .limited-access-followers { + display: inline; + } + .oauth-repo-permissions .default-access, + .oauth-repo-permissions .public-access, + .oauth-repo-permissions .full-access { + display: none; + } + .oauth-repo-permissions.public .public-access { + display: inline; + } + .oauth-delete-repo-permissions .octicon-alert { + color: #bd2c00; + } + .oauth-repo-status-permissions .no-access, + .oauth-repo-status-permissions .full-access, + .oauth-repo-deployment-permissions .no-access, + .oauth-repo-deployment-permissions .full-access { + display: none; + } + .oauth-notifications-permissions .no-access, + .oauth-notifications-permissions .read-access, + .oauth-notifications-permissions .via-public-access, + .oauth-notifications-permissions .via-full-access { + display: none; + } + .oauth-notifications-permissions.read .read-access { + display: inline; + } + .oauth-notifications-permissions.via-public .via-public-access { + display: inline; + } + .oauth-notifications-permissions.via-public .octicon { + display: none; + } + .oauth-notifications-permissions.via-full .via-full-access { + display: inline; + } + .oauth-gist-permissions .no-access, + .oauth-gist-permissions .full-access { + display: none; + } + .oauth-granular-permissions .no-access, + .oauth-granular-permissions .read-access, + .oauth-granular-permissions .write-access, + .oauth-granular-permissions .full-access { + display: none; + } + .oauth-granular-permissions.none .no-access { + display: inline; + } + .oauth-granular-permissions.read .read-access { + display: inline; + } + .oauth-granular-permissions.write .write-access { + display: inline; + } + .oauth-granular-permissions.full .full-access { + display: inline; + } + .oauth-secondary .setup-info-module { + margin-top: 0; + } + .oauth-secondary .setup-info-module .no-description { + color: #767676; + } + .oauth-secondary .setup-info-module .features-list { + padding-bottom: 0; + } + .oauth-no-description { + color: #767676; + } + .oauth-org-access-details a:hover { + text-decoration: none; + } + .oauth-org-access-details .boxed-group-list > li { + line-height: 24px; + } + .oauth-org-access-details .boxed-group-list > li .loading-indicator { + display: none; + margin: 4px; + } + .oauth-org-access-details .boxed-group-list > li.on { + background: #fff; + } + .oauth-org-access-details .boxed-group-list > li.on:hover { + background: #ffe; + } + .oauth-org-access-details .boxed-group-list > li.on .authorized-tools { + display: block; + } + .oauth-org-access-details .boxed-group-list > li.on .unauthorized-tools { + display: none; + } + .oauth-org-access-details .boxed-group-list > li.on strong { + color: #333; + } + .oauth-org-access-details .boxed-group-list > li.on .octicon-check { + display: inline; + } + .oauth-org-access-details .boxed-group-list > li.on .octicon-x { + display: none; + } + .oauth-org-access-details + .boxed-group-list + > li.loading + .unauthorized-tools, + .oauth-org-access-details + .boxed-group-list + > li.loading + .authorized-tools { + display: none; + } + .oauth-org-access-details + .boxed-group-list + > li.loading + .loading-indicator { + display: block; + } + .oauth-org-access-details .boxed-group-list > li .authorized-tools { + display: none; + } + .oauth-org-access-details .boxed-group-list > li .unauthorized-tools { + display: block; + } + .oauth-org-access-details .boxed-group-list > li .btn { + padding: 0 10px; + margin-left: 15px; + line-height: 24px; + } + .oauth-org-access-details .octicon { + color: #979797; + } + .oauth-org-access-details .octicon-check { + display: none; + color: #6cc644; + } + .oauth-org-access-details .octicon-x { + display: inline; + } + .oauth-org-access-details .octicon-x.org-access-denied { + color: #bd2c00; + } + .deleted-permission { + color: #bd2c00; + } + .added-permission { + color: #6cc644; + } + .permission-title { + margin-top: 0; + } + .oauth-application-whitelist .request-info { + display: block; + margin-left: 25px; + color: #9b9b9b; + } + .oauth-application-whitelist .request-info strong { + color: #333; + } + .oauth-application-whitelist .request-info .application-description { + display: none; + } + .oauth-application-whitelist .request-info.open .application-description { + display: block; + } + .oauth-application-whitelist .avatar { + margin-top: 0; + } + .oauth-application-whitelist .requestor { + font-weight: bold; + } + .oauth-application-whitelist .octicon-alert { + color: #c9510c; + } + .oauth-application-whitelist .octicon-check, + .oauth-application-whitelist .approved-request { + color: #6cc644; + } + .oauth-application-whitelist .denied-request { + color: #bd2c00; + } + .oauth-application-whitelist .request-indicator { + margin-left: 10px; + } + .oauth-application-whitelist .edit-link { + color: #999; + } + .oauth-application-whitelist .edit-link:hover { + color: #4078c0; + } + .oauth-application-whitelist .boxed-group-list { + margin-top: 1em; + } + .oauth-application-whitelist .boxed-group-list li { + padding: 10px; + } + .oauth-application-info { + min-height: 70px; + padding-top: 10px; + margin-bottom: 30px; + } + .boxed-group-inner .oauth-application-info { + margin-bottom: 10px; + } + .oauth-application-info .application-title, + .oauth-application-info .application-description, + .oauth-application-info .application-meta-info { + margin-left: 70px; + } + .oauth-application-info .application-title { + font-size: 14px; + font-weight: bold; + color: #333; + } + .oauth-application-info .application-description { + margin-top: 3px; + margin-bottom: 0; + } + .oauth-application-info .app-info { + display: inline-block; + margin-right: 10px; + color: #999; + } + .oauth-application-info .app-info .octicon { + margin-right: 5px; + } + .oauth-application-info .meta-link { + color: #999; + } + .oauth-application-info .meta-link:hover { + color: #4078c0; + } + .oauth-application-info .application-meta-info { + margin-top: 3px; + font-size: 12px; + } + .oauth-application-info .app-denied, + .oauth-application-info .app-approved { + margin-left: 10px; + font-weight: normal; + white-space: nowrap; + } + .oauth-application-info .app-approved, + .oauth-application-info .octicon-check { + color: #6cc644; + } + .oauth-application-info .app-denied, + .oauth-application-info .octicon-x { + color: #c9510c; + } + .restrict-oauth-access-button { + margin-right: 20px; + } + .restrict-oauth-access-info { + margin-bottom: 40px; + font-size: 15px; + } + .restrict-oauth-access-list { + padding-left: 25px; + } + .restrict-oauth-access-list li { + margin-bottom: 10px; + } + .restrict-oauth-access-list li:last-child { + margin-bottom: 0; + } + .app-transfer-actions form { + display: inline; + } + .application-authorizations :target { + background-color: #ffe; + } + .application-authorizations .oauth-logo-cell { + width: 20px; + } + .application-authorizations .oauth-app-access-name { + font-size: 15px; + font-weight: bold; + line-height: 1.2; + color: #333; + } + .application-authorizations .oauth-app-access-name:hover { + color: #4078c0; + text-decoration: none; + } + .application-authorizations .oauth-app-list-meta { + margin-top: 1px; + margin-bottom: 2px; + font-weight: normal; + color: #999; + } + .application-authorizations .oauth-info-cell { + width: 599px; + padding-right: 0; + padding-left: 0; + } + .application-authorizations .oauth-app-owner { + color: #999; + } + .application-authorizations .oauth-app-owner:hover { + color: #4078c0; + text-decoration: none; + } + .application-authorizations .oauth-view-revoke-cell { + width: 90px; + text-align: right; + } + .developer-app-item .developer-app-avatar-cell { + width: 60px; + } + .developer-app-item .developer-app-name { + font-size: 15px; + font-weight: bold; + line-height: 1.2; + color: #333; + } + .developer-app-item .developer-app-name:hover { + color: #4078c0; + text-decoration: none; + } + .developer-app-item .developer-app-info-cell { + padding-left: 0; + } + .developer-app-item .developer-app-list-meta { + margin-top: 3px; + margin-bottom: 2px; + font-weight: normal; + color: #999; + } + .org-transfer-requests { + margin: 10px 0 20px; + } + .org-oauth-applications-header { + margin-top: 0; + } + .org-header { + margin-bottom: 20px; + color: #666; + border-bottom: 1px solid #eee; + background-color: #fcfcfc; + } + .org-header .edit-org { + position: relative; + top: -6px; + display: inline-block; + padding: 3px 5px; + font-size: 14px; + color: #aaa; + border: 1px solid #e5e5e5; + border-radius: 3px; + } + .org-header .edit-org:hover { + color: #4078c0; + background-color: #fff; + } + .org-header .edit-org .octicon { + font-size: 14px; + } + .org-header-wrapper { + display: table; + width: 680px; + padding-top: 20px; + padding-bottom: 20px; + } + .org-header-wrapper .avatar { + display: table-cell; + width: 100px; + height: 100px; + } + .org-header-info { + display: table-cell; + vertical-align: middle; + width: 560px; + } + .org-name { + margin-top: 0; + margin-bottom: 5px; + color: #333; + font-size: 36px; + font-weight: normal; + } + .org-description { + margin-top: 0; + margin-bottom: 8px; + font-size: 16px; + line-height: 1.25; + } + .org-header-meta { + font-size: 12px; + line-height: 1.5; + list-style: none; + } + .org-header-meta .meta-item { + display: inline-block; + padding-right: 18px; + overflow: hidden; + max-width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + } + .org-header-meta .meta-item .meta-link { + color: #666; + } + .org-header-meta .octicon { + position: relative; + top: 1px; + margin-right: 2px; + color: #ccc; + } + .org-header-meta.has-email.has-blog .meta-item, + .org-header-meta.has-email.has-location .meta-item, + .org-header-meta.has-blog.has-email + .org-header-meta.has-blog.has-location + .meta-item, + .org-header-meta.has-location.has-blog .meta-item, + .org-header-meta.has-location.has-email .meta-item { + max-width: 278px; + } + .org-header-meta.has-email.has-blog.has-location .meta-item { + max-width: 186px; + } + .org-link { + color: #333; + } + .org-link:hover { + color: #4078c0; + text-decoration: none; + } + .org-main { + float: left; + width: 640px; + } + .org-sidebar { + position: relative; + z-index: 1; + float: right; + width: 280px; + margin-top: -112px; + } + .org-sidebar .member-badge { + display: block; + padding-top: 0; + padding-bottom: 0; + border-top: 0; + } + .simple-box { + padding: 15px; + margin-bottom: 20px; + border: 1px solid #ddd; + background-color: #fff; + border-radius: 3px; + } + .simple-box-title { + margin: -15px -15px 0; + font-size: 18px; + padding: 15px; + border-bottom: 1px solid #eee; + } + .simple-box-footer { + margin: 10px -15px -15px; + padding: 15px; + border-top: 1px solid #eee; + background-color: #fcfcfc; + border-radius: 0 0 3px 3px; + } + .orgs-help-shelf { + margin-top: -20px; + margin-bottom: 20px; + padding-top: 20px; + padding-bottom: 20px; + border-bottom: 1px solid #eee; + background-color: #fcfcfc; + } + .orgs-help-shelf .orgs-help-title { + font-size: 30px; + font-weight: normal; + } + .orgs-help-shelf-content { + width: 800px; + margin: 50px auto; + text-align: center; + } + .orgs-help-shelf-content .orgs-help-lead, + .orgs-help-shelf-content .orgs-help-description { + font-size: 18px; + } + .orgs-help-shelf-content .orgs-help-lead { + padding-left: 45px; + padding-right: 45px; + } + .orgs-help-shelf-content .orgs-help-divider { + width: 150px; + margin: 40px auto; + display: block; + border-top: 1px solid #ddd; + content: ""; + } + .orgs-help-lead { + margin-bottom: 30px; + } + .orgs-help-items { + margin-bottom: 40px; + } + .orgs-help-item-octicon { + width: 70px; + height: 70px; + margin: 0 auto 15px; + text-align: center; + border: solid 1px #e5e5e5; + border-radius: 50px; + background-color: #fff; + } + .orgs-help-item-octicon .mega-octicon { + color: #4078c0; + font-size: 26px; + line-height: 68px; + } + .orgs-help-item-title { + margin-bottom: 10px; + font-weight: normal; + } + .orgs-help-item-content { + margin-top: 0; + color: #666; + font-size: 14px; + } + .orgs-help-dismiss { + margin-top: 5px; + margin-right: 10px; + float: right; + font-size: 12px; + color: #767676; + } + .orgs-help-dismiss:hover { + color: #4078c0; + text-decoration: none; + } + .orgs-help-dismiss .octicon { + position: relative; + top: 1px; + } + #revoke_all_repo_access, + #revoke_active_repo_access { + display: none; + } + .orgs-help-title { + margin-top: 0; + margin-bottom: 0; + } + .orgs-help-description { + font-size: 14px; + } + .orgs-help-lead, + .orgs-help-description { + margin-top: 10px; + color: #666; + } + .orgs-help-button { + margin-right: 10px; + } + .org-module-title { + margin: -15px -15px 0; + font-size: 18px; + border-bottom: 1px solid #eee; + } + .org-module-link { + display: block; + padding: 15px; + color: #333; + } + .org-module-link:hover, + .org-module-link:hover .org-stats { + text-decoration: none; + color: #4078c0; + } + .org-stats { + margin-top: 3px; + float: right; + font-size: 14px; + color: #767676; + } + .org-members-title { + margin-bottom: 0; + border-bottom: 0; + } + .member-avatar-group { + margin: -1px; + } + .member-avatar-group:before { + display: table; + content: ""; + } + .member-avatar-group:after { + display: table; + clear: both; + content: ""; + } + .member-avatar { + float: left; + margin: 1px; + } + .member-row { + display: block; + padding-bottom: 15px; + margin-bottom: 15px; + margin-top: 15px; + font-size: 14px; + color: #333; + border-bottom: 1px solid #eee; + } + .member-row:before { + display: table; + content: ""; + } + .member-row:after { + display: table; + clear: both; + content: ""; + } + .member-row:hover { + color: #4078c0; + text-decoration: none; + } + .member-row:last-child { + margin-bottom: 0; + padding-bottom: 0; + border-bottom: 0; + } + .member-row .avatar { + float: left; + margin-right: 10px; + } + .member-row .member-name { + display: block; + } + .member-fullname { + color: #767676; + } + .org-no-members { + text-align: center; + color: #767676; + margin-top: 20px; + margin-bottom: 10px; + } + .org .no-results { + padding: 10px; + color: #767676; + } + .org-teams-nav { + margin-top: 15px; + } + .org-teams-nav .autocomplete-results li { + display: block; + } + .org-teams-list { + list-style: none; + margin-bottom: -10px; + } + .org-teams-list .team { + display: block; + overflow: hidden; + padding-top: 15px; + padding-bottom: 15px; + color: #333; + border-top: 1px solid #eee; + } + .org-teams-list .team:hover { + text-decoration: none; + } + .org-teams-list .team:hover .team-name { + color: #4078c0; + } + .org-teams-list .org-teams-list-item:first-child .team { + border-top: 0; + } + .org-teams-list .team-name { + display: block; + font-size: 14px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .org-teams-list .team-meta { + margin-top: 0; + margin-bottom: 0; + color: #767676; + } + .org-toolbar.disabled { + pointer-events: none; + } + .org-toolbar .subnav-search { + width: 320px; + margin-left: 0; + } + .org-toolbar .non-admin-search .subnav-divider-right { + padding-right: 0; + border-width: 0; + } + .org-toolbar .subnav-search-context + .subnav-search { + margin-left: -1px; + } + .org-toolbar input.subnav-search-input { + width: 100%; + } + .member-list-select-all-label { + font-weight: normal; + } + .member-list-select-all-label .some-selected { + display: none; + } + .member-list-select-all-label.has-selected-members .some-selected { + display: inline; + } + .member-list-select-all-label.has-selected-members .none-selected { + display: none; + } + .pending-invitations-link { + padding-left: 15px; + padding-right: 15px; + } + .member-toolbar-actions { + margin-top: 9px; + margin-right: 9px; + } + .member-action { + margin-right: 5px; + } + .member-role-select { + display: inline; + } + .member-role-select .select-menu-modal { + left: -190px; + width: 310px; + } + .member-role-menu .select-menu-item-text { + padding-right: 8px; + } + .legacy-contributor-note { + padding: 10px; + color: #767676; + font-size: 11px; + background-color: #f8f8f8; + border-bottom: 1px solid #eee; + } + .legacy-contributor-note-content { + margin-top: 0; + margin-bottom: 0; + } + .auto-search-group { + position: relative; + } + .auto-search-group .auto-search-input { + padding-left: 30px; + } + .auto-search-group .spinner, + .auto-search-group > .octicon { + position: absolute; + left: 10px; + width: 16px; + height: 16px; + z-index: 5; + } + .auto-search-group .spinner { + top: 9px; + background-color: #fff; + } + .auto-search-group > .octicon { + top: 10px; + font-size: 14px; + color: #bbb; + text-align: center; + } + .org-list .list-item { + position: relative; + padding-top: 15px; + padding-bottom: 15px; + border-bottom: 1px solid #eee; + } + .org-list .list-item:before { + display: table; + content: ""; + } + .org-list .list-item:after { + display: table; + clear: both; + content: ""; + } + .org-list .cancel-link { + color: #767676; + } + .org-repos .blankslate, + .org-team-main .blankslate { + margin-top: 15px; + } + .org-repos-mini { + padding: 0; + margin: 0; + } + .org-repos-mini .org-repo-mini-item:first-child .org-repo-mini-cell { + border-top: 0; + } + .org-repos-mini .org-repo-icon { + vertical-align: middle; + } + .org-repos-mini .org-repo-name { + margin-top: 0; + margin-bottom: 0; + font-size: 14px; + word-wrap: break-word; + } + .org-repos-mini .org-repo-name .octicon-repo { + color: #767676; + } + .org-repos-mini .org-repo-name .octicon-lock { + color: #e9dba5; + } + .org-repos-mini .org-repo-name .repo-prefix { + font-weight: normal; + text-transform: lowercase; + } + .org-repos-mini .org-repo-name .repo-slash { + display: inline-block; + margin-left: -4px; + margin-right: -4px; + } + .org-repos-mini .org-repo-forked { + max-width: 270px; + margin-top: 0; + margin-bottom: 0; + display: inline-block; + font-weight: normal; + font-size: 12px; + } + .org-repo-mini-cell { + padding-top: 15px; + padding-bottom: 15px; + vertical-align: middle; + } + .org-repo-meta { + width: 165px; + } + .org-repo-meta .access-level { + cursor: default; + } + .org-repo-access-level { + text-align: center; + } + .org-repo-manage { + width: 270px; + } + .org-repo-higher-access { + display: none; + margin-left: 16px; + margin-top: 2px; + font-size: 11px; + } + .org-higher-access-member .manage-access { + font-size: 12px; + position: relative; + top: 2px; + } + .with-higher-access .org-repo-higher-access { + display: block; + } + .with-higher-access .table-list-cell-checkbox { + vertical-align: top; + } + .permission-level-cell .select-menu-button { + width: 100px; + } + .permission-level-cell .select-menu-button:after { + position: absolute; + top: 10px; + right: 10px; + } + .permission-level-cell .spinner, + .permission-level-cell .permission-success-icon { + position: absolute; + margin-left: 15px; + display: inline-block; + opacity: 0; + -webkit-transition: opacity 0.2s ease-in-out; + transition: opacity 0.2s ease-in-out; + } + .permission-level-cell .permission-success-icon { + margin-top: 4px; + color: #6cc644; + } + .permission-level-cell .is-updating .spinner, + .permission-level-cell .was-successful .permission-success-icon { + opacity: 1; + } + .org-repo-permission-select .select-menu-modal .description { + padding-right: 20px; + } + .org-repo-permission-select .select-menu-option-title { + margin-top: 0; + margin-bottom: 0; + } + .org-repo-permission-select .navigation-focus .select-menu-option-title { + color: #fff; + } + .add-member-wrapper { + position: relative; + width: 680px; + margin: 40px auto; + } + .add-member-wrapper .owners-team-info { + position: relative; + padding-top: 10px; + padding-left: 42px; + color: #767676; + border-top: 1px solid #e5e5e5; + } + .add-member-wrapper .owners-team-info .octicon-info { + position: absolute; + left: 8px; + color: #767676; + font-size: 18px; + } + .add-member-wrapper .available-seats { + color: #767676; + } + .add-member-wrapper .buy-more-link { + margin-right: 5px; + } + .add-member-wrapper .send-invitation-button { + float: none; + } + .invitation-role-group { + padding-top: 25px; + padding-bottom: 30px; + } + .invitation-role-group:before { + display: table; + content: ""; + } + .invitation-role-group:after { + display: table; + clear: both; + content: ""; + } + .invitation-role { + position: relative; + padding: 15px 10px; + display: block; + font-weight: normal; + text-align: center; + cursor: pointer; + } + .invitation-role:first-child { + margin-left: 0; + } + .invitation-role .invitation-role-item-border { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border: 1px solid #eee; + border-radius: 3px; + -webkit-transition: border 0.15s ease-in-out; + transition: border 0.15s ease-in-out; + } + .invitation-role input { + display: block; + margin-right: auto; + margin-left: auto; + } + .invitation-role input:checked ~ .invitation-role-item-border { + border: 1px solid #3b99fc; + box-shadow: 0 0 5px rgba(59, 153, 252, 0.4); + } + .invitation-role-title { + margin-top: 5px; + margin-bottom: 5px; + } + .invitation-role-description { + margin-top: 0; + color: #767676; + } + .add-member-title { + margin-bottom: 0; + font-size: 30px; + font-weight: normal; + } + .add-member-lead { + margin-top: 5px; + margin-bottom: 0; + padding-bottom: 15px; + border-bottom: 1px solid #eee; + } + .add-member-lead.no-border { + padding-bottom: 0; + border-bottom: 0; + } + .add-member-team-list { + margin-bottom: 15px; + list-style: none; + } + .add-member-team-list .team { + display: block; + padding: 15px 0; + font-weight: normal; + cursor: pointer; + } + .add-member-team-list .team:first-child { + border-top: 1px solid #f2f2f2; + } + .add-member-team-list .team .btn-sm { + float: right; + } + .add-member-team-list .team-info { + max-width: 80%; + color: #000; + text-decoration: none; + } + .add-member-team-list .team-info:hover { + color: #4078c0; + } + .add-member-team-list .team-name { + font-size: 14px; + } + .add-member-team-list .team-meta { + color: #767676; + margin-top: 2px; + margin-bottom: 2px; + } + .add-member-team-list .team-description { + margin-top: 2px; + margin-bottom: 2px; + color: #333; + } + .add-member-team-list .team-toggler .turn-on { + display: inline-block; + } + .add-member-team-list .team-toggler.on .turn-off { + display: inline-block; + } + .add-member-team-list .team-toggler .turn-off { + display: none; + } + .add-member-team-list .team-toggler.on .turn-on { + display: none; + } + .team-list-footer .show-all-link .octicon { + margin-left: 5px; + color: #767676; + } + .invite-team-member-list .team { + display: table-row; + cursor: default; + } + .invite-team-member-list .team:first-child .table-list-cell { + border-top: 0; + } + .invite-team-member-list .team .table-list-cell { + padding-top: 15px; + padding-bottom: 15px; + } + .invite-team-member-list .table-list-cell-checkbox { + width: 42px; + } + .invite-team-member-list .team-info { + width: 250px; + vertical-align: middle; + color: #222; + } + .invite-team-member-list .team-description { + display: block; + padding-top: 0; + padding-bottom: 0; + font-weight: normal; + } + .invite-team-member-list .team-meta { + width: 100px; + text-align: left; + vertical-align: middle; + } + .invite-team-member-list .team-link { + text-align: right; + color: #4078c0; + } + .member-list-item .table-list-cell { + vertical-align: middle; + padding-top: 10px; + padding-bottom: 10px; + } + .member-list-item .table-list-cell-checkbox { + width: 30px; + } + .member-list-item.adminable .member-info { + padding-left: 5px; + } + .member-list-item .member-link { + display: block; + text-decoration: none; + } + .member-list-item .member-link:hover .member-username { + color: #4078c0; + } + .member-visibility .octicon { + font-size: 14px; + } + .member-info { + padding-left: 10px; + font-size: 14px; + } + .member-info .member-list-avatar { + float: left; + margin-right: 15px; + } + .member-info .member-fullname { + font-weight: normal; + color: #767676; + } + .member-username { + margin-top: 4px; + display: block; + color: #333; + } + .member-username .octicon { + position: relative; + top: -2px; + margin-left: 2px; + font-size: 12px; + color: #aaa; + } + .member-username.css-truncate-target { + display: block; + } + .member-security .octicon { + color: #c9510c; + font-size: 14px; + } + .member-meta { + width: 140px; + font-size: 11px; + color: #767676; + text-align: center; + } + .member-meta .access-link { + color: #767676; + } + .member-meta .access-link:hover { + color: #4078c0; + text-decoration: none; + } + .member-meta .btn-link { + color: #767676; + } + .member-meta .btn-link:hover { + color: #4078c0; + text-decoration: none; + } + .member-meta .select-menu-modal { + width: 310px; + } + .member-meta .select-menu-modal-holder { + right: 0; + text-align: left; + } + .member-meta .octicon { + font-size: 14px; + } + .non-member-meta { + width: 300px; + } + .member-follow { + text-align: right; + } + .member-selected-actions { + display: inline; + } + .org-people-blankslate { + margin-top: -20px; + border-top-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; + } + .migration-wrapper { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + } + .migration-jumbotron { + height: 70vh; + min-height: 450px; + max-height: 650px; + } + .migration-jumbotron, + .migration-sub-header { + position: relative; + margin-top: -1px; + background-color: #3f4851; + background-image: -webkit-linear-gradient(#3f4851 0, #282d33 100%); + background-image: linear-gradient(#3f4851 0, #282d33 100%); + } + .migration-jumbotron:after, + .migration-sub-header:after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + content: " "; + background-image: url(/images/modules/orgs/dots-bg.png); + background-size: 80%; + background-repeat: repeat; + opacity: 0.75; + z-index: 1; + } + .migration-jumbotron-content { + position: relative; + top: 50%; + width: 980px; + margin: 0 auto; + padding: 100px 60px; + text-align: center; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + z-index: 2; + } + .migration-jumbotron-octicons { + height: 60px; + margin-bottom: 20px; + text-align: center; + } + .migration-jumbotron-octicon-item { + position: relative; + display: inline-block; + width: 60px; + height: 60px; + margin-right: 10px; + margin-left: 10px; + border-radius: 50px; + } + .migration-jumbotron-octicon-item:after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: " "; + background-image: -webkit-linear-gradient( + 135deg, + #6e5494 30%, + #c9510c 100% + ); + background-image: linear-gradient(-45deg, #6e5494 30%, #c9510c 100%); + border-radius: 50px; + } + .migration-jumbotron-octicon-item .mega-octicon { + position: absolute; + top: 1px; + left: 1px; + z-index: 2; + width: 58px; + height: 58px; + color: rgba(255, 255, 255, 0.9); + font-size: 24px; + line-height: 60px; + background-color: #383f47; + border-radius: 50px; + } + .migration-jumbotron-title, + .migration-jumbotron-lead, + .migration-sub-title, + .migration-sub-lead { + color: #fff; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + } + .migration-jumbotron-title, + .migration-section-title { + margin-bottom: 10px; + font-weight: 300; + } + .migration-jumbotron-title { + font-size: 40px; + } + .migration-section-title { + margin-top: 0; + font-size: 30px; + } + .migration-jumbotron-lead { + margin-top: 0; + font-size: 24px; + opacity: 0.85; + } + .migration-section-lead { + margin-top: 20px; + margin-bottom: 20px; + } + .migration-jumbotron-btn { + padding: 12px 18px; + font-size: 16px; + color: #6e5494; + background-color: #fff; + border-width: 0; + box-shadow: 0 3px 3px rgba(0, 0, 0, 0.05); + } + .migration-jumbotron-btn:hover { + color: #6e5494; + background-color: #eee; + } + .migration-section { + padding-top: 100px; + padding-bottom: 100px; + overflow: hidden; + border-bottom: 1px solid #ddd; + } + .migration-feature-list { + margin-top: 30px; + margin-bottom: 20px; + overflow: hidden; + color: #767676; + font-size: 14px; + list-style: none; + } + .migration-feature-list:before { + content: ""; + width: 100px; + margin-bottom: 30px; + display: block; + border-top: 1px solid #ddd; + } + .migration-feature-list .octicon { + width: 22px; + margin-left: -3px; + color: #767676; + text-align: center; + } + .migration-feature-list-item { + width: 50%; + margin-bottom: 15px; + float: left; + } + .migration-section-grey { + background-color: #fcfcfc; + } + .migration-illustration-wrapper:before { + display: table; + content: ""; + } + .migration-illustration-wrapper:after { + display: table; + clear: both; + content: ""; + } + .migration-illustration { + width: 700px; + margin-top: -60px; + margin-bottom: -50px; + } + .migration-illustration-left { + float: right; + margin-right: 50px; + } + .migration-illustration-right { + float: left; + margin-left: 50px; + } + .migration-section-privileges { + padding-top: 80px; + padding-bottom: 80px; + } + .migration-footer { + position: relative; + z-index: 1; + padding-top: 60px; + padding-bottom: 60px; + margin-bottom: -41px; + border-bottom: 1px solid #ddd; + } + .migration-footer-content { + width: 800px; + margin: 0 auto; + text-align: center; + } + .migration-footer-title, + .migration-footer-lead { + margin-bottom: 0; + } + .migration-footer-lead { + margin-top: 10px; + } + .migration-footer-btn { + margin-top: 20px; + } + .migration-sub-header { + margin-bottom: 40px; + padding-top: 40px; + padding-bottom: 40px; + } + .org-settings-updating { + padding: 15px; + margin-top: 0; + margin-bottom: 30px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 3px; + } + .org-settings-updating .spinner { + display: inline-block; + vertical-align: middle; + margin-top: -2px; + } + .org-disabled-settings { + pointer-events: none; + opacity: 0.5; + } + .migration-sub-header-content { + width: 68%; + } + .migration-sub-title { + margin-bottom: 0; + } + .migration-sub-lead { + margin-top: 10px; + margin-bottom: 0; + } + .migration-org-avatar { + margin-top: 6px; + margin-right: 72px; + border: 3px solid #fff; + border-radius: 3px; + } + .org-migration-settings-sidebar .migrate-org-roles { + margin-top: 0; + margin-bottom: 10px; + } + .org-migration-settings-sidebar .preserve-member-privileges-btn { + display: none; + } + .org-migration-settings-sidebar + .member-privilege-radios-preserved + .preserve-member-privileges-btn { + display: block; + } + .org-migration-settings-sidebar + .member-privilege-radios-preserved + .save-member-privileges-btn { + display: none; + } + .org-migration-settings-section { + position: relative; + margin-right: 60px; + margin-bottom: 50px; + padding-bottom: 50px; + border-bottom: 1px solid #ddd; + } + .org-migration-settings-section:last-child { + margin-bottom: 0; + padding-bottom: 0; + border-bottom: 0; + } + .org-migration-settings-section .disabled { + opacity: 0.5; + pointer-events: none; + } + .org-migration-settings-section .spinner { + display: inline-block; + margin-bottom: -3px; + } + .org-migration-settings-icon { + position: absolute; + left: -45px; + color: #ccc; + } + .org-migration-settings-title { + margin-bottom: 0; + font-size: 22px; + font-weight: normal; + } + .org-migration-settings-info { + margin-top: 5px; + margin-bottom: 30px; + font-size: 16px; + color: #767676; + } + .migrate-owners-wrapper { + position: relative; + min-height: 550px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + } + .migrate-owners-content-about, + .migrate-owners-content-rename { + position: absolute; + top: 0; + left: 50%; + margin: 30px auto 0; + -webkit-transition: + opacity 0.2s ease-in-out, + -webkit-transform 0.3s ease-in-out; + transition: + opacity 0.2s ease-in-out, + transform 0.3s ease-in-out; + -webkit-transform: translate(-50%, 0); + -ms-transform: translate(-50%, 0); + transform: translate(-50%, 0); + } + .migrate-owners-content-hidden { + -webkit-transform: translate(-50%, 150px); + -ms-transform: translate(-50%, 150px); + transform: translate(-50%, 150px); + opacity: 0; + pointer-events: none; + z-index: 20; + } + .migrate-owners-content-about { + width: 700px; + text-align: center; + } + .migrate-owners-title { + font-size: 35px; + font-weight: normal; + } + .migrate-owners-lead { + margin-top: 0; + margin-bottom: 20px; + } + .migrate-owners-content-rename { + width: 520px; + } + .rename-owners-error span { + display: inline-block; + padding: 5px; + margin-bottom: 10px; + font-size: 11px; + font-weight: bold; + color: #494620; + background: #f7ea57; + border: 1px solid #c0b536; + border-top-color: #fff; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + .rename-owners-spinner { + position: absolute; + top: 30px; + right: 30px; + } + .delete-owners-button { + color: #767676; + } + .delete-owners-button:hover { + color: #bd2c00; + } + .rename-owners-team-form .rename-owners-team-input { + font-size: 22px; + font-weight: bold; + } + .rename-owners-team-form .note { + margin-top: 5px; + margin-bottom: 15px; + color: #767676; + } + .legacy-contributors-title { + margin-top: 30px; + margin-bottom: 0; + font-size: 24px; + font-weight: normal; + } + .legacy-contributors-lead { + margin-top: 10px; + font-size: 16px; + line-height: 24px; + } + .migration-help-collabs { + margin-top: 145px; + } + .migration-help-robots { + margin-top: 80px; + } + .migration-help-teams { + margin-top: 50px; + } + .migration-help-title { + margin-top: 0; + margin-bottom: 0; + font-size: 14px; + } + .migration-help-content { + margin-top: 5px; + margin-bottom: 5px; + color: #767676; + } + .migrate-org-roles { + width: 100%; + margin-top: -20px; + display: table; + border: 1px solid #ddd; + border-radius: 3px; + } + .migrate-org-roles .tooltipped:after { + width: 150px; + white-space: normal; + } + .migrate-org-roles-item { + display: table-cell; + width: 33.33%; + border-right: 1px solid #ddd; + } + .migrate-org-roles-item:last-child { + border-right: 0; + } + .repo-creation-content { + font-size: 14px; + color: #767676; + } + .repo-setting-check { + margin-top: 1px; + margin-right: 8px; + margin-bottom: 15px; + float: left; + } + .repo-setting-saved, + .repo-setting-spinner { + float: right; + } + .repo-setting-saved { + color: #6cc644; + font-weight: bold; + } + .migrate-ability-list { + margin: 15px 0; + list-style: none; + } + .migrate-ability-list-item { + padding-top: 5px; + padding-bottom: 5px; + margin: 0 20px; + font-size: 14px; + } + .migrate-ability-list-item:first-child { + border-top: 0; + } + .migrate-ability-list-item .octicon-check, + .migrate-ability-list-item .octicon-x { + width: 15px; + } + .migrate-ability-list-item .octicon-check { + color: #6cc644; + } + .migrate-ability-list-item .octicon-x { + color: #aaa; + } + .migrate-ability-list-item .octicon-question { + color: #555; + font-size: 12px; + } + .migrate-org-roles-legacy-item { + background-color: #f8f8f8; + } + .migrate-ability-not-possible { + color: #767676; + } + .default-repository-permission .octicon-x, + .members-can-create-repositories .octicon-x, + .team-privacy .octicon-x { + display: none; + } + .default-repository-permission.migrate-ability-not-possible .octicon-x, + .members-can-create-repositories.migrate-ability-not-possible .octicon-x, + .team-privacy.migrate-ability-not-possible .octicon-x { + display: inline-block; + } + .default-repository-permission.migrate-ability-not-possible + .octicon-check, + .members-can-create-repositories.migrate-ability-not-possible + .octicon-check, + .team-privacy.migrate-ability-not-possible .octicon-check { + display: none; + } + .migrate-org-roles-header { + padding: 15px 20px; + border-bottom: 1px solid #ddd; + } + .migrate-org-roles-title { + margin-top: 0; + margin-bottom: 0; + font-size: 18px; + font-weight: normal; + } + .migrate-org-roles-lead { + margin-top: 4px; + margin-bottom: 0; + font-size: 14px; + color: #767676; + } + .migrate-org-badge { + padding: 3px 5px; + color: #333; + font-size: 10px; + letter-spacing: 1px; + text-transform: uppercase; + border: 1px solid #ddd; + border-radius: 3px; + } + .migrate-org-roles-count { + padding: 10px 20px; + color: #767676; + border-top: 1px solid #ddd; + } + .migrate-org-avatar-list { + margin-top: 5px; + margin-bottom: 10px; + } + .migrate-org-avatar-list:before { + display: table; + content: ""; + } + .migrate-org-avatar-list:after { + display: table; + clear: both; + content: ""; + } + .migrate-org-avatar-list .migrate-org-avatar, + .migrate-org-avatar-list .migrate-org-avatar-empty { + float: left; + margin-left: 2px; + } + .migrate-org-avatar-list .migrate-org-avatar:first-child, + .migrate-org-avatar-list .migrate-org-avatar-empty:first-child { + margin-left: 0; + } + .migrate-org-avatar-list .migrate-org-avatar-empty { + width: 30px; + height: 30px; + border-radius: 3px; + } + .migrate-org-avatar-list .migrate-org-more-ellipsis, + .migrate-org-avatar-list .migrate-org-zero { + font-size: 18px; + text-align: center; + line-height: 30px; + color: #767676; + } + .migrate-org-avatar-list .migrate-org-more-ellipsis { + font-weight: bold; + line-height: 20px; + background-color: #f5f5f5; + } + .migrate-org-avatar-list .migrate-org-zero { + color: #767676; + border: 1px dashed #ddd; + } + .migrate-org-avatar-list .migrate-org-more-ellipsis:hover { + text-decoration: none; + } + .migrate-org-avatar-list .tooltipped:after { + width: auto; + white-space: nowrap; + } + .default-permission-update-in-progress .form { + opacity: 0.5; + pointer-events: none; + } + .default-permission-update-in-progress .spinner { + margin-top: -3px; + margin-left: 5px; + display: inline-block; + vertical-align: middle; + } + .default-permission-updating { + margin-top: 10px; + margin-right: 10px; + float: right; + } + .default-permission-update-text { + color: #767676; + } + .org-settings-teams:before { + display: table; + content: ""; + } + .org-settings-teams:after { + display: table; + clear: both; + content: ""; + } + .org-settings-team-item { + width: 50%; + float: left; + padding: 20px 40px 25px; + text-align: center; + } + .org-settings-team-item:first-child { + border-right: 1px solid #ddd; + } + .org-settings-team-count { + font-size: 30px; + color: #000; + } + .org-settings-team-type { + margin-top: 0; + margin-bottom: 10px; + font-size: 14px; + font-weight: normal; + color: #000; + } + .org-settings-team-description { + margin-top: 0; + } + .migrate-org-create-repos-wrapper .repo-setting-saved { + display: none; + } + .migrate-org-create-repos-wrapper.loading .spinner { + display: inline-block; + } + .migrate-org-create-repos-wrapper.success .repo-setting-saved { + display: inline; + } + .migrate-org-create-repos-wrapper .disabled { + opacity: 0.5; + pointer-events: none; + } + .migrate-org-create-repos-wrapper .note { + margin-top: 0; + margin-bottom: 0; + } + .legacy-contributor-list { + margin-bottom: 15px; + } + .legacy-contributor-actions { + width: 395px; + text-align: right; + } + .legacy-contributor-button { + display: inline; + } + .legacy-contributor-button:last-child { + margin-left: 5px; + } + .legacy-contributor-cell, + .legacy-contributor-cell-contents { + -webkit-transition: all 0.25s ease-in-out; + transition: all 0.25s ease-in-out; + } + .legacy-contributor-cell-contents { + max-height: 80px; + } + .hide-legacy-contributor .legacy-contributor-cell { + padding-top: 0; + padding-bottom: 0; + opacity: 0; + } + .hide-legacy-contributor .legacy-contributor-cell-contents { + max-height: 0; + overflow: hidden; + } + .load-more-contributors { + font-size: 14px; + font-weight: bold; + } + .migrate-back-step { + margin-top: 9px; + float: left; + } + .team-grid { + position: relative; + margin-left: -10px; + margin-right: -10px; + } + .team-grid:before { + display: table; + content: ""; + } + .team-grid:after { + display: table; + clear: both; + content: ""; + } + .team-grid .team { + position: relative; + float: left; + width: 480px; + padding: 15px; + margin-bottom: 20px; + margin-left: 10px; + margin-right: 10px; + border: 1px solid #eee; + border-radius: 3px; + } + .team-grid .team-name { + display: block; + margin-top: -2px; + color: #333; + font-size: 18px; + font-weight: bold; + text-decoration: none; + } + .team-grid .team-name .css-truncate-target { + max-width: 315px; + } + .team-grid .team-name:focus, + .team-grid .team-name:hover { + color: #4078c0; + } + .team-grid .team-name:focus { + outline: none; + } + .team-grid .team-description { + max-width: 80%; + margin-top: 5px; + font-size: 14px; + color: #767676; + text-overflow: ellipsis; + white-space: nowrap; + } + .team-grid .team-description .label-private { + text-transform: uppercase; + } + .team-grid .team-label-ldap { + float: right; + } + .team-grid .team-members { + width: 478px; + padding: 10px 15px; + margin: 0 -15px -15px; + border-top: 1px solid #eee; + border-radius: 0 0 3px 3px; + background-color: #f8f8f8; + } + .team-grid .team-members .btn-sm { + margin-top: 2px; + margin-bottom: 2px; + } + .team-grid .team-member { + display: inline-block; + vertical-align: top; + width: 30px; + height: 30px; + } + .team-grid .team-member:hover { + text-decoration: none; + } + .team-grid .blankslate { + margin-left: 10px; + margin-right: 10px; + } + .team-grid .team-actions-form { + float: right; + } + .team-label-ldap { + display: inline-block; + padding: 0 9px; + line-height: 25px; + border: 1px solid #eaeaea; + border-radius: 3px; + box-shadow: none; + color: #767676; + font-size: 11px; + text-transform: uppercase; + cursor: default; + } + .team-label-ldap.header-label-ldap { + padding: 3px 5px; + } + .team-member-ellipsis { + display: inline-block; + vertical-align: top; + width: 30px; + height: 30px; + line-height: 24px; + color: #767676; + font-weight: bold; + text-align: center; + background-color: #ddd; + border-radius: 3px; + } + .team-member-ellipsis:hover { + color: #333; + text-decoration: none; + } + .typeahead-result { + position: relative; + display: block; + min-width: 100%; + padding: 10px; + margin-top: 0; + color: #333; + cursor: pointer; + } + .typeahead-result:before { + display: table; + content: ""; + } + .typeahead-result:after { + display: table; + clear: both; + content: ""; + } + .typeahead-result:first-child { + border-top: 0; + } + .typeahead-result:focus, + .typeahead-result:hover, + .typeahead-result.navigation-focus { + text-decoration: none; + } + .typeahead-result:hover, + .typeahead-result.navigation-focus { + color: #fff; + background-color: #4078c0; + } + .typeahead-result:hover .octicon-plus, + .typeahead-result.navigation-focus .octicon-plus { + color: #fff; + } + .member-suggestion { + padding-left: 44px; + } + .member-suggestion .avatar { + float: left; + margin-left: -34px; + margin-right: 10px; + } + .member-suggestion .member-suggestion-info { + width: 75%; + overflow: hidden; + margin-top: 2px; + margin-bottom: 0; + white-space: nowrap; + text-overflow: ellipsis; + } + .member-suggestion .member-name { + color: #767676; + font-size: 12px; + } + .member-suggestion .octicon-plus, + .member-suggestion .octicon-check { + position: absolute; + top: 50%; + right: 15px; + margin-top: -8px; + color: #ddd; + } + .member-suggestion .already-member-note, + .member-suggestion .non-member-note, + .member-suggestion .non-member-action { + margin-top: 0; + margin-bottom: 0; + color: #767676; + font-size: 11px; + } + .member-suggestion .non-member-action { + display: none; + } + .member-suggestion:hover .member-name, + .member-suggestion:hover .non-member-note, + .member-suggestion:hover .already-member-note, + .member-suggestion:hover .non-member-action, + .member-suggestion.navigation-focus .member-name, + .member-suggestion.navigation-focus .non-member-note, + .member-suggestion.navigation-focus .already-member-note, + .member-suggestion.navigation-focus .non-member-action { + color: #fff; + } + .member-suggestion:hover .non-member-note, + .member-suggestion.navigation-focus .non-member-note { + display: none; + } + .member-suggestion:hover .non-member-action, + .member-suggestion.navigation-focus .non-member-action { + display: block; + } + .member-suggestion:hover .octicon-plus, + .member-suggestion:hover .octicon-check, + .member-suggestion.navigation-focus .octicon-plus, + .member-suggestion.navigation-focus .octicon-check { + color: #fff; + } + .member-suggestion.not-a-member .member-info, + .member-suggestion.disabled .member-info { + margin-top: -2px; + } + .member-suggestion.disabled { + opacity: 0.5; + } + .team-suggestion { + padding-left: 32px; + } + .team-suggestion .octicon { + float: left; + margin-left: -22px; + margin-top: 2px; + } + .team-suggestion .team-suggestion-info { + margin: 2px 0 0; + } + .team-suggestion .team-suggestion-info .css-truncate-target { + max-width: none; + } + .team-suggestion .team-size, + .team-suggestion .team-description { + color: #767676; + font-size: 12px; + } + .team-suggestion.navigation-focus .team-size, + .team-suggestion.navigation-focus .team-description { + color: #fff; + } + .repo-access-add-team .team-name { + font-size: 13px; + } + .repo-access-add-team .team-description { + display: block; + } + .repo-access-add-team .team-size, + .repo-access-add-team .team-description { + color: #767676; + font-size: 12px; + } + .repo-access-add-team.navigation-focus .team-size, + .repo-access-add-team.navigation-focus .team-description { + color: #fff; + } + .menu-item .org-avatar, + .menu-item .org-octicon-credit-card { + position: absolute; + } + .menu-item .org-octicon-credit-card { + right: 0; + } + .org-settings-link { + display: block; + padding: 0 30px; + word-wrap: break-word; + } + .team-info-card { + position: relative; + margin-bottom: 20px; + } + .team-info-card .team-label-ldap { + font-size: 13px; + line-height: 32px; + } + .team-info-card .team-description { + margin-top: 10px; + color: #666; + font-size: 14px; + line-height: 20px; + word-break: break-word; + } + .team-info-card .team-description .link { + color: #767676; + cursor: pointer; + } + .team-info-card .team-description .link:hover { + text-decoration: underline; + } + .team-info-card .description-toggler .turn-on { + display: inline-block; + } + .team-info-card .description-toggler.on .turn-off { + display: inline-block; + } + .team-info-card .description-toggler .turn-off { + display: none; + } + .team-info-card .description-toggler.on .turn-on { + display: none; + } + .team-title { + margin-top: 0; + margin-bottom: 0; + font-size: 22px; + line-height: 26px; + } + .team-stats { + margin-right: -15px; + margin-bottom: -10px; + margin-left: -15px; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid #eee; + } + .stats-group { + display: table; + table-layout: fixed; + width: 100%; + } + .stats-group-stat { + display: table-cell; + padding-top: 10px; + padding-bottom: 10px; + padding-left: 15px; + font-size: 12px; + color: #767676; + text-transform: uppercase; + } + .stats-group-stat:first-child { + padding-left: 0; + border-right: 1px solid #eee; + } + .stats-group-stat:hover, + .stats-group-stat:hover .stat-number { + color: #4078c0; + text-decoration: none; + } + .stats-group-stat.no-link:hover { + color: #767676; + text-decoration: none; + } + .stats-group-stat.no-link:hover .stat-number { + color: #333; + } + .stat-number { + display: block; + color: #333; + font-size: 16px; + } + .team-description-form { + width: 100%; + margin-top: 10px; + margin-bottom: 20px; + } + .team-description-field { + width: 100%; + height: 100px; + margin-bottom: 10px; + font-size: 14px; + } + .team-actions .octicon { + margin-right: 0; + } + .team-actions-form { + display: inline-block; + } + .org-team-sidebar { + float: left; + width: 280px; + } + .org-team-sidebar .team-note { + color: #767676; + font-size: 13px; + text-align: center; + } + .org-team-sidebar .team-note .note-emphasis { + color: #333; + } + .org-team-main { + float: right; + width: 660px; + } + .permission-title { + margin-top: 0; + margin-bottom: 0; + } + .owners-member-title { + margin-top: 10px; + margin-bottom: 0; + font-size: 18px; + color: #767676; + font-weight: normal; + } + .owners-notice { + background-color: #f0f8ff; + } + .owners-notice-title { + margin-top: 0; + margin-bottom: 0; + font-size: 18px; + } + .owners-notice-link { + margin-top: 10px; + } + .owners-team-repo-note { + margin-top: 12px; + margin-bottom: 0; + } + .owners-team-repo-note .octicon { + font-size: 14px; + } + .team-member-list { + list-style: none; + } + .team-member-list .table-list-cell { + padding-top: 15px; + padding-bottom: 15px; + } + .team-member-list .team-member-content { + margin-left: 50px; + } + .team-member-list .team-member-username { + font-weight: bold; + margin: 0; + font-size: 14px; + line-height: 20px; + } + .team-member-list .team-member-description { + color: #767676; + margin: 0; + font-size: 14px; + line-height: 20px; + } + .team-member-list .label-admin, + .team-member-list .label-generic { + cursor: default; + } + .team-member-list .manage-team-member { + float: right; + } + .team-member-list .manage-team-member .select-menu-modal { + width: 225px; + left: -176px; + } + .team-member-list .manage-team-member .select-menu-item.disabled { + color: #bbb; + cursor: not-allowed; + } + .team-member-list .manage-team-member .select-menu-item .btn-link { + width: 100%; + margin-left: 0; + color: #767676; + } + .team-member-list .manage-team-member .select-menu-item .btn-danger { + color: #bd2c00; + } + .team-member-list .manage-team-member .navigation-focus.disabled { + color: #bbb; + background-color: #fff; + } + .team-member-list .manage-team-member .navigation-focus .btn-link { + color: #fff; + text-decoration: none; + } + .team-member-list .manage-team-member .navigation-focus .btn-danger { + background: #bd2c00; + } + .team-member-list-avatar { + float: left; + margin-right: 10px; + } + .loading .legacy-contributor-button .btn-sm { + opacity: 0.5; + pointer-events: none; + } + .org-team-form { + width: 440px; + margin: 0 auto; + } + .org-team-form .disabled { + opacity: 0.5; + } + .org-validate-group { + position: relative; + } + .org-validate-group .octicon, + .org-validate-group .spinner { + position: absolute; + top: 9px; + right: 10px; + } + .org-validate-group .octicon-check { + color: #6cc644; + } + .org-validate-group .octicon-alert { + color: #bd2c00; + } + .team-members { + margin-bottom: 20px; + } + .confirm-removal-container .private-fork-count { + margin-top: 0; + color: #767676; + font-weight: normal; + font-size: 12px; + } + .confirm-removal-container .deleting-private-forks-warning { + position: relative; + padding-left: 26px; + } + .confirm-removal-container .deleting-private-forks-warning .octicon { + position: absolute; + top: 2px; + left: 0; + color: #bd2c00; + } + .confirm-removal-list-container { + border: 1px solid #eaeaea; + border-radius: 3px; + margin-bottom: 15px; + } + .facebox .confirm-removal-list { + margin-left: 0; + margin-bottom: 0; + padding-left: 0; + max-height: 182px; + overflow: auto; + } + .confirm-removal-list-item { + font-size: 14px; + font-weight: bold; + margin: 0; + padding: 10px; + border-top: 1px solid #eaeaea; + } + .confirm-removal-list-item:first-child { + border-top: 0; + } + .confirm-removal-list-item.cutoff-member-summary { + font-weight: normal; + } + .confirm-removal-team .octicon, + .confirm-removal-repo .octicon { + margin-right: 3px; + color: #767676; + } + .org-blankslate { + display: none; + } + .org-section.is-empty .org-blankslate { + display: block; + } + .manage-user-info { + margin-left: -15px; + margin-right: -15px; + padding-right: 15px; + padding-bottom: 10px; + padding-left: 15px; + border-bottom: 1px solid #eee; + } + .manage-user-info:before { + display: table; + content: ""; + } + .manage-user-info:after { + display: table; + clear: both; + content: ""; + } + .manage-user-info .member-username { + margin-top: 0; + } + .manage-user-info .member-username, + .manage-user-info .member-fullname { + display: block; + overflow-x: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .manage-user-info .avatar { + margin-top: 2px; + margin-right: 10px; + } + .manage-user-role { + position: relative; + padding-top: 15px; + padding-bottom: 5px; + } + .manage-user-role .select-menu-item-text .description { + font-size: 12px; + line-height: 16px; + } + .manage-user-role .non-member-info { + color: #767676; + } + .manage-member-meta { + list-style: none; + } + .manage-member-meta-item { + margin-top: 12px; + color: #767676; + } + .manage-member-meta-item:first-child { + margin-top: 0; + } + .manage-member-meta-item .btn-link { + color: #767676; + } + .manage-member-meta-item > .octicon { + width: 14px; + text-align: center; + margin-right: 5px; + color: #767676; + } + .manage-member-meta-item > .octicon-alert { + color: #c9510c; + } + .member-two-factor-disabled { + color: #bd2c00; + } + .manage-member-button { + margin-bottom: 10px; + } + .org-person-repo-header { + margin-top: 0; + } + .org-person-repo-search { + margin-top: 5px; + margin-right: 5px; + } + .org-user-notice-title { + margin-top: 0; + margin-bottom: 0; + } + .org-user-notice-content { + margin-top: 10px; + margin-bottom: 10px; + font-size: 14px; + } + .org-user-notice-content strong { + color: #333; + } + .org-user-notice-content:last-child { + margin-bottom: 0; + } + .org-user-notice-content .octicon { + color: #767676; + } + .org-user-notice-icon { + margin: 10px 10px 20px; + float: right; + font-size: 45px; + color: #ccc; + } + .org-migration-list { + margin-left: 20px; + margin-bottom: 20px; + font-size: 14px; + } + .org-migration-list-item { + margin-bottom: 5px; + } + .org-migration-actions:before { + display: table; + content: ""; + } + .org-migration-actions:after { + display: table; + clear: both; + content: ""; + } + .org-migration-actions form { + margin-right: 10px; + float: left; + } + .manage-repo-access-wrapper { + width: 750px; + } + .manage-repo-access-header { + margin-top: 30px; + margin-bottom: 30px; + } + .manage-repo-access-header:before { + display: table; + content: ""; + } + .manage-repo-access-header:after { + display: table; + clear: both; + content: ""; + } + .manage-repo-access-header .btn { + margin-top: 8px; + } + .manage-repo-access-heading { + margin-top: -2px; + margin-bottom: 0; + font-weight: normal; + font-size: 24px; + } + .manage-repo-access-lead { + margin-top: 3px; + margin-bottom: 0; + font-size: 16px; + color: #767676; + } + .manage-access-team-list { + border-bottom: 0; + } + .manage-access-team-list-item:first-child .table-list-cell { + border-top: 0; + } + .manage-access-team-info { + padding-top: 15px; + width: 350px; + } + .manage-access-team-description { + margin-top: 3px; + color: #767676; + } + .manage-access-team-meta { + padding-top: 25px; + padding-bottom: 25px; + padding-right: 20px; + text-align: right; + } + .manage-access-icons-cell { + width: 50px; + text-align: center; + padding-right: 0; + padding-top: 18px; + } + .manage-access-icons { + padding: 10px; + margin-top: -5px; + display: inline-block; + border: 1px solid #eee; + border-radius: 5px; + } + .manage-access-icons .octicon { + float: left; + width: 16px; + text-align: center; + } + .access-inactive { + opacity: 0.6; + } + .ldap-group-dn { + display: block; + color: #aaa; + font-weight: normal; + } + .ldap-import-groups-container .blankslate { + display: none; + } + .ldap-import-groups-container.is-empty .blankslate { + display: block; + } + .ldap-import-groups-container.is-empty .ldap-memberships-list { + display: none; + } + .ldap-import-groups-container .team-name-exists { + display: none; + } + .ldap-import-groups-container .is-exists .ldap-mention-as { + color: #bd2c00; + } + .ldap-import-groups-container .is-exists .team-name-exists { + position: absolute; + z-index: 1; + display: inline-block; + padding: 5px; + font-size: 11px; + color: #494620; + background: #f7ea57; + border: 1px solid #c0b536; + border-top-color: #fff; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + .ldap-memberships-list { + margin-bottom: 30px; + } + .ldap-memberships-list .table-list-cell { + font-size: 13px; + padding-bottom: 10px; + padding-top: 10px; + vertical-align: middle; + } + .ldap-memberships-list .table-list-cell:last-child { + width: 92px; + } + .ldap-memberships-list .ldap-group-form { + display: table; + width: 100%; + } + .ldap-memberships-list .ldap-group-form > div:not(.table-list-cell) { + display: none !important; + } + .ldap-memberships-list .team-name-exists { + bottom: -19px; + left: 10px; + } + .ldap-memberships-list .ldap-list-team-name { + width: 380px; + } + .ldap-memberships-list .ldap-group-dn { + font-size: 11px; + } + .ldap-memberships-list .ldap-mention-as { + width: 260px; + } + .ldap-memberships-list .edit { + position: absolute; + padding: 10px; + margin-left: -33px; + color: #4078c0; + cursor: pointer; + } + .ldap-memberships-list .edit-fields { + display: none; + } + .ldap-memberships-list .is-editing .edit-hide { + display: none; + } + .ldap-memberships-list .is-editing .edit-fields { + display: block; + } + .ldap-memberships-list .is-editing .spinner { + margin-left: 15px; + vertical-align: middle; + } + .ldap-memberships-list .is-removing { + opacity: 0.25; + } + .ldap-memberships-list .is-removing .edit { + opacity: 0.5; + } + .team-name-field { + height: 33px; + } + .ldap-import-form-actions { + margin-top: 30px; + } + .is-importing .team-ldap-group-adder-button .spinner { + display: inline; + float: left; + } + .team-ldap-group-adder { + position: relative; + float: left; + } + .team-ldap-group-adder .team-name-exists { + bottom: -27px; + } + .team-ldap-group-adder .subnav-search-input { + border-radius: 4px 0 0 4px; + } + .team-ldap-group-adder-button { + border-radius: 0 4px 4px 0; + margin-left: -1px; + width: 90px; + } + .team-ldap-group-adder-button .loading-indicator { + display: none; + } + #pending-invitations { + display: none; + } + .pending-team-invitations-link { + margin-top: 20px; + padding-top: 15px; + padding-bottom: 15px; + display: block; + border-top: 1px solid #eee; + } + .invited .team-member-list { + margin: -10px 0 0; + } + .invited .team-member-list .list-item { + padding: 10px 0; + border-bottom: 1px solid #eee; + } + .invited .team-member-list .list-item:before { + display: table; + content: ""; + } + .invited .team-member-list .list-item:after { + display: table; + clear: both; + content: ""; + } + .invited .team-member-list .list-item:last-of-type { + border: 0; + } + .invited .team-member-list .list-item .edit-invitation, + .invited .team-member-list .list-item .cancel-invitation { + margin-top: 6px; + float: right; + } + .invited-banner { + margin-top: 10px; + padding: 10px; + border: 1px solid #eaeaea; + border-radius: 4px; + background-color: #fff; + } + .invited-banner:before { + display: table; + content: ""; + } + .invited-banner:after { + display: table; + clear: both; + content: ""; + } + .invited-banner .btn-sm { + float: right; + margin-left: 5px; + margin-top: -3px; + } + .invited-banner p { + color: #333; + margin: 0; + font-size: 15px; + } + .invited-banner .inviter-link { + color: #333; + font-weight: bold; + } + .invitation-container { + width: 600px; + margin: 40px auto; + padding: 20px; + border: 1px solid #ddd; + border-radius: 3px; + } + .invitation-container h3 { + font-size: 16px; + font-weight: normal; + } + .invitation-disclosure { + position: relative; + padding: 10px 0 10px 24px; + list-style: none; + color: #767676; + text-align: center; + } + .invitation-disclosure .octicon { + color: #767676; + text-align: center; + display: inline-block; + margin-right: 5px; + } + .invitation-header { + position: relative; + text-align: center; + } + .invitation-header .avatar { + margin-bottom: 20px; + } + .invitation-header .invitation-title { + font-size: 18px; + font-weight: normal; + line-height: 16px; + margin: 0; + } + .invitation-header .inviter { + font-size: 13px; + color: #767676; + margin: 5px 0 10px; + } + .invitation-footer { + margin: 40px 0 20px; + } + .invitation-footer form { + display: inline-block; + margin-right: 10px; + } + .outline-box-group { + border-radius: 3px; + } + .outline-box { + padding: 20px; + border: solid 1px #d8d8d8; + } + .outline-box:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + .outline-box:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + } + .outline-box + .outline-box { + border-top: 0; + } + .outline-box-highlighted { + background-color: #f7fafd; + border-color: #c9d6e3; + } + .owner-select-grid { + margin-left: -8px; + } + .owner-select-grid:before { + display: table; + content: ""; + } + .owner-select-grid:after { + display: table; + clear: both; + content: ""; + } + .owner-select-target { + float: left; + padding: 10px; + margin: 0 10px 20px; + text-align: center; + background-color: #f2f2f2; + border-radius: 3px; + border: 0; + font-weight: bold; + cursor: pointer; + } + .owner-select-target:hover, + .owner-select-target:focus { + color: #fff; + background-color: #4078c0; + } + .owner-select-target:active { + color: #fff; + background-color: #33609a; + } + .owner-select-target .css-truncate-target { + max-width: 90px; + } + .owner-select-target.disabled { + cursor: not-allowed; + color: #999; + } + .owner-select-target.disabled .user-mention { + color: #999; + } + .owner-select-target.disabled .owner-select-avatar { + opacity: 0.3; + } + .owner-select-avatar { + display: block; + margin-bottom: 9px; + } + .page-notice { + margin: 15px auto; + width: 400px; + padding: 20px; + color: #333; + font-size: 14px; + background: #fffeeb; + border: 1px solid #ddd; + border-radius: 3px; + } + .page-notice h2 { + margin: 0; + font-size: 16px; + color: #000; + } + .page-notice p:last-child { + margin-bottom: 0; + } + #editor-body-buffer { + display: none; + } + #pages-composer { + padding-bottom: 5px; + margin-bottom: 20px; + border-bottom: 1px solid #eee; + } + #pages-composer label { + display: inline-block; + margin-bottom: 10px; + font-size: 16px; + } + #pages-composer input { + margin-bottom: 15px; + } + #pages-composer p { + margin-top: -10px; + margin-bottom: 10px; + color: #767676; + } + #pages-composer #gollum-editor-function-bar { + margin-top: 0; + } + #pages-composer #gollum-editor { + margin: 0; + padding: 0; + border: 0; + } + #pages-composer #gollum-editor-body { + margin-top: 10px; + } + .gollum-readme { + display: inline-block; + margin-left: 10px; + } + #gollum-editor-function-bar #undo-load-readme { + display: none; + } + .theme-picker { + margin-bottom: -1px; + background-color: #fff; + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1); + } + .theme-picker > .container { + position: relative; + overflow: hidden; + text-align: center; + } + .theme-picker-thumbs { + border-bottom: 1px solid #eee; + } + .theme-picker-footer { + position: relative; + padding-bottom: 15px; + } + .theme-toggle { + width: 32px; + height: 32px; + color: #ccc; + padding: 0; + background: none; + border: 0; + } + .theme-toggle:hover { + color: #0084c8; + text-decoration: none; + } + .theme-toggle.disabled, + .theme-toggle.disabled:hover { + color: #ccc; + opacity: 0.3; + cursor: not-allowed; + } + .theme-toggle-full-left, + .theme-toggle-full-right { + position: absolute; + top: 50px; + width: 32px; + height: 32px; + overflow: hidden; + } + .theme-toggle-full-left { + left: 0; + } + .theme-toggle-full-right { + right: 0; + } + .theme-selector { + height: 102px; + margin: 15px 46px; + white-space: nowrap; + overflow: hidden; + } + .theme-selector-thumbnail { + display: inline-block; + padding: 2px; + border: 1px solid #ddd; + border-radius: 3px; + } + .theme-selector-thumbnail + .theme-selector-thumbnail { + margin-left: 15px; + } + .theme-selector-thumbnail:hover { + text-decoration: none; + background-color: #f5f5f5; + } + .theme-selector-thumbnail.selected { + padding: 3px; + background-color: #4078c0; + border: 0; + } + .theme-selector-thumbnail.selected .theme-selector-img { + border: 1px solid #fff; + } + .theme-selector-img { + display: block; + width: 126px; + height: 96px; + border-radius: 1px; + } + .theme-selector-name { + display: none; + } + .theme-picker-spinner { + position: absolute; + top: 16px; + left: 50%; + margin-left: -16px; + opacity: 0; + -webkit-transition: + 0.2s, + opacity ease-in-out; + transition: + 0.2s, + opacity ease-in-out; + background-color: #fff; + } + .theme-picker-spinner.visible { + opacity: 1; + } + .theme-picker-spinner.visible ~ .theme-picker-controls .theme-name { + opacity: 0; + } + .theme-selector-actions { + padding-top: 15px; + text-align: right; + } + .theme-selector-actions:before { + display: table; + content: ""; + } + .theme-selector-actions:after { + display: table; + clear: both; + content: ""; + } + .theme-selector-actions .page-edit, + .theme-selector-actions .page-publish { + display: inline-block; + margin-left: 5px; + } + .theme-picker-view-toggle { + float: left; + } + .theme-picker-view-toggle .for-hiding { + display: none; + } + .theme-picker-view-toggle.open .for-hiding { + display: inline; + } + .theme-picker-view-toggle.open .for-showing { + display: none; + } + .theme-picker-controls { + position: absolute; + top: 15px; + left: 50%; + display: none; + width: 220px; + margin-left: -110px; + line-height: 34px; + text-align: center; + } + .theme-picker-controls .theme-toggle { + vertical-align: middle; + } + .theme-name { + display: inline-block; + margin-left: 10px; + margin-right: 10px; + font-size: 20px; + vertical-align: middle; + line-height: 1; + } + #page-preview { + position: relative; + z-index: -100; + display: block; + width: 100%; + height: 100%; + padding: 0; + background-color: #fff; + border: 0; + } + .feed-icon a { + display: block; + width: 18px; + height: 18px; + background: #f37538; + color: #fff; + border-radius: 3px; + padding: 1px; + text-align: center; + } + body.page-profile .select-menu-modal { + width: 130px; + } + body.page-profile .select-menu-modal-holder { + right: 0; + } + body.page-profile .tab-content { + position: relative; + } + body.page-profile .feed-icon { + position: absolute; + right: 0; + z-index: 2; + } + body.page-profile .user-actions { + display: inline-block; + position: relative; + margin-left: 10px; + } + .profilecols .orgs h3 { + margin: 0 0 5px; + font-size: 12px; + } + .profilecols .orgs h3 a { + font-weight: normal; + margin-left: 5px; + } + .profilecols .repo-search { + display: inline; + } + .profilecols .filter-bar { + position: relative; + padding: 0 0 15px; + background-color: #fff; + border-bottom: 1px solid #ddd; + } + .profilecols .filter-bar .new-repo { + float: right; + margin-left: 15px; + } + .profilecols .filter-bar .filter_input { + width: 260px; + } + .profilecols .filter-bar .repo_filterer { + float: right; + margin-top: 8px; + } + .profilecols .filter-bar li { + position: relative; + float: right; + list-style: none; + margin-left: 10px; + font-size: 14px; + } + .profilecols .filter-bar li a { + display: inline-block; + } + .profilecols .filter-bar li .filter-selected { + color: #000; + font-weight: bold; + } + .profilecols .blankslate { + margin-top: 30px; + } + .vcard-avatar { + position: relative; + display: block; + } + .vcard-avatar .avatar { + border-radius: 6px; + } + .vcard-names { + margin-top: 5px; + line-height: 1; + } + .vcard-fullname { + display: block; + overflow: hidden; + width: 100%; + font-size: 26px; + line-height: 30px; + text-overflow: ellipsis; + } + .vcard-username { + display: block; + overflow: hidden; + width: 100%; + font-size: 20px; + font-style: normal; + font-weight: 300; + line-height: 24px; + color: #666; + text-overflow: ellipsis; + } + .vcard-details { + list-style: none; + padding-top: 15px; + padding-bottom: 15px; + border-top: 1px solid #eee; + } + .vcard-detail { + width: 100%; + padding: 2px 0 2px 24px; + overflow-x: hidden; + white-space: nowrap; + font-size: 14px; + text-overflow: ellipsis; + } + .vcard-detail .octicon { + float: left; + width: 16px; + text-align: center; + margin-left: -24px; + color: #ccc; + } + .vcard .staff-badge { + position: relative; + top: -1px; + padding: 2px 5px; + font-size: 10px; + font-weight: bold; + color: #fff; + text-transform: uppercase; + background-color: #4078c0; + border-radius: 3px; + } + .member-badge { + display: block; + padding: 10px 0 8px 24px; + font-size: 14px; + color: #4078c0; + border-top: 1px solid #eee; + } + .member-badge .octicon { + float: left; + width: 16px; + margin-left: -24px; + color: #ccc; + text-align: center; + } + .member-badge + .member-badge { + padding-top: 0; + margin-top: -3px; + border-top: 0; + } + .vcard-stats { + margin-bottom: 10px; + padding-top: 15px; + padding-bottom: 15px; + text-align: center; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + } + .vcard-stats:before { + display: table; + content: ""; + } + .vcard-stats:after { + display: table; + clear: both; + content: ""; + } + .vcard-stat { + float: left; + width: 33.333%; + font-size: 11px; + text-transform: capitalize; + } + .vcard-stat-count { + display: block; + font-size: 28px; + font-weight: bold; + line-height: 1; + } + .vcard-stat:hover { + text-decoration: none; + } + .vcard-stat:hover .text-muted { + color: inherit; + } + .new-user-avatar-cta { + padding: 8px 16px; + margin-bottom: 20px; + background-color: #f1f6fb; + color: #244f79; + border: solid 1px #d0e5f8; + border-radius: 3px; + font-size: 14px; + } + .new-user-avatar-cta .btn-sm { + float: right; + margin-left: 30px; + } + .btn-block-user { + color: inherit; + } + .btn-block-user:hover { + text-decoration: none; + } + .steps { + width: 100%; + display: table; + margin: 30px auto 0; + padding: 0; + overflow: hidden; + list-style: none; + border: 1px solid #ddd; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + } + .steps li { + display: table-cell; + width: 33.3%; + padding: 10px 15px; + color: #ccc; + cursor: default; + border-left: 1px solid #ddd; + background-color: #fafafa; + } + .steps li.current { + background-color: #fff; + color: #333; + } + .steps li.current .mega-octicon { + color: #4078c0; + } + .steps li .mega-octicon { + float: left; + margin-right: 15px; + padding-bottom: 5px; + } + .steps li .step { + display: block; + } + .steps li:first-child { + border-left: 0; + } + .steps .complete { + color: #767676; + } + .steps .complete .mega-octicon { + color: #6cc644; + } + .prose-diff .anchor { + display: none; + } + .prose-diff .show-rich-diff { + cursor: pointer; + color: #4183c4; + text-decoration: none; + } + .prose-diff .show-rich-diff:hover { + text-decoration: underline; + } + .prose-diff.collapsed .rich-diff-level-zero.expandable { + cursor: pointer; + } + .prose-diff.collapsed .rich-diff-level-zero.expandable .vicinity { + display: block; + } + .prose-diff.collapsed + .rich-diff-level-zero.expandable + .unchanged:not(.vicinity) { + display: none; + } + .prose-diff.collapsed + .rich-diff-level-zero.expandable:first-child::before { + margin-top: 1em; + } + .prose-diff.collapsed .rich-diff-level-zero.expandable:before { + font-family: "octicons"; + content: "\f039"; + color: #d3d3d3; + display: block; + text-align: center; + font-size: 24px; + letter-spacing: 2px; + line-height: 0; + margin-top: 1em; + margin-bottom: 1em; + padding: 0; + } + .prose-diff.collapsed .rich-diff-level-zero.expandable:hover:before { + color: #000; + } + .prose-diff.collapsed .rich-diff-level-zero.expandable:only-child:before { + content: "Sorry, no visible changes to display."; + color: #d3d3d3; + font-size: 18px; + } + .prose-diff.collapsed + .rich-diff-level-zero.expandable:only-child:hover:before { + color: #000; + } + .prose-diff.collapsed .rich-diff-level-zero.expandable > .removed, + .prose-diff.collapsed .rich-diff-level-zero.expandable > del { + text-decoration: none; + display: none; + } + .prose-diff .markdown-body { + padding: 30px; + padding-left: 15px; + } + .prose-diff .markdown-body > ins { + box-shadow: inset 4px 0 0 #7fcb5c; + } + .prose-diff .markdown-body > del { + box-shadow: inset 4px 0 0 #c94114; + text-decoration: none; + } + .prose-diff .markdown-body > ins, + .prose-diff .markdown-body > del { + display: block; + border-radius: 0; + } + .prose-diff .markdown-body > ins > .rich-diff-level-zero, + .prose-diff .markdown-body > ins > .rich-diff-level-one, + .prose-diff .markdown-body > del > .rich-diff-level-zero, + .prose-diff .markdown-body > del > .rich-diff-level-one { + margin-left: 15px; + } + .prose-diff .markdown-body > ins:first-child *, + .prose-diff .markdown-body > del:first-child * { + margin-top: 0; + } + .prose-diff .rich-diff-level-zero.added { + box-shadow: inset 4px 0 0 #7fcb5c; + } + .prose-diff .rich-diff-level-zero.removed { + box-shadow: inset 4px 0 0 #c94114; + } + .prose-diff .rich-diff-level-zero.changed { + box-shadow: inset 4px 0 0 #ffc045; + } + .prose-diff .rich-diff-level-zero.unchanged, + .prose-diff .rich-diff-level-zero.vicinity { + margin-left: 15px; + } + .prose-diff .rich-diff-level-zero.added, + .prose-diff .rich-diff-level-zero.removed, + .prose-diff .rich-diff-level-zero.changed { + display: block; + border-radius: 0; + } + .prose-diff .rich-diff-level-zero.added > .rich-diff-level-one, + .prose-diff .rich-diff-level-zero.removed > .rich-diff-level-one, + .prose-diff .rich-diff-level-zero.changed > .rich-diff-level-one { + margin-left: 15px; + } + .prose-diff .rich-diff-level-zero.added:first-child *, + .prose-diff .rich-diff-level-zero.removed:first-child *, + .prose-diff .rich-diff-level-zero.changed:first-child * { + margin-top: 0; + } + .prose-diff + :not(.changed) + > :not(.github-user-ins):not(.github-user-del) + > .removed, + .prose-diff + :not(.changed) + > :not(.github-user-ins):not(.github-user-del) + > del { + text-decoration: none; + } + .prose-diff .changed del, + .prose-diff .changed del pre, + .prose-diff .changed del code, + .prose-diff .changed del > div, + .prose-diff .changed .removed, + .prose-diff .changed .removed pre, + .prose-diff .changed .removed code, + .prose-diff .changed .removed > div { + text-decoration: line-through; + color: #a33; + background: #ffeaea; + } + .prose-diff .changed ins, + .prose-diff .changed ins code, + .prose-diff .changed ins pre, + .prose-diff .changed .added { + background: #eaffea; + border-bottom: 1px solid MediumSeaGreen; + } + .prose-diff > .markdown-body .github-user-ins { + text-decoration: underline; + } + .prose-diff > .markdown-body .github-user-del { + text-decoration: line-through; + } + .prose-diff > .markdown-body li ul.added { + background: #eaffea; + } + .prose-diff > .markdown-body li ul.removed { + color: #a33; + background: #ffeaea; + } + .prose-diff > .markdown-body li ul.removed:not(.github-user-ins) { + text-decoration: line-through; + } + .prose-diff > .markdown-body li.added.moved-up:before { + font-family: "octicons"; + content: "\f03d "; + color: #d3d3d3; + } + .prose-diff > .markdown-body li.added.moved-down:before { + font-family: "octicons"; + content: "\f03f "; + color: #d3d3d3; + } + .prose-diff > .markdown-body li.added.moved { + background: #ffffea; + } + .prose-diff > .markdown-body li.removed.moved { + display: none; + } + .prose-diff > .markdown-body pre { + padding: 10px 20px; + } + .prose-diff > .markdown-body th.changed, + .prose-diff > .markdown-body td.changed { + border-left-color: #ddd; + background: #ffffea; + } + .prose-diff > .markdown-body :not(li.moved).removed { + color: #a33; + text-decoration: line-through; + background: #ffeaea; + } + .prose-diff + > .markdown-body + :not(.github-user-ins):not(li.moved).removed { + text-decoration: line-through; + } + .prose-diff > .markdown-body :not(li.moved).added, + .prose-diff > .markdown-body li:not(.moved).added { + background: #eaffea; + } + .prose-diff + > .markdown-body + :not(.github-user-del):not(li.moved).added + li:not(.moved):not(.github-user-del).added { + text-decoration: none; + } + .prose-diff > .markdown-body li:not(.moved).removed { + color: #a33; + background: #ffeaea; + } + .prose-diff + > .markdown-body + li:not(.moved):not(.github-user-ins).removed { + text-decoration: line-through; + } + .prose-diff > .markdown-body .added, + .prose-diff > .markdown-body ins + .added, + .prose-diff > .markdown-body ins { + border-bottom: 0; + border-top: 0; + } + .prose-diff + > .markdown-body + .added:not(.github-user-del):not(.github-user-ins), + .prose-diff + > .markdown-body + ins + + .added:not(.github-user-del):not(.github-user-ins), + .prose-diff + > .markdown-body + ins:not(.github-user-del):not(.github-user-ins) { + text-decoration: none; + } + .prose-diff > .markdown-body img.added, + .prose-diff > .markdown-body img.removed { + border-width: 1px; + border-style: solid; + } + .prose-diff + > .markdown-body + ins + pre:not(.github-user-del):not(.github-user-ins), + .prose-diff + > .markdown-body + ins + code:not(.github-user-del):not(.github-user-ins), + .prose-diff + > .markdown-body + ins + > div:not(.github-user-del):not(.github-user-ins) { + text-decoration: none; + } + .prose-diff > .markdown-body ul > ins, + .prose-diff > .markdown-body ul > del { + display: block; + padding: 0; + } + .prose-diff > .markdown-body .added > li, + .prose-diff > .markdown-body .removed > li { + margin-top: 0; + margin-bottom: 0; + } + span.changed_tag, + em.changed_tag, + strong.changed_tag, + b.changed_tag, + i.changed_tag, + code.changed_tag { + border-bottom: 1px dotted #808080; + border-radius: 0; + } + a.added_href, + a.changed_href, + span.removed_href { + border-bottom: 1px dotted #808080; + border-radius: 0; + } + .diff-view .file-type-prose .rich-diff { + display: none; + } + .diff-view .file-type-prose.display-rich-diff .rich-diff { + display: block; + } + .diff-view .file-type-prose.display-rich-diff .file-diff { + display: none; + } + .pull-request-tab-content { + display: none; + } + .pull-request-tab-content.is-visible { + display: block; + } + .discussion-timeline p.explain { + margin: 0; + font-size: 12px; + } + .pull-request-ref-restore { + display: none; + } + .pull-request-ref-restore .animated-ellipsis-container { + line-height: 16px; + } + .pull-request-ref-restore-text { + display: block; + } + .pull-discussion-timeline.is-pull-restorable + .pull-request-ref-restore.last { + display: block; + } + .signed-out-comment { + margin-top: 15px; + margin-left: 64px; + padding: 15px; + background-color: #fff9ea; + border: solid 1px #dfd8c2; + border-radius: 3px; + } + .signed-out-comment .btn { + vertical-align: baseline; + margin-right: 3px; + } + .inline-comment-form .signed-out-comment { + margin: 5px; + padding: 0; + background-color: transparent; + border: 0; + } + .stale-files-tab { + display: none; + margin-bottom: 10px; + } + .files-bucket { + margin-bottom: 15px; + } + .files-bucket.is-stale .stale-files-tab { + display: block; + } + .pull-request-link { + float: left; + margin-right: 5px; + font-size: 13px; + font-weight: bold; + padding: 0 8px; + height: 26px; + line-height: 26px; + border: 1px solid rgba(65, 131, 196, 0.5); + border-radius: 3px; + } + .pull-request-link:hover { + background: #4078c0; + border-color: #4078c0; + color: #fff; + text-decoration: none; + } + .tabnav-callout { + position: absolute; + top: 4px; + left: 100%; + display: inline-block; + padding: 6px 10px; + margin-left: 3px; + font-weight: bold; + line-height: 1; + white-space: nowrap; + vertical-align: middle; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .tabnav-callout:before { + position: absolute; + top: 50%; + right: 100%; + margin-top: -7px; + display: inline-block; + content: ""; + border: 7px solid transparent; + } + .tabnav-callout .octicon { + vertical-align: text-top; + } + .callout-review { + color: #696143; + background-color: #fceb9b; + } + .callout-review:before { + border-right-color: #fceb9b; + } + .callout-success { + color: #376a20; + background-color: #d8f0cd; + } + .callout-success:before { + border-right-color: #d8f0cd; + } + .header-with-actions { + position: relative; + } + .header-with-actions h3 { + margin-top: 5px; + } + .header-with-actions .select-menu { + float: right; + margin-top: -5px; + } + .header-with-actions .select-menu-modal-holder { + right: 0; + } + .header-with-actions .select-menu-modal { + width: 140px; + } + .pulse-blankslate { + margin-top: 20px; + } + .diffstat-summary { + font-size: 16px; + vertical-align: middle; + border-radius: 3px; + color: #767676; + line-height: 1.8; + text-align: left; + padding: 0 20px 0 0; + } + .diffstat-summary a { + color: #555; + } + .diffstat-summary strong { + color: #333; + } + .pulse-graph { + border-bottom: 1px solid #eee; + float: left; + width: 50%; + padding: 15px 15px 0; + } + .pulse-graph:first-child { + border-right: 1px solid #eee; + } + .authors-and-code .insertions { + color: #6cc644; + } + .authors-and-code .deletions { + color: #bd2c00; + } + .authors-and-code .section { + height: 150px; + display: table-cell; + width: 459px; + } + .pulse-authors-graph { + position: relative; + height: 150px; + } + .pulse-authors-graph > svg { + width: 100%; + } + .pulse-authors-graph .dots { + position: absolute; + top: 40px; + left: 0; + right: 0; + margin: 0 auto; + width: 64px; + height: 64px; + } + .pulse-authors-graph .bar rect { + fill: #c9510c; + fill-opacity: 0.7; + } + .pulse-authors-graph .bar rect:hover { + fill-opacity: 1; + } + .summary-stats li { + list-style-type: none; + display: table-cell; + margin: 0; + width: 229px; + text-align: center; + color: #767676; + border-left: 1px solid #eee; + } + .summary-stats li a { + display: block; + text-decoration: none; + color: #767676; + padding-bottom: 10px; + } + .summary-stats li a:hover { + background: #fafafa; + } + .summary-stats li .octicon-git-pull-request { + color: #6e5494; + } + .summary-stats li .octicon-git-branch { + color: #6cc644; + } + .summary-stats li .octicon-issue-closed { + color: #bd2c00; + } + .summary-stats li .octicon-issue-opened { + color: #6cc644; + } + .summary-stats li:first-child { + border-left: 0; + border-bottom-left-radius: 3px; + } + .summary-stats li .num { + display: block; + padding-top: 10px; + font-size: 16px; + font-weight: bold; + color: #000; + } + .pulse-sections { + clear: both; + margin-top: 20px; + } + .pulse-section { + clear: both; + padding: 0; + font-size: 14px; + color: #666; + } + .pulse-section p { + margin-top: 20px; + } + .radio-group:before { + display: table; + content: ""; + } + .radio-group:after { + display: table; + clear: both; + content: ""; + } + .radio-label { + padding: 0 10px; + height: 34px; + line-height: 34px; + padding-left: 34px; + border: 1px solid #d9d9d9; + margin-left: -1px; + color: #333; + cursor: pointer; + float: left; + } + :checked + .radio-label { + z-index: 1; + position: relative; + border-color: #4078c0; + } + .radio-label .octicon { + padding-right: 5px; + } + .radio-label:first-of-type { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + margin-left: 0; + } + .radio-label:last-of-type { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + padding-right: 16px; + } + .radio-input { + position: absolute; + height: 34px; + margin-left: 12px; + z-index: 3; + } + #readme.contributing > div { + max-height: 250px; + overflow: auto; + } + #readme .markdown-body, + #readme .plain { + background-color: #fff; + border: 1px solid #ddd; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + padding: 30px; + word-wrap: break-word; + } + #readme .plain pre { + font-size: 15px; + white-space: pre-wrap; + } + .file #readme .markdown-body { + border: 0; + padding: 30px; + border-radius: 0; + } + .file #readme table[data-table-type="yaml-metadata"] { + line-height: 1; + font-size: 12px; + } + .file #readme table[data-table-type="yaml-metadata"] table { + margin: 0; + } + .user-recommendations-header { + width: 550px; + margin-top: 40px; + } + .recommendations-intro-wrapper { + height: 96px; + } + .recommendations-outro { + padding: 0 100px; + color: #666; + border: solid 1px #eee; + border-radius: 3px; + } + .recommendations-complete { + display: none; + height: 104px; + padding: 14px 20px; + margin: 30px 0 45px; + font-size: 16px; + border: solid 1px #eee; + border-radius: 3px; + } + .user-recommendations-form { + margin: 30px 0; + } + .user-interests-label { + display: block; + margin-bottom: 10px; + font-size: 17px; + font-weight: bold; + } + .user-interests-input[type="text"] { + width: 100%; + min-height: 40px; + font-size: 16px; + } + .user-interests-examples-wrapper { + height: 21px; + margin-top: 13px; + } + .user-interests-examples { + margin: 0; + color: #767676; + } + .user-interests-examples a { + color: #444; + } + .user-interests-list-wrapper { + height: 41px; + } + .skip-button-wrapper { + display: block; + text-align: center; + } + .button-skip { + height: 30px; + padding: 0 12px; + margin: 0 auto; + font-size: 13px; + font-weight: normal; + line-height: 30px; + color: #666; + background-color: transparent; + background-image: none; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 3px; + } + .button-skip:hover { + background-color: #f5f5f5; + background-image: none; + border-color: rgba(0, 0, 0, 0.15); + } + .user-interests-list { + width: 100%; + text-align: left; + list-style: none; + } + .user-interests-item { + position: relative; + float: left; + height: 41px; + min-height: 41px; + padding: 5px 8px 5px 10px; + margin: 8px; + font-size: 16px; + line-height: 30px; + background-color: #f5f5f5; + border-left: solid 10px #4078c0; + border-radius: 3px; + } + .user-interests-item.hidden { + visibility: hidden; + } + .user-interests-item.loading { + border-left: solid 10px #ddd; + } + .user-interests-item .spinner { + display: inline-block; + width: 16px; + height: 16px; + position: relative; + top: 1px; + } + .user-interests-item .octicon-x { + color: #aaa; + } + .user-interests-item .octicon-x:hover { + color: #4078c0; + text-decoration: none; + } + .remove-user-interest-form { + display: inline-block; + } + .user-interests-item-remove { + border: 0; + background-color: transparent; + outline: none; + } + .recommendations-wrapper { + display: table; + width: 100%; + margin-top: 30px; + border-collapse: collapse; + border-top: solid 1px #eee; + } + .recommendations-wrapper h2 { + margin-top: 30px; + font-size: 18px; + } + .recommendations-wrapper.disabled { + color: #ccc; + } + .recommendations-wrapper.no_users .recommendations-people { + display: none; + } + .recommendations-wrapper.only_repos_users .recommendations-guides, + .recommendations-wrapper.only_repos_users .recommendations-showcases { + display: none; + } + .recommendations-wrapper.only_repos .recommendations-people, + .recommendations-wrapper.only_repos .recommendations-guides, + .recommendations-wrapper.only_repos .recommendations-showcases { + display: none; + } + .recommendations-left { + display: table-cell; + width: 50%; + padding-top: 10px; + padding-right: 30px; + } + .recommendations-right { + display: table-cell; + width: 50%; + padding-top: 10px; + padding-left: 30px; + } + .recommended-repos { + min-height: 500px; + margin-top: 20px; + list-style: none; + } + .recommended-repo-item { + position: relative; + padding-right: 80px; + padding-left: 50px; + margin-bottom: 30px; + } + .recommended-repo-item .starring-container { + position: absolute; + top: 0; + right: 0; + float: right; + } + .recommended-repo-item .author-avatar { + float: left; + margin-top: 5px; + margin-left: -50px; + border-radius: 3px; + } + .recommended-repo-item .repo-meta { + margin-top: 5px; + font-size: 13px; + color: #767676; + } + .recommended-repo-item .meta-info { + margin-right: 10px; + } + .recommended-repo-item .repo-title { + margin-bottom: 4px; + font-size: 23px; + } + .recommended-repo-item .repo-title .repo-author { + font-weight: normal; + } + .recommended-repo-item .repo-title .separator { + margin: 0 3px; + font-weight: normal; + color: #666; + } + .recommended-repo-item .repo-description { + margin-bottom: 4px; + font-size: 15px; + line-height: 1.4; + } + .recommended-repo-item.placeholder .author-avatar { + width: 40px; + height: 40px; + border: dashed 2px #ccc; + } + .recommended-repo-item.placeholder .repo-info { + position: relative; + top: 4px; + display: block; + height: 100px; + border: dashed 2px #ccc; + border-radius: 3px; + } + .language-circle { + position: relative; + top: -2px; + display: inline-block; + width: 12px; + height: 12px; + vertical-align: middle; + border-radius: 50%; + } + .recommended-guides { + margin-top: 22px; + list-style: none; + } + .recommended-guide-item { + margin-bottom: 10px; + font-size: 23px; + } + .recommended-guide-item .mega-octicon { + position: relative; + top: -2px; + color: #aaa; + vertical-align: middle; + } + .recommended-guide-item.placeholder { + height: 48px; + border: dashed 2px #ccc; + border-radius: 3px; + } + .recommended-people-wrapper { + display: table; + width: 100%; + border-collapse: collapse; + } + .recommended-people-left, + .recommended-people-right { + display: table-cell; + width: 48%; + } + .recommended-people-left { + padding-right: 2%; + } + .recommended-people-right { + padding-left: 2%; + } + .recommended-people { + list-style: none; + } + .recommended-person-item { + padding-left: 50px; + margin-bottom: 20px; + font-size: 18px; + } + .recommended-person-item .user-following-container { + margin-top: 5px; + } + .recommended-person-item .avatar { + position: relative; + top: 5px; + float: left; + margin-left: -50px; + } + .recommended-person-item .person-meta { + margin-top: 4px; + font-size: 13px; + color: #767676; + } + .recommended-person-item .meta-info { + margin-right: 10px; + } + .recommended-person-item.placeholder .avatar { + width: 40px; + height: 40px; + border: dashed 2px #ccc; + } + .recommended-person-item.placeholder .person-placeholder { + position: relative; + top: 5px; + display: inline-block; + width: 140px; + height: 40px; + border: dashed 2px #ccc; + border-radius: 3px; + } + .recommended-showcase-link { + display: table; + float: left; + width: 48%; + margin-bottom: 4%; + color: #fff; + } + .recommended-showcase-link:nth-child(2n + 1) { + margin-left: 4%; + } + .recommended-showcase { + display: table-cell; + height: 100px; + font-size: 16px; + text-align: center; + vertical-align: middle; + border-radius: 3px; + } + .releases-tag-list { + width: 100%; + margin-bottom: 20px; + border-top: 1px solid #eee; + } + .releases-tag-list tr { + border-bottom: 1px solid #eee; + } + .releases-tag-list td { + padding: 12px 0; + vertical-align: top; + } + .releases-tag-list td.date { + padding-right: 10px; + white-space: nowrap; + } + .releases-tag-list td.date a { + color: #767676; + } + .releases-tag-list td.main { + padding-right: 10px; + } + .releases-tag-list td.ancillary { + white-space: nowrap; + text-align: right; + } + .releases-tag-list h4 { + margin: 0; + font-size: 14px; + } + .releases-tag-list p { + margin: 0; + color: #767676; + font-size: 13px; + } + .releases-tag-list p a { + color: #666; + font-weight: bold; + } + .tag-info h3 { + margin-top: 0; + margin-bottom: 0; + font-size: 14px; + line-height: 20px; + } + .tag-info h3 a { + color: #666; + } + .tag-info h3 a .tag-name { + color: #000; + } + .tag-references { + margin: 0; + list-style-type: none; + font-size: 13px; + } + .tag-references > li { + margin-right: 10px; + display: inline-block; + } + .tag-references > li.commit { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; + line-height: 20px; + } + .tag-references > li a { + color: #767676; + text-decoration: none; + } + .tag-references > li a:hover { + color: #4078c0; + } + .release-downloads-header { + margin-top: 30px; + } + .release-downloads { + margin-top: 10px; + font-size: 14px; + border-top: 1px solid #eee; + } + .release-downloads li { + display: block; + padding-top: 8px; + padding-bottom: 8px; + border-bottom: 1px solid #eee; + } + .release-downloads .octicon { + margin-top: 2px; + margin-right: 5px; + } + .release-timeline { + position: relative; + border-top: 1px solid #eee; + } + .release-timeline-tags { + list-style-type: none; + } + .release-timeline-tags > li { + display: block; + } + .release-timeline-tags > li:before { + display: table; + content: ""; + } + .release-timeline-tags > li:after { + display: table; + clear: both; + content: ""; + } + .release-timeline-tags .date, + .release-timeline-tags .main { + position: relative; + float: left; + padding: 20px; + } + .release-timeline-tags .main { + width: 80%; + border-left: 2px solid #eee; + } + .release-timeline-tags .date { + width: 20%; + line-height: 40px; + text-align: right; + color: #767676; + padding-left: 0; + } + .release-timeline-tags .date:after { + box-sizing: border-box; + content: " "; + display: block; + position: absolute; + top: 50%; + right: -7px; + z-index: 10; + width: 12px; + height: 12px; + margin-top: -6px; + background-color: #eee; + border: 2px solid #fff; + border-radius: 6px; + } + .release-timeline-tags .octicon-tag { + padding-left: 5px; + color: #ccc; + } + .release-timeline-tags .expander { + position: relative; + display: none; + } + .release-timeline-tags .expander .date { + padding-right: 35px; + line-height: 20px; + } + .release-timeline-tags .expander .date:after { + display: none; + } + .release-timeline-tags .expander .main { + padding-left: 35px; + line-height: 20px; + } + .release-timeline-tags.is-collapsed .expander { + display: block; + } + .release-timeline-tags.is-collapsed > .collapsable { + display: none; + } + .release-timeline-tags .expander-dots { + position: absolute; + top: 18px; + left: -22px; + width: 44px; + text-align: center; + background-color: #eee; + border: 2px solid #fff; + border-radius: 4px; + z-index: 10; + cursor: pointer; + } + .release-timeline-tags .expander-dots .expander-dot { + display: inline-block; + margin-top: -2px; + width: 4px; + height: 4px; + vertical-align: middle; + border-radius: 2px; + background-color: #767676; + } + .release-timeline-tags .expander-text { + font-weight: bold; + color: #666; + cursor: pointer; + } + .release-timeline-tags .expander-text:hover { + color: #4078c0; + } + .release-timeline-tags .expander-text:hover .expander-dots { + background-color: #4078c0; + } + .release-timeline-tags .expander-text:hover .expander-dots .expander-dot { + background-color: #fff; + } + .release:before { + display: table; + content: ""; + } + .release:after { + display: table; + clear: both; + content: ""; + } + .release .tag-references { + margin-top: 8px; + } + .release .tag-references > li { + display: block; + margin: 0 0 5px; + } + .release-meta { + float: left; + width: 20%; + padding: 40px 20px; + text-align: right; + vertical-align: top; + } + .release-body { + float: left; + width: 80%; + padding: 40px 20px; + border-left: 2px solid #eee; + } + .release-body .commit-desc pre { + white-space: pre-line; + } + .release-title { + margin: 0 60px 0 0; + } + .release-edit { + float: right; + } + .release-authorship { + margin-top: 5px; + margin-bottom: 20px; + font-size: 14px; + color: #767676; + } + .release-authorship a { + font-weight: bold; + color: #666; + } + .release-label { + display: inline-block; + margin-top: 1px; + margin-bottom: 10px; + padding: 5px 10px; + font-size: 14px; + font-weight: bold; + color: #fff; + background-color: #000; + border-radius: 3px; + } + .release-label.latest { + background-color: #6cc644; + } + .release-label.draft { + background-color: #bd2c00; + } + .release-label.prerelease { + background-color: #c9510c; + } + .release-label a { + color: #fff; + } + .new-release .sidebar h3 { + margin: 40px 0 -10px; + font-size: 14px; + } + .new-release .sidebar h3:first-child { + margin-top: 15px; + } + .new-release .default, + .new-release .saved, + .new-release .saving, + .new-release .error { + display: none; + } + .new-release .error { + color: #bd2c00; + } + .new-release .is-default .default, + .new-release .is-saving .saving, + .new-release .is-saved .saved, + .new-release .is-failed .error { + display: inline-block; + } + .new-release .saving img { + vertical-align: top; + } + .drop-target .mega-octicon { + vertical-align: middle; + color: #e5e5e5; + } + .drop-target p { + padding: 16px 0; + height: 65px; + font-size: 14px; + text-align: center; + border-color: #ddd; + border-style: dashed; + } + .drop-target .octospinner { + vertical-align: middle; + } + .uploaded-files { + background: #fff; + border-top-right-radius: 3px; + border-top-left-radius: 3px; + } + .uploaded-files.not-populated + .drop-target p { + border-top-right-radius: 3px; + border-top-left-radius: 3px; + border-top: dashed 1px #ccc; + } + .uploaded-files.is-populated { + border: 1px solid #ddd; + border-bottom-color: #e5e5e5; + } + .uploaded-files.is-populated + .drop-target p { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-top: 0; + } + .uploaded-files > li { + list-style-type: none; + margin: 0; + padding: 8px 10px; + border-top: 1px solid #eee; + line-height: 22px; + } + .uploaded-files > li.template { + display: none; + } + .uploaded-files > li .delete-pending { + display: none; + } + .uploaded-files > li.delete { + background: #f9f9f9; + color: #767676; + } + .uploaded-files > li.delete:nth-child(2) { + border-top-right-radius: 3px; + border-top-left-radius: 3px; + } + .uploaded-files > li.delete .delete-pending { + display: block; + } + .uploaded-files > li.delete .live { + display: none; + } + .uploaded-files > li.delete .filename { + color: #bd2c00; + } + .uploaded-files > li:nth-child(2) { + border-top: 0; + } + .uploaded-files .filename { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 11px; + } + .uploaded-files .filesize { + font-size: 12px; + color: #767676; + } + .uploaded-files input[type="text"] { + width: 490px; + margin-right: 6px; + padding: 2px 4px; + border-radius: 2px; + } + .uploaded-files .remove { + float: right; + margin-top: 2px; + color: #767676; + } + .uploaded-files .remove:hover { + color: #bd2c00; + } + .uploaded-files .undo { + float: right; + } + .upload-progress { + background: #fff; + border: 0; + border-radius: 30px; + box-shadow: + 0 1px 1px #fff, + inset 0 1px 1px rgba(255, 255, 255, 0.5); + height: 3px; + margin-top: 3px; + position: relative; + } + .upload-progress .upload-meter { + background-color: #58b8f4; + background-image: -webkit-linear-gradient(#8dd2f7, #58b8f4); + background-image: linear-gradient(#8dd2f7, #58b8f4); + background-repeat: repeat-x; + border-radius: 30px; + height: 100%; + position: absolute; + top: 0; + } + .release-body-form .previewable-comment-form .comment-form-head.tabnav { + padding: 0; + background-color: transparent; + } + .release-body-form .previewable-comment-form .write-content, + .release-body-form .previewable-comment-form .preview-content { + padding: 0 0 10px; + } + .release-tag-form .for-loading, + .release-tag-form .for-empty, + .release-tag-form .for-valid, + .release-tag-form .for-invalid, + .release-tag-form .for-duplicate, + .release-tag-form .for-pending { + display: none; + } + .release-tag-form.is-loading .for-loading { + display: block; + } + .release-tag-form.is-empty .for-empty { + display: block; + } + .release-tag-form.is-valid .for-valid { + display: block; + } + .release-tag-form.is-invalid .for-invalid { + display: block; + } + .release-tag-form.is-duplicate .for-duplicate { + display: block; + } + .release-tag-form.is-pending .for-pending { + display: block; + } + .release-target-wrapper { + display: inline-block; + } + .release-target-wrapper.hidden { + display: none; + } + .releases-target-menu { + display: inline-block; + margin-left: 5px; + } + .releases-target-menu .btn-sm { + line-height: 32px; + } + .releases-target-menu .select-menu-button:before { + top: 14px; + } + .release-show { + border-top: 1px solid #eee; + } + .release-show .release-edit { + display: none; + } + .render-container { + background: #ddd; + text-align: center; + padding: 30px; + line-height: 0; + } + .render-container .render-viewer { + border: 0; + display: none; + width: 100%; + height: 100%; + } + .render-container .octospinner { + display: none; + } + .render-container .render-viewer-error, + .render-container .render-viewer-fatal, + .render-container .render-viewer-invalid { + display: none; + } + .render-container.is-render-automatic .octospinner { + display: inline-block; + } + .render-container.is-render-requested .octospinner { + display: inline-block; + } + .render-container.is-render-requested.is-render-failed + .render-viewer-error { + display: inline-block; + } + .render-container.is-render-requested.is-render-failed .render-viewer, + .render-container.is-render-requested.is-render-failed + .render-viewer-fatal, + .render-container.is-render-requested.is-render-failed + .render-viewer-invalid, + .render-container.is-render-requested.is-render-failed .octospinner { + display: none; + } + .render-container.is-render-requested.is-render-failed-fatal + .render-viewer-fatal { + display: inline-block; + } + .render-container.is-render-requested.is-render-failed-fatal + .render-viewer, + .render-container.is-render-requested.is-render-failed-fatal + .render-viewer-error, + .render-container.is-render-requested.is-render-failed-fatal + .render-viewer-invalid + .octospinner { + display: none; + } + .render-container.is-render-requested.is-render-failed-invalid + .render-viewer-invalid { + display: inline-block; + } + .render-container.is-render-requested.is-render-failed-invalid + .render-viewer, + .render-container.is-render-requested.is-render-failed-invalid + .render-viewer-error, + .render-container.is-render-requested.is-render-failed-invalid + .render-viewer-fatal, + .render-container.is-render-requested.is-render-failed-invalid + .octospinner { + display: none; + } + .render-container.is-render-ready.is-render-requested:not( + .is-render-failed + ) { + background: none; + height: 500px; + padding: 0; + } + .render-container.is-render-ready.is-render-requested:not( + .is-render-failed + ) + .render-viewer { + display: block; + } + .render-container.is-render-ready.is-render-requested:not( + .is-render-failed + ) + .render-viewer-error, + .render-container.is-render-ready.is-render-requested:not( + .is-render-failed + ) + .render-viewer-fatal, + .render-container.is-render-ready.is-render-requested:not( + .is-render-failed + ) + .octospinner { + display: none; + } + .render-notice { + padding: 20px 15px; + font-size: 14px; + color: #4c4a42; + background-color: #fff9ea; + border-color: #dfd8c2; + } + .pagehead.repohead.mirror h1, + .pagehead.repohead.fork h1 { + margin-top: -5px; + margin-bottom: 15px; + height: auto; + } + .pagehead.repohead h1 { + color: #666; + padding-left: 34px; + position: relative; + float: left; + } + .pagehead.repohead h1.private .mega-octicon:before { + color: #e9dba5; + } + .pagehead.repohead h1 .octicon-lock, + .pagehead.repohead h1 .octicon-repo, + .pagehead.repohead h1 .octicon-mirror, + .pagehead.repohead h1 .octicon-repo-forked, + .pagehead.repohead h1 .octicon-gist, + .pagehead.repohead h1 .octicon-gist-secret { + position: absolute; + left: 0; + top: 12px; + line-height: 32px; + margin-top: -13px; + color: #bbb; + } + .pagehead.repohead .octicon-mirror { + left: -3px; + } + .pagehead.repohead .octicon-lock { + top: 10px; + } + .pagehead.repohead span.fork-flag, + .pagehead.repohead span.mirror-flag { + display: block; + font-size: 11px; + line-height: 10px; + white-space: nowrap; + } + .mini-repo-list { + list-style: none; + } + .mini-repo-list > li:first-child .mini-repo-list-item { + border-top: 0; + } + .mini-repo-list > li:last-child .mini-repo-list-item { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + .mini-repo-list .no-repo { + padding: 15px; + color: #767676; + text-align: center; + } + .mini-repo-list .repo-name { + font-weight: bold; + } + .mini-repo-list-item { + position: relative; + display: block; + padding: 6px 64px 6px 30px; + font-size: 14px; + border-top: 1px solid #e5e5e5; + } + .mini-repo-list-item:hover { + text-decoration: none; + } + .mini-repo-list-item:hover .repo, + .mini-repo-list-item:hover .owner { + text-decoration: underline; + } + .mini-repo-list-item .repo-icon { + float: left; + margin-top: 2px; + margin-left: -20px; + color: #666; + } + .mini-repo-list-item .repo-and-owner { + max-width: 220px; + } + .mini-repo-list-item .owner { + max-width: 110px; + } + .mini-repo-list-item .repo { + font-weight: bold; + } + .mini-repo-list-item .stars { + position: absolute; + top: 0; + right: 10px; + margin-top: 6px; + font-size: 12px; + color: #888; + } + .mini-repo-list-item .repo-description { + display: block; + max-width: 100%; + font-size: 12px; + color: #767676; + line-height: 21px; + } + .popular-repos .mini-repo-list-item .stars { + margin-top: 16px; + } + .popular-repos .no-description .mini-repo-list-item { + padding-top: 17px; + padding-bottom: 16px; + } + .private .mini-repo-list-item { + background-color: #fff9ea; + } + .private .mini-repo-list-item .repo-icon { + color: #a1882b; + } + .filter-bar { + padding: 10px; + background-color: #fafafa; + border-bottom: 1px solid #e5e5e5; + } + .filter-bar:before { + display: table; + content: ""; + } + .filter-bar:after { + display: table; + clear: both; + content: ""; + } + .filter-bar .filter-input { + width: 100%; + min-height: 26px; + padding: 3px 10px; + font-size: 11px; + border-radius: 12px; + } + .user-repos .filter-bar { + text-align: center; + } + .filter-repos { + padding-bottom: 0; + } + .repo-filterer { + display: inline-block; + margin-top: 6px; + list-style: none; + } + .repo-filterer li { + display: inline-block; + } + .repo-filterer .repo-filter { + display: inline-block; + padding: 5px 5px 6px; + margin-right: 5px; + font-size: 11px; + color: #767676; + border-bottom: 2px solid transparent; + } + .repo-filterer .repo-filter:hover { + text-decoration: none; + border-bottom-color: #e5e5e5; + } + .repo-filterer .repo-filter.filter-selected { + color: #333; + text-decoration: none; + border-bottom-color: #d26911; + outline: none; + } + .more-repos { + text-align: center; + box-shadow: inset 0 1px 0 #e5e5e5; + } + .more-repos img { + margin: 11px auto; + } + .more-repos-link { + display: block; + padding: 10px; + color: #7aa1d3; + } + .more-repos-link:hover { + color: #4078c0; + text-decoration: none; + } + .more-repos-link.is-loading { + text-indent: -9999px; + cursor: default; + background-image: url(/images/spinners/octocat-spinner-16px.gif); + background-repeat: no-repeat; + background-position: center center; + } + @media only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (min-device-pixel-ratio: 2), + only screen and (min-resolution: 2dppx) { + .more-repos-link.is-loading { + background-image: url(/images/spinners/octocat-spinner-32.gif); + background-size: 16px 16px; + } + } + .empty-repo { + font-size: 14px; + } + .empty-repo .url-box { + display: block; + width: 100%; + height: auto; + padding: 0; + margin: 0; + border: 0; + } + .empty-repo .clone-urls { + width: 100%; + } + .empty-repo .or-text { + margin-right: 5px; + margin-left: 5px; + } + .empty-repo-setup-option .copyable-terminal-content { + font-size: 14px; + } + .empty-repo-setup-option h3 { + margin-top: 0; + } + .empty-repo-setup-option p:last-child { + margin-bottom: 0; + } + .give-access-setup-option { + margin-bottom: 20px; + } + #change_default_branch { + clear: left; + } + #change_default_branch dt, + #change_default_branch dd { + float: left; + } + #change_default_branch dt { + margin: 0 30px 0 0; + } + .timeout { + width: auto; + height: 300px; + padding: 0; + margin: 20px 0; + background-color: transparent; + border: 0; + } + .timeout h3 { + padding-top: 100px; + color: #767676; + } + .repo-container { + min-height: 345px; + } + .repo-nav .counter { + display: none; + } + .repo-nav .full-word { + display: none; + } + .with-full-navigation .repo-nav .counter { + display: block; + } + .with-full-navigation .repo-nav .full-word { + display: inline-block; + width: 128px; + vertical-align: top; + } + .only-with-full-nav { + display: none; + } + .with-full-navigation .only-with-full-nav { + display: block; + } + .repository-with-sidebar:before { + display: table; + content: ""; + } + .repository-with-sidebar:after { + display: table; + clear: both; + content: ""; + } + .repository-with-sidebar .repository-sidebar { + float: right; + width: 38px; + } + .repository-with-sidebar .repository-sidebar .sidebar-button { + width: 100%; + margin: 0 0 10px; + text-align: center; + } + .repository-with-sidebar .repository-sidebar h3 { + margin-bottom: 5px; + font-size: 11px; + font-weight: normal; + color: #767676; + } + .repository-with-sidebar .repository-sidebar .clone-url { + display: none; + margin-top: -5px; + } + .repository-with-sidebar .repository-sidebar .clone-url.open { + display: block; + } + .repository-with-sidebar .repository-sidebar .clone-options { + margin: 8px 0 15px; + font-size: 11px; + color: #666; + } + .repository-with-sidebar + .repository-sidebar + .clone-options + .octicon-question { + position: relative; + bottom: 1px; + font-size: 11px; + color: #000; + cursor: pointer; + } + .repository-with-sidebar .repository-content { + float: left; + width: 920px; + } + .repository-with-sidebar.with-full-navigation .repository-content { + width: 790px; + } + .repository-with-sidebar.with-full-navigation .repository-sidebar { + width: 170px; + } + .repository-with-sidebar.with-full-navigation + .sunken-menu-group + .tooltipped:before, + .repository-with-sidebar.with-full-navigation + .sunken-menu-group + .tooltipped:after { + display: none; + } + .overall-summary { + position: relative; + margin-bottom: 10px; + border: 1px solid #ddd; + border-radius: 3px; + } + .overall-summary-bottomless { + margin-bottom: 0; + border-bottom: 0; + border-radius: 3px 3px 0 0; + } + .numbers-summary li { + display: table-cell; + width: 1%; + padding: 0; + margin: 0; + text-align: center; + white-space: nowrap; + list-style-type: none; + } + .numbers-summary a, + .numbers-summary .nolink { + display: block; + padding: 10px 0; + color: #767676; + text-decoration: none; + } + .numbers-summary .octicon { + opacity: 0.5; + } + .numbers-summary a:hover { + color: #4078c0; + } + .numbers-summary a:hover .num { + color: inherit; + } + .repo-private-label { + display: inline-block; + padding: 4px 5px 3px; + font-size: 11px; + font-weight: 300; + line-height: 11px; + color: #a1882b; + text-transform: uppercase; + vertical-align: middle; + background-color: #ffefc6; + border-radius: 3px; + } + .repository-meta { + margin: 0 0 13px; + } + .repository-meta:before { + display: table; + content: ""; + } + .repository-meta:after { + display: table; + clear: both; + content: ""; + } + .repository-meta p { + margin: 0; + } + .repository-meta .repository-description { + display: inline; + font-size: 16px; + color: #666; + word-wrap: break-word; + } + .repository-meta .repository-website { + display: inline-block; + font-size: 16px; + } + .repository-meta .edit-link { + font-size: 16px; + color: #767676; + } + .repository-meta .edit-link a { + color: #767676; + } + .repository-meta .repo-description-field { + width: 380px; + } + .repository-meta .repo-website-field { + width: 270px; + } + .repository-meta .edit-repository-meta { + display: none; + margin-bottom: 5px; + } + .repository-meta .edit-repository-meta .field { + display: inline-block; + margin-right: 5px; + } + .repository-meta .edit-repository-meta label { + display: block; + margin-bottom: 6px; + font-weight: bold; + color: #333; + } + .repository-meta.open .repository-description, + .repository-meta.open .repository-website, + .repository-meta.open .edit-link { + display: none; + } + .repository-meta.open .edit-repository-meta { + display: block; + } + .file-navigation:before { + display: table; + content: ""; + } + .file-navigation:after { + display: table; + clear: both; + content: ""; + } + .file-navigation .select-menu, + .file-navigation .btn-group, + .file-navigation .breadcrumb { + margin-bottom: 10px; + } + .file-navigation.in-mid-page { + margin-top: 10px; + } + .file-navigation .select-menu { + margin-right: 10px; + } + .file-navigation .breadcrumb { + float: left; + margin-top: 0; + } + .file-navigation .breadcrumb .octicon-btn.disabled { + color: #bbb; + cursor: default; + } + .file-navigation .breadcrumb .octicon-btn.disabled:hover { + color: #bbb; + } + .file-navigation .btn-group { + margin-left: 10px; + } + .file-navigation .compare-button { + margin-right: 5px; + } + .iconbutton .octicon { + margin-right: 0; + } + .file-wrap { + margin-bottom: 10px; + border: 1px solid #ddd; + border-top: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + } + .file-wrap .include-fragment-error { + display: none; + } + .file-wrap.is-error .include-fragment-error { + display: table-row; + } + table.files { + width: 100%; + background: #f8f8f8; + border-radius: 2px; + } + table.files td { + padding: 6px 3px; + line-height: 20px; + border-top: 1px solid #eee; + } + table.files td.icon { + width: 17px; + padding-right: 2px; + padding-left: 10px; + color: #767676; + } + table.files td.icon .octicon-file-directory { + color: #80a6cd; + } + table.files td.icon .spinner { + position: relative; + top: 3px; + display: none; + margin-top: -3px; + margin-left: -2px; + } + table.files td .simplified-path { + color: #888; + } + table.files td .css-truncate { + max-width: 100%; + } + table.files td.content { + max-width: 180px; + } + table.files td.message { + max-width: 442px; + padding-left: 10px; + overflow: hidden; + color: #888; + } + table.files td.message .emoji { + vertical-align: top; + } + table.files td.message a { + color: #888; + } + table.files td.message a:hover { + color: #4078c0; + } + table.files td.age { + max-width: 140px; + padding-right: 10px; + color: #888; + text-align: right; + white-space: nowrap; + } + table.files tr.is-loading td.icon .octicon { + display: none; + } + table.files tr.is-loading td.icon .spinner { + display: inline-block; + } + table.files tr.up-tree { + border-bottom: 1px solid #eee; + } + table.files tr.up-tree a { + padding: 3px 6px; + margin-left: -3px; + font-weight: bold; + border-radius: 2px; + } + table.files tr.up-tree a:hover { + background-color: #eee; + } + table.files tbody tr:first-child td { + border-top: 0; + } + .branch-infobar { + padding: 8px 8px 7px; + font-size: 11px; + font-weight: bold; + color: #767676; + background: #fafafa; + border: 1px solid #ccc; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + .branch-infobar p { + float: left; + margin: 0; + } + .branch-infobar .lightweight-actions { + float: right; + list-style-type: none; + } + .branch-infobar .lightweight-actions > li { + display: inline-block; + margin: 0 0 0 10px; + } + .branch-infobar .lightweight-actions > li a { + color: #767676; + text-decoration: none; + } + .branch-infobar .lightweight-actions > li a:hover { + color: #333; + } + .branch-infobar .lightweight-actions > li .octicon { + font-size: 14px; + color: #bbb; + } + .branch-infobar + .commit-tease { + border-top: 0; + border-radius: 0; + } + .fork-select-fragment { + text-align: center; + } + .spinner-forking { + display: block; + margin: 20px auto 40px; + } + .prereceive-feedback { + padding: 15px; + margin-bottom: 15px; + border: 1px solid #ddd; + border-left: 3px solid #cea61b; + border-radius: 3px; + } + .prereceive-feedback-heading { + margin-top: 0; + margin-bottom: 10px; + color: #cea61b; + } + .url-box { + width: 100%; + margin-top: 10px; + margin-left: -10px; + padding: 10px 10px 0; + border-top: 1px solid #ddd; + height: 26px; + } + .url-box p { + float: left; + margin: 0 0 0 5px; + height: 26px; + line-height: 26px; + font-size: 11px; + color: #666; + } + .url-box p strong { + color: #000; + } + .clone-urls { + display: table; + float: left; + width: 585px; + } + .clone-url-button { + display: table-cell; + width: 1%; + vertical-align: top; + } + .clone-url-button:first-child .clone-url-link { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + } + .clone-url-button > .clone-url-link { + position: relative; + display: block; + padding: 0 9px; + margin-right: -1px; + font-size: 11px; + font-weight: bold; + line-height: 24px; + color: #333; + text-decoration: none; + text-shadow: 0 1px 0 #fff; + background-color: #eaeaea; + background-image: -webkit-linear-gradient(#fafafa, #eaeaea); + background-image: linear-gradient(#fafafa, #eaeaea); + background-repeat: repeat-x; + border: 1px solid #ccc; + white-space: nowrap; + cursor: pointer; + } + .clone-url-button > .clone-url-link:hover, + .clone-url-button > .clone-url-link:active { + z-index: 3; + color: #fff; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #3072b3; + background-image: -webkit-linear-gradient(#599bcd, #3072b3); + background-image: linear-gradient(#599bcd, #3072b3); + background-repeat: repeat-x; + border-color: #2a65a0; + } + .clone-url-button > .clone-url-link:active { + background-color: #3072b3; + background-image: none; + border-color: #25588c; + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.15); + } + .clone-url-button > .clone-url-link:focus { + outline: 0; + } + .clone-url-button + .clone-url-button > .clone-url-link { + box-shadow: inset 1px 0 0 #fff; + } + .clone-url-button + .clone-url-button > .clone-url-link:hover { + box-shadow: none; + } + .clone-url-button + .clone-url-button > .clone-url-link:active { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.15); + } + .clone-url-button.selected > .clone-url-link, + .clone-url-button.selected > .clone-url-link:hover { + z-index: 2; + color: #333; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6); + border-color: #bbb; + background-image: none; + background-color: #ccc; + background-color: #d5d5d5; + background-image: -webkit-linear-gradient(#ccc, #d5d5d5); + background-image: linear-gradient(#ccc, #d5d5d5); + background-repeat: repeat-x; + box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.075); + } + input.url-field { + position: relative; + width: 100%; + min-height: 26px; + padding: 0 5px; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; + border-radius: 0; + } + input.url-field:focus { + z-index: 2; + } + .url-box-clippy .zeroclipboard-button { + border-radius: 0 3px 3px 0; + border-left: 0; + margin-left: 0 !important; + } + .pagehead.repohead .select-menu .select-menu-modal-holder { + z-index: 25; + } + .auth-overview .sum { + font-weight: bold; + } + .auth-section { + padding: 15px 0; + border-top: 1px solid #eee; + } + .auth-section:first-child { + border-top: 0; + } + .auth-section:last-child { + padding-bottom: 0; + } + .auth-section .inline-error { + color: #999; + } + .audit-log-activity { + height: 75px; + } + .audit-log-activity .audit-day rect { + fill: #1db34f; + shape-rendering: crispedges; + } + .audit-log-activity .audit-day .bar-base { + fill: #767676; + } + .audit-log-activity text { + fill: #767676; + font-size: 10px; + text-anchor: middle; + } + .audit-log-map-container { + position: relative; + margin-bottom: 10px; + } + .audit-log-map-container .activity { + position: absolute; + text-align: center; + z-index: 99999; + top: 120px; + left: 450px; + display: none; + } + .audit-log-map-container .is-graph-loading .activity { + display: block; + } + .audit-search-form { + position: relative; + } + .audit-search-form:before { + display: table; + content: ""; + } + .audit-search-form:after { + display: table; + clear: both; + content: ""; + } + .audit-search-form .suggester-container { + top: 0; + left: 0; + } + .audit-log-map { + overflow: hidden; + height: 325px; + border-radius: 3px; + box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.2); + background-color: #4078c0; + } + .map-background { + fill: #4078c0; + cursor: -webkit-grab; + cursor: grab; + pointer-events: all; + } + .land { + fill: none; + stroke: #256aae; + stroke-width: 2; + shape-rendering: crispedges; + } + .country { + cursor: pointer; + fill: #d7c7ad; + shape-rendering: crispedges; + } + .country.hk { + stroke: #a5967e; + } + .country:hover { + fill: #c8b28e; + } + .country.active { + fill: #f6e5ca; + } + .borders { + fill: none; + stroke: #a5967e; + shape-rendering: crispedges; + } + .graticule { + pointer-events: none; + fill: none; + stroke: #fff; + stroke-opacity: 0.2; + shape-rendering: crispedges; + } + .graticule :nth-child(2n) { + stroke-dasharray: 2, 2; + } + .security-map-legend circle { + stroke: #fff; + stroke-width: 1.5; + fill-opacity: 0; + } + .security-map-legend text { + fill: #fff; + font-size: 10px; + text-anchor: end; + } + .security-map-legend .link { + stroke-width: 1.5; + stroke: #fff; + } + .audit-point { + pointer-events: none; + fill: #bd2c00; + fill-opacity: 0.8; + stroke: #bd2c00; + } + .country-info { + opacity: 0; + position: absolute; + top: 10px; + right: 10px; + padding: 10px; + pointer-events: none; + background: rgba(255, 255, 255, 0.9); + border-radius: 2px; + } + .audit-log-search { + position: relative; + margin-top: 25px; + } + .audit-log-search .member-info { + width: 500px; + } + .audit-log-search .member-info .member-avatar { + float: left; + margin-right: 15px; + } + .audit-log-search .member-info .member-link { + display: inline-block; + } + .audit-log-search .member-info .member-list-avatar { + margin-right: 0; + } + .audit-log-search .member-info .ghost { + color: #767676; + display: inline-block; + } + .audit-log-search .audit-action-info { + margin-left: 50px; + } + .audit-log-search .audit-action-info a { + color: #4078c0; + } + .audit-log-search .blankslate { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + .audit-results-header { + padding: 15px 10px 15px 15px; + border: 1px solid #dcdcdc; + border-bottom: 0; + background-color: #f7f7f7; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + .audit-results-header h2 { + display: inline-block; + padding: 0; + margin: 0; + font-size: 16px; + } + .audit-results-header .audit-search-form { + margin-top: -8px; + } + .audit-search-clear { + padding: 10px; + border: 1px solid #e5e5e5; + border-bottom: 0; + } + .audit-search-clear .issues-reset-query { + margin-bottom: 0; + } + .audit-action-info { + margin-top: 3px; + font-weight: normal; + font-size: 12px; + color: #767676; + } + .audit-action-info .context { + color: #333; + } + .audit-type { + width: 200px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + .audit-type .octicon { + float: left; + margin-right: 3px; + font-weight: normal; + } + .audit-type .repo { + color: #c9510c; + } + .audit-type .team { + color: #6cc644; + } + .audit-type .user { + color: #6e5494; + } + .audit-type .oauth_access { + color: #bd2c00; + } + .audit-type .hook { + color: #e1bf4e; + } + .export-actions { + display: inline-block; + margin-left: 15px; + } + .export-actions a { + color: #999; + margin-top: -3px; + } + .export-actions a:hover { + color: #4078c0; + text-decoration: none; + } + .export-actions .select-menu-button:after { + position: absolute; + right: 15px; + top: 50%; + margin-top: -2px; + } + .export-actions .select-menu-modal { + width: 111px; + } + .export-actions .select-menu-item-text { + padding: 8px 0; + text-align: center; + } + .export-phrase { + margin-top: 5px; + } + .export-phrase pre { + border-left: 1px solid #eee; + color: #666; + font-size: 11px; + padding-left: 10px; + white-space: pre-wrap; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + } + .audit-log-export-button { + -webkit-transition: 0.25s width ease-in-out; + transition: 0.25s width ease-in-out; + width: 110px; + height: 34px; + } + .audit-log-export-button .loader { + display: none; + position: absolute; + left: 11px; + top: 50%; + margin-top: -9px; + } + .audit-log-export-button .octicon { + position: absolute; + left: 11px; + top: 50%; + margin-top: -9px; + } + .audit-log-export-button .audit-log-export-status { + position: absolute; + left: 35px; + top: 7px; + } + .audit-log-export-button.disabled { + width: 125px; + } + .audit-log-export-button.disabled:after { + display: none; + } + .audit-log-export-button.disabled .octicon { + display: none; + } + .audit-log-export-button.disabled .loader { + display: block; + } + .full-export .audit-log-export-button { + width: 137px; + } + .full-export.export-actions .select-menu-modal { + width: 137px; + } + .context-loader-container .large-format-loader { + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + padding-top: 190px; + background: rgba(255, 255, 255, 0.8); + z-index: 9999; + text-align: center; + color: #767676; + } + .profile-picture { + margin: 10px 0 0; + } + .profile-picture p { + float: left; + margin-top: 7px; + } + .profile-picture img { + float: left; + margin: 0 10px 0 0; + border-radius: 3px; + } + .app-owner { + margin: 10px 0 -10px; + } + .edit-profile-avatar .drag-and-drop { + padding: 0; + color: #666; + border-width: 0; + } + .edit-profile-avatar input { + cursor: pointer; + } + .edit-profile-avatar.is-bad-file { + border: 0; + } + .edit-profile-avatar .manual-file-chooser { + position: absolute; + top: 0; + left: 0; + width: 146px; + height: 34px; + margin-left: 0; + padding: 0; + cursor: pointer; + } + .button-change-profile-picture { + overflow: hidden; + } + .croppable-avatar { + display: none; + } + .profile-picture-cropper { + max-width: 400px; + text-align: center; + margin: 0 auto 15px; + } + .profile-picture-cropper > img { + max-width: 100%; + } + .profile-picture-cropper .jcrop-holder { + display: inline-block; + } + .profile-picture-spinner { + display: inline-block; + background-image: url(/images/spinners/octocat-spinner-128.gif); + background-repeat: no-repeat; + background-position: center; + background-size: 64px 64px; + } + .profile-picture-spinner.hidden { + display: none; + } + .avatar-upload { + float: left; + width: 340px; + margin-left: 20px; + } + .avatar-upload .flash { + width: 100%; + padding: 30px 15px; + border: dashed 1px #bd2c00; + box-shadow: none; + } + .avatar-upload .upload-state { + display: none; + padding: 10px 0; + } + .avatar-upload .upload-state p { + margin: 0; + font-size: 12px; + color: #767676; + } + .avatar-upload .avatar-upload .octicon { + display: inline-block; + } + .is-default .avatar-upload .default { + display: block; + } + .is-uploading .avatar-upload .loading { + display: block; + padding: 0; + } + .is-uploading .avatar-upload .loading img { + vertical-align: top; + } + .is-uploading .avatar-upload .button-change-profile-picture { + display: none; + } + .is-bad-file .avatar-upload .bad-file { + display: block; + margin: 0; + } + .is-too-big .avatar-upload .too-big { + display: block; + margin: 0; + } + .is-bad-dimensions .avatar-upload .bad-dimensions { + display: block; + margin: 0; + } + .is-failed .avatar-upload .failed-request { + display: block; + margin: 0; + } + .is-empty .avatar-upload .file-empty { + display: block; + margin: 0; + } + .is-bad-browser .avatar-upload .bad-browser { + display: block; + margin: 0; + } + dl.new-email-form { + padding: 10px 10px 0; + margin: 0 -10px 10px; + border-top: 1px solid #e5e5e5; + } + span.label.default { + margin-left: 4px; + padding: 4px 6px; + background-color: #6cc644; + color: #fff; + border-radius: 3px; + } + span.label.visibility { + margin-left: 4px; + padding: 4px 6px; + background-color: #999; + color: #fff; + border-radius: 3px; + } + span.label.bouncing { + margin-left: 4px; + padding: 4px 6px; + background-color: #daa520; + color: #fff; + border-radius: 3px; + } + .email-actions { + float: right; + } + .email-actions > span { + float: left; + } + .email-actions form { + display: inline; + } + .email-actions span.label { + font-size: 13px; + color: #767676; + padding: 0 10px; + } + .email-actions .octicon-alert { + color: #ca5633; + } + .boxed-group .fork-flag { + margin-left: 16px; + font-size: 12px; + color: #767676; + } + li.ssh-key { + position: relative; + line-height: 18px; + padding: 15px; + } + li.ssh-key .btn { + float: right; + margin-top: 4px; + } + li.ssh-key .team-label-ldap { + float: right; + } + li.ssh-key .ssh-key-state-indicator { + float: left; + width: 8px; + height: 8px; + margin-top: 10px; + border-radius: 5px; + } + li.ssh-key .ssh-key-state-indicator.recent { + background-color: #6cc644; + box-shadow: 0 0 10px rgba(108, 198, 68, 0.5); + } + li.ssh-key .ssh-key-state-indicator.not-recent { + box-shadow: 0 1px 0 #fff; + background-color: #ccc; + background-image: -webkit-linear-gradient(#aaa, #ccc); + background-image: linear-gradient(#aaa, #ccc); + background-repeat: repeat-x; + } + li.ssh-key .ssh-key-icon { + float: left; + width: 32px; + margin-top: 1px; + margin-left: 15px; + text-align: center; + } + .ssh-key-details { + position: relative; + margin-left: 70px; + margin-right: 150px; + } + .ssh-key-details .ssh-key-title { + display: block; + max-width: 360px; + } + .ssh-key-fingerprint { + display: block; + font-weight: normal; + color: #767676; + } + #notification-center .overview { + padding: 0 10px 10px; + border-bottom: 1px solid #ddd; + } + .oauth-stats dl.keys { + float: right; + margin: 0; + text-align: right; + } + .oauth-stats dl.keys dt { + color: #767676; + font-weight: bold; + } + .oauth-stats dl.keys dd { + color: #333; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + } + .user-count { + float: left; + margin: 12px 0 0; + font-size: 36px; + color: #767676; + font-weight: 300; + } + .access-token-group .boxed-group-inner .help { + margin-top: 0; + } + .access-token .zeroclipboard-link { + display: inline-block; + } + .access-token.new-token { + background-color: rgba(108, 198, 68, 0.1); + } + .access-token.new-token .octicon-check { + color: #6cc644; + } + .access-token .token-description { + max-width: 450px; + } + .access-token .token { + font-size: 14px; + } + .token-scope { + display: inline-block; + width: 220px; + margin: 0; + padding: 5px 0 5px 20px; + color: #333; + } + .callback-urls dl dd input[type="text"] { + width: 100%; + } + .callback-urls.has-many .callback-url-action-cell { + display: table-cell; + } + .callback-description { + margin-top: 20px; + } + .callback-description .octicon { + padding-left: 0; + } + .callback-url .label { + display: none; + width: 64px; + text-align: center; + } + .callback-url.is-default-callback .label { + display: inline-block; + } + .callback-url.is-default-callback .btn { + display: none; + } + .callback-url-wrap { + display: table; + width: 100%; + } + .callback-url-field-cell { + display: table-cell; + } + .callback-url-action-cell { + display: none; + width: 70px; + text-align: right; + } + .boxed-group.application-show-group .logo-upload { + float: right; + width: 142px; + background-color: #eee; + position: relative; + } + .boxed-group.application-show-group .logo-upload a.delete { + position: absolute; + right: 0; + padding: 5px; + display: none; + } + .boxed-group.application-show-group .logo-upload a.delete:hover { + color: #bd2c00; + } + .boxed-group.application-show-group .logo-box { + border: 1px solid #ccc; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + height: 140px; + } + .boxed-group.application-show-group .logo-box img { + height: 140px; + width: 140px; + border-radius: 2px 2px 0 0; + display: none; + } + .boxed-group.application-show-group .logo-placeholder { + height: 140px; + width: 140px; + color: #767676; + text-align: center; + text-shadow: 0 1px 0 #fff; + } + .boxed-group.application-show-group .logo-placeholder span { + margin: 45px 0 0; + } + .boxed-group.application-show-group .logo-placeholder p { + margin: 0; + font-size: 16px; + } + .boxed-group.application-show-group .has-uploaded-logo .logo-placeholder, + .boxed-group.application-show-group .has-uploaded-logo .or { + display: none; + } + .boxed-group.application-show-group .has-uploaded-logo:hover a.delete { + display: block; + } + .boxed-group.application-show-group .has-uploaded-logo .logo-box img { + display: block; + } + .boxed-group.application-show-group dl.form > dd input[type="text"].wide { + width: 460px; + } + .boxed-group.application-show-group + dl.form + > dd + input[type="textarea"].short { + height: 50px; + min-height: 50px; + } + .application-show-group .errored .note { + display: none; + } + .application-show-group .drag-and-drop { + padding: 8px 5px 7px; + text-align: center; + } + .application-show-group .drag-and-drop img { + vertical-align: bottom; + margin-bottom: 1px; + } + .application-show-group .drag-and-drop span { + padding: 0; + } + .application-show-group .dragover .logo-box { + box-shadow: #c9ff00 0 0 3px; + } + .application-show-group .is-uploading .loading { + display: block; + } + .application-show-group .is-uploading .default { + display: none; + } + .application-show-group .is-failed .failed-request { + display: block; + } + .application-show-group .is-failed .default { + display: none; + } + .application-show-group .is-bad-file .bad-file { + display: block; + } + .application-show-group .is-bad-file .default { + display: none; + } + .application-show-group .is-too-big .file-too-big { + display: block; + } + .application-show-group .is-too-big .default { + display: none; + } + .application-show-group .is-default .default { + display: block; + } + .security-history .security-history-timestamp { + float: right; + color: #767676; + } + table.security-history-detail { + width: 100%; + font-size: 12px; + } + table.security-history-detail td { + max-width: 200px; + word-wrap: break-word; + } + .org-two-factor .btn { + float: right; + margin: 10px 0 0 20px; + } + .org-two-factor .flash-global { + margin-top: 0; + } + .two-factor-disabled .flash-global { + display: block; + } + .settings-email .email-actions .settings-remove-email { + float: right; + margin-left: 5px; + padding-right: 7px; + padding-left: 7px; + line-height: 24px; + color: #bd2c00; + } + .settings-email .email-actions .settings-disabled-remove-email { + display: none; + } + .settings-email:only-child .email-actions .settings-remove-email { + display: none; + } + .settings-email:only-child + .email-actions + .settings-disabled-remove-email { + display: block; + cursor: default; + color: #999; + } + .settings-email .octicon-info { + padding-left: 5px; + } + .settings-email .public.label { + display: inline; + } + .settings-email .private.label { + display: none; + } + .settings-email.private .public.label { + display: none; + } + .settings-email.private .private.label { + display: inline; + } + .two-factor-intro { + width: 675px; + margin: 40px auto 0; + } + .two-factor-intro .two-factor-graphic { + margin: 20px 0; + } + .two-factor-intro .two-factor-explain { + margin: 0 0 40px; + padding: 0; + font-size: 13px; + list-style: none; + } + .two-factor-intro .two-factor-explain li { + float: left; + margin: 0; + padding: 0; + } + .two-factor-intro .two-factor-explain .step-one { + width: 185px; + margin-right: 36px; + } + .two-factor-intro .two-factor-explain .step-two { + width: 230px; + margin-right: 42px; + } + .two-factor-intro .two-factor-explain .step-three { + width: 180px; + } + .two-factor-graphic { + background-image: url(/images/modules/settings/2fa_guide.png); + background-repeat: no-repeat; + width: 675px; + height: 135px; + } + .two-factor-recovery-codes { + height: 240px; + margin-top: 15px; + padding-left: 60px; + } + .two-factor-recovery-code { + display: inline-block; + width: 49%; + line-height: 1.1; + } + .two-factor-recovery-code::before { + content: "\25a1"; + font-size: 26px; + margin-right: 10px; + color: #eaeaea; + position: relative; + top: 1px; + } + @media only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (min-device-pixel-ratio: 2), + only screen and (min-resolution: 2dppx) { + .two-factor-graphic { + background-image: url(/images/modules/settings/2fa_guide@2x.png); + background-size: 675px 135px; + } + } + .yubicat-box .yubicat-device { + margin-bottom: 10px; + } + .yubicat-box .yubicat-device .yubicat-device-success { + margin-left: 10px; + color: #55a532; + } + .yubicat-box .yubicat-device .yubicat-device-success .octicon { + color: #6cc644; + } + .yubicat-box .yubicat-device .yubicat-device-details { + display: inline-block; + vertical-align: middle; + background-color: #e8f0f8; + border-radius: 3px; + line-height: 26px; + color: rgba(0, 0, 0, 0.5); + padding: 0 8px; + } + .yubicat-box .yubicat-device .yubicat-device-details .yubicat-device-id { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-weight: bold; + } + .yubicat-box .yubicat-device .yubicat-device-details .octicon { + position: relative; + top: 1px; + } + .yubicat-box .yubicat-device .yubicat-delete { + text-decoration: none; + } + .yubicat-box .yubicat-device .yubicat-delete .octicon { + width: 16px; + text-align: center; + } + .yubicat-box .yubicat-device.is-sending .yubicat-delete { + display: none; + } + .yubicat-box .yubicat-device.is-sending .spinner { + position: relative; + top: 3px; + } + .yubicat-box .new-yubicat { + position: relative; + } + .yubicat-box .new-yubicat .yubicat-otp-field { + width: 320px; + } + .yubicat-box .new-yubicat .add-yubicat-form { + display: none; + } + .yubicat-box .new-yubicat.is-active .add-yubicat-link { + display: none; + } + .yubicat-box .new-yubicat.is-active .add-yubicat-form { + display: block; + } + .yubicat-box .new-yubicat.is-sending .spinner { + position: absolute; + top: 8px; + left: 296px; + } + .yubicat-box .new-yubicat.is-showing-error .fallback-error-message { + display: block; + } + .yubicat-box .new-yubicat .flash { + padding: 10px; + margin-bottom: 10px; + } + .markdown-body .sms-or-app { + width: 100%; + margin: 0; + padding: 40px 0 0; + border-top: 1px solid #ddd; + } + .markdown-body .sms-or-app:before { + display: table; + content: ""; + } + .markdown-body .sms-or-app:after { + display: table; + clear: both; + content: ""; + } + .markdown-body .sms-or-app li { + float: left; + width: 325px; + padding: 0; + list-style: none; + } + .markdown-body .sms-or-app li:first-child { + margin-right: 25px; + } + .markdown-body .sms-or-app li .btn { + display: block; + text-align: center; + margin: 10px 0; + padding-top: 12px; + padding-bottom: 12px; + font-size: 15px; + height: 100%; + width: 100%; + } + .markdown-body .sms-or-app small { + font-size: 80%; + } + .markdown-body .app-only { + padding: 20px 0 0; + } + .markdown-body .app-only li { + float: none; + width: auto; + } + .markdown-body .app-only li .btn { + display: inline-block; + width: auto; + padding-left: 20px; + padding-right: 20px; + } + .two-factor-setup-container { + width: 600px; + margin: 0 auto; + } + .two-factor-setup-container .form label { + font-style: normal; + } + .two-factor-setup-container .form dd { + margin: 0; + padding: 0; + } + .two-factor-setup-container .octicon-alert { + color: #bd2c00; + } + .two-factor-setup-container .error-icon { + position: relative; + left: 5px; + top: 2px; + color: #bd2c00; + } + .two-factor-setup-container .sent-message { + position: relative; + left: 5px; + top: 2px; + color: #6cc644; + } + .two-factor-setup-container .select-menu { + float: left; + } + .two-factor-setup-container .select-menu .btn-sm { + padding-top: 4px; + padding-bottom: 4px; + margin-right: 5px; + } + .two-factor-setup-container .select-menu .btn-sm input[type="radio"], + .two-factor-setup-container .select-menu .btn-sm .country { + display: none; + } + .two-factor-setup-container .select-menu .select-menu-button:before { + top: 14px; + } + .container.two-factor-toggle { + width: 700px; + } + .two-factor-step-container { + margin: 0 0 20px; + font-size: 86.6667%; + } + .two-factor-step-container .sms-form .form { + margin-left: 15px; + } + .two-factor-step-container .form label { + color: #767676; + } + .two-factor-step-container:last-of-type { + margin-bottom: 0; + padding-bottom: 0; + border-bottom: 0; + } + .two-factor-step-container h4 { + margin: 0; + font-size: 13px; + } + .two-factor-step-container p:last-child { + margin-bottom: 0; + } + .two-factor-toggle { + margin-top: 40px; + } + .two-factor-toggle .two-factor-status { + padding: 20px 0; + margin: 0 0 20px; + border-bottom: 1px solid #eaeaea; + color: #767676; + } + .two-factor-toggle .two-factor-status p { + margin: 0; + } + .two-factor-toggle .two-factor-status .btn { + position: relative; + top: -3px; + float: right; + } + .two-factor-toggle .two-factor-on { + margin-right: 5px; + padding: 3px 5px; + border-radius: 2px; + background-color: #6cc644; + color: #fff; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + } + .two-factor-settings-group { + position: relative; + margin: 0 0 20px; + padding: 0 0 20px 220px; + border-bottom: 1px solid #ddd; + } + .two-factor-settings-group h3 { + position: absolute; + top: -15px; + left: 0; + width: 200px; + font-size: 14px; + } + .two-factor-settings-group h3 .octicon { + position: absolute; + left: -24px; + color: #bd2c00; + } + .two-factor-settings-group li { + list-style: none; + line-height: 1.5; + } + .github-access-banner { + position: relative; + margin: 0 0 20px; + padding: 10px 20px 10px 70px; + border: 1px solid #ddd; + border-radius: 3px; + font-size: 14px; + } + .github-access-banner .mega-octicon { + position: absolute; + left: 20px; + top: 20px; + color: #bd2c00; + } + .error-icon, + .spinner, + .sent-message, + .sms-error-message, + .fallback-error-message, + #text-code { + display: none; + } + .is-sending .spinner { + display: inline-block; + } + .is-sent .sent-message { + display: inline-block; + } + .is-not-sent .sms-error-message { + display: block; + } + .is-not-sent .error-icon { + display: inline-block; + } + .two-factor-secret { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 13px; + } + .markdown-body .qr-code-table, + .qr-code-table { + width: auto; + float: right; + margin: 0 0 0 40px; + border: 1px solid #ddd; + } + .markdown-body .qr-code-table tr, + .qr-code-table tr { + background: transparent; + border: 0; + } + .markdown-body .qr-code-table th, + .markdown-body .qr-code-table td, + .qr-code-table th, + .qr-code-table td { + border: 0; + padding: 0; + } + .markdown-body .qr-code-table td, + .qr-code-table td { + width: 3px; + height: 3px; + } + .markdown-body .qr-code-table .black, + .qr-code-table .black { + background: #000; + } + .markdown-body .qr-code-table .white, + .qr-code-table .white { + background: #fff; + } + .markdown-body .two-factor-actions { + clear: both; + padding: 20px 0 0; + margin: 20px 0 0; + border-top: 1px solid #eaeaea; + font-size: 13px; + } + .markdown-body .two-factor-actions ul { + width: 600px; + margin: 0; + padding: 0; + } + .markdown-body .two-factor-actions li { + list-style: none; + display: inline-block; + margin-right: 10px; + } + .two-factor-banner { + position: relative; + padding-left: 60px; + margin: 40px auto; + width: 700px; + background: #fff; + border: 1px solid #ddd; + color: #444; + } + .two-factor-banner:hover { + border-color: #ddd; + } + .two-factor-banner .mega-octicon { + position: absolute; + top: 15px; + left: 15px; + color: #bd2c00; + } + .two-factor-banner h2 { + margin-top: 0; + line-height: 32px; + } + .two-factor-banner p { + margin-top: 0; + } + .two-factor-mini-banner { + display: block; + width: 100%; + margin: 0 0 20px; + padding: 15px 15px 15px 42px; + background: #fff; + } + .two-factor-mini-banner .btn-sm { + position: relative; + top: -4px; + float: right; + } + .two-factor-mini-banner p { + margin-bottom: 0; + line-height: 1.5; + } + .two-factor-mini-banner .octicon { + position: absolute; + top: 15px; + left: 15px; + color: #bd2c00; + } + .orgs-settings { + margin-bottom: 15px; + } + .confirmation-phrase { + font-weight: normal; + font-style: italic; + } + .do-not-copy-me { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + li.session-device { + position: relative; + line-height: 18px; + padding: 15px; + background-color: #fafafa; + color: #767676; + } + li.session-device .btn { + float: right; + margin-top: 4px; + } + li.session-device .session-state-indicator { + float: left; + width: 8px; + height: 8px; + margin-top: 10px; + border-radius: 5px; + } + li.session-device .session-state-indicator.recent { + background-color: #6cc644; + box-shadow: 0 0 10px rgba(108, 198, 68, 0.5); + } + li.session-device .session-state-indicator.not-recent { + box-shadow: 0 1px 0 #fff; + background-color: #ccc; + background-image: -webkit-linear-gradient(#aaa, #ccc); + background-image: linear-gradient(#aaa, #ccc); + background-repeat: repeat-x; + } + li.session-device .session-icon { + float: left; + width: 32px; + margin-top: 1px; + margin-left: 15px; + text-align: center; + color: #bbb; + } + li.session-device .sessions-more-info { + position: relative; + display: none; + margin-top: 10px; + } + li.session-device.session-current { + background-color: #fff; + } + li.session-device.session-current .session-last-accessed { + color: #767676; + } + li.session-device.session-current .sessions-more-info { + color: #767676; + } + li.session-device.session-current .sessions-more-info:after { + border-top-color: #fff; + } + li.session-device.session-current .mega-octicon { + color: #767676; + } + .session-details { + position: relative; + width: 350px; + margin-left: 70px; + } + .session-details:hover .octicon { + color: #4078c0; + cursor: pointer; + } + .session-details.open .sessions-more-info { + display: block; + } + .session-title { + display: block; + } + .collaborators .collab-list { + border-bottom-width: 0; + } + .collaborators .collab-list-item:first-child .collab-list-cell { + border-top-width: 0; + } + .collaborators .collab-list-cell { + padding-top: 15px; + padding-bottom: 15px; + vertical-align: middle; + } + .collaborators .collab-meta { + width: 140px; + } + .collaborators .collab-permission { + text-align: center; + } + .collaborators .collab-remove { + padding-right: 20px; + text-align: right; + } + .collaborators .collab-remove .remove-link { + color: #767676; + } + .collaborators .collab-remove .remove-link:hover { + color: #bd2c00; + } + .collaborators .collab-team-link { + width: 300px; + } + .collaborators .collab-team-link:hover { + text-decoration: none; + } + .collaborators .collab-team-link .avatar { + float: left; + margin-top: 1px; + margin-right: 10px; + } + .collaborators .collab-team-link.disabled { + pointer-events: none; + } + .collaborators .collab-info { + color: #666; + } + .collaborators .collab-info .description { + padding-right: 50px; + margin-top: 3px; + margin-bottom: 3px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .collaborators .collab-info .collab-name { + display: block; + font-size: 14px; + } + .access-sub-heading { + float: right; + font-weight: normal; + line-height: 1.4; + color: #767676; + } + .access-form-wrapper { + padding: 10px; + background-color: #fcfcfc; + border-top: 1px solid #ddd; + border-radius: 0 0 3px 3px; + } + .access-flash { + margin-bottom: 10px; + margin-left: 10px; + margin-right: 10px; + padding: 8px; + } + .repo-access-group .blankslate { + display: none; + } + .repo-access-group.is-empty .blankslate { + display: block; + } + .repo-access-group.no-form .add-team-form { + display: none; + } + .repo-access-group .select-menu-item.has-access { + display: none; + } + .oauth-pending-deletion-list-item { + background-color: #fafafa; + box-shadow: inset 0 0 8px #eee; + } + .oauth-pending-deletion-list-item:hover { + background-color: #fafafa; + } + .oauth-pending-deletion-list-item .oauth-pending-deletion { + display: inline; + } + .oauth-pending-deletion-list-item .active { + display: none; + } + .oauth-pending-deletion { + display: none; + width: 100%; + } + .boxed-group-list .access-level { + color: #767676; + } + .boxed-group-list .access-level.css-truncate-target { + max-width: 500px; + } + .protected-branch { + margin: 0 -10px; + padding: 10px; + line-height: 24px; + border-bottom: 1px solid #ddd; + } + .protected-branch:last-child { + border-bottom: 0; + } + .automated-checks .note { + margin-bottom: 13px; + } + .automated-checks .check-details { + font-weight: normal; + font-size: 90%; + } + .automated-checks dd { + background: #fafafa; + border-top: 1px solid #d8d8d8; + padding: 13px 10px; + margin-left: -10px; + margin-right: -10px; + } + .automated-checks dd:last-child { + border-bottom: 1px solid #d8d8d8; + } + .automated-checks dd input[type="checkbox"] { + margin-right: 3px; + } + .logged_out.signup .header-logged-out .container, + .logged_out.signup .site-footer { + width: 750px; + } + .logged_out.signup .site-footer { + margin-right: auto; + margin-left: auto; + } + .logged_out.signup .site-footer .octicon-mark-github { + top: 30px; + } + .logged_out.signup .header-actions .primary, + .logged_out.signup .site-footer-links, + .logged_out.signup .site-search { + display: none; + } + .setup-wrapper { + width: 750px; + padding-top: 30px; + margin: 0 auto; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + } + .setup-header { + overflow: hidden; + padding-bottom: 20px; + margin: 0 auto 30px; + text-align: left; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #ddd; + } + .setup-header h1 { + margin-top: 0; + margin-bottom: 0; + font-size: 45px; + font-weight: normal; + letter-spacing: -1px; + } + .setup-header h1 .mega-octicon { + color: #bbb; + } + .setup-header .lead { + margin-top: 2px; + margin-bottom: 0; + font-size: 21px; + } + .setup-header .lead a { + color: #767676; + } + .setup-header .lead a:hover { + color: #4078c0; + text-decoration: none; + } + .setup-org { + padding-bottom: 0; + border-bottom: 0; + } + .setup-main { + float: left; + width: 450px; + } + .setup-main.without-secondary { + margin-left: 150px; + } + .setup-secondary { + float: right; + width: 250px; + } + .setup-secondary .info { + padding-top: 0; + padding-bottom: 0; + margin-top: -10px; + color: #767676; + font-size: 12px; + line-height: 18px; + text-align: center; + } + .setup-info-module { + margin-bottom: 30px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.075); + } + .setup-info-module h2 { + padding: 15px; + margin-top: 0; + margin-bottom: 15px; + overflow: hidden; + font-size: 16px; + border-bottom: 1px solid #ddd; + } + .setup-info-module h2 .price { + float: right; + font-weight: bold; + color: #767676; + } + .setup-info-module h3 { + padding: 0 15px; + margin: 0 0 -7px; + font-size: 14px; + } + .setup-info-module p { + padding: 0 15px; + margin: 15px 0; + } + .setup-info-module .setup-section-title { + margin-bottom: 10px; + } + .features-list { + padding: 0 15px 15px; + margin: 0; + font-size: 14px; + list-style: none; + } + .features-list li { + margin-top: 10px; + } + .features-list li:first-child { + margin-top: 0; + } + .features-list .list-divider { + margin: 15px -15px; + border-top: 1px solid #eee; + } + .features-list .octicon-check { + margin-right: 5px; + color: #60b044; + } + .features-list .octicon-question { + color: #555; + font-size: 12px; + } + .features-list .tooltipped:after { + width: 250px; + white-space: normal; + } + .features-list.features-list-org { + padding-bottom: 0; + } + .setup-form-container .setup-form-title { + margin-top: 0; + font-size: 16px; + } + .setup-form-container .secure { + float: right; + margin-top: 2px; + color: #60b044; + font-size: 11px; + text-transform: uppercase; + } + .setup-form-container hr { + margin-top: 25px; + margin-bottom: 25px; + } + .setup-form-container .form-actions { + padding-top: 0; + padding-bottom: 0; + text-align: left; + } + .team-member-container { + margin-bottom: 20px; + } + .team-member-container .team-member-username { + line-height: 1.2; + } + .setup-form { + padding-bottom: 15px; + } + .setup-form .form dd input[type="text"], + .setup-form .form dd input[type="password"], + .setup-form .form dd input[type="email"] { + width: 100%; + } + .setup-form .form dd input[type="text"].short, + .setup-form .form dd input[type="password"].short, + .setup-form .form dd input[type="email"].short { + width: 250px; + } + .setup-form dd { + position: relative; + } + .setup-form dd .octicon { + position: absolute; + right: 25px; + top: 8px; + } + .setup-form .octicon-alert:before { + color: #bd2c00; + } + .setup-form .octicon-check:before { + color: #6cc644; + } + .setup-form .text-muted { + margin-top: 5px; + } + .setup-form .tos-info, + .setup-form .setup-organization-next { + margin: 15px 0; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + } + .setup-form .tos-info { + padding: 15px 0; + } + .setup-form .setup-organization-next { + padding-top: 15px; + padding-bottom: 15px; + } + .setup-form .setup-plans { + margin-bottom: 25px; + border: solid 1px #ccc; + border-collapse: separate; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.075); + overflow: hidden; + } + .setup-form .setup-plans tr.selected { + background-color: #f0f7fd; + } + .setup-form .setup-plans th, + .setup-form .setup-plans td { + vertical-align: middle; + border-bottom: 1px solid #ccc; + } + .setup-form .setup-plans .name { + font-weight: bold; + } + .setup-form .setup-plans .choose_plan input[type="radio"] { + display: none; + } + .setup-creditcard-form .cc-extras { + margin-bottom: 15px; + } + .setup-creditcard-form .expiration-form { + width: 120px; + } + .setup-creditcard-form .expiration-form dd { + line-height: 32px; + } + .setup-creditcard-form .expiration-form, + .setup-creditcard-form .cvv-form, + .setup-creditcard-form .country-form, + .setup-creditcard-form .state-form { + word-wrap: normal; + float: left; + margin: 0; + } + .setup-creditcard-form .form dd input.input-cvv { + width: 130px; + } + .setup-creditcard-form .form select.select-country { + width: 162px; + margin-right: 5px; + } + .setup-creditcard-form .form select.select-state { + width: 84px; + } + .setup-creditcard-form.is-vat-country .vat-field { + display: block; + } + .setup-creditcard-form.is-international .form select.select-country { + width: 250px; + } + .setup-creditcard-form.is-international .state-form { + display: none; + } + .setup-creditcard-form dd .octicon-credit-card { + position: inherit; + } + .setup-creditcard-form .enter-new-card { + display: none; + } + .setup-creditcard-form.has-credit-card .enter-new-card { + display: inline-block; + } + .setup-creditcard-form.has-credit-card .card-select-number-field, + .setup-creditcard-form.has-credit-card .cancel-enter-new-card, + .setup-creditcard-form.has-credit-card .cards-select { + display: none; + } + .setup-creditcard-form .vat-field { + display: none; + } + .setup-creditcard-form .vat-field.prefilled { + display: block; + } + .setup-creditcard-form .help-text { + font-size: 80%; + font-weight: normal; + color: #767676; + } + .collection-head { + height: 225px; + margin-top: -20px; + margin-bottom: 20px; + background: #555 url(/images/modules/home/octicons-bg.png) center repeat; + box-shadow: inset 0 10px 20px rgba(0, 0, 0, 0.1); + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); + color: #fff; + } + .collection-head .collection-info { + margin: 0; + } + .collection-head .collection-info .meta-info { + margin-right: 15px; + } + .collection-head .collection-info .avatar { + background-color: rgba(255, 255, 255, 0.7); + border: 1px solid rgba(255, 255, 255, 0.7); + } + .collection-head .container { + position: relative; + } + .collection-head .draft-tag { + position: absolute; + top: 0; + left: 0; + } + .collection-title { + display: table-cell; + height: 225px; + vertical-align: middle; + } + .collection-header { + margin-top: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 45px; + font-weight: normal; + } + .collection-description { + position: relative; + font-size: 16px; + } + .collection-page .collection-info { + margin-top: 10px; + margin-bottom: 20px; + font-size: 13px; + color: #767676; + } + .collection-page .column.main { + margin-right: 260px !important; + } + .collection-page .column.sidebar { + width: 240px; + } + .collection-page .other-content { + padding: 20px 0 20px 20px; + border-left: 1px solid #f1f1f1; + } + .collection-page .other-content .subnav-search { + margin-left: 0; + } + .collection-page .other-content input.subnav-search-input { + width: 100%; + } + .collection-page .other-content-title { + margin-top: 40px; + } + .collection-page .other-content-title:first-child { + margin-top: 0; + } + .side-collection-list { + margin: 0; + list-style-type: none; + } + .side-collection-link { + display: table; + width: 100%; + height: 100px; + color: #fff; + } + .side-collection-item-title { + font-size: 16px; + font-weight: 100; + } + .side-collection-image { + background: #555 url(/images/modules/home/octicons-bg.png) center repeat; + box-shadow: inset 0 10px 20px rgba(0, 0, 0, 0.1); + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); + color: #fff; + display: table-cell; + width: 100%; + height: 100%; + margin-bottom: 5px; + text-align: center; + vertical-align: middle; + border-radius: 3px; + } + .side-collection-list-item { + margin-bottom: 20px; + } + .collection-tools { + list-style-type: none; + margin-bottom: 10px; + font-size: 15px; + } + .collection-tools .edit-link { + color: #333; + } + .collection-tools .edit-link:hover { + color: #4078c0; + cursor: pointer; + } + .collection-tools .octicon { + margin-right: 5px; + } + .collection-tools .select-menu-button { + position: relative; + display: inline-block; + color: #333; + } + .collection-tools .select-menu-button:hover { + color: #4078c0; + cursor: pointer; + } + .collection-tool { + margin-left: 20px; + } + .collection-search-results em { + padding: 0.1em; + background-color: #faffa6; + } + .collection-search-result { + margin-bottom: 40px; + list-style-type: none; + } + .collection-search-result-title { + margin-top: 0; + } + .collection-search-page .search-results-info { + line-height: 33px; + float: right; + margin-left: 10px; + font-size: 15px; + } + .draft-tag { + padding: 5px 10px; + font-weight: bold; + color: #eee; + background-color: #404040; + } + .collection-card { + position: relative; + float: left; + width: 313px; + margin-right: 20px; + margin-bottom: 20px; + list-style-type: none; + background: #f7f7f7; + border: 1px solid #ddd; + border-radius: 3px; + } + .collection-card .draft-tag { + position: absolute; + top: -1px; + left: 10px; + } + .collection-card:nth-child(3n + 3) { + margin-right: 0; + } + .collection-card-title { + padding: 0 15px; + margin: 10px 0; + display: table-cell; + width: 100%; + height: 100%; + font-size: 19px; + font-weight: bold; + text-align: center; + vertical-align: middle; + } + .collection-card-body { + padding: 0 15px; + margin: 10px 0; + height: 6em; + margin-top: 0; + overflow: hidden; + font-size: 15px; + line-height: 1.5em; + } + .collection-card-image { + position: relative; + display: table; + width: 313px; + height: 120px; + margin: -1px; + margin-bottom: 15px; + background: #555 url(/images/modules/home/octicons-bg.png) center repeat; + box-shadow: inset 0 10px 20px rgba(0, 0, 0, 0.1); + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); + color: #fff; + border-top-right-radius: 3px; + border-top-left-radius: 3px; + } + .collection-card-meta { + padding: 0 15px; + margin-top: 5px; + margin-bottom: 15px; + color: #767676; + } + .collection-card-meta .meta-info { + margin-right: 10px; + } + .collection-card-meta .last-updated { + float: right; + margin-right: 0; + } + .collection-listing-search { + margin-bottom: 20px; + } + .collection-listing-search .subnav-search { + margin-left: 0; + margin-right: 25%; + } + .collection-feed-icon { + float: right; + margin-top: 28px; + } + .featured-grid { + position: relative; + list-style: none; + margin-top: -10px; + } + .featured-grid-outer { + position: relative; + height: 100%; + } + .featured-grid-more-info { + padding: 20px; + } + .featured-showcase-meta { + position: absolute; + bottom: 15px; + left: 20px; + } + .featured-showcase-meta .meta-info { + margin-right: 10px; + } + .featured-grid-link { + display: table; + width: 100%; + height: 100%; + border-radius: 5px; + background: #555 url(/images/modules/home/octicons-bg.png) center repeat; + box-shadow: inset 0 10px 20px rgba(0, 0, 0, 0.1); + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); + color: #fff; + } + .featured-grid-inner { + display: table-cell; + padding: 10px 20px; + font-size: 15px; + text-align: center; + vertical-align: middle; + } + .grid-item { + position: relative; + display: block; + float: left; + width: 25%; + height: 122.5px; + padding: 10px; + } + .grid-item-0 { + position: absolute; + width: 50%; + height: 245px; + } + .grid-item-1, + .grid-item-2 { + margin-right: 25%; + margin-left: 50%; + } + .grid-item-3 { + height: 245px; + } + .grid-item-4 { + width: 50%; + height: 245px; + } + .grid-item-7 { + position: absolute; + top: 0; + right: 0; + height: 245px; + } + .showcase-featured .see-more { + text-align: center; + } + .showcase-featured .in-yo-face .featured-grid-outer { + overflow: hidden; + } + .showcase-featured .in-yo-face .showcase-info { + position: absolute; + right: 0; + bottom: -20%; + left: 0; + padding: 10px 20px; + font-size: 13px; + text-align: left; + background: rgba(0, 0, 0, 0.6); + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + opacity: 0; + visibility: hidden; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + } + .showcase-featured .in-yo-face .showcase-name { + font-size: 25px; + color: #fff; + } + .showcase-featured .in-yo-face .meta-info { + margin-right: 10px; + } + .showcase-featured .in-yo-face:hover .showcase-info { + bottom: 0; + opacity: 1; + visibility: visible; + } + .showcase-featured .mo-info .featured-grid-outer { + background: #f7f7f7; + border: 1px solid #ddd; + border-radius: 3px; + } + .showcase-featured .mo-info .featured-grid-link { + width: 225px; + height: 102px; + margin-top: -1px; + margin-right: -1px; + margin-left: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + .showcase-featured .normal-intensity .showcase-info { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding-top: 43px; + font-size: 13px; + text-align: center; + vertical-align: middle; + background: rgba(0, 0, 0, 0.6); + border-radius: 3px; + opacity: 0; + -webkit-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; + } + .showcase-featured .normal-intensity .octicon { + display: inline; + } + .showcase-featured .normal-intensity .meta-info { + margin-right: 10px; + } + .showcase-featured .normal-intensity .text { + display: none; + } + .showcase-featured .normal-intensity .name-text { + display: block; + } + .showcase-featured .normal-intensity a:hover { + text-decoration: none; + } + .showcase-featured .normal-intensity:hover .showcase-info { + opacity: 1; + } + .showcase-featured .normal-intensity:hover .name-text { + color: transparent; + text-shadow: 0 0 5px rgba(255, 255, 255, 0.8); + } + .showcase-featured .normal-intensity .showcase-name, + .showcase-featured .mo-info .showcase-name { + font-size: 16px; + font-weight: 100; + } + .signup-plans-actions { + margin: -10px 0 20px; + } + .btn.plans-signup-button { + padding: 12px 50px; + font-size: 16px; + } + .signup-plans-or { + margin: 0 5px 0 8px; + } + .signup-plans-collabocat { + float: right; + width: 300px; + margin-left: 30px; + } + .signup-plans { + width: 100%; + margin: 20px 0 40px; + border-collapse: separate; + } + .signup-plans th, + .signup-plans td { + text-align: left; + padding: 9px; + font-size: 14px; + border: solid #e5e5e5; + } + .signup-plans th { + padding: 14px 9px; + font-size: 20px; + border-width: 1px 0 0 1px; + } + .signup-plans th small { + display: block; + font-size: 14px; + color: #7a7a7a; + } + .signup-plans thead .empty { + border-width: 0; + } + .signup-plans thead .plan-free { + border-radius: 5px 0 0; + } + .signup-plans thead th:last-child { + border-right-width: 1px; + border-radius: 0 5px 0 0; + } + .signup-plans tbody tr:first-child td:first-child { + border-top-width: 1px; + border-radius: 5px 0 0; + } + .signup-plans td { + border-width: 1px 0 0 1px; + } + .signup-plans td:last-child { + border-right-width: 1px; + } + .signup-plans tr:last-child td { + border-bottom-width: 1px; + } + .signup-plans tr:last-child td:first-child { + border-radius: 0 0 0 5px; + } + .signup-plans tr:last-child td:last-child { + border-radius: 0 0 5px; + } + .signup-plans tr:nth-child(odd) td { + background-color: #f5f5f5; + } + .signup-plans .row-label { + width: 18%; + font-weight: bold; + } + .signup-plans-personal th { + color: #4078c0; + } + .signup-plans-personal tr:nth-child(odd) td { + background-color: #edf2f9; + } + .signup-plans-orgs th { + color: #6cc644; + } + .signup-plans-orgs tr:nth-child(odd) td { + background-color: #f6fcf4; + } + .signup-plans-toggle-currency { + float: right; + } + .signup-plans-currency-notice { + margin: 10px auto 30px; + width: 800px; + text-align: center; + } + .simple-stacked-bar { + display: table; + height: 10px; + width: 100%; + background-color: #eee; + } + .bar-section { + display: table-cell; + } + .bar-section[style="width:0.0%"] { + display: none; + } + .bar-section-positive { + background-color: #6cc644; + } + .bar-section-negative { + background-color: #bd2c00; + } + .bar-section-alt { + background-color: #6e5494; + } + .stars-browser .sort-bar .filter_input { + width: 400px; + } + .stars-browser .repo-list { + margin-top: -20px; + } + .facebox .sudo { + padding: 0; + } + .facebox .sudo .auth-form-header { + border-width: 0 0 1px; + } + .facebox .sudo .auth-form-header .mini-icon { + display: none; + } + .facebox .sudo .auth-form-body { + border-width: 0; + } + .facebox .sudo + .facebox-close { + padding: 5px; + color: #fff; + } + .sudo-prompt, + .sudo-error { + display: none; + } + .survey-flow .header { + background: none; + border-bottom-color: rgba(255, 255, 255, 0.2); + } + .survey-flow .header-logo-invertocat { + position: relative; + left: 50%; + margin-left: -14px; + color: #fff; + } + .survey-flow .site-search, + .survey-flow .header-nav, + .survey-flow .flash-global, + .survey-flow .site-footer { + display: none; + } + .survey-background { + position: fixed; + top: 0; + left: 0; + z-index: -1; + width: 100%; + height: 100%; + background-color: #86d1ee; + background-image: -webkit-linear-gradient(#1dadee, #86d1ee); + background-image: linear-gradient(#1dadee, #86d1ee); + background-repeat: repeat-x; + } + .survey-content { + position: relative; + } + .survey-screen { + position: absolute; + top: 0; + width: 100%; + z-index: 1; + opacity: 0; + } + .survey-screen.out { + z-index: 0; + -webkit-animation: fadeOutUp 0.8s ease-in-out 0s; + animation: fadeOutUp 0.8s ease-in-out 0s; + } + .survey-screen.in { + opacity: 1; + -webkit-animation: fadeInUpShort 0.8s ease-in-out 0s; + animation: fadeInUpShort 0.8s ease-in-out 0s; + } + .survey-intro, + .survey-outro { + margin-top: 170px; + } + .survey-intro .survey-title, + .survey-intro .lead, + .survey-outro .survey-title, + .survey-outro .lead { + color: #fff; + text-shadow: 0 2px 3px rgba(75, 138, 190, 0.8); + } + .survey-intro .survey-title, + .survey-outro .survey-title { + margin-bottom: 0; + font-size: 50px; + font-weight: 400; + letter-spacing: -1px; + } + .survey-intro .lead, + .survey-outro .lead { + margin: 0 auto 30px; + max-width: 600px; + font-weight: normal; + } + .survey-intro .btn, + .survey-outro .btn { + padding: 10px 15px; + font-size: 16px; + } + .survey-questions { + max-width: 600px; + margin: 90px auto 0; + position: relative; + } + .survey-question { + width: 100%; + background-color: #fafafa; + border: 1px solid #859acf; + border-radius: 6px; + box-shadow: 0 1px 2px 1px rgba(0, 0, 0, 0.05); + position: absolute; + opacity: 0; + display: none; + } + .survey-question.active { + -webkit-animation: fadeInUpShort 0.3s ease-in-out 0s; + animation: fadeInUpShort 0.3s ease-in-out 0s; + opacity: 1; + display: block; + } + .survey-question.complete { + -webkit-animation: fadeOutUp 0.3s ease-in-out 0s; + animation: fadeOutUp 0.3s ease-in-out 0s; + z-index: 0; + display: block; + } + .survey-question-1 { + z-index: 9; + } + .survey-question-2 { + z-index: 8; + } + .survey-question-3 { + z-index: 7; + } + .survey-question-4 { + z-index: 6; + } + .survey-question-5 { + z-index: 5; + } + .survey-question-6 { + z-index: 4; + } + .survey-question-7 { + z-index: 3; + } + .survey-question-8 { + z-index: 2; + } + .survey-question-9 { + z-index: 1; + } + .survey-question-10 { + z-index: 0; + } + .skip-survey-link { + position: absolute; + top: 4px; + right: 7px; + padding: 5px; + color: #666; + } + .survey-question-index { + margin-top: 20px; + font-size: 16px; + color: #999; + } + .survey-question-title { + margin-top: -15px; + padding: 0 10px; + font-size: 20px; + } + .survey-choices { + text-align: left; + padding: 0 100px; + display: inline-block; + } + .survey-choices .survey-choice { + display: block; + margin: 5px 0; + } + .survey-choices .survey-choice-label { + font-weight: normal; + position: relative; + padding-left: 20px; + display: inline-block; + } + .survey-choices .survey-choice-radio { + position: absolute; + top: 1px; + left: 0; + } + .survey-choice-other-field { + display: inline-block; + } + .survey-action { + margin-top: 20px; + padding: 15px 100px 8px; + width: 100%; + background: #f6f6f6; + border-radius: 0 0 6px 6px; + border-top: 1px solid #eaeaea; + } + .survey-action .btn { + margin-bottom: 7px; + } + .survey-spinner { + position: absolute; + z-index: 1; + top: 0; + left: 0; + display: none; + width: 100%; + height: 100%; + line-height: 225px; + background-color: rgba(255, 255, 255, 0.9); + border-radius: 4px; + } + .survey-clouds { + -webkit-animation: fadeInUp 1s ease 0s; + animation: fadeInUp 1s ease 0s; + -webkit-transition: all 0.8s ease-in-out; + transition: all 0.8s ease-in-out; + } + .quiz-active .survey-clouds { + -webkit-animation: fadeOutUp 0.8s ease-in-out 0s; + animation: fadeOutUp 0.8s ease-in-out 0s; + opacity: 0; + } + .survey-cloud { + position: absolute; + z-index: 0; + -webkit-animation: float 6s ease 0s infinite; + animation: float 6s ease 0s infinite; + } + .survey-cloud, + .cloud-center { + -webkit-transition-timing-function: cubic-bezier(0.01, 0.38, 1, 0.73); + transition-timing-function: cubic-bezier(0.01, 0.38, 1, 0.73); + } + .cloud-right { + right: 20px; + top: 400px; + height: 175px; + } + .cloud-center { + right: 260px; + top: 490px; + height: 140px; + -webkit-animation: floatInverted 5s ease 0s infinite; + animation: floatInverted 5s ease 0s infinite; + } + .cloud-left { + top: 360px; + left: 0; + height: 225px; + } + @-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + } + @keyframes fadeOutUp { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + } + @-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 1000px, 0); + transform: translate3d(0, 1000px, 0); + } + 100% { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + } + @keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 1000px, 0); + transform: translate3d(0, 1000px, 0); + } + 100% { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + } + @-webkit-keyframes fadeInUpShort { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 200px, 0); + transform: translate3d(0, 200px, 0); + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + } + @keyframes fadeInUpShort { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 200px, 0); + transform: translate3d(0, 200px, 0); + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + } + @-webkit-keyframes float { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + 65% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + } + @keyframes float { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + 65% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + } + @-webkit-keyframes floatInverted { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + 65% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + } + @keyframes floatInverted { + 0% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + 65% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + } + .tree-browser { + width: 100%; + margin: 0; + border-bottom: 1px solid #cacaca; + border-left: 0; + border-right: 0; + } + .tree-browser td { + background: #f8f8f8; + border-bottom: 1px solid #eee; + padding: 7px 3px; + color: #484848; + vertical-align: middle; + white-space: nowrap; + } + .tree-browser td.icon { + width: 17px; + padding-right: 2px; + padding-left: 10px; + } + .tree-browser td:first-child { + border-left: 1px solid #cacaca; + } + .tree-browser td:last-child { + border-right: 1px solid #cacaca; + } + .tree-browser td a.message { + color: #484848; + } + .tree-browser td span.ref { + color: #aaa; + } + .tree-browser img { + vertical-align: text-bottom; + } + .tree-browser tbody tr:last-child td { + border-bottom: 0; + } + .tree-browser .history { + float: right; + padding-right: 5px; + } + .tree-browser .octicon-chevron-right { + color: transparent; + } + .tree-browser tr.navigation-focus td { + background-color: #fff; + } + .tree-browser tr.navigation-focus td .octicon-chevron-right { + color: #4078c0; + } + .tree-browser .octicon-file-directory { + color: #80a6cd; + } + .tree-browser .octicon-file-submodule { + color: #3cbf5e; + } + .tree-browser .octicon-file-text { + color: #767676; + } + .tree-browser .content { + max-width: 220px; + } + .tree-browser .message { + max-width: 420px; + } + .tree-browser .css-truncate-target { + max-width: 100%; + } + .tree-browser-result-template { + display: none; + } + .tree-browser-result .css-truncate-target { + max-width: 870px; + } + .tree-browser-result mark { + background-color: transparent; + color: #4078c0; + font-weight: bold; + } + input.tree-finder-input, + input.tree-finder-input:focus { + position: relative; + top: 1px; + border: 0; + padding: 0; + outline: none; + font-size: 100%; + box-shadow: none; + min-height: 0; + height: 22px; + line-height: 1px; + vertical-align: top; + -webkit-appearance: none; + margin-left: 5px; + } + .tree-finder .no-results { + display: none; + } + .tree-finder .no-results th { + text-align: center; + } + .tree-finder tr td.icon { + cursor: pointer; + } + .tree-finder .tree-browser { + border-top: 1px solid #cacaca; + } + .tree-finder .filterable-empty + .no-results { + display: block; + } + #user-content-toc { + overflow: visible; + } + #user-content-toc tr { + border-top: 0; + } + #user-content-toc td { + padding: 0 20px; + background-color: #f7f7f7; + border: 0; + border-radius: 3px; + } + #user-content-toc ul { + padding-left: 0; + font-weight: bold; + list-style: none; + } + #user-content-toc ul li { + padding-left: 0.2em; + } + #user-content-toc ul ul { + font-weight: normal; + } + #user-content-toc ul ul li:before { + float: left; + margin-top: -0.2em; + margin-right: 0.2em; + font-size: 1.2em; + line-height: 1; + color: #aaa; + content: "\231e"; + } + #user-content-toc ul ul ul { + padding-left: 0.9em; + } + #user-content-toctitle h2 { + margin-top: 1em; + margin-bottom: 0.5em; + font-size: 1.25em; + border-bottom: 0; + } + .user-list em { + font-weight: bold; + background-color: rgba(255, 255, 140, 0.5); + padding: 3px; + border-radius: 3px; + font-style: normal; + } + .user-list .avatar { + position: absolute; + top: 0; + left: 0; + } + .user-list-info { + padding: 0; + min-height: 48px; + font-weight: normal; + font-size: 18px; + line-height: 20px; + } + .user-list-meta { + font-size: 11px; + margin: 8px 0 0; + list-style-type: none; + overflow: hidden; + color: #999; + } + .user-list-meta > li { + float: left; + margin-right: 10px; + } + .user-list-meta a { + color: #333; + } + .user-list-item { + border-bottom: 1px solid #f1f1f1; + padding: 0 0 20px 58px; + margin: 0 0 20px; + position: relative; + } + .follow-list { + list-style-type: none; + } + .follow-list .follow-list-container { + margin-left: 90px; + } + .follow-list .follow-list-item { + float: left; + width: 305px; + padding-bottom: 20px; + margin-bottom: 20px; + margin-right: 20px; + border-bottom: 1px solid #eee; + } + .repository-with-sidebar .follow-list .follow-list-item { + width: 285px; + } + .follow-list .follow-list-name { + font-weight: normal; + margin: 0 0 5px; + } + .follow-list .follow-list-name a { + color: inherit; + } + .follow-list .follow-list-info { + margin-top: 0; + margin-bottom: 0.6em; + font-size: 12px; + color: #767676; + } + .follow-list .css-truncate.css-truncate-target { + max-width: 195px; + } + .repository-with-sidebar .follow-list .css-truncate.css-truncate-target { + max-width: 170px; + } + .follow-list .gravatar { + float: left; + display: block; + width: 75px; + height: 75px; + } + #wiki-body { + margin-top: 20px; + } + #wiki-body .markdown-body { + padding: 0 30px; + margin: 0 -30px; + } + #wiki-rightbar { + float: right; + width: 230px; + } + #wiki-rightbar .markdown-body { + font-size: 13px; + } + #wiki-rightbar .markdown-body .anchor { + display: none; + } + #wiki-rightbar .markdown-body h1 { + padding-bottom: 5px; + font-size: 1.6em; + line-height: 1.2; + border-color: #eee; + } + #wiki-rightbar .markdown-body h2 { + padding-bottom: 5px; + font-size: 1.4em; + line-height: 1.2; + border-color: #eee; + } + #wiki-rightbar .markdown-body h3, + #wiki-rightbar .markdown-body h4, + #wiki-rightbar .markdown-body h5, + #wiki-rightbar .markdown-body h6 { + font-size: 1.2em; + line-height: 1.2; + border-color: #eee; + } + #wiki-rightbar .boxed-group > h3 { + cursor: pointer; + } + #wiki-rightbar .boxed-group .caret-collapsed { + display: none; + } + #wiki-rightbar .boxed-group.collapsed .caret-expanded { + display: none; + } + #wiki-rightbar .boxed-group.collapsed .caret-collapsed { + display: inline; + } + #wiki-rightbar .boxed-group.collapsed > h3 { + border-bottom: 1px solid #d8d8d8; + border-radius: 3px; + } + #wiki-rightbar .boxed-group.collapsed .boxed-group-inner { + display: none; + } + #wiki-rightbar p:last-child, + #wiki-rightbar ul:last-child, + #wiki-rightbar ol:last-child { + margin-bottom: 0; + } + .wiki-pages { + padding: 0; + margin: 0; + list-style-type: none; + } + .wiki-page-link { + display: block; + padding: 6px 10px; + word-wrap: break-word; + } + .has-rightbar #wiki-body, + .has-rightbar #wiki-footer { + margin-right: 280px; + } + #wiki-footer { + margin: 20px 0 50px; + clear: both; + } + #wiki-footer .markdown-body { + font-size: 13px; + } + .wiki-wrapper .blankslate.wiki { + padding: 115px 0; + } + .wiki-wrapper .blankslate.wiki p.has-fixed-width { + text-align: center; + } + .wiki-wrapper .gh-header .divider { + padding: 0 3px 0 2px; + } + .wiki-wrapper .gh-header-meta { + padding-bottom: 15px; + margin-top: 6px; + } + .wiki-wrapper a.history { + color: inherit; + } + .wiki-wrapper a.history:hover { + color: #555; + } + .wiki-wrapper.edit h1 { + font-weight: normal; + color: inherit; + } + .wiki-wrapper.edit h1 strong { + color: #000; + } + .wiki-wrapper .wiki-empty-box { + display: block; + padding: 10px 0; + margin: 20px 0; + color: #767676; + text-align: center; + border: 1px dashed #ddd; + border-radius: 3px; + -webkit-transition: all 0.1s ease-in-out; + transition: all 0.1s ease-in-out; + } + .wiki-wrapper .wiki-empty-box .octicon-plus { + margin-right: 4px; + opacity: 0.4; + } + .wiki-wrapper .wiki-empty-box:hover { + color: #767676; + text-decoration: none; + border-color: #ccc; + } + .wiki-wrapper .wiki-auxiliary-content { + background-color: #f1f1f1; + background-image: -webkit-linear-gradient(#fafafa, #f1f1f1); + background-image: linear-gradient(#fafafa, #f1f1f1); + background-repeat: repeat-x; + background-repeat: no-repeat; + background-size: 100% 50px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06); + } + .wiki-wrapper + .wiki-auxiliary-content.markdown-body.wiki-writable + > *:nth-child(2) { + margin-top: 0 !important; + } + .wiki-wrapper .wiki-auxiliary-content .wiki-edit-link { + position: relative; + z-index: 2; + float: right; + color: #767676; + opacity: 0.2; + -webkit-transition: opacity 0.2s ease-in-out; + transition: opacity 0.2s ease-in-out; + } + .wiki-wrapper .wiki-auxiliary-content .wiki-edit-link:hover { + text-decoration: none; + opacity: 1; + } + .wiki-wrapper .wiki-auxiliary-content-no-bg { + background: #fff; + } + .wiki-wrapper .wiki-custom-sidebar { + padding: 10px; + margin-bottom: 20px; + border: solid 1px #e2e2e2; + border-radius: 3px; + } + .wiki-wrapper .wiki-custom-sidebar > :nth-child(2) { + margin-top: 0; + } + .wiki-wrapper .wiki-custom-sidebar .octicon-pencil { + position: relative; + z-index: 10; + float: right; + margin-left: 15px; + color: #767676; + } + .wiki-wrapper .wiki-custom-sidebar .octicon-pencil:hover { + color: #333; + text-decoration: none; + } + .wiki-wrapper #wiki-footer { + margin: 30px 30px 0; + clear: none; + } + .wiki-wrapper #wiki-footer .markdown-body { + padding: 10px 15px; + } + .wiki-wrapper #wiki-footer .wiki-empty-box { + margin: 0 -30px; + } + .wiki-wrapper #wiki-footer .wiki-edit-link { + right: -5px; + } + .wiki-wrapper.compare .gh-header { + margin-bottom: 20px; + } + .wiki-wrapper .wiki-history { + margin-top: 20px; + } + .wiki-wrapper .wiki-history .checkbox { + width: 30px; + text-align: center; + } + .wiki-wrapper .wiki-history .author { + width: 200px; + } + .wiki-wrapper .wiki-history .author img { + display: block; + float: left; + margin-right: 6px; + } + .wiki-wrapper .wiki-history .date { + color: #bbb; + white-space: nowrap; + } + .wiki-wrapper .wiki-history .commit { + max-width: 450px; + overflow: hidden; + text-overflow: ellipsis; + } + .wiki-wrapper .wiki-history .commit-meta { + width: 160px; + padding-right: 10px; + text-align: right; + white-space: nowrap; + } + .wiki-wrapper .wiki-history .commit-meta code { + display: inline-block; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + line-height: 16px; + vertical-align: top; + } + .wiki-wrapper .wiki-history .commit-id { + color: #bbb; + } + .wiki-wrapper .wiki-history .commit-id:hover { + color: #4078c0; + } + .wiki-wrapper #wiki-rightbar .sidebar-button { + margin-top: 10px; + } + .wiki-wrapper #wiki-content { + clear: both; + } + .wiki-wrapper #wiki-content .markdown-body { + word-break: break-word; + } + .wiki-wrapper #wiki-content #gollum-editor-title-field { + margin: 0 0 14px; + } + .wiki-wrapper #wiki-content .file-wrap { + margin-top: 20px; + border-top: 1px solid #ddd; + border-radius: 3px; + } + .wiki-wrapper #wiki-content .file-wrap .files { + border-radius: 3px; + } + .wiki-pages-box .wiki-more-pages { + display: none; + } + .wiki-pages-box.wiki-show-more .wiki-more-pages, + .wiki-pages-box .filterable-active .wiki-more-pages { + display: block; + } + .wiki-pages-box.wiki-show-more .wiki-more-pages-link, + .wiki-pages-box .filterable-active .wiki-more-pages-link { + display: none; + } + .wiki-pages-box .wiki-more-pages-link { + box-shadow: inset 0 1px 0 #e5e5e5; + } + .wiki-pages-box .wiki-more-pages-link a { + display: block; + padding: 3px; + color: #7aa1d3; + text-align: center; + } + .wiki-pages-box .wiki-more-pages-link a:hover { + color: #4078c0; + text-decoration: none; + } + .wiki-wrapper.history #gollum-footer ul.actions li { + margin: 0 0.6em 0 0; + } + .wiki-wrapper.results #results { + border-bottom: 1px solid #ccc; + margin-bottom: 2em; + padding-bottom: 2em; + } + .wiki-wrapper #results ul { + margin: 2em 0 0; + padding: 0; + } + .wiki-wrapper #results li { + font-size: 1.2em; + line-height: 1.6em; + list-style-position: outside; + padding: 0.2em 0; + } + .wiki-wrapper #results .count { + color: #767676; + } + .wiki-wrapper .results #no-results { + font-size: 1.2em; + line-height: 1.6em; + margin-top: 2em; + } + .wiki-actions { + display: block; + list-style-type: none; + overflow: hidden; + padding: 0; + } + .results .wiki-actions li { + margin: 0 1em 0 0; + } + .compare .wiki-actions { + margin-bottom: 1.4em; + } + .compare .wiki-actions li { + margin-left: 0; + margin-right: 0.6em; + } + .wiki-wrapper .file .data .line_numbers { + width: 1%; + font-size: 12px; + } + .zeroclipboard-link { + color: #4078c0; + cursor: pointer; + background: none; + border: 0; + padding: 0; + margin: 0; + } + .zeroclipboard-link .octicon { + display: block; + } + + + + +
+
+
+
+
+

CHANGELOG.md

- -
-

-Macrostrat API v2 Changelog

- -

-tl;dr

- -
    -
  • Added ?sample to every route (except /mobile), which returns 5 records.
  • -
  • The input and output parameter id no longer exists. All identifiers are now descriptive, for example unit_id, col_id, and econ_id.
  • -
  • Numerous routes have been removed (column, unit_contacts, pbdb_report, section_stats, geologic_units/map, geologic_units/intersection and geologic_units)
  • -
  • Every route outputs JSON by default
  • -
  • -columns and sections are summaries of the data returned by units -
  • -
  • -lith, environ and econ have been refactored to return valid JSON instead of pipe-delimited strings
  • -
- -

-/column

- -

Removed - use /columns and /units instead.

- -

-/columns

- -
    -
  • This route has been reworked so that it is almost identical to units, but groups by and summarizes columns
  • -
  • Format of lithology fields in CSV output has changed. Instead of "name proportion|name proportion" it is now "name - proportion|name - proportion"
  • -
  • Added ability to query to environ_id, econ_id, econ, econ_type, and econ_class -
  • -
  • Changes to output fields
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
oldold examplenewnew example
units[1,2,3]RemovedRemoved
lith_max_thick1219RemovedRemoved
lith_min_thick1001RemovedRemoved
pbdb_occs9342RemovedRemoved
lith_types["carbonate"]lith_type[{"type": "carbonate", "prop": 1}]
sections[2,3,4]RemovedRemoved
area43242.2col_area43242.2
N/AN/Agroup_col_id2.1
N/AN/Aenviron[{class: "marine", type: "siliciclastic", name: "submarine fan", environ_id: 37}]
lith"shale 0.1250siltstone 0.1250"
N/AN/Aecon[{type: "hydrocarbon", name: "oil reservoir", econ_id: 4, class: "energy"}]
- -
    -
  • Default short and long response fields changed: -| old short | new short | -|--------------------------|----------------| -| col_id, area, units, max_thick, min_thick, lith_max_thick, lith_min_thick, lith_types | col_id, col_name, col_group, col_group_id, col_area, project_id |
  • -
- - - - - - - - - - - - - - -
old long (in addition to short)new long (in addition to short)
col_name, col_group, col_group_id, b_age, t_age, sections, pbdb_collections, pbdb_occsmax_thick, min_thick, b_age, t_age, pbdb_collections, lith, environ, econ
- -

-/sections

- -
    -
  • Input and output parameters have changed to be identical to those of units. See changes made to that route for more details.
  • -
  • Major conceptual change - now dynamically computes packages based on query (thus multiple objects may share a section_id), where a package is a temporally gap bound section of units.
  • -
- -

-/section_stats

- -

Removed - use /sections instead.

- -

-/fossils

- -
    -
  • Default output is now JSON instead of GeoJSON
  • -
  • Added CSV output
  • -
  • Changes to output field names:
  • -
- - - - - - - - - - - - - - - - - - - - - - -
oldnew
collection_nocltn_id
occpbdb_occs
N/Acltn_name
- -

-/units

- -
    -
  • Format of lithology fields in CSV output has changed. Instead of "name proportion|name proportion" it is now "name - proportion|name - proportion"
  • -
  • Empty output fields now return empty strings or arrays instead of NULLs, except strat_name_id
  • -
  • Added ability to query to lith_id, environ_id, econ_id, econ, econ_type, econ_class, and cltn_id (PBDB collection number)
  • -
  • Changes to input parameter names and output fields:
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
oldnew
idunit_id
strat_idstrat_name_id
u_colorRemoved
pbdbpbdb_collections
LO_hRemoved
FO_hRemoved
position_bottomRemoved
t_intervalt_int_id
b_intervalb_int_id
LO_intervalt_int_name
FO_intervalb_int_name
LO_aget_int_age
FO_ageb_int_age
N/Aecon[]
strat_nameunit_name
N/Aecon
N/Ameasure
- -
    -
  • Changes to the format of output fields:
  • -
- - - - - - - - - - - - - - - - - - -
oldnew
lith (string), lith_class (string), lith_type (string)lith (array of objects)
environ (string), environ_class (string), environ_type (string)environ (array of objects)
- -

-/unit_contacts

- -

Removed - use /units instead.

- -

-/pbdb_report

- -

Removed

- -

-/defs/lithologies

- -
    -
  • input and output parameter id is now lith_id -
  • -
  • Multiple input lith_id now accepted
  • -
  • Removed lith prefix from all fields except lith_id -
  • -
- -

-/defs/lithology_attributes

- -
    -
  • input and output parameter id is now lith_att_id -
  • -
  • Multiple input lith_att_id now accepted
  • -
  • + Removed lith_att prefix from all fields except lith_att_id -
  • -
- -

-/defs/columns

- -
    -
  • input parameters col_id and col_group_id now accept multiple ids
  • -
- -

-/defs/environments

- -
    -
  • input and output parameter id is now environ_id -
  • -
  • + Removed environ prefix from all fields except environ_id -
  • -
- -

-/defs/econs

- -
    -
  • New route for finding economic definitions
  • -
- -

-/defs/intervals

- -
    -
  • Can now specify a name query parameter
  • -
  • Changes to input and output parameters:
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
oldnew
idint_id
late_aget_age
early_ageb_age
typeint_type
timescale_idtimescales
- -
    -
  • Instead of timescale_id returning an array of timescale_ids, timescales returns an array of objects, where each object has a timescale_id and name.
  • -
- -

-/defs/strat_names

- -
    -
  • parameter id is now strat_name_id -
  • -
  • parameter name is now strat_name -
  • -
  • parameter name_like is now strat_name_like -
  • -
  • parameter early_age is now b_age -
  • -
  • parameter late_age is now t_age -
  • -
  • The rank parameter can be used with strat_name, strat_name_like, strat_name_id, and all -
  • -
  • By default, requesting a strat_name or strat_name_id will only return the matching name. Previously this would also return all associated children
  • -
  • A parameter rule was added. To return a strat name and all associated children, use rule=down, and to return the entire hierarchy of a given strat name use rule=all.
  • -
- -

-/defs/measurements

- -
    -
  • input and output parameter id is now measure_id -
  • -
  • Removed measurement prefix from all fields except measure_id -
  • -
- -

-/defs/projects

- -
    -
  • Output paramter id is now project_id -
  • -
- -

-/defs/timescales

- -
    -
  • Output paramter id is now timescale_id -
  • -
- -

-/defs/refs

- -
    -
  • Route added for fetching reference definitions.
  • -
- -

-/geologic_units/map

- -

Removed - use /geologic_units/gmus and /geologic_units/gmna instead.

- -

-/geologic_units/intersection

- -

Removed - use /geologic_units/gmus and /geologic_units/gmna instead.

- -

-/geologic_units

- -

Removed - use /geologic_units/gmus and /geologic_units/gmna instead.

- -

-/geologic_units/gmna (formerly /geologic_units?type=gmna)

- -
    -
  • Added CSV output
  • -
  • Added input variable shape, which accepts a valid WKT polygon. If used, a buffer in km2 can also be specified.
  • -
  • Output parameter names and data types have changed:
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
oldnew
min_aget_interval
age_top (string)t_age (float)
max_ageb_interval
age_bottom (string)b_age (float)
interval_namecontaining_interval
N/Acolor
lithologylith
N/Alith_type
N/Alith_class
N/Agid
- -

The following output fields have been added: -lith_type, lith_class, and gid

- -

-/geologic_units/gmus (formerly /geologic_units?type=gmus)

- -
    -
  • Added CSV output
  • -
  • Added input variable shape, which accepts a valid WKT polygon. If used, a buffer in km2 can also be specified.
  • -
  • Input value unit_name is now search -
  • -
  • Added input variable strat_name_id, which allows direct querying of Macrostrat stratigraphic names that have been matched to GMUS. Example /api/v2/geologic_units/gmus?strat_name_id=1,2,3 -
  • -
  • Added input variable unit_id, which allows direct querying of GMUS units matched to Macrostrat units.
  • -
  • Adding adjacents=true now allowed when specifying a gid
  • -
  • Improved the handling of adjacents=true when specifying a latitude and longitude
  • -
  • Output parameter names and data types have changed:
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
oldnew
lith1, lith2, lith3, lith4, lith5 (strings)lithology (array)
rt1, rt2, rt2 (strings)rocktype (array)
min_aget_interval
age_top (string)t_age (float)
max_ageb_interval
age_bottom (string)b_age (float)
unit_agecontaining_interval
N/Acolor
- -

-/geologic_units/burwell

- -
    -
  • New route for returning homogenized map data. Includes the data contained in /geologic_units/gmna and /geologic_units/gmus, along with many additional sources.
  • -
- -

-/paleogeography

- -
    -
  • Renamed plateid to plate_id -
  • -
- -

-/mobile/fossils

- -
    -
  • Changed output id to cltn_id -
  • -
  • Changed output name to cltn_name -
  • -
- -

-/mobile/point_details

- -
    -
  • Under gmus, rocktype1, rocktype2, and rocktype3 have been collapsed into rocktype, which is an array
  • -
  • Under column, id has been renamed col_id -
  • -
  • Under units, id has been renamed unit_id, and pbdb has been renamed pbdb_cltns, and lith is now an array of objects, with each object having a type and prop, or proportion.
  • -
+
+

+ Macrostrat API v2 Changelog +

+ +

+ tl;dr +

+ +
    +
  • + Added ?sample to every route (except + /mobile), which returns 5 records. +
  • +
  • + The input and output parameter id no longer + exists. All identifiers are now descriptive, for example + unit_id, col_id, and + econ_id. +
  • +
  • + Numerous routes have been removed (column, + unit_contacts, pbdb_report, + section_stats, + geologic_units/map, + geologic_units/intersection and + geologic_units) +
  • +
  • Every route outputs JSON by default
  • +
  • + columns and sections are + summaries of the data returned by units +
  • +
  • + lith, environ and + econ have been refactored to return valid + JSON instead of pipe-delimited strings +
  • +
+ +

+ /column +

+ +

+ Removed - use /columns and + /units instead. +

+ +

+ /columns +

+ +
    +
  • + This route has been reworked so that it is almost + identical to units, but groups by and summarizes columns +
  • +
  • + Format of lithology fields in CSV output has changed. + Instead of "name proportion|name proportion" it is now + "name - proportion|name - proportion" +
  • +
  • + Added ability to query to environ_id, + econ_id, econ, + econ_type, and econ_class +
  • +
  • Changes to output fields
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
oldold examplenewnew example
units[1,2,3]RemovedRemoved
lith_max_thick1219RemovedRemoved
lith_min_thick1001RemovedRemoved
pbdb_occs9342RemovedRemoved
lith_types["carbonate"]lith_type[{"type": "carbonate", "prop": 1}]
sections[2,3,4]RemovedRemoved
area43242.2col_area43242.2
N/AN/Agroup_col_id2.1
N/AN/Aenviron + [{class: "marine", type: "siliciclastic", name: + "submarine fan", environ_id: 37}] +
lith"shale 0.1250siltstone 0.1250"
N/AN/Aecon + [{type: "hydrocarbon", name: "oil reservoir", econ_id: + 4, class: "energy"}] +
+ +
    +
  • + Default short and long response fields changed: | old + short | new short | + |--------------------------|----------------| | col_id, + area, units, max_thick, min_thick, lith_max_thick, + lith_min_thick, lith_types | col_id, col_name, col_group, + col_group_id, col_area, project_id | +
  • +
+ + + + + + + + + + + + + + +
old long (in addition to short)new long (in addition to short)
+ col_name, col_group, col_group_id, b_age, t_age, + sections, pbdb_collections, pbdb_occs + + max_thick, min_thick, b_age, t_age, pbdb_collections, + lith, environ, econ +
+ +

+ /sections +

+ +
    +
  • + Input and output parameters have changed to be identical + to those of units. See changes made to that + route for more details. +
  • +
  • + Major conceptual change - now dynamically computes + packages based on query (thus multiple objects may share a + section_id), where a package is a temporally + gap bound section of units. +
  • +
+ +

+ /section_stats +

+ +

Removed - use /sections instead.

+ +

+ /fossils +

+ +
    +
  • Default output is now JSON instead of GeoJSON
  • +
  • Added CSV output
  • +
  • Changes to output field names:
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
oldnew
collection_nocltn_id
occpbdb_occs
N/Acltn_name
+ +

+ /units +

+ +
    +
  • + Format of lithology fields in CSV output has changed. + Instead of "name proportion|name proportion" it is now + "name - proportion|name - proportion" +
  • +
  • + Empty output fields now return empty strings or arrays + instead of NULLs, except strat_name_id +
  • +
  • + Added ability to query to lith_id, + environ_id, econ_id, + econ, econ_type, + econ_class, and cltn_id (PBDB + collection number) +
  • +
  • Changes to input parameter names and output fields:
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
oldnew
idunit_id
strat_idstrat_name_id
u_colorRemoved
pbdbpbdb_collections
LO_hRemoved
FO_hRemoved
position_bottomRemoved
t_intervalt_int_id
b_intervalb_int_id
LO_intervalt_int_name
FO_intervalb_int_name
LO_aget_int_age
FO_ageb_int_age
N/Aecon[]
strat_nameunit_name
N/Aecon
N/Ameasure
+ +
    +
  • Changes to the format of output fields:
  • +
+ + + + + + + + + + + + + + + + + + +
oldnew
+ lith (string), lith_class (string), lith_type (string) + lith (array of objects)
+ environ (string), environ_class (string), environ_type + (string) + environ (array of objects)
+ +

+ /unit_contacts +

+ +

Removed - use /units instead.

+ +

+ /pbdb_report +

+ +

Removed

+ +

+ /defs/lithologies +

+ +
    +
  • + input and output parameter id is now + lith_id +
  • +
  • Multiple input lith_id now accepted
  • +
  • + Removed lith prefix from all fields except + lith_id +
  • +
+ +

+ /defs/lithology_attributes +

+ +
    +
  • + input and output parameter id is now + lith_att_id +
  • +
  • + Multiple input lith_att_id now accepted +
  • +
  • + + Removed lith_att prefix from all fields + except lith_att_id +
  • +
+ +

+ /defs/columns +

+ +
    +
  • + input parameters col_id and + col_group_id now accept multiple ids +
  • +
+ +

+ /defs/environments +

+ +
    +
  • + input and output parameter id is now + environ_id +
  • +
  • + + Removed environ prefix from all fields + except environ_id +
  • +
+ +

+ /defs/econs +

+ +
    +
  • New route for finding economic definitions
  • +
+ +

+ /defs/intervals +

+ +
    +
  • Can now specify a name query parameter
  • +
  • Changes to input and output parameters:
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
oldnew
idint_id
late_aget_age
early_ageb_age
typeint_type
timescale_idtimescales
+ +
    +
  • + Instead of timescale_id returning an array of + timescale_ids, + timescales returns an array of objects, where + each object has a timescale_id and + name. +
  • +
+ +

+ /defs/strat_names +

+ +
    +
  • + parameter id is now + strat_name_id +
  • +
  • + parameter name is now strat_name +
  • +
  • + parameter name_like is now + strat_name_like +
  • +
  • + parameter early_age is now b_age +
  • +
  • + parameter late_age is now t_age +
  • +
  • + The rank parameter can be used with + strat_name, strat_name_like, + strat_name_id, and all +
  • +
  • + By default, requesting a strat_name or + strat_name_id will only return the matching + name. Previously this would also return all associated + children +
  • +
  • + A parameter rule was added. To return a strat + name and all associated children, use + rule=down, and to return the entire hierarchy + of a given strat name use rule=all. +
  • +
+ +

+ /defs/measurements +

+ +
    +
  • + input and output parameter id is now + measure_id +
  • +
  • + Removed measurement prefix from all fields + except measure_id +
  • +
+ +

+ /defs/projects +

+ +
    +
  • + Output paramter id is now + project_id +
  • +
+ +

+ /defs/timescales +

+ +
    +
  • + Output paramter id is now + timescale_id +
  • +
+ +

+ /defs/refs +

+ +
    +
  • Route added for fetching reference definitions.
  • +
+ +

+ /geologic_units/map +

+ +

+ Removed - use /geologic_units/gmus and + /geologic_units/gmna instead. +

+ +

+ /geologic_units/intersection +

+ +

+ Removed - use /geologic_units/gmus and + /geologic_units/gmna instead. +

+ +

+ /geologic_units +

+ +

+ Removed - use /geologic_units/gmus and + /geologic_units/gmna instead. +

+ +

+ /geologic_units/gmna (formerly /geologic_units?type=gmna) +

+ +
    +
  • Added CSV output
  • +
  • + Added input variable shape, which accepts a + valid WKT polygon. If used, a buffer in km2 + can also be specified. +
  • +
  • Output parameter names and data types have changed:
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
oldnew
min_aget_interval
age_top (string)t_age (float)
max_ageb_interval
age_bottom (string)b_age (float)
interval_namecontaining_interval
N/Acolor
lithologylith
N/Alith_type
N/Alith_class
N/Agid
+ +

+ The following output fields have been added: + lith_type, lith_class, and + gid +

+ +

+ /geologic_units/gmus (formerly /geologic_units?type=gmus) +

+ +
    +
  • Added CSV output
  • +
  • + Added input variable shape, which accepts a + valid WKT polygon. If used, a buffer in km2 + can also be specified. +
  • +
  • + Input value unit_name is now + search +
  • +
  • + Added input variable strat_name_id, which + allows direct querying of Macrostrat stratigraphic names + that have been matched to GMUS. Example + /api/v2/geologic_units/gmus?strat_name_id=1,2,3 +
  • +
  • + Added input variable unit_id, which allows + direct querying of GMUS units matched to Macrostrat units. +
  • +
  • + Adding adjacents=true now allowed when + specifying a gid +
  • +
  • + Improved the handling of adjacents=true when + specifying a latitude and longitude +
  • +
  • Output parameter names and data types have changed:
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
oldnew
lith1, lith2, lith3, lith4, lith5 (strings)lithology (array)
rt1, rt2, rt2 (strings)rocktype (array)
min_aget_interval
age_top (string)t_age (float)
max_ageb_interval
age_bottom (string)b_age (float)
unit_agecontaining_interval
N/Acolor
+ +

+ /geologic_units/burwell +

+ +
    +
  • + New route for returning homogenized map data. Includes the + data contained in /geologic_units/gmna and + /geologic_units/gmus, along with many + additional sources. +
  • +
+ +

+ /paleogeography +

+ +
    +
  • + Renamed plateid to plate_id +
  • +
+ +

+ /mobile/fossils +

+ +
    +
  • + Changed output id to cltn_id +
  • +
  • + Changed output name to cltn_name +
  • +
+ +

+ /mobile/point_details +

+ +
    +
  • + Under gmus, rocktype1, + rocktype2, and rocktype3 have + been collapsed into rocktype, which is an + array +
  • +
  • + Under column, id has been + renamed col_id +
  • +
  • + Under units, id has been renamed + unit_id, and pbdb has been + renamed pbdb_cltns, and lith is + now an array of objects, with each object having a + type and prop, or proportion. +
  • +
+
- - +
+
 
-
-
 
-
- - \ No newline at end of file + + + diff --git a/v2/column-cache-refresh.ts b/v2/column-cache-refresh.ts index e49d1a2a..46238918 100644 --- a/v2/column-cache-refresh.ts +++ b/v2/column-cache-refresh.ts @@ -1,12 +1,16 @@ -const larkin = require('./larkin') -const credentials = require('./credentials') +const larkin = require("./larkin"); +const credentials = require("./credentials"); module.exports = (req, res, next) => { - if (req.query && req.query.cacheRefreshKey && req.query.cacheRefreshKey === credentials.cacheRefreshKey) { - larkin.setupCache() - res.json({'success': 'cache refreshed'}) + if ( + req.query && + req.query.cacheRefreshKey && + req.query.cacheRefreshKey === credentials.cacheRefreshKey + ) { + larkin.setupCache(); + res.json({ success: "cache refreshed" }); } else { - res.status(401) - res.json({'fail': 'you do not have permissions to execute this action'}) + res.status(401); + res.json({ fail: "you do not have permissions to execute this action" }); } -} +}; diff --git a/v2/columns.ts b/v2/columns.ts index ed2bbc5f..0e491991 100644 --- a/v2/columns.ts +++ b/v2/columns.ts @@ -1,139 +1,195 @@ var api = require("./api"), - async = require("async"), - dbgeo = require("dbgeo"), - gp = require("geojson-precision"), - _ = require("underscore"), - larkin = require("./larkin"); + async = require("async"), + dbgeo = require("dbgeo"), + gp = require("geojson-precision"), + _ = require("underscore"), + larkin = require("./larkin"); - -module.exports = function(req, res, next, callback) { +module.exports = function (req, res, next, callback) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - async.waterfall([ - // First pass the request to the /units route and get the long response - function(callback) { - if ("all" in req.query) { - larkin.cache.fetch("unitSummary", function(data) { - callback(null, data); - }); - } else { - callback(null, null); - } - }, - - function(data, callback) { - if (data) { - return callback(null, data); - } - - require("./units")(req, null, null, function(error, result) { - if (error) { - callback(error); + async.waterfall( + [ + // First pass the request to the /units route and get the long response + function (callback) { + if ("all" in req.query) { + larkin.cache.fetch("unitSummary", function (data) { + callback(null, data); + }); + } else { + callback(null, null); } - if (!result || !result.length) { - return callback(null, null); + }, + + function (data, callback) { + if (data) { + return callback(null, data); } - var cols = _.groupBy(result, function(d) { - return d.col_id; - }); - var new_cols = {} - Object.keys(cols).forEach(function(col_id) { - new_cols[col_id] = { - "max_thick": _.reduce(cols[col_id].map(function(d) { return d.max_thick}) , function(a, b) { return a + b}, 0), - "max_min_thick": _.reduce(cols[col_id].map(function(d) { - if (d.min_thick === 0) { - return d.max_thick; - } else { - return d.min_thick - } - }) , function(a, b) { return a + b}, 0), - "min_min_thick": _.reduce(cols[col_id].map(function(d) { return d.min_thick}) , function(a, b) { return a + b}, 0), - "b_age": _.max(cols[col_id], function(d) { return d.b_age; }).b_age, - "t_age": _.min(cols[col_id], function(d) { return d.t_age; }).t_age, - "b_int_name": _.max(cols[col_id], function(d) { return d.b_age; }).b_int_name, - "t_int_name": _.min(cols[col_id], function(d) { return d.t_age; }).t_int_name, + require("./units")(req, null, null, function (error, result) { + if (error) { + callback(error); + } + if (!result || !result.length) { + return callback(null, null); + } + var cols = _.groupBy(result, function (d) { + return d.col_id; + }); + var new_cols = {}; + Object.keys(cols).forEach(function (col_id) { + new_cols[col_id] = { + max_thick: _.reduce( + cols[col_id].map(function (d) { + return d.max_thick; + }), + function (a, b) { + return a + b; + }, + 0, + ), + max_min_thick: _.reduce( + cols[col_id].map(function (d) { + if (d.min_thick === 0) { + return d.max_thick; + } else { + return d.min_thick; + } + }), + function (a, b) { + return a + b; + }, + 0, + ), + min_min_thick: _.reduce( + cols[col_id].map(function (d) { + return d.min_thick; + }), + function (a, b) { + return a + b; + }, + 0, + ), - "pbdb_collections": _.reduce(cols[col_id].map(function(d) { return d.pbdb_collections }), function(a, b) { return a + b}, 0), + b_age: _.max(cols[col_id], function (d) { + return d.b_age; + }).b_age, + t_age: _.min(cols[col_id], function (d) { + return d.t_age; + }).t_age, + b_int_name: _.max(cols[col_id], function (d) { + return d.b_age; + }).b_int_name, + t_int_name: _.min(cols[col_id], function (d) { + return d.t_age; + }).t_int_name, - "lith": larkin.summarizeAttribute(cols[col_id], "lith"), - "environ": larkin.summarizeAttribute(cols[col_id], "environ"), - "econ": larkin.summarizeAttribute(cols[col_id], "econ"), + pbdb_collections: _.reduce( + cols[col_id].map(function (d) { + return d.pbdb_collections; + }), + function (a, b) { + return a + b; + }, + 0, + ), - "t_units": cols[col_id].length, - "t_sections": _.uniq(cols[col_id].map(function(d) { return d.section_id })).length - } - }); + lith: larkin.summarizeAttribute(cols[col_id], "lith"), + environ: larkin.summarizeAttribute(cols[col_id], "environ"), + econ: larkin.summarizeAttribute(cols[col_id], "econ"), - callback(null, new_cols); - }); - }, + t_units: cols[col_id].length, + t_sections: _.uniq( + cols[col_id].map(function (d) { + return d.section_id; + }), + ).length, + }; + }); - function(new_cols, callback) { - if (!(new_cols)) { - return callback(null, null, []); - } + callback(null, new_cols); + }); + }, - if ("all" in req.query) { - if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - larkin.cache.fetch("columnsGeom", function(data) { - callback(null, new_cols, data); - }); - } else { - larkin.cache.fetch("columnsNoGeom", function(data) { - callback(null, new_cols, data); - }); + function (new_cols, callback) { + if (!new_cols) { + return callback(null, null, []); } - } else { - callback(null, new_cols, null); - } - }, - // Using the unique column IDs returned from units, query columns - function(new_cols, data, callback) { - if (!(new_cols)) { - return callback(null, null, []); - } + if ("all" in req.query) { + if (req.query.format && api.acceptedFormats.geo[req.query.format]) { + larkin.cache.fetch("columnsGeom", function (data) { + callback(null, new_cols, data); + }); + } else { + larkin.cache.fetch("columnsNoGeom", function (data) { + callback(null, new_cols, data); + }); + } + } else { + callback(null, new_cols, null); + } + }, - if (data) { - return callback(null, new_cols, data); - } + // Using the unique column IDs returned from units, query columns + function (new_cols, data, callback) { + if (!new_cols) { + return callback(null, null, []); + } - var geo = ""; - var params = [Object.keys(new_cols).map(function(d) { return parseInt(d) })]; - var limit = ("sample" in req.query) ? " LIMIT 5" : ""; - var groupBy = ""; - var orderby = ""; + if (data) { + return callback(null, new_cols, data); + } - if (req.query.status_code) { - params.push(decodeURI(req.query.status_code)) - } else { - params.push('active') - } + var geo = ""; + var params = [ + Object.keys(new_cols).map(function (d) { + return parseInt(d); + }), + ]; + var limit = "sample" in req.query ? " LIMIT 5" : ""; + var groupBy = ""; + var orderby = ""; - if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - if (req.query.shape) { - geo = ", ST_AsGeoJSON(ST_Intersection(col_areas.col_area, ST_MakeValid($3))) geojson"; - params.push(req.query.shape); + if (req.query.status_code) { + params.push(decodeURI(req.query.status_code)); } else { - geo = ", ST_AsGeoJSON(col_areas.col_area) geojson"; + params.push("active"); } - groupBy = ", col_areas.col_area"; - } - if (req.query.lat && req.query.lng && req.query.adjacents) { - orderby = "ORDER BY ST_Distance(ST_SetSRID(col_areas.col_area, 4326), ST_GeometryFromText($3, 4326))"; - params.push("POINT(" + larkin.normalizeLng(req.query.lng) + " " + req.query.lat + ")"); - groupBy = ", col_areas.col_area"; + if (req.query.format && api.acceptedFormats.geo[req.query.format]) { + if (req.query.shape) { + geo = + ", ST_AsGeoJSON(ST_Intersection(col_areas.col_area, ST_MakeValid($3))) geojson"; + params.push(req.query.shape); + } else { + geo = ", ST_AsGeoJSON(col_areas.col_area) geojson"; + } + groupBy = ", col_areas.col_area"; + } - } else if (req.query.col_id && req.query.adjacents) { - orderby = "ORDER BY ST_Distance(ST_Centroid(col_areas.col_area), (SELECT ST_Centroid(col_area) FROM macrostrat.col_areas WHERE col_id = $3))"; - params.push(req.query.col_id); - groupBy = ", col_areas.col_area"; - } - larkin.queryPg("burwell", ` + if (req.query.lat && req.query.lng && req.query.adjacents) { + orderby = + "ORDER BY ST_Distance(ST_SetSRID(col_areas.col_area, 4326), ST_GeometryFromText($3, 4326))"; + params.push( + "POINT(" + + larkin.normalizeLng(req.query.lng) + + " " + + req.query.lat + + ")", + ); + groupBy = ", col_areas.col_area"; + } else if (req.query.col_id && req.query.adjacents) { + orderby = + "ORDER BY ST_Distance(ST_Centroid(col_areas.col_area), (SELECT ST_Centroid(col_area) FROM macrostrat.col_areas WHERE col_id = $3))"; + params.push(req.query.col_id); + groupBy = ", col_areas.col_area"; + } + larkin.queryPg( + "burwell", + ` SELECT cols.id AS col_id, col_name, @@ -156,78 +212,109 @@ module.exports = function(req, res, next, callback) { GROUP BY col_areas.col_id, cols.id, col_groups.col_group, col_groups.id ${groupBy} ${orderby} ${limit} - `, params, function(error, result) { - if (error) return callback(error); - - callback(null, new_cols, result.rows); - }); - } - - // Once units and columns have been queried, wrap things up and send it - ], function(error, unit_data, column_data) { - if (error) { - console.log(error); - if (callback) { - return callback(error) - } - return larkin.error(req, res, next, error); - } + `, + params, + function (error, result) { + if (error) return callback(error); - if (column_data) { - column_data.forEach(function(d) { - if (typeof d.refs === "string" || d.refs instanceof String) { - d.refs = larkin.jsonifyPipes(d.refs, "integers"); - } + callback(null, new_cols, result.rows); + }, + ); + }, - if (req.query.response === "long") { - d = _.extend(d, unit_data[d.col_id]); + // Once units and columns have been queried, wrap things up and send it + ], + function (error, unit_data, column_data) { + if (error) { + console.log(error); + if (callback) { + return callback(error); + } + return larkin.error(req, res, next, error); + } - if (req.query.format === "csv") { - d.lith = larkin.pipifyAttrs(d.lith); - d.environ = larkin.pipifyAttrs(d.environ); - d.econ = larkin.pipifyAttrs(d.econ); + if (column_data) { + column_data.forEach(function (d) { + if (typeof d.refs === "string" || d.refs instanceof String) { + d.refs = larkin.jsonifyPipes(d.refs, "integers"); } - } - }); - } - - if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - dbgeo.parse(column_data || [], { - "geometryColumn": "geojson", - "geometryType": "geojson", - "outputFormat": larkin.getOutputFormat(req.query.format) - }, function(error, output) { - if (error) { - if (callback) return callback("An error was incurred during conversion") - larkin.error(req, res, next, "An error was incurred during conversion"); - } else { - if (larkin.getOutputFormat(req.query.format) === "geojson") { - output = gp(output, 4); + + if (req.query.response === "long") { + d = _.extend(d, unit_data[d.col_id]); + + if (req.query.format === "csv") { + d.lith = larkin.pipifyAttrs(d.lith); + d.environ = larkin.pipifyAttrs(d.environ); + d.econ = larkin.pipifyAttrs(d.econ); } + } + }); + } - if (callback) return callback(null, output) + if (req.query.format && api.acceptedFormats.geo[req.query.format]) { + dbgeo.parse( + column_data || [], + { + geometryColumn: "geojson", + geometryType: "geojson", + outputFormat: larkin.getOutputFormat(req.query.format), + }, + function (error, output) { + if (error) { + if (callback) + return callback("An error was incurred during conversion"); + larkin.error( + req, + res, + next, + "An error was incurred during conversion", + ); + } else { + if (larkin.getOutputFormat(req.query.format) === "geojson") { + output = gp(output, 4); + } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true, - refs: "refs" - }, { - data: output - }); + if (callback) return callback(null, output); - } - } - ); - } else { - if (callback) return callback(null, column_data) - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - compact: true, - refs: "refs" - }, { - data: column_data - }); - } - }); -} + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + compact: true, + refs: "refs", + }, + { + data: output, + }, + ); + } + }, + ); + } else { + if (callback) return callback(null, column_data); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + compact: true, + refs: "refs", + }, + { + data: column_data, + }, + ); + } + }, + ); +}; diff --git a/v2/credentials.example.ts b/v2/credentials.example.ts index 26c5f24d..b7c108d6 100644 --- a/v2/credentials.example.ts +++ b/v2/credentials.example.ts @@ -1,23 +1,23 @@ exports.mysql = { - host : 'localhost', - user : 'user', - password : 'password', - database : 'macrostrat', - socketPath: '/tmp/mysql.sock' -// socketPath: '/var/tmp/mariadb.sock' -} + host: "localhost", + user: "user", + password: "password", + database: "macrostrat", + socketPath: "/tmp/mysql.sock", + // socketPath: '/var/tmp/mariadb.sock' +}; exports.pg = { - host : 'localhost', - port : '5432', - user : 'postgres', - password : '' -} + host: "localhost", + port: "5432", + user: "postgres", + password: "", +}; // This is the default Redis port exports.redis = { - port: 6379 -} + port: 6379, +}; // Generate a hash by running: node -e "console.log(require('uuid/v4')())" -exports.cacheRefreshKey = 'put-hash-here' +exports.cacheRefreshKey = "put-hash-here"; diff --git a/v2/credentials.ts b/v2/credentials.ts index 83b91dea..dc6e6f1a 100644 --- a/v2/credentials.ts +++ b/v2/credentials.ts @@ -1,4 +1,10 @@ -const { mysql, pg, redis, cacheRefreshKey, postgresDatabases = {} } = require("../credentials.ts"); +const { + mysql, + pg, + redis, + cacheRefreshKey, + postgresDatabases = {}, +} = require("../credentials.ts"); exports.mysql = mysql; @@ -8,4 +14,4 @@ exports.redis = redis; // Generate a hash by running: node -e "console.log(require('uuid/v4')())" exports.cacheRefreshKey = cacheRefreshKey; -exports.postgresDatabases = postgresDatabases \ No newline at end of file +exports.postgresDatabases = postgresDatabases; diff --git a/v2/definitions/autocomplete.ts b/v2/definitions/autocomplete.ts index f5789a2c..5281ecbf 100644 --- a/v2/definitions/autocomplete.ts +++ b/v2/definitions/autocomplete.ts @@ -10,16 +10,34 @@ LEFT JOIN intervals ON intervals.id = strat_names_meta.interval_id; */ var api = require("../api"), - larkin = require("../larkin"), - _ = require("underscore"); + larkin = require("../larkin"), + _ = require("underscore"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var categories = ["columns", "econs", "econ_types", "econ_classes", "environments", "environment_types", "environment_classes", "groups", "intervals", "lithologies", "lithology_types", "lithology_classes", "lithology_attributes", "projects", "strat_name_concepts", "strat_name_orphans", "structures", "minerals"]; - + var categories = [ + "columns", + "econs", + "econ_types", + "econ_classes", + "environments", + "environment_types", + "environment_classes", + "groups", + "intervals", + "lithologies", + "lithology_types", + "lithology_classes", + "lithology_attributes", + "projects", + "strat_name_concepts", + "strat_name_orphans", + "structures", + "minerals", + ]; var types = []; @@ -30,7 +48,6 @@ module.exports = function(req, res, next) { types.push(includes[i]); } } - } else if (req.query.exclude) { var excludes = req.query.exclude.split(","); for (var j = 0; j < categories.length; j++) { @@ -43,34 +60,44 @@ module.exports = function(req, res, next) { } if (req.query.query || "sample" in req.query) { - var limit = ("sample" in req.query) ? 100 : 100, - query = ("sample" in req.query) ? "ma%" : (req.query.query.toLowerCase() + "%"); - - larkin.query("SELECT * FROM autocomplete WHERE name LIKE :query AND type IN (:types) LIMIT :limit", {"query": query, "types": types, "limit": limit}, function(error, result) { - if (error) { - larkin.error(req, res, next, error); - } else { - var parsed = _.groupBy(result, function(each) { return each.type }); - var keys = Object.keys(parsed); - - for (var i = 0; i < keys.length; i++) { - for (var j = 0; j < parsed[keys[i]].length; j++) { - delete parsed[keys[i]][j].type; + var limit = "sample" in req.query ? 100 : 100, + query = + "sample" in req.query ? "ma%" : req.query.query.toLowerCase() + "%"; + + larkin.query( + "SELECT * FROM autocomplete WHERE name LIKE :query AND type IN (:types) LIMIT :limit", + { query: query, types: types, limit: limit }, + function (error, result) { + if (error) { + larkin.error(req, res, next, error); + } else { + var parsed = _.groupBy(result, function (each) { + return each.type; + }); + var keys = Object.keys(parsed); + + for (var i = 0; i < keys.length; i++) { + for (var j = 0; j < parsed[keys[i]].length; j++) { + delete parsed[keys[i]][j].type; + } } - } - larkin.sendData(req, res, next, { - format: "json", - compact: true - }, { - data: parsed - }); - - } - - }); + larkin.sendData( + req, + res, + next, + { + format: "json", + compact: true, + }, + { + data: parsed, + }, + ); + } + }, + ); } else { return larkin.info(req, res, next); } - -} +}; diff --git a/v2/definitions/columns.ts b/v2/definitions/columns.ts index 257a23fc..add64d90 100644 --- a/v2/definitions/columns.ts +++ b/v2/definitions/columns.ts @@ -1,10 +1,10 @@ -var api = require("../api") -var larkin = require("../larkin") -var dbgeo = require('dbgeo') +var api = require("../api"); +var larkin = require("../larkin"); +var dbgeo = require("dbgeo"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { - return larkin.info(req, res, next) + return larkin.info(req, res, next); } var sql = ` @@ -14,7 +14,7 @@ module.exports = function(req, res, next, cb) { col_name, lat, lng, - ${req.query.format && api.acceptedFormats.geo[req.query.format] ? 'lng, lat,' : ''} + ${req.query.format && api.acceptedFormats.geo[req.query.format] ? "lng, lat," : ""} col_area, SUM(max_thick) as max_thick, GROUP_CONCAT(DISTINCT ref_id SEPARATOR '|') AS ref_id, @@ -27,86 +27,105 @@ module.exports = function(req, res, next, cb) { LEFT JOIN col_notes on cols.id=col_notes.col_id LEFT JOIN units_sections ON units_sections.col_id = cols.id LEFT JOIN units ON units_sections.unit_id=units.id - ` - var where = [] - var params = {} + `; + var where = []; + var params = {}; if (req.query.col_id) { - where.push("cols.id in (:col_id)") - params["col_id"] = larkin.parseMultipleIds(req.query.col_id) + where.push("cols.id in (:col_id)"); + params["col_id"] = larkin.parseMultipleIds(req.query.col_id); } if (req.query.col_group_id) { - where.push("cols.col_group_id IN (:col_group_id)") - params["col_group_id"] = larkin.parseMultipleIds(req.query.col_group_id) + where.push("cols.col_group_id IN (:col_group_id)"); + params["col_group_id"] = larkin.parseMultipleIds(req.query.col_group_id); } if (req.query.col_name) { - where.push("cols.col_name IN (:col_name)") - params["col_name"] = larkin.parseMultipleStrings(req.query.col_name) + where.push("cols.col_name IN (:col_name)"); + params["col_name"] = larkin.parseMultipleStrings(req.query.col_name); } if (req.query.project_id) { - where.push("cols.project_id IN (:project_id)") - params["project_id"] = larkin.parseMultipleIds(req.query.project_id) + where.push("cols.project_id IN (:project_id)"); + params["project_id"] = larkin.parseMultipleIds(req.query.project_id); } if (req.query.status) { - where.push("status_code = :status") - params["status"] = req.query.status + where.push("status_code = :status"); + params["status"] = req.query.status; } if (where.length) { - sql += ` WHERE ${where.join(' AND ')}` + sql += ` WHERE ${where.join(" AND ")}`; } - sql += " GROUP BY cols.id" + sql += " GROUP BY cols.id"; if ("sample" in req.query) { - sql += " LIMIT 5" + sql += " LIMIT 5"; } - larkin.query(sql, params, function(error, result) { + larkin.query(sql, params, function (error, result) { if (error) { if (cb) { - cb(error) + cb(error); } else { - return larkin.error(req, res, next, error) + return larkin.error(req, res, next, error); } } - result.forEach(function(d) { + result.forEach(function (d) { d.ref_id = larkin.jsonifyPipes(d.ref_id, "integers"); - }) + }); // if a geographic format is requested if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - dbgeo.parse(result, { - 'geometryType': 'll', - 'geometryColumn': ['lng', 'lat'], - 'outputFormat': larkin.getOutputFormat(req.query.format), - 'precision': 6 - }, (error, geoResult) => { - if (error) { - if (cb) { - return cb(error) + dbgeo.parse( + result, + { + geometryType: "ll", + geometryColumn: ["lng", "lat"], + outputFormat: larkin.getOutputFormat(req.query.format), + precision: 6, + }, + (error, geoResult) => { + if (error) { + if (cb) { + return cb(error); + } + return larkin.error(req, res, next, "Internal error", 500); } - return larkin.error(req, res, next, 'Internal error', 500) - } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'ref_id' - }, { - data: geoResult - }) - }) + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + refs: "ref_id", + }, + { + data: geoResult, + }, + ); + }, + ); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'ref_id' - }, { - data: result - }) + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + refs: "ref_id", + }, + { + data: result, + }, + ); } - - }) -} + }); +}; diff --git a/v2/definitions/define.ts b/v2/definitions/define.ts index ebd62a34..c0986d27 100644 --- a/v2/definitions/define.ts +++ b/v2/definitions/define.ts @@ -1,29 +1,46 @@ var api = require("../api"), - larkin = require("../larkin"), - async = require("async"); + larkin = require("../larkin"), + async = require("async"); -var validTypes = ["col_id", "econ_id", "econ_type", "econ_class", "environ_id", "envion_type", "environ_class", "col_group_id", "int_id", "lith_id", "lith_type", "lith_class", "lith_att_id", "strat_name_id", "strat_name_concept_id", "timescale_id"]; +var validTypes = [ + "col_id", + "econ_id", + "econ_type", + "econ_class", + "environ_id", + "envion_type", + "environ_class", + "col_group_id", + "int_id", + "lith_id", + "lith_type", + "lith_class", + "lith_att_id", + "strat_name_id", + "strat_name_concept_id", + "timescale_id", +]; var routeLookup = { - "col_id": "columns", - "econ_id": "econs", - "econ_type": "econs", - "econ_class": "econs", - "environ_id": "environments", - "environ_type": "environments", - "environ_class": "environments", - "col_group_id": "groups", - "int_id": "intervals", - "lith_id": "lithologies", - "lith_type": "lithologies", - "lith_class": "lithologies", - "lith_att_id": "lithology_attributes", - "strat_name_id": "strat_names", - "strat_name_concept_id": "strat_name_concepts", - "timescale_id": "timescales" -} + col_id: "columns", + econ_id: "econs", + econ_type: "econs", + econ_class: "econs", + environ_id: "environments", + environ_type: "environments", + environ_class: "environments", + col_group_id: "groups", + int_id: "intervals", + lith_id: "lithologies", + lith_type: "lithologies", + lith_class: "lithologies", + lith_att_id: "lithology_attributes", + strat_name_id: "strat_names", + strat_name_concept_id: "strat_name_concepts", + timescale_id: "timescales", +}; -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } @@ -31,34 +48,49 @@ module.exports = function(req, res, next) { var toQuery = {}; var results = {}; - Object.keys(req.query).forEach(function(d) { + Object.keys(req.query).forEach(function (d) { if (validTypes.indexOf(d) > -1) { toQuery[d] = req.query[d]; } }); + async.each( + Object.keys(toQuery), + function (key, callback) { + var request = { query: {} }; + request.query[key] = toQuery[key]; - async.each(Object.keys(toQuery), function(key, callback) { - var request = {query: {}} - request.query[key] = toQuery[key]; - - require("./" + routeLookup[key])(request, null, null, function(error, data) { + require("./" + routeLookup[key])( + request, + null, + null, + function (error, data) { + if (error) { + return callback(error); + } + results[routeLookup[key]] = data; + callback(null); + }, + ); + }, + function (error) { if (error) { - return callback(error); + return larkin.error(req, res, next, "Error getting defitions"); } - results[routeLookup[key]] = data; - callback(null); - }); - - }, function(error) { - if (error) { - return larkin.error(req, res, next, "Error getting defitions"); - } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json" - }, { - data: results - }); - }); -} + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + }, + { + data: results, + }, + ); + }, + ); +}; diff --git a/v2/definitions/drilling_sites.ts b/v2/definitions/drilling_sites.ts index eb810b94..8c050527 100644 --- a/v2/definitions/drilling_sites.ts +++ b/v2/definitions/drilling_sites.ts @@ -1,95 +1,114 @@ -var api = require("../api") -var larkin = require("../larkin") -var dbgeo = require('dbgeo') +var api = require("../api"); +var larkin = require("../larkin"); +var dbgeo = require("dbgeo"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { - return larkin.info(req, res, next) + return larkin.info(req, res, next); } var sql = ` SELECT epoch,leg,site,hole,lat,lng,col_id,col_group_id,penetration,cored,recovered,recovery,drilled_interval,drilled_intervals,cores,date_started,date_finished,comments,ref_id FROM offshore_sites - ` - var where = [] - var params = {} + `; + var where = []; + var params = {}; if (req.query.epoch) { - where.push("epoch in (:epoch)") - params["epoch"] = larkin.parseMultipleStrings(req.query.epoch) + where.push("epoch in (:epoch)"); + params["epoch"] = larkin.parseMultipleStrings(req.query.epoch); } if (req.query.leg) { - where.push("exp in (:leg)") - params["leg"] = larkin.parseMultipleStrings(req.query.leg) + where.push("exp in (:leg)"); + params["leg"] = larkin.parseMultipleStrings(req.query.leg); } if (req.query.site) { - where.push("site IN (:site)") - params["site"] = larkin.parseMultipleStrings(req.query.site) + where.push("site IN (:site)"); + params["site"] = larkin.parseMultipleStrings(req.query.site); } if (req.query.col_id) { - where.push("col_id IN (:col_id)") - params["col_id"] = larkin.parseMultipleIds(req.query.col_id) + where.push("col_id IN (:col_id)"); + params["col_id"] = larkin.parseMultipleIds(req.query.col_id); } if (req.query.col_group_id) { - where.push("site IN (:col_group_id)") - params["col_group_id"] = larkin.parseMultipleIds(req.query.col_group_id) + where.push("site IN (:col_group_id)"); + params["col_group_id"] = larkin.parseMultipleIds(req.query.col_group_id); } if (where.length) { - sql += ` WHERE ${where.join(' AND ')}` + sql += ` WHERE ${where.join(" AND ")}`; } if ("sample" in req.query) { - sql += " LIMIT 5" + sql += " LIMIT 5"; } -// console.log(sql); + // console.log(sql); - larkin.query(sql, params, function(error, result) { + larkin.query(sql, params, function (error, result) { if (error) { if (cb) { - cb(error) + cb(error); } else { - return larkin.error(req, res, next, error) + return larkin.error(req, res, next, error); } } // if a geographic format is requested if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - dbgeo.parse(result, { - 'geometryType': 'll', - 'geometryColumn': ['lng', 'lat'], - 'outputFormat': larkin.getOutputFormat(req.query.format), - 'precision': 6 - }, (error, geoResult) => { - if (error) { - if (cb) { - return cb(error) + dbgeo.parse( + result, + { + geometryType: "ll", + geometryColumn: ["lng", "lat"], + outputFormat: larkin.getOutputFormat(req.query.format), + precision: 6, + }, + (error, geoResult) => { + if (error) { + if (cb) { + return cb(error); + } + return larkin.error(req, res, next, "Internal error", 500); } - return larkin.error(req, res, next, 'Internal error', 500) - } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'ref_id' - }, { - data: geoResult - }) - }) + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + refs: "ref_id", + }, + { + data: geoResult, + }, + ); + }, + ); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'ref_id' - }, { - data: result - }) + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + refs: "ref_id", + }, + { + data: result, + }, + ); } - - }) -} + }); +}; diff --git a/v2/definitions/econs.ts b/v2/definitions/econs.ts index 0ace574b..b238f653 100644 --- a/v2/definitions/econs.ts +++ b/v2/definitions/econs.ts @@ -1,29 +1,27 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "SELECT econs.id AS econ_id, econ AS name, econ_type AS type, econ_class AS class, econ_color AS color, COUNT(distinct units_sections.unit_id) AS t_units FROM econs LEFT JOIN unit_econs ON unit_econs.econ_id = econs.id LEFT JOIN units_sections ON units_sections.unit_id = unit_econs.unit_id ", - params = {}; + var sql = + "SELECT econs.id AS econ_id, econ AS name, econ_type AS type, econ_class AS class, econ_color AS color, COUNT(distinct units_sections.unit_id) AS t_units FROM econs LEFT JOIN unit_econs ON unit_econs.econ_id = econs.id LEFT JOIN units_sections ON units_sections.unit_id = unit_econs.unit_id ", + params = {}; if ("all" in req.query) { // do nothing } else if (req.query.econ_id) { sql += " WHERE econs.id IN (:econ_ids)"; params["econ_ids"] = larkin.parseMultipleIds(req.query.econ_id); - - } else if (req.query.econ){ + } else if (req.query.econ) { sql += " WHERE econ = :econ"; params["econ"] = req.query.econ; - - } else if (req.query.econ_type){ + } else if (req.query.econ_type) { sql += " WHERE econ_type = :econ_type"; params["econ_type"] = req.query.econ_type; - - } else if (req.query.econ_class){ + } else if (req.query.econ_class) { sql += " WHERE econ_class = :econ_class"; params["econ_class"] = req.query.econ_class; } @@ -34,9 +32,11 @@ module.exports = function(req, res, next, cb) { sql += " LIMIT 5"; } - var format = (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json"; + var format = api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json"; - larkin.query(sql, params, function(error, data) { + larkin.query(sql, params, function (error, data) { if (error) { if (cb) { cb(error); @@ -48,13 +48,20 @@ module.exports = function(req, res, next, cb) { if (cb) { cb(null, data); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: data - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: data, + }, + ); } - }); -} +}; diff --git a/v2/definitions/environments.ts b/v2/definitions/environments.ts index 43d852f0..b9e9a785 100644 --- a/v2/definitions/environments.ts +++ b/v2/definitions/environments.ts @@ -1,26 +1,27 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "SELECT environs.id AS environ_id, environ AS name, environ_type AS type, environ_class AS class, environ_color AS color, COUNT(distinct units_sections.unit_id) AS t_units FROM environs LEFT JOIN unit_environs ON unit_environs.environ_id = environs.id LEFT JOIN units_sections ON units_sections.unit_id = unit_environs.unit_id ", - environ = ""; + var sql = + "SELECT environs.id AS environ_id, environ AS name, environ_type AS type, environ_class AS class, environ_color AS color, COUNT(distinct units_sections.unit_id) AS t_units FROM environs LEFT JOIN unit_environs ON unit_environs.environ_id = environs.id LEFT JOIN units_sections ON units_sections.unit_id = unit_environs.unit_id ", + environ = ""; if (req.query.all) { // do nothing } else if (req.query.environ_class) { sql += " WHERE environ_class= ?"; - environ=req.query.environ_class; - } else if (req.query.environ_type){ + environ = req.query.environ_class; + } else if (req.query.environ_type) { sql += " WHERE environ_type = ?"; environ = req.query.environ_type; - } else if (req.query.environ){ + } else if (req.query.environ) { sql += " WHERE environ = ?"; environ = req.query.environ; - } else if (req.query.environ_id){ + } else if (req.query.environ_id) { sql += " WHERE environs.id = ?"; environ = req.query.environ_id; } @@ -31,7 +32,7 @@ module.exports = function(req, res, next, cb) { sql += " LIMIT 5"; } - larkin.query(sql, [environ], function(error, data) { + larkin.query(sql, [environ], function (error, data) { if (error) { if (cb) { cb(error); @@ -43,12 +44,20 @@ module.exports = function(req, res, next, cb) { if (cb) { cb(null, data); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: data - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: data, + }, + ); } }); -} +}; diff --git a/v2/definitions/grainsizes.ts b/v2/definitions/grainsizes.ts index 03924e38..94736a01 100644 --- a/v2/definitions/grainsizes.ts +++ b/v2/definitions/grainsizes.ts @@ -1,7 +1,7 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } @@ -17,44 +17,48 @@ module.exports = function(req, res, next, cb) { max_size, classification FROM macrostrat.grainsize - ` - let where = [] - let params = [] + `; + let where = []; + let params = []; if (req.query.grain_id) { - where.push(`grain_id = ANY($${where.length + 1})`) - params.push(req.query.grain_id.split(',')) + where.push(`grain_id = ANY($${where.length + 1})`); + params.push(req.query.grain_id.split(",")); } if (req.query.grain_symbol) { - where.push(`grain_symbol ILIKE ANY($${where.length + 1})`) - params.push(req.query.grain_symbol.split(',')) + where.push(`grain_symbol ILIKE ANY($${where.length + 1})`); + params.push(req.query.grain_symbol.split(",")); } if (req.query.grain_name) { - where.push(`grain_name ILIKE ANY($${where.length + 1})`) - params.push(req.query.grain_name.split(',')) + where.push(`grain_name ILIKE ANY($${where.length + 1})`); + params.push(req.query.grain_name.split(",")); } if (req.query.grain_group) { - where.push(`grain_group ILIKE ANY($${where.length + 1})`) - params.push(req.query.grain_group.split(',')) + where.push(`grain_group ILIKE ANY($${where.length + 1})`); + params.push(req.query.grain_group.split(",")); } if (req.query.soil_group) { - where.push(`soil_group ILIKE ANY($${where.length + 1})`) - params.push(req.query.soil_group.split(',')) + where.push(`soil_group ILIKE ANY($${where.length + 1})`); + params.push(req.query.soil_group.split(",")); } if (req.query.classification) { - where.push(`classification ILIKE ANY($${where.length + 1})`) - params.push(req.query.classification.split(',').map(d => { return `%${d}%`})) + where.push(`classification ILIKE ANY($${where.length + 1})`); + params.push( + req.query.classification.split(",").map((d) => { + return `%${d}%`; + }), + ); } if (where.length) { - sql += ` WHERE ${where.join(' AND ')}` + sql += ` WHERE ${where.join(" AND ")}`; } - if ('sample' in req.query) { - sql += ' LIMIT 5' + if ("sample" in req.query) { + sql += " LIMIT 5"; } - larkin.queryPg('burwell', sql, params, function(error, data) { + larkin.queryPg("burwell", sql, params, function (error, data) { if (error) { if (cb) { cb(error); @@ -66,13 +70,20 @@ module.exports = function(req, res, next, cb) { if (cb) { cb(null, data.rows); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: data.rows - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: data.rows, + }, + ); } - }); -} +}; diff --git a/v2/definitions/groups.ts b/v2/definitions/groups.ts index 682fd246..f7ac38ef 100644 --- a/v2/definitions/groups.ts +++ b/v2/definitions/groups.ts @@ -1,13 +1,14 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "SELECT col_groups.id AS col_group_id, col_group, col_group_long AS name, COUNT(DISTINCT cols.id) AS t_cols, COUNT(DISTINCT units_sections.unit_id) AS t_units, cols.project_id FROM col_groups LEFT JOIN cols ON cols.col_group_id = col_groups.id LEFT JOIN units_sections ON units_sections.col_id = cols.id ", - params = {}; + var sql = + "SELECT col_groups.id AS col_group_id, col_group, col_group_long AS name, COUNT(DISTINCT cols.id) AS t_cols, COUNT(DISTINCT units_sections.unit_id) AS t_units, cols.project_id FROM col_groups LEFT JOIN cols ON cols.col_group_id = col_groups.id LEFT JOIN units_sections ON units_sections.col_id = cols.id ", + params = {}; if (req.query.col_group_id) { sql += " WHERE col_groups.id IN (:col_group_ids)"; @@ -26,7 +27,7 @@ module.exports = function(req, res, next, cb) { sql += " LIMIT 5"; } - larkin.query(sql, params, function(error, data) { + larkin.query(sql, params, function (error, data) { if (error) { if (cb) { cb(error); @@ -38,12 +39,20 @@ module.exports = function(req, res, next, cb) { if (cb) { cb(null, data); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: data - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: data, + }, + ); } }); -} +}; diff --git a/v2/definitions/index.ts b/v2/definitions/index.ts index 9f7082a5..c8d6c6b3 100644 --- a/v2/definitions/index.ts +++ b/v2/definitions/index.ts @@ -2,125 +2,100 @@ var express = require("express"); var definitions = express.Router(); var larkin = require("../larkin"); -definitions.route("/") - .get(function(req, res, next) { - larkin.defineCategory("definitions", function(error, routes) { - res.json({ - "success": routes - }); +definitions.route("/").get(function (req, res, next) { + larkin.defineCategory("definitions", function (error, routes) { + res.json({ + success: routes, }); - } -); + }); +}); -definitions.route("/autocomplete") - .get(require("./autocomplete")); +definitions.route("/autocomplete").get(require("./autocomplete")); -definitions.route("/define") - .get(require("./define")); +definitions.route("/define").get(require("./define")); -definitions.route("/columns") - .get(function(req, res, next) { - require("./columns")(req, res, next); - }); +definitions.route("/columns").get(function (req, res, next) { + require("./columns")(req, res, next); +}); -definitions.route("/econs") - .get(function(req, res, next) { - require("./econs")(req, res, next); - }); +definitions.route("/econs").get(function (req, res, next) { + require("./econs")(req, res, next); +}); -definitions.route("/environments") - .get(function(req, res, next) { - require("./environments")(req, res, next); - }); +definitions.route("/environments").get(function (req, res, next) { + require("./environments")(req, res, next); +}); -definitions.route("/grainsizes") - .get(function(req, res, next) { - require("./grainsizes")(req, res, next); - }); +definitions.route("/grainsizes").get(function (req, res, next) { + require("./grainsizes")(req, res, next); +}); -definitions.route("/groups") - .get(function(req, res, next) { - require("./groups")(req, res, next); - }); +definitions.route("/groups").get(function (req, res, next) { + require("./groups")(req, res, next); +}); -definitions.route("/intervals") - .get(function(req, res, next) { - require("./intervals")(req, res, next); - }); +definitions.route("/intervals").get(function (req, res, next) { + require("./intervals")(req, res, next); +}); -definitions.route("/languages") - .get(function(req, res, next) { - require("./languages")(req, res, next); - }); +definitions.route("/languages").get(function (req, res, next) { + require("./languages")(req, res, next); +}); -definitions.route("/lithologies") - .get(function(req, res, next) { - require("./lithologies")(req, res, next); - }); +definitions.route("/lithologies").get(function (req, res, next) { + require("./lithologies")(req, res, next); +}); -definitions.route("/lithology_attributes") - .get(function(req, res, next) { - require("./lithology_attributes")(req, res, next); - }); +definitions.route("/lithology_attributes").get(function (req, res, next) { + require("./lithology_attributes")(req, res, next); +}); -definitions.route("/measurements") - .get(function(req, res, next) { - require("./measurements")(req, res, next); - }); +definitions.route("/measurements").get(function (req, res, next) { + require("./measurements")(req, res, next); +}); -definitions.route("/minerals") - .get(function(req, res, next) { - require("./minerals")(req, res, next); - }); +definitions.route("/minerals").get(function (req, res, next) { + require("./minerals")(req, res, next); +}); -definitions.route("/plates") - .get(function(req, res, next) { - require("./plates")(req, res, next); - }); +definitions.route("/plates").get(function (req, res, next) { + require("./plates")(req, res, next); +}); -definitions.route("/projects") - .get(function(req, res, next) { - require("./projects")(req, res, next); - }); +definitions.route("/projects").get(function (req, res, next) { + require("./projects")(req, res, next); +}); -definitions.route("/sources") - .get(function(req, res, next) { - require("./sources")(req, res, next); - }); +definitions.route("/sources").get(function (req, res, next) { + require("./sources")(req, res, next); +}); -definitions.route("/measurement_sources") - .get(function(req, res, next) { - require("./measurement_sources")(req, res, next); - }); +definitions.route("/measurement_sources").get(function (req, res, next) { + require("./measurement_sources")(req, res, next); +}); -definitions.route("/strat_names") - .get(function(req, res, next) { - require("./strat_names")(req, res, next); - }); +definitions.route("/strat_names").get(function (req, res, next) { + require("./strat_names")(req, res, next); +}); -definitions.route("/strat_name_concepts") - .get(function(req, res, next) { - require("./strat_name_concepts")(req, res, next); - }); +definitions.route("/strat_name_concepts").get(function (req, res, next) { + require("./strat_name_concepts")(req, res, next); +}); -definitions.route("/structures") - .get(function(req, res, next) { - require("./structures")(req, res, next); - }); +definitions.route("/structures").get(function (req, res, next) { + require("./structures")(req, res, next); +}); -definitions.route("/timescales") - .get(function(req, res, next) { - require("./timescales")(req, res, next); - }); +definitions.route("/timescales").get(function (req, res, next) { + require("./timescales")(req, res, next); +}); -definitions.route("/refs") - .get(function(req, res, next) { - require("./refs")(req, res, next); - }); +definitions.route("/refs").get(function (req, res, next) { + require("./refs")(req, res, next); +}); -definitions.route("/drilling_sites") - .get(function(req, res, next) { - require("./drilling_sites.js")(req, res, next); - }); +definitions.route("/drilling_sites").get(function (req, res, next) { + require("./drilling_sites.js")(req, res, next); +}); -module.exports = definitions; +module.exports = definitions; diff --git a/v2/definitions/intervals.ts b/v2/definitions/intervals.ts index 32d2cd49..2e6d8d96 100644 --- a/v2/definitions/intervals.ts +++ b/v2/definitions/intervals.ts @@ -1,15 +1,16 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "SELECT intervals.id AS int_id, interval_name AS name, interval_abbrev abbrev, age_top AS t_age, age_bottom AS b_age, interval_type AS int_type, GROUP_CONCAT(CONCAT(timescales.timescale, '--', timescales.id) SEPARATOR '|') AS timescales, "; + var sql = + "SELECT intervals.id AS int_id, interval_name AS name, interval_abbrev abbrev, age_top AS t_age, age_bottom AS b_age, interval_type AS int_type, GROUP_CONCAT(CONCAT(timescales.timescale, '--', timescales.id) SEPARATOR '|') AS timescales, "; var params = {}, - where = []; + where = []; if (req.query.true_colors) { sql += "orig_color AS color "; @@ -17,12 +18,12 @@ module.exports = function(req, res, next, cb) { sql += "interval_color AS color "; } - sql += "FROM intervals LEFT JOIN timescales_intervals ON interval_id=intervals.id LEFT JOIN timescales ON timescale_id=timescales.id "; + sql += + "FROM intervals LEFT JOIN timescales_intervals ON interval_id=intervals.id LEFT JOIN timescales ON timescale_id=timescales.id "; if (req.query.timescale) { where.push(" timescale = :timescale"); params["timescale"] = req.query.timescale; - } else if (req.query.timescale_id) { where.push("timescales.id IN (:timescale_id)"); params["timescale_id"] = larkin.parseMultipleIds(req.query.timescale_id); @@ -45,28 +46,31 @@ module.exports = function(req, res, next, cb) { if (req.query.b_age && req.query.t_age) { if (req.query.rule === "contains") { - where.push("intervals.age_top >= :t_age AND intervals.age_bottom <= :b_age"); + where.push( + "intervals.age_top >= :t_age AND intervals.age_bottom <= :b_age", + ); params["b_age"] = req.query.b_age; params["t_age"] = req.query.t_age; - } else if (req.query.rule === "exact") { - where.push("intervals.age_top = :t_age AND intervals.age_bottom = :b_age"); + where.push( + "intervals.age_top = :t_age AND intervals.age_bottom = :b_age", + ); params["b_age"] = req.query.b_age; params["t_age"] = req.query.t_age; - - } else { - where.push("intervals.age_bottom > :t_age AND intervals.age_top < :b_age"); + } else { + where.push( + "intervals.age_bottom > :t_age AND intervals.age_top < :b_age", + ); params["b_age"] = req.query.b_age; params["t_age"] = req.query.t_age; } - } else if (req.query.age) { where.push("intervals.age_top <= :age AND intervals.age_bottom >= :age"); params["age"] = req.query.age; } if (where.length > 0) { - sql += ("WHERE " + where.join(" AND ")); + sql += "WHERE " + where.join(" AND "); } sql += " GROUP BY intervals.id ORDER BY t_age ASC"; @@ -75,8 +79,7 @@ module.exports = function(req, res, next, cb) { sql += " LIMIT 5"; } - - larkin.query(sql, params, function(error, result) { + larkin.query(sql, params, function (error, result) { if (error) { if (cb) { cb(error); @@ -84,37 +87,40 @@ module.exports = function(req, res, next, cb) { return larkin.error(req, res, next, "Something went wrong"); } } else { - if (req.query.format !== "csv") { - result.forEach(function(d) { - // d.timescale_id = larkin.jsonifyPipes(d.timescale_id, "integers"); + result.forEach(function (d) { + // d.timescale_id = larkin.jsonifyPipes(d.timescale_id, "integers"); if (d.timescales) { - d.timescales = d.timescales.split("|").map(function(j) { + d.timescales = d.timescales.split("|").map(function (j) { return { - "timescale_id": parseInt(j.split("--")[1]), - "name": j.split("--")[0] - } + timescale_id: parseInt(j.split("--")[1]), + name: j.split("--")[0], + }; }); } else { d.timescales = []; } - }); } if (cb) { cb(null, result); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: result - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: result, + }, + ); } - - } }); - -} +}; diff --git a/v2/definitions/languages.ts b/v2/definitions/languages.ts index 19b54ca1..5e594cec 100644 --- a/v2/definitions/languages.ts +++ b/v2/definitions/languages.ts @@ -1,13 +1,14 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "SELECT name, COALESCE(iso639_3, '') AS iso639_3, COALESCE(iso639_1, '') AS iso639_1 FROM languages WHERE iso639_3 IS NOT NULL", - params = []; + var sql = + "SELECT name, COALESCE(iso639_3, '') AS iso639_3, COALESCE(iso639_1, '') AS iso639_1 FROM languages WHERE iso639_3 IS NOT NULL", + params = []; if (req.query.name) { sql += " AND name ILIKE ANY($1)"; @@ -15,34 +16,45 @@ module.exports = function(req, res, next, cb) { } if (req.query.code) { - sql += " AND (iso639_3 ILIKE ANY($" + (params.length + 1) + ") OR iso639_1 ILIKE ANY($" + (params.length + 1) + "))" - params.push(larkin.parseMultipleStrings(req.query.code)) + sql += + " AND (iso639_3 ILIKE ANY($" + + (params.length + 1) + + ") OR iso639_1 ILIKE ANY($" + + (params.length + 1) + + "))"; + params.push(larkin.parseMultipleStrings(req.query.code)); } if ("sample" in req.query) { sql += " LIMIT 5"; } - larkin.queryPg("wof", sql, params, function(error, result) { + larkin.queryPg("wof", sql, params, function (error, result) { if (error) { if (cb) { return cb(error); } else { return larkin.error(req, res, next, error); } - } else { if (cb) { cb(null, result.rows); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: result.rows - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: result.rows, + }, + ); } - } }); -} +}; diff --git a/v2/definitions/lithologies.ts b/v2/definitions/lithologies.ts index 60121e74..16eaf01f 100644 --- a/v2/definitions/lithologies.ts +++ b/v2/definitions/lithologies.ts @@ -1,9 +1,9 @@ -var api = require("../api") -var larkin = require("../larkin") +var api = require("../api"); +var larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { - return larkin.info(req, res, next) + return larkin.info(req, res, next); } var sql = ` @@ -19,64 +19,72 @@ module.exports = function(req, res, next, cb) { FROM liths LEFT JOIN unit_liths ON unit_liths.lith_id = liths.id LEFT JOIN units_sections ON units_sections.unit_id = unit_liths.unit_id - ` - var where = [] - var params = {} + `; + var where = []; + var params = {}; if (req.query.lith_class) { - where.push("lith_class IN (:lith_class)") - params["lith_class"] = larkin.parseMultipleStrings(req.query.lith_class) + where.push("lith_class IN (:lith_class)"); + params["lith_class"] = larkin.parseMultipleStrings(req.query.lith_class); } - if (req.query.lith_type){ - where.push("lith_type IN (:lith_type)") - params["lith_type"] = larkin.parseMultipleStrings(req.query.lith_type) + if (req.query.lith_type) { + where.push("lith_type IN (:lith_type)"); + params["lith_type"] = larkin.parseMultipleStrings(req.query.lith_type); } if (req.query.lith) { - where.push("lith IN (:lith)") - params["lith"] = larkin.parseMultipleStrings(req.query.lith) + where.push("lith IN (:lith)"); + params["lith"] = larkin.parseMultipleStrings(req.query.lith); } if (req.query.lith_id) { - where.push("liths.id IN (:lith_id)") - params["lith_id"] = larkin.parseMultipleIds(req.query.lith_id) + where.push("liths.id IN (:lith_id)"); + params["lith_id"] = larkin.parseMultipleIds(req.query.lith_id); } if (req.query.lith_like) { - where.push("lith LIKE :lith") - params["lith"] = req.query.lith_like + '%' + where.push("lith LIKE :lith"); + params["lith"] = req.query.lith_like + "%"; } if (req.query.lith_group) { - where.push("lith_group IN (:lith_group)") - params["lith_group"] = larkin.parseMultipleStrings(req.query.lith_group) + where.push("lith_group IN (:lith_group)"); + params["lith_group"] = larkin.parseMultipleStrings(req.query.lith_group); } if (where.length) { - sql += ` WHERE ${where.join(' AND ')}` + sql += ` WHERE ${where.join(" AND ")}`; } - sql += " GROUP BY liths.id " + sql += " GROUP BY liths.id "; if ("sample" in req.query) { - sql += " LIMIT 5" + sql += " LIMIT 5"; } - larkin.query(sql, params, function(error, data) { + larkin.query(sql, params, function (error, data) { if (error) { if (cb) { - cb(error) + cb(error); } else { - return larkin.error(req, res, next, error) + return larkin.error(req, res, next, error); } } if (cb) { cb(null, data); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true - }, { - data: data - }) + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + compact: true, + }, + { + data: data, + }, + ); } - }) -} + }); +}; diff --git a/v2/definitions/lithology_attributes.ts b/v2/definitions/lithology_attributes.ts index 8106723e..845993bf 100644 --- a/v2/definitions/lithology_attributes.ts +++ b/v2/definitions/lithology_attributes.ts @@ -1,13 +1,14 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "SELECT lith_atts.id AS lith_att_id, lith_att AS name, att_type AS type, COUNT(DISTINCT unit_liths.unit_id) AS t_units FROM lith_atts LEFT JOIN unit_liths_atts ON unit_liths_atts.lith_att_id = lith_atts.id LEFT JOIN unit_liths ON unit_liths_atts.unit_lith_id = unit_liths.id ", - params = {}; + var sql = + "SELECT lith_atts.id AS lith_att_id, lith_att AS name, att_type AS type, COUNT(DISTINCT unit_liths.unit_id) AS t_units FROM lith_atts LEFT JOIN unit_liths_atts ON unit_liths_atts.lith_att_id = lith_atts.id LEFT JOIN unit_liths ON unit_liths_atts.unit_lith_id = unit_liths.id ", + params = {}; if (req.query.att_type) { sql += " WHERE att_type = :att_type"; @@ -26,25 +27,32 @@ module.exports = function(req, res, next, cb) { sql += " LIMIT 5"; } - larkin.query(sql, params, function(error, data) { + larkin.query(sql, params, function (error, data) { if (error) { if (cb) { cb(error); } else { return larkin.error(req, res, next, error); } - } else { if (cb) { cb(null, data); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: data - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: data, + }, + ); } } }); -} +}; diff --git a/v2/definitions/measurement_sources.ts b/v2/definitions/measurement_sources.ts index e5533e70..2a3cbf85 100644 --- a/v2/definitions/measurement_sources.ts +++ b/v2/definitions/measurement_sources.ts @@ -1,29 +1,35 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "WITH distinct_measures AS (SELECT distinct measurement_id,measuremeta_id from measures) SELECT refs.id AS ref_id, pub_year, author, refs.ref, refs.doi, url, GROUP_CONCAT(distinct measurement SEPARATOR '|') AS measurements FROM refs JOIN measuremeta ON refs.id=ref_id JOIN distinct_measures ON measuremeta_id=measuremeta.id JOIN measurements on measurement_id=measurements.id", - params = {}; + var sql = + "WITH distinct_measures AS (SELECT distinct measurement_id,measuremeta_id from measures) SELECT refs.id AS ref_id, pub_year, author, refs.ref, refs.doi, url, GROUP_CONCAT(distinct measurement SEPARATOR '|') AS measurements FROM refs JOIN measuremeta ON refs.id=ref_id JOIN distinct_measures ON measuremeta_id=measuremeta.id JOIN measurements on measurement_id=measurements.id", + params = {}; if ("all" in req.query) { // do nothing } else if (req.query.doi) { - sql += " WHERE (refs.doi IN (:doi) OR measuremeta.ref like CONCAT('http://dx.doi.org/',:doi2))"; + sql += + " WHERE (refs.doi IN (:doi) OR measuremeta.ref like CONCAT('http://dx.doi.org/',:doi2))"; params["doi"] = larkin.parseMultipleStrings(req.query.doi); params["doi2"] = larkin.parseMultipleStrings(req.query.doi); - } else if (req.query.measurement_class){ + } else if (req.query.measurement_class) { sql += " WHERE measurement_class IN (:measurement_class)"; - params["measurement_class"] = larkin.parseMultipleStrings(req.query.measurement_class) - } else if (req.query.measurement_type){ + params["measurement_class"] = larkin.parseMultipleStrings( + req.query.measurement_class, + ); + } else if (req.query.measurement_type) { sql += " WHERE measurement_type IN (:measurement_type)"; - params["measurement_type"] = larkin.parseMultipleStrings(req.query.measurement_type) - } else if (req.query.measurement){ + params["measurement_type"] = larkin.parseMultipleStrings( + req.query.measurement_type, + ); + } else if (req.query.measurement) { sql += " WHERE measurement IN (:measurement)"; - params["measurement"] = larkin.parseMultipleStrings(req.query.measurement) + params["measurement"] = larkin.parseMultipleStrings(req.query.measurement); } sql += " GROUP BY refs.id"; @@ -31,10 +37,10 @@ module.exports = function(req, res, next, cb) { if ("sample" in req.query) { sql += " LIMIT 5"; } -//console.log(sql); -//console.log(params); + //console.log(sql); + //console.log(params); - larkin.query(sql, params, function(error, data) { + larkin.query(sql, params, function (error, data) { if (error) { if (cb) { return cb(error); @@ -46,12 +52,20 @@ module.exports = function(req, res, next, cb) { if (cb) { cb(null, data); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: data - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: data, + }, + ); } }); -} +}; diff --git a/v2/definitions/measurements.ts b/v2/definitions/measurements.ts index 27b4883e..0021296a 100644 --- a/v2/definitions/measurements.ts +++ b/v2/definitions/measurements.ts @@ -1,28 +1,27 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "SELECT measurements.id AS measure_id, measurement AS name, measurement_type AS type, measurement_class AS class, COUNT(DISTINCT unit_measures.unit_id) AS t_units FROM measurements LEFT JOIN measures ON measures.measurement_id = measurements.id LEFT JOIN unit_measures ON unit_measures.measuremeta_id = measures.measuremeta_id", - params = {}; + var sql = + "SELECT measurements.id AS measure_id, measurement AS name, measurement_type AS type, measurement_class AS class, COUNT(DISTINCT unit_measures.unit_id) AS t_units FROM measurements LEFT JOIN measures ON measures.measurement_id = measurements.id LEFT JOIN unit_measures ON unit_measures.measuremeta_id = measures.measuremeta_id", + params = {}; if (req.query.all) { // do nothing } else if (req.query.measurement_class) { sql += " WHERE measurement_class = :meas"; params["meas"] = req.query.measurement_class; - } else if (req.query.measurement_type){ + } else if (req.query.measurement_type) { sql += " WHERE measurement_type = :meas"; params["meas"] = req.query.measurement_type; - - } else if (req.query.measurement){ + } else if (req.query.measurement) { sql += " WHERE measurement = :meas"; params["meas"] = req.query.measurement; - - } else if (req.query.measure_id){ + } else if (req.query.measure_id) { sql += " WHERE measurements.id IN (:meas) "; params["meas"] = larkin.parseMultipleIds(req.query.measure_id); } @@ -33,8 +32,7 @@ module.exports = function(req, res, next, cb) { sql += " LIMIT 5"; } - - larkin.query(sql, params, function(error, data) { + larkin.query(sql, params, function (error, data) { if (error) { if (error) { return cb(error); @@ -46,14 +44,20 @@ module.exports = function(req, res, next, cb) { if (cb) { cb(null, data); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: data - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: data, + }, + ); } - }); - -} +}; diff --git a/v2/definitions/minerals.ts b/v2/definitions/minerals.ts index 0b8a76e0..ee78d36d 100644 --- a/v2/definitions/minerals.ts +++ b/v2/definitions/minerals.ts @@ -1,12 +1,13 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "SELECT minerals.id AS mineral_id, mineral AS mineral, min_type as mineral_type, formula AS formula, formula_tags AS formula_tags, url AS url, hardness_min AS hardness_min, hardness_max AS hardness_max, crystal_form AS crystal_form, color AS mineral_color, lustre AS lustre FROM minerals"; + var sql = + "SELECT minerals.id AS mineral_id, mineral AS mineral, min_type as mineral_type, formula AS formula, formula_tags AS formula_tags, url AS url, hardness_min AS hardness_min, hardness_max AS hardness_max, crystal_form AS crystal_form, color AS mineral_color, lustre AS lustre FROM minerals"; var params = {}; @@ -16,28 +17,31 @@ module.exports = function(req, res, next, cb) { } else if (req.query.mineral) { sql += " WHERE mineral IN (:mineral)"; params["mineral"] = larkin.parseMultipleStrings(req.query.mineral); - } else if (req.query.mineral_type){ + } else if (req.query.mineral_type) { sql += " WHERE min_type IN (:mineral_type)"; - params["mineral_type"] = larkin.parseMultipleStrings(req.query.mineral_type); + params["mineral_type"] = larkin.parseMultipleStrings( + req.query.mineral_type, + ); } else if (req.query.element) { - - var parsedElements = larkin.parseMultipleStrings(req.query.element).join('|'); + var parsedElements = larkin + .parseMultipleStrings(req.query.element) + .join("|"); params = { elementA: ".*" + parsedElements + "[A-Z]+", elementB: ".*" + parsedElements + "[0-9]+", elementC: ".*" + parsedElements + "[\\(|\\),x,\\+,\\[,\\],-]", - elementD: ".*" + parsedElements + "$" - } - - sql += " WHERE formula REGEXP BINARY :elementA OR formula REGEXP BINARY :elementB OR formula REGEXP BINARY :elementC OR formula REGEXP BINARY :elementD ORDER BY mineral"; + elementD: ".*" + parsedElements + "$", + }; + sql += + " WHERE formula REGEXP BINARY :elementA OR formula REGEXP BINARY :elementB OR formula REGEXP BINARY :elementC OR formula REGEXP BINARY :elementD ORDER BY mineral"; } if ("sample" in req.query) { sql += " LIMIT 5"; } - larkin.query(sql, params, function(error, data) { + larkin.query(sql, params, function (error, data) { if (error) { if (cb) { cb(error); @@ -49,15 +53,21 @@ module.exports = function(req, res, next, cb) { if (cb) { cb(null, data); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true - }, { - data: data - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + compact: true, + }, + { + data: data, + }, + ); } - - }); -} +}; diff --git a/v2/definitions/plates.ts b/v2/definitions/plates.ts index 3295fafd..813c5152 100644 --- a/v2/definitions/plates.ts +++ b/v2/definitions/plates.ts @@ -1,13 +1,13 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } var sql = "SELECT plateid AS plate_id, names AS name FROM name_lookup", - params = []; + params = []; if (req.query.plate_id) { sql += " WHERE plateid = ANY($1)"; @@ -18,26 +18,32 @@ module.exports = function(req, res, next, cb) { sql += " LIMIT 5"; } - larkin.queryPg("alice", sql, params, function(error, result) { + larkin.queryPg("alice", sql, params, function (error, result) { if (error) { if (cb) { return cb(error); } else { return larkin.error(req, res, next, error); } - } else { if (cb) { cb(null, result.rows); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: result.rows - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: result.rows, + }, + ); } - } }); -} +}; diff --git a/v2/definitions/projects.ts b/v2/definitions/projects.ts index 1dbfddce..38ff5703 100644 --- a/v2/definitions/projects.ts +++ b/v2/definitions/projects.ts @@ -1,27 +1,28 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "WITH RECURSIVE in_proc AS (SELECT count(distinct id) c,project_id from cols where status_code='in process' group by project_id), obs AS (SELECT count(distinct id) co,project_id from cols where status_code='obsolete' group by project_id) SELECT projects.id AS project_id, project, descrip, timescale_id, COUNT(DISTINCT units_sections.col_id) AS t_cols, coalesce(c,0) as in_proccess_cols, coalesce(co,0) as obsolete_cols, COUNT(DISTINCT units_sections.unit_id) AS t_units, round(SUM(cols.col_area),0) as area FROM projects LEFT JOIN cols ON projects.id = cols.project_id LEFT JOIN units_sections ON units_sections.col_id = cols.id LEFT JOIN in_proc using (project_id) left join obs using (project_id)"; + var sql = + "WITH RECURSIVE in_proc AS (SELECT count(distinct id) c,project_id from cols where status_code='in process' group by project_id), obs AS (SELECT count(distinct id) co,project_id from cols where status_code='obsolete' group by project_id) SELECT projects.id AS project_id, project, descrip, timescale_id, COUNT(DISTINCT units_sections.col_id) AS t_cols, coalesce(c,0) as in_proccess_cols, coalesce(co,0) as obsolete_cols, COUNT(DISTINCT units_sections.unit_id) AS t_units, round(SUM(cols.col_area),0) as area FROM projects LEFT JOIN cols ON projects.id = cols.project_id LEFT JOIN units_sections ON units_sections.col_id = cols.id LEFT JOIN in_proc using (project_id) left join obs using (project_id)"; - var where = [] - var params = {} + var where = []; + var params = {}; if (req.query.project_id) { - where.push("projects.id in (:project_id)") - params["project_id"] = larkin.parseMultipleIds(req.query.project_id) + where.push("projects.id in (:project_id)"); + params["project_id"] = larkin.parseMultipleIds(req.query.project_id); } if (where.length) { - sql += ` WHERE ${where.join(' AND ')}` + sql += ` WHERE ${where.join(" AND ")}`; } sql += " GROUP BY projects.id"; //console.log(sql) - larkin.query(sql, params, function(error, data) { + larkin.query(sql, params, function (error, data) { if (error) { if (cb) { return cb(error); @@ -33,14 +34,20 @@ module.exports = function(req, res, next, cb) { if (cb) { cb(null, data); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: data - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: data, + }, + ); } - - }); -} +}; diff --git a/v2/definitions/refs.ts b/v2/definitions/refs.ts index 76b657d5..076d1649 100644 --- a/v2/definitions/refs.ts +++ b/v2/definitions/refs.ts @@ -1,20 +1,20 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "SELECT refs.id AS ref_id, pub_year, author, ref, doi, url, COUNT(DISTINCT units_sections.unit_id) AS t_units FROM refs LEFT JOIN col_refs ON col_refs.ref_id = refs.id LEFT JOIN units_sections ON units_sections.col_id = col_refs.col_id", - params = {}; + var sql = + "SELECT refs.id AS ref_id, pub_year, author, ref, doi, url, COUNT(DISTINCT units_sections.unit_id) AS t_units FROM refs LEFT JOIN col_refs ON col_refs.ref_id = refs.id LEFT JOIN units_sections ON units_sections.col_id = col_refs.col_id", + params = {}; if ("all" in req.query) { // do nothing } else if (req.query.ref_id) { sql += " WHERE refs.id IN (:ref_id)"; params["ref_id"] = larkin.parseMultipleIds(req.query.ref_id); - } sql += " GROUP BY refs.id"; @@ -23,7 +23,7 @@ module.exports = function(req, res, next, cb) { sql += " LIMIT 5"; } - larkin.query(sql, params, function(error, data) { + larkin.query(sql, params, function (error, data) { if (error) { if (cb) { return cb(error); @@ -35,12 +35,20 @@ module.exports = function(req, res, next, cb) { if (cb) { cb(null, data); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: data - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: data, + }, + ); } }); -} +}; diff --git a/v2/definitions/sources.ts b/v2/definitions/sources.ts index ea96c4c6..4f06c120 100644 --- a/v2/definitions/sources.ts +++ b/v2/definitions/sources.ts @@ -1,18 +1,18 @@ var api = require("../api"), - larkin = require("../larkin"), - multiline = require("multiline"), - dbgeo = require("dbgeo"), + larkin = require("../larkin"), + multiline = require("multiline"), + dbgeo = require("dbgeo"), gp = require("geojson-precision"); - + const credentials = require("../credentials"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var params = [] - var where = [] + var params = []; + var where = []; if (req.query.source_id) { where.push("source_id = ANY($" + (where.length + 1) + ")"); @@ -25,21 +25,34 @@ module.exports = function(req, res, next, cb) { } if (req.query.lat && req.query.lng) { - where.push("ST_Intersects(ST_SetSRID(sources.rgeom, 4326), ST_GeomFromText($" + (where.length + 1) + ", 4326))"); + where.push( + "ST_Intersects(ST_SetSRID(sources.rgeom, 4326), ST_GeomFromText($" + + (where.length + 1) + + ", 4326))", + ); params.push("POINT(" + req.query.lng + " " + req.query.lat + ")"); } if (req.query.shape) { - var buffer = (req.query.buffer && !isNaN(parseInt(req.query.buffer))) ? parseInt(req.query.buffer)*1000 : 1; + var buffer = + req.query.buffer && !isNaN(parseInt(req.query.buffer)) + ? parseInt(req.query.buffer) * 1000 + : 1; - where.push("ST_Intersects(ST_SetSRID(sources.rgeom, 4326), ST_SetSRID(ST_Buffer($" + (where.length + 1) + "::geography , $" + (where.length + 2) + ")::geometry, 4326))"); + where.push( + "ST_Intersects(ST_SetSRID(sources.rgeom, 4326), ST_SetSRID(ST_Buffer($" + + (where.length + 1) + + "::geography , $" + + (where.length + 2) + + ")::geometry, 4326))", + ); params.push("SRID=4326;" + decodeURI(req.query.shape), buffer); } // Remove any empty sources and etopo1 - where.push("sources.rgeom IS NOT NULL") - where.push("sources.status_code = 'active'") + where.push("sources.rgeom IS NOT NULL"); + where.push("sources.status_code = 'active'"); var sql = ` SELECT @@ -54,7 +67,7 @@ module.exports = function(req, res, next, cb) { COALESCE(scale, '') scale, features, area - ${api.acceptedFormats.geo[req.query.format] ? ', web_geom AS geom' : ''} + ${api.acceptedFormats.geo[req.query.format] ? ", web_geom AS geom" : ""} FROM maps.sources JOIN (values ('tiny', 0), @@ -62,53 +75,77 @@ module.exports = function(req, res, next, cb) { ('medium', 2), ('large', 3) ) ord (s, ordering) ON sources.scale = ord.s - ${(where.length) ? (" WHERE " + where.join(" AND ")) : ""} + ${where.length ? " WHERE " + where.join(" AND ") : ""} ORDER BY ordering, new_priority - ${('sample' in req.query) ? 'LIMIT 5': ''} - ` - larkin.queryPg(credentials.pg_macrostrat_database, sql, params, function(error, result) { - if (error) { - if (cb) { - return cb(error); + ${"sample" in req.query ? "LIMIT 5" : ""} + `; + larkin.queryPg( + credentials.pg_macrostrat_database, + sql, + params, + function (error, result) { + if (error) { + if (cb) { + return cb(error); + } else { + return larkin.error(req, res, next, error); + } } else { - return larkin.error(req, res, next, error); - } - } else { - if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - dbgeo.parse(result.rows, { - "outputFormat": larkin.getOutputFormat(req.query.format), - "precision": 5 - }, function(error, geojson) { - if (error) { - larkin.error(req, res, next, error); + if (req.query.format && api.acceptedFormats.geo[req.query.format]) { + dbgeo.parse( + result.rows, + { + outputFormat: larkin.getOutputFormat(req.query.format), + precision: 5, + }, + function (error, geojson) { + if (error) { + larkin.error(req, res, next, error); + } else { + if (cb) { + cb(null, geojson); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + }, + { + data: geojson, + }, + ); + } + } + }, + ); + } else { + if (cb) { + cb(null, result.rows); } else { - if (cb) { - cb(null, geojson); - } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: geojson - }); - } - + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: result.rows, + }, + ); } - }); - } else { - if (cb) { - cb(null, result.rows); - } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: result.rows - }); } - } - - } - }); -} + }, + ); +}; diff --git a/v2/definitions/strat_name_concepts.ts b/v2/definitions/strat_name_concepts.ts index 2b9bc0ed..2415c322 100644 --- a/v2/definitions/strat_name_concepts.ts +++ b/v2/definitions/strat_name_concepts.ts @@ -1,13 +1,14 @@ var api = require("../api"), - larkin = require("../larkin"), - multiline = require("multiline"); + larkin = require("../larkin"), + multiline = require("multiline"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = multiline(function() {/* + var sql = multiline(function () { + /* SELECT snm.concept_id as concept_id, snm.name, @@ -23,8 +24,9 @@ module.exports = function(req, res, next, cb) { refs.author FROM strat_names_meta snm JOIN refs ON snm.ref_id = refs.id - */}), - params = {}; + */ + }), + params = {}; if ("all" in req.query) { // do nothing @@ -36,11 +38,13 @@ module.exports = function(req, res, next, cb) { if (req.query.concept_id) { params["concept_id"] = larkin.parseMultipleIds(req.query.concept_id); } else { - params["concept_id"] = larkin.parseMultipleIds(req.query.strat_name_concept_id); + params["concept_id"] = larkin.parseMultipleIds( + req.query.strat_name_concept_id, + ); } - } else if (req.query.strat_name_id) { - sql += " WHERE concept_id IN (SELECT concept_id FROM lookup_strat_names WHERE strat_name_id IN (:strat_name_ids))"; + sql += + " WHERE concept_id IN (SELECT concept_id FROM lookup_strat_names WHERE strat_name_id IN (:strat_name_ids))"; params["strat_name_ids"] = larkin.parseMultipleIds(req.query.strat_name_id); } @@ -50,16 +54,15 @@ module.exports = function(req, res, next, cb) { sql += " LIMIT 5"; } - larkin.query(sql, params, function(error, result) { + larkin.query(sql, params, function (error, result) { if (error) { if (cb) { return cb(error); } else { return larkin.error(req, res, next, error); } - } else { - result.forEach(function(d) { + result.forEach(function (d) { d.int_id = parseInt(d.int_id); d.refs = larkin.jsonifyPipes(d.refs, "integers"); }); @@ -67,15 +70,22 @@ module.exports = function(req, res, next, cb) { if (cb) { cb(null, result); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: "refs" - }, { - data: result - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + refs: "refs", + }, + { + data: result, + }, + ); } - } }); -} +}; diff --git a/v2/definitions/strat_names.ts b/v2/definitions/strat_names.ts index b8b92fb0..bcb49231 100644 --- a/v2/definitions/strat_names.ts +++ b/v2/definitions/strat_names.ts @@ -1,67 +1,86 @@ var api = require("../api"), - larkin = require("../larkin"), - multiline = require("multiline"); + larkin = require("../larkin"), + multiline = require("multiline"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } var where = [], - params = {}; + params = {}; if (req.query.rule) { if (req.query.rule === "down") { if (req.query.strat_name) { - where.push("parent IN (SELECT strat_name_id FROM lookup_strat_names WHERE strat_name = :strat_name) OR strat_name_id IN (SELECT strat_name_id FROM lookup_strat_names WHERE strat_name = :strat_name)"); + where.push( + "parent IN (SELECT strat_name_id FROM lookup_strat_names WHERE strat_name = :strat_name) OR strat_name_id IN (SELECT strat_name_id FROM lookup_strat_names WHERE strat_name = :strat_name)", + ); params["strat_name"] = req.query.strat_name; - } else if (req.query.strat_name_id) { - where.push("parent IN (:strat_name_id) OR l.strat_name_id IN (:strat_name_id)"); - params["strat_name_id"] = larkin.parseMultipleIds(req.query.strat_name_id); + where.push( + "parent IN (:strat_name_id) OR l.strat_name_id IN (:strat_name_id)", + ); + params["strat_name_id"] = larkin.parseMultipleIds( + req.query.strat_name_id, + ); } else if (req.query.concept_id) { - where.push("parent IN (( SELECT DISTINCT strat_name_id FROM lookup_strat_names WHERE concept_id IN (:concept_id) )) OR l.strat_name_id IN (( SELECT DISTINCT strat_name_id FROM lookup_strat_names WHERE concept_id IN (:concept_id) ))") + where.push( + "parent IN (( SELECT DISTINCT strat_name_id FROM lookup_strat_names WHERE concept_id IN (:concept_id) )) OR l.strat_name_id IN (( SELECT DISTINCT strat_name_id FROM lookup_strat_names WHERE concept_id IN (:concept_id) ))", + ); params["concept_id"] = larkin.parseMultipleIds(req.query.concept_id); } - } else if (req.query.rule === "all") { if (req.query.strat_name) { - where.push("tree = (SELECT tree FROM lookup_strat_names WHERE strat_name = :strat_name)"); + where.push( + "tree = (SELECT tree FROM lookup_strat_names WHERE strat_name = :strat_name)", + ); params["strat_name"] = req.query.strat_name; - } else if (req.query.strat_name_id) { - where.push("tree = (SELECT tree FROM lookup_strat_names WHERE strat_name_id IN (:strat_name_id))"); - params["strat_name_id"] = larkin.parseMultipleIds(req.query.strat_name_id); + where.push( + "tree = (SELECT tree FROM lookup_strat_names WHERE strat_name_id IN (:strat_name_id))", + ); + params["strat_name_id"] = larkin.parseMultipleIds( + req.query.strat_name_id, + ); } } } else { if (req.query.strat_name_id) { where.push("strat_name_id IN (:strat_name_id)"); - params["strat_name_id"] = larkin.parseMultipleIds(req.query.strat_name_id); - + params["strat_name_id"] = larkin.parseMultipleIds( + req.query.strat_name_id, + ); } else if (req.query.strat_name_like) { where.push("lower(strat_name) LIKE lower(:strat_name)"); params["strat_name"] = req.query.strat_name_like + "%"; - } else if (req.query.strat_name) { where.push("lower(strat_name) LIKE lower(:strat_name)"); params["strat_name"] = req.query.strat_name; } else if (req.query.concept_id) { - where.push("concept_id IN (:concept_id)") + where.push("concept_id IN (:concept_id)"); params["concept_id"] = larkin.parseMultipleIds(req.query.concept_id); } else if (req.query.strat_name_concept_id) { - where.push("concept_id IN (:concept_id)") - params["concept_id"] = larkin.parseMultipleIds(req.query.strat_name_concept_id); + where.push("concept_id IN (:concept_id)"); + params["concept_id"] = larkin.parseMultipleIds( + req.query.strat_name_concept_id, + ); } if (req.query.interval_name) { - where.push("early_age > (SELECT age_top from intervals where interval_name like :interval_name) and late_age < (SELECT age_bottom from intervals where interval_name like :interval_name2)"); - params["interval_name"] = larkin.parseMultipleStrings(req.query.interval_name); - params["interval_name2"] = larkin.parseMultipleStrings(req.query.interval_name); + where.push( + "early_age > (SELECT age_top from intervals where interval_name like :interval_name) and late_age < (SELECT age_bottom from intervals where interval_name like :interval_name2)", + ); + params["interval_name"] = larkin.parseMultipleStrings( + req.query.interval_name, + ); + params["interval_name2"] = larkin.parseMultipleStrings( + req.query.interval_name, + ); } - if (req.query.ref_id){ - where.push("ref_id IN (:ref_id)") + if (req.query.ref_id) { + where.push("ref_id IN (:ref_id)"); params["ref_id"] = larkin.parseMultipleIds(req.query.ref_id); } @@ -71,10 +90,9 @@ module.exports = function(req, res, next, cb) { } if (req.query.ref_id) { - where.push("ref_id IN (:ref_ids)") - params["ref_ids"] = larkin.parseMultipleIds(req.query.ref_id) + where.push("ref_id IN (:ref_ids)"); + params["ref_ids"] = larkin.parseMultipleIds(req.query.ref_id); } - } var sql = ` @@ -104,19 +122,17 @@ module.exports = function(req, res, next, cb) { t_units, ref_id FROM lookup_strat_names l - ` - - + `; if (where.length > 0) { - sql += " WHERE " + where.join(" AND ") + sql += " WHERE " + where.join(" AND "); } if ("sample" in req.query) { sql += " LIMIT 5"; } - larkin.query(sql, params, function(error, response) { + larkin.query(sql, params, function (error, response) { if (error) { console.log(error); if (cb) { @@ -124,20 +140,27 @@ module.exports = function(req, res, next, cb) { } else { larkin.error(req, res, next, "Something went wrong"); } - } else { if (cb) { cb(null, response); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true, - refs: "ref_id" - }, { - data: response - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + compact: true, + refs: "ref_id", + }, + { + data: response, + }, + ); } } }); -} +}; diff --git a/v2/definitions/structures.ts b/v2/definitions/structures.ts index f68f733e..83fa5cf9 100644 --- a/v2/definitions/structures.ts +++ b/v2/definitions/structures.ts @@ -1,35 +1,40 @@ -var api = require("../api") -var larkin = require("../larkin") +var api = require("../api"); +var larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var where = [] - var params = {} - var limit = (req.query.hasOwnProperty('sample')) ? 'LIMIT 5' : '' + var where = []; + var params = {}; + var limit = req.query.hasOwnProperty("sample") ? "LIMIT 5" : ""; if (req.query.structure_class) { - where.push('structure_class IN (:structure_class)') - params["structure_class"] = larkin.parseMultipleStrings(req.query.structure_class) + where.push("structure_class IN (:structure_class)"); + params["structure_class"] = larkin.parseMultipleStrings( + req.query.structure_class, + ); } else if (req.query.structure_type) { - where.push('structure_type IN (:structure_type)') - params["structure_type"] = larkin.parseMultipleStrings(req.query.structure_type) + where.push("structure_type IN (:structure_type)"); + params["structure_type"] = larkin.parseMultipleStrings( + req.query.structure_type, + ); } else if (req.query.structure) { - where.push('structure IN (:structure)') - params["structure"] = larkin.parseMultipleStrings(req.query.structure) + where.push("structure IN (:structure)"); + params["structure"] = larkin.parseMultipleStrings(req.query.structure); } else if (req.query.structure_id) { - where.push('structures.id IN (:structure_id)') + where.push("structures.id IN (:structure_id)"); params["structure_id"] = larkin.parseMultipleIds(req.query.structure_id); } else if (req.query.structure_like) { - where.push('structure LIKE :structure') - params["structure"] = '%' + req.query.structure_like + '%'; + where.push("structure LIKE :structure"); + params["structure"] = "%" + req.query.structure_like + "%"; } - where = (where.length) ? ('WHERE ' + where.join(' AND ')) : '' + where = where.length ? "WHERE " + where.join(" AND ") : ""; - larkin.query(` + larkin.query( + ` SELECT structures.id AS structure_id, structure AS name, @@ -40,25 +45,36 @@ module.exports = function(req, res, next, cb) { ${where} GROUP BY structures.id ${limit} - `, params, function(error, data) { - if (error) { + `, + params, + function (error, data) { + if (error) { + if (cb) { + cb(error); + } else { + return larkin.error(req, res, next, error); + } + } + if (cb) { - cb(error); + cb(null, data); } else { - return larkin.error(req, res, next, error); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + compact: true, + }, + { + data: data, + }, + ); } - } - - if (cb) { - cb(null, data); - } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true - }, { - data: data - }); - } - }); -} + }, + ); +}; diff --git a/v2/definitions/timescales.ts b/v2/definitions/timescales.ts index bfa7c14f..0bf7aafd 100644 --- a/v2/definitions/timescales.ts +++ b/v2/definitions/timescales.ts @@ -1,35 +1,43 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = "SELECT timescales.id AS timescale_id, timescale, count(distinct intervals.id) AS n_intervals, MAX( age_bottom ) AS max_age, MIN( age_top ) AS min_age, ref_id FROM timescales JOIN timescales_intervals ti ON ti.timescale_id = timescales.id JOIN intervals ON interval_id = intervals.id GROUP BY timescales.id ORDER BY timescales.id ASC "; + var sql = + "SELECT timescales.id AS timescale_id, timescale, count(distinct intervals.id) AS n_intervals, MAX( age_bottom ) AS max_age, MIN( age_top ) AS min_age, ref_id FROM timescales JOIN timescales_intervals ti ON ti.timescale_id = timescales.id JOIN intervals ON interval_id = intervals.id GROUP BY timescales.id ORDER BY timescales.id ASC "; if ("sample" in req.query) { sql += " LIMIT 5"; } - larkin.query(sql, [], function(error, data) { + larkin.query(sql, [], function (error, data) { if (error) { if (cb) { return cb(error); } else { return larkin.error(req, res, next, error); } - } if (cb) { cb(null, data); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: data - }); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: data, + }, + ); } }); -} +}; diff --git a/v2/defs.ts b/v2/defs.ts index ec83c8d7..56e87d2d 100644 --- a/v2/defs.ts +++ b/v2/defs.ts @@ -1,1452 +1,1378 @@ -(function() { +(function () { var defs = { - "/columns": { - "description": "Search and summarize columns based on unit properties or geographic location", - "visible": true, - "options": { - "parameters": { - "unit_id": "integer, a valid unit id", - "section_id": "integer, a valid section id", - "col_id": "integer, a valid column id", - "col_type": "string, a column type", - "interval_name": "string, chronostratigraphic time interval name", - "int_id": "integer, a chronostratigraphic time interval ID from /defs/intervals", - "age": "numerical age in millions of years before present", - "age_top": "numerical age (Ma) - must be used with age_bottom and be less than age_bottom", - "age_bottom": "numerical age (Ma) - must be used with age_top and be greater than age_top", - "lith_id": "integer, ID of a lithology from /defs/lithologies", - "lith": "string, specific lithology name (e.g., shale, sandstone)", - "lith_type": "string, groups of lithologies (e.g., carbonate, siliciclastic)", - "lith_class": "string, general lithologies (sedimentary, igneous, metamorphic)", - "lith_att_id": "integer, ID of a lithology attribute from /defs/lithology_attributes", - "lith_att": "string, specific lithology attribute name (e.g. fine, olivine, poorly washed)", - "lith_att_type": "string, specific category of lithology attribute (e.g. grains, lithology, bedform)", - "environ_id": "integer, specific environment ID from /defs/environments", - "environ": "string, specific environment", - "environ_type": "string, groups of environments", - "environ_class": "string, general environments", - "econ_id": "integer, ID of an economic attribute from /defs/econs", - "econ": "string, name of an economic attribute", - "econ_type": "string, name of an economic attribute type", - "econ_class": "string, name of an economic attribute class", - "cltn_id": "integer, one or more Paleobiology Database collection IDs", - "strat_name": "a fuzzy stratigraphic name to match units to", - "strat_name_id": "integer, a single or comma-separated list of stratigraphic IDs from /defs/strat_names", - "lat": "number, decimal degree latitude, WGS84", - "lng": "number, decimal degree longitude, WGS84", - "adjacents": "boolean, if lat/lng or col_id is specified, optionally return all units in columns that touch the polygon containing the supplied lat/lng", - "project_id": "a Macrostrat project ID", - "response": "Any available response_type. Default is short.", - "format": "string, desired output format" - }, - "response_types": [ - "short", - "long" - ], - "output_formats": [ - "json", - "csv", - "geojson", - "geojson_bare", - "topojson", - "topojson_bare" - ], - "examples": [ - "/api/columns?interval_name=Permian", - "/api/columns?age=271", - "/api/columns?age_top=200&age_bottom=250", - "/api/columns?strat_name=mancos&format=geojson_bare", - "/api/columns?lat=43&lng=-89&adjacents=true" - ], - "fields": [ - "col_id", - "col_name", - "lat", - "lng", - "col_group", - "col_group_id", - "group_col_id", - "col_area", - "project_id", - "max_thick", - "max_min_thick", - "min_min_thick", - "b_age", - "t_age", - "pbdb_collections", - "lith", - "environ", - "econ", - "t_units", - "t_sections" - ] - } - }, - "/sections": { - "description": "Summarize units by gap-bound packages", - "visible": true, - "options": { - "parameters": { - "unit_id": "integer, a valid unit id", - "section_id": "integer, a valid section id", - "col_id": "integer, a valid column id", - "interval_name": "string, chronostratigraphic time interval name", - "int_id": "integer, a chronostratigraphic time interval ID from /defs/intervals", - "age": "numerical age in millions of years before present", - "age_top": "numerical age (Ma) - must be used with age_bottom and be less than age_bottom", - "age_bottom": "numerical age (Ma) - must be used with age_top and be greater than age_top", - "lith_id": "integer, ID of a lithology from /defs/lithologies", - "lith": "string, specific lithology name (e.g., shale, sandstone)", - "lith_group": "string, group of lithologies (e.g., unconsolidated)", - "lith_type": "string, type of lithologies (e.g., carbonate, siliciclastic)", - "lith_class": "string, general lithologies (sedimentary, igneous, metamorphic)", - "lith_att_id": "integer, ID of a lithology attribute from /defs/lithology_attributes", - "lith_att": "string, specific lithology attribute name (e.g. fine, olivine, poorly washed)", - "lith_att_type": "string, specific category of lithology attribute (e.g. grains, lithology, bedform)", - "environ_id": "integer, specific environment ID from /defs/environments", - "environ": "string, specific environment", - "environ_type": "string, groups of environments", - "environ_class": "string, general environments", - "econ_id": "integer, ID of an economic attribute from /defs/econs", - "econ": "string, name of an economic attribute", - "econ_type": "string, name of an economic attribute type", - "econ_class": "string, name of an economic attribute class", - "cltn_id": "integer, one or more Paleobiology Database collection IDs", - "strat_name": "a fuzzy stratigraphic name to match units to", - "strat_name_id": "integer, a single or comma-separated list of stratigraphic IDs from /defs/strat_names", - "lat": "number, decimal degree latitude, WGS84", - "lng": "number, decimal degree longitude, WGS84", - "adjacents": "boolean, if lat/lng or col_id is specified, optionally return all units in columns that touch the polygon containing the supplied lat/lng", - "project_id": "a Macrostrat project ID", - "response": "Any available response_type. Default is short.", - "format": "string, desired output format" + "/columns": { + description: + "Search and summarize columns based on unit properties or geographic location", + visible: true, + options: { + parameters: { + unit_id: "integer, a valid unit id", + section_id: "integer, a valid section id", + col_id: "integer, a valid column id", + col_type: "string, a column type", + interval_name: "string, chronostratigraphic time interval name", + int_id: + "integer, a chronostratigraphic time interval ID from /defs/intervals", + age: "numerical age in millions of years before present", + age_top: + "numerical age (Ma) - must be used with age_bottom and be less than age_bottom", + age_bottom: + "numerical age (Ma) - must be used with age_top and be greater than age_top", + lith_id: "integer, ID of a lithology from /defs/lithologies", + lith: "string, specific lithology name (e.g., shale, sandstone)", + lith_type: + "string, groups of lithologies (e.g., carbonate, siliciclastic)", + lith_class: + "string, general lithologies (sedimentary, igneous, metamorphic)", + lith_att_id: + "integer, ID of a lithology attribute from /defs/lithology_attributes", + lith_att: + "string, specific lithology attribute name (e.g. fine, olivine, poorly washed)", + lith_att_type: + "string, specific category of lithology attribute (e.g. grains, lithology, bedform)", + environ_id: + "integer, specific environment ID from /defs/environments", + environ: "string, specific environment", + environ_type: "string, groups of environments", + environ_class: "string, general environments", + econ_id: "integer, ID of an economic attribute from /defs/econs", + econ: "string, name of an economic attribute", + econ_type: "string, name of an economic attribute type", + econ_class: "string, name of an economic attribute class", + cltn_id: "integer, one or more Paleobiology Database collection IDs", + strat_name: "a fuzzy stratigraphic name to match units to", + strat_name_id: + "integer, a single or comma-separated list of stratigraphic IDs from /defs/strat_names", + lat: "number, decimal degree latitude, WGS84", + lng: "number, decimal degree longitude, WGS84", + adjacents: + "boolean, if lat/lng or col_id is specified, optionally return all units in columns that touch the polygon containing the supplied lat/lng", + project_id: "a Macrostrat project ID", + response: "Any available response_type. Default is short.", + format: "string, desired output format", + }, + response_types: ["short", "long"], + output_formats: [ + "json", + "csv", + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [ + "/api/columns?interval_name=Permian", + "/api/columns?age=271", + "/api/columns?age_top=200&age_bottom=250", + "/api/columns?strat_name=mancos&format=geojson_bare", + "/api/columns?lat=43&lng=-89&adjacents=true", + ], + fields: [ + "col_id", + "col_name", + "lat", + "lng", + "col_group", + "col_group_id", + "group_col_id", + "col_area", + "project_id", + "max_thick", + "max_min_thick", + "min_min_thick", + "b_age", + "t_age", + "pbdb_collections", + "lith", + "environ", + "econ", + "t_units", + "t_sections", + ], }, - "output_formats": [ - "json", - "csv" - ], - "response_types": [ - "short", - "long" - ], - "examples": [ - "/api/sections?all", - "/api/sections?col_id=49" - ], - "fields": [ - "col_id", - "col_area", - "section_id", - "project_id", - "max_thick", - "min_thick", - "t_age", - "b_age", - "pbdb_collections", - "lith", - "environ", - "econ", - "name", - "type", - "class" - ] - } - }, - "/units": { - "description": "all Macrostrat units matching search criteria", - "visible": true, - "options": { - "parameters": { - "unit_id": "integer, a valid unit id", - "section_id": "integer, a valid section id", - "col_id": "integer, a valid column id", - "col_type": "string, a column type", - "interval_name": "string, chronostratigraphic time interval name", - "int_id": "integer, a chronostratigraphic time interval ID from /defs/intervals", - "age": "numerical age in millions of years before present", - "age_top": "numerical age (Ma) - must be used with age_bottom and be less than age_bottom", - "age_bottom": "numerical age (Ma) - must be used with age_top and be greater than age_top; note that returned units may not be entirely contained by age_top and age_bottom, but they will intersect that age range in whole or in part", - "lith_id": "integer, ID of a lithology from /defs/lithologies", - "lith": "string, specific lithology name (e.g., shale, sandstone)", - "lith_group": "string, groups of lithologies (e.g., sandstones, mudrocks, unconsolidated)", - "lith_type": "string, types of lithologies (e.g., carbonate, siliciclastic)", - "lith_class": "string, general lithologies (sedimentary, igneous, metamorphic)", - "lith_att_id": "integer, ID of a lithology attribute from /defs/lithology_attributes", - "lith_att": "string, specific lithology attribute name (e.g. fine, olivine, poorly washed)", - "lith_att_type": "string, specific category of lithology attribute (e.g. grains, lithology, bedform)", - "environ_id": "integer, specific environment ID from /defs/environments", - "environ": "string, specific environment", - "environ_type": "string, groups of environments", - "environ_class": "string, general environments", - "econ_id": "integer, ID of an economic attribute from /defs/econs", - "econ": "string, name of an economic attribute", - "econ_type": "string, name of an economic attribute type", - "econ_class": "string, name of an economic attribute class", - "cltn_id": "integer, one or more Paleobiology Database collection IDs", - "strat_name": "a fuzzy stratigraphic name to match units to", - "strat_name_id": "integer, a single or comma-separated list of stratigraphic IDs from /defs/strat_names", - "lat": "number, decimal degree latitude, WGS84", - "lng": "number, decimal degree longitude, WGS84", - "adjacents": "boolean, if lat/lng or col_id is specified, optionally return all units in columns that touch the polygon containing the supplied lat/lng", - "project_id": "a Macrostrat project ID", - "response": "Any available response_type. Default is short.", - "geom_age": "If requesting a geographic format, specifies which age to use for the primary coordinates. Accepted parameters are 'modern' (clat, clng), 'top' (t_plat, t_plng) and 'bottom' (b_plat, b_plng). Default is 'modern'", - "summarize_measures": "If present, returns summary statistics about the measurements associated with each unit", - "show_position": "If present, return the unit top and bottom position in section", - "format": "string, desired output format" + }, + "/sections": { + description: "Summarize units by gap-bound packages", + visible: true, + options: { + parameters: { + unit_id: "integer, a valid unit id", + section_id: "integer, a valid section id", + col_id: "integer, a valid column id", + interval_name: "string, chronostratigraphic time interval name", + int_id: + "integer, a chronostratigraphic time interval ID from /defs/intervals", + age: "numerical age in millions of years before present", + age_top: + "numerical age (Ma) - must be used with age_bottom and be less than age_bottom", + age_bottom: + "numerical age (Ma) - must be used with age_top and be greater than age_top", + lith_id: "integer, ID of a lithology from /defs/lithologies", + lith: "string, specific lithology name (e.g., shale, sandstone)", + lith_group: "string, group of lithologies (e.g., unconsolidated)", + lith_type: + "string, type of lithologies (e.g., carbonate, siliciclastic)", + lith_class: + "string, general lithologies (sedimentary, igneous, metamorphic)", + lith_att_id: + "integer, ID of a lithology attribute from /defs/lithology_attributes", + lith_att: + "string, specific lithology attribute name (e.g. fine, olivine, poorly washed)", + lith_att_type: + "string, specific category of lithology attribute (e.g. grains, lithology, bedform)", + environ_id: + "integer, specific environment ID from /defs/environments", + environ: "string, specific environment", + environ_type: "string, groups of environments", + environ_class: "string, general environments", + econ_id: "integer, ID of an economic attribute from /defs/econs", + econ: "string, name of an economic attribute", + econ_type: "string, name of an economic attribute type", + econ_class: "string, name of an economic attribute class", + cltn_id: "integer, one or more Paleobiology Database collection IDs", + strat_name: "a fuzzy stratigraphic name to match units to", + strat_name_id: + "integer, a single or comma-separated list of stratigraphic IDs from /defs/strat_names", + lat: "number, decimal degree latitude, WGS84", + lng: "number, decimal degree longitude, WGS84", + adjacents: + "boolean, if lat/lng or col_id is specified, optionally return all units in columns that touch the polygon containing the supplied lat/lng", + project_id: "a Macrostrat project ID", + response: "Any available response_type. Default is short.", + format: "string, desired output format", + }, + output_formats: ["json", "csv"], + response_types: ["short", "long"], + examples: ["/api/sections?all", "/api/sections?col_id=49"], + fields: [ + "col_id", + "col_area", + "section_id", + "project_id", + "max_thick", + "min_thick", + "t_age", + "b_age", + "pbdb_collections", + "lith", + "environ", + "econ", + "name", + "type", + "class", + ], }, - "response_types": [ - "short", - "long" - ], - "output_formats": [ - "json", - "csv", - "geojson", - "topojson", - "geojson_bare", - "topojson_bare" - ], - "examples": [ - "api/units?section_id=107&format=csv", - "api/units?interval_name=Permian", - "api/units?age=271", - "api/units?interval_name=Permian&response=long", - "api/units?strat_id=1205,4260", - "api/units?strat_name=mancos", - "api/units?strat_name_id=1205&format=geojson_bare&geom_age=bottom" - ], - "fields": [ - "unit_id", - "section_id", - "col_id", - "project_id", - "col_area", - "unit_name", - "strat_name_id", - "Mbr", - "Fm", - "Gp", - "SGp", - "t_age", - "b_age", - "max_thick", - "min_thick", - "outcrop", - "pbdb_collections", - "pbdb_occurrences", - "lith", - "environ", - "econ", - "measure", - "notes", - "color", - "text_color", - "t_int_id", - "t_int_name", - "t_int_age", - "t_prop", - "units_above", - "b_int_id", - "b_int_name", - "b_int_age", - "b_prop", - "units_below", - "clat", - "clng", - "t_plat", - "t_plng", - "b_plat", - "b_plng", - "t_pos", - "b_pos" - ] - } - }, - "/fossils": { - "description": "Paleobiology Database (http://paleobiodb.org) collections matched to Macrostrat units", - "visible": true, - "options": { - "parameters": { - "interval_name": "string, chronostratigraphic time interval name", - "age": "numerical age in millions of years before present", - "age_top": "numerical age (Ma) - must be used with age_bottom and be less than age_bottom", - "age_bottom": "numerical age (Ma) - must be used with age_top and be greater than age_top", - "lith_id": "integer, ID of a lithology from /defs/lithologies", - "lith": "string, specific lithology name (e.g., shale, sandstone)", - "lith_type": "string, groups of lithologies (e.g., carbonate, siliciclastic)", - "lith_class": "string, general lithologies (sedimentary, igneous, metamorphic)", - "environ_id": "integer, specific environment ID from /defs/environments", - "environ": "string, specific environment", - "environ_type": "string, groups of environments", - "environ_class": "string, general environments", - "econ_id": "integer, ID of an economic attribute from /defs/econs", - "econ": "string, name of an economic attribute", - "econ_type": "string, name of an economic attribute type", - "econ_class": "string, name of an economic attribute class", - "unit_id": "One or more comma-separated valid unit IDs", - "col_id": "One or more comma-separated valid column IDs", - "project_id": "One or more comma-separated valid project IDs", - "strat_name_id": "One or more comma-separted valid strat_name_ids from /defs/strat_names", - "strat_name_concept_id": "One or more stratigraphic name concepts from /defs/strat_name_concepts", - "format": "Desired output format" + }, + "/units": { + description: "all Macrostrat units matching search criteria", + visible: true, + options: { + parameters: { + unit_id: "integer, a valid unit id", + section_id: "integer, a valid section id", + col_id: "integer, a valid column id", + col_type: "string, a column type", + interval_name: "string, chronostratigraphic time interval name", + int_id: + "integer, a chronostratigraphic time interval ID from /defs/intervals", + age: "numerical age in millions of years before present", + age_top: + "numerical age (Ma) - must be used with age_bottom and be less than age_bottom", + age_bottom: + "numerical age (Ma) - must be used with age_top and be greater than age_top; note that returned units may not be entirely contained by age_top and age_bottom, but they will intersect that age range in whole or in part", + lith_id: "integer, ID of a lithology from /defs/lithologies", + lith: "string, specific lithology name (e.g., shale, sandstone)", + lith_group: + "string, groups of lithologies (e.g., sandstones, mudrocks, unconsolidated)", + lith_type: + "string, types of lithologies (e.g., carbonate, siliciclastic)", + lith_class: + "string, general lithologies (sedimentary, igneous, metamorphic)", + lith_att_id: + "integer, ID of a lithology attribute from /defs/lithology_attributes", + lith_att: + "string, specific lithology attribute name (e.g. fine, olivine, poorly washed)", + lith_att_type: + "string, specific category of lithology attribute (e.g. grains, lithology, bedform)", + environ_id: + "integer, specific environment ID from /defs/environments", + environ: "string, specific environment", + environ_type: "string, groups of environments", + environ_class: "string, general environments", + econ_id: "integer, ID of an economic attribute from /defs/econs", + econ: "string, name of an economic attribute", + econ_type: "string, name of an economic attribute type", + econ_class: "string, name of an economic attribute class", + cltn_id: "integer, one or more Paleobiology Database collection IDs", + strat_name: "a fuzzy stratigraphic name to match units to", + strat_name_id: + "integer, a single or comma-separated list of stratigraphic IDs from /defs/strat_names", + lat: "number, decimal degree latitude, WGS84", + lng: "number, decimal degree longitude, WGS84", + adjacents: + "boolean, if lat/lng or col_id is specified, optionally return all units in columns that touch the polygon containing the supplied lat/lng", + project_id: "a Macrostrat project ID", + response: "Any available response_type. Default is short.", + geom_age: + "If requesting a geographic format, specifies which age to use for the primary coordinates. Accepted parameters are 'modern' (clat, clng), 'top' (t_plat, t_plng) and 'bottom' (b_plat, b_plng). Default is 'modern'", + summarize_measures: + "If present, returns summary statistics about the measurements associated with each unit", + show_position: + "If present, return the unit top and bottom position in section", + format: "string, desired output format", + }, + response_types: ["short", "long"], + output_formats: [ + "json", + "csv", + "geojson", + "topojson", + "geojson_bare", + "topojson_bare", + ], + examples: [ + "api/units?section_id=107&format=csv", + "api/units?interval_name=Permian", + "api/units?age=271", + "api/units?interval_name=Permian&response=long", + "api/units?strat_id=1205,4260", + "api/units?strat_name=mancos", + "api/units?strat_name_id=1205&format=geojson_bare&geom_age=bottom", + ], + fields: [ + "unit_id", + "section_id", + "col_id", + "project_id", + "col_area", + "unit_name", + "strat_name_id", + "Mbr", + "Fm", + "Gp", + "SGp", + "t_age", + "b_age", + "max_thick", + "min_thick", + "outcrop", + "pbdb_collections", + "pbdb_occurrences", + "lith", + "environ", + "econ", + "measure", + "notes", + "color", + "text_color", + "t_int_id", + "t_int_name", + "t_int_age", + "t_prop", + "units_above", + "b_int_id", + "b_int_name", + "b_int_age", + "b_prop", + "units_below", + "clat", + "clng", + "t_plat", + "t_plng", + "b_plat", + "b_plng", + "t_pos", + "b_pos", + ], }, - "output_formats": [ - "json", - "csv", - "geojson", - "geojson_bare", - "topojson", - "topojson_bare" - ], - "examples": [ - "/api/fossils?interval_name=Permian", - "/api/fossils?age=271", - "/api/fossils?age_top=200&age_bottom=250", - "/api/fossils?col_id=446" - ], - "fields": [ - "cltn_id", - "cltn_name", - "pbdb_occs", - "genus_no", - "unit_id", - "col_id", - "t_age", - "b_age" - ] - } - }, - "/stats": { - "description": "statistics about the Macrostrat database", - "visible": true, - "options": { - "parameters": { - "all": "Show all results", - "format": "Desired output format" + }, + "/fossils": { + description: + "Paleobiology Database (http://paleobiodb.org) collections matched to Macrostrat units", + visible: true, + options: { + parameters: { + interval_name: "string, chronostratigraphic time interval name", + age: "numerical age in millions of years before present", + age_top: + "numerical age (Ma) - must be used with age_bottom and be less than age_bottom", + age_bottom: + "numerical age (Ma) - must be used with age_top and be greater than age_top", + lith_id: "integer, ID of a lithology from /defs/lithologies", + lith: "string, specific lithology name (e.g., shale, sandstone)", + lith_type: + "string, groups of lithologies (e.g., carbonate, siliciclastic)", + lith_class: + "string, general lithologies (sedimentary, igneous, metamorphic)", + environ_id: + "integer, specific environment ID from /defs/environments", + environ: "string, specific environment", + environ_type: "string, groups of environments", + environ_class: "string, general environments", + econ_id: "integer, ID of an economic attribute from /defs/econs", + econ: "string, name of an economic attribute", + econ_type: "string, name of an economic attribute type", + econ_class: "string, name of an economic attribute class", + unit_id: "One or more comma-separated valid unit IDs", + col_id: "One or more comma-separated valid column IDs", + project_id: "One or more comma-separated valid project IDs", + strat_name_id: + "One or more comma-separted valid strat_name_ids from /defs/strat_names", + strat_name_concept_id: + "One or more stratigraphic name concepts from /defs/strat_name_concepts", + format: "Desired output format", + }, + output_formats: [ + "json", + "csv", + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [ + "/api/fossils?interval_name=Permian", + "/api/fossils?age=271", + "/api/fossils?age_top=200&age_bottom=250", + "/api/fossils?col_id=446", + ], + fields: [ + "cltn_id", + "cltn_name", + "pbdb_occs", + "genus_no", + "unit_id", + "col_id", + "t_age", + "b_age", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/stats?all" - ], - "fields": [ - "project_id", - "project", - "status", - "columns", - "packages", - "units", - "pbdb_collections" - ] - } - }, - "/defs": { - "description": "Routes giving access to standard fields and dictionaries used in Macrostrat", - "visible": true, - "isParent": true - }, - "/defs/autocomplete": { - "description": "Quickly retrieve all definitions matching a query. Limited to 100 results.", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "query": "The search term", - "include": "Definitions to include", - "exclude": "Definitions to exclude" + }, + "/stats": { + description: "statistics about the Macrostrat database", + visible: true, + options: { + parameters: { + all: "Show all results", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: ["api/stats?all"], + fields: [ + "project_id", + "project", + "status", + "columns", + "packages", + "units", + "pbdb_collections", + ], }, - "output_formats": [ - "json" - ], - "examples": [ - "api/v2/defs/autocomplete?query=Mancos", - "api/v2/defs/autocomplete?query=Waldron&exclude=lithologies,lithology_attributes" - ], - "fields": [ - "intervals", - "strat_name_concepts", - "strat_name_orphans", - "columns", - "lithology_attributes", - "lithologies", - "id", - "name" - ] - } - }, - "/defs/define": { - "description": "Define multiple terms simultaneously", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "col_id": "columns", - "econ_id": "econs", - "econ_type": "econs", - "econ_class": "econs", - "environ_id": "environments", - "environ_type": "environments", - "environ_class": "environments", - "col_group_id": "groups", - "int_id": "intervals", - "lith_id": "lithologies", - "lith_type": "lithologies", - "lith_class": "lithologies", - "lith_att_id": "lithology_attributes", - "strat_name_id": "strat_names", - "strat_name_concept_id": "strat_name_concepts", - "timescale_id": "timescales" + }, + "/defs": { + description: + "Routes giving access to standard fields and dictionaries used in Macrostrat", + visible: true, + isParent: true, + }, + "/defs/autocomplete": { + description: + "Quickly retrieve all definitions matching a query. Limited to 100 results.", + parent: "definitions", + visible: true, + options: { + parameters: { + query: "The search term", + include: "Definitions to include", + exclude: "Definitions to exclude", + }, + output_formats: ["json"], + examples: [ + "api/v2/defs/autocomplete?query=Mancos", + "api/v2/defs/autocomplete?query=Waldron&exclude=lithologies,lithology_attributes", + ], + fields: [ + "intervals", + "strat_name_concepts", + "strat_name_orphans", + "columns", + "lithology_attributes", + "lithologies", + "id", + "name", + ], }, - "output_formats": [ - "json" - ], - "examples": [ - "api/v2/defs/define?strat_name_concept_id=9165&lith_id=1&int_id=751,123" - ], - "fields": [ - "columns", - "econs", - "environments", - "groups", - "intervals", - "lithologies", - "lithology_attributes", - "strat_names", - "strat_name_concepts", - "timescales" - ] - } - }, - "/defs/languages": { - "description": "Returns ISO 639-3 and ISO 639-1 codes for all languages", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "name": "string, the name of a language", - "code": "string, an ISO 639-3 or ISO 639-1 language code", - "all": "return all language definitions" + }, + "/defs/define": { + description: "Define multiple terms simultaneously", + parent: "definitions", + visible: true, + options: { + parameters: { + col_id: "columns", + econ_id: "econs", + econ_type: "econs", + econ_class: "econs", + environ_id: "environments", + environ_type: "environments", + environ_class: "environments", + col_group_id: "groups", + int_id: "intervals", + lith_id: "lithologies", + lith_type: "lithologies", + lith_class: "lithologies", + lith_att_id: "lithology_attributes", + strat_name_id: "strat_names", + strat_name_concept_id: "strat_name_concepts", + timescale_id: "timescales", + }, + output_formats: ["json"], + examples: [ + "api/v2/defs/define?strat_name_concept_id=9165&lith_id=1&int_id=751,123", + ], + fields: [ + "columns", + "econs", + "environments", + "groups", + "intervals", + "lithologies", + "lithology_attributes", + "strat_names", + "strat_name_concepts", + "timescales", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/languages?name=hawaiian", - "api/v2/defs/languages?code=hmn,jpn,ita", - "api/v2/defs/languages?all" - ], - "fields": [ - "name", - "iso639_3", - "iso639_1" - ] - } - }, - "/defs/lithologies": { - "description": "Returns all lithology definitions", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "lith_id": "integer, one or more lithology ids", - "lith": "string, lithology", - "lith_group": "string, lithology group", - "lith_class": "string, lithology class", - "lith_type": "string, lithology type", - "all": "return all lithology definitions" + }, + "/defs/languages": { + description: "Returns ISO 639-3 and ISO 639-1 codes for all languages", + parent: "definitions", + visible: true, + options: { + parameters: { + name: "string, the name of a language", + code: "string, an ISO 639-3 or ISO 639-1 language code", + all: "return all language definitions", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/languages?name=hawaiian", + "api/v2/defs/languages?code=hmn,jpn,ita", + "api/v2/defs/languages?all", + ], + fields: ["name", "iso639_3", "iso639_1"], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/lithologies?lith_id=3", - "api/v2/defs/lithologies?all", - "api/v2/defs/lithologies?lith_class=sedimentary" - ], - "fields": [ - "lith_id", - "name", - "group", - "type", - "class", - "color" - ] - } - }, - "/defs/lithology_attributes": { - "description": "Returns lithology attribute definitions", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "lith_att_id": "integer, one or more lithology attribute ids", - "att_type": "string, lithology attribute type", - "lith_att": "string, lithology attribute", - "all": "return all lithology attribute definitions", - "format": "Desired output format" + }, + "/defs/lithologies": { + description: "Returns all lithology definitions", + parent: "definitions", + visible: true, + options: { + parameters: { + lith_id: "integer, one or more lithology ids", + lith: "string, lithology", + lith_group: "string, lithology group", + lith_class: "string, lithology class", + lith_type: "string, lithology type", + all: "return all lithology definitions", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/lithologies?lith_id=3", + "api/v2/defs/lithologies?all", + "api/v2/defs/lithologies?lith_class=sedimentary", + ], + fields: ["lith_id", "name", "group", "type", "class", "color"], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/lithology_attributes?all", - "api/v2/defs/lithology_attributes?lith_att=bedform", - "api/v2/defs/lithology_attributes?lith_att_id=3,4,5" - ], - "fields": [ - "lith_att_id", - "name", - "type" - ] - } - }, - "/defs/structures": { - "description": "Returns all structure definitions", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "structure_id": "integer, one or more structure ids", - "structure": "string, structure", - "structure_like": "string, loose match to structure", - "structure_group": "string, structure group", - "structure_class": "string, structure class", - "structure_type": "string, structure type", - "all": "return all structure definitions" + }, + "/defs/lithology_attributes": { + description: "Returns lithology attribute definitions", + parent: "definitions", + visible: true, + options: { + parameters: { + lith_att_id: "integer, one or more lithology attribute ids", + att_type: "string, lithology attribute type", + lith_att: "string, lithology attribute", + all: "return all lithology attribute definitions", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/lithology_attributes?all", + "api/v2/defs/lithology_attributes?lith_att=bedform", + "api/v2/defs/lithology_attributes?lith_att_id=3,4,5", + ], + fields: ["lith_att_id", "name", "type"], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/structures?structure_id=3", - "api/v2/defs/structures?all", - "api/v2/defs/structures?structure_class=fabric" - ], - "fields": [ - "structure_id", - "name", - "group", - "type", - "class" - ] - } - }, - "/defs/columns": { - "description": "Returns column definitions", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "col_id": "integer, one or more column ids", - "col_group_id": "integer, one or more column group ids", - "col_name": "string, column name", - "project_id": "integer, one or more project ids", - "status": "string, status of column, values 'active','in process','obsolete'", - "all": "Return all column definitions", - "format": "Desired output format" + }, + "/defs/structures": { + description: "Returns all structure definitions", + parent: "definitions", + visible: true, + options: { + parameters: { + structure_id: "integer, one or more structure ids", + structure: "string, structure", + structure_like: "string, loose match to structure", + structure_group: "string, structure group", + structure_class: "string, structure class", + structure_type: "string, structure type", + all: "return all structure definitions", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/structures?structure_id=3", + "api/v2/defs/structures?all", + "api/v2/defs/structures?structure_class=fabric", + ], + fields: ["structure_id", "name", "group", "type", "class"], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/columns?all", - "api/v2/defs/columns?col_group_id=17", - "api/v2/defs/columns?col_name=Eastern%20Kentucky" - ], - "fields": [ - "col_id", - "col_group_id", - "col_name", - "lat", - "lng", - "col_area", - "project_id", - "t_units", - "ref_id", - "status" - ] - } - }, - "/defs/econs": { - "description": "Returns econ definitions", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "econ_id": "econ identifier", - "econ": "name of an econ", - "econ_type": "econ type", - "econ_class": "an econ class", - "all": "return all environment definitions", - "format": "Desired output format" + }, + "/defs/columns": { + description: "Returns column definitions", + parent: "definitions", + visible: true, + options: { + parameters: { + col_id: "integer, one or more column ids", + col_group_id: "integer, one or more column group ids", + col_name: "string, column name", + project_id: "integer, one or more project ids", + status: + "string, status of column, values 'active','in process','obsolete'", + all: "Return all column definitions", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/columns?all", + "api/v2/defs/columns?col_group_id=17", + "api/v2/defs/columns?col_name=Eastern%20Kentucky", + ], + fields: [ + "col_id", + "col_group_id", + "col_name", + "lat", + "lng", + "col_area", + "project_id", + "t_units", + "ref_id", + "status", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/econs?all", - "api/v2/defs/econs?econ_type=hydrocarbon" - ], - "fields": [ - "econ_id", - "name", - "type", - "class", - "color" - ] - } - }, - "/defs/environments": { - "description": "Returns environment definitions", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "environ_class": "environment class", - "environ_type": "environment type", - "environ": "environment", - "id": "an environment id", - "all": "return all environment definitions", - "format": "Desired output format" + }, + "/defs/econs": { + description: "Returns econ definitions", + parent: "definitions", + visible: true, + options: { + parameters: { + econ_id: "econ identifier", + econ: "name of an econ", + econ_type: "econ type", + econ_class: "an econ class", + all: "return all environment definitions", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/econs?all", + "api/v2/defs/econs?econ_type=hydrocarbon", + ], + fields: ["econ_id", "name", "type", "class", "color"], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/environments?all", - "api/v2/defs/environments?environ=sand%20shoal" - ], - "fields": [ - "environ_id", - "name", - "type", - "class", - "color" - ] - } - }, - "/defs/intervals": { - "description": "Returns all time interval definitions", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "int_id": "integer, one or more comma-separated interval IDs", - "all": "return all interval definitions", - "t_age": "number, a late age in Ma", - "b_age": "number, an early age in Ma", - "name": "string, interval name", - "true_colors": "boolean, returns original international time scale colors", - "rule": "used with t_age and b_age to determine how intersecting intervals are identified: 'contains' returns intervals that fall entirely within t_age and b_age, 'exact' returns intervals with boundaries equal to t_age,b_age. Default is 'loose', returns any interval touching the range of t_age and b_age", - "age": "integer, an age in Ma - will find all intervals that overlap with this age", - "timescale": "string, a valid timescale name as defined in /api/v2/defs/timescales", - "timescale_id": "integer, a valid timescale_id as defined in /api/v2/defs/timescales", - "format": "Desired output format" + }, + "/defs/environments": { + description: "Returns environment definitions", + parent: "definitions", + visible: true, + options: { + parameters: { + environ_class: "environment class", + environ_type: "environment type", + environ: "environment", + id: "an environment id", + all: "return all environment definitions", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/environments?all", + "api/v2/defs/environments?environ=sand%20shoal", + ], + fields: ["environ_id", "name", "type", "class", "color"], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/intervals?all", - "api/v2/defs/intervals?id=366", - "api/v2/defs/intervals?timescale=new%20zealand%20ages", - "api/v2/defs/intervals?late_age=0&early_age=130", - "api/v2/defs/intervals?timescale_id=1&age=100" - ], - "fields": [ - "int_id", - "name", - "abbrev", - "t_age", - "b_age", - "int_type", - "color", - "timescales" - ] - } - }, - "/defs/sources": { - "description": "Returns sources associated with geologic units. If a geographic format is requested, the bounding box of the source is returned as the geometry.", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "source_id": "integer, one or more comma-separated source IDs", - "scale": "string, one or more comma-separated Burwell scales (tiny, small, medium, large)", - "lat": "A valid latitude", - "lng": "A valid longitude", - "shape": "string, a WKT geometry that can be used to filter sources", - "buffer": "integer, buffer in meters that should be applied to a provided shape", - "all": "return all source definitions", - "format": "Desired output format" + }, + "/defs/intervals": { + description: "Returns all time interval definitions", + parent: "definitions", + visible: true, + options: { + parameters: { + int_id: "integer, one or more comma-separated interval IDs", + all: "return all interval definitions", + t_age: "number, a late age in Ma", + b_age: "number, an early age in Ma", + name: "string, interval name", + true_colors: + "boolean, returns original international time scale colors", + rule: "used with t_age and b_age to determine how intersecting intervals are identified: 'contains' returns intervals that fall entirely within t_age and b_age, 'exact' returns intervals with boundaries equal to t_age,b_age. Default is 'loose', returns any interval touching the range of t_age and b_age", + age: "integer, an age in Ma - will find all intervals that overlap with this age", + timescale: + "string, a valid timescale name as defined in /api/v2/defs/timescales", + timescale_id: + "integer, a valid timescale_id as defined in /api/v2/defs/timescales", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/intervals?all", + "api/v2/defs/intervals?id=366", + "api/v2/defs/intervals?timescale=new%20zealand%20ages", + "api/v2/defs/intervals?late_age=0&early_age=130", + "api/v2/defs/intervals?timescale_id=1&age=100", + ], + fields: [ + "int_id", + "name", + "abbrev", + "t_age", + "b_age", + "int_type", + "color", + "timescales", + ], }, - "output_formats": [ - "json", - "csv", - "geojson", - "geojson_bare", - "topojson", - "topojson_bare" - ], - "examples": [ - "api/v2/defs/sources?all", - "api/v2/defs/sources?source_id=1,2,3", - "api/v2/defs/sources?shape=LINESTRING(-122.3438%2037,-89.3527%2043.0582)&buffer=100", - "api/v2/defs/sources?lat=43.03&lng=-89.4&scale=large" - ], - "fields": [ - "source_id", - "name", - "url", - "ref_title", - "authors", - "ref_year", - "ref_source", - "isbn_doi", - "scale" - ] - } - }, - "/defs/strat_names": { - "description": "Returns strat names", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "strat_name_id": "unique id", - "strat_name": "lithostratigraphic name, exact match", - "strat_name_like": "lithostratigraphic name, with open-ended string matching", - "concept_id": "uniqe id for stratigraphic concepts", - "rank": "lithostratigraphic rank", - "rule": "Can be 'all' or 'down'. Down will return any children of the requested stratigraphic name, and all will return the entire stratigraphic name hierarchy that the request name belongs to", - "interval_name": "chronostratigrpahic interval name (see /defs/intervals); this will return only strat_names with a declared age in Macrostrat", - "ref_id": "retrieve only stratigraphic names linked the specified reference_id (see /defs/refs)", - "all": "return all lithostratigraphic names", - "format": "Desired output format" + }, + "/defs/sources": { + description: + "Returns sources associated with geologic units. If a geographic format is requested, the bounding box of the source is returned as the geometry.", + parent: "definitions", + visible: true, + options: { + parameters: { + source_id: "integer, one or more comma-separated source IDs", + scale: + "string, one or more comma-separated Burwell scales (tiny, small, medium, large)", + lat: "A valid latitude", + lng: "A valid longitude", + shape: "string, a WKT geometry that can be used to filter sources", + buffer: + "integer, buffer in meters that should be applied to a provided shape", + all: "return all source definitions", + format: "Desired output format", + }, + output_formats: [ + "json", + "csv", + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [ + "api/v2/defs/sources?all", + "api/v2/defs/sources?source_id=1,2,3", + "api/v2/defs/sources?shape=LINESTRING(-122.3438%2037,-89.3527%2043.0582)&buffer=100", + "api/v2/defs/sources?lat=43.03&lng=-89.4&scale=large", + ], + fields: [ + "source_id", + "name", + "url", + "ref_title", + "authors", + "ref_year", + "ref_source", + "isbn_doi", + "scale", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/strat_names?all", - "api/v2/defs/strat_names?rank=Fm" - ], - "fields": [ - "strat_name", - "rank", - "strat_name_id", - "concept_id", - "bed", - "bed_id", - "mbr", - "mbr_id", - "fm", - "fm_id", - "gp", - "gp_id", - "sgp", - "sgp_id", - "b_age", - "t_age", - "ref_id" - ] - } - }, - "/defs/strat_name_concepts": { - "description": "Returns strat name concepts", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "concept_id": "unique id", - "concept_name": "string specifying concept name", - "all": "return all lithostratigraphic names", - "format": "Desired output format" + }, + "/defs/strat_names": { + description: "Returns strat names", + parent: "definitions", + visible: true, + options: { + parameters: { + strat_name_id: "unique id", + strat_name: "lithostratigraphic name, exact match", + strat_name_like: + "lithostratigraphic name, with open-ended string matching", + concept_id: "uniqe id for stratigraphic concepts", + rank: "lithostratigraphic rank", + rule: "Can be 'all' or 'down'. Down will return any children of the requested stratigraphic name, and all will return the entire stratigraphic name hierarchy that the request name belongs to", + interval_name: + "chronostratigrpahic interval name (see /defs/intervals); this will return only strat_names with a declared age in Macrostrat", + ref_id: + "retrieve only stratigraphic names linked the specified reference_id (see /defs/refs)", + all: "return all lithostratigraphic names", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/strat_names?all", + "api/v2/defs/strat_names?rank=Fm", + ], + fields: [ + "strat_name", + "rank", + "strat_name_id", + "concept_id", + "bed", + "bed_id", + "mbr", + "mbr_id", + "fm", + "fm_id", + "gp", + "gp_id", + "sgp", + "sgp_id", + "b_age", + "t_age", + "ref_id", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/concept_id?all" - ], - "fields": [ - "concept_id", - "name", - "geologic_age", - "int_id", - "b_int_id", - "t_int_id", - "usage_notes", - "other", - "province", - "url", - "authors", - "ref_id" - ] - } - }, - "/defs/timescales": { - "description": "Returns timescales used by Macrostrat", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "all": "return all available timescales", - "format": "Desired output format" + }, + "/defs/strat_name_concepts": { + description: "Returns strat name concepts", + parent: "definitions", + visible: true, + options: { + parameters: { + concept_id: "unique id", + concept_name: "string specifying concept name", + all: "return all lithostratigraphic names", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: ["api/v2/defs/concept_id?all"], + fields: [ + "concept_id", + "name", + "geologic_age", + "int_id", + "b_int_id", + "t_int_id", + "usage_notes", + "other", + "province", + "url", + "authors", + "ref_id", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/timescales?all" - ], - "fields": [ - "timescale_id", - "timescale", - "max_age", - "min_age", - "n_intervals", - "ref_id" - ] - } - }, - "/defs/minerals": { - "description": "Returns mineral names and formulas", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "all": "return all available minerals", - "mineral": "string, name of mineral", - "mineral_type": "string, type of mineral (e.g., feldspar)", - "element": "string, chemical element abbreviation, case sensitive (e.g., Co)", - "format": "Desired output format" + }, + "/defs/timescales": { + description: "Returns timescales used by Macrostrat", + parent: "definitions", + visible: true, + options: { + parameters: { + all: "return all available timescales", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: ["api/v2/defs/timescales?all"], + fields: [ + "timescale_id", + "timescale", + "max_age", + "min_age", + "n_intervals", + "ref_id", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/minerals?all", - "api/v2/defs/minerals?mineral_id=1", - "api/v2/defs/minerals?mineral_type=clinopyroxene", - "api/v2/defs/minerals?element=Co" - ], - "fields": [ - "mineral_id", - "mineral", - "mineral_type", - "hardness_min", - "hardness_max", - "mineral_color", - "lustre", - "crystal_form", - "formula", - "formula_tags", - "url" - ] - } - }, - "/defs/projects": { - "description": "Returns available Macrostrat projects", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "all": "return all available projects", - "project_id": "integer identifying project(s), separate multiple values with commas", - "format": "Desired output format" + }, + "/defs/minerals": { + description: "Returns mineral names and formulas", + parent: "definitions", + visible: true, + options: { + parameters: { + all: "return all available minerals", + mineral: "string, name of mineral", + mineral_type: "string, type of mineral (e.g., feldspar)", + element: + "string, chemical element abbreviation, case sensitive (e.g., Co)", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/minerals?all", + "api/v2/defs/minerals?mineral_id=1", + "api/v2/defs/minerals?mineral_type=clinopyroxene", + "api/v2/defs/minerals?element=Co", + ], + fields: [ + "mineral_id", + "mineral", + "mineral_type", + "hardness_min", + "hardness_max", + "mineral_color", + "lustre", + "crystal_form", + "formula", + "formula_tags", + "url", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/projects?all" - ], - "fields": [ - "project_id", - "project", - "decrip", - "timescale_id", - "t_cols", - "t_units" - ] - } - }, - "/defs/plates": { - "description": "Returns definitions of plates from /paleogeography", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "all": "return all available projects", - "plate_id": "One or more plate_ids to query", - "format": "Desired output format" + }, + "/defs/projects": { + description: "Returns available Macrostrat projects", + parent: "definitions", + visible: true, + options: { + parameters: { + all: "return all available projects", + project_id: + "integer identifying project(s), separate multiple values with commas", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: ["api/v2/defs/projects?all"], + fields: [ + "project_id", + "project", + "decrip", + "timescale_id", + "t_cols", + "t_units", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/plates?all", - "api/v2/defs/plates?plate_id=129,402" - ], - "fields": [ - "plate_id", - "name" - ] - } - }, - "/defs/measurements": { - "description": "Returns all measurements definitions", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "measure_id": "integer, one or more comma-separted measurement IDs", - "measurement_class": "string, measurement_class", - "measurement_type": "string, measurement_type", - "all": "return all measurement definitions" + }, + "/defs/plates": { + description: "Returns definitions of plates from /paleogeography", + parent: "definitions", + visible: true, + options: { + parameters: { + all: "return all available projects", + plate_id: "One or more plate_ids to query", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/plates?all", + "api/v2/defs/plates?plate_id=129,402", + ], + fields: ["plate_id", "name"], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/measurements?measure_id=3,4", - "api/v2/defs/measurements?all", - "api/v2/defs/measurements?measurement_class=geochemical" - ], - "fields": [ - "measure_id", - "name", - "type", - "class", - "t_units" - ] - } - }, "/defs/measurement_sources": { - "description": "Returns references used in Macrostrat measurements", - "parent": "definitions", - "visible": false, - "options": { - "parameters": { - "doi": "string, a specific doi, note that it is necessary to use one DOI at a time in this query", - "measurement_class": "string, measurement_class", - "measurement_type": "string, measurement_type", - "measurement": "string, measurement", - "all": "return all measurement definitions" + }, + "/defs/measurements": { + description: "Returns all measurements definitions", + parent: "definitions", + visible: true, + options: { + parameters: { + measure_id: "integer, one or more comma-separted measurement IDs", + measurement_class: "string, measurement_class", + measurement_type: "string, measurement_type", + all: "return all measurement definitions", }, - "output_formats": [ - "json", - "csv" + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/measurements?measure_id=3,4", + "api/v2/defs/measurements?all", + "api/v2/defs/measurements?measurement_class=geochemical", ], - "examples": [ + fields: ["measure_id", "name", "type", "class", "t_units"], + }, + }, + "/defs/measurement_sources": { + description: "Returns references used in Macrostrat measurements", + parent: "definitions", + visible: false, + options: { + parameters: { + doi: "string, a specific doi, note that it is necessary to use one DOI at a time in this query", + measurement_class: "string, measurement_class", + measurement_type: "string, measurement_type", + measurement: "string, measurement", + all: "return all measurement definitions", + }, + output_formats: ["json", "csv"], + examples: [ "api/v2/defs/measurement_sources?doi=10.1016/j.epsl.2009.11.039", "api/v2/defs/measurements?all", - "api/v2/defs/measurements?measurement_class=geochemical" + "api/v2/defs/measurements?measurement_class=geochemical", ], - "fields": [ + fields: [ "ref_id", "pub_year", "author", "ref", "doi", "url", - "measurements" - ] - } - }, - "/defs/groups": { - "description": "Returns all column groups", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "all": "return all column groups", - "project_id": "limit results to specific project", - "col_id": "get col_group data for specific column", - "col_group_id": "get col_group data for specific col_group_id" + "measurements", + ], + }, + }, + "/defs/groups": { + description: "Returns all column groups", + parent: "definitions", + visible: true, + options: { + parameters: { + all: "return all column groups", + project_id: "limit results to specific project", + col_id: "get col_group data for specific column", + col_group_id: "get col_group data for specific col_group_id", + }, + output_formats: ["json", "csv"], + examples: ["api/v2/defs/groups?all"], + fields: [ + "col_group_id", + "col_group", + "t_units", + "t_cols", + "project_id", + "name", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/groups?all" - ], - "fields": [ - "col_group_id", - "col_group", - "t_units", - "t_cols", - "project_id", - "name" - ] - } - }, - "/defs/grainsizes": { - "description": "Returns grain size definitions", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "grain_id": "Unique grain ID", - "grain_symbol": "The grain symbol for display purposes", - "grain_name": "The name of the grain", - "grain_group": "The family of grains the grain belongs to", - "soil_group": "The family of soils the grain belongs to", - "classification": "The classification scheme the given grain belongs to", - "all": "Return all grain sizes", - "format": "Desired output format" + }, + "/defs/grainsizes": { + description: "Returns grain size definitions", + parent: "definitions", + visible: true, + options: { + parameters: { + grain_id: "Unique grain ID", + grain_symbol: "The grain symbol for display purposes", + grain_name: "The name of the grain", + grain_group: "The family of grains the grain belongs to", + soil_group: "The family of soils the grain belongs to", + classification: + "The classification scheme the given grain belongs to", + all: "Return all grain sizes", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: [ + "api/v2/defs/grainsizes?all", + "api/v2/defs/grainsizes?grain_name=clay", + "api/v2/defs/grainsizes?classification=iso", + ], + fields: [ + "grain_id", + "grain_symbol", + "grain_group", + "soil_group", + "min_size", + "max_size", + "classification", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/grainsizes?all", - "api/v2/defs/grainsizes?grain_name=clay", - "api/v2/defs/grainsizes?classification=iso" - ], - "fields": [ - "grain_id", - "grain_symbol", - "grain_group", - "soil_group", - "min_size", - "max_size", - "classification" - ] - } - }, - "/defs/refs": { - "description": "Returns references", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "ref_id": "integer, one or more comma-separted reference ids", - "all": "return all references" + }, + "/defs/refs": { + description: "Returns references", + parent: "definitions", + visible: true, + options: { + parameters: { + ref_id: "integer, one or more comma-separted reference ids", + all: "return all references", + }, + output_formats: ["json", "csv"], + examples: ["api/v2/defs/groups?all"], + fields: ["ref_id", "pub_year", "author", "ref", "doi", "url"], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/v2/defs/groups?all" - ], - "fields": [ - "ref_id", - "pub_year", - "author", - "ref", - "doi", - "url" - ] - } - }, - "/defs/drilling_sites": { - "description": "Returns metadata for offshore drilling sites from ODP, DSDP and IODP", - "parent": "definitions", - "visible": true, - "options": { - "parameters": { - "epoch": "string, drilling 'epoch'; only three valid values. DSDP, ODP and IODP", - "leg": "string, drilling leg (or expedition for IODP)", - "site": "string, drilling site", - "col_id": "integer, one or more Macrostrat column ids", - "col_group_id": "integer, one or more Macrostrat column group ids; corresponds to legs/expeditions", - "all": "return all drilling expeditions and sites", - "sample": "if present, get a selection of data", - "format": "desired output format, options given below in output_formats" + }, + "/defs/drilling_sites": { + description: + "Returns metadata for offshore drilling sites from ODP, DSDP and IODP", + parent: "definitions", + visible: true, + options: { + parameters: { + epoch: + "string, drilling 'epoch'; only three valid values. DSDP, ODP and IODP", + leg: "string, drilling leg (or expedition for IODP)", + site: "string, drilling site", + col_id: "integer, one or more Macrostrat column ids", + col_group_id: + "integer, one or more Macrostrat column group ids; corresponds to legs/expeditions", + all: "return all drilling expeditions and sites", + sample: "if present, get a selection of data", + format: + "desired output format, options given below in output_formats", + }, + output_formats: [ + "json", + "csv", + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [ + "api/v2/defs/drilling_sites?format=geojson_bare", + "api/v2/defs/drilling_sites?site=U1547", + "api/v2/defs/drilling_sites?all", + "api/v2/defs/drilling_sites?exp=385", + ], + fields: [ + "epoch", + "leg", + "site", + "hole", + "lat", + "lng", + "col_id", + "col_group_id", + "penetration", + "cored", + "recovered", + "recovery", + "drilled_interval", + "drilled_intervals", + "cores", + "date_started", + "comments", + "ref_id", + ], }, - "output_formats": [ - "json", - "csv", - "geojson", - "geojson_bare", - "topojson", - "topojson_bare" - ], - "examples": [ - "api/v2/defs/drilling_sites?format=geojson_bare", - "api/v2/defs/drilling_sites?site=U1547", - "api/v2/defs/drilling_sites?all", - "api/v2/defs/drilling_sites?exp=385" - ], - "fields": [ - "epoch", - "leg", - "site", - "hole", - "lat", - "lng", - "col_id", - "col_group_id", - "penetration", - "cored", - "recovered", - "recovery", - "drilled_interval", - "drilled_intervals", - "cores", - "date_started", - "comments", - "ref_id", - ] - } - }, - "/section_stats": { - "description": "Return section stats for Macrostrat", - "visible": true, - "options": { - "parameters": { - "all": "return all section stats", - "format": "Desired output format" + }, + "/section_stats": { + description: "Return section stats for Macrostrat", + visible: true, + options: { + parameters: { + all: "return all section stats", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: ["api/section_stats?all", "api/section_stats?all&format=csv"], + fields: [ + "project", + "col_id", + "section_id", + "units", + "max_thick", + "min_thick", + "FO_age", + "LO_age", + "b_age", + "t_age", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/section_stats?all", - "api/section_stats?all&format=csv" - ], - "fields": [ - "project", - "col_id", - "section_id", - "units", - "max_thick", - "min_thick", - "FO_age", - "LO_age", - "b_age", - "t_age" - ] - } - }, - "/measurements": { - "description": "measurements", - "visible": true, - "options": { - "parameters": { - "measurement": "string, measurement definition name", - "measurement_type": "string, measurement definition type", - "measurement_class": "string, measurement definition class", - "measurement_id": "integer, measurement definition unique identifier", - "measure_id": "integer, specific measurement id", - "measuremeta_id": "integer, specific id for measurment metadata (generally a sample)", - "unit_id": "integer, one or more ids for unit containing measurements", - "interval_name": "string, an interval name to restrict measurements matched to units touching given age", - "lith_id": "integer, one or more ids for lith (see /defs/lithologies)", - "lith_type": "string, one or more lithology types", - "lith_class": "string, one or more lithology classes", - "section_id": "integer, id for section containing measurements", - "col_id": "integer, id for column containing measurements", - "project_id": "integer, id for project", - "measure_phase": "string, phase from which measurement was taken (e.g., 'zircon')", - "response": "Any available response_type. Default is short. Use 'light' for effecient return of measurements with little metadata", - "format": "Desired output format", - "sample": "if present, show a subset of the data", - "show_values": "if present, show measurements as arrays, grouped by measuremeta_id and measurement_id" + }, + "/measurements": { + description: "measurements", + visible: true, + options: { + parameters: { + measurement: "string, measurement definition name", + measurement_type: "string, measurement definition type", + measurement_class: "string, measurement definition class", + measurement_id: "integer, measurement definition unique identifier", + measure_id: "integer, specific measurement id", + measuremeta_id: + "integer, specific id for measurment metadata (generally a sample)", + unit_id: "integer, one or more ids for unit containing measurements", + interval_name: + "string, an interval name to restrict measurements matched to units touching given age", + lith_id: "integer, one or more ids for lith (see /defs/lithologies)", + lith_type: "string, one or more lithology types", + lith_class: "string, one or more lithology classes", + section_id: "integer, id for section containing measurements", + col_id: "integer, id for column containing measurements", + project_id: "integer, id for project", + measure_phase: + "string, phase from which measurement was taken (e.g., 'zircon')", + response: + "Any available response_type. Default is short. Use 'light' for effecient return of measurements with little metadata", + format: "Desired output format", + sample: "if present, show a subset of the data", + show_values: + "if present, show measurements as arrays, grouped by measuremeta_id and measurement_id", + }, + response_types: ["light", "short", "long"], + output_formats: [ + "json", + "csv", + "geojson", + "topojson", + "geojson_bare", + "topojson_bare", + ], + examples: [ + "api/measurements?col_id=11&show_values", + "api/measurements?measure_id=353&response=long", + ], + fields: [ + "measurement_id", + "measuremeta_id", + "measurement", + "measure_units", + "measure_phase", + "method", + "n", + "measure_value", + "measure_error", + "measure_position", + "measure_n", + "error_units", + "lat", + "lng", + "samp_geo_unit", + "samp_lith", + "samp_desc", + "samp_age", + "ref_id", + "unit_id", + "col_id", + "strat_name_id", + "match_basis", + "ref", + ], }, - "response_types": [ - "light", - "short", - "long" - ], - "output_formats": [ - "json", - "csv", - "geojson", - "topojson", - "geojson_bare", - "topojson_bare" - ], - "examples": [ - "api/measurements?col_id=11&show_values", - "api/measurements?measure_id=353&response=long" - ], - "fields": [ - "measurement_id", - "measuremeta_id", - "measurement", - "measure_units", - "measure_phase", - "method", - "n", - "measure_value", - "measure_error", - "measure_position", - "measure_n", - "error_units", - "lat", - "lng", - "samp_geo_unit", - "samp_lith", - "samp_desc", - "samp_age", - "ref_id", - "unit_id", - "col_id", - "strat_name_id", - "match_basis", - "ref" - ] - } - }, - "/eodp": { - "description": "eODP Macrostrat Baggage Stripper Import", - "visible": true, - "options": { - "parameters": { - "epoch": "string, drilling 'epoch'; only three valid values (DSDP, ODP and IODP), but note that Baggage Stipper limited to IODP", - "leg": "string, drilling leg (or expedition for IODP, e.g., leg=317)", - "site": "string, drilling site (e.g., U1351)", - "col_id": "integer, one or more Macrostrat column ids", - "col_group_id": "integer, one or more Macrostrat column group ids; corresponds to legs/expeditions", - "all": "return all drilling expeditions and sites", - "sample": "if present, get a selection of data", - "format": "desired output format, options given below in output_formats" + }, + "/eodp": { + description: "eODP Macrostrat Baggage Stripper Import", + visible: true, + options: { + parameters: { + epoch: + "string, drilling 'epoch'; only three valid values (DSDP, ODP and IODP), but note that Baggage Stipper limited to IODP", + leg: "string, drilling leg (or expedition for IODP, e.g., leg=317)", + site: "string, drilling site (e.g., U1351)", + col_id: "integer, one or more Macrostrat column ids", + col_group_id: + "integer, one or more Macrostrat column group ids; corresponds to legs/expeditions", + all: "return all drilling expeditions and sites", + sample: "if present, get a selection of data", + format: + "desired output format, options given below in output_formats", + }, + output_formats: [ + "json", + "csv", + "geojson", + "topojson", + "geojson_bare", + "topojson_bare", + ], + examples: [ + "api/eodp?leg=317", + "api/eodp?site=U1354", + "api/eodp?col_id=5092", + ], + fields: [ + "col_group", + "site_hole", + "date_started", + "ref_id", + "col_id", + "lat", + "lng", + "top_depth", + "bottom_depth", + "primary_lith", + "minor_lith", + ], }, - "output_formats": [ - "json", - "csv", - "geojson", - "topojson", - "geojson_bare", - "topojson_bare" - ], - "examples": [ - "api/eodp?leg=317", - "api/eodp?site=U1354", - "api/eodp?col_id=5092" - ], - "fields": [ - "col_group", - "site_hole", - "date_started", - "ref_id", - "col_id", - "lat", - "lng", - "top_depth", - "bottom_depth", - "primary_lith", - "minor_lith" - ] - } - }, - "/paleogeography": { - "description": "Returns paleogeography geometry from \"Wright et al. (2013) Towards community-driven paleogeographic reconstructions: integrating open-access paleogeographic and paleobiology data with plate tectonics. Biogeosciences 10:1529-1541\" If you use this service and provide attribution, you should cite the associated paper via this service.", - "visible": true, - "options": { - "parameters": { - "age": "Can be between 0 and 550", - "interval_name": "A named time interval", - "format": "Desired output format" + }, + "/paleogeography": { + description: + 'Returns paleogeography geometry from "Wright et al. (2013) Towards community-driven paleogeographic reconstructions: integrating open-access paleogeographic and paleobiology data with plate tectonics. Biogeosciences 10:1529-1541" If you use this service and provide attribution, you should cite the associated paper via this service.', + visible: true, + options: { + parameters: { + age: "Can be between 0 and 550", + interval_name: "A named time interval", + format: "Desired output format", + }, + output_formats: [ + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [ + "api/paleogeography?interval_name=Permian", + "api/paleogeography?age=271&format=topojson", + ], + fields: ["plate_id"], }, - "output_formats": [ - "geojson", - "geojson_bare", - "topojson", - "topojson_bare" - ], - "examples": [ - "api/paleogeography?interval_name=Permian", - "api/paleogeography?age=271&format=topojson" - ], - "fields": [ - "plate_id" - ] - } - }, - "/geologic_units/gmna": { - "description": "Geologic map units. Continental-scale North American map data (gmna) adapted from the 2005 Geologic Map of North America (http://ngmdb.usgs.gov/gmna/)", - "visible": false, - "parent": "geologic_units", - "options": { - "parameters": { - "lat": "A valid latitude", - "lng": "A valid longitude", - "gid": "integer, a polygon GID to search for", - "interval_name": "string, a valid interval name as defined in /defs/intervals", - "shape": "string, a valid WKT shape", - "buffer": "integer, buffers a provided shape by x kilometers", - "format": "Desired output format" + }, + "/geologic_units/gmna": { + description: + "Geologic map units. Continental-scale North American map data (gmna) adapted from the 2005 Geologic Map of North America (http://ngmdb.usgs.gov/gmna/)", + visible: false, + parent: "geologic_units", + options: { + parameters: { + lat: "A valid latitude", + lng: "A valid longitude", + gid: "integer, a polygon GID to search for", + interval_name: + "string, a valid interval name as defined in /defs/intervals", + shape: "string, a valid WKT shape", + buffer: "integer, buffers a provided shape by x kilometers", + format: "Desired output format", + }, + output_formats: [ + "json", + "csv", + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [ + "/api/v2/geologic_units/gmna?lat=43&lng=-89.3", + "/api/v2/geologic_units/gmna?lat=43&lng=-89&format=geojson_bare", + "/api/v2/geologic_units/gmna?interval_name=Permian", + "/api/v2/geologic_units/gmna?shape=LINESTRING(-88 43,-90 43)&buffer=20", + ], + fields: [ + "gid", + "unit_abbre", + "rocktype", + "lith", + "lith_type", + "lith_class", + "t_interval", + "t_age", + "b_interval", + "b_age", + "containing_interval", + "color", + ], }, - "output_formats": [ - "json", - "csv", - "geojson", - "geojson_bare", - "topojson", - "topojson_bare" - ], - "examples": [ - "/api/v2/geologic_units/gmna?lat=43&lng=-89.3", - "/api/v2/geologic_units/gmna?lat=43&lng=-89&format=geojson_bare", - "/api/v2/geologic_units/gmna?interval_name=Permian", - "/api/v2/geologic_units/gmna?shape=LINESTRING(-88 43,-90 43)&buffer=20" - ], - "fields": [ - "gid", - "unit_abbre", - "rocktype", - "lith", - "lith_type", - "lith_class", - "t_interval", - "t_age", - "b_interval", - "b_age", - "containing_interval", - "color" - ] - } - }, - "/geologic_units/gmus": { - "description": "Geologic map units. State-level (gmus) data adapated from http://mrdata.usgs.gov/geology/state/.", - "visible": false, - "parent": "geologic_units", - "options": { - "parameters": { - "gid": "integer, a polygon GID to search for", - "lat": "A valid latitude in decimal degrees", - "lng": "A valid longitude in decimal degrees", - "strat_name_id": "integer, one or more valid strat_name_ids from /defs/strat_names", - "unit_id": "integer, one or more valid unit_ids from /units", - "search": "string, a term to search for in map metadata", - "shape": "string, a valid WKT shape", - "buffer": "integer, buffers a provided shape by x kilometers", - "unit_link": "string, GMUS unit_link", - "interval_name": "string, a valid interval name as defined in /defs/intervals", - "format": "Desired output format" + }, + "/geologic_units/gmus": { + description: + "Geologic map units. State-level (gmus) data adapated from http://mrdata.usgs.gov/geology/state/.", + visible: false, + parent: "geologic_units", + options: { + parameters: { + gid: "integer, a polygon GID to search for", + lat: "A valid latitude in decimal degrees", + lng: "A valid longitude in decimal degrees", + strat_name_id: + "integer, one or more valid strat_name_ids from /defs/strat_names", + unit_id: "integer, one or more valid unit_ids from /units", + search: "string, a term to search for in map metadata", + shape: "string, a valid WKT shape", + buffer: "integer, buffers a provided shape by x kilometers", + unit_link: "string, GMUS unit_link", + interval_name: + "string, a valid interval name as defined in /defs/intervals", + format: "Desired output format", + }, + output_formats: [ + "json", + "csv", + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [ + "/api/v2/geologic_units/gmus?lat=43&lng=-89.3", + "/api/v2/geologic_units/gmus?lat=43&lng=-89&format=geojson_bare", + "/api/v2/geologic_units/gmus?interval_name=Permian", + "/api/v2/geologic_units/gmus?shape=LINESTRING(-88 43,-90 43)&buffer=20", + ], + fields: [ + "gid", + "area", + "unit_link", + "interval_color", + "lithology", + "rocktype", + "macro_units", + "strat_names", + "t_int_id", + "t_age", + "b_int_id", + "b_age", + "containing_interval", + "unit_com", + "unit_name", + "unitdesc", + "strat_unit", + "color", + ], }, - "output_formats": [ - "json", - "csv", - "geojson", - "geojson_bare", - "topojson", - "topojson_bare" - ], - "examples": [ - "/api/v2/geologic_units/gmus?lat=43&lng=-89.3", - "/api/v2/geologic_units/gmus?lat=43&lng=-89&format=geojson_bare", - "/api/v2/geologic_units/gmus?interval_name=Permian", - "/api/v2/geologic_units/gmus?shape=LINESTRING(-88 43,-90 43)&buffer=20" - ], - "fields": [ - "gid", - "area", - "unit_link", - "interval_color", - "lithology", - "rocktype", - "macro_units", - "strat_names", - "t_int_id", - "t_age", - "b_int_id", - "b_age", - "containing_interval", - "unit_com", - "unit_name", - "unitdesc", - "strat_unit", - "color" - ] - } - }, - "/geologic_units/burwell": { - "description": "Geologic map units from various data sources", - "visible": false, - "parent": "geologic_units", - "options": { - "parameters": { - "scale": "Can be 'small', 'medium', or 'large'", - "map_id": "integer, one or more polygon map_ids to search for", - "lat": "A valid latitude in decimal degrees", - "lng": "A valid longitude in decimal degrees", - "strat_name_id": "integer, one or more valid strat_name_ids from /defs/strat_names", - "unit_id": "integer, one or more valid unit_ids from /units", - "format": "Desired output format" + }, + "/geologic_units/burwell": { + description: "Geologic map units from various data sources", + visible: false, + parent: "geologic_units", + options: { + parameters: { + scale: "Can be 'small', 'medium', or 'large'", + map_id: "integer, one or more polygon map_ids to search for", + lat: "A valid latitude in decimal degrees", + lng: "A valid longitude in decimal degrees", + strat_name_id: + "integer, one or more valid strat_name_ids from /defs/strat_names", + unit_id: "integer, one or more valid unit_ids from /units", + format: "Desired output format", + }, + output_formats: [ + "json", + "csv", + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: ["/api/v2/geologic_units/burwell?lat=43&lng=-89.3"], + fields: [ + "map_id", + "source_id", + "name", + "strat_name", + "lith", + "descrip", + "comments", + "macro_units", + "strat_names", + "t_int_id", + "t_int_age", + "t_int_name", + "b_int_id", + "b_int_age", + "b_int_name", + "color", + ], }, - "output_formats": [ - "json", - "csv", - "geojson", - "geojson_bare", - "topojson", - "topojson_bare" - ], - "examples": [ - "/api/v2/geologic_units/burwell?lat=43&lng=-89.3" - ], - "fields": [ - "map_id", - "source_id", - "name", - "strat_name", - "lith", - "descrip", - "comments", - "macro_units", - "strat_names", - "t_int_id", - "t_int_age", - "t_int_name", - "b_int_id", - "b_int_age", - "b_int_name", - "color" - ] - } - }, + }, "/geologic_units/map": { - "description": "Geologic map units from various data sources", - "visible": true, - "parent": "geologic_units", - "options": { - "parameters": { - "scale": "Can be 'small', 'medium', or 'large'", - "map_id": "integer, one or more polygon map_ids to search for", - "lat": "A valid latitude in decimal degrees", - "lng": "A valid longitude in decimal degrees", - "strat_name_id": "integer, one or more valid strat_name_ids from /defs/strat_names", - "unit_id": "integer, one or more valid unit_ids from /units", - "format": "Desired output format" + description: "Geologic map units from various data sources", + visible: true, + parent: "geologic_units", + options: { + parameters: { + scale: "Can be 'small', 'medium', or 'large'", + map_id: "integer, one or more polygon map_ids to search for", + lat: "A valid latitude in decimal degrees", + lng: "A valid longitude in decimal degrees", + strat_name_id: + "integer, one or more valid strat_name_ids from /defs/strat_names", + unit_id: "integer, one or more valid unit_ids from /units", + format: "Desired output format", }, - "output_formats": [ + output_formats: [ "json", "csv", "geojson", "geojson_bare", "topojson", - "topojson_bare" + "topojson_bare", ], - "examples": [ - "/api/v2/geologic_units/map?lat=43&lng=-89.3" - ], - "fields": [ + examples: ["/api/v2/geologic_units/map?lat=43&lng=-89.3"], + fields: [ "map_id", "source_id", "name", @@ -1462,444 +1388,423 @@ "b_int_id", "b_int_age", "b_int_name", - "color" - ] - } - }, - "/geologic_units/burwell/points": { - "description": "Query point features from geologic maps", - "visible": false, - "parent": "geologic_units", - "options": { - "parameters": { - "point_id": "One or more comma-separated valid point_ids", - "point_type": "One or more comma-separated point_types", - "certainty": "A string to search the certainty field for (fuzzy)", - "comments": "A string to search the comments field for (fuzzy)", - "source_id": "One or more comma-separated source_ids", - "minlat": "A minimum latitude that represents the southwest corner of a bounding box (requires minlng, maxlat, and maxlng)", - "minlng": "A minimum longitude that represents the southwest corner of a bounding box (requires minlat, maxlat, and maxlng)", - "maxlat": "A maximum latitude that represents the northeast corner of a bounding box (requires minlat, minlng, and maxlng)", - "maxlng": "A maximum longitude that represents the northeast corner of a bounding box (requires minlat, minlng, and maxlat)", - "format": "Desired output format. Default is GeoJSON", - "sample": "Return a sample of data" + "color", + ], }, - "output_formats": [ - "geojson", - "geojson_bare", - "topojson", - "topojson_bare", - "csv" - ], - "examples": [ - "/api/v2/geologic_units/burwell/points?point_id=1,2,3", - "/api/v2/geologic_units/burwell/points?point_type=joint", - "/api/v2/geologic_units/burwell/points?minlng=-112.7672&minlat=36.0627&maxlng=-112.5390&maxlat=36.1872" - ], - "fields": [ - "point_id", - "strike", - "dip", - "dip_dir", - "point_type", - "certainty", - "comments", - "source_id" - ] - } - }, - - "/geologic_units/map/legend": { - "description": "Retrieve legends for geologic map units", - "visible": true, - "parent": "geologic_units", - "options": { - "parameters": { - "scale": "Restrict results to maps of a specific scale(s) in Macrostrat's system, can be tiny, small, medium, or large", - "carto": "Restrict results to map components present in one of Macrostrat's map harmonized scales: tiny, small, medium, large", - "source_id": "Integer(s), one or more comma-separated integers identifying map sources", - "description": "A string to search for in the map unit description", - "comments": "A string to search for in the map unit comments", - "lith_type": "String, one or more comma-separated lithology types", - "lith_class": "String, one or more comma-separated lithology classes", - "lith_id": "Integer(s), one or more comma-separated integers identifying specific lithologies", - "format": "Desired output format. Default is JSON", - "sample": "Return a sample of data" + }, + "/geologic_units/burwell/points": { + description: "Query point features from geologic maps", + visible: false, + parent: "geologic_units", + options: { + parameters: { + point_id: "One or more comma-separated valid point_ids", + point_type: "One or more comma-separated point_types", + certainty: "A string to search the certainty field for (fuzzy)", + comments: "A string to search the comments field for (fuzzy)", + source_id: "One or more comma-separated source_ids", + minlat: + "A minimum latitude that represents the southwest corner of a bounding box (requires minlng, maxlat, and maxlng)", + minlng: + "A minimum longitude that represents the southwest corner of a bounding box (requires minlat, maxlat, and maxlng)", + maxlat: + "A maximum latitude that represents the northeast corner of a bounding box (requires minlat, minlng, and maxlng)", + maxlng: + "A maximum longitude that represents the northeast corner of a bounding box (requires minlat, minlng, and maxlat)", + format: "Desired output format. Default is GeoJSON", + sample: "Return a sample of data", + }, + output_formats: [ + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + "csv", + ], + examples: [ + "/api/v2/geologic_units/burwell/points?point_id=1,2,3", + "/api/v2/geologic_units/burwell/points?point_type=joint", + "/api/v2/geologic_units/burwell/points?minlng=-112.7672&minlat=36.0627&maxlng=-112.5390&maxlat=36.1872", + ], + fields: [ + "point_id", + "strike", + "dip", + "dip_dir", + "point_type", + "certainty", + "comments", + "source_id", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "/api/v2/geologic_units/map/legend?source_id=1", - "/api/v2/geologic_units/map/legend?description=banded%20iron", - "/api/v2/geologic_units/map/legend?lith_type=carbonate" - ], - "fields": [ - "legend_id", - "source_id", - "scale", - "map_unit_name", - "strat_name", - "unit_id", - "age", - "lith", - "descrip", - "comments", - "b_age", - "t_age", - "b_interval", - "t_interval", - "strat_name_id", - "lith_types", - "lith_classes", - "lith_id", - "color", - "area", - "tiny_area", - "small_area", - "medium_area", - "large_area" - ] - } - }, - + }, - "/geologic_units/map/points": { - "description": "Query point features from geologic maps", - "visible": true, - "parent": "geologic_units", - "options": { - "parameters": { - "point_id": "One or more comma-separated valid point_ids", - "point_type": "One or more comma-separated point_types", - "certainty": "A string to search the certainty field for (fuzzy)", - "comments": "A string to search the comments field for (fuzzy)", - "source_id": "One or more comma-separated source_ids", - "minlat": "A minimum latitude that represents the southwest corner of a bounding box (requires minlng, maxlat, and maxlng)", - "minlng": "A minimum longitude that represents the southwest corner of a bounding box (requires minlat, maxlat, and maxlng)", - "maxlat": "A maximum latitude that represents the northeast corner of a bounding box (requires minlat, minlng, and maxlng)", - "maxlng": "A maximum longitude that represents the northeast corner of a bounding box (requires minlat, minlng, and maxlat)", - "format": "Desired output format. Default is GeoJSON", - "sample": "Return a sample of data" + "/geologic_units/map/legend": { + description: "Retrieve legends for geologic map units", + visible: true, + parent: "geologic_units", + options: { + parameters: { + scale: + "Restrict results to maps of a specific scale(s) in Macrostrat's system, can be tiny, small, medium, or large", + carto: + "Restrict results to map components present in one of Macrostrat's map harmonized scales: tiny, small, medium, large", + source_id: + "Integer(s), one or more comma-separated integers identifying map sources", + description: "A string to search for in the map unit description", + comments: "A string to search for in the map unit comments", + lith_type: "String, one or more comma-separated lithology types", + lith_class: "String, one or more comma-separated lithology classes", + lith_id: + "Integer(s), one or more comma-separated integers identifying specific lithologies", + format: "Desired output format. Default is JSON", + sample: "Return a sample of data", + }, + output_formats: ["json", "csv"], + examples: [ + "/api/v2/geologic_units/map/legend?source_id=1", + "/api/v2/geologic_units/map/legend?description=banded%20iron", + "/api/v2/geologic_units/map/legend?lith_type=carbonate", + ], + fields: [ + "legend_id", + "source_id", + "scale", + "map_unit_name", + "strat_name", + "unit_id", + "age", + "lith", + "descrip", + "comments", + "b_age", + "t_age", + "b_interval", + "t_interval", + "strat_name_id", + "lith_types", + "lith_classes", + "lith_id", + "color", + "area", + "tiny_area", + "small_area", + "medium_area", + "large_area", + ], }, - "output_formats": [ - "geojson", - "geojson_bare", - "topojson", - "topojson_bare", - "csv" - ], - "examples": [ - "/api/v2/geologic_units/map/points?point_id=1,2,3", - "/api/v2/geologic_units/map/points?point_type=joint", - "/api/v2/geologic_units/map/points?minlng=-112.7672&minlat=36.0627&maxlng=-112.5390&maxlat=36.1872" - ], - "fields": [ - "point_id", - "strike", - "dip", - "dip_dir", - "point_type", - "certainty", - "comments", - "source_id" - ] - } - }, + }, - "/geologic_units/burwell/nearby": { - "description": "Stratigraphic names, lithologies, and time intervals near a coordinate in Burwell", - "visible": false, - "parent": "geologic_units", - "options": { - "parameters": { - "lat": "A valid latitude in decimal degrees", - "lng": "A valid longitude in decimal degrees", - "format": "Desired output format" + "/geologic_units/map/points": { + description: "Query point features from geologic maps", + visible: true, + parent: "geologic_units", + options: { + parameters: { + point_id: "One or more comma-separated valid point_ids", + point_type: "One or more comma-separated point_types", + certainty: "A string to search the certainty field for (fuzzy)", + comments: "A string to search the comments field for (fuzzy)", + source_id: "One or more comma-separated source_ids", + minlat: + "A minimum latitude that represents the southwest corner of a bounding box (requires minlng, maxlat, and maxlng)", + minlng: + "A minimum longitude that represents the southwest corner of a bounding box (requires minlat, maxlat, and maxlng)", + maxlat: + "A maximum latitude that represents the northeast corner of a bounding box (requires minlat, minlng, and maxlng)", + maxlng: + "A maximum longitude that represents the northeast corner of a bounding box (requires minlat, minlng, and maxlat)", + format: "Desired output format. Default is GeoJSON", + sample: "Return a sample of data", + }, + output_formats: [ + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + "csv", + ], + examples: [ + "/api/v2/geologic_units/map/points?point_id=1,2,3", + "/api/v2/geologic_units/map/points?point_type=joint", + "/api/v2/geologic_units/map/points?minlng=-112.7672&minlat=36.0627&maxlng=-112.5390&maxlat=36.1872", + ], + fields: [ + "point_id", + "strike", + "dip", + "dip_dir", + "point_type", + "certainty", + "comments", + "source_id", + ], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "/api/v2/geologic_units/burwell?lat=43&lng=-89.3" - ], - "fields": [ - - ] - } - }, + }, - "/geologic_units/map/nearby": { - "description": "Stratigraphic names, lithologies, and time intervals near a coordinate in Macrostrat", - "visible": false, - "parent": "geologic_units", - "options": { - "parameters": { - "lat": "A valid latitude in decimal degrees", - "lng": "A valid longitude in decimal degrees", - "format": "Desired output format" + "/geologic_units/burwell/nearby": { + description: + "Stratigraphic names, lithologies, and time intervals near a coordinate in Burwell", + visible: false, + parent: "geologic_units", + options: { + parameters: { + lat: "A valid latitude in decimal degrees", + lng: "A valid longitude in decimal degrees", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: ["/api/v2/geologic_units/burwell?lat=43&lng=-89.3"], + fields: [], }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "/api/v2/geologic_units/map?lat=43&lng=-89.3" - ], - "fields": [ + }, - ] - } - }, + "/geologic_units/map/nearby": { + description: + "Stratigraphic names, lithologies, and time intervals near a coordinate in Macrostrat", + visible: false, + parent: "geologic_units", + options: { + parameters: { + lat: "A valid latitude in decimal degrees", + lng: "A valid longitude in decimal degrees", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: ["/api/v2/geologic_units/map?lat=43&lng=-89.3"], + fields: [], + }, + }, - "/carto": { - "description": "Routes for creating geologic maps", - "visible": true, - "isParent": true - }, + "/carto": { + description: "Routes for creating geologic maps", + visible: true, + isParent: true, + }, - "/carto/small": { - "description": "Returns Burwell polygons for mapping purposes", - "parent": "carto", - "visible": true, - "options": { - "parameters": { - "sample": "Get a sample response", - "lat": "A valid latitude in decimal degrees", - "lng": "A valid longitude in decimal degrees", - "shape": "A valid WKT geometry", - "format": "Desired output format" + "/carto/small": { + description: "Returns Burwell polygons for mapping purposes", + parent: "carto", + visible: true, + options: { + parameters: { + sample: "Get a sample response", + lat: "A valid latitude in decimal degrees", + lng: "A valid longitude in decimal degrees", + shape: "A valid WKT geometry", + format: "Desired output format", + }, + output_formats: [ + "json", + "csv", + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [""], + fields: [ + "map_id", + "scale", + "source_id", + "name", + "strat_name", + "age", + "lith", + "descrip", + "comments", + "best_age_top", + "best_age_bottom", + "t_int", + "b_int", + "color", + ], }, - "output_formats": [ - "json", - "csv", - "geojson", "geojson_bare", "topojson", "topojson_bare" - ], - "examples": [ - "" - ], - "fields": [ - "map_id", - "scale", - "source_id", - "name", - "strat_name", - "age", - "lith", - "descrip", - "comments", - "best_age_top", - "best_age_bottom", - "t_int", - "b_int", - "color" - ] - } - }, + }, - "/elevation": { - "description": "Returns elevation in meters at a given coordinate from ETOPO1 and SRTM1", - "visible": false, - "options": { - "parameters": { - "lat": "A valid latitude", - "lng": "A valid longitude", - "format": "Desired output format" - }, - "output_formats": [ - "json", - "csv" - ], - "examples": [ - "api/elevation?lat=43&lng=-89" - ], - "fields": [ - "elevation" - ] - } - }, - "/infer": { - "description": "", - "visible": false, - "options": { - "parameters": { - "lat": "A valid latitude", - "lng": "A valid longitude" + "/elevation": { + description: + "Returns elevation in meters at a given coordinate from ETOPO1 and SRTM1", + visible: false, + options: { + parameters: { + lat: "A valid latitude", + lng: "A valid longitude", + format: "Desired output format", + }, + output_formats: ["json", "csv"], + examples: ["api/elevation?lat=43&lng=-89"], + fields: ["elevation"], }, - "output_formats": [ - "json" - ], - "examples": [ - "api/elevation?lat=43&lng=-89" - ], - "fields": [ - "elevation" - ] - } - }, - "/grids": { - "description": "Returns grids with the specified parameters", - "visible": true, - "isParent": true - }, - "/grids/latitude": { - "description": "Returns a grid given a longitude and latitude spacing", - "parent": "grids", - "visible": true, - "options": { - "parameters": { - "lngSpacing": "divide bands of latitude by x degrees of longitude", - "latSpacing": "the number of times a hemisphere should be cut", - "format": "Desired output format" + }, + "/infer": { + description: "", + visible: false, + options: { + parameters: { + lat: "A valid latitude", + lng: "A valid longitude", + }, + output_formats: ["json"], + examples: ["api/elevation?lat=43&lng=-89"], + fields: ["elevation"], }, - "output_formats": [ - "geojson", "geojson_bare", "topojson", "topojson_bare" - ], - "examples": [ - "api/v2/grids/latitude?lngSpacing=5&latSpacing=12&format=geojson_bare" - ], - "fields": [ - "id", - "area" - ] - } - }, - "/grids/longitude": { - "description": "Returns a grid given a latitude spacing and target cell size", - "parent": "grids", - "visible": true, - "options": { - "parameters": { - "latSpacing": "the number of degrees between bands of latitude", - "cellArea": "target cell area in km^2", - "format": "Desired output format" + }, + "/grids": { + description: "Returns grids with the specified parameters", + visible: true, + isParent: true, + }, + "/grids/latitude": { + description: "Returns a grid given a longitude and latitude spacing", + parent: "grids", + visible: true, + options: { + parameters: { + lngSpacing: "divide bands of latitude by x degrees of longitude", + latSpacing: "the number of times a hemisphere should be cut", + format: "Desired output format", + }, + output_formats: [ + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [ + "api/v2/grids/latitude?lngSpacing=5&latSpacing=12&format=geojson_bare", + ], + fields: ["id", "area"], }, - "output_formats": [ - "geojson", "geojson_bare", "topojson", "topojson_bare" - ], - "examples": [ - "api/v2/grids/longitude?latSpacing=5&cellArea=500000&format=geojson_bare" - ], - "fields": [ - "id", - "area" - ] - } - }, - - "/grids/lithologies": { - "description": "Returns a grid given a latitude and longitude spacing with burwell lithology info", - "parent": "grids", - "visible": true, - "options": { - "parameters": { - "latSpacing": "the number of degrees between bands of latitude", - "lngSpacing": "the number of degrees between bands of longitude", - "originLat": "An optional origin latitude", - "originLng": "An option origin longitude", - "format": "Desired output format" + }, + "/grids/longitude": { + description: + "Returns a grid given a latitude spacing and target cell size", + parent: "grids", + visible: true, + options: { + parameters: { + latSpacing: "the number of degrees between bands of latitude", + cellArea: "target cell area in km^2", + format: "Desired output format", + }, + output_formats: [ + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [ + "api/v2/grids/longitude?latSpacing=5&cellArea=500000&format=geojson_bare", + ], + fields: ["id", "area"], }, - "output_formats": [ - "geojson", "geojson_bare", "topojson", "topojson_bare" - ], - "examples": [ - "api/v2/grids/longitude?latSpacing=5&cellArea=500000&format=geojson_bare" - ], - "fields": [ - "id", - "area" - ] - } - }, - + }, - "/places": { - "description": "Returns places", - "visible": false, - "options": { - "parameters": { - "wof_id": "integer, the Who's on First ID", - "name": "text, the place name", - "name_like": "text, the place name (fuzzy match)", - "placetype": "text, the type of the place (continent, country, region, county, or locality)", - "childtype": "text, if provided, returns the specified childtype of the provided wof_id or name", - "format": "Desired output format" + "/grids/lithologies": { + description: + "Returns a grid given a latitude and longitude spacing with burwell lithology info", + parent: "grids", + visible: true, + options: { + parameters: { + latSpacing: "the number of degrees between bands of latitude", + lngSpacing: "the number of degrees between bands of longitude", + originLat: "An optional origin latitude", + originLng: "An option origin longitude", + format: "Desired output format", + }, + output_formats: [ + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [ + "api/v2/grids/longitude?latSpacing=5&cellArea=500000&format=geojson_bare", + ], + fields: ["id", "area"], }, - "output_formats": [ - "json","geojson", "geojson_bare", "topojson", "topojson_bare" - ], - "examples": [ - "/api/v2/places?wof_id=101732721", - "api/v2/places?lng=-89.3843&lat=43.0748&placetype=region" - ], - "fields": [ - "wof_id", - "name", - "name_format", - "placetype", - "continent", - "country", - "region", - "county", - "other_names" - ] - } - }, + }, - "/hillshade": { - "description": "Get a hillshade for a point at z12", - "visible": false, - "options": { - "parameters": { - "lat": "a valid latitude", - "lng": "a valid longitude" + "/places": { + description: "Returns places", + visible: false, + options: { + parameters: { + wof_id: "integer, the Who's on First ID", + name: "text, the place name", + name_like: "text, the place name (fuzzy match)", + placetype: + "text, the type of the place (continent, country, region, county, or locality)", + childtype: + "text, if provided, returns the specified childtype of the provided wof_id or name", + format: "Desired output format", }, - "output_formats": [ - "jpeg" + output_formats: [ + "json", + "geojson", + "geojson_bare", + "topojson", + "topojson_bare", + ], + examples: [ + "/api/v2/places?wof_id=101732721", + "api/v2/places?lng=-89.3843&lat=43.0748&placetype=region", ], - "examples": [ + fields: [ + "wof_id", + "name", + "name_format", + "placetype", + "continent", + "country", + "region", + "county", + "other_names", ], - "fields": [ + }, + }, - ] - } + "/hillshade": { + description: "Get a hillshade for a point at z12", + visible: false, + options: { + parameters: { + lat: "a valid latitude", + lng: "a valid longitude", + }, + output_formats: ["jpeg"], + examples: [], + fields: [], + }, }, "/boundaries": { - "description": "Get geologic boundaries", - "visible": false, - "options": { - "parameters": { - "boundary_id": "A valid boundary id" + description: "Get geologic boundaries", + visible: false, + options: { + parameters: { + boundary_id: "A valid boundary id", }, - "output_formats": [ - "geojson" - ], - "examples": [ - ], - "fields": [ - - ] - } + output_formats: ["geojson"], + examples: [], + fields: [], + }, }, "/age_model": { - "description": "Get all components of column age models; mostly unit_boundaries but can include other constraints", - "visible": true, - "options": { - "parameters": { - "col_id": "A valid col_id", - "section_id": "A valid section_id" + description: + "Get all components of column age models; mostly unit_boundaries but can include other constraints", + visible: true, + options: { + parameters: { + col_id: "A valid col_id", + section_id: "A valid section_id", }, - "output_formats": [ - "json","csv" - ], - "examples": [ - "/age_models?section_id=1" - ], - "fields": [ + output_formats: ["json", "csv"], + examples: ["/age_models?section_id=1"], + fields: [ "boundary_id", "col_id", "section_id", @@ -1912,475 +1817,503 @@ "boundary_status", "boundary_type", "unit_below", - "unit_above" - ] - } + "unit_above", + ], + }, }, "/hex-summary": { - "description": "Get corresponding data for hex grids", - "visible": false, - "options": { - "parameters": { - "zoom": "zoom level", - "min_lng": "", - "min_lat": "", - "max_lng": "", - "max_lat": "" + description: "Get corresponding data for hex grids", + visible: false, + options: { + parameters: { + zoom: "zoom level", + min_lng: "", + min_lat: "", + max_lng: "", + max_lat: "", }, - "output_formats": [ - "json" - ], - "examples": [ - ], - "fields": [ - - ] - } + output_formats: ["json"], + examples: [], + fields: [], + }, }, - - "/mobile": { - "description": "Simplified data delivery, ideal for mobile applications", - "visible": true, - "isParent": true - }, - "/mobile/point": { - "description": "Get the largest scale geological map data available in Macrostrat/burwell for coordinates and relevant Macrostrat col_id (if any)", - "parent": "mobile", - "visible": true, - "options": { - "parameters": { - "lat": "A valid latitude", - "lng": "A valid longitude", - "geo_format": "Output geometry format - can be 'wkt' or 'geojson'; Defaults to 'geojson'" + "/mobile": { + description: "Simplified data delivery, ideal for mobile applications", + visible: true, + isParent: true, + }, + "/mobile/point": { + description: + "Get the largest scale geological map data available in Macrostrat/burwell for coordinates and relevant Macrostrat col_id (if any)", + parent: "mobile", + visible: true, + options: { + parameters: { + lat: "A valid latitude", + lng: "A valid longitude", + geo_format: + "Output geometry format - can be 'wkt' or 'geojson'; Defaults to 'geojson'", + }, + output_formats: ["json"], + examples: [ + "api/mobile/point?lat=43&lng=-89", + "api/mobile/point?lat=43&lng=-89&geo_format=wkt", + ], + fields: ["gid", "unit_name", "col_id", "col_poly"], }, - "output_formats": [ - "json" - ], - "examples": [ - "api/mobile/point?lat=43&lng=-89", - "api/mobile/point?lat=43&lng=-89&geo_format=wkt" - ], - "fields": [ - "gid", - "unit_name", - "col_id", - "col_poly" - ] - } - }, - "/mobile/point_details": { - "description": "Get state-level geologic map unit description and Macrostrat units for a given location. A valid latitude and longitude or column ID and map unit ID are required.", - "parent": "mobile", - "visible": false, - "options": { - "parameters": { - "lat": "A valid latitude", - "lng": "A valid longitude", - "col_id": "A valid column ID", - "unit_id": "A valid map unit ID", - "geo_format": "Output geometry format - can be 'wkt' or 'geojson'; Defaults to 'geojson'" + }, + "/mobile/point_details": { + description: + "Get state-level geologic map unit description and Macrostrat units for a given location. A valid latitude and longitude or column ID and map unit ID are required.", + parent: "mobile", + visible: false, + options: { + parameters: { + lat: "A valid latitude", + lng: "A valid longitude", + col_id: "A valid column ID", + unit_id: "A valid map unit ID", + geo_format: + "Output geometry format - can be 'wkt' or 'geojson'; Defaults to 'geojson'", + }, + output_formats: ["json"], + examples: [ + "api/mobile/point_details?lat=43&lng=-89", + "api/mobile/point_details?col_id=187&unit_id=184506&geo_format=wkt", + ], + fields: ["gid", "unit_name", "col_id", "col_poly"], }, - "output_formats": [ - "json" - ], - "examples": [ - "api/mobile/point_details?lat=43&lng=-89", - "api/mobile/point_details?col_id=187&unit_id=184506&geo_format=wkt" - ], - "fields": [ - "gid", - "unit_name", - "col_id", - "col_poly" - ] - } - }, - "/mobile/fossil_collections": { - "description": "Get Paleobiology Database (http://paleobiodb.org) fossil collection numbers matched to a given Macrostrat unit", - "parent": "mobile", - "visible": true, - "options": { - "parameters": { - "unit_id": "Macrostrat unit ID" + }, + "/mobile/fossil_collections": { + description: + "Get Paleobiology Database (http://paleobiodb.org) fossil collection numbers matched to a given Macrostrat unit", + parent: "mobile", + visible: true, + options: { + parameters: { + unit_id: "Macrostrat unit ID", + }, + output_formats: ["json"], + examples: ["/mobile/fossil_collections?unit_id=6132"], + fields: ["cltn_id", "cltn_name"], }, - "output_formats": [ - "json" - ], - "examples": [ - "/mobile/fossil_collections?unit_id=6132" - ], - "fields": [ - "cltn_id", - "cltn_name" - ] - } - }, + }, - "/mobile/macro_summary": { - "description": "Summarize Macrostrat for a given location", - "parent": "mobile", - "visible": false, - "options": { - "parameters": { - "lat": "numeric, a valid latitude", - "lng": "numeric, a valid longitude" + "/mobile/macro_summary": { + description: "Summarize Macrostrat for a given location", + parent: "mobile", + visible: false, + options: { + parameters: { + lat: "numeric, a valid latitude", + lng: "numeric, a valid longitude", + }, + output_formats: ["json"], + examples: ["/mobile/macro_summary?lat=43.0706192&lng=-89.406167"], + fields: [ + "max_thick", + "min_min_thick", + "b_age", + "t_age", + "b_int_name", + "t_int_name", + "lith", + "environ", + "econs", + "strat_names", + "strat_name_ids", + "c_int_name", + "int_color", + "lith_color", + ], }, - "output_formats": [ - "json" - ], - "examples": [ - "/mobile/macro_summary?lat=43.0706192&lng=-89.406167" - ], - "fields": [ - "max_thick", - "min_min_thick", - "b_age", - "t_age", - "b_int_name", - "t_int_name", - "lith", - "environ", - "econs", - "strat_names", - "strat_name_ids", - "c_int_name", - "int_color", - "lith_color" - ] - } - }, + }, - "/mobile/dashboard": { - "description": "Summarize Macrostrat for a given location", - "parent": "mobile", - "visible": false, - "options": { - "parameters": { - "lat": "numeric, a valid latitude", - "lng": "numeric, a valid longitude" + "/mobile/dashboard": { + description: "Summarize Macrostrat for a given location", + parent: "mobile", + visible: false, + options: { + parameters: { + lat: "numeric, a valid latitude", + lng: "numeric, a valid longitude", + }, + output_formats: ["json"], + examples: ["/mobile/dashboard?lat=43.0706192&lng=-89.406167"], + fields: [ + "max_thick", + "min_min_thick", + "b_age", + "t_age", + "b_int_name", + "t_int_name", + "lith", + "environ", + "econs", + "strat_names", + "strat_name_ids", + "c_int_name", + "int_color", + "lith_color", + ], }, - "output_formats": [ - "json" - ], - "examples": [ - "/mobile/dashboard?lat=43.0706192&lng=-89.406167" - ], - "fields": [ - "max_thick", - "min_min_thick", - "b_age", - "t_age", - "b_int_name", - "t_int_name", - "lith", - "environ", - "econs", - "strat_names", - "strat_name_ids", - "c_int_name", - "int_color", - "lith_color" - ] - } - }, + }, - "/mobile/map_query": { - "description": "Query burwell (and Macrostrat) for a given location", - "parent": "mobile", - "visible": false, - "options": { - "parameters": { - "lat": "numeric, a valid latitude", - "lng": "numeric, a valid longitude", - "z": "integer, a valid zoom level" + "/mobile/map_query": { + description: "Query burwell (and Macrostrat) for a given location", + parent: "mobile", + visible: false, + options: { + parameters: { + lat: "numeric, a valid latitude", + lng: "numeric, a valid longitude", + z: "integer, a valid zoom level", + }, + output_formats: ["json"], + examples: ["/mobile/map_query?lat=43.0706192&lng=-89.406167&z=10"], + fields: [], }, - "output_formats": [ - "json" - ], - "examples": [ - "/mobile/map_query?lat=43.0706192&lng=-89.406167&z=10" - ], - "fields": [ - ] - } - }, + }, - "/mobile/map_filter": { - "description": "Filter burwell polygons", - "parent": "mobile", - "visible": false, - "options": { - "parameters": { - "lith_id": "integer, one or more comma-separated lithology ids: matches strictly to lith field in map data", - "lith_type": "string, one or more comma-separated lith_types: matches strictly to lith field in map data", - "lith_class": "string, one or more comma-separated lith_classes: matches strictly to lith field in map data", - "all_lith_id": "integer, one or more comma-separated lithology ids: matches any lith in any legend field", - "all_lith_type": "string, one or more comma-separated lith_types: matches any lith_type in any legend field", - "all_lith_class": "string, one or more comma-separated lith_classes: matches any lith_type in any legend field", - "strat_name_id": "integer, one or more comma-separated strat_name_ids", - "concept_id": "integer, one or more comma-separated strat_name concept_ids ids" + "/mobile/map_filter": { + description: "Filter burwell polygons", + parent: "mobile", + visible: false, + options: { + parameters: { + lith_id: + "integer, one or more comma-separated lithology ids: matches strictly to lith field in map data", + lith_type: + "string, one or more comma-separated lith_types: matches strictly to lith field in map data", + lith_class: + "string, one or more comma-separated lith_classes: matches strictly to lith field in map data", + all_lith_id: + "integer, one or more comma-separated lithology ids: matches any lith in any legend field", + all_lith_type: + "string, one or more comma-separated lith_types: matches any lith_type in any legend field", + all_lith_class: + "string, one or more comma-separated lith_classes: matches any lith_type in any legend field", + strat_name_id: "integer, one or more comma-separated strat_name_ids", + concept_id: + "integer, one or more comma-separated strat_name concept_ids ids", + }, + output_formats: ["json"], + examples: [], + fields: [], }, - "output_formats": [ - "json" - ], - "examples": [ - - ], - "fields": [ - - ] - } - }, + }, - "/editing": { - "description": "Routes for updating Macrostrat data", - "visible": false - }, - "/editing/map": { - "description": "WILL BE DEPRECATED. Fetch polygons for mapping", - "parent": "editing", - "visible": false - }, - "/editing/map/update": { - "description": "Update column polygon geometry", - "parent": "editing", - "visible": false - }, - "/editing/section": { - "description": "Update sections", - "parent": "editing", - "visible": false - }, - "/editing/units/update": { - "description": "Update units", - "parent": "editing", - "visible": false - }, - "define": { - "id": "integer, unique identifier", - "col_group": "text, name of group the column belongs to, generally corresponds to geologic provinces", - "col_group_id": "integer, the ID of the group to which the column belongs", - "col_id": "integer, unique identifier for column", - "col_name": "text, name of column", - "columns": "integer, number of columns", - "unit_id": "integer, unique identifier for unit", - "section_id": "integer, unique identifier for section (package)", - "sections": "int[], section_ids that belong to group", - "pbdb_collections": "integer, count of PBDB collections in units/column", - "pbdb_occurrences": "integer, count of PBDB occurrences in units/column", - "pbdb_occs": "integer, count of PBDB occurrences in units in column", - "project_id": "unique identifier for project, corresponds to general geographic region", - "strat_name": "text, informal unit name", - "strat_name_long": "text, the full formal name for a given strat_name", - "strat_name_id": "integer, unique identifier for known stratigraphic name(s) (see /defs/strat_names)", - "concept_id": "intger, unique identifier for the stratigraphic name concept, which groups variant strat_names for same entity", - "strat_name_concept_id": "intger, unique identifier for the stratigraphic name concept, which groups variant strat_names for same entity", - "name": "text, the name of the entity", - "Mbr": "text, lithostratigraphic member", - "Fm": "text, lithostratigraphic formation", - "SubGp": "text, lithostratigraphic subgroup", - "Gp": "text, lithostratigraphic group", - "SGp": "text, lithostratigraphic supergroup", - "era": "string, containing international chronostratigraphic period", - "period": "string, containing international chronostratigraphic period", - "max_thick": "number, maximum unit thickness in meters", - "min_thick": "number, minimum unit thickess in meters (NB: some zero values may be equivalent in meaning to NULL)", - "color": "text, recommended coloring for units based on dominant lithology", - "u_color": "text, original color for unit", - "mineral_color": "text, color description of mineral", - "lustre": "text, description of mineral lustre", - "crystal_form": "text, crystal form of mineral", - "hardness_min": "decimal, minimum value for Moh's hardness scale", - "hardness_max": "decimal, maximum value for Moh's hardness scale", - "text_color": "text, recommended coloring for text based on color", - "FO_interval": "text, chronostratigraphic interval containing initiation/earliest(oldest) age", - "FO_age": "number, age of FO_interval base in Myr before present", - "b_interval": "integer, chronostratigraphic interval containing continuous time age model oldest boundary", - "b_age": "number, continuous time age model estimated for initiation, in Myr before present", - "b_prop": "decimal, position of continuous time age model bottom boundary, proportional to reference time interval (b_interval)", - "early_age": "number, oldest age, Myr before present", - "LO_interval": "text, chronostratigraphic interval containing truncation/latest(youngest) age", - "LO_age": "number, age of FO_interval top in Myr before present", - "t_age": "number, continuous time age model estimated for truncation, in Myr before present", - "t_interval": "integer, chronostratigraphic interval containing continuous time age model youngest boundary", - "t_prop": "decimal, position of continuous time age model top boundary, proportional to reference time interval (t_interval)", - "late_age": "number, youngest age, Myr before present", - "position_bottom": "number, estimated position of unit relative to other units in section", - "lith": "text, specific lithology, see /defs/lithologies", - "lith_type": "text, general lithology type, see /defs/lithologies", - "lith_class": "text, general lithology class, see /defs/lithologies", - "measurement": "text, specific measurement", - "measurement_id": "integer, unique identifier for measurement", - "sample_geo_unit": "text, description of unit supplying measurement", - "measurement_type": "text, general measurement type", - "measurement_class": "text, general measurement class", - "measure_units": "text, units used in generating the measurement", - "method": "text, method used to generate result", - "measure_value": "number, reported value for measurement", - "measure_error": "number, reported error associated with measure_value", - "measure_n": "number, measurements used to compute measure_value, if greater than 1, typically also used in measure_error", - "measure_position": "number, position of measurement in column, optionally section or unit; requires context of latter", - "error_units": "text, units used in reported measure_error", - "measure_type": "text, descriptor applying to nature of measure_value (e.g., point measurement, mean value for multiple point measurements)", - "measure_phase": "text, material analyzed for measure_value (e.g., 'zircon' or 'whole rock')", - "n": "integer, number of observations/measurements", - "measuremeta_id": "integer, unique identifier for measuremeta (sample metadata)", - "samp_lith": "text, lithological description of sample that produced measure_value", - "samp_lith_id": "integer, unique identifier for lithology (see /defs/lithologies) in sample that produced measure_value", - "samp_desc": "text, verbal description of sample used to generate", - "samp_geo_unit": "text, geological unit yielding sample_measurement", - "match_basis": "text, terse descriptor of what served to match measuremeta record to given macrostrat unit, if any", - "samp_age": "text, geological time interval assigned to measurement", - "unit_rel_pos": "number, position of measurement within a unit, usually proportional where 1=top, 0=bottom", - "lith_max_thick": "number, thickness of specified lithology, based on proportion of unit(s)", - "lith_min_thick": "number, thickness of specified lithology, based on proportion of unit(s)", - "environ": "text, specific environment, see /defs/environments", - "environ_type": "general environment type, /defs/environments", - "environ_class": "text, general lithology class, /defs/environments", - "outcrop": "text, describes where unit is exposed or not, values are 'outcrop', 'subsurface', or 'both'", - "pbdb": "number of matching Paleobiology Database fossil collections", - "units": "integer, unit_id matched to object", - "notes": "text, notes releavnt to containing element", - "project": "text, name of project", - "status": "text, indicates current status of column, values are 'active', 'in process', 'obsolete'", - "geom": "geometry", - "area": "area in square kilometers", - "plateid": "integer, unique GPlates ID", - "with_unit": "unit in contact with unit_id", - "contact": "relative position of units, read for unit_id, 'contact' = with_unit", - "unit_abbre": "text, unit abbreviation", - "rocktype": "text, unit rock type", - "min_age": "text, the minimum age of the unit, using the International time scale", - "max_age": "text, the maximum age of the unit, using the International time scale", - "timescale": "text, name of timescale", - "timescale_id": "integer, unique identifier for timescale used in project", - "top": "text, named time interval that contains the top of the section", - "top_age": "number, minimum age of the section in millions of years", - "bottom": "text, named time interval that contains the bottom of the section", - "bottom_age": "number, maximum age of the section in millions of years", - "abbrev": "standard abbreviation for interval name", - "clat": "number, present day latitude of of the centroid of the column to which the unit belongs", - "clng": "number, present day longitude of of the centroid of the column to which the unit belongs", - "t_plat": "number, same as clat, but rotated to the t_age. Top age paleo latitude.", - "t_plng": "number, same as clng, but rotated to the t_age. Top age paleo longitude.", - "b_plat": "number, same as clat, but rotated to the b_age. Bottom age paleo latitude.", - "b_plng": "number, same as clng, but rotated to the b_age. Bottom age paleo latitude.", - "econ_id": "integer, unique econ identifier, see defs/econs", - "econ": "text, name of econonomic use, see defs/econs", - "econ_type": "string, type of econonomic use, see defs/econs", - "econ_class": "text, class of econonomic use, see defs/econs", - "ref_id": "integer, unique reference identifer", - "ref": "text, name of reference", - "cltn_id": "integer, Paleobiology Database collection ID", - "cltn_name": "text, Paleobiology Database collection name", - "col_area": "float, area in square kilometers of the Macrostrat column", - "t_int_id": "integer, the ID of the chronostratigraphic interval containing the top boundary of the unit", - "t_int_name": "text, the name of the chronostratigraphic interval containing the top boundary of the unit", - "t_int_age": "float, the top age of the chronostratigraphic interval containing the top boundary of the unit", - "units_above": "array of integers, the unit_ids of the units contacting the top of the unit", - "b_int_id": "integer, the ID of the chronostratigraphic interval containing the bottom boundary of the unit", - "b_int_name": "text, the name of the chronostratigraphic interval containing the bottom boundary of the unit", - "b_int_age": "float, the bottom age of the chronostratigraphic interval containing the bottom boundary of the unit", - "units_below": "array of integers, the unit_ids of the units contacting the bottom of the unit", - "environ_id": "integer, the ID of the environment", - "rank": "text, the stratigraphic rank of the unit", - "lith_color": "text, the hex color associated with the lithology", - "unit_com": "text, comments about the unit", - "unitdesc": "text, description of the unit", - "unit_name": "text, the name of the unit", - "lithology": "array of strings, lithologies associated with the unit", - "strat_names": "array of integer, strat_name_ids matched to the polygon or unit_link", - "strat_unit": "text, the stratigraphic unit of the polygon", - "gid": "integer, unique polygon ID of a map unit", - "containing_interval": "text, the interval that includes the top and bottom ages of a unit", - "unit_link": "text, the ID assigned to a given group of polygons that share common attributes", - "macro_units": "array of integers, the unit_ids of Macrostrat units matched to the polygon or unit_link", - "interval_color": "text, the hex color associated with the age of the unit", - "lith_id": "integer, unique ID of the lithology", - "measure_id": "integer, unique ID of the measurement", - "group_col_id": "float, the original column ID assigned to the column (used in the original source)", - "bed": "string, the strat_name of the bed", - "bed_id": "integer, the strat_name_id of the bed", - "mbr": "string, the strat_name of the member", - "mbr_id": "integer, the strat_name_id of the member", - "fm": "string, the strat_name of the formation", - "fm_id": "integer, the strat_name_id of the formation", - "gp": "string, the strat_name of the group", - "gp_id": "integer, the strat_name_id of the group", - "sgp": "string, the strat_name of the supergroup", - "sgp_id": "integer, the strat_name_id of the supergroup", - "lith_att_id": "integer, the unique ID of the lithology attribute", - "lith_att": "string, the name of the lithology attribute", - "att_type": "string, the lith_type of the lithology attribute", - "pub_year": "integer, the year of publication", - "author": "text, the author of the publication", - "doi": "the digital object identifier of the publication", - "url": "text, URL where additional information, the source or contributing publication can be found", - "col_poly": "object, the GeoJSON representation of the column", - "int_id": "integer, the unique interval ID", - "int_type": "text, the temporal rank of the interval", - "packages": "integer, total packages", - "t_sections": "integer, total sections", - "t_units": "integer, total units", - "t_cols": "integer, total columns", - "measure": "array, summary of types of measurements available", - "max_min_thick": "integer, the maximum possible minimum thickness in meters", - "min_min_thick": "integer, the minimum possible minimum thickness in meters", - "source_id": "integer, unique Burwell source", - "ref_title": "text, title of reference", - "authors": "text, authors of source", - "ref_year": "text, year of reference publication", - "ref_source": "text, source of reference", - "isbn_doi": "text, the reference ISBN or DOI", - "scale": "text, the Burwell scale the source belongs to", - "mineral_id": "integer, unqiue identifier for mineral", - "mineral": "string, name of mineral", - "mineral_type": "string, name of mineral group", - "formula": "string, chemical formula of mineral", - "formula_tags": "chemical formula of mineral with sub/superscript tags", - "group": "string, defition group, less inclusive than type", - "type": "string, definition type, less inclusive than class", - "class": "string, definition class, more inclusive than type", - "lat": "decimal, latitude in WGS84", - "lng": "decimal, longigtude in WGS84", - "structure_id": "integer, unique structure ID", - "prop": "decimal, proportion", - "genus_no": "integer, corresponds to the genus_no in Paleobiology Database", - "taxon_no": "integer, corresponds to the taxn_no in Paleobiology Database", - "point_id": "integer, unique ID of the point", - "strike": "integer, point strike", - "dip": "integer, point dip", - "dip_dir": "integer, point dip direction", - "point_type": "text, type of point", - "certainty": "text, point location certainty", - "grain_id": "Unique grain ID", - "grain_symbol": "The grain symbol for display purposes", - "grain_name": "The name of the grain", - "grain_group": "The family of grains the grain belongs to", - "soil_group": "The family of soils the grain belongs to", - "classification": "The classification scheme the given grain belongs to", - "min_size": "The minimum grainsize in millimeters", - "max_size": "The maximum grainsize in millimeters", - "descrip": "text, description of entity in plain text", - "t_pos": "The position of unit top in ordering of units in section, optionally in units of m for some columns (e.g., eODP project)", - "b_pos": "The position of unit bottom in ordering of units in section, optionally in units of m for some columns (e.g., eODP project)", - "n_intervals": "integer, number of intervals in timescale.", - "interval_name": "string, a valid interval name as defined in /defs/intervals", - "age_bottom": "decimal, age of bottom of entity (interval_name or unit) in Ma", - "age_top": "decimal, age of top of entity (interval_name or unit) in Ma", - "best_age_bottom": "decimal, age of bottom of entity (map unit) in Ma; estimate is 'best' because it incorporates multiple age model sources", - "best_age_top": "decimal, age of top of entity (map unit) in Ma; estimate is 'best' because it incorporates multiple age model sources", - "map_unit_name": "name of map unit in original source, or modified original source", - "legend_id": "integer, macrostrat internal identifier for map unit; one or more map_id values are assigned to a legend_id", - "tiny_area": "number, area in km^2 of map polygons in tiny-scale topology", - "small_area": "number, area in km^2 of map polygons in small-scale topology", - "medium_area": "number, area in km^2 of map polygons in medium-scale topology", - "large_area": "number, area in km^2 of map polygons in large-scale topology", - "age": "string, chronostratigraphic bin assigned to object", - "comments": "string, notes assigned to object" - } -}; + "/editing": { + description: "Routes for updating Macrostrat data", + visible: false, + }, + "/editing/map": { + description: "WILL BE DEPRECATED. Fetch polygons for mapping", + parent: "editing", + visible: false, + }, + "/editing/map/update": { + description: "Update column polygon geometry", + parent: "editing", + visible: false, + }, + "/editing/section": { + description: "Update sections", + parent: "editing", + visible: false, + }, + "/editing/units/update": { + description: "Update units", + parent: "editing", + visible: false, + }, + define: { + id: "integer, unique identifier", + col_group: + "text, name of group the column belongs to, generally corresponds to geologic provinces", + col_group_id: "integer, the ID of the group to which the column belongs", + col_id: "integer, unique identifier for column", + col_name: "text, name of column", + columns: "integer, number of columns", + unit_id: "integer, unique identifier for unit", + section_id: "integer, unique identifier for section (package)", + sections: "int[], section_ids that belong to group", + pbdb_collections: "integer, count of PBDB collections in units/column", + pbdb_occurrences: "integer, count of PBDB occurrences in units/column", + pbdb_occs: "integer, count of PBDB occurrences in units in column", + project_id: + "unique identifier for project, corresponds to general geographic region", + strat_name: "text, informal unit name", + strat_name_long: "text, the full formal name for a given strat_name", + strat_name_id: + "integer, unique identifier for known stratigraphic name(s) (see /defs/strat_names)", + concept_id: + "intger, unique identifier for the stratigraphic name concept, which groups variant strat_names for same entity", + strat_name_concept_id: + "intger, unique identifier for the stratigraphic name concept, which groups variant strat_names for same entity", + name: "text, the name of the entity", + Mbr: "text, lithostratigraphic member", + Fm: "text, lithostratigraphic formation", + SubGp: "text, lithostratigraphic subgroup", + Gp: "text, lithostratigraphic group", + SGp: "text, lithostratigraphic supergroup", + era: "string, containing international chronostratigraphic period", + period: "string, containing international chronostratigraphic period", + max_thick: "number, maximum unit thickness in meters", + min_thick: + "number, minimum unit thickess in meters (NB: some zero values may be equivalent in meaning to NULL)", + color: "text, recommended coloring for units based on dominant lithology", + u_color: "text, original color for unit", + mineral_color: "text, color description of mineral", + lustre: "text, description of mineral lustre", + crystal_form: "text, crystal form of mineral", + hardness_min: "decimal, minimum value for Moh's hardness scale", + hardness_max: "decimal, maximum value for Moh's hardness scale", + text_color: "text, recommended coloring for text based on color", + FO_interval: + "text, chronostratigraphic interval containing initiation/earliest(oldest) age", + FO_age: "number, age of FO_interval base in Myr before present", + b_interval: + "integer, chronostratigraphic interval containing continuous time age model oldest boundary", + b_age: + "number, continuous time age model estimated for initiation, in Myr before present", + b_prop: + "decimal, position of continuous time age model bottom boundary, proportional to reference time interval (b_interval)", + early_age: "number, oldest age, Myr before present", + LO_interval: + "text, chronostratigraphic interval containing truncation/latest(youngest) age", + LO_age: "number, age of FO_interval top in Myr before present", + t_age: + "number, continuous time age model estimated for truncation, in Myr before present", + t_interval: + "integer, chronostratigraphic interval containing continuous time age model youngest boundary", + t_prop: + "decimal, position of continuous time age model top boundary, proportional to reference time interval (t_interval)", + late_age: "number, youngest age, Myr before present", + position_bottom: + "number, estimated position of unit relative to other units in section", + lith: "text, specific lithology, see /defs/lithologies", + lith_type: "text, general lithology type, see /defs/lithologies", + lith_class: "text, general lithology class, see /defs/lithologies", + measurement: "text, specific measurement", + measurement_id: "integer, unique identifier for measurement", + sample_geo_unit: "text, description of unit supplying measurement", + measurement_type: "text, general measurement type", + measurement_class: "text, general measurement class", + measure_units: "text, units used in generating the measurement", + method: "text, method used to generate result", + measure_value: "number, reported value for measurement", + measure_error: "number, reported error associated with measure_value", + measure_n: + "number, measurements used to compute measure_value, if greater than 1, typically also used in measure_error", + measure_position: + "number, position of measurement in column, optionally section or unit; requires context of latter", + error_units: "text, units used in reported measure_error", + measure_type: + "text, descriptor applying to nature of measure_value (e.g., point measurement, mean value for multiple point measurements)", + measure_phase: + "text, material analyzed for measure_value (e.g., 'zircon' or 'whole rock')", + n: "integer, number of observations/measurements", + measuremeta_id: + "integer, unique identifier for measuremeta (sample metadata)", + samp_lith: + "text, lithological description of sample that produced measure_value", + samp_lith_id: + "integer, unique identifier for lithology (see /defs/lithologies) in sample that produced measure_value", + samp_desc: "text, verbal description of sample used to generate", + samp_geo_unit: "text, geological unit yielding sample_measurement", + match_basis: + "text, terse descriptor of what served to match measuremeta record to given macrostrat unit, if any", + samp_age: "text, geological time interval assigned to measurement", + unit_rel_pos: + "number, position of measurement within a unit, usually proportional where 1=top, 0=bottom", + lith_max_thick: + "number, thickness of specified lithology, based on proportion of unit(s)", + lith_min_thick: + "number, thickness of specified lithology, based on proportion of unit(s)", + environ: "text, specific environment, see /defs/environments", + environ_type: "general environment type, /defs/environments", + environ_class: "text, general lithology class, /defs/environments", + outcrop: + "text, describes where unit is exposed or not, values are 'outcrop', 'subsurface', or 'both'", + pbdb: "number of matching Paleobiology Database fossil collections", + units: "integer, unit_id matched to object", + notes: "text, notes releavnt to containing element", + project: "text, name of project", + status: + "text, indicates current status of column, values are 'active', 'in process', 'obsolete'", + geom: "geometry", + area: "area in square kilometers", + plateid: "integer, unique GPlates ID", + with_unit: "unit in contact with unit_id", + contact: + "relative position of units, read for unit_id, 'contact' = with_unit", + unit_abbre: "text, unit abbreviation", + rocktype: "text, unit rock type", + min_age: + "text, the minimum age of the unit, using the International time scale", + max_age: + "text, the maximum age of the unit, using the International time scale", + timescale: "text, name of timescale", + timescale_id: "integer, unique identifier for timescale used in project", + top: "text, named time interval that contains the top of the section", + top_age: "number, minimum age of the section in millions of years", + bottom: + "text, named time interval that contains the bottom of the section", + bottom_age: "number, maximum age of the section in millions of years", + abbrev: "standard abbreviation for interval name", + clat: "number, present day latitude of of the centroid of the column to which the unit belongs", + clng: "number, present day longitude of of the centroid of the column to which the unit belongs", + t_plat: + "number, same as clat, but rotated to the t_age. Top age paleo latitude.", + t_plng: + "number, same as clng, but rotated to the t_age. Top age paleo longitude.", + b_plat: + "number, same as clat, but rotated to the b_age. Bottom age paleo latitude.", + b_plng: + "number, same as clng, but rotated to the b_age. Bottom age paleo latitude.", + econ_id: "integer, unique econ identifier, see defs/econs", + econ: "text, name of econonomic use, see defs/econs", + econ_type: "string, type of econonomic use, see defs/econs", + econ_class: "text, class of econonomic use, see defs/econs", + ref_id: "integer, unique reference identifer", + ref: "text, name of reference", + cltn_id: "integer, Paleobiology Database collection ID", + cltn_name: "text, Paleobiology Database collection name", + col_area: "float, area in square kilometers of the Macrostrat column", + t_int_id: + "integer, the ID of the chronostratigraphic interval containing the top boundary of the unit", + t_int_name: + "text, the name of the chronostratigraphic interval containing the top boundary of the unit", + t_int_age: + "float, the top age of the chronostratigraphic interval containing the top boundary of the unit", + units_above: + "array of integers, the unit_ids of the units contacting the top of the unit", + b_int_id: + "integer, the ID of the chronostratigraphic interval containing the bottom boundary of the unit", + b_int_name: + "text, the name of the chronostratigraphic interval containing the bottom boundary of the unit", + b_int_age: + "float, the bottom age of the chronostratigraphic interval containing the bottom boundary of the unit", + units_below: + "array of integers, the unit_ids of the units contacting the bottom of the unit", + environ_id: "integer, the ID of the environment", + rank: "text, the stratigraphic rank of the unit", + lith_color: "text, the hex color associated with the lithology", + unit_com: "text, comments about the unit", + unitdesc: "text, description of the unit", + unit_name: "text, the name of the unit", + lithology: "array of strings, lithologies associated with the unit", + strat_names: + "array of integer, strat_name_ids matched to the polygon or unit_link", + strat_unit: "text, the stratigraphic unit of the polygon", + gid: "integer, unique polygon ID of a map unit", + containing_interval: + "text, the interval that includes the top and bottom ages of a unit", + unit_link: + "text, the ID assigned to a given group of polygons that share common attributes", + macro_units: + "array of integers, the unit_ids of Macrostrat units matched to the polygon or unit_link", + interval_color: "text, the hex color associated with the age of the unit", + lith_id: "integer, unique ID of the lithology", + measure_id: "integer, unique ID of the measurement", + group_col_id: + "float, the original column ID assigned to the column (used in the original source)", + bed: "string, the strat_name of the bed", + bed_id: "integer, the strat_name_id of the bed", + mbr: "string, the strat_name of the member", + mbr_id: "integer, the strat_name_id of the member", + fm: "string, the strat_name of the formation", + fm_id: "integer, the strat_name_id of the formation", + gp: "string, the strat_name of the group", + gp_id: "integer, the strat_name_id of the group", + sgp: "string, the strat_name of the supergroup", + sgp_id: "integer, the strat_name_id of the supergroup", + lith_att_id: "integer, the unique ID of the lithology attribute", + lith_att: "string, the name of the lithology attribute", + att_type: "string, the lith_type of the lithology attribute", + pub_year: "integer, the year of publication", + author: "text, the author of the publication", + doi: "the digital object identifier of the publication", + url: "text, URL where additional information, the source or contributing publication can be found", + col_poly: "object, the GeoJSON representation of the column", + int_id: "integer, the unique interval ID", + int_type: "text, the temporal rank of the interval", + packages: "integer, total packages", + t_sections: "integer, total sections", + t_units: "integer, total units", + t_cols: "integer, total columns", + measure: "array, summary of types of measurements available", + max_min_thick: + "integer, the maximum possible minimum thickness in meters", + min_min_thick: + "integer, the minimum possible minimum thickness in meters", + source_id: "integer, unique Burwell source", + ref_title: "text, title of reference", + authors: "text, authors of source", + ref_year: "text, year of reference publication", + ref_source: "text, source of reference", + isbn_doi: "text, the reference ISBN or DOI", + scale: "text, the Burwell scale the source belongs to", + mineral_id: "integer, unqiue identifier for mineral", + mineral: "string, name of mineral", + mineral_type: "string, name of mineral group", + formula: "string, chemical formula of mineral", + formula_tags: "chemical formula of mineral with sub/superscript tags", + group: "string, defition group, less inclusive than type", + type: "string, definition type, less inclusive than class", + class: "string, definition class, more inclusive than type", + lat: "decimal, latitude in WGS84", + lng: "decimal, longigtude in WGS84", + structure_id: "integer, unique structure ID", + prop: "decimal, proportion", + genus_no: "integer, corresponds to the genus_no in Paleobiology Database", + taxon_no: "integer, corresponds to the taxn_no in Paleobiology Database", + point_id: "integer, unique ID of the point", + strike: "integer, point strike", + dip: "integer, point dip", + dip_dir: "integer, point dip direction", + point_type: "text, type of point", + certainty: "text, point location certainty", + grain_id: "Unique grain ID", + grain_symbol: "The grain symbol for display purposes", + grain_name: "The name of the grain", + grain_group: "The family of grains the grain belongs to", + soil_group: "The family of soils the grain belongs to", + classification: "The classification scheme the given grain belongs to", + min_size: "The minimum grainsize in millimeters", + max_size: "The maximum grainsize in millimeters", + descrip: "text, description of entity in plain text", + t_pos: + "The position of unit top in ordering of units in section, optionally in units of m for some columns (e.g., eODP project)", + b_pos: + "The position of unit bottom in ordering of units in section, optionally in units of m for some columns (e.g., eODP project)", + n_intervals: "integer, number of intervals in timescale.", + interval_name: + "string, a valid interval name as defined in /defs/intervals", + age_bottom: + "decimal, age of bottom of entity (interval_name or unit) in Ma", + age_top: "decimal, age of top of entity (interval_name or unit) in Ma", + best_age_bottom: + "decimal, age of bottom of entity (map unit) in Ma; estimate is 'best' because it incorporates multiple age model sources", + best_age_top: + "decimal, age of top of entity (map unit) in Ma; estimate is 'best' because it incorporates multiple age model sources", + map_unit_name: + "name of map unit in original source, or modified original source", + legend_id: + "integer, macrostrat internal identifier for map unit; one or more map_id values are assigned to a legend_id", + tiny_area: "number, area in km^2 of map polygons in tiny-scale topology", + small_area: + "number, area in km^2 of map polygons in small-scale topology", + medium_area: + "number, area in km^2 of map polygons in medium-scale topology", + large_area: + "number, area in km^2 of map polygons in large-scale topology", + age: "string, chronostratigraphic bin assigned to object", + comments: "string, notes assigned to object", + }, + }; module.exports = defs; -}()); +})(); diff --git a/v2/editing/editing.ts b/v2/editing/editing.ts index 7cbfcdd1..56a60208 100644 --- a/v2/editing/editing.ts +++ b/v2/editing/editing.ts @@ -1,19 +1,19 @@ var api = require("../api"), - defs = require("../defs"); + defs = require("../defs"); -module.exports = function(req, res, next) { - var available = {} +module.exports = function (req, res, next) { + var available = {}; for (var key in defs) { if (defs[key].parent && defs[key].parent === "editing") { - available[key] = defs[key].description + available[key] = defs[key].description; } } - + res.json({ - "success": { - "v": api.version, - "description": defs["/editing"].description, - "routes": available - } + success: { + v: api.version, + description: defs["/editing"].description, + routes: available, + }, }); -} +}; diff --git a/v2/editing/map.ts b/v2/editing/map.ts index a4d065de..661e6909 100644 --- a/v2/editing/map.ts +++ b/v2/editing/map.ts @@ -1,38 +1,47 @@ var api = require("../api"), - dbgeo = require("dbgeo"), - larkin = require("../larkin"); + dbgeo = require("dbgeo"), + larkin = require("../larkin"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (req.query.id) { // return just that polygons and the ones that touch it - larkin.queryPg("macrostrat_editing", "SELECT b.col_id, ST_AsGeoJSON(b.geom) AS geometry FROM col_areas AS a JOIN col_areas AS b ON ST_Intersects(st_snaptogrid(a.geom,0.001), st_snaptogrid(b.geom,0.001)) WHERE a.col_id = $1 OR b.col_id = $1 GROUP BY b.col_id, b.geom ORDER BY b.col_id ASC;", [req.query.id], function(error, result) { - dbgeo.parse({ - "data":result.rows, - "outputFormat": "geojson", - "callback": function(error, result) { - if (error) { - larkin.error(req, res, next, error); - } else { - larkin.sendData(result, res, null, next); - } - } - }); - }); + larkin.queryPg( + "macrostrat_editing", + "SELECT b.col_id, ST_AsGeoJSON(b.geom) AS geometry FROM col_areas AS a JOIN col_areas AS b ON ST_Intersects(st_snaptogrid(a.geom,0.001), st_snaptogrid(b.geom,0.001)) WHERE a.col_id = $1 OR b.col_id = $1 GROUP BY b.col_id, b.geom ORDER BY b.col_id ASC;", + [req.query.id], + function (error, result) { + dbgeo.parse({ + data: result.rows, + outputFormat: "geojson", + callback: function (error, result) { + if (error) { + larkin.error(req, res, next, error); + } else { + larkin.sendData(result, res, null, next); + } + }, + }); + }, + ); } else { // return all polygons - larkin.queryPg("macrostrat_editing", "SELECT col_id, ST_AsGeoJSON(geom) as geometry FROM col_areas", [], function(error, result) { - dbgeo.parse({ - "data":result.rows, - "outputFormat": "geojson", - "callback": function(error, result) { - if (error) { - larkin.error(req, res, next, error); - } else { - larkin.sendData(result, res, null, next); - } - } - }); - }); + larkin.queryPg( + "macrostrat_editing", + "SELECT col_id, ST_AsGeoJSON(geom) as geometry FROM col_areas", + [], + function (error, result) { + dbgeo.parse({ + data: result.rows, + outputFormat: "geojson", + callback: function (error, result) { + if (error) { + larkin.error(req, res, next, error); + } else { + larkin.sendData(result, res, null, next); + } + }, + }); + }, + ); } -} - \ No newline at end of file +}; diff --git a/v2/editing/map_update.ts b/v2/editing/map_update.ts index f2472f26..fd4e09d6 100644 --- a/v2/editing/map_update.ts +++ b/v2/editing/map_update.ts @@ -1,35 +1,55 @@ var api = require("../api"), - async = require("async"), - wellknown = require("wellknown"), - larkin = require("../larkin"); + async = require("async"), + wellknown = require("wellknown"), + larkin = require("../larkin"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (req.body.layer) { req.body.layer = JSON.parse(req.body.layer); - async.each(req.body.layer.features, function(feature, callback) { - larkin.queryPg("macrostrat_editing", "SELECT ST_isValid(ST_GeomFromText( '" + wellknown.stringify(feature.geometry) + "')) AS isvalid", [], function(error, result) { - if (result.rows[0].isvalid) { - callback(); + async.each( + req.body.layer.features, + function (feature, callback) { + larkin.queryPg( + "macrostrat_editing", + "SELECT ST_isValid(ST_GeomFromText( '" + + wellknown.stringify(feature.geometry) + + "')) AS isvalid", + [], + function (error, result) { + if (result.rows[0].isvalid) { + callback(); + } else { + callback("invalid"); + } + }, + ); + }, + function (error) { + if (error) { + larkin.sendData([{ update: "failed" }], res, null, next); } else { - callback("invalid"); + async.each( + req.body.layer.features, + function (feature, callback) { + larkin.queryPg( + "macrostrat_editing", + "UPDATE col_areas SET geom = ST_GeomFromText('" + + wellknown.stringify(feature.geometry) + + "') WHERE col_id = $1", + [feature.properties.col_id], + function (error, result) { + callback(); + }, + ); + }, + function (error) { + larkin.sendData([{ update: "success" }], res, null, next); + }, + ); } - }); - - }, function(error) { - if (error) { - larkin.sendData([{"update": "failed"}], res, null, next); - } else { - async.each(req.body.layer.features, function(feature, callback) { - larkin.queryPg("macrostrat_editing", "UPDATE col_areas SET geom = ST_GeomFromText('" + wellknown.stringify(feature.geometry) + "') WHERE col_id = $1", [feature.properties.col_id], function(error, result) { - callback(); - }); - }, function(error) { - larkin.sendData([{"update": "success"}], res, null, next); - }); - } - }); - + }, + ); } else { larkin.error(req, res, next, "A layer is required"); } -} +}; diff --git a/v2/editing/section.ts b/v2/editing/section.ts index 2b574922..f9742522 100644 --- a/v2/editing/section.ts +++ b/v2/editing/section.ts @@ -1,15 +1,19 @@ var larkin = require("../larkin"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (!req.query.section_id) { res.json("Need a section_id"); } else { - larkin.query("SELECT ub.id, u1.strat_name AS below, u2.strat_name AS above, ub.t1_prop, i.interval_name, i.age_bottom - ((i.age_bottom - i.age_top)*ub.t1_prop) as peg, i.age_bottom, i.age_top, i.interval_color FROM unit_boundaries ub LEFT JOIN units u1 ON u1.id = ub.unit_id LEFT JOIN units u2 ON u2.id = ub.unit_id_2 JOIN intervals i ON i.id = ub.t1 LEFT JOIN units u ON u.id = ub.unit_id WHERE ub.section_id = ?", [req.query.section_id], function(error, result) { - if (error) { - larkin.error(req, res, next, "Something went wrong"); - } else { - larkin.sendData(result, res, null, next); - } - }); + larkin.query( + "SELECT ub.id, u1.strat_name AS below, u2.strat_name AS above, ub.t1_prop, i.interval_name, i.age_bottom - ((i.age_bottom - i.age_top)*ub.t1_prop) as peg, i.age_bottom, i.age_top, i.interval_color FROM unit_boundaries ub LEFT JOIN units u1 ON u1.id = ub.unit_id LEFT JOIN units u2 ON u2.id = ub.unit_id_2 JOIN intervals i ON i.id = ub.t1 LEFT JOIN units u ON u.id = ub.unit_id WHERE ub.section_id = ?", + [req.query.section_id], + function (error, result) { + if (error) { + larkin.error(req, res, next, "Something went wrong"); + } else { + larkin.sendData(result, res, null, next); + } + }, + ); } -} +}; diff --git a/v2/editing/units_update.ts b/v2/editing/units_update.ts index 6ddfb783..855608bd 100644 --- a/v2/editing/units_update.ts +++ b/v2/editing/units_update.ts @@ -1,27 +1,35 @@ var async = require("async"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (req.body.passcode && req.body.passcode === "phylum" && req.body.units) { // do work, son - async.each(req.body.units, function(each, callback) { - larkin.query("UPDATE units SET position_bottom = ? WHERE id = ?", [each.position_bottom, each.unit], function(error, result) { + async.each( + req.body.units, + function (each, callback) { + larkin.query( + "UPDATE units SET position_bottom = ? WHERE id = ?", + [each.position_bottom, each.unit], + function (error, result) { + if (error) { + callback(error); + } else { + callback(null); + } + }, + ); + }, + function (error) { if (error) { - callback(error); + larkin.error(req, res, next, "Something went wrong"); } else { - callback(null); + res.json("worked!"); } - }); - }, function(error) { - if (error) { - larkin.error(req, res, next, "Something went wrong"); - } else { - res.json("worked!"); - } - }); + }, + ); } else { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } } -} +}; diff --git a/v2/elevation.ts b/v2/elevation.ts index 98a1bcac..5516c7aa 100644 --- a/v2/elevation.ts +++ b/v2/elevation.ts @@ -1,17 +1,19 @@ -'use strict' -const api = require('./api') -const larkin = require('./larkin') +"use strict"; +const api = require("./api"); +const larkin = require("./larkin"); module.exports = (req, res, next, cb) => { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - if ((req.query.lat && req.query.lng) || 'sample' in req.query) { - let lat = req.query.lat || 43.07 - let lng = larkin.normalizeLng(req.query.lng) || -89.4 - let point = `POINT(${lng} ${lat})` + if ((req.query.lat && req.query.lng) || "sample" in req.query) { + let lat = req.query.lat || 43.07; + let lng = larkin.normalizeLng(req.query.lng) || -89.4; + let point = `POINT(${lng} ${lat})`; - larkin.queryPg('elevation', ` + larkin.queryPg( + "elevation", + ` WITH first AS ( SELECT ST_Value(rast, 1, ST_GeomFromText($1, 4326)) AS elevation, 1 as priority FROM sources.srtm1 @@ -26,32 +28,61 @@ module.exports = (req, res, next, cb) => { WHERE elevation IS NOT NULL ORDER BY priority ASC LIMIT 1 - `, [ point ], (error, result) => { - if (error) { - if (cb) return cb(error) - return larkin.error(req, res, next, 'Error fetching elevation data') - } - if (cb) return cb(null, result.rows) - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : 'json', - compact: true - }, { - data: result.rows - }) - }) + `, + [point], + (error, result) => { + if (error) { + if (cb) return cb(error); + return larkin.error(req, res, next, "Error fetching elevation data"); + } + if (cb) return cb(null, result.rows); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + compact: true, + }, + { + data: result.rows, + }, + ); + }, + ); + } else if ( + req.query.start_lng && + req.query.start_lat && + req.query.end_lng && + req.query.end_lat + ) { + req.query.start_lng = larkin.normalizeLng(req.query.start_lng); + req.query.end_lng = larkin.normalizeLng(req.query.end_lng); - } else if (req.query.start_lng && req.query.start_lat && req.query.end_lng && req.query.end_lat) { - req.query.start_lng = larkin.normalizeLng(req.query.start_lng) - req.query.end_lng = larkin.normalizeLng(req.query.end_lng) + let leftLng = + req.query.start_lng < req.query.end_lng + ? req.query.start_lng + : req.query.end_lng; + let leftLat = + req.query.start_lng < req.query.end_lng + ? req.query.start_lat + : req.query.end_lat; + let rightLng = + req.query.start_lng < req.query.end_lng + ? req.query.end_lng + : req.query.start_lng; + let rightLat = + req.query.start_lng < req.query.end_lng + ? req.query.end_lat + : req.query.start_lat; + let linestring = `SRID=4326;LINESTRING(${leftLng} ${leftLat}, ${rightLng} ${rightLat})`; + let westPoint = `SRID=4326;POINT(${leftLng} ${leftLat})`; - let leftLng = (req.query.start_lng < req.query.end_lng) ? req.query.start_lng : req.query.end_lng - let leftLat = (req.query.start_lng < req.query.end_lng) ? req.query.start_lat : req.query.end_lat - let rightLng = (req.query.start_lng < req.query.end_lng) ? req.query.end_lng : req.query.start_lng - let rightLat = (req.query.start_lng < req.query.end_lng) ? req.query.end_lat : req.query.start_lat - let linestring = `SRID=4326;LINESTRING(${leftLng} ${leftLat}, ${rightLng} ${rightLat})` - let westPoint = `SRID=4326;POINT(${leftLng} ${leftLat})` - - larkin.queryPg('elevation', ` + larkin.queryPg( + "elevation", + ` WITH first AS ( SELECT ST_SetSRID((ST_Dump( ST_LocateAlong( @@ -82,20 +113,31 @@ module.exports = (req, res, next, cb) => { LIMIT 1 ) AS elevation FROM first - `, [linestring, westPoint], (error, result) => { - if (error) { - if (cb) return cb(error) - return larkin.error(req, res, next, 'Internal error', 500) - } - if (cb) return cb(null, result.rows) - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : 'json', - compact: true - }, { - data: result.rows - }) - }) + `, + [linestring, westPoint], + (error, result) => { + if (error) { + if (cb) return cb(error); + return larkin.error(req, res, next, "Internal error", 500); + } + if (cb) return cb(null, result.rows); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + compact: true, + }, + { + data: result.rows, + }, + ); + }, + ); } else { - return larkin.error(req, res, next, 'Invalid Parameters', 401) + return larkin.error(req, res, next, "Invalid Parameters", 401); } -} +}; diff --git a/v2/eodp.ts b/v2/eodp.ts index ac15d5a7..621afdb0 100644 --- a/v2/eodp.ts +++ b/v2/eodp.ts @@ -1,98 +1,139 @@ -var api = require('./api') -var dbgeo = require('dbgeo') -var larkin = require('./larkin') +var api = require("./api"); +var dbgeo = require("dbgeo"); +var larkin = require("./larkin"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var geo = (req.query.format && api.acceptedFormats.geo[req.query.format]) ? true : false; + var geo = + req.query.format && api.acceptedFormats.geo[req.query.format] + ? true + : false; var sql = ` SELECT col_groups.col_group,ob.site_hole,date_started,ref_id,ob.col_id,lat,lng,GROUP_CONCAT(ob.top_depth ORDER BY top_depth SEPARATOR '|') top_depth,GROUP_CONCAT(ob.bottom_depth ORDER BY top_depth SEPARATOR '|') bottom_depth, GROUP_CONCAT(trim(concat_WS(' ',principal_lith_prefix_cleaned,cleaned_lith,principal_lith_suffix_cleaned)) ORDER BY top_depth SEPARATOR '|') as primary_lith, GROUP_CONCAT(lith_id ORDER BY top_depth SEPARATOR '|') as lith_id, GROUP_CONCAT(standard_minor_lith ORDER BY top_depth SEPARATOR '|') as minor_lith FROM offshore_baggage ob JOIN offshore_sites USING (col_id) JOIN col_groups on col_group_id=col_groups.id - ` - var where = [] - var params = {} + `; + var where = []; + var params = {}; if (req.query.epoch) { - where.push("epoch in (:epoch)") - params["epoch"] = larkin.parseMultipleStrings(req.query.epoch) + where.push("epoch in (:epoch)"); + params["epoch"] = larkin.parseMultipleStrings(req.query.epoch); } if (req.query.leg) { - where.push("leg in (:leg)") - params["leg"] = larkin.parseMultipleStrings(req.query.leg) + where.push("leg in (:leg)"); + params["leg"] = larkin.parseMultipleStrings(req.query.leg); } if (req.query.site) { - where.push("site IN (:site)") - params["site"] = larkin.parseMultipleStrings(req.query.site) + where.push("site IN (:site)"); + params["site"] = larkin.parseMultipleStrings(req.query.site); } if (req.query.col_id) { - where.push("col_id IN (:col_id)") - params["col_id"] = larkin.parseMultipleIds(req.query.col_id) + where.push("col_id IN (:col_id)"); + params["col_id"] = larkin.parseMultipleIds(req.query.col_id); } if (req.query.col_group_id) { - where.push("site IN (:col_group_id)") - params["col_group_id"] = larkin.parseMultipleIds(req.query.col_group_id) + where.push("site IN (:col_group_id)"); + params["col_group_id"] = larkin.parseMultipleIds(req.query.col_group_id); } if (where.length) { - sql += ` WHERE ${where.join(' AND ')} AND lith_id>0 ` - } else { sql += ` WHERE lith_id>0 ` } + sql += ` WHERE ${where.join(" AND ")} AND lith_id>0 `; + } else { + sql += ` WHERE lith_id>0 `; + } - sql += " GROUP BY ob.col_id ORDER BY ob.col_id,ob.top_depth ASC " + sql += " GROUP BY ob.col_id ORDER BY ob.col_id,ob.top_depth ASC "; if ("sample" in req.query) { - sql += " LIMIT 1" + sql += " LIMIT 1"; } -//console.log(sql); + //console.log(sql); - larkin.query(sql, params, function(error, response) { + larkin.query(sql, params, function (error, response) { if (error) { larkin.error(req, res, next, error); } else { - if (req.query.format !== "csv"){ + if (req.query.format !== "csv") { for (var i = 0; i < response.length; i++) { - response[i].top_depth = larkin.jsonifyPipes(response[i].top_depth, "floats"); - response[i].bottom_depth = larkin.jsonifyPipes(response[i].bottom_depth, "floats"); - response[i].primary_lith = larkin.jsonifyPipes(response[i].primary_lith, "strings"); - response[i].lith_id = larkin.jsonifyPipes(response[i].lith_id, "integers"); - response[i].minor_lith = larkin.jsonifyPipes(response[i].minor_lith, "strings"); - + response[i].top_depth = larkin.jsonifyPipes( + response[i].top_depth, + "floats", + ); + response[i].bottom_depth = larkin.jsonifyPipes( + response[i].bottom_depth, + "floats", + ); + response[i].primary_lith = larkin.jsonifyPipes( + response[i].primary_lith, + "strings", + ); + response[i].lith_id = larkin.jsonifyPipes( + response[i].lith_id, + "integers", + ); + response[i].minor_lith = larkin.jsonifyPipes( + response[i].minor_lith, + "strings", + ); } } if (geo) { - dbgeo.parse(response, { - "outputFormat": larkin.getOutputFormat(req.query.format), - "geometryColumn": ["lng", "lat"], - "geometryType": "ll" - }, function(error, response) { - if (error) { - larkin.error(req, res, next, "Something went wrong"); - } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: "refs" - }, { - data: response - }); - } + dbgeo.parse( + response, + { + outputFormat: larkin.getOutputFormat(req.query.format), + geometryColumn: ["lng", "lat"], + geometryType: "ll", + }, + function (error, response) { + if (error) { + larkin.error(req, res, next, "Something went wrong"); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + refs: "refs", + }, + { + data: response, + }, + ); } - ); - } else { larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : 'json', - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'ref_id' - }, { - data: response - }) - } + }, + ); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + refs: "ref_id", + }, + { + data: response, + }, + ); + } } - }) -} + }); +}; diff --git a/v2/fossils.ts b/v2/fossils.ts index dcc8bfc8..16a496f1 100644 --- a/v2/fossils.ts +++ b/v2/fossils.ts @@ -1,79 +1,138 @@ var api = require("./api"), - dbgeo = require("dbgeo"), - async = require("async"), - larkin = require("./larkin"); + dbgeo = require("dbgeo"), + async = require("async"), + larkin = require("./larkin"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } else { - var geo = (req.query.format && api.acceptedFormats.geo[req.query.format]) ? true : false; + var geo = + req.query.format && api.acceptedFormats.geo[req.query.format] + ? true + : false; - async.waterfall([ - function(callback) { - if (req.query.age_top && req.query.age_bottom) { - callback(null, {"interval_name": "Unknown", "age_bottom": req.query.age_bottom, "age_top": req.query.age_top}); - } else if (req.query.age) { - callback(null, {"interval_name": "Unknown", "age_bottom": req.query.age, "age_top": req.query.age}); - } else if (req.query.unit_id || req.query.col_id || req.query.col_group_id || req.query.strat_name_id || req.query.strat_name_concept_id || "sample" in req.query) { - callback(null, {"interval_name": "Unknown", "age_bottom": null, "age_top": null}); - } else if (req.query.interval_name || req.query.int_id || req.query.lith_id || req.query.lith || req.query.lith_type || req.query.lith_class || req.query.environ_id || req.query.environ || req.query.environ_type || req.query.environ_class || req.query.econ_id || req.query.econ || req.query.econ_type || req.query.econ_class) { - require("./units")(req, null, null, function(error, result) { - if (error) { - callback(error); - } - if (!result || !result.length) { - return callback(null, null); - } - req.query.unit_id = result.map(function(d) { return d.unit_id; }).join(","); - callback(null, {"interval_name": "Unknown", "age_bottom": null, "age_top": null}); - }); - } else { - larkin.error(req, res, next, "Invalid parameters"); - } - }, - function(data, callback) { - var where = "", - limit = ("sample" in req.query) ? " LIMIT 5" : "", + async.waterfall( + [ + function (callback) { + if (req.query.age_top && req.query.age_bottom) { + callback(null, { + interval_name: "Unknown", + age_bottom: req.query.age_bottom, + age_top: req.query.age_top, + }); + } else if (req.query.age) { + callback(null, { + interval_name: "Unknown", + age_bottom: req.query.age, + age_top: req.query.age, + }); + } else if ( + req.query.unit_id || + req.query.col_id || + req.query.col_group_id || + req.query.strat_name_id || + req.query.strat_name_concept_id || + "sample" in req.query + ) { + callback(null, { + interval_name: "Unknown", + age_bottom: null, + age_top: null, + }); + } else if ( + req.query.interval_name || + req.query.int_id || + req.query.lith_id || + req.query.lith || + req.query.lith_type || + req.query.lith_class || + req.query.environ_id || + req.query.environ || + req.query.environ_type || + req.query.environ_class || + req.query.econ_id || + req.query.econ || + req.query.econ_type || + req.query.econ_class + ) { + require("./units")(req, null, null, function (error, result) { + if (error) { + callback(error); + } + if (!result || !result.length) { + return callback(null, null); + } + req.query.unit_id = result + .map(function (d) { + return d.unit_id; + }) + .join(","); + callback(null, { + interval_name: "Unknown", + age_bottom: null, + age_top: null, + }); + }); + } else { + larkin.error(req, res, next, "Invalid parameters"); + } + }, + function (data, callback) { + var where = "", + limit = "sample" in req.query ? " LIMIT 5" : "", params = {}; - if (data.age_bottom) { - where += " AND lookup_unit_intervals.b_age > :age_top AND lookup_unit_intervals.t_age < :age_bottom"; - params["age_top"] = data.age_top; - params["age_bottom"] = data.age_bottom; - } - - if (req.query.unit_id) { - where += " AND pbdb_matches.unit_id IN (:unit_id)"; - params["unit_id"] = larkin.parseMultipleIds(req.query.unit_id); + if (data.age_bottom) { + where += + " AND lookup_unit_intervals.b_age > :age_top AND lookup_unit_intervals.t_age < :age_bottom"; + params["age_top"] = data.age_top; + params["age_bottom"] = data.age_bottom; + } - } else if (req.query.col_id) { - where += " AND units_sections.col_id IN (:col_id)"; - params["col_id"] = larkin.parseMultipleIds(req.query.col_id); - } + if (req.query.unit_id) { + where += " AND pbdb_matches.unit_id IN (:unit_id)"; + params["unit_id"] = larkin.parseMultipleIds(req.query.unit_id); + } else if (req.query.col_id) { + where += " AND units_sections.col_id IN (:col_id)"; + params["col_id"] = larkin.parseMultipleIds(req.query.col_id); + } - if (req.query.strat_name_id) { - where += " AND (lookup_strat_names.bed_id IN (:strat_name_ids) OR lookup_strat_names.mbr_id IN (:strat_name_ids) OR lookup_strat_names.fm_id IN (:strat_name_ids) OR lookup_strat_names.gp_id IN (:strat_name_ids) OR lookup_strat_names.sgp_id IN (:strat_name_ids)) "; - params["strat_name_ids"] = larkin.parseMultipleIds(req.query.strat_name_id); - } + if (req.query.strat_name_id) { + where += + " AND (lookup_strat_names.bed_id IN (:strat_name_ids) OR lookup_strat_names.mbr_id IN (:strat_name_ids) OR lookup_strat_names.fm_id IN (:strat_name_ids) OR lookup_strat_names.gp_id IN (:strat_name_ids) OR lookup_strat_names.sgp_id IN (:strat_name_ids)) "; + params["strat_name_ids"] = larkin.parseMultipleIds( + req.query.strat_name_id, + ); + } - if (req.query.strat_name_concept_id) { - where += " AND lookup_strat_names.strat_name_id IN (SELECT strat_name_id FROM lookup_strat_names WHERE concept_id IN (:concept_id))"; - params["concept_id"] = larkin.parseMultipleIds(req.query.strat_name_concept_id); - } + if (req.query.strat_name_concept_id) { + where += + " AND lookup_strat_names.strat_name_id IN (SELECT strat_name_id FROM lookup_strat_names WHERE concept_id IN (:concept_id))"; + params["concept_id"] = larkin.parseMultipleIds( + req.query.strat_name_concept_id, + ); + } - if (req.query.col_group_id) { - where += " AND col_group_id IN (:col_group_ids)"; - params["col_group_ids"] = larkin.parseMultipleIds(req.query.col_group_id); - } + if (req.query.col_group_id) { + where += " AND col_group_id IN (:col_group_ids)"; + params["col_group_ids"] = larkin.parseMultipleIds( + req.query.col_group_id, + ); + } - if (req.query.project_id) { - where += " AND cols.project_id IN (:project_ids)"; - params["project_ids"] = larkin.parseMultipleIds(req.query.project_id); - } + if (req.query.project_id) { + where += " AND cols.project_id IN (:project_ids)"; + params["project_ids"] = larkin.parseMultipleIds( + req.query.project_id, + ); + } - larkin.query("SELECT pbdb_matches.collection_no AS cltn_id, collection_name AS cltn_name, lookup_unit_intervals.t_age, lookup_unit_intervals.b_age, n_occs AS pbdb_occs, COALESCE(GROUP_CONCAT(distinct pbdb.taxon_lower.genus_no), '') AS genus_no, COALESCE(GROUP_CONCAT(distinct pbdb.occ_matrix.taxon_no), '') AS taxon_no, \ - pbdb_matches.unit_id, cols.id as col_id, CONCAT(pbdb_matches.ref_id, '|') AS refs " + ((geo) ? ", AsWKT(pbdb_matches.coordinate) AS geometry" : "") + ", lookup_strat_names.concept_id AS strat_name_concept_id \ + larkin.query( + "SELECT pbdb_matches.collection_no AS cltn_id, collection_name AS cltn_name, lookup_unit_intervals.t_age, lookup_unit_intervals.b_age, n_occs AS pbdb_occs, COALESCE(GROUP_CONCAT(distinct pbdb.taxon_lower.genus_no), '') AS genus_no, COALESCE(GROUP_CONCAT(distinct pbdb.occ_matrix.taxon_no), '') AS taxon_no, \ + pbdb_matches.unit_id, cols.id as col_id, CONCAT(pbdb_matches.ref_id, '|') AS refs " + + (geo ? ", AsWKT(pbdb_matches.coordinate) AS geometry" : "") + + ", lookup_strat_names.concept_id AS strat_name_concept_id \ FROM pbdb_matches \ JOIN units ON pbdb_matches.unit_id = units.id \ JOIN units_sections ON units_sections.unit_id = units.id \ @@ -85,55 +144,88 @@ module.exports = function(req, res, next) { LEFT JOIN unit_strat_names ON unit_strat_names.unit_id = units.id \ LEFT JOIN lookup_strat_names ON lookup_strat_names.strat_name_id=unit_strat_names.strat_name_id \ WHERE pbdb_matches.release_date < now() AND \ - cols.status_code = 'active' " + where + " GROUP BY pbdb_matches.collection_no" + limit, params, function(error, result) { - if (error) { - callback(error); - } else { - result.forEach(function(d) { - d.genus_no = (d.genus_no.length) ? d.genus_no.split(",").map(function(d) {return parseInt(d)}) : [ ]; - d.refs = larkin.jsonifyPipes(d.refs, "integers"); - if (req.query.format && req.query.format === "csv") { - d.refs = d.refs.join("|") - d.genus_no = d.genus_no.join("|") - } - }); - callback(null, data, result); - } - }); - } - ], function(error, data, results) { - if (error) { - console.log(error); - larkin.error(req, res, next, "Something went wrong"); - } else { - if (geo) { - dbgeo.parse(results, { - "outputFormat": larkin.getOutputFormat(req.query.format), - "geometryColumn": "geometry", - "geometryType": "wkt" - }, function(error, result) { + cols.status_code = 'active' " + + where + + " GROUP BY pbdb_matches.collection_no" + + limit, + params, + function (error, result) { if (error) { - larkin.error(req, res, next, "Something went wrong"); + callback(error); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: "refs" - }, { - data: result + result.forEach(function (d) { + d.genus_no = d.genus_no.length + ? d.genus_no.split(",").map(function (d) { + return parseInt(d); + }) + : []; + d.refs = larkin.jsonifyPipes(d.refs, "integers"); + if (req.query.format && req.query.format === "csv") { + d.refs = d.refs.join("|"); + d.genus_no = d.genus_no.join("|"); + } }); + callback(null, data, result); } - } + }, ); + }, + ], + function (error, data, results) { + if (error) { + console.log(error); + larkin.error(req, res, next, "Something went wrong"); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - refs: "refs" - }, { - data: results - }); + if (geo) { + dbgeo.parse( + results, + { + outputFormat: larkin.getOutputFormat(req.query.format), + geometryColumn: "geometry", + geometryType: "wkt", + }, + function (error, result) { + if (error) { + larkin.error(req, res, next, "Something went wrong"); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + refs: "refs", + }, + { + data: result, + }, + ); + } + }, + ); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + refs: "refs", + }, + { + data: results, + }, + ); + } } - } - }); + }, + ); } -} +}; diff --git a/v2/geologic_units_burwell.ts b/v2/geologic_units_burwell.ts index 82e21cda..5a590bc2 100644 --- a/v2/geologic_units_burwell.ts +++ b/v2/geologic_units_burwell.ts @@ -1,8 +1,8 @@ var api = require("./api"), - async = require("async"), - dbgeo = require("dbgeo"), - gp = require("geojson-precision"), - larkin = require("./larkin"); + async = require("async"), + dbgeo = require("dbgeo"), + gp = require("geojson-precision"), + larkin = require("./larkin"); function buildSQL(req, scale, where, limit) { var sql = ` @@ -35,188 +35,248 @@ function buildSQL(req, scale, where, limit) { ORDER BY age_bottom - age_top LIMIT 1 ) AS best_int_name - ` + `; if (req.query.map) { - sql = "(SELECT mm.color, m.source_id" + sql = "(SELECT mm.color, m.source_id"; } if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - sql += ", ST_AsGeoJSON(m.geom) AS geometry" + sql += ", ST_AsGeoJSON(m.geom) AS geometry"; } - sql += " FROM maps." + scale + " m \ + sql += + " FROM maps." + + scale + + " m \ LEFT JOIN macrostrat.intervals ti ON m.t_interval = ti.id \ LEFT JOIN macrostrat.intervals tb ON m.b_interval = tb.id \ - LEFT JOIN lookup_" + scale + " mm ON mm.map_id = m.map_id" - + where + limit + ")"; + LEFT JOIN lookup_" + + scale + + " mm ON mm.map_id = m.map_id" + + where + + limit + + ")"; return sql; } -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { larkin.info(req, res, next); } else { var where = [], - params = [], - limit; + params = [], + limit; if ("sample" in req.query) { limit = " LIMIT 5"; req.query.scale = "medium"; } else { - limit = "" + limit = ""; } // Process the parameters - async.parallel([ - - // Lat/lng - function(callback) { - if (req.query.lat && req.query.lng) { - req.query.lng = larkin.normalizeLng(req.query.lng); - if (req.query.buffer && req.query.buffer <= 50) { - where.push("ST_Intersects(m.geom, ST_Buffer(ST_GeographyFromText($" + (where.length + 1) + "), $" + (where.length + 2) + ")::geometry)"); - params.push("POINT(" + req.query.lng + " " + req.query.lat + ")", req.query.buffer * 1000); - } else { - where.push("ST_Intersects(m.geom, ST_GeomFromText($" + (where.length + 1) + ", 4326))"); - params.push("POINT(" + req.query.lng + " " + req.query.lat + ")"); + async.parallel( + [ + // Lat/lng + function (callback) { + if (req.query.lat && req.query.lng) { + req.query.lng = larkin.normalizeLng(req.query.lng); + if (req.query.buffer && req.query.buffer <= 50) { + where.push( + "ST_Intersects(m.geom, ST_Buffer(ST_GeographyFromText($" + + (where.length + 1) + + "), $" + + (where.length + 2) + + ")::geometry)", + ); + params.push( + "POINT(" + req.query.lng + " " + req.query.lat + ")", + req.query.buffer * 1000, + ); + } else { + where.push( + "ST_Intersects(m.geom, ST_GeomFromText($" + + (where.length + 1) + + ", 4326))", + ); + params.push("POINT(" + req.query.lng + " " + req.query.lat + ")"); + } } + callback(null); + }, - } - callback(null); - }, - - // map_id - function(callback) { - if (req.query.map_id && req.query.map_id != "undefined") { - where.push("m.map_id = ANY($" + (where.length + 1) + ")"); - params.push(larkin.parseMultipleIds(req.query.map_id)); - } + // map_id + function (callback) { + if (req.query.map_id && req.query.map_id != "undefined") { + where.push("m.map_id = ANY($" + (where.length + 1) + ")"); + params.push(larkin.parseMultipleIds(req.query.map_id)); + } - callback(null); - }, + callback(null); + }, - // strat_name_id - function(callback) { - // Need to go down the hierarchy! - if (req.query.strat_name_id) { - req.query.rule = "down"; - require("./definitions/strat_names")(req, null, null, function(error, result) { - if (error || !result) { - return callback(null) - } - var strat_name_ids = result.map(function(d) { return d.strat_name_id }); + // strat_name_id + function (callback) { + // Need to go down the hierarchy! + if (req.query.strat_name_id) { + req.query.rule = "down"; + require("./definitions/strat_names")( + req, + null, + null, + function (error, result) { + if (error || !result) { + return callback(null); + } + var strat_name_ids = result.map(function (d) { + return d.strat_name_id; + }); - where.push("mm.strat_name_ids && $" + (where.length + 1) + "::int[]"); - params.push(strat_name_ids); + where.push( + "mm.strat_name_ids && $" + (where.length + 1) + "::int[]", + ); + params.push(strat_name_ids); + callback(null); + }, + ); + } else { callback(null); - }); - } else { - callback(null); - } + } + }, - }, + // unit_id + function (callback) { + if (req.query.unit_id) { + var unit_ids = larkin.parseMultipleIds(req.query.unit_id); - // unit_id - function(callback) { - if (req.query.unit_id) { - var unit_ids = larkin.parseMultipleIds(req.query.unit_id); + where.push("mm.unit_ids && $" + (where.length + 1) + "::int[]"); + params.push(unit_ids); + } - where.push("mm.unit_ids && $" + (where.length + 1) + "::int[]"); - params.push(unit_ids); - } + callback(null); + }, - callback(null); - }, + // lith_id + function (callback) { + if (req.query.lith_id) { + var lith_ids = larkin.parseMultipleIds(req.query.lith_id); - // lith_id - function(callback) { - if (req.query.lith_id) { - var lith_ids = larkin.parseMultipleIds(req.query.lith_id); + where.push("mm.lith_ids && $" + (where.length + 1) + "::int[]"); + params.push(lith_ids); + } - where.push("mm.lith_ids && $" + (where.length + 1) + "::int[]"); - params.push(lith_ids); + callback(null); + }, + ], + function () { + // If no valid parameters passed, return an Error + if (where.length < 1 && !("sample" in req.query)) { + if (cb) return cb("No valid parameters passed"); + return larkin.error(req, res, next, "No valid parameters passed"); } - callback(null); - } - - ], function() { - // If no valid parameters passed, return an Error - if (where.length < 1 && !("sample" in req.query)) { - if (cb) return cb("No valid parameters passed"); - return larkin.error(req, res, next, "No valid parameters passed"); - } - - if (where.length > 0) { - where = " WHERE " + where.join(" AND "); - } else { - where = ""; - } - - if (req.query.scale) { - var requestedScales = larkin.parseMultipleStrings(req.query.scale); - scales = requestedScales.filter(function(d) { - if (["tiny", "small", "medium", "large"].indexOf(d) > -1) { - return d; - } - }); - - if (scales.length < 1) { - return larkin.error(req, res, next, "Invalid scale parameter passed."); + if (where.length > 0) { + where = " WHERE " + where.join(" AND "); + } else { + where = ""; } - } else { - scales = ["tiny", "small", "medium", "large"]; - } + if (req.query.scale) { + var requestedScales = larkin.parseMultipleStrings(req.query.scale); + scales = requestedScales.filter(function (d) { + if (["tiny", "small", "medium", "large"].indexOf(d) > -1) { + return d; + } + }); + + if (scales.length < 1) { + return larkin.error( + req, + res, + next, + "Invalid scale parameter passed.", + ); + } + } else { + scales = ["tiny", "small", "medium", "large"]; + } - var scaleSQL = scales.map(function(d) { - return buildSQL(req, d, where, limit); - }).join(" UNION "); + var scaleSQL = scales + .map(function (d) { + return buildSQL(req, d, where, limit); + }) + .join(" UNION "); - var toRun = "SELECT * FROM ( " + scaleSQL + ") doit"; + var toRun = "SELECT * FROM ( " + scaleSQL + ") doit"; - larkin.queryPg("burwell", toRun, params, function(error, result) { - if (error) { - if (cb) return cb(error); - larkin.error(req, res, next, error); - } else { - if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - dbgeo.parse(result.rows, { - "geometryType": "geojson", - "geometryColumn": "geometry", - "outputFormat": larkin.getOutputFormat(req.query.format) - }, function(error, result) { - if (error) { - if (cb) return cb(error); - larkin.error(req, res, next, error); - } else { - if (larkin.getOutputFormat(req.query.format) === "geojson") { - result = gp(result, 5); - } - if (cb) return cb(null, result); - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'source_id' - }, { - data: result - }); - } - }); + larkin.queryPg("burwell", toRun, params, function (error, result) { + if (error) { + if (cb) return cb(error); + larkin.error(req, res, next, error); } else { - if (cb) return cb(null, result.rows); - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'source_id' - }, { - data: result.rows - }); + if (req.query.format && api.acceptedFormats.geo[req.query.format]) { + dbgeo.parse( + result.rows, + { + geometryType: "geojson", + geometryColumn: "geometry", + outputFormat: larkin.getOutputFormat(req.query.format), + }, + function (error, result) { + if (error) { + if (cb) return cb(error); + larkin.error(req, res, next, error); + } else { + if ( + larkin.getOutputFormat(req.query.format) === "geojson" + ) { + result = gp(result, 5); + } + if (cb) return cb(null, result); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + refs: "source_id", + }, + { + data: result, + }, + ); + } + }, + ); + } else { + if (cb) return cb(null, result.rows); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + refs: "source_id", + }, + { + data: result.rows, + }, + ); + } } - } - }); - }); + }); + }, + ); } -} +}; diff --git a/v2/geologic_units_burwell_legend.ts b/v2/geologic_units_burwell_legend.ts index b48f4962..55d53e7c 100644 --- a/v2/geologic_units_burwell_legend.ts +++ b/v2/geologic_units_burwell_legend.ts @@ -1,238 +1,311 @@ var api = require("./api"), - async = require("async"), - larkin = require("./larkin"); + async = require("async"), + larkin = require("./larkin"); -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { if (Object.keys(req.query).length < 1) { larkin.info(req, res, next); } else { var where = [], - where_lith = [], - params = [], - params_lith = [], - carto_scale = '', - limit; + where_lith = [], + params = [], + params_lith = [], + carto_scale = "", + limit; if ("sample" in req.query) { limit = " LIMIT 5"; } else { - limit = "" + limit = ""; } // Process the parameters - async.parallel([ - - // Lat/lng - // map_id - function(callback) { - if (req.query.map_id && req.query.map_id != "undefined") { - where.push("m.map_id = ANY($" + (where.length + 1) + ")"); - params.push(larkin.parseMultipleIds(req.query.map_id)); - } - - callback(null); - }, + async.parallel( + [ + // Lat/lng + // map_id + function (callback) { + if (req.query.map_id && req.query.map_id != "undefined") { + where.push("m.map_id = ANY($" + (where.length + 1) + ")"); + params.push(larkin.parseMultipleIds(req.query.map_id)); + } - // strat_name_id - function(callback) { - // Need to go down the hierarchy! - if (req.query.strat_name_id) { - req.query.rule = "down"; - require("./definitions/strat_names")(req, null, null, function(error, result) { - if (error || !result) { - return callback(null) - } - var strat_name_ids = result.map(function(d) { return d.strat_name_id }); + callback(null); + }, + + // strat_name_id + function (callback) { + // Need to go down the hierarchy! + if (req.query.strat_name_id) { + req.query.rule = "down"; + require("./definitions/strat_names")( + req, + null, + null, + function (error, result) { + if (error || !result) { + return callback(null); + } + var strat_name_ids = result.map(function (d) { + return d.strat_name_id; + }); - where.push("m.strat_name_ids && $" + (where.length + 1) + "::int[]"); - params.push(strat_name_ids); + where.push( + "m.strat_name_ids && $" + (where.length + 1) + "::int[]", + ); + params.push(strat_name_ids); + callback(null); + }, + ); + } else { callback(null); - }); - } else { - callback(null); - } + } + }, - }, + // unit_id + function (callback) { + if (req.query.unit_id) { + var unit_ids = larkin.parseMultipleIds(req.query.unit_id); - // unit_id - function(callback) { - if (req.query.unit_id) { - var unit_ids = larkin.parseMultipleIds(req.query.unit_id); + where.push("m.unit_ids && $" + (where.length + 1) + "::int[]"); + params.push(unit_ids); + } - where.push("m.unit_ids && $" + (where.length + 1) + "::int[]"); - params.push(unit_ids); - } + callback(null); + }, - callback(null); - }, + // scale + function (callback) { + if (req.query.scale) { + where.push("scale = ANY($" + (where.length + 1) + ")"); + params.push(larkin.parseMultipleStrings(req.query.scale)); + } - // scale - function(callback) { - if (req.query.scale) { - where.push('scale = ANY($' + (where.length + 1) + ')') - params.push(larkin.parseMultipleStrings(req.query.scale)) - } + callback(null); + }, - callback(null); - }, + // comments + function (callback) { + if (req.query.comments) { + where.push("comments ILIKE $" + (where.length + 1)); + params.push("%" + req.query.comments + "%"); + } - // comments - function(callback) { - if (req.query.comments) { - where.push('comments ILIKE $' + (where.length + 1)) - params.push('%' + req.query.comments + '%') - } + callback(null); + }, - callback(null); - }, + // descrip + function (callback) { + if (req.query.description) { + where.push("descrip ILIKE $" + (where.length + 1)); + params.push("%" + req.query.description + "%"); + } - // descrip - function(callback) { - if (req.query.description) { - where.push('descrip ILIKE $' + (where.length + 1)) - params.push('%' + req.query.description + '%') - } + callback(null); + }, - callback(null); - }, + // source_id + function (callback) { + if (req.query.source_id) { + where.push("m.source_id = ANY($" + (where.length + 1) + ")"); + params.push(larkin.parseMultipleIds(req.query.source_id)); + } - // source_id - function(callback) { - if (req.query.source_id) { - where.push('m.source_id = ANY($' + (where.length + 1) + ')') - params.push(larkin.parseMultipleIds(req.query.source_id)) - } + callback(null); + }, + + // lith_id + function (callback) { + if (req.query.lith_id) { + var lith_ids = larkin.parseMultipleIds(req.query.lith_id); + + where_lith.push( + "m.lith_ids && $" + + (where_lith.length + 1 + where.length) + + "::int[]", + ); + params_lith.push(lith_ids); + } - callback(null); - }, + callback(null); + }, - // lith_id - function(callback) { - if (req.query.lith_id) { - var lith_ids = larkin.parseMultipleIds(req.query.lith_id); + // lith_type + function (callback) { + if (req.query.lith_type) { + var lith_type = larkin.parseMultipleStrings(req.query.lith_type); - where_lith.push("m.lith_ids && $" + (where_lith.length + 1 + where.length) + "::int[]"); - params_lith.push(lith_ids); - } + where_lith.push( + "m.lith_types && $" + (where_lith.length + 1 + where.length) + "", + ); + params_lith.push(lith_type); + } - callback(null); - }, + callback(null); + }, + + // lith_classes + function (callback) { + if (req.query.lith_class) { + var lith_class = larkin.parseMultipleStrings(req.query.lith_class); + + where_lith.push( + "m.lith_classes && $" + + (where_lith.length + 1 + where.length) + + "", + ); + params_lith.push(lith_class); + } - // lith_type - function(callback) { - if (req.query.lith_type) { - var lith_type = larkin.parseMultipleStrings(req.query.lith_type); + callback(null); + }, + + // lith_classes + function (callback) { + if (req.query.carto) { + if (req.query.carto == "large") + carto_scale = + " AND m.legend_id IN (SELECT distinct legend_id from maps.map_legend JOIN carto_new.large USING (map_id))"; + if (req.query.carto == "medium") + carto_scale = + " AND m.legend_id IN (SELECT distinct legend_id from maps.map_legend JOIN carto_new.medium USING (map_id))"; + if (req.query.carto == "small") + carto_scale = + " AND m.legend_id IN (SELECT distinct legend_id from maps.map_legend JOIN carto_new.small USING (map_id))"; + if (req.query.carto == "tiny") + carto_scale = + " AND m.legend_id IN (SELECT distinct legend_id from maps.map_legend JOIN carto_new.tiny USING (map_id))"; + } - where_lith.push("m.lith_types && $" + (where_lith.length + 1 + where.length) + ""); - params_lith.push(lith_type); + callback(null); + }, + ], + function () { + // If no valid parameters passed, return an Error + if ( + where.length < 1 && + where_lith.length < 1 && + !("sample" in req.query) && + !req.query.carto + ) { + if (cb) return cb("No valid parameters passed"); + return larkin.error(req, res, next, "No valid parameters passed"); } - callback(null); - }, - - // lith_classes - function(callback) { - if (req.query.lith_class) { - var lith_class = larkin.parseMultipleStrings(req.query.lith_class); - - where_lith.push("m.lith_classes && $" + (where_lith.length + 1 + where.length) + ""); - params_lith.push(lith_class); + var where_start = " WHERE sources.status_code='active'"; + if (where.length > 0) { + where = " AND " + where.join(" AND "); + } else { + where = ""; } - callback(null); - }, - - // lith_classes - function(callback) { - if (req.query.carto) { - if (req.query.carto == 'large') carto_scale = ' AND m.legend_id IN (SELECT distinct legend_id from maps.map_legend JOIN carto_new.large USING (map_id))'; - if (req.query.carto == 'medium') carto_scale = ' AND m.legend_id IN (SELECT distinct legend_id from maps.map_legend JOIN carto_new.medium USING (map_id))'; - if (req.query.carto == 'small') carto_scale = ' AND m.legend_id IN (SELECT distinct legend_id from maps.map_legend JOIN carto_new.small USING (map_id))'; - if (req.query.carto == 'tiny') carto_scale = ' AND m.legend_id IN (SELECT distinct legend_id from maps.map_legend JOIN carto_new.tiny USING (map_id))'; + if (where_lith.length > 0) { + where_lith = " AND (" + where_lith.join(" OR ") + ")"; + } else { + where_lith = ""; } - callback(null); - } - - ], function() { - // If no valid parameters passed, return an Error - if (where.length < 1 && where_lith.length < 1 && !("sample" in req.query) && !req.query.carto) { - if (cb) return cb("No valid parameters passed"); - return larkin.error(req, res, next, "No valid parameters passed"); - } - - var where_start = " WHERE sources.status_code='active'"; - if (where.length > 0) { - where = " AND " + where.join(" AND "); - } else { - where = ""; - } - - if (where_lith.length > 0) { - where_lith = " AND (" + where_lith.join(" OR ") + ")"; - } else { - where_lith = ""; - } - - var where_combined = ''; - if (where_lith.length > 0 && where.length > 0) { - where_combined = where.concat(where_lith); - where = ""; - where_lith = ""; - } - - var params_combined = params.concat(params_lith); - - var sql = "SELECT legend_id, m.source_id, sources.scale, to_json(regexp_replace(m.name, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g')) as map_unit_name, to_json(regexp_replace(strat_name, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g')) as strat_name,age,to_json(regexp_replace(lith, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g')) AS lith,to_json(regexp_replace(descrip, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g')) AS descrip, to_json(regexp_replace(comments, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g')) AS comments,best_age_top::float t_age,best_age_bottom::float b_age,b_interval,t_interval,strat_name_ids strat_name_id,unit_ids unit_id, lith_classes,lith_types,lith_ids lith_id ,color,m.area::float,tiny_area::float,small_area::float,medium_area::float,large_area::float"; - - sql += " FROM maps.legend m JOIN maps.sources USING (source_id)" - + where_start + carto_scale + where + where_combined + where_lith + limit; - -// var scaleSQL = buildSQL(req, where, limit); - -// var toRun = "SELECT * FROM ( " + scaleSQL + ") doit"; - console.log(sql,params_combined); + var where_combined = ""; + if (where_lith.length > 0 && where.length > 0) { + where_combined = where.concat(where_lith); + where = ""; + where_lith = ""; + } - larkin.queryPg("burwell", sql, params_combined, function(error, result) { - if (error) { - if (cb) return cb(error); - larkin.error(req, res, next, error); - } else { - if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - dbgeo.parse(result.rows, { - "geometryType": "geojson", - "geometryColumn": "geometry", - "outputFormat": larkin.getOutputFormat(req.query.format) - }, function(error, result) { - if (error) { - if (cb) return cb(error); - larkin.error(req, res, next, error); + var params_combined = params.concat(params_lith); + + var sql = + "SELECT legend_id, m.source_id, sources.scale, to_json(regexp_replace(m.name, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g')) as map_unit_name, to_json(regexp_replace(strat_name, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g')) as strat_name,age,to_json(regexp_replace(lith, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g')) AS lith,to_json(regexp_replace(descrip, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g')) AS descrip, to_json(regexp_replace(comments, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g')) AS comments,best_age_top::float t_age,best_age_bottom::float b_age,b_interval,t_interval,strat_name_ids strat_name_id,unit_ids unit_id, lith_classes,lith_types,lith_ids lith_id ,color,m.area::float,tiny_area::float,small_area::float,medium_area::float,large_area::float"; + + sql += + " FROM maps.legend m JOIN maps.sources USING (source_id)" + + where_start + + carto_scale + + where + + where_combined + + where_lith + + limit; + + // var scaleSQL = buildSQL(req, where, limit); + + // var toRun = "SELECT * FROM ( " + scaleSQL + ") doit"; + console.log(sql, params_combined); + + larkin.queryPg( + "burwell", + sql, + params_combined, + function (error, result) { + if (error) { + if (cb) return cb(error); + larkin.error(req, res, next, error); + } else { + if ( + req.query.format && + api.acceptedFormats.geo[req.query.format] + ) { + dbgeo.parse( + result.rows, + { + geometryType: "geojson", + geometryColumn: "geometry", + outputFormat: larkin.getOutputFormat(req.query.format), + }, + function (error, result) { + if (error) { + if (cb) return cb(error); + larkin.error(req, res, next, error); + } else { + if ( + larkin.getOutputFormat(req.query.format) === "geojson" + ) { + result = gp(result, 5); + } + if (cb) return cb(null, result); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + refs: "source_id", + }, + { + data: result, + }, + ); + } + }, + ); } else { - if (larkin.getOutputFormat(req.query.format) === "geojson") { - result = gp(result, 5); - } - if (cb) return cb(null, result); - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'source_id' - }, { - data: result - }); + if (cb) return cb(null, result.rows); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + refs: "source_id", + }, + { + data: result.rows, + }, + ); } - }); - } else { - if (cb) return cb(null, result.rows); - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'source_id' - }, { - data: result.rows - }); - } - } - }); - }); + } + }, + ); + }, + ); } -} +}; diff --git a/v2/geologic_units_burwell_nearby.ts b/v2/geologic_units_burwell_nearby.ts index f0556eec..3fb9de4a 100644 --- a/v2/geologic_units_burwell_nearby.ts +++ b/v2/geologic_units_burwell_nearby.ts @@ -1,20 +1,20 @@ var api = require("./api"), - async = require("async"), - larkin = require("./larkin"); + async = require("async"), + larkin = require("./larkin"); var parentOrder = { - "bed": ["mbr", "fm", "gp", "sgp"], - "mbr": ["fm", "gp", "sgp"], - "fm": ["gp", "sgp"], - "gp": ["sgp"], - "sgp": [] -} + bed: ["mbr", "fm", "gp", "sgp"], + mbr: ["fm", "gp", "sgp"], + fm: ["gp", "sgp"], + gp: ["sgp"], + sgp: [], +}; var abbrevs = { - "mbr": "Member", - "fm": "Formation", - "gp": "Group", - "sgp": "Supergroup" -} + mbr: "Member", + fm: "Formation", + gp: "Group", + sgp: "Supergroup", +}; // To whom it may concern: sorry this is so hairy. Magic ain't cheap. var sql = { lithologies: ` @@ -133,10 +133,9 @@ var sql = { // FROM first // WHERE d < 80000; // ` -} +}; - -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { larkin.info(req, res, next); return; @@ -147,12 +146,15 @@ module.exports = function(req, res, next) { return; } - req.query.lng = larkin.normalizeLng(parseFloat(req.query.lng).toFixed(4)) - req.query.lat = parseFloat(req.query.lat).toFixed(4) + req.query.lng = larkin.normalizeLng(parseFloat(req.query.lng).toFixed(4)); + req.query.lat = parseFloat(req.query.lat).toFixed(4); - async.waterfall([ - function(cb) { - larkin.queryPg("burwell", ` + async.waterfall( + [ + function (cb) { + larkin.queryPg( + "burwell", + ` SELECT CASE WHEN ( @@ -184,108 +186,147 @@ module.exports = function(req, res, next) { ) THEN 'small' ELSE 'large' END AS scale - `, [ req.query.lng, req.query.lat ], function(error, result) { - if (error || !result.rows) return cb(error) - cb(null, result.rows[0].scale) - }) - }, function(scale, cb) { - if (scale === '') { - return cb(null, []) - } - async.parallel({ - strat_names: function(callback) { - larkin.queryPg("burwell", sql.strat_names.replace(':scale', scale), [req.query.lng, req.query.lat], function(error, data) { - if (error) { - callback(error); - } else { - var names = data.rows.map( d => { - var rank = d.rank.toLowerCase() - if (rank === 'subgp') { - return null - } - var parent = '' - for (var i = 0; i < parentOrder[rank].length; i++) { - if (d[parentOrder[rank][i]]) { - parent = d[parentOrder[rank][i]] + " " + abbrevs[parentOrder[rank][i]] - continue - } - } + `, + [req.query.lng, req.query.lat], + function (error, result) { + if (error || !result.rows) return cb(error); + cb(null, result.rows[0].scale); + }, + ); + }, + function (scale, cb) { + if (scale === "") { + return cb(null, []); + } + async.parallel( + { + strat_names: function (callback) { + larkin.queryPg( + "burwell", + sql.strat_names.replace(":scale", scale), + [req.query.lng, req.query.lat], + function (error, data) { + if (error) { + callback(error); + } else { + var names = data.rows.map((d) => { + var rank = d.rank.toLowerCase(); + if (rank === "subgp") { + return null; + } + var parent = ""; + for (var i = 0; i < parentOrder[rank].length; i++) { + if (d[parentOrder[rank][i]]) { + parent = + d[parentOrder[rank][i]] + + " " + + abbrevs[parentOrder[rank][i]]; + continue; + } + } - return { - strat_name_long: d.strat_name_long, - strat_name_id: d.strat_name_id, - strat_name: d.strat_name, - b_age: d.b_age, - b_period: d.b_period, - t_age: d.t_age, - t_period: d.t_period, - parent: parent - } - }) + return { + strat_name_long: d.strat_name_long, + strat_name_id: d.strat_name_id, + strat_name: d.strat_name, + b_age: d.b_age, + b_period: d.b_period, + t_age: d.t_age, + t_period: d.t_period, + parent: parent, + }; + }); + callback(null, names); + } + }, + ); + }, - callback(null, names) - } - }); - }, + lithologies: function (callback) { + larkin.queryPg( + "burwell", + sql.lithologies.replace(":scale", scale), + [req.query.lng, req.query.lat], + function (error, data) { + if (error) { + callback(error); + } else { + callback(null, data.rows); + } + }, + ); + }, - lithologies: function(callback) { - larkin.queryPg("burwell", sql.lithologies.replace(':scale', scale), [req.query.lng, req.query.lat], function(error, data) { - if (error) { - callback(error); - } else { - callback(null, data.rows); - } - }); - }, + intervals: function (callback) { + larkin.queryPg( + "burwell", + sql.intervals.replace(":scale", scale), + [req.query.lng, req.query.lat], + function (error, data) { + if (error) { + callback(error); + } else { + callback(null, data.rows); + } + }, + ); + }, - intervals: function(callback) { - larkin.queryPg("burwell", sql.intervals.replace(':scale', scale), [req.query.lng, req.query.lat], function(error, data) { + map_units: function (callback) { + larkin.queryPg( + "burwell", + sql.map_units.replace(/:scale/g, scale), + [req.query.lng, req.query.lat], + function (error, data) { + if (error) { + callback(error); + } else { + callback(null, data.rows); + } + }, + ); + }, + // + // places: function(callback) { + // larkin.queryPg("rockd", sql.places, ['SRID=4326;POINT(' + req.query.lng + ' ' + req.query.lat + ')'], function(error, data) { + // if (error) { + // callback(error); + // } else { + // callback(null, data.rows); + // } + // }) + // } + }, + function (error, results) { if (error) { - callback(error); + cb(error); } else { - callback(null, data.rows); + cb(null, results); } - }); + }, + ); + }, + ], + function (error, results) { + if (error) { + return larkin.error(req, res, next, error, 500); + } + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + compact: true, }, - - map_units: function(callback) { - larkin.queryPg("burwell", sql.map_units.replace(/:scale/g, scale), [req.query.lng, req.query.lat], function(error, data) { - if (error) { - callback(error); - } else { - callback(null, data.rows); - } - }) + { + data: results, }, - // - // places: function(callback) { - // larkin.queryPg("rockd", sql.places, ['SRID=4326;POINT(' + req.query.lng + ' ' + req.query.lat + ')'], function(error, data) { - // if (error) { - // callback(error); - // } else { - // callback(null, data.rows); - // } - // }) - // } - }, function(error, results) { - if (error) { - cb(error) - } else { - cb(null, results) - } - }) - } - ], function(error, results) { - if (error) { - return larkin.error(req, res, next, error, 500) - } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true - }, { - data: results - }); - }) -} + ); + }, + ); +}; diff --git a/v2/geologic_units_burwell_points.ts b/v2/geologic_units_burwell_points.ts index 83cb0c9b..35bfeb80 100644 --- a/v2/geologic_units_burwell_points.ts +++ b/v2/geologic_units_burwell_points.ts @@ -1,55 +1,82 @@ -var api = require('./api') -var larkin = require('./larkin') -var dbgeo = require('dbgeo') +var api = require("./api"); +var larkin = require("./larkin"); +var dbgeo = require("dbgeo"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var where = [] - var params = [] - var limit = '' + var where = []; + var params = []; + var limit = ""; - if ('sample' in req.query) { - limit = ' LIMIT 5' + if ("sample" in req.query) { + limit = " LIMIT 5"; } else { - limit = '' + limit = ""; } if (req.query.point_id) { - where.push('point_id = ANY($' + (where.length + 1) + ')') - params.push(larkin.parseMultipleIds(req.query.point_id)) + where.push("point_id = ANY($" + (where.length + 1) + ")"); + params.push(larkin.parseMultipleIds(req.query.point_id)); } if (req.query.point_type) { - where.push('point_type = ANY($' + (where.length + 1) + ')') - params.push(larkin.parseMultipleStrings(req.query.point_type)) + where.push("point_type = ANY($" + (where.length + 1) + ")"); + params.push(larkin.parseMultipleStrings(req.query.point_type)); } if (req.query.certainty) { - where.push('certainty ILIKE $' + (where.length + 1)) - params.push('%' + req.query.certainty + '%') + where.push("certainty ILIKE $" + (where.length + 1)); + params.push("%" + req.query.certainty + "%"); } if (req.query.comments) { - where.push('comments ILIKE $' + (where.length + 1)) - params.push('%' + req.query.comments + '%') + where.push("comments ILIKE $" + (where.length + 1)); + params.push("%" + req.query.comments + "%"); } if (req.query.source_id) { - where.push('source_id = ANY($' + (where.length + 1) + ')') - params.push(larkin.parseMultipleIds(req.query.source_id)) + where.push("source_id = ANY($" + (where.length + 1) + ")"); + params.push(larkin.parseMultipleIds(req.query.source_id)); } - if (req.query.minlat && req.query.minlng && req.query.maxlat && req.query.maxlng) { - where.push('ST_Intersects(geom, ST_Envelope(ST_GeomFromText($' + (where.length + 1) + ')))') - params.push('SRID=4326;LINESTRING(' + req.query.minlng + ' ' + req.query.minlat + ',' + req.query.maxlng + ' ' + req.query.maxlat + ')') + if ( + req.query.minlat && + req.query.minlng && + req.query.maxlat && + req.query.maxlng + ) { + where.push( + "ST_Intersects(geom, ST_Envelope(ST_GeomFromText($" + + (where.length + 1) + + ")))", + ); + params.push( + "SRID=4326;LINESTRING(" + + req.query.minlng + + " " + + req.query.minlat + + "," + + req.query.maxlng + + " " + + req.query.maxlat + + ")", + ); } if (!where.length && !limit.length) { - return larkin.error(req, res, next, 'No valid query parameters passed', 400) + return larkin.error( + req, + res, + next, + "No valid query parameters passed", + 400, + ); } else if (!where.length && limit.length) { - where = '' + where = ""; } else { - where = 'WHERE ' + where.join(' AND ') + where = "WHERE " + where.join(" AND "); } - larkin.queryPg('burwell', ` + larkin.queryPg( + "burwell", + ` SELECT point_id, strike, @@ -64,38 +91,66 @@ module.exports = function(req, res, next) { FROM points.points ${where} ${limit} - `, params, function(error, result) { - if (error) { - console.log(error) - return larkin.error(req, res, next, 'Something went wrong', 500) - } + `, + params, + function (error, result) { + if (error) { + console.log(error); + return larkin.error(req, res, next, "Something went wrong", 500); + } - if (req.query.format && req.query.format === 'csv') { - larkin.sendData(req, res, next, { - format: 'csv', - bare: true, - refs: 'source_id' - }, { - data: result.rows - }) - } else { - dbgeo.parse(result.rows, { - outputFormat: (req.query.format && api.acceptedFormats.geo[req.query.format]) ? larkin.getOutputFormat(req.query.format) : 'geojson', - geometryType: 'll', - geometryColumn: ['longitude', 'latitude'], - precision: 6 - }, function(error, output) { - if (error) { - return larkin.error(req, res, next, 'An error occurred while parsing the output', 500) - } - larkin.sendData(req, res, next, { - format: 'json', - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'source_id' - }, { - data: output - }) - }) - } - }) -} + if (req.query.format && req.query.format === "csv") { + larkin.sendData( + req, + res, + next, + { + format: "csv", + bare: true, + refs: "source_id", + }, + { + data: result.rows, + }, + ); + } else { + dbgeo.parse( + result.rows, + { + outputFormat: + req.query.format && api.acceptedFormats.geo[req.query.format] + ? larkin.getOutputFormat(req.query.format) + : "geojson", + geometryType: "ll", + geometryColumn: ["longitude", "latitude"], + precision: 6, + }, + function (error, output) { + if (error) { + return larkin.error( + req, + res, + next, + "An error occurred while parsing the output", + 500, + ); + } + larkin.sendData( + req, + res, + next, + { + format: "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + refs: "source_id", + }, + { + data: output, + }, + ); + }, + ); + } + }, + ); +}; diff --git a/v2/geologic_units_gmna.ts b/v2/geologic_units_gmna.ts index ff770740..12505d88 100644 --- a/v2/geologic_units_gmna.ts +++ b/v2/geologic_units_gmna.ts @@ -1,21 +1,24 @@ var api = require("./api"), - async = require("async"), - wellknown = require("wellknown"), - gp = require("geojson-precision"), - dbgeo = require("dbgeo"), - larkin = require("./larkin"); + async = require("async"), + wellknown = require("wellknown"), + gp = require("geojson-precision"), + dbgeo = require("dbgeo"), + larkin = require("./larkin"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { larkin.info(req, res, next); } else { - var geo = (req.query.format && api.acceptedFormats.geo[req.query.format]) ? true : false; + var geo = + req.query.format && api.acceptedFormats.geo[req.query.format] + ? true + : false; var where = [], - params = [], - limit = ("sample" in req.query) ? " LIMIT 5" : "", - geomField = ((geo) ? ", ST_AsGeoJSON(geom) AS geometry" : ""), - from = ""; + params = [], + limit = "sample" in req.query ? " LIMIT 5" : "", + geomField = geo ? ", ST_AsGeoJSON(geom) AS geometry" : "", + from = ""; if (req.query.gid && req.query.gid != "undefined") { where.push(" gid = $" + (where.length + 1)); @@ -23,24 +26,50 @@ module.exports = function(req, res, next) { } if (req.query.lat && req.query.lng) { - where.push(" ST_Contains(geom, ST_GeomFromText($" + (where.length + 1)+ ", 4326))"); - params.push("POINT(" + larkin.normalizeLng(req.query.lng) + " " + req.query.lat + ")"); + where.push( + " ST_Contains(geom, ST_GeomFromText($" + + (where.length + 1) + + ", 4326))", + ); + params.push( + "POINT(" + + larkin.normalizeLng(req.query.lng) + + " " + + req.query.lat + + ")", + ); } if (req.query.interval_name) { - where.push(" max_age <= (SELECT age_bottom FROM macrostrat.intervals WHERE interval_name = $" + (where.length + 1) + ") AND min_age >= (SELECT age_top FROM macrostrat.intervals WHERE interval_name = $" + (where.length + 2) + ")"); + where.push( + " max_age <= (SELECT age_bottom FROM macrostrat.intervals WHERE interval_name = $" + + (where.length + 1) + + ") AND min_age >= (SELECT age_top FROM macrostrat.intervals WHERE interval_name = $" + + (where.length + 2) + + ")", + ); params.push(req.query.interval_name, req.query.interval_name); } if (req.query.shape) { - var buffer = (req.query.buffer && !isNaN(parseInt(req.query.buffer))) ? parseInt(req.query.buffer)*1000 : 1; + var buffer = + req.query.buffer && !isNaN(parseInt(req.query.buffer)) + ? parseInt(req.query.buffer) * 1000 + : 1; - from += ", (SELECT ST_Buffer((ST_Segmentize($" + (where.length + 1) + "::geography, 100000)::geometry)::geography, $" + (where.length + 2) + ")::geometry AS buffer) shape" + from += + ", (SELECT ST_Buffer((ST_Segmentize($" + + (where.length + 1) + + "::geography, 100000)::geometry)::geography, $" + + (where.length + 2) + + ")::geometry AS buffer) shape"; where.push("ST_Intersects(geom, buffer) is true"); params.push(req.query.shape, buffer); - geomField = ((geo) ? ", ST_AsGeoJSON(ST_Intersection(ST_Buffer(geom, 0)::geography, buffer)) AS geometry" : ""); + geomField = geo + ? ", ST_AsGeoJSON(ST_Intersection(ST_Buffer(geom, 0)::geography, buffer)) AS geometry" + : ""; } if (where.length < 1 && !("sample" in req.query)) { @@ -51,40 +80,71 @@ module.exports = function(req, res, next) { where = " WHERE " + where.join(", "); } - larkin.queryPg("geomacro", "SELECT gid, unit_abbre, COALESCE(rocktype, '') AS rocktype, COALESCE(lithology, '') AS lith, lith_type, lith_class, min_interval AS t_interval, min_age::float AS t_age, max_interval AS b_interval, max_age::float AS b_age, containing_interval, interval_color AS color" + geomField + " FROM gmna.lookup_units" + from + where + limit, params, function(error, result) { - if (error) { - larkin.error(req, res, next, error); - } else { - if (geo) { - dbgeo.parse(result.rows, { - "geometryType": "geojson", - "geometryColumn": "geometry", - "outputFormat": larkin.getOutputFormat(req.query.format) - }, function(error, result) { - if (error) { - larkin.error(req, res, next, error); - } else { - if (larkin.getOutputFormat(req.query.format) === "geojson") { - result = gp(result, 5); - } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: result - }); - } - } - ); + larkin.queryPg( + "geomacro", + "SELECT gid, unit_abbre, COALESCE(rocktype, '') AS rocktype, COALESCE(lithology, '') AS lith, lith_type, lith_class, min_interval AS t_interval, min_age::float AS t_age, max_interval AS b_interval, max_age::float AS b_age, containing_interval, interval_color AS color" + + geomField + + " FROM gmna.lookup_units" + + from + + where + + limit, + params, + function (error, result) { + if (error) { + larkin.error(req, res, next, error); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: result.rows - }); + if (geo) { + dbgeo.parse( + result.rows, + { + geometryType: "geojson", + geometryColumn: "geometry", + outputFormat: larkin.getOutputFormat(req.query.format), + }, + function (error, result) { + if (error) { + larkin.error(req, res, next, error); + } else { + if (larkin.getOutputFormat(req.query.format) === "geojson") { + result = gp(result, 5); + } + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + }, + { + data: result, + }, + ); + } + }, + ); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: result.rows, + }, + ); + } } - } - }); + }, + ); } -} +}; diff --git a/v2/geologic_units_gmus.ts b/v2/geologic_units_gmus.ts index 9f1fb0e2..ac7c6fce 100644 --- a/v2/geologic_units_gmus.ts +++ b/v2/geologic_units_gmus.ts @@ -1,187 +1,295 @@ var api = require("./api"), - async = require("async"), - wellknown = require("wellknown"), - gp = require("geojson-precision"), - buffer = require("turf-buffer"), - area = require("turf-area"), - dbgeo = require("dbgeo"), - larkin = require("./larkin"); - -module.exports = function(req, res, next) { + async = require("async"), + wellknown = require("wellknown"), + gp = require("geojson-precision"), + buffer = require("turf-buffer"), + area = require("turf-area"), + dbgeo = require("dbgeo"), + larkin = require("./larkin"); + +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { larkin.info(req, res, next); } else { - var geo = (req.query.format && api.acceptedFormats.geo[req.query.format]) ? true : false; + var geo = + req.query.format && api.acceptedFormats.geo[req.query.format] + ? true + : false; var where = [], - params = [], - limit = ("sample" in req.query) ? " LIMIT 5" : "", - from = "gmus.lookup_units lu JOIN gmus.ages a ON lu.unit_link = a.unit_link LEFT JOIN gmus.liths l ON lu.unit_link = l.unit_link LEFT JOIN gmus.best_geounits_macrounits gm ON lu.gid = gm.geologic_unit_gid", - geomQuery = ((geo) ? ", ST_AsGeoJSON(geom) AS geometry" : ""), - orderBy = ""; - - async.parallel([ - function(callback) { - if (req.query.lat && req.query.lng) { - if (req.query.adjacents === "true") { - where.push("gid = ANY (SELECT unnest(array_append(touches, (SELECT gid FROM gmus.lookup_units WHERE ST_Contains(geom, ST_GeomFromText($" + (where.length) + 1 + ", 4326))))) FROM gmus.adjacents WHERE geologic_unit_gid = (SELECT gid FROM gmus.lookup_units WHERE ST_Contains(geom, ST_GeomFromText($" + (where.length) + 1 + ", 4326))))"); - params.push("POINT(" + larkin.normalizeLng(req.query.lng) + " " + req.query.lat + ")"); - orderBy += " )a ORDER BY ST_Distance(geom, ST_GeomFromText($" + where.length + ", 4326))"; - } else { - where.push(" ST_Contains(geom, ST_GeomFromText($" + (where.length + 1) + ", 4326))"); - params.push("POINT(" + larkin.normalizeLng(req.query.lng) + " " + req.query.lat + ")"); + params = [], + limit = "sample" in req.query ? " LIMIT 5" : "", + from = + "gmus.lookup_units lu JOIN gmus.ages a ON lu.unit_link = a.unit_link LEFT JOIN gmus.liths l ON lu.unit_link = l.unit_link LEFT JOIN gmus.best_geounits_macrounits gm ON lu.gid = gm.geologic_unit_gid", + geomQuery = geo ? ", ST_AsGeoJSON(geom) AS geometry" : "", + orderBy = ""; + + async.parallel( + [ + function (callback) { + if (req.query.lat && req.query.lng) { + if (req.query.adjacents === "true") { + where.push( + "gid = ANY (SELECT unnest(array_append(touches, (SELECT gid FROM gmus.lookup_units WHERE ST_Contains(geom, ST_GeomFromText($" + + where.length + + 1 + + ", 4326))))) FROM gmus.adjacents WHERE geologic_unit_gid = (SELECT gid FROM gmus.lookup_units WHERE ST_Contains(geom, ST_GeomFromText($" + + where.length + + 1 + + ", 4326))))", + ); + params.push( + "POINT(" + + larkin.normalizeLng(req.query.lng) + + " " + + req.query.lat + + ")", + ); + orderBy += + " )a ORDER BY ST_Distance(geom, ST_GeomFromText($" + + where.length + + ", 4326))"; + } else { + where.push( + " ST_Contains(geom, ST_GeomFromText($" + + (where.length + 1) + + ", 4326))", + ); + params.push( + "POINT(" + + larkin.normalizeLng(req.query.lng) + + " " + + req.query.lat + + ")", + ); + } } - } - callback(null); - }, + callback(null); + }, - function(callback) { - if (req.query.gid && req.query.gid != "undefined") { - if (req.query.adjacents === "true") { - where.push("gid = $" + (where.length + 1) + " OR gid = ANY (SELECT unnest(touches) from gmus.adjacents where geologic_unit_gid = $" + (where.length + 1) + ")"); - params.push(req.query.gid); - } else { - where.push("gid = $" + (where.length + 1)); - params.push(req.query.gid); + function (callback) { + if (req.query.gid && req.query.gid != "undefined") { + if (req.query.adjacents === "true") { + where.push( + "gid = $" + + (where.length + 1) + + " OR gid = ANY (SELECT unnest(touches) from gmus.adjacents where geologic_unit_gid = $" + + (where.length + 1) + + ")", + ); + params.push(req.query.gid); + } else { + where.push("gid = $" + (where.length + 1)); + params.push(req.query.gid); + } } - } - callback(null); - }, + callback(null); + }, - function(callback) { - // Need to go down the hierarchy! - if (req.query.strat_name_id) { - req.query.rule = "down"; - require("./definitions/strat_names")(req, null, null, function(error, result) { - var strat_name_ids = result.map(function(d) { return d.strat_name_id }); + function (callback) { + // Need to go down the hierarchy! + if (req.query.strat_name_id) { + req.query.rule = "down"; + require("./definitions/strat_names")( + req, + null, + null, + function (error, result) { + var strat_name_ids = result.map(function (d) { + return d.strat_name_id; + }); - where.push("gm.best_names && $" + (where.length + 1) + "::int[]"); - params.push(strat_name_ids); + where.push( + "gm.best_names && $" + (where.length + 1) + "::int[]", + ); + params.push(strat_name_ids); + callback(null); + }, + ); + } else { callback(null); - }); - } else { - callback(null); - } - }, - - function(callback) { - if (req.query.unit_id) { - var unit_ids = larkin.parseMultipleIds(req.query.unit_id); + } + }, - where.push("gm.best_units && $" + (where.length + 1) + "::int[]"); - params.push(unit_ids); - } + function (callback) { + if (req.query.unit_id) { + var unit_ids = larkin.parseMultipleIds(req.query.unit_id); - callback(null); - }, + where.push("gm.best_units && $" + (where.length + 1) + "::int[]"); + params.push(unit_ids); + } - function(callback) { - if (req.query.search) { - where.push("text_search @@ plainto_tsquery('macro', $" + (where.length + 1) + ")") - params.push(req.query.search); - } + callback(null); + }, - callback(null); - }, + function (callback) { + if (req.query.search) { + where.push( + "text_search @@ plainto_tsquery('macro', $" + + (where.length + 1) + + ")", + ); + params.push(req.query.search); + } - function(callback) { - if (req.query.interval_name) { - where.push("macro_b_age <= (SELECT age_bottom FROM macrostrat.intervals WHERE interval_name = $" + (where.length + 1) + ") AND macro_t_age >= (SELECT age_top FROM macrostrat.intervals WHERE interval_name = $" + (where.length + 2) + ")"); - params.push(req.query.interval_name, req.query.interval_name); - } + callback(null); + }, - callback(null); - }, + function (callback) { + if (req.query.interval_name) { + where.push( + "macro_b_age <= (SELECT age_bottom FROM macrostrat.intervals WHERE interval_name = $" + + (where.length + 1) + + ") AND macro_t_age >= (SELECT age_top FROM macrostrat.intervals WHERE interval_name = $" + + (where.length + 2) + + ")", + ); + params.push(req.query.interval_name, req.query.interval_name); + } - function(callback) { - if (req.query.unit_link) { - where.push(" lu.unit_link = $" + (where.length + 1)); - params.push(req.query.unit_link); - } + callback(null); + }, - callback(null); - }, + function (callback) { + if (req.query.unit_link) { + where.push(" lu.unit_link = $" + (where.length + 1)); + params.push(req.query.unit_link); + } - function(callback) { - if (req.query.shape) { + callback(null); + }, - var bufferSize = (req.query.buffer && !isNaN(parseInt(req.query.buffer))) ? parseInt(req.query.buffer)*1000 : 1; + function (callback) { + if (req.query.shape) { + var bufferSize = + req.query.buffer && !isNaN(parseInt(req.query.buffer)) + ? parseInt(req.query.buffer) * 1000 + : 1; - // Convert shape + buffer to geojson - var geojson = wellknown(decodeURI(req.query.shape)), + // Convert shape + buffer to geojson + var geojson = wellknown(decodeURI(req.query.shape)), bufferedGeojson = buffer(geojson, bufferSize, "kilometers"), - totalArea = area(bufferedGeojson)*0.000001; + totalArea = area(bufferedGeojson) * 0.000001; + // Test area + if (totalArea > 1000000000) { + return larkin.error( + req, + res, + next, + "Area too large. Please select a smaller area.", + ); + } - // Test area - if (totalArea > 1000000000) { - return larkin.error(req, res, next, "Area too large. Please select a smaller area."); + from = + "subset lu JOIN gmus.ages a ON lu.unit_link = a.unit_link LEFT JOIN gmus.liths l ON lu.unit_link = l.unit_link LEFT JOIN gmus.best_geounits_macrounits gm ON lu.gid = gm.geologic_unit_gid, linestring"; + where.push("ST_Intersects(geom, buffer) is true"); + geomQuery = geo + ? ", ST_AsGeoJSON(ST_Intersection(ST_Buffer(geom, 0)::geography, buffer)) AS geometry" + : ""; + params.push(req.query.shape, bufferSize); } + callback(null); + }, + ], + function () { + if (where.length < 1 && !("sample" in req.query)) { + return larkin.error(req, res, next, "Invalid params"); + } + + if (where.length > 0) { + where = " WHERE " + where.join(", "); + } - from = "subset lu JOIN gmus.ages a ON lu.unit_link = a.unit_link LEFT JOIN gmus.liths l ON lu.unit_link = l.unit_link LEFT JOIN gmus.best_geounits_macrounits gm ON lu.gid = gm.geologic_unit_gid, linestring"; - where.push("ST_Intersects(geom, buffer) is true"); - geomQuery = (geo) ? ", ST_AsGeoJSON(ST_Intersection(ST_Buffer(geom, 0)::geography, buffer)) AS geometry" : "" - params.push(req.query.shape, bufferSize); + // Some things if querying by lat/lng + var sql = + orderBy.length > 0 + ? "SELECT gid, area, unit_link, lithology, rocktype, macro_units, t_int_id, t_age, b_int_id, b_age, containing_interval, interval_color, unit_com, unit_name, unitdesc, strat_unit" + + (geo ? ", geometry" : "") + + " FROM (" + : ""; + if (req.query.shape) { + sql += + "WITH linestring AS (SELECT ST_Buffer((ST_Segmentize($" + + (params.length - 1) + + "::geography, 100000)::geometry)::geography, $" + + params.length + + ")::geometry AS buffer), states AS (SELECT postal FROM us_states WHERE ST_Intersects(geom::geography, (SELECT buffer FROM linestring))), subset AS (SELECT * FROM gmus.lookup_units WHERE upper(state) in (SELECT postal FROM states))"; } - callback(null); - - } - - ], function() { - if (where.length < 1 && !("sample" in req.query)) { - return larkin.error(req, res, next, "Invalid params"); - } - - if (where.length > 0) { - where = " WHERE " + where.join(", "); - } - - // Some things if querying by lat/lng - var sql = (orderBy.length > 0) ? ("SELECT gid, area, unit_link, lithology, rocktype, macro_units, t_int_id, t_age, b_int_id, b_age, containing_interval, interval_color, unit_com, unit_name, unitdesc, strat_unit" + ((geo) ? ", geometry" : "") + " FROM (") : ""; - - if (req.query.shape) { - sql += "WITH linestring AS (SELECT ST_Buffer((ST_Segmentize($" + (params.length - 1) + "::geography, 100000)::geometry)::geography, $" + (params.length) + ")::geometry AS buffer), states AS (SELECT postal FROM us_states WHERE ST_Intersects(geom::geography, (SELECT buffer FROM linestring))), subset AS (SELECT * FROM gmus.lookup_units WHERE upper(state) in (SELECT postal FROM states))" - } - - sql += "SELECT DISTINCT ON (gid) gid, lu.area_km2::int AS area, lu.unit_link, macro_color AS interval_color, (SELECT array_agg(liths) FROM unnest(array[lith1, lith2, lith3, lith4, lith5]) liths WHERE liths IS NOT null) AS lithology, (SELECT array_agg(DISTINCT rocktypes) FROM unnest(array[rocktype1, rocktype2, u_rocktype1, u_rocktype2, u_rocktype3]) rocktypes WHERE rocktypes IS NOT null) AS rocktype, COALESCE(gm.best_units, '{}') AS macro_units, COALESCE(gm.best_names, '{}') AS strat_names, lu.min_interval_name AS t_int_id, lu.age_top::float AS t_age, lu.max_interval_name as b_int_id, lu.age_bottom::float AS b_age, lu.containing_interval_name AS containing_interval, unit_com, unit_name, unitdesc, COALESCE(strat_unit, '') AS strat_unit, macro_color AS color" + ((orderBy.length > 0) ? ", geom" : "") + geomQuery + " FROM " + from + where + orderBy + limit; - - larkin.queryPg("geomacro", sql, params, function(error, result) { - if (error) { - larkin.error(req, res, next, error); - } else { - if (geo) { - dbgeo.parse(result.rows, { - "geometryType": "geojson", - "geometryColumn": "geometry", - "outputFormat": larkin.getOutputFormat(req.query.format) - }, function(error, result) { - if (error) { - larkin.error(req, res, next, error); - } else { - if (larkin.getOutputFormat(req.query.format) === "geojson") { - result = gp(result, 5); - } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: result - }); - } - } - ); + + sql += + "SELECT DISTINCT ON (gid) gid, lu.area_km2::int AS area, lu.unit_link, macro_color AS interval_color, (SELECT array_agg(liths) FROM unnest(array[lith1, lith2, lith3, lith4, lith5]) liths WHERE liths IS NOT null) AS lithology, (SELECT array_agg(DISTINCT rocktypes) FROM unnest(array[rocktype1, rocktype2, u_rocktype1, u_rocktype2, u_rocktype3]) rocktypes WHERE rocktypes IS NOT null) AS rocktype, COALESCE(gm.best_units, '{}') AS macro_units, COALESCE(gm.best_names, '{}') AS strat_names, lu.min_interval_name AS t_int_id, lu.age_top::float AS t_age, lu.max_interval_name as b_int_id, lu.age_bottom::float AS b_age, lu.containing_interval_name AS containing_interval, unit_com, unit_name, unitdesc, COALESCE(strat_unit, '') AS strat_unit, macro_color AS color" + + (orderBy.length > 0 ? ", geom" : "") + + geomQuery + + " FROM " + + from + + where + + orderBy + + limit; + + larkin.queryPg("geomacro", sql, params, function (error, result) { + if (error) { + larkin.error(req, res, next, error); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: result.rows - }); + if (geo) { + dbgeo.parse( + result.rows, + { + geometryType: "geojson", + geometryColumn: "geometry", + outputFormat: larkin.getOutputFormat(req.query.format), + }, + function (error, result) { + if (error) { + larkin.error(req, res, next, error); + } else { + if ( + larkin.getOutputFormat(req.query.format) === "geojson" + ) { + result = gp(result, 5); + } + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + }, + { + data: result, + }, + ); + } + }, + ); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + }, + { + data: result.rows, + }, + ); + } } - } - }); - }); + }); + }, + ); } -} +}; diff --git a/v2/grids/index.ts b/v2/grids/index.ts index a7ba2ae0..f2118adf 100644 --- a/v2/grids/index.ts +++ b/v2/grids/index.ts @@ -2,25 +2,18 @@ var express = require("express"); var grids = express.Router(); var larkin = require("../larkin"); -grids.route("/") - .get(function(req, res, next) { - larkin.defineCategory("grids", function(error, routes) { - res.json({ - "success": routes - }); +grids.route("/").get(function (req, res, next) { + larkin.defineCategory("grids", function (error, routes) { + res.json({ + success: routes, }); - } -); + }); +}); +grids.route("/latitude").get(require("./latitude")); -grids.route("/latitude") - .get(require("./latitude")); +grids.route("/longitude").get(require("./longitude")); -grids.route("/longitude") - .get(require("./longitude")); +grids.route("/lithologies").get(require("./lithologies")); -grids.route("/lithologies") - .get(require("./lithologies")); - - -module.exports = grids; +module.exports = grids; diff --git a/v2/grids/latitude.ts b/v2/grids/latitude.ts index 9fc2a43c..a5e7205d 100644 --- a/v2/grids/latitude.ts +++ b/v2/grids/latitude.ts @@ -1,24 +1,38 @@ var api = require("../api"), - larkin = require("../larkin"), - topojson = require("topojson"), - grid = require("brute-force-equal-area"); + larkin = require("../larkin"), + topojson = require("topojson"), + grid = require("brute-force-equal-area"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (!req.query || !req.query.lngSpacing || !req.query.latSpacing) { return larkin.info(req, res, next); } - grid.latitude(parseFloat(req.query.lngSpacing), parseFloat(req.query.latSpacing), function(geojson) { - if (req.query.format === "topojson" || req.query.format === "topojson_bare") { - geojson = topojson.topology({grid: geojson}); - } + grid.latitude( + parseFloat(req.query.lngSpacing), + parseFloat(req.query.latSpacing), + function (geojson) { + if ( + req.query.format === "topojson" || + req.query.format === "topojson_bare" + ) { + geojson = topojson.topology({ grid: geojson }); + } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: geojson - }); - }); - -} + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: geojson, + }, + ); + }, + ); +}; diff --git a/v2/grids/lithologies.ts b/v2/grids/lithologies.ts index b8e39810..60513350 100644 --- a/v2/grids/lithologies.ts +++ b/v2/grids/lithologies.ts @@ -1,127 +1,175 @@ var api = require("../api"), - larkin = require("../larkin"), - grid = require("brute-force-equal-area"), - crypto = require("crypto"), - dbgeo = require("dbgeo"), - async = require("async"); + larkin = require("../larkin"), + grid = require("brute-force-equal-area"), + crypto = require("crypto"), + dbgeo = require("dbgeo"), + async = require("async"); // via http://blog.tompawlak.org/how-to-generate-random-values-nodejs-javascript function randomString() { - var chars = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789"; - var rnd = crypto.randomBytes(10), - value = new Array(10), - len = chars.length; + var chars = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789"; + var rnd = crypto.randomBytes(10), + value = new Array(10), + len = chars.length; - for (var i = 0; i < 10; i++) { - value[i] = chars[rnd[i] % len]; - } + for (var i = 0; i < 10; i++) { + value[i] = chars[rnd[i] % len]; + } - return value.join(''); + return value.join(""); } - -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (!req.query || !req.query.lngSpacing || !req.query.latSpacing) { return larkin.info(req, res, next); } - var origin = (req.query.orginLat && req.query.originLng) ? [req.query.originLng, req.query.originLat] : [0,0]; - - async.waterfall([ - // Create grid using parameters - function(callback) { - console.log('step 1 - create grid'); - grid.variable(parseFloat(req.query.lngSpacing), parseFloat(req.query.latSpacing), origin, function(geojson) { - callback(null, geojson); - }); - }, - - // Create table - function(grid, callback) { - console.log('step 2 - create table'); - // Create a unique hash key - var table = randomString(); - - larkin.queryPg("burwell", "CREATE TABLE " + table + " (id integer, geom geometry)", [], function(error) { - if (error) { - callback(error); - } - callback(null, grid, table); - }); - }, - - // Insert geojson - function(grid, table, callback) { - console.log('step 3 - insert geojson'); - async.eachLimit(grid.features, 10, function(cell, callback) { - cell.geometry.crs = {"type": "name", "properties": {"name": "EPSG:4326"}}; - - larkin.queryPg("burwell", "INSERT INTO " + table + " (id, geom) VALUES ($1, ST_GeomFromGeoJSON($2))", [cell.properties.id, cell.geometry], function(error) { - if (error) { - callback(error); - } - callback(null); - }) - }, function(error) { - if (error) { - callback(error); - } - callback(null, table); - }); - }, - - // Create spatial index on temp table - function(table, callback) { - console.log('step 3.5 - spatially index temp table'); - larkin.queryPg("burwell", "CREATE INDEX ON " + table + " USING GiST (geom)", [], function(error) { - callback(null, table); - }); - }, - - // Update the table with lithologies - function(table, callback) { - console.log('step 4 - update table with lithologies'); - }, - - // Select the geojson cells that intersect the envelope of the target dataset - function(table, callback) { - larkin.queryPg("burwell", "SELECT id, ST_AsGeoJSON(geom) AS geometry FROM " + table, [], function(error, result) { - if (error) { - callback(error); - } - dbgeo.parse({ - "outputFormat": larkin.getOutputFormat(req.query.format), - "data": result.rows - }, function(error, geojson) { - if (error) { - callback(error); - } - callback(null, geojson, table); + var origin = + req.query.orginLat && req.query.originLng + ? [req.query.originLng, req.query.originLat] + : [0, 0]; + + async.waterfall( + [ + // Create grid using parameters + function (callback) { + console.log("step 1 - create grid"); + grid.variable( + parseFloat(req.query.lngSpacing), + parseFloat(req.query.latSpacing), + origin, + function (geojson) { + callback(null, geojson); + }, + ); + }, + + // Create table + function (grid, callback) { + console.log("step 2 - create table"); + // Create a unique hash key + var table = randomString(); + + larkin.queryPg( + "burwell", + "CREATE TABLE " + table + " (id integer, geom geometry)", + [], + function (error) { + if (error) { + callback(error); + } + callback(null, grid, table); + }, + ); + }, + + // Insert geojson + function (grid, table, callback) { + console.log("step 3 - insert geojson"); + async.eachLimit( + grid.features, + 10, + function (cell, callback) { + cell.geometry.crs = { + type: "name", + properties: { name: "EPSG:4326" }, + }; + + larkin.queryPg( + "burwell", + "INSERT INTO " + + table + + " (id, geom) VALUES ($1, ST_GeomFromGeoJSON($2))", + [cell.properties.id, cell.geometry], + function (error) { + if (error) { + callback(error); + } + callback(null); + }, + ); + }, + function (error) { + if (error) { + callback(error); + } + callback(null, table); + }, + ); + }, + + // Create spatial index on temp table + function (table, callback) { + console.log("step 3.5 - spatially index temp table"); + larkin.queryPg( + "burwell", + "CREATE INDEX ON " + table + " USING GiST (geom)", + [], + function (error) { + callback(null, table); + }, + ); + }, + + // Update the table with lithologies + function (table, callback) { + console.log("step 4 - update table with lithologies"); + }, + + // Select the geojson cells that intersect the envelope of the target dataset + function (table, callback) { + larkin.queryPg( + "burwell", + "SELECT id, ST_AsGeoJSON(geom) AS geometry FROM " + table, + [], + function (error, result) { + if (error) { + callback(error); + } + dbgeo.parse( + { + outputFormat: larkin.getOutputFormat(req.query.format), + data: result.rows, + }, + function (error, geojson) { + if (error) { + callback(error); + } + callback(null, geojson, table); + }, + ); + }, + ); + }, + + // Drop the temp table + function (grid, table, callback) { + larkin.queryPg("burwell", "DROP TABLE " + table, [], function (error) { + callback(null, grid); }); - }); + }, + ], + + // return geo/topojson or error + function (error, result) { + if (error) { + console.log(error); + } + + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: result, + }, + ); }, - - // Drop the temp table - function(grid, table, callback) { - larkin.queryPg("burwell", "DROP TABLE " + table, [], function(error) { - callback(null, grid); - }); - } - - ], - - // return geo/topojson or error - function(error, result) { - if (error) { - console.log(error); - } - - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: result - }); - }); - -} + ); +}; diff --git a/v2/grids/longitude.ts b/v2/grids/longitude.ts index 067ffbd2..edd4adb0 100644 --- a/v2/grids/longitude.ts +++ b/v2/grids/longitude.ts @@ -1,24 +1,38 @@ var api = require("../api"), - larkin = require("../larkin"), - topojson = require("topojson"), - grid = require("brute-force-equal-area"); + larkin = require("../larkin"), + topojson = require("topojson"), + grid = require("brute-force-equal-area"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (!req.query.latSpacing || !req.query.cellArea) { return larkin.info(req, res, next); } - grid.longitude(parseFloat(req.query.latSpacing), parseFloat(req.query.cellArea), function(geojson) { - if (req.query.format === "topojson" || req.query.format === "topojson_bare") { - geojson = topojson.topology({grid: geojson}); - } + grid.longitude( + parseFloat(req.query.latSpacing), + parseFloat(req.query.cellArea), + function (geojson) { + if ( + req.query.format === "topojson" || + req.query.format === "topojson_bare" + ) { + geojson = topojson.topology({ grid: geojson }); + } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: geojson - }); - }); - -} + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: geojson, + }, + ); + }, + ); +}; diff --git a/v2/hex_summary.ts b/v2/hex_summary.ts index ee7901d4..1496efe7 100644 --- a/v2/hex_summary.ts +++ b/v2/hex_summary.ts @@ -1,4 +1,4 @@ -const larkin = require('./larkin') +const larkin = require("./larkin"); const scaleMap = { 0: 7, @@ -11,48 +11,65 @@ const scaleMap = { 7: 12, 8: 12, 9: 12, - 10: 12 -} + 10: 12, +}; // Requires a zoom, min_lng, min_lat, max_lng, max_lat module.exports = (req, res, next) => { if (!req.query.zoom) { - return larkin.error(req, res, next, 'A zoom paramter is required', 400) + return larkin.error(req, res, next, "A zoom paramter is required", 400); } if (!req.query.min_lng) { - return larkin.error(req, res, next, 'A minimum longitude is required', 400) + return larkin.error(req, res, next, "A minimum longitude is required", 400); } if (!req.query.min_lat) { - return larkin.error(req, res, next, 'A minimum latitude is required', 400) + return larkin.error(req, res, next, "A minimum latitude is required", 400); } if (!req.query.max_lng) { - return larkin.error(req, res, next, 'A maxiumum longitude is required', 400) + return larkin.error( + req, + res, + next, + "A maxiumum longitude is required", + 400, + ); } if (!req.query.max_lat) { - return larkin.error(req, res, next, 'A maximum latitude is required', 400) + return larkin.error(req, res, next, "A maximum latitude is required", 400); } - larkin.queryPg('burwell', ` + larkin.queryPg( + "burwell", + ` SELECT hexgrids.hex_id, count(collection_no) FROM hexgrids.hexgrids JOIN hexgrids.pbdb_index ON pbdb_index.hex_id = hexgrids.hex_id WHERE ST_Intersects(geom, ST_SetSRID(ST_MakeEnvelope($1, $2, $3, $4), 4326)) AND res = $5 GROUP BY hexgrids.hex_id - `, [ - parseFloat(req.query.min_lng), - parseFloat(req.query.min_lat), - parseFloat(req.query.max_lng), - parseFloat(req.query.max_lat), - scaleMap[parseInt(req.query.zoom)] - ], (error, result) => { - if (error) { - return larkin.error(req, res, next, 'Something went wrong', 500) - } - larkin.sendData(req, res, next, { - format: 'json', - compact: true - }, { - data: result.rows - }) - }) -} + `, + [ + parseFloat(req.query.min_lng), + parseFloat(req.query.min_lat), + parseFloat(req.query.max_lng), + parseFloat(req.query.max_lat), + scaleMap[parseInt(req.query.zoom)], + ], + (error, result) => { + if (error) { + return larkin.error(req, res, next, "Something went wrong", 500); + } + larkin.sendData( + req, + res, + next, + { + format: "json", + compact: true, + }, + { + data: result.rows, + }, + ); + }, + ); +}; diff --git a/v2/hex_summary_max.ts b/v2/hex_summary_max.ts index d0ed546b..ba22799f 100644 --- a/v2/hex_summary_max.ts +++ b/v2/hex_summary_max.ts @@ -1,4 +1,4 @@ -const larkin = require('./larkin') +const larkin = require("./larkin"); const scaleMap = { 0: 7, @@ -11,15 +11,17 @@ const scaleMap = { 7: 11, 8: 11, 9: 12, - 10: 12 -} + 10: 12, +}; // Requires a zoom, min_lng, min_lat, max_lng, max_lat module.exports = (req, res, next) => { if (!req.params.zoom) { - return larkin.error(req, res, next, 'A zoom paramter is required', 400) + return larkin.error(req, res, next, "A zoom paramter is required", 400); } - larkin.queryPg('burwell', ` + larkin.queryPg( + "burwell", + ` SELECT (avg(count) + stddev_pop(count)) AS max FROM ( SELECT hexgrids.hex_id, count(collection_no) AS count FROM hexgrids.hexgrids @@ -27,17 +29,24 @@ module.exports = (req, res, next) => { WHERE res = $1 GROUP BY hexgrids.hex_id ) sub - `, [ - scaleMap[parseInt(req.params.zoom)] - ], (error, result) => { - if (error) { - return larkin.error(req, res, next, 'Something went wrong', 500) - } - larkin.sendData(req, res, next, { - format: 'json', - compact: true - }, { - data: result.rows - }) - }) -} + `, + [scaleMap[parseInt(req.params.zoom)]], + (error, result) => { + if (error) { + return larkin.error(req, res, next, "Something went wrong", 500); + } + larkin.sendData( + req, + res, + next, + { + format: "json", + compact: true, + }, + { + data: result.rows, + }, + ); + }, + ); +}; diff --git a/v2/hillshade.ts b/v2/hillshade.ts index d224d278..0a30c371 100644 --- a/v2/hillshade.ts +++ b/v2/hillshade.ts @@ -1,118 +1,136 @@ -'use strict' -const api = require('./api') -const larkin = require('./larkin') -const buffer = require('@turf/buffer') -const envelope = require('@turf/envelope') -const hillshade = require('hillshadejs') -const hillshadeCache = require('./hillshadeCache') +"use strict"; +const api = require("./api"); +const larkin = require("./larkin"); +const buffer = require("@turf/buffer"); +const envelope = require("@turf/envelope"); +const hillshade = require("hillshadejs"); +const hillshadeCache = require("./hillshadeCache"); function big(coord) { let point = { - "type": "Point", - "coordinates": coord - } + type: "Point", + coordinates: coord, + }; - let bigBuffer = envelope(buffer(point, 22, 'miles')) - let smallBuffer = envelope(buffer(point, 12, 'miles')) + let bigBuffer = envelope(buffer(point, 22, "miles")); + let smallBuffer = envelope(buffer(point, 12, "miles")); - let minLngs = smallBuffer.geometry.coordinates[0].map(coords => { - return coords[0] - }) + let minLngs = smallBuffer.geometry.coordinates[0].map((coords) => { + return coords[0]; + }); - let minLng = Math.min.apply(null, minLngs) - let maxLng = Math.max.apply(null, minLngs) + let minLng = Math.min.apply(null, minLngs); + let maxLng = Math.max.apply(null, minLngs); - let maxLats = bigBuffer.geometry.coordinates[0].map(coords => { - return coords[1] - }) + let maxLats = bigBuffer.geometry.coordinates[0].map((coords) => { + return coords[1]; + }); - let minLat = Math.min.apply(null, maxLats) - let maxLat = Math.max.apply(null, maxLats) + let minLat = Math.min.apply(null, maxLats); + let maxLat = Math.max.apply(null, maxLats); - return[ minLng, minLat, maxLng, maxLat ] + return [minLng, minLat, maxLng, maxLat]; } function small(coord) { let point = { - "type": "Point", - "coordinates": coord - } + type: "Point", + coordinates: coord, + }; - let bigBuffer = envelope(buffer(point, 4, 'miles')) - let smallBuffer = envelope(buffer(point, 2, 'miles')) + let bigBuffer = envelope(buffer(point, 4, "miles")); + let smallBuffer = envelope(buffer(point, 2, "miles")); - let minLats = smallBuffer.geometry.coordinates[0].map(coords => { - return coords[1] - }) + let minLats = smallBuffer.geometry.coordinates[0].map((coords) => { + return coords[1]; + }); - let minLat = Math.min.apply(null, minLats) - let maxLat = Math.max.apply(null, minLats) + let minLat = Math.min.apply(null, minLats); + let maxLat = Math.max.apply(null, minLats); - let maxLngs = bigBuffer.geometry.coordinates[0].map(coords => { - return coords[0] - }) + let maxLngs = bigBuffer.geometry.coordinates[0].map((coords) => { + return coords[0]; + }); - let minMaxLng = Math.min.apply(null, maxLngs) - let maxMaxLng = Math.max.apply(null, maxLngs) + let minMaxLng = Math.min.apply(null, maxLngs); + let maxMaxLng = Math.max.apply(null, maxLngs); - return [ minMaxLng, minLat, maxMaxLng, maxLat ] + return [minMaxLng, minLat, maxMaxLng, maxLat]; } -const VALID_ASPECTS = ['small', 'big'] +const VALID_ASPECTS = ["small", "big"]; module.exports = (req, res, next) => { - if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - if ((!req.query.lat || !req.query.lng) && !('sample' in req.query)) { - return larkin.error(req, res, next, 'Invalid parameters', 401) + if ((!req.query.lat || !req.query.lng) && !("sample" in req.query)) { + return larkin.error(req, res, next, "Invalid parameters", 401); } - let lng = larkin.normalizeLng(req.query.lng) || -89.4 - let lat = parseFloat(req.query.lat) || 43.07 + let lng = larkin.normalizeLng(req.query.lng) || -89.4; + let lat = parseFloat(req.query.lat) || 43.07; - let aspect = (req.query.aspect) ? req.query.aspect : 'small' + let aspect = req.query.aspect ? req.query.aspect : "small"; if (VALID_ASPECTS.indexOf(aspect) === -1) { - aspect = 'small' + aspect = "small"; } // Check the cache hillshadeCache.get([lng, lat], aspect, (error, buffer) => { - if (error) { console.log(error)} + if (error) { + console.log(error); + } if (buffer) { - return larkin.sendImage(req, res, next, buffer, true) + return larkin.sendImage(req, res, next, buffer, true); } - let extent = (aspect === 'small') ? small([lng, lat]) : big([lng, lat]) - - hillshade(extent, { - zoom: (aspect === 'small') ? 12 : 10, - format: 'jpeg' - }, (error, jpeg) => { - if (error) { - console.log(error) - return larkin.error(req, res, next, 'Internal error', 500) - } - hillshadeCache.set([lng, lat], aspect, Math.random().toString(36).substring(15), jpeg) - - larkin.sendImage(req, res, next, jpeg, false) - - // Go ahead and cache the big version - if (aspect === 'small') { - extent = big([lng, lat]) - hillshade(extent, { - zoom: 10, - format: 'jpeg' - }, (error, jpeg) => { - if (error) { - console.log(error) - return - } - hillshadeCache.set([lng, lat], 'big', Math.random().toString(36).substring(15), jpeg) - }) - } - - }) - }) -} + let extent = aspect === "small" ? small([lng, lat]) : big([lng, lat]); + + hillshade( + extent, + { + zoom: aspect === "small" ? 12 : 10, + format: "jpeg", + }, + (error, jpeg) => { + if (error) { + console.log(error); + return larkin.error(req, res, next, "Internal error", 500); + } + hillshadeCache.set( + [lng, lat], + aspect, + Math.random().toString(36).substring(15), + jpeg, + ); + + larkin.sendImage(req, res, next, jpeg, false); + + // Go ahead and cache the big version + if (aspect === "small") { + extent = big([lng, lat]); + hillshade( + extent, + { + zoom: 10, + format: "jpeg", + }, + (error, jpeg) => { + if (error) { + console.log(error); + return; + } + hillshadeCache.set( + [lng, lat], + "big", + Math.random().toString(36).substring(15), + jpeg, + ); + }, + ); + } + }, + ); + }); +}; diff --git a/v2/hillshadeCache.ts b/v2/hillshadeCache.ts index 522c1548..e8a0bb86 100644 --- a/v2/hillshadeCache.ts +++ b/v2/hillshadeCache.ts @@ -1,16 +1,16 @@ -'use strict' +"use strict"; -const redis = require('redis') +const redis = require("redis"); -const client = redis.createClient(6379, '127.0.0.1', {'return_buffers': true}) +const client = redis.createClient(6379, "127.0.0.1", { return_buffers: true }); function removeMember(member) { - client.zrem('hillshades', member, (error) => { - if (error) console.log(error) - }) + client.zrem("hillshades", member, (error) => { + if (error) console.log(error); + }); } module.exports = { - /* + /* * @input: coord - [lng, lat] aspect - 'small' or 'big' @@ -19,51 +19,63 @@ module.exports = { @output buffer or null */ - get: (coord, aspect, callback) => { - let radius = (aspect === 'big') ? 4 : 1 - client.georadius('hillshades', coord[0], coord[1], radius, 'mi', 'ASC', (error, results) => { - if (error) return callback(error) - if (!results || !results.length) return callback(null, null) - let img = '' + get: (coord, aspect, callback) => { + let radius = aspect === "big" ? 4 : 1; + client.georadius( + "hillshades", + coord[0], + coord[1], + radius, + "mi", + "ASC", + (error, results) => { + if (error) return callback(error); + if (!results || !results.length) return callback(null, null); + let img = ""; for (let i = 0; i < results.length; i++) { - let key = results[i].toString() - if (key.split('|')[0] === aspect) { - img = key.split('|')[1] - break + let key = results[i].toString(); + if (key.split("|")[0] === aspect) { + img = key.split("|")[1]; + break; } } if (img.length) { client.get(img, (error, buffer) => { - if (error) return callback(error) + if (error) return callback(error); if (!buffer) { - removeMember(img) - return callback(null, null) + removeMember(img); + return callback(null, null); } - callback(null, buffer) - }) + callback(null, buffer); + }); } else { - callback(null, null) + callback(null, null); } - }) - }, + }, + ); + }, - set: (coord, aspect, hash, buffer) => { - client.geoadd('hillshades', coord[0], coord[1], `${aspect}|${hash}`, (error) => { + set: (coord, aspect, hash, buffer) => { + client.geoadd( + "hillshades", + coord[0], + coord[1], + `${aspect}|${hash}`, + (error) => { if (error) { - console.log(error) - return + console.log(error); + return; } client.set(hash, buffer, (error) => { if (error) { - console.log(error) - return + console.log(error); + return; } - }) - - }) - } - -} + }); + }, + ); + }, +}; diff --git a/v2/index.ts b/v2/index.ts index c932f4be..0fb0148a 100644 --- a/v2/index.ts +++ b/v2/index.ts @@ -1,119 +1,99 @@ var api = require("./api"), - larkin = require("./larkin"); + larkin = require("./larkin"); // Set up the column and unit cache larkin.setupCache(); // Load route categories api.use("/carto", require("./carto")); -api.use("/defs", require("./definitions")) +api.use("/defs", require("./definitions")); api.use("/grids", require("./grids")); api.use("/mobile", require("./mobile")); -api.route("/") - .get(require("./root")); +api.route("/").get(require("./root")); -api.route("/meta") - .get(require("./meta")); +api.route("/meta").get(require("./meta")); -api.route("/changes") - .get(function(req, res, next) { - res.sendFile(__dirname + "/changes.html"); - }); +api.route("/changes").get(function (req, res, next) { + res.sendFile(__dirname + "/changes.html"); +}); -api.route("/columns/refresh-cache") - .get(require("./column-cache-refresh")) +api.route("/columns/refresh-cache").get(require("./column-cache-refresh")); -api.route("/columns") - .get(function(req, res, next) { - require("./columns")(req, res, next); - }); +api.route("/columns").get(function (req, res, next) { + require("./columns")(req, res, next); +}); -api.route("/sections") - .get(require("./sections")); +api.route("/sections").get(require("./sections")); -api.route("/units") - .get(function(req, res, next) { - require("./units")(req, res, next); - }); +api.route("/units").get(function (req, res, next) { + require("./units")(req, res, next); +}); -api.route("/fossils") - .get(require("./fossils")); +api.route("/fossils").get(require("./fossils")); -api.route("/stats") - .get(require("./stats")); +api.route("/stats").get(require("./stats")); -api.route("/paleogeography") - .get(require("./paleogeography")); +api.route("/paleogeography").get(require("./paleogeography")); -api.route("/geologic_units/gmna") - .get(require("./geologic_units_gmna")); +api.route("/geologic_units/gmna").get(require("./geologic_units_gmna")); -api.route("/geologic_units/gmus") - .get(require("./geologic_units_gmus")); +api.route("/geologic_units/gmus").get(require("./geologic_units_gmus")); -api.route("/geologic_units/burwell") - .get(function(req, res, next) { - require("./geologic_units_burwell")(req, res, next); - }); +api.route("/geologic_units/burwell").get(function (req, res, next) { + require("./geologic_units_burwell")(req, res, next); +}); -api.route("/geologic_units/map") - .get(function(req, res, next) { - require("./geologic_units_burwell")(req, res, next); - }); +api.route("/geologic_units/map").get(function (req, res, next) { + require("./geologic_units_burwell")(req, res, next); +}); -api.route("/geologic_units/burwell/nearby") +api + .route("/geologic_units/burwell/nearby") .get(require("./geologic_units_burwell_nearby")); -api.route("/geologic_units/map/nearby") +api + .route("/geologic_units/map/nearby") .get(require("./geologic_units_burwell_nearby")); -api.route("/geologic_units/burwell/points") +api + .route("/geologic_units/burwell/points") .get(require("./geologic_units_burwell_points")); -api.route("/geologic_units/map/points") +api + .route("/geologic_units/map/points") .get(require("./geologic_units_burwell_points")); -api.route("/geologic_units/map/legend") - .get(function(req, res, next) { - require("./geologic_units_burwell_legend")(req, res, next); - }); +api.route("/geologic_units/map/legend").get(function (req, res, next) { + require("./geologic_units_burwell_legend")(req, res, next); +}); -api.route("/elevation") - .get(function(req, res, next) { - require("./elevation")(req, res, next); - }); +api.route("/elevation").get(function (req, res, next) { + require("./elevation")(req, res, next); +}); -api.route("/places") - .get(function(req, res, next) { - require("./places")(req, res, next); - }); +api.route("/places").get(function (req, res, next) { + require("./places")(req, res, next); +}); -api.route("/measurements") - .get(require("./measurements")); +api.route("/measurements").get(require("./measurements")); -api.route("/age_model") - .get(require("./age_model")); +api.route("/age_model").get(require("./age_model")); -api.route("/eodp") - .get(require("./eodp")); +api.route("/eodp").get(require("./eodp")); //api.route("/hillshade") // .get(require("./hillshade")); -api.route('/boundaries') - .get(require('./boundaries')); +api.route("/boundaries").get(require("./boundaries")); -api.route('/hex-summary') - .get(require('./hex_summary')); +api.route("/hex-summary").get(require("./hex_summary")); -api.route('/hex-summary/max/:zoom') - .get(require('./hex_summary_max')); +api.route("/hex-summary/max/:zoom").get(require("./hex_summary_max")); -api.route("*") - .get(require("./catchall")); +api.route("*").get(require("./catchall")); -api.use(function(err, req, res, next) { - if(err.status !== 404) { +api.use(function (err, req, res, next) { + if (err.status !== 404) { return next(); } else if (err.status === 404) { larkin.error(req, res, next, "404: Page not found", 404); diff --git a/v2/larkin.ts b/v2/larkin.ts index 5c05cfea..e2b9d882 100644 --- a/v2/larkin.ts +++ b/v2/larkin.ts @@ -1,40 +1,32 @@ var async = require("async"), - _ = require("underscore"), - credentials = require("./credentials"), - csv = require("csv-express"), - api = require("./api"), - defs = require("./defs"), - validator = require("validator"), - http = require("http"), + _ = require("underscore"), + credentials = require("./credentials"), + csv = require("csv-express"), + api = require("./api"), + defs = require("./defs"), + validator = require("validator"), + http = require("http"), portscanner = require("portscanner"); - -const { Client, Pool } = require('pg'); - -let clientRegistry = {} -function getPGClient(db) { - if (!clientRegistry[db]) { - const connectionString = "postgresql://" + credentials.pg.user + (credentials.pg.password.length ? ':' + credentials.pg.password : '') + "@" + credentials.pg.host + ":" + credentials.pg.port + "/" + db; - clientRegistry[db] = new Client({ connectionString }); - } - return clientRegistry[db]; -} - -(function() { + +const { Client, Pool } = require("pg"); + +(function () { var larkin = {}; larkin.queryPg = function (db, sql, params, callback) { + const nameMapping = credentials.postgresDatabases ?? {}; + const dbName = nameMapping[db] ?? db; - const nameMapping = credentials.postgresDatabases ?? {} - const dbName = nameMapping[db] ?? db - - const pool = new Pool({connectionString: credentials.pg.connectionString}); + const pool = new Pool({ + connectionString: credentials.pg.connectionString, + }); - pool.connect(function(err, client, done) { + pool.connect(function (err, client, done) { if (err) { this.log("error", "error connecting - " + err); callback(err); } else { - var query = client.query(sql, params, function(err, result) { + var query = client.query(sql, params, function (err, result) { done(); if (err) { this.log("error", err); @@ -47,13 +39,15 @@ function getPGClient(db) { }); }; - larkin.toUnnamed = function(sql, params) { - var placeholders = sql.match(/(?:\?)|(?::(\d+|(?::?[a-zA-Z][a-zA-Z0-9_]*)))/g), - newParams = []; + larkin.toUnnamed = function (sql, params) { + var placeholders = sql.match( + /(?:\?)|(?::(\d+|(?::?[a-zA-Z][a-zA-Z0-9_]*)))/g, + ), + newParams = []; for (var i = 0; i < placeholders.length; i++) { - var flag = (placeholders[i].substr(0, 2) === "::") ? "::" : ":", - sub = (flag === "::") ? "??" : "?"; + var flag = placeholders[i].substr(0, 2) === "::" ? "::" : ":", + sub = flag === "::" ? "??" : "?"; sql = sql.replace(placeholders[i], sub); newParams.push(params[placeholders[i].replace(flag, "")]); @@ -62,28 +56,31 @@ function getPGClient(db) { return [sql, newParams]; }; - larkin.query = function(sql, params, callback) { + larkin.query = function (sql, params, callback) { // See if the query is using :named_parameters or positional ? - const error = new Error("MySQL connections are now invalid. Please update this route to use Postgres instead.") - callback(error) + const error = new Error( + "MySQL connections are now invalid. Please update this route to use Postgres instead.", + ); + callback(error); }; - larkin.sendImage = function(req, res, next, data, isCached) { - // console.log(data) - res.set('Content-Type', 'image/jpeg') - res.set('Content-Length', Buffer.byteLength(data, 'utf8')) - res.set('Redis-cache-hit', isCached) - res.set('Accept-Ranges', 'bytes') - res.end(data) - } - + larkin.sendImage = function (req, res, next, data, isCached) { + // console.log(data) + res.set("Content-Type", "image/jpeg"); + res.set("Content-Length", Buffer.byteLength(data, "utf8")); + res.set("Redis-cache-hit", isCached); + res.set("Accept-Ranges", "bytes"); + res.end(data); + }; - larkin.sendData = function(req, res, next, options, outgoing) { + larkin.sendData = function (req, res, next, options, outgoing) { if (!options.format) { - options.format = (api.acceptedFormats.standard[req.query.format]) ? req.query.format : 'json' + options.format = api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json"; } if (!options.bare) { - options.bare = (api.acceptedFormats.bare[req.query.format]) ? true : false + options.bare = api.acceptedFormats.bare[req.query.format] ? true : false; } if (options && options.format === "csv") { @@ -97,7 +94,7 @@ function getPGClient(db) { } if (options.refs) { - larkin.getRefs(options.refs, outgoing.data, function(refs) { + larkin.getRefs(options.refs, outgoing.data, function (refs) { outgoing.refs = refs; larkin.finishSend(req, res, next, options, outgoing); }); @@ -106,14 +103,14 @@ function getPGClient(db) { } }; - larkin.finishSend = function(req, res, next, options, outgoing) { + larkin.finishSend = function (req, res, next, options, outgoing) { var responseObject = { - "success": { - "v": api.version, - "license": api.license, - "data": outgoing.data - } - } + success: { + v: api.version, + license: api.license, + data: outgoing.data, + }, + }; if (outgoing.refs) { responseObject.success["refs"] = outgoing.refs; @@ -126,346 +123,400 @@ function getPGClient(db) { } return res.json(responseObject); - } - + }; - larkin.info = function(req, res, next) { + larkin.info = function (req, res, next) { var formatted = (req.baseUrl + req.route.path) - .replace("/api/v" + api.version, "") - .replace("/api", "") - .replace(/\/$/, "") - .replace("/v" + api.version, ""); - this.defineRoute(formatted, function(definition) { + .replace("/api/v" + api.version, "") + .replace("/api", "") + .replace(/\/$/, "") + .replace("/v" + api.version, ""); + this.defineRoute(formatted, function (definition) { res.json({ - "success": definition + success: definition, }); }); }; - larkin.defineCategory = function(category, callback) { - var available = {} + larkin.defineCategory = function (category, callback) { + var available = {}; for (var key in defs) { - if (defs[key].parent && defs[key].parent === category && defs[key].visible) { - available[key] = defs[key].description + if ( + defs[key].parent && + defs[key].parent === category && + defs[key].visible + ) { + available[key] = defs[key].description; } } callback(null, { - "v": api.version, - "description": defs["/defs"].description, - "routes": available + v: api.version, + description: defs["/defs"].description, + routes: available, }); - } - + }; - larkin.error = function(req, res, next, message, code) { - var responseMessage = (message) ? message : "Something went wrong. Please contact Shanan Peters."; - if (code && code === 500 || code === 404) { - res - .status((code) ? code : 200) - .json({ - "error": { - "message": responseMessage - } - }); + larkin.error = function (req, res, next, message, code) { + var responseMessage = message + ? message + : "Something went wrong. Please contact Shanan Peters."; + if ((code && code === 500) || code === 404) { + res.status(code ? code : 200).json({ + error: { + message: responseMessage, + }, + }); } else { var formatted = (req.baseUrl + req.route.path) - .replace("/api/v" + api.version, "") - .replace("/api", "") - .replace(/\/$/, "") - .replace("/v" + api.version, "");; - this.defineRoute(formatted, function(definition) { - res - .status((code) ? code : 200) - .json({ - "error": { - "v": api.version, - "license": api.license, - "message": responseMessage, - "about": definition - } - }); + .replace("/api/v" + api.version, "") + .replace("/api", "") + .replace(/\/$/, "") + .replace("/v" + api.version, ""); + this.defineRoute(formatted, function (definition) { + res.status(code ? code : 200).json({ + error: { + v: api.version, + license: api.license, + message: responseMessage, + about: definition, + }, + }); }); } - }; - larkin.log = function(type, message) { + larkin.log = function (type, message) { console.log(type, message); }; // Will return all field definitions - larkin.defineFields = function(route, callback) { - var routeDefs = {} - async.each(defs[route].options.fields, function(field, callback) { - if (defs.define.hasOwnProperty(field)) { - routeDefs[field] = defs.define[field]; - } else { - routeDefs[field] = "" - } - callback() - }, function(error, result) { - callback(routeDefs); - }); + larkin.defineFields = function (route, callback) { + var routeDefs = {}; + async.each( + defs[route].options.fields, + function (field, callback) { + if (defs.define.hasOwnProperty(field)) { + routeDefs[field] = defs.define[field]; + } else { + routeDefs[field] = ""; + } + callback(); + }, + function (error, result) { + callback(routeDefs); + }, + ); }; // Get the metadata for a given route - larkin.defineRoute = function(route, callback) { - this.defineFields(route, function(fields) { + larkin.defineRoute = function (route, callback) { + this.defineFields(route, function (fields) { var routeDefinition = { - "v": api.version, - "license": api.license, - "description": defs[route].description, - "options": { - "parameters": defs[route].options.parameters, - "output_formats": defs[route].options.output_formats, - "examples": defs[route].options.examples - } + v: api.version, + license: api.license, + description: defs[route].description, + options: { + parameters: defs[route].options.parameters, + output_formats: defs[route].options.output_formats, + examples: defs[route].options.examples, + }, }; if (defs[route].options.response_types) { - routeDefinition.options.response_types = defs[route].options.response_types; + routeDefinition.options.response_types = + defs[route].options.response_types; } routeDefinition.options.fields = fields; callback(routeDefinition); }); }; - - larkin.getOutputFormat = function(requestedFormat) { + larkin.getOutputFormat = function (requestedFormat) { switch (requestedFormat) { case "geojson_bare": return "geojson"; case "topojson_bare": return "topojson"; default: - return (requestedFormat === "geojson" || requestedFormat === "topojson") ? requestedFormat : "geojson"; + return requestedFormat === "geojson" || requestedFormat === "topojson" + ? requestedFormat + : "geojson"; } }; - - larkin.jsonifyPipes = function(data, type) { + larkin.jsonifyPipes = function (data, type) { if (data) { - data = data.split("|").filter(function(d) { + data = data.split("|").filter(function (d) { if (d) { - return d + return d; } }); if (type === "integers") { - return data.map(function(d) { + return data.map(function (d) { return parseInt(d); }); } else if (type === "floats") { - return data.map(function(d) { + return data.map(function (d) { return parseFloat(d); }); } else if (type === "strings") { - return data + return data; } else { return data; } - } else { return []; } }; - - larkin.verifyKey = function(key, callback) { + larkin.verifyKey = function (key, callback) { if (!validator.isUUID(key)) { callback("Invalid key", null); } else { - this.queryPg("geomacro", "SELECT key, admin FROM apikeys WHERE key = $1", [key], function(error, data) { - if (error) { - callback("Internal issue", null); - } else if (data.rows && data.rows.length === 1) { - callback(null, {"valid": true, "info": data.rows[0]}); - } else { - callback(null, {"valid": false}); - } - }); + this.queryPg( + "geomacro", + "SELECT key, admin FROM apikeys WHERE key = $1", + [key], + function (error, data) { + if (error) { + callback("Internal issue", null); + } else if (data.rows && data.rows.length === 1) { + callback(null, { valid: true, info: data.rows[0] }); + } else { + callback(null, { valid: false }); + } + }, + ); } }; - - larkin.parseMultipleIds = function(requested_ids) { + larkin.parseMultipleIds = function (requested_ids) { try { - return requested_ids.split(",").map(function(d) { + return requested_ids.split(",").map(function (d) { return parseInt(d); }); } catch (e) { return requested_ids; } - }; - larkin.parseMultipleStrings = function(text) { - return text.split(",").map(function(d) { + larkin.parseMultipleStrings = function (text) { + return text.split(",").map(function (d) { return d; }); }; - - larkin.findNumberInString = function(obj){ - var matches = obj.replace(/,/g, '').match(/(\+|-)?((\d+(\.\d+)?)|(\.\d+))/); - return matches && matches[0] || null; + larkin.findNumberInString = function (obj) { + var matches = obj.replace(/,/g, "").match(/(\+|-)?((\d+(\.\d+)?)|(\.\d+))/); + return (matches && matches[0]) || null; }; - larkin.fixLiths = function(obj) { - return obj.split("|").map(function(d) { - var prop = parseFloat(this.findNumberInString(d)), - type = d.replace(prop, "").replace(/\.\d+/, "").replace("0", "").replace("00", "").trim(); - - // WTF? No idea why this is necessary... - type = type.replace("0", ""); - type = type.trim() - - return {"type": type, "prop": prop} - - }.bind(this)); + larkin.fixLiths = function (obj) { + return obj.split("|").map( + function (d) { + var prop = parseFloat(this.findNumberInString(d)), + type = d + .replace(prop, "") + .replace(/\.\d+/, "") + .replace("0", "") + .replace("00", "") + .trim(); + + // WTF? No idea why this is necessary... + type = type.replace("0", ""); + type = type.trim(); + + return { type: type, prop: prop }; + }.bind(this), + ); }; - larkin.pipifyLiths = function(data) { - return data.map(function(d) { - return d.type + " ~ " + d.prop; - }).join("|"); + larkin.pipifyLiths = function (data) { + return data + .map(function (d) { + return d.type + " ~ " + d.prop; + }) + .join("|"); }; // Handle lith_atts - larkin.pipifyAttrs = function(data) { - if (!data || !data.length) return '' - return data.map(function(attr) { - return ((attr.atts) ? (attr.atts.join(" ") + " ") : "") + - attr.name + " " + attr.type + " " + attr.class + " " + - ((attr.prop) ? " ~ " + attr.prop : ""); - }).join("|"); + larkin.pipifyAttrs = function (data) { + if (!data || !data.length) return ""; + return data + .map(function (attr) { + return ( + (attr.atts ? attr.atts.join(" ") + " " : "") + + attr.name + + " " + + attr.type + + " " + + attr.class + + " " + + (attr.prop ? " ~ " + attr.prop : "") + ); + }) + .join("|"); }; - larkin.summarizeAttribute = function(data, type) { + larkin.summarizeAttribute = function (data, type) { var mommaCat = _.flatten( - data.map(function(d) { + data.map(function (d) { return d[type]; - })).filter(function(d) { - if (d) { return d } - }); + }), + ).filter(function (d) { + if (d) { + return d; + } + }); if (mommaCat.length < 1) { return []; } - var cats = _.groupBy(mommaCat, function(d) { return d[type + "_id"] }), - total_cats = Object.keys(cats).map(function(cat) { return cats[cat].length }).reduce(function(a, b) { return a + b }, 0), - parsedCats = []; + var cats = _.groupBy(mommaCat, function (d) { + return d[type + "_id"]; + }), + total_cats = Object.keys(cats) + .map(function (cat) { + return cats[cat].length; + }) + .reduce(function (a, b) { + return a + b; + }, 0), + parsedCats = []; - Object.keys(cats).forEach(function(d) { + Object.keys(cats).forEach(function (d) { if (type === "lith") { - var prop = parseFloat(( - cats[d].map(function(j) { - return j.prop - }).reduce(function(a, b) { - return a + b - }, 0)/data.length - ).toFixed(4)); - + var prop = parseFloat( + ( + cats[d] + .map(function (j) { + return j.prop; + }) + .reduce(function (a, b) { + return a + b; + }, 0) / data.length + ).toFixed(4), + ); } else { - var prop = parseFloat((cats[d].length/total_cats).toFixed(4)); + var prop = parseFloat((cats[d].length / total_cats).toFixed(4)); } var kitten = { - "name": cats[d][0].name, - "type": cats[d][0].type, - "class": cats[d][0].class, - "prop": prop - } + name: cats[d][0].name, + type: cats[d][0].type, + class: cats[d][0].class, + prop: prop, + }; kitten[type + "_id"] = parseInt(d); parsedCats.push(kitten); - }); return parsedCats; }; - larkin.normalizeLng = function(lng) { + larkin.normalizeLng = function (lng) { // via https://github.com/Leaflet/Leaflet/blob/32c9156cb1d1c9bd53130639ec4d8575fbeef5a6/src/core/Util.js#L87 - return ((lng - 180) % 360 + 360) % 360 - 180; - } + return ((((lng - 180) % 360) + 360) % 360) - 180; + }; - larkin.normalizeRefField = function(content) { + larkin.normalizeRefField = function (content) { if (content) { content = content.toString(); - return (content.substr(content.length - 1) === ".") ? content + " " : content + ". "; + return content.substr(content.length - 1) === "." + ? content + " " + : content + ". "; } - return ''; - - } + return ""; + }; - larkin.getRefs = function(key, data, callback) { + larkin.getRefs = function (key, data, callback) { // Remap if the data is topojson if (data.type && data.type === "Topology") { - data = data.objects.output.geometries.map(function(d) { + data = data.objects.output.geometries.map(function (d) { return d.properties; }); - // Remap if the data is geojson + // Remap if the data is geojson } else if (data.type && data.type === "FeatureCollection") { - data = data.features.map(function(d) { return d.properties }); + data = data.features.map(function (d) { + return d.properties; + }); } // Get unique ref_ids var ref_ids = _.uniq( - _.flatten( - data.map(function(d) { - return d[key] - } - ) - ) + _.flatten( + data.map(function (d) { + return d[key]; + }), + ), ); // Macrostrat refs if (key === "refs" || key === "ref_id") { - larkin.query("SELECT refs.id AS ref_id, pub_year, author, ref, doi, url, COUNT(DISTINCT units_sections.unit_id) AS t_units FROM refs LEFT JOIN col_refs ON col_refs.ref_id = refs.id LEFT JOIN units_sections ON units_sections.col_id = col_refs.col_id WHERE refs.id IN (:ref_id) GROUP BY refs.id", {"ref_id": ref_ids}, function(error, data) { - var refs = {}; - if (!data) { - return callback(null) - } - for (var i = 0; i < data.length; i++) { - refs[data[i]["ref_id"]] = larkin.normalizeRefField(data[i].author) + larkin.normalizeRefField(data[i].ref) + larkin.normalizeRefField(data[i].pub_year) + larkin.normalizeRefField(data[i].doi) + larkin.normalizeRefField(data[i].url); - } - callback(refs); - }); + larkin.query( + "SELECT refs.id AS ref_id, pub_year, author, ref, doi, url, COUNT(DISTINCT units_sections.unit_id) AS t_units FROM refs LEFT JOIN col_refs ON col_refs.ref_id = refs.id LEFT JOIN units_sections ON units_sections.col_id = col_refs.col_id WHERE refs.id IN (:ref_id) GROUP BY refs.id", + { ref_id: ref_ids }, + function (error, data) { + var refs = {}; + if (!data) { + return callback(null); + } + for (var i = 0; i < data.length; i++) { + refs[data[i]["ref_id"]] = + larkin.normalizeRefField(data[i].author) + + larkin.normalizeRefField(data[i].ref) + + larkin.normalizeRefField(data[i].pub_year) + + larkin.normalizeRefField(data[i].doi) + + larkin.normalizeRefField(data[i].url); + } + callback(refs); + }, + ); - // Else burwell sources + // Else burwell sources } else { - larkin.queryPg("burwell", "SELECT source_id, name, COALESCE(url, '') url, COALESCE(ref_title, '') ref_title, COALESCE(authors, '') authors, COALESCE(ref_year, '') ref_year, COALESCE(ref_source, '') ref_source, COALESCE(isbn_doi, '') isbn_doi FROM maps.sources WHERE source_id = ANY($1)", [ref_ids], function(error, result) { - var refs = {}; - - for (var i = 0; i < result.rows.length; i++) { - refs[result.rows[i]["source_id"]] = larkin.normalizeRefField(result.rows[i].authors) + larkin.normalizeRefField(result.rows[i].ref_title) + larkin.normalizeRefField(result.rows[i].isbn_doi) + larkin.normalizeRefField(result.rows[i].ref_source); - } + larkin.queryPg( + "burwell", + "SELECT source_id, name, COALESCE(url, '') url, COALESCE(ref_title, '') ref_title, COALESCE(authors, '') authors, COALESCE(ref_year, '') ref_year, COALESCE(ref_source, '') ref_source, COALESCE(isbn_doi, '') isbn_doi FROM maps.sources WHERE source_id = ANY($1)", + [ref_ids], + function (error, result) { + var refs = {}; + + for (var i = 0; i < result.rows.length; i++) { + refs[result.rows[i]["source_id"]] = + larkin.normalizeRefField(result.rows[i].authors) + + larkin.normalizeRefField(result.rows[i].ref_title) + + larkin.normalizeRefField(result.rows[i].isbn_doi) + + larkin.normalizeRefField(result.rows[i].ref_source); + } - callback(refs); - }); + callback(refs); + }, + ); } - } + }; // Check if Redis is available - portscanner.checkPortStatus(6379, "127.0.0.1", function(error, status) { + portscanner.checkPortStatus(6379, "127.0.0.1", function (error, status) { if (status === "open") { console.log("Using Redis cache for columns"); var redis = require("redis"); larkin.cache = redis.createClient(6379, "127.0.0.1"); - larkin.cache.fetch = function(key, callback) { - larkin.cache.get(key, function(error, data) { + larkin.cache.fetch = function (key, callback) { + larkin.cache.get(key, function (error, data) { callback(JSON.parse(data)); }); - } + }; } else { - console.log("Using application cache for columns") + console.log("Using application cache for columns"); larkin.cache = require("memory-cache"); - larkin.cache.fetch = function(key, callback) { + larkin.cache.fetch = function (key, callback) { callback(larkin.cache.get(key)); - } + }; } }); @@ -479,63 +530,109 @@ function getPGClient(db) { made to /columns/refresh-cache?cacheRefreshKey= with the value of exports.cacheRefreshKey found in ./credentials.js */ - larkin.setupCache = function() { - - async.parallel({ - unitSummary: function(callback) { - // get all units and summarize for columns - http.get("http://localhost:5000/v2/units?all&response=long", function(res) { - var body = ""; - - res.on("data", function(chunk) { - body += chunk; - }); - - res.on("end", function() { - - var result = JSON.parse(body).success.data; - - var cols = _.groupBy(result, function(d) { - return d.col_id; - }); - - var new_cols = {}; - - Object.keys(cols).forEach(function(col_id) { - new_cols[col_id] = { - "max_thick": _.reduce(cols[col_id].map(function(d) { return d.max_thick}) , function(a, b) { return a + b}, 0), - "max_min_thick": _.reduce(cols[col_id].map(function(d) { - if (d.min_thick === 0) { - return d.max_thick; - } else { - return d.min_thick - } - }) , function(a, b) { return a + b}, 0), - "min_min_thick": _.reduce(cols[col_id].map(function(d) { return d.min_thick}) , function(a, b) { return a + b}, 0), - - "b_age": _.max(cols[col_id], function(d) { return d.b_age; }).b_age, - "t_age": _.min(cols[col_id], function(d) { return d.t_age; }).t_age, - "b_int_name": _.max(cols[col_id], function(d) { return d.b_age; }).b_int_name, - "t_int_name": _.min(cols[col_id], function(d) { return d.t_age; }).t_int_name, - - "pbdb_collections": _.reduce(cols[col_id].map(function(d) { return d.pbdb_collections }), function(a, b) { return a + b}, 0), - - "lith": larkin.summarizeAttribute(cols[col_id], "lith"), - "environ": larkin.summarizeAttribute(cols[col_id], "environ"), - "econ": larkin.summarizeAttribute(cols[col_id], "econ"), - - "t_units": cols[col_id].length, - "t_sections": _.uniq(cols[col_id].map(function(d) { return d.section_id })).length - } - }); - callback(null, new_cols); - }); - }); - }, - - columnsGeom: function(callback) { - // get all columns, with geometry - larkin.queryPg('burwell', ` + larkin.setupCache = function () { + async.parallel( + { + unitSummary: function (callback) { + // get all units and summarize for columns + http.get( + "http://localhost:5550/v2/units?all&response=long", + function (res) { + var body = ""; + + res.on("data", function (chunk) { + body += chunk; + }); + + res.on("end", function () { + var result = JSON.parse(body).success.data; + + var cols = _.groupBy(result, function (d) { + return d.col_id; + }); + + var new_cols = {}; + + Object.keys(cols).forEach(function (col_id) { + new_cols[col_id] = { + max_thick: _.reduce( + cols[col_id].map(function (d) { + return d.max_thick; + }), + function (a, b) { + return a + b; + }, + 0, + ), + max_min_thick: _.reduce( + cols[col_id].map(function (d) { + if (d.min_thick === 0) { + return d.max_thick; + } else { + return d.min_thick; + } + }), + function (a, b) { + return a + b; + }, + 0, + ), + min_min_thick: _.reduce( + cols[col_id].map(function (d) { + return d.min_thick; + }), + function (a, b) { + return a + b; + }, + 0, + ), + + b_age: _.max(cols[col_id], function (d) { + return d.b_age; + }).b_age, + t_age: _.min(cols[col_id], function (d) { + return d.t_age; + }).t_age, + b_int_name: _.max(cols[col_id], function (d) { + return d.b_age; + }).b_int_name, + t_int_name: _.min(cols[col_id], function (d) { + return d.t_age; + }).t_int_name, + + pbdb_collections: _.reduce( + cols[col_id].map(function (d) { + return d.pbdb_collections; + }), + function (a, b) { + return a + b; + }, + 0, + ), + + lith: larkin.summarizeAttribute(cols[col_id], "lith"), + environ: larkin.summarizeAttribute(cols[col_id], "environ"), + econ: larkin.summarizeAttribute(cols[col_id], "econ"), + + t_units: cols[col_id].length, + t_sections: _.uniq( + cols[col_id].map(function (d) { + return d.section_id; + }), + ).length, + }; + }); + callback(null, new_cols); + }); + }, + ); + }, + + columnsGeom: function (callback) { + // get all columns, with geometry + larkin.queryPg( + "burwell", + ` SELECT cols.id AS col_id, col_name, @@ -553,19 +650,25 @@ function getPGClient(db) { WHERE status_code = 'active' AND col_areas.col_area IS NOT NULL GROUP BY col_areas.col_id, cols.id, col_groups.col_group, col_groups.id, col_areas.col_area - `, [], function(error, result) { - if (!error && result && result.rows) { - callback(null, result.rows) - } else { - console.log('Could not set up column cache. Check postgres connection') - callback(null) - } - - }) - }, - - columnsNoGeom: function(callback) { - larkin.queryPg('burwell', ` + `, + [], + function (error, result) { + if (!error && result && result.rows) { + callback(null, result.rows); + } else { + console.log( + "Could not set up column cache. Check postgres connection", + ); + callback(null); + } + }, + ); + }, + + columnsNoGeom: function (callback) { + larkin.queryPg( + "burwell", + ` SELECT cols.id AS col_id, col_name, @@ -582,33 +685,40 @@ function getPGClient(db) { WHERE status_code = 'active' AND col_areas.col_area IS NOT NULL GROUP BY col_areas.col_id, cols.id, col_groups.col_group, col_groups.id - `, [], function(error, result) { - if (!error && result && result.rows) { - callback(null, result.rows) - } else { - console.log('Could not set up column cache. Check postgres connection') - callback(null) - } - - }) - } - - }, function(error, results) { - // Check if using Redis or not - if (larkin.cache.address) { - larkin.cache.set("unitSummary", JSON.stringify(results.unitSummary)); - larkin.cache.set("columnsGeom", JSON.stringify(results.columnsGeom)); - larkin.cache.set("columnsNoGeom", JSON.stringify(results.columnsNoGeom)); - } else { - larkin.cache.put("unitSummary", results.unitSummary); - larkin.cache.put("columnsGeom", results.columnsGeom); - larkin.cache.put("columnsNoGeom", results.columnsNoGeom); - } + `, + [], + function (error, result) { + if (!error && result && result.rows) { + callback(null, result.rows); + } else { + console.log( + "Could not set up column cache. Check postgres connection", + ); + callback(null); + } + }, + ); + }, + }, + function (error, results) { + // Check if using Redis or not + if (larkin.cache.address) { + larkin.cache.set("unitSummary", JSON.stringify(results.unitSummary)); + larkin.cache.set("columnsGeom", JSON.stringify(results.columnsGeom)); + larkin.cache.set( + "columnsNoGeom", + JSON.stringify(results.columnsNoGeom), + ); + } else { + larkin.cache.put("unitSummary", results.unitSummary); + larkin.cache.put("columnsGeom", results.columnsGeom); + larkin.cache.put("columnsNoGeom", results.columnsNoGeom); + } - console.log("Done prepping column cache"); - }); - } + console.log("Done prepping column cache"); + }, + ); + }; module.exports = larkin; - -}()); +})(); diff --git a/v2/measurements.ts b/v2/measurements.ts index a57e8397..732b0e02 100644 --- a/v2/measurements.ts +++ b/v2/measurements.ts @@ -1,89 +1,140 @@ -var api = require('./api') -var dbgeo = require('dbgeo') -var larkin = require('./larkin') +var api = require("./api"); +var dbgeo = require("dbgeo"); +var larkin = require("./larkin"); // need to fix bug to allow both col_id and measurement type parameters at same time -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } else if (req.query.measurement_type || req.query.measurement_class) { - if (req.query.unit_id || req.query.section_id || req.query.col_id || req.query.project_id || req.query.measuremeta_id || "sample" in req.query || req.query.response === "light") { - } else { return larkin.error(req, res, next, "You must specify a specific measurement or a unit_id,section_id,col_id, project_id, or measuremeta_id to retrieve these data; or, include the sample parameter"); } - } else if (req.query.unit_id || req.query.section_id || req.query.col_id || req.query.project_id || req.query.measuremeta_id || "sample" in req.query || req.query.measure_id || req.query.measurement || req.query.measurement_id || req.query.response === "light"){ + if ( + req.query.unit_id || + req.query.section_id || + req.query.col_id || + req.query.project_id || + req.query.measuremeta_id || + "sample" in req.query || + req.query.response === "light" + ) { + } else { + return larkin.error( + req, + res, + next, + "You must specify a specific measurement or a unit_id,section_id,col_id, project_id, or measuremeta_id to retrieve these data; or, include the sample parameter", + ); + } + } else if ( + req.query.unit_id || + req.query.section_id || + req.query.col_id || + req.query.project_id || + req.query.measuremeta_id || + "sample" in req.query || + req.query.measure_id || + req.query.measurement || + req.query.measurement_id || + req.query.response === "light" + ) { } else if (req.query.lith_id || req.query.lith_type || req.query.lith_class) { - if (req.query.measurement || req.query.measurement_id || req.query.measurement_type || "sample" in req.query || !("show_values" in req.query)) { - } else { return larkin.error(req, res, next, "You must specify a measurement, measurement_id, or measurement_type to retrieve these data or include the sample parameter to see example output"); } + if ( + req.query.measurement || + req.query.measurement_id || + req.query.measurement_type || + "sample" in req.query || + !("show_values" in req.query) + ) { } else { - return larkin.error(req, res, next, "Invalid Parameters. Note that available data volume may require more precise specification in the request. See parameter list below and try restricting search based on geology or measurement, mesurement_type."); - } + return larkin.error( + req, + res, + next, + "You must specify a measurement, measurement_id, or measurement_type to retrieve these data or include the sample parameter to see example output", + ); + } + } else { + return larkin.error( + req, + res, + next, + "Invalid Parameters. Note that available data volume may require more precise specification in the request. See parameter list below and try restricting search based on geology or measurement, mesurement_type.", + ); + } - var where = [] - var params = [] - var limit = '' + var where = []; + var params = []; + var limit = ""; - var geo = (req.query.format && api.acceptedFormats.geo[req.query.format]) ? true : false; + var geo = + req.query.format && api.acceptedFormats.geo[req.query.format] + ? true + : false; var validParams = { - 'measurement': 'measurements.measurement', - 'measurement_type': 'measurements.measurement_type', - 'measurement_class': 'measurements.measurement_class', - 'measurement_id': 'measurements.id', - 'measure_id': 'measures.id', - 'measuremeta_id': 'measuremeta.id', - 'lith_id': 'measuremeta.lith_id', - 'unit_id': 'unit_measures.unit_id', - 'section_id': 'units_sections.section_id', - 'measure_phase': 'measures.measure_phase', - 'project_id': 'cols.project_id' - } + measurement: "measurements.measurement", + measurement_type: "measurements.measurement_type", + measurement_class: "measurements.measurement_class", + measurement_id: "measurements.id", + measure_id: "measures.id", + measuremeta_id: "measuremeta.id", + lith_id: "measuremeta.lith_id", + unit_id: "unit_measures.unit_id", + section_id: "units_sections.section_id", + measure_phase: "measures.measure_phase", + project_id: "cols.project_id", + }; - Object.keys(req.query).forEach(function(param) { + Object.keys(req.query).forEach(function (param) { if (validParams.hasOwnProperty(param)) { - where.push(validParams[param] + ' IN (:' + param + ')') + where.push(validParams[param] + " IN (:" + param + ")"); - if (param.substr(param.length - 3, param.length) === '_id') { - params[param] = larkin.parseMultipleIds(req.query[param]) + if (param.substr(param.length - 3, param.length) === "_id") { + params[param] = larkin.parseMultipleIds(req.query[param]); } else { - params[param] = larkin.parseMultipleStrings(req.query[param]) + params[param] = larkin.parseMultipleStrings(req.query[param]); } } - }) + }); if (req.query.col_id) { - where.push("(measuremeta_cols.col_id IN (:col_id1) OR units_sections.col_id IN (:col_id2))") - params["col_id1"] = larkin.parseMultipleIds(req.query.col_id); - params["col_id2"] = larkin.parseMultipleIds(req.query.col_id); + where.push( + "(measuremeta_cols.col_id IN (:col_id1) OR units_sections.col_id IN (:col_id2))", + ); + params["col_id1"] = larkin.parseMultipleIds(req.query.col_id); + params["col_id2"] = larkin.parseMultipleIds(req.query.col_id); } if (req.query.interval_name) { - where.push("b_age>(SELECT age_top from intervals where interval_name IN (:intname1) and t_age<(SELECT age_bottom from intervals where interval_name in (:intname2)))") - params["intname1"] = larkin.parseMultipleStrings(req.query.interval_name); - params["intname2"] = larkin.parseMultipleStrings(req.query.interval_name); + where.push( + "b_age>(SELECT age_top from intervals where interval_name IN (:intname1) and t_age<(SELECT age_bottom from intervals where interval_name in (:intname2)))", + ); + params["intname1"] = larkin.parseMultipleStrings(req.query.interval_name); + params["intname2"] = larkin.parseMultipleStrings(req.query.interval_name); } if (req.query.lith_type) { - where.push("lith_type IN (:lith_type)") - params["lith_type"] = larkin.parseMultipleStrings(req.query.lith_type); + where.push("lith_type IN (:lith_type)"); + params["lith_type"] = larkin.parseMultipleStrings(req.query.lith_type); } if (req.query.lith_class) { - where.push("lith_class IN (:lith_class)") - params["lith_class"] = larkin.parseMultipleStrings(req.query.lith_class); + where.push("lith_class IN (:lith_class)"); + params["lith_class"] = larkin.parseMultipleStrings(req.query.lith_class); } if (where.length) { - where = 'WHERE ' + where.join(' AND ') + where = "WHERE " + where.join(" AND "); } else { - where = '' - limit = 'LIMIT 10' + where = ""; + limit = "LIMIT 10"; } - if (req.query.hasOwnProperty('sample')) { - limit = 'LIMIT 10' + if (req.query.hasOwnProperty("sample")) { + limit = "LIMIT 10"; } - var select=` + var select = ` measurements.id as measurement_id, measuremeta.id as measuremeta_id, measurement, @@ -91,10 +142,10 @@ module.exports = function(req, res, next) { measure_phase, method, count(measurements.id) as n, - measuremeta.ref_id` + measuremeta.ref_id`; - if (req.query.response === 'long'){ - select +=`, + if (req.query.response === "long") { + select += `, sample_name, sample_geo_unit as geo_unit, sample_lith as samp_lith, @@ -108,33 +159,37 @@ module.exports = function(req, res, next) { IF(unit_measures.unit_id is not null, units_sections.col_id, measuremeta_cols.col_id) as col_id, strat_name_id, match_basis, - ref` + ref`; } - if (req.query.response === 'light') { - select =` + if (req.query.response === "light") { + select = ` measurements.id as measurement_id, measuremeta.id as measuremeta_id, units as measure_units, count(measurements.id) as n, unit_measures.unit_id, - measuremeta.ref_id` + measuremeta.ref_id`; } - if (geo && req.query.response !== 'long') { - select += ", measuremeta.lat as lat, measuremeta.lng as lng" + if (geo && req.query.response !== "long") { + select += ", measuremeta.lat as lat, measuremeta.lng as lng"; } if ("show_values" in req.query) { select += `, GROUP_CONCAT(measure_value ORDER BY measures.id SEPARATOR '|') AS measure_value, - GROUP_CONCAT(v_error ORDER BY measures.id SEPARATOR '|') AS measure_error ` - if (req.query.response !== 'light') select += ", GROUP_CONCAT(samp_pos order by measures.id SEPARATOR '|') AS measure_position" - if (req.query.response === 'long') select += ", GROUP_CONCAT(v_n ORDER BY measures.id SEPARATOR '|') AS measure_n, GROUP_CONCAT(sample_no ORDER BY measures.id SEPARATOR '|') AS sample_no" - select += ", v_error_units as error_units" + GROUP_CONCAT(v_error ORDER BY measures.id SEPARATOR '|') AS measure_error `; + if (req.query.response !== "light") + select += + ", GROUP_CONCAT(samp_pos order by measures.id SEPARATOR '|') AS measure_position"; + if (req.query.response === "long") + select += + ", GROUP_CONCAT(v_n ORDER BY measures.id SEPARATOR '|') AS measure_n, GROUP_CONCAT(sample_no ORDER BY measures.id SEPARATOR '|') AS sample_no"; + select += ", v_error_units as error_units"; } - var sql=`SELECT + var sql = `SELECT ${select} FROM measures JOIN measurements on measurement_id=measurements.id @@ -148,52 +203,91 @@ module.exports = function(req, res, next) { ${where} GROUP BY measuremeta.id,measurements.id ${limit} - ` + `; // console.log(sql) - larkin.query(sql, params, function(error, response) { + larkin.query(sql, params, function (error, response) { if (error) { larkin.error(req, res, next, error); } else { - if (req.query.format !== "csv" && "show_values" in req.query){ + if (req.query.format !== "csv" && "show_values" in req.query) { for (var i = 0; i < response.length; i++) { - if (req.query.response !== "light") {response[i].measure_position = larkin.jsonifyPipes(response[i].measure_position, "floats");} - response[i].measure_value = larkin.jsonifyPipes(response[i].measure_value, "floats"); - response[i].measure_error = larkin.jsonifyPipes(response[i].measure_error, "floats"); + if (req.query.response !== "light") { + response[i].measure_position = larkin.jsonifyPipes( + response[i].measure_position, + "floats", + ); + } + response[i].measure_value = larkin.jsonifyPipes( + response[i].measure_value, + "floats", + ); + response[i].measure_error = larkin.jsonifyPipes( + response[i].measure_error, + "floats", + ); if (req.query.response === "long") { - response[i].measure_n = larkin.jsonifyPipes(response[i].measure_n, "floats"); - response[i].sample_no = larkin.jsonifyPipes(response[i].sample_no, "strings"); + response[i].measure_n = larkin.jsonifyPipes( + response[i].measure_n, + "floats", + ); + response[i].sample_no = larkin.jsonifyPipes( + response[i].sample_no, + "strings", + ); } } } if (geo) { - dbgeo.parse(response, { - "outputFormat": larkin.getOutputFormat(req.query.format), - "geometryColumn": ["lng", "lat"], - "geometryType": "ll" - }, function(error, response) { - if (error) { - larkin.error(req, res, next, "Something went wrong"); - } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: "refs" - }, { - data: response - }); - } + dbgeo.parse( + response, + { + outputFormat: larkin.getOutputFormat(req.query.format), + geometryColumn: ["lng", "lat"], + geometryType: "ll", + }, + function (error, response) { + if (error) { + larkin.error(req, res, next, "Something went wrong"); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + refs: "refs", + }, + { + data: response, + }, + ); } - ); - } else { larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : 'json', - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: 'ref_id' - }, { - data: response - }) - } + }, + ); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + refs: "ref_id", + }, + { + data: response, + }, + ); + } } - }) -} + }); +}; diff --git a/v2/meta.ts b/v2/meta.ts index 2628c75c..3f4b3401 100644 --- a/v2/meta.ts +++ b/v2/meta.ts @@ -1,29 +1,36 @@ var api = require("./api"), - larkin = require("./larkin"); + larkin = require("./larkin"); -module.exports = function(req, res, next) { - larkin.sendData(req, res, next, { - format: "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: { - "license": "All data are licensed under Creative Commons BY 4.0 International", - "citation": "Peters, S.E. et al. Macrostrat: a platform for geological data integration and deep-time research. https://macrostrat.org, accessed on (date)", - "api": [ - "John J Czaplewski", - "Puneet Kishor", - "Shanan E Peters" - ] +module.exports = function (req, res, next) { + larkin.sendData( + req, + res, + next, + { + format: "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, }, - support: { - "current_funding": "U.S. National Science Foundation Grant EAR-1150082 and ICER-1440312. Additional support from the University of Wisconsin-Madison Dept. of Geoscience.", - "previous_funding": "Initial database development supported by the United States Geological Survey and the American Chemical Society." + { + data: { + license: + "All data are licensed under Creative Commons BY 4.0 International", + citation: + "Peters, S.E. et al. Macrostrat: a platform for geological data integration and deep-time research. https://macrostrat.org, accessed on (date)", + api: ["John J Czaplewski", "Puneet Kishor", "Shanan E Peters"], + }, + support: { + current_funding: + "U.S. National Science Foundation Grant EAR-1150082 and ICER-1440312. Additional support from the University of Wisconsin-Madison Dept. of Geoscience.", + previous_funding: + "Initial database development supported by the United States Geological Survey and the American Chemical Society.", + }, + acknowledgements: { + data_entry: + "University of Michigan Undergraduate Research Opportunity program, Noel Heim, Deb Rook, Neal Auchter, Annaka Clement, Clay Kelly.", + contributors: ["Jon Husson"], + data_providers: + "The data synthesized in Macrostrat reflect the combined work of hundreds of field-based geoscientists. These contributors are too many to cite individually, but see /defs/refs?all and /defs/sources?all for a list of primary sources supplying data and the references therein.", + }, }, - acknowledgements: { - "data_entry": "University of Michigan Undergraduate Research Opportunity program, Noel Heim, Deb Rook, Neal Auchter, Annaka Clement, Clay Kelly.", - "contributors": ["Jon Husson"], - "data_providers": "The data synthesized in Macrostrat reflect the combined work of hundreds of field-based geoscientists. These contributors are too many to cite individually, but see /defs/refs?all and /defs/sources?all for a list of primary sources supplying data and the references therein." - } - }); - -} + ); +}; diff --git a/v2/mobile/autocomplete.ts b/v2/mobile/autocomplete.ts index 9ddabf42..cde27c1b 100644 --- a/v2/mobile/autocomplete.ts +++ b/v2/mobile/autocomplete.ts @@ -1,7 +1,7 @@ -const api = require('../api') -const larkin = require('../larkin') -const https = require('https') -const async = require('async') +const api = require("../api"); +const larkin = require("../larkin"); +const https = require("https"); +const async = require("async"); module.exports = (req, res, next) => { if (Object.keys(req.query).length < 1) { @@ -9,99 +9,120 @@ module.exports = (req, res, next) => { } let categories = [ - 'column', - 'econ', - 'environ', - 'group', - 'interval', - 'lith_att', - 'lithology', - 'mineral', - 'project', - 'strat_name', - 'structure', - 'places' - ] + "column", + "econ", + "environ", + "group", + "interval", + "lith_att", + "lithology", + "mineral", + "project", + "strat_name", + "structure", + "places", + ]; - - let foundCategories = [] + let foundCategories = []; if (req.query.include) { - let includes = req.query.include.split(',') + let includes = req.query.include.split(","); for (let i = 0; i < includes.length; i++) { if (categories.indexOf(includes[i]) > -1) { - foundCategories.push(includes[i]) + foundCategories.push(includes[i]); } } - } else if (req.query.exclude) { - let excludes = req.query.exclude.split(',') + let excludes = req.query.exclude.split(","); for (let j = 0; j < categories.length; j++) { if (excludes.indexOf(categories[j]) < 0) { - foundCategories.push(categories[j]) + foundCategories.push(categories[j]); } } } else { - foundCategories = categories + foundCategories = categories; } // if ((Object.keys(req.query).indexOf('query') == -1) || (Object.keys(req.query).indexOf('sample') == -1)) { // return larkin.info(req, res, next) // } - async.parallel({ - places: (callback) => { - https.get(`https://api.mapbox.com/geocoding/v5/mapbox.places/${req.query.query}.json?access_token=pk.eyJ1IjoiamN6YXBsZXdza2kiLCJhIjoiY2pjMjBiYWRjMDh2ZzJ4cHIwMjdyeWpieCJ9.EO2U9fSUuSPFvJ8LBQ4QSg&types=country,region,locality,place,poi.landmark`, res => { - res.setEncoding('utf8') - let body = '' - res.on('data', data => { - body += data - }) - res.on('end', () => { - body = JSON.parse(body) + async.parallel( + { + places: (callback) => { + https.get( + `https://api.mapbox.com/geocoding/v5/mapbox.places/${req.query.query}.json?access_token=pk.eyJ1IjoiamN6YXBsZXdza2kiLCJhIjoiY2pjMjBiYWRjMDh2ZzJ4cHIwMjdyeWpieCJ9.EO2U9fSUuSPFvJ8LBQ4QSg&types=country,region,locality,place,poi.landmark`, + (res) => { + res.setEncoding("utf8"); + let body = ""; + res.on("data", (data) => { + body += data; + }); + res.on("end", () => { + body = JSON.parse(body); - // handle no features - if (!body || !body.features) { - callback(null, []) - } else { - callback(null, body.features.map(place => { - return { - type: 'place', - category: 'place', - place_type: (place.place_type && place.place_type.length) ? place.place_type[0] : '', - name: place.place_name, - bbox: place.bbox || [], - center: place.center || [] + // handle no features + if (!body || !body.features) { + callback(null, []); + } else { + callback( + null, + body.features.map((place) => { + return { + type: "place", + category: "place", + place_type: + place.place_type && place.place_type.length + ? place.place_type[0] + : "", + name: place.place_name, + bbox: place.bbox || [], + center: place.center || [], + }; + }), + ); } - })) - } - }) - }) - }, - macrostrat: (callback) => { - larkin.queryPg('burwell', ` + }); + }, + ); + }, + macrostrat: (callback) => { + larkin.queryPg( + "burwell", + ` SELECT id, name, type, category FROM macrostrat.autocomplete WHERE name ILIKE $1 AND category = ANY($2) LIMIT 100 - `, [`${req.query.query}%`, foundCategories], (error, result) => { - if (error) { - return callback(error) - } - callback(null, result.rows) - }) - } - }, (error, results) => { - if (error) { - console.log(error) - return larkin.error(req, res, next, error) - } + `, + [`${req.query.query}%`, foundCategories], + (error, result) => { + if (error) { + return callback(error); + } + callback(null, result.rows); + }, + ); + }, + }, + (error, results) => { + if (error) { + console.log(error); + return larkin.error(req, res, next, error); + } - larkin.sendData(req, res, next, { - format: 'json', - compact: true - }, { - data: results.macrostrat.concat(results.places) - }) - }) -} + larkin.sendData( + req, + res, + next, + { + format: "json", + compact: true, + }, + { + data: results.macrostrat.concat(results.places), + }, + ); + }, + ); +}; diff --git a/v2/mobile/dashboard.ts b/v2/mobile/dashboard.ts index 28a5e37a..fe6b837c 100644 --- a/v2/mobile/dashboard.ts +++ b/v2/mobile/dashboard.ts @@ -1,17 +1,19 @@ -const api = require('../api') -const larkin = require('../larkin') -const async = require('async') +const api = require("../api"); +const larkin = require("../larkin"); +const async = require("async"); const above = { - 'large': 'medium', - 'medium': 'small', - 'small': 'tiny' -} + large: "medium", + medium: "small", + small: "tiny", +}; function queryCarto(scale, lng, lat, callback) { - scale = scale || 'large' + scale = scale || "large"; - larkin.queryPg('burwell', ` + larkin.queryPg( + "burwell", + ` SELECT x.map_id, x.source_id, @@ -89,23 +91,25 @@ function queryCarto(scale, lng, lat, callback) { JOIN maps.map_legend ml ON ml.map_id = x.map_id JOIN maps.legend l ON ml.legend_id = l.legend_id WHERE ST_Intersects(x.geom, $1) - `, [ `SRID=4326;POINT(${lng} ${lat})`], (error, result) => { - if (error) { - console.log('error here', scale, lng, lat) - return callback(error) - } - if (!result || !result.rows || !result.rows.length) { - // try going a scale up - if (above[scale]) { - queryCarto(above[scale], lng, lat, callback) + `, + [`SRID=4326;POINT(${lng} ${lat})`], + (error, result) => { + if (error) { + console.log("error here", scale, lng, lat); + return callback(error); + } + if (!result || !result.rows || !result.rows.length) { + // try going a scale up + if (above[scale]) { + queryCarto(above[scale], lng, lat, callback); + } else { + callback(null, null); + } } else { - callback(null, null) + callback(null, result.rows[0]); } - } else { - callback(null, result.rows[0]) - } - - }) + }, + ); } module.exports = (req, res, next) => { @@ -114,26 +118,29 @@ module.exports = (req, res, next) => { } if (!req.query.lng || !req.query.lat) { - return larkin.error(req, res, next) + return larkin.error(req, res, next); } - req.query.lng = larkin.normalizeLng(req.query.lng) + req.query.lng = larkin.normalizeLng(req.query.lng); - async.parallel({ - rocks: (callback) => { - queryCarto(null, req.query.lng, req.query.lat, (error, data) => { - callback(null, data) - }) - }, + async.parallel( + { + rocks: (callback) => { + queryCarto(null, req.query.lng, req.query.lat, (error, data) => { + callback(null, data); + }); + }, - elevation: (callback) => { - require('../elevation')(req, null, null, function(error, result) { - let elevation = (result && result.length) ? result[0].elevation : null - callback(null, elevation) - }); - }, + elevation: (callback) => { + require("../elevation")(req, null, null, function (error, result) { + let elevation = result && result.length ? result[0].elevation : null; + callback(null, elevation); + }); + }, - regions: (callback) => { - larkin.queryPg('burwell', ` + regions: (callback) => { + larkin.queryPg( + "burwell", + ` SELECT sub.boundary_id, sub.name, sub.boundary_group, sub.boundary_type, sub.boundary_class, sub.descrip, sub.wiki_link, row_to_json( (SELECT x FROM (SELECT sources.source_id, sources.name, sources.url, sources.ref_title, sources.authors, sources.ref_year, sources.ref_source, COALESCE(sources.isbn_doi, '') AS isbn_doi) x) @@ -155,34 +162,48 @@ module.exports = (req, res, next) => { ) sub JOIN geologic_boundaries.sources ON sub.source_id = sources.source_id WHERE rn = 1 - `, [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`], (error, result) => { - let regions = (result && result.rows && result.rows.length) ? result.rows : [] - callback(null, regions) - }) - } - }, (error, data) => { - if (error) { - return larkin.error(req, res, next) - } - let summary = data.rocks || {} - summary['elevation'] = data.elevation - summary['regions'] = data.regions + `, + [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`], + (error, result) => { + let regions = + result && result.rows && result.rows.length ? result.rows : []; + callback(null, regions); + }, + ); + }, + }, + (error, data) => { + if (error) { + return larkin.error(req, res, next); + } + let summary = data.rocks || {}; + summary["elevation"] = data.elevation; + summary["regions"] = data.regions; - if (summary['b_age']) { - summary['b_age'] = parseFloat(summary['b_age']) - } - if (summary['t_age']) { - summary['t_age'] = parseFloat(summary['t_age']) - } - if (summary.lith && summary.lith.length) { - summary['lith_color'] = summary.lith[0].color - } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : 'json', - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true - }, { - data: summary - }) - }) -} + if (summary["b_age"]) { + summary["b_age"] = parseFloat(summary["b_age"]); + } + if (summary["t_age"]) { + summary["t_age"] = parseFloat(summary["t_age"]); + } + if (summary.lith && summary.lith.length) { + summary["lith_color"] = summary.lith[0].color; + } + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + compact: true, + }, + { + data: summary, + }, + ); + }, + ); +}; diff --git a/v2/mobile/fossil_collections.ts b/v2/mobile/fossil_collections.ts index 809ff288..2bd49041 100644 --- a/v2/mobile/fossil_collections.ts +++ b/v2/mobile/fossil_collections.ts @@ -1,26 +1,37 @@ var api = require("../api"), - larkin = require("../larkin"); + larkin = require("../larkin"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (req.query.unit_id || "sample" in req.query) { if ("sample" in req.query) { req.query.unit_id = 15176; } - larkin.query("SELECT DISTINCT collection_no AS cltn_id, collection_name AS cltn_name FROM pbdb_matches WHERE unit_id = ? AND occs > 0 and release_date 0 and release_date 0)` + ` + + where + + ` AND array_length(strat_name_ids, 1) > 0)` + ); } var nextRank = { - 'fm': 'gp', - 'gp': 'sgp' -} + fm: "gp", + gp: "sgp", +}; var fullRank = { - 'fm': 'Formation', - 'gp': 'Group', - 'sgp': 'Supergroup' -} + fm: "Formation", + gp: "Group", + sgp: "Supergroup", +}; function parseBest(names, rank, callback) { - var grouped = _.groupBy(names, function(d) { return d[rank]; }); + var grouped = _.groupBy(names, function (d) { + return d[rank]; + }); var best = []; - Object.keys(grouped).forEach(function(d) { - if (d === '') { - grouped[d].forEach(function(j) { + Object.keys(grouped).forEach(function (d) { + if (d === "") { + grouped[d].forEach(function (j) { best.push(j.strat_name_long); }); - } else { - best.push(d + ' ' + fullRank[rank]); + best.push(d + " " + fullRank[rank]); } }); callback(best); } function groupStratNames(names, rank, callback) { if (!rank) { - rank = 'fm'; + rank = "fm"; } - parseBest(names, rank, function(result) { - if (result.length > 3 && rank != 'sgp') { + parseBest(names, rank, function (result) { + if (result.length > 3 && rank != "sgp") { groupStratNames(names, nextRank[rank], callback); - } else if (rank === 'sgp' && result.length > 3) { - parseBest(names, 'gp', function(bestNames) { + } else if (rank === "sgp" && result.length > 3) { + parseBest(names, "gp", function (bestNames) { callback(bestNames); }); } else { @@ -63,150 +73,115 @@ function groupStratNames(names, rank, callback) { } function summarizeBurwell(lat, lng, callback) { - require('../geologic_units_burwell')({query: {lat: lat, lng: lng}}, null, null, function(error, result) { - if (error) return callback(error); - if (result.length) { - var bestAge = _.min(result, function(d) { return d.b_int_age - d.t_int_age; }); - var parsed = { - b_age: bestAge.b_int_age, - t_age: bestAge.t_int_age, - b_int_name: bestAge.b_int_name, - t_int_name: bestAge.t_int_name, - lith: _.countBy(_.uniq(_.flatten(result.map(function(d) { return d.liths; })))) - } - - if (Object.keys(parsed.lith).length) { - require('../definitions/lithologies')({ - query: { - lith_id: Object.keys(parsed.lith).join(',') - }}, null, null, function(error, result) { - var totalLiths = Object.keys(parsed.lith).map(function(d) { - return parsed.lith[d]; - }).reduce(function(a, b) { return a + b; }, 0); - - result.forEach(function(d) { - d.prop = totalLiths / parsed.lith[d.lith_id]; - delete d.t_units; - }); - - parsed.lith = result; - callback(null, parsed); + require("../geologic_units_burwell")( + { query: { lat: lat, lng: lng } }, + null, + null, + function (error, result) { + if (error) return callback(error); + if (result.length) { + var bestAge = _.min(result, function (d) { + return d.b_int_age - d.t_int_age; }); + var parsed = { + b_age: bestAge.b_int_age, + t_age: bestAge.t_int_age, + b_int_name: bestAge.b_int_name, + t_int_name: bestAge.t_int_name, + lith: _.countBy( + _.uniq( + _.flatten( + result.map(function (d) { + return d.liths; + }), + ), + ), + ), + }; + + if (Object.keys(parsed.lith).length) { + require("../definitions/lithologies")( + { + query: { + lith_id: Object.keys(parsed.lith).join(","), + }, + }, + null, + null, + function (error, result) { + var totalLiths = Object.keys(parsed.lith) + .map(function (d) { + return parsed.lith[d]; + }) + .reduce(function (a, b) { + return a + b; + }, 0); + + result.forEach(function (d) { + d.prop = totalLiths / parsed.lith[d.lith_id]; + delete d.t_units; + }); + + parsed.lith = result; + callback(null, parsed); + }, + ); + } else { + result.lith = []; + callback(null, parsed); + } } else { - result.lith = []; - callback(null, parsed); + callback(null, {}); } - - } else { - callback(null, {}); - } - }); + }, + ); } - -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { larkin.info(req, res, next); } else { - - async.waterfall([ - function(callback) { - var where = [], + async.waterfall( + [ + function (callback) { + var where = [], params = [], limit; - if ("sample" in req.query) { - limit = " LIMIT 5"; - req.query.scale = "medium"; - } else { - limit = ""; - } - - if (req.query.lat && req.query.lng) { - req.query.lng = larkin.normalizeLng(req.query.lng); - if (req.query.buffer && req.query.buffer <= 50) { - where.push("ST_Intersects(m.geom, ST_Buffer(ST_GeographyFromText($" + (where.length + 1) + "), $" + (where.length + 2) + ")::geometry)"); - params.push("POINT(" + req.query.lng + " " + req.query.lat + ")", req.query.buffer * 1000); + if ("sample" in req.query) { + limit = " LIMIT 5"; + req.query.scale = "medium"; } else { - where.push("ST_Intersects(m.geom, ST_GeomFromText($" + (where.length + 1) + ", 4326))"); - params.push("POINT(" + req.query.lng + " " + req.query.lat + ")"); - } - } - - // If no valid parameters passed, return an Error - if (where.length < 1 && !("sample" in req.query)) { - return larkin.error(req, res, next, "No valid parameters passed"); - } - - if (where.length > 0) { - where = " WHERE " + where.join(" AND "); - } else { - where = ""; - } - - var scaleSQL = ["tiny", "small", "medium", "large"].map(function(d) { - return buildSQL(req, d, where, limit); - }).join(" UNION "); - - var toRun = "WITH first AS (SELECT unnest(macro_units) units FROM ( " + scaleSQL + ") doit) SELECT array_agg(distinct units) units FROM first"; - - larkin.queryPg("burwell", toRun, params, function(error, result) { - if (error) { - return callback(error); + limit = ""; } - callback(null, result.rows); - - }); - }, - - function(units, callback) { - if (!units.length || !units[0].units) { - summarizeBurwell(req.query.lat, req.query.lng, function(error, data) { - if (error) return callback(error); - return callback(null, data); - }); - - } else { - require('../units')({query: {unit_id: units[0].units }}, null, null, function(error, result) { - if (error) return callback(error); - - if (!result.length) return callback(null, {}); - - callback(null, { - max_thick: _.reduce(result.map(function(d) { return d.max_thick}) , function(a, b) { return a + b}, 0), - max_thick: _.reduce(result.map(function(d) { - if (d.min_thick === 0) { - return d.max_thick; - } else { - return d.min_thick - } - }) , function(a, b) { return a + b}, 0), - min_min_thick: _.reduce(result.map(function(d) { return d.min_thick}) , function(a, b) { return a + b}, 0), - b_age: _.max(result, function(d) { return d.b_age; }).b_age, - t_age: _.min(result, function(d) { return d.t_age; }).t_age, - b_int_name: _.max(result, function(d) { return d.b_age; }).b_int_name, - t_int_name: _.min(result, function(d) { return d.t_age; }).t_int_name, - lith: larkin.summarizeAttribute(result, "lith"), - environ: larkin.summarizeAttribute(result, "environ"), - econs: larkin.summarizeAttribute(result, "econ") - }); - }); - } - }, - - function(unit_summary, callback) { - // Basically indicates units were returned - if (unit_summary.hasOwnProperty("max_thick")) { - // Get best strat names - var where = [], - params = [], - limit = ""; - if (req.query.lat && req.query.lng) { req.query.lng = larkin.normalizeLng(req.query.lng); - where.push("ST_Intersects(m.geom, ST_GeomFromText($" + (where.length + 1) + ", 4326))"); - params.push("POINT(" + req.query.lng + " " + req.query.lat + ")"); + if (req.query.buffer && req.query.buffer <= 50) { + where.push( + "ST_Intersects(m.geom, ST_Buffer(ST_GeographyFromText($" + + (where.length + 1) + + "), $" + + (where.length + 2) + + ")::geometry)", + ); + params.push( + "POINT(" + req.query.lng + " " + req.query.lat + ")", + req.query.buffer * 1000, + ); + } else { + where.push( + "ST_Intersects(m.geom, ST_GeomFromText($" + + (where.length + 1) + + ", 4326))", + ); + params.push("POINT(" + req.query.lng + " " + req.query.lat + ")"); + } + } + + // If no valid parameters passed, return an Error + if (where.length < 1 && !("sample" in req.query)) { + return larkin.error(req, res, next, "No valid parameters passed"); } if (where.length > 0) { @@ -215,75 +190,210 @@ module.exports = function(req, res, next) { where = ""; } - var scaleSQL = ["tiny", "small", "medium", "large"].map(function(d) { - return buildStratNameSQL(d, where, limit); - }).join(" UNION "); + var scaleSQL = ["tiny", "small", "medium", "large"] + .map(function (d) { + return buildSQL(req, d, where, limit); + }) + .join(" UNION "); - var toRun = "WITH first AS ( " + scaleSQL + " ) SELECT scale, array_agg(distinct strat_name_id) strat_name_ids FROM first GROUP BY scale"; + var toRun = + "WITH first AS (SELECT unnest(macro_units) units FROM ( " + + scaleSQL + + ") doit) SELECT array_agg(distinct units) units FROM first"; - larkin.queryPg("burwell", toRun, params, function(error, result) { + larkin.queryPg("burwell", toRun, params, function (error, result) { if (error) { return callback(error); } - var scales = result.rows.map(function(d) { - return d.scale; - }); - var bestScale = ''; - switch(true) { - case scales.indexOf('large') > -1: - bestScale = 'large'; - break; - case scales.indexOf('medium') > -1: - bestScale = 'medium'; - break; - case scales.indexOf('small') > -1: - bestScale = 'small'; - break; - case scales.indexOf('tiny') > -1: - bestScale = 'tiny'; - break; + callback(null, result.rows); + }); + }, + + function (units, callback) { + if (!units.length || !units[0].units) { + summarizeBurwell( + req.query.lat, + req.query.lng, + function (error, data) { + if (error) return callback(error); + return callback(null, data); + }, + ); + } else { + require("../units")( + { query: { unit_id: units[0].units } }, + null, + null, + function (error, result) { + if (error) return callback(error); + + if (!result.length) return callback(null, {}); + + callback(null, { + max_thick: _.reduce( + result.map(function (d) { + return d.max_thick; + }), + function (a, b) { + return a + b; + }, + 0, + ), + max_thick: _.reduce( + result.map(function (d) { + if (d.min_thick === 0) { + return d.max_thick; + } else { + return d.min_thick; + } + }), + function (a, b) { + return a + b; + }, + 0, + ), + min_min_thick: _.reduce( + result.map(function (d) { + return d.min_thick; + }), + function (a, b) { + return a + b; + }, + 0, + ), + b_age: _.max(result, function (d) { + return d.b_age; + }).b_age, + t_age: _.min(result, function (d) { + return d.t_age; + }).t_age, + b_int_name: _.max(result, function (d) { + return d.b_age; + }).b_int_name, + t_int_name: _.min(result, function (d) { + return d.t_age; + }).t_int_name, + lith: larkin.summarizeAttribute(result, "lith"), + environ: larkin.summarizeAttribute(result, "environ"), + econs: larkin.summarizeAttribute(result, "econ"), + }); + }, + ); + } + }, + + function (unit_summary, callback) { + // Basically indicates units were returned + if (unit_summary.hasOwnProperty("max_thick")) { + // Get best strat names + var where = [], + params = [], + limit = ""; + + if (req.query.lat && req.query.lng) { + req.query.lng = larkin.normalizeLng(req.query.lng); + where.push( + "ST_Intersects(m.geom, ST_GeomFromText($" + + (where.length + 1) + + ", 4326))", + ); + params.push("POINT(" + req.query.lng + " " + req.query.lat + ")"); } - var bestNames = result.rows.filter(function(d) { - if (d.scale === bestScale) return d; - }).map(function(d) { - return d.strat_name_ids; - })[0]; + if (where.length > 0) { + where = " WHERE " + where.join(" AND "); + } else { + where = ""; + } - require('../definitions/strat_names')({query: { strat_name_id: bestNames.join(',')}}, null, null, function(error, result) { - if (error) return callback(error); + var scaleSQL = ["tiny", "small", "medium", "large"] + .map(function (d) { + return buildStratNameSQL(d, where, limit); + }) + .join(" UNION "); - if (result.length <= 3) { - unit_summary.strat_names = result.map(function(d) { return d.strat_name_long; }); - unit_summary.strat_name_ids = result.map(function(d) { return d.strat_name_id; }); - callback(null, unit_summary); - } else { - groupStratNames(result, null, function(names) { - unit_summary.strat_names = names; - callback(null, unit_summary); - }); + var toRun = + "WITH first AS ( " + + scaleSQL + + " ) SELECT scale, array_agg(distinct strat_name_id) strat_name_ids FROM first GROUP BY scale"; + + larkin.queryPg("burwell", toRun, params, function (error, result) { + if (error) { + return callback(error); + } + var scales = result.rows.map(function (d) { + return d.scale; + }); + + var bestScale = ""; + switch (true) { + case scales.indexOf("large") > -1: + bestScale = "large"; + break; + case scales.indexOf("medium") > -1: + bestScale = "medium"; + break; + case scales.indexOf("small") > -1: + bestScale = "small"; + break; + case scales.indexOf("tiny") > -1: + bestScale = "tiny"; + break; } - }); - }); - } else { - // No units, thus no strat names so carry on - callback(null, unit_summary); - } - }, - function(unit_summary, callback) { - require('../elevation')(req, null, null, function(error, result) { - if (result && result.length) { - unit_summary['elevation'] = result[0].elevation; + var bestNames = result.rows + .filter(function (d) { + if (d.scale === bestScale) return d; + }) + .map(function (d) { + return d.strat_name_ids; + })[0]; + + require("../definitions/strat_names")( + { query: { strat_name_id: bestNames.join(",") } }, + null, + null, + function (error, result) { + if (error) return callback(error); + + if (result.length <= 3) { + unit_summary.strat_names = result.map(function (d) { + return d.strat_name_long; + }); + unit_summary.strat_name_ids = result.map(function (d) { + return d.strat_name_id; + }); + callback(null, unit_summary); + } else { + groupStratNames(result, null, function (names) { + unit_summary.strat_names = names; + callback(null, unit_summary); + }); + } + }, + ); + }); + } else { + // No units, thus no strat names so carry on + callback(null, unit_summary); } - callback(null, unit_summary); - }); - }, + }, - // Produce a warning message if on public lands - function(unit_summary, callback) { - larkin.queryPg("rockd", ` + function (unit_summary, callback) { + require("../elevation")(req, null, null, function (error, result) { + if (result && result.length) { + unit_summary["elevation"] = result[0].elevation; + } + callback(null, unit_summary); + }); + }, + + // Produce a warning message if on public lands + function (unit_summary, callback) { + larkin.queryPg( + "rockd", + ` SELECT CASE WHEN type LIKE '%NPS%' THEN CONCAT('You are in ', name, ' which is managed by the National Park Service. Removal of natural objects is strictly prohibited.') @@ -299,88 +409,141 @@ module.exports = function(req, res, next) { WHERE ST_Intersects(geom, $1) AND type != 'incorp' LIMIT 1 - `, ["SRID=4326;POINT(" + larkin.normalizeLng(req.query.lng) + " " + req.query.lat + ")"], function(error, data) { - if (data && data.rows && data.rows.length) { - unit_summary['warning'] = data.rows[0] - } - callback(null, unit_summary) - }) - }, - - function(unit_summary, callback) { - larkin.queryPg("rockd", "SELECT CONCAT(name, ', ', state) AS place FROM places ORDER BY geom <#> $1 LIMIT 1", ["SRID=4326;POINT(" + larkin.normalizeLng(req.query.lng) + " " + req.query.lat + ")"], function(error, data) { - if (data && data.rows && data.rows.length) { - unit_summary['near'] = data.rows[0].place; - } - callback(null, unit_summary); - }); - }, - - function(unit_summary, callback) { - if (!unit_summary.b_age) return callback(null, unit_summary); - - require('../definitions/intervals')({ - query: { - t_age: unit_summary.t_age, - b_age: unit_summary.b_age, - timescale_id: '3,11' - } - }, null, null, function(error, result) { - if (error) return callback(error); - - if (result.length) { - var best = result.filter(function(d) { - var timescales = d.timescales.map(function(j) { return j.timescale_id }) - if (timescales.indexOf(3) > -1) { - return d + `, + [ + "SRID=4326;POINT(" + + larkin.normalizeLng(req.query.lng) + + " " + + req.query.lat + + ")", + ], + function (error, data) { + if (data && data.rows && data.rows.length) { + unit_summary["warning"] = data.rows[0]; } - }) - var nextBest = result.filter(function(d) { - var timescales = d.timescales.map(function(j) { return j.timescale_id }) - if (timescales.indexOf(11) > -1 && d.int_type === 'era') { - return d + callback(null, unit_summary); + }, + ); + }, + + function (unit_summary, callback) { + larkin.queryPg( + "rockd", + "SELECT CONCAT(name, ', ', state) AS place FROM places ORDER BY geom <#> $1 LIMIT 1", + [ + "SRID=4326;POINT(" + + larkin.normalizeLng(req.query.lng) + + " " + + req.query.lat + + ")", + ], + function (error, data) { + if (data && data.rows && data.rows.length) { + unit_summary["near"] = data.rows[0].place; } - }) - unit_summary['c_int_name'] = (best.length) ? best[0].name : ((nextBest.length) ? nextBest[0].name : '') - unit_summary['int_color'] = (best.length) ? best[0].color : ((nextBest.length) ? nextBest[0].color : '') - // unit_summary['c_int_name'] = result[0].name; - // unit_summary['int_color'] = result[0].color; - } else { - require('../definitions/intervals')({ + callback(null, unit_summary); + }, + ); + }, + + function (unit_summary, callback) { + if (!unit_summary.b_age) return callback(null, unit_summary); + + require("../definitions/intervals")( + { query: { - name: unit_summary.b_int_name - } - }, null, null, function(error, result) { + t_age: unit_summary.t_age, + b_age: unit_summary.b_age, + timescale_id: "3,11", + }, + }, + null, + null, + function (error, result) { if (error) return callback(error); - if (!result || !result.length) return callback(null, unit_summary) - unit_summary['int_color'] = result[0].color - }) - } - callback(null, unit_summary); - }); - }, + if (result.length) { + var best = result.filter(function (d) { + var timescales = d.timescales.map(function (j) { + return j.timescale_id; + }); + if (timescales.indexOf(3) > -1) { + return d; + } + }); + var nextBest = result.filter(function (d) { + var timescales = d.timescales.map(function (j) { + return j.timescale_id; + }); + if (timescales.indexOf(11) > -1 && d.int_type === "era") { + return d; + } + }); + unit_summary["c_int_name"] = best.length + ? best[0].name + : nextBest.length + ? nextBest[0].name + : ""; + unit_summary["int_color"] = best.length + ? best[0].color + : nextBest.length + ? nextBest[0].color + : ""; + // unit_summary['c_int_name'] = result[0].name; + // unit_summary['int_color'] = result[0].color; + } else { + require("../definitions/intervals")( + { + query: { + name: unit_summary.b_int_name, + }, + }, + null, + null, + function (error, result) { + if (error) return callback(error); + if (!result || !result.length) + return callback(null, unit_summary); + + unit_summary["int_color"] = result[0].color; + }, + ); + } + callback(null, unit_summary); + }, + ); + }, - function(unit_summary, callback) { - if (!unit_summary.lith || !unit_summary.lith.length) return callback(null, unit_summary); + function (unit_summary, callback) { + if (!unit_summary.lith || !unit_summary.lith.length) + return callback(null, unit_summary); - require('../definitions/lithologies')({ - query: { - lith_id: _.max(unit_summary.lith, function(d) { return d.prop; }).lith_id - } - }, null, null, function(error, result) { - if (error) return callback(error); + require("../definitions/lithologies")( + { + query: { + lith_id: _.max(unit_summary.lith, function (d) { + return d.prop; + }).lith_id, + }, + }, + null, + null, + function (error, result) { + if (error) return callback(error); - if (result) { - unit_summary['lith_color'] = result[0].color; - } + if (result) { + unit_summary["lith_color"] = result[0].color; + } - callback(null, unit_summary); - }); - }, + callback(null, unit_summary); + }, + ); + }, - function(unit_summary, callback) { - larkin.queryPg('burwell', ` + function (unit_summary, callback) { + larkin.queryPg( + "burwell", + ` SELECT sub.boundary_id, sub.name, sub.boundary_group, sub.boundary_type, sub.boundary_class, sub.descrip, sub.wiki_link, row_to_json( (SELECT x FROM (SELECT sources.source_id, sources.name, sources.url, sources.ref_title, sources.authors, sources.ref_year, sources.ref_source, COALESCE(sources.isbn_doi, '') AS isbn_doi) x) @@ -402,29 +565,41 @@ module.exports = function(req, res, next) { ) sub JOIN geologic_boundaries.sources ON sub.source_id = sources.source_id WHERE rn = 1 - `, [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`], function(error, result) { - if (result && result.rows && result.rows.length) { - unit_summary['regions'] = result.rows - } else { - unit_summary['regions'] = [] - } - callback(null, unit_summary) - }) - } - - ], function(error, result) { - if (error) { - console.log('ERROR - ', error); - larkin.error(req, res, next, error); - } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true - }, { - data: result - }); - } - }); + `, + [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`], + function (error, result) { + if (result && result.rows && result.rows.length) { + unit_summary["regions"] = result.rows; + } else { + unit_summary["regions"] = []; + } + callback(null, unit_summary); + }, + ); + }, + ], + function (error, result) { + if (error) { + console.log("ERROR - ", error); + larkin.error(req, res, next, error); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + compact: true, + }, + { + data: result, + }, + ); + } + }, + ); } -} +}; diff --git a/v2/mobile/map_filter.ts b/v2/mobile/map_filter.ts index 77abccf8..60a2bbc1 100644 --- a/v2/mobile/map_filter.ts +++ b/v2/mobile/map_filter.ts @@ -1,54 +1,62 @@ // note that this route will throw an error when displaying documentation page because trap for case of no parameters not in here -'use strict' -const larkin = require('../larkin') +"use strict"; +const larkin = require("../larkin"); module.exports = (req, res, next) => { - let where = [] - let params = [] + let where = []; + let params = []; // Normal (strict) liths if (req.query.lith_class) { - where.push(`lith_classes && $${where.length + 1}`) - params.push(req.query.lith_class.split(',')) + where.push(`lith_classes && $${where.length + 1}`); + params.push(req.query.lith_class.split(",")); } if (req.query.lith_type) { - where.push(`lith_types && $${where.length + 1}`) - params.push(req.query.lith_type.split(',')) + where.push(`lith_types && $${where.length + 1}`); + params.push(req.query.lith_type.split(",")); } if (req.query.lith_id) { - where.push(`lith_ids && $${where.length + 1}`) - params.push(req.query.lith_id.split(',')) + where.push(`lith_ids && $${where.length + 1}`); + params.push(req.query.lith_id.split(",")); } // All liths if (req.query.all_lith_class) { - where.push(`all_lith_classes && $${where.length + 1}`) - params.push(req.query.all_lith_class.split(',')) + where.push(`all_lith_classes && $${where.length + 1}`); + params.push(req.query.all_lith_class.split(",")); } if (req.query.all_lith_type) { - where.push(`all_lith_types && $${where.length + 1}`) - params.push(req.query.all_lith_type.split(',')) + where.push(`all_lith_types && $${where.length + 1}`); + params.push(req.query.all_lith_type.split(",")); } if (req.query.all_lith_id) { - where.push(`all_lith_ids && $${where.length + 1}`) - params.push(req.query.all_lith_id.split(',')) + where.push(`all_lith_ids && $${where.length + 1}`); + params.push(req.query.all_lith_id.split(",")); } // Strat names if (req.query.strat_name_id) { - where.push(`strat_name_children && $${where.length + 1}`) - params.push(req.query.strat_name_id.split(',')) + where.push(`strat_name_children && $${where.length + 1}`); + params.push(req.query.strat_name_id.split(",")); } if (req.query.concept_id) { - where.push(`concept_ids && $${where.length + 1}`) - params.push(req.query.concept_id.split(',')) + where.push(`concept_ids && $${where.length + 1}`); + params.push(req.query.concept_id.split(",")); } let sql = ` SELECT legend_id FROM maps.legend - WHERE ${where.join(' AND ')} - ` - larkin.queryPg('burwell', sql, params, (error, result) => { - if (error) return larkin.error(req, res, next) - res.json(result.rows.map(row => { return row.legend_id }).filter(d => { if (d) return d })) - }) -} + WHERE ${where.join(" AND ")} + `; + larkin.queryPg("burwell", sql, params, (error, result) => { + if (error) return larkin.error(req, res, next); + res.json( + result.rows + .map((row) => { + return row.legend_id; + }) + .filter((d) => { + if (d) return d; + }), + ); + }); +}; diff --git a/v2/mobile/map_query.ts b/v2/mobile/map_query.ts index 6cbfd2b5..3f3781c1 100644 --- a/v2/mobile/map_query.ts +++ b/v2/mobile/map_query.ts @@ -1,155 +1,213 @@ -var api = require('../api') -var async = require('async') -var larkin = require('../larkin') -var _ = require('underscore') +var api = require("../api"); +var async = require("async"); +var larkin = require("../larkin"); +var _ = require("underscore"); -var LINE_TOLERANCE = 20 +var LINE_TOLERANCE = 20; var scaleLookup = { - 0: 'tiny', - 1: 'tiny', - 2: 'tiny', - 3: 'tiny', - 4: 'small', - 5: 'small', - 6: 'medium', - 7: 'medium', - 8: 'medium', - 9: 'medium', - 10: 'large', - 11: 'large', - 12: 'large', - 13: 'large', - 14: 'large', - 15: 'large', - 16: 'large', - 17: 'large', - 18: 'large', - 19: 'large', - 20: 'large', - 21: 'large', - 22: 'large', - 23: 'large', - 24: 'large' -} + 0: "tiny", + 1: "tiny", + 2: "tiny", + 3: "tiny", + 4: "small", + 5: "small", + 6: "medium", + 7: "medium", + 8: "medium", + 9: "medium", + 10: "large", + 11: "large", + 12: "large", + 13: "large", + 14: "large", + 15: "large", + 16: "large", + 17: "large", + 18: "large", + 19: "large", + 20: "large", + 21: "large", + 22: "large", + 23: "large", + 24: "large", +}; // Determine a priority order for each scale var priorities = { - 'tiny': ['tiny'], - 'small': ['small', 'tiny'], - 'medium': ['medium', 'small', 'tiny'], - 'large': ['large', 'medium', 'small', 'tiny'] -} + tiny: ["tiny"], + small: ["small", "tiny"], + medium: ["medium", "small", "tiny"], + large: ["large", "medium", "small", "tiny"], +}; const scaleIsIn = { - 'tiny': ['tiny'], - 'small': ['small', 'tiny'], - 'medium': ['medium', 'small'], - 'large': ['medium', 'large'] -} + tiny: ["tiny"], + small: ["small", "tiny"], + medium: ["medium", "small"], + large: ["medium", "large"], +}; // https://msdn.microsoft.com/en-us/library/bb259689.aspx // Calcucate m/px given a latitude and a zoom level function tolerance(lat, z) { - return (Math.cos(lat * Math.PI/180) * 2 * Math.PI * 6378137) / (256 * Math.pow(2, z)) + return ( + (Math.cos((lat * Math.PI) / 180) * 2 * Math.PI * 6378137) / + (256 * Math.pow(2, z)) + ); } function getBestFit(z, data) { - var currentScale = scaleLookup[z] - var returnedScales = _.uniq(data.map(function(d) { return d.scale })) + var currentScale = scaleLookup[z]; + var returnedScales = _.uniq( + data.map(function (d) { + return d.scale; + }), + ); - var targetScales = [] + var targetScales = []; // Iterate on possible scales given our z for (var i = 0; i < priorities[currentScale].length; i++) { // If that scale is present, record it - if (returnedScales.indexOf(priorities[currentScale][i]) > -1) { - targetScales.push(priorities[currentScale][i]) - if (currentScale != 'tiny' && currentScale != 'small') { - break - } else if (targetScales.length > 1) { - break - } - } - } + if (returnedScales.indexOf(priorities[currentScale][i]) > -1) { + targetScales.push(priorities[currentScale][i]); + if (currentScale != "tiny" && currentScale != "small") { + break; + } else if (targetScales.length > 1) { + break; + } + } + } - var bestFit = data.filter(function(d) { - if (targetScales.indexOf(d.scale) > -1) { - delete d.scale - return d - } - }) + var bestFit = data.filter(function (d) { + if (targetScales.indexOf(d.scale) > -1) { + delete d.scale; + return d; + } + }); - return bestFit + return bestFit; } function summarizeUnits(units, callback) { - var stratNames = units.map(function(d) { return { - name: d.strat_name_long, - id: d.strat_name_id - }}) - var recorded = {} - var filteredStratNames = stratNames.filter(function(d) { + var stratNames = units.map(function (d) { + return { + name: d.strat_name_long, + id: d.strat_name_id, + }; + }); + var recorded = {}; + var filteredStratNames = stratNames.filter(function (d) { if (!recorded[d.id]) { - recorded[d.id] = d - return d + recorded[d.id] = d; + return d; } - }) + }); callback({ - ids: units.map(function(d) { return d.unit_id }), + ids: units.map(function (d) { + return d.unit_id; + }), strat_names: filteredStratNames, - rank_names: _.uniq(units.map(function(d) { return d.strat_name_long })).join(', '), - max_thick: _.reduce(units.map(function(d) { return d.max_thick}), function(a, b) { return a + b}, 0), - max_min_thick: _.reduce(units.map(function(d) { - if (d.min_thick === 0) { - return d.max_thick - } else { - return d.min_thick - } - }) , function(a, b) { return a + b}, 0), - min_min_thick: _.reduce(units.map(function(d) { return d.min_thick}) , function(a, b) { return a + b}, 0), - - b_age: _.max(units, function(d) { return d.b_age }).b_age, - t_age: _.min(units, function(d) { return d.t_age }).t_age, - b_int_name: _.max(units, function(d) { return d.b_age }).b_int_name, - t_int_name: _.min(units, function(d) { return d.t_age }).t_int_name, - - pbdb_collections: _.reduce(units.map(function(d) { return d.pbdb_collections }), function(a, b) { return a + b}, 0), - lith: larkin.summarizeAttribute(units, 'lith'), - environ: larkin.summarizeAttribute(units, 'environ'), - econ: larkin.summarizeAttribute(units, 'econ'), - uniqueIntervals: (function() { + rank_names: _.uniq( + units.map(function (d) { + return d.strat_name_long; + }), + ).join(", "), + max_thick: _.reduce( + units.map(function (d) { + return d.max_thick; + }), + function (a, b) { + return a + b; + }, + 0, + ), + max_min_thick: _.reduce( + units.map(function (d) { + if (d.min_thick === 0) { + return d.max_thick; + } else { + return d.min_thick; + } + }), + function (a, b) { + return a + b; + }, + 0, + ), + min_min_thick: _.reduce( + units.map(function (d) { + return d.min_thick; + }), + function (a, b) { + return a + b; + }, + 0, + ), + + b_age: _.max(units, function (d) { + return d.b_age; + }).b_age, + t_age: _.min(units, function (d) { + return d.t_age; + }).t_age, + b_int_name: _.max(units, function (d) { + return d.b_age; + }).b_int_name, + t_int_name: _.min(units, function (d) { + return d.t_age; + }).t_int_name, + + pbdb_collections: _.reduce( + units.map(function (d) { + return d.pbdb_collections; + }), + function (a, b) { + return a + b; + }, + 0, + ), + lith: larkin.summarizeAttribute(units, "lith"), + environ: larkin.summarizeAttribute(units, "environ"), + econ: larkin.summarizeAttribute(units, "econ"), + uniqueIntervals: (function () { var min_age = 9999, - min_age_interval = '', - max_age = -1, - max_age_interval = '' + min_age_interval = "", + max_age = -1, + max_age_interval = ""; - units.forEach(function(d, i) { + units.forEach(function (d, i) { if (d.t_age < min_age) { - min_age = d.t_age - min_age_interval = d.t_int_name + min_age = d.t_age; + min_age_interval = d.t_int_name; } if (d.b_age > max_age) { - max_age = d.b_age - max_age_interval = d.b_int_name + max_age = d.b_age; + max_age_interval = d.b_int_name; } - }) - return (max_age_interval === min_age_interval) ? min_age_interval : max_age_interval + ' - ' + min_age_interval - })() - }) + }); + return max_age_interval === min_age_interval + ? min_age_interval + : max_age_interval + " - " + min_age_interval; + })(), + }); } - function buildSQL(scale, where) { - let scaleJoin = scaleIsIn[scale].map(s => { - return ` + let scaleJoin = scaleIsIn[scale] + .map((s) => { + return ` SELECT * FROM maps.${s} - ` - }).join(' UNION ALL ') - let lookupJoin = scaleIsIn[scale].map(s => { - return ` + `; + }) + .join(" UNION ALL "); + let lookupJoin = scaleIsIn[scale] + .map((s) => { + return ` SELECT * FROM lookup_${s} - ` - }).join(' UNION ALL ') + `; + }) + .join(" UNION ALL "); return ` SELECT @@ -191,42 +249,53 @@ function buildSQL(scale, where) { LEFT JOIN macrostrat.intervals tb ON m.b_interval = tb.id ${where} ORDER BY sources.new_priority DESC - ` + `; } - // Accepts a longitude, a latitude, and a zoom level // Returns the proper burwell data and macrostrat data -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - if ((!req.query.lng || !req.query.lat || !req.query.z) && !req.query.hasOwnProperty('sample')) { - return larkin.error(req, res, next, 'You are missing a required parameter', 400) + if ( + (!req.query.lng || !req.query.lat || !req.query.z) && + !req.query.hasOwnProperty("sample") + ) { + return larkin.error( + req, + res, + next, + "You are missing a required parameter", + 400, + ); } - if ('sample' in req.query) { - req.query.lng = -89.3 - req.query.lat = 43.03 - req.query.z = 10 + if ("sample" in req.query) { + req.query.lng = -89.3; + req.query.lat = 43.03; + req.query.z = 10; } - req.query.lng = larkin.normalizeLng(req.query.lng) - req.query.z = parseInt(req.query.z || 0) - - async.parallel({ - elevation: function(cb) { - require('../elevation')(req, null, null, function(error, data) { - if (data && data.length) { - cb(null, data[0].elevation) - } else { - cb(null, null) - } - }) - }, - lines: function(cb) { - var scale = scaleLookup[req.query.z] - larkin.queryPg('burwell', ` + req.query.lng = larkin.normalizeLng(req.query.lng); + req.query.z = parseInt(req.query.z || 0); + + async.parallel( + { + elevation: function (cb) { + require("../elevation")(req, null, null, function (error, data) { + if (data && data.length) { + cb(null, data[0].elevation); + } else { + cb(null, null); + } + }); + }, + lines: function (cb) { + var scale = scaleLookup[req.query.z]; + larkin.queryPg( + "burwell", + ` SELECT m.line_id, COALESCE(s.name, '') AS name, @@ -260,140 +329,187 @@ module.exports = function(req, res, next) { WHERE sources.status_code = 'active' ORDER BY m.geom <-> $1 LIMIT 1 - `, [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`], function(error, result) { - if (error) return cb(error); - - var bestFit = (result.rows && result.rows.length) ? result.rows[0] : {} - - // Verify that the best fit is within a clickable tolerance - if (bestFit.hasOwnProperty('distance') && bestFit.distance >= (tolerance(req.query.lat, req.query.z) * 20 )) { - bestFit = {} - } - - if (bestFit.hasOwnProperty('distance')) { - delete bestFit.distance + `, + [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`], + function (error, result) { + if (error) return cb(error); + + var bestFit = + result.rows && result.rows.length ? result.rows[0] : {}; + + // Verify that the best fit is within a clickable tolerance + if ( + bestFit.hasOwnProperty("distance") && + bestFit.distance >= tolerance(req.query.lat, req.query.z) * 20 + ) { + bestFit = {}; + } + + if (bestFit.hasOwnProperty("distance")) { + delete bestFit.distance; + } + + cb(null, bestFit); + }, + ); + }, + burwell: function (cb) { + var where = []; + var params = []; + where.push( + "ST_Intersects(y.geom, ST_GeomFromText($" + + (where.length + 1) + + ", 4326))", + ); + params.push(`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`); + + // If no valid parameters passed, return an Error + if (where.length < 1 && !("sample" in req.query)) { + return cb("No valid parameters passed"); } - cb(null, bestFit) - - }) + where.push(`sources.status_code = 'active'`); + + where = " WHERE " + where.join(" AND "); + + let z = req.query.z || 10; + let sql = buildSQL(scaleLookup[z], where); + + larkin.queryPg("burwell", sql, params, function (error, result) { + if (error) { + return cb(error); + } else { + var bestFit = result.rows[0] || {}; + var macroUnits = + bestFit && bestFit.macro_units ? bestFit.macro_units : []; + var macroNames = + bestFit && bestFit.strat_names ? bestFit.strat_names : []; + + if (macroUnits.length) { + require("../units")( + { query: { unit_id: macroUnits.join(",") } }, + null, + null, + function (error, result) { + if (error) console.log("Error fetching units", error); + if (result && result.length) { + // summarizeUnits + summarizeUnits(result, function (summary) { + if (macroNames.length) { + require("../definitions/strat_names")( + { + query: { + strat_name_id: macroNames.join(","), + }, + }, + null, + null, + function (error, result) { + if (error || !result || !result.length) { + return cb(null, { + burwell: bestFit, + macrostrat: summary, + }); + } + summary.rank_names = _.uniq( + result.map(function (d) { + return d.strat_name_long; + }), + ).join(", "); + summary.strat_names = result.map(function (d) { + return { + name: d.strat_name_long, + id: d.strat_name_id, + }; + }); + cb(null, { + burwell: bestFit, + macrostrat: summary, + }); + }, + ); + } else { + cb(null, { + burwell: bestFit, + macrostrat: summary, + }); + } + }); + } else { + cb(null, { + burwell: bestFit, + macrostrat: {}, + }); + } + }, + ); + } else if (macroNames.length) { + require("../definitions/strat_names")( + { + query: { + strat_name_id: macroNames.join(","), + }, + }, + null, + null, + function (error, result) { + if (error || !result || !result.length) { + console.log("Error fetching strat names ", error); + return cb(null, { + burwell: bestFit, + macrostrat: {}, + }); + } + cb(null, { + burwell: bestFit, + macrostrat: { + rank_names: _.uniq( + result.map(function (d) { + return d.strat_name_long; + }), + ).join(", "), + strat_names: result.map(function (d) { + return { + name: d.strat_name_long, + id: d.strat_name_id, + }; + }), + }, + }); + }, + ); + } else { + cb(null, { + burwell: bestFit, + macrostrat: {}, + }); + } + } + }); + }, }, - burwell: function(cb) { - var where = [] - var params = [] - where.push('ST_Intersects(y.geom, ST_GeomFromText($' + (where.length + 1) + ', 4326))'); - params.push(`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`); - - // If no valid parameters passed, return an Error - if (where.length < 1 && !('sample' in req.query)) { - return cb('No valid parameters passed') - } - - where.push(`sources.status_code = 'active'`) - - where = ' WHERE ' + where.join(' AND ') - - - let z = req.query.z || 10 - let sql = buildSQL(scaleLookup[z], where) - - larkin.queryPg('burwell', sql, params, function(error, result) { - if (error) { - return cb(error) - } else { - - var bestFit = result.rows[0] || {} - var macroUnits = (bestFit && bestFit.macro_units) ? bestFit.macro_units : [] - var macroNames = (bestFit && bestFit.strat_names) ? bestFit.strat_names : [] - - if (macroUnits.length) { - require('../units')({query: { unit_id: macroUnits.join(',') } }, null, null, function(error, result) { - if (error) console.log('Error fetching units', error); - if (result && result.length) { - // summarizeUnits - summarizeUnits(result, function(summary) { - if (macroNames.length) { - require('../definitions/strat_names')({ - query: { - strat_name_id: macroNames.join(',') - } - }, null, null, function(error, result) { - if (error || !result || !result.length) { - return cb(null, { - burwell: bestFit, - macrostrat: summary - }) - } - summary.rank_names = _.uniq(result.map(function(d) { return d.strat_name_long })).join(', ') - summary.strat_names = result.map(function(d) { return { - name: d.strat_name_long, - id: d.strat_name_id - }}) - cb(null, { - burwell: bestFit, - macrostrat: summary - }) - }) - } else { - cb(null, { - burwell: bestFit, - macrostrat: summary - }) - } - }) - } else { - cb(null, { - burwell: bestFit, - macrostrat: {} - }) - } - }) - } else if (macroNames.length) { - require('../definitions/strat_names')({ - query: { - strat_name_id: macroNames.join(',') - } - }, null, null, function(error, result) { - if (error || !result || !result.length) { - console.log('Error fetching strat names ', error) - return cb(null, { - burwell: bestFit, - macrostrat: {} - }) - } - cb(null, { - burwell: bestFit, - macrostrat: { - rank_names: _.uniq(result.map(function(d) { return d.strat_name_long })).join(', '), - strat_names: result.map(function(d) { return { - name: d.strat_name_long, - id: d.strat_name_id - }}) - } - }) - }) - } else { - cb(null, { - burwell: bestFit, - macrostrat: {} - }) - } - } - }) - } - }, function(error, data) { - if (error) return larkin.error(req, res, next, error || null) - - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : 'json', - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: { - elevation: data.elevation, - burwell: [ data.burwell.burwell ], - macrostrat: data.burwell.macrostrat, - lines: data.lines - } - }) - }) -} + function (error, data) { + if (error) return larkin.error(req, res, next, error || null); + + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: { + elevation: data.elevation, + burwell: [data.burwell.burwell], + macrostrat: data.burwell.macrostrat, + lines: data.lines, + }, + }, + ); + }, + ); +}; diff --git a/v2/mobile/map_query_v2.ts b/v2/mobile/map_query_v2.ts index f994cec8..19b07af2 100644 --- a/v2/mobile/map_query_v2.ts +++ b/v2/mobile/map_query_v2.ts @@ -1,60 +1,65 @@ -const api = require('../api') -const async = require('async') -const larkin = require('../larkin') -const _ = require('underscore') +const api = require("../api"); +const async = require("async"); +const larkin = require("../larkin"); +const _ = require("underscore"); -const LINE_TOLERANCE = 20 +const LINE_TOLERANCE = 20; const scaleLookup = { - 0: 'tiny', - 1: 'tiny', - 2: 'tiny', - 3: 'small', - 4: 'small', - 5: 'small', - 6: 'medium', - 7: 'medium', - 8: 'medium', - 9: 'large', - 10: 'large', - 11: 'large', - 12: 'large', - 13: 'large', - 14: 'large', - 15: 'large', - 16: 'large', - 17: 'large', - 18: 'large', - 19: 'large', - 20: 'large', - 21: 'large', - 22: 'large', - 23: 'large', - 24: 'large' -} + 0: "tiny", + 1: "tiny", + 2: "tiny", + 3: "small", + 4: "small", + 5: "small", + 6: "medium", + 7: "medium", + 8: "medium", + 9: "large", + 10: "large", + 11: "large", + 12: "large", + 13: "large", + 14: "large", + 15: "large", + 16: "large", + 17: "large", + 18: "large", + 19: "large", + 20: "large", + 21: "large", + 22: "large", + 23: "large", + 24: "large", +}; // Determine a priority order for each scale const priorities = { - 'tiny': ['tiny'], - 'small': ['small', 'tiny'], - 'medium': ['medium', 'small', 'tiny'], - 'large': ['large', 'medium', 'small', 'tiny'] -} + tiny: ["tiny"], + small: ["small", "tiny"], + medium: ["medium", "small", "tiny"], + large: ["large", "medium", "small", "tiny"], +}; const scaleIsIn = { - 'tiny': ['tiny'], - 'small': ['small', 'tiny'], - 'medium': ['medium', 'small'], - 'large': ['medium', 'large'] -} + tiny: ["tiny"], + small: ["small", "tiny"], + medium: ["medium", "small"], + large: ["medium", "large"], +}; // https://msdn.microsoft.com/en-us/library/bb259689.aspx // Calcucate m/px given a latitude and a zoom level function tolerance(lat, z) { - return (Math.cos(lat * Math.PI/180) * 2 * Math.PI * 6378137) / (256 * Math.pow(2, z)) + return ( + (Math.cos((lat * Math.PI) / 180) * 2 * Math.PI * 6378137) / + (256 * Math.pow(2, z)) + ); } function getUnits(params, callback) { - let p = (params.unit_ids) ? params.unit_ids : params.strat_name_ids - larkin.queryPg('burwell', ` + let p = params.unit_ids ? params.unit_ids : params.strat_name_ids; + larkin.queryPg( + "burwell", + ` SELECT ( SELECT json_agg(w) FROM ( @@ -131,52 +136,65 @@ function getUnits(params, callback) { LEFT JOIN macrostrat.lookup_units ON units.id = lookup_units.unit_id LEFT JOIN macrostrat.units_sections ON units.id = units_sections.unit_id LEFT JOIN macrostrat.cols ON units_sections.col_id = cols.id - WHERE ${params.unit_ids ? 'units.id' : 'lookup_strat_names.strat_name_id'} = ANY($1) - `, [p], (error, result) => { - if (error) return callback(error) - callback(null, result.rows) - }) + WHERE ${params.unit_ids ? "units.id" : "lookup_strat_names.strat_name_id"} = ANY($1) + `, + [p], + (error, result) => { + if (error) return callback(error); + callback(null, result.rows); + }, + ); } function getBestFit(z, data) { - var currentScale = scaleLookup[z] - let returnedScales = [...new Set(result.map(d => { return d.scale }))] + var currentScale = scaleLookup[z]; + let returnedScales = [ + ...new Set( + result.map((d) => { + return d.scale; + }), + ), + ]; - var targetScales = [] + var targetScales = []; // Iterate on possible scales given our z for (var i = 0; i < priorities[currentScale].length; i++) { // If that scale is present, record it - if (returnedScales.indexOf(priorities[currentScale][i]) > -1) { - targetScales.push(priorities[currentScale][i]) - if (currentScale != 'tiny' && currentScale != 'small') { - break - } else if (targetScales.length > 1) { - break - } - } - } + if (returnedScales.indexOf(priorities[currentScale][i]) > -1) { + targetScales.push(priorities[currentScale][i]); + if (currentScale != "tiny" && currentScale != "small") { + break; + } else if (targetScales.length > 1) { + break; + } + } + } - var bestFit = data.filter(function(d) { - if (targetScales.indexOf(d.scale) > -1) { - delete d.scale - return d - } - }) + var bestFit = data.filter(function (d) { + if (targetScales.indexOf(d.scale) > -1) { + delete d.scale; + return d; + } + }); - return bestFit + return bestFit; } function buildSQL(scale, where) { - let scaleJoin = scaleIsIn[scale].map(s => { - return ` + let scaleJoin = scaleIsIn[scale] + .map((s) => { + return ` SELECT * FROM maps.${s} - ` - }).join(' UNION ALL ') - let lookupJoin = scaleIsIn[scale].map(s => { - return ` + `; + }) + .join(" UNION ALL "); + let lookupJoin = scaleIsIn[scale] + .map((s) => { + return ` SELECT * FROM lookup_${s} - ` - }).join(' UNION ALL ') + `; + }) + .join(" UNION ALL "); return ` SELECT @@ -240,16 +258,18 @@ function buildSQL(scale, where) { ) mm ON mm.map_id = m.map_id ${where} ORDER BY sources.new_priority DESC - ` + `; } function buildLineSQL(scale) { - scale = scale || 'tiny' - let scaleJoin = scaleIsIn[scale].map(s => { - return ` + scale = scale || "tiny"; + let scaleJoin = scaleIsIn[scale] + .map((s) => { + return ` SELECT * FROM lines.${s} - ` - }).join(' UNION ALL ') + `; + }) + .join(" UNION ALL "); return ` SELECT @@ -276,10 +296,9 @@ function buildLineSQL(scale) { ) bar JOIN ( ${scaleJoin} ) y ON y.line_id = bar.line_id WHERE row_number = 1 - ` + `; } - // Accepts a longitude, a latitude, and a zoom level // Returns the proper burwell data and macrostrat data module.exports = (req, res, next) => { @@ -287,60 +306,95 @@ module.exports = (req, res, next) => { return larkin.info(req, res, next); } - if ((!req.query.lng || !req.query.lat || !req.query.z) && !req.query.hasOwnProperty('sample')) { - return larkin.error(req, res, next, 'You are missing a required parameter', 400) + if ( + (!req.query.lng || !req.query.lat || !req.query.z) && + !req.query.hasOwnProperty("sample") + ) { + return larkin.error( + req, + res, + next, + "You are missing a required parameter", + 400, + ); } - if ('sample' in req.query) { - req.query.lng = -89.3 - req.query.lat = 43.03 - req.query.z = 10 + if ("sample" in req.query) { + req.query.lng = -89.3; + req.query.lat = 43.03; + req.query.z = 10; } - req.query.lng = larkin.normalizeLng(req.query.lng) - req.query.z = parseInt(req.query.z || 0) - - async.parallel({ - elevation: (cb) => { - require('../elevation')(req, null, null, (error, data) => { - if (data && data.length) { - cb(null, data[0].elevation) - } else { - cb(null, null) - } - }) - }, - - lines: (cb) => { - larkin.queryPg('burwell', buildLineSQL(scaleLookup[req.query.z]), [ `SRID=4326;POINT(${req.query.lng} ${req.query.lat})` ], (error, result) => { - if (error) return cb(error) - result.rows = result.rows.filter(line => { - // Verify that the best fit is within a clickable tolerance - if (line.hasOwnProperty('distance') && line.distance <= (tolerance(req.query.lat, req.query.z) * 20 )) { - return line - } - }).map(line => { - delete line.distance - return line - }) - - cb(null, result.rows) - }) - }, - - columns: (cb) => { - larkin.queryPg('burwell', ` + req.query.lng = larkin.normalizeLng(req.query.lng); + req.query.z = parseInt(req.query.z || 0); + + async.parallel( + { + elevation: (cb) => { + require("../elevation")(req, null, null, (error, data) => { + if (data && data.length) { + cb(null, data[0].elevation); + } else { + cb(null, null); + } + }); + }, + + lines: (cb) => { + larkin.queryPg( + "burwell", + buildLineSQL(scaleLookup[req.query.z]), + [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`], + (error, result) => { + if (error) return cb(error); + result.rows = result.rows + .filter((line) => { + // Verify that the best fit is within a clickable tolerance + if ( + line.hasOwnProperty("distance") && + line.distance <= tolerance(req.query.lat, req.query.z) * 20 + ) { + return line; + } + }) + .map((line) => { + delete line.distance; + return line; + }); + + cb(null, result.rows); + }, + ); + }, + + columns: (cb) => { + larkin.queryPg( + "burwell", + ` SELECT count(*) AS total_columns FROM macrostrat.cols WHERE poly_geom IS NOT NULL AND status_code = 'active' AND ST_Intersects(poly_geom, $1) - `, [ `SRID=4326;POINT(${req.query.lng} ${req.query.lat})` ], (error, result) => { - if (error) return cb(error) - cb(null, ((result && result.rows.length && result.rows[0].total_columns && result.rows[0].total_columns != 0) ? true : false)) - }) - }, - - regions: (cb) => { - larkin.queryPg('burwell', ` + `, + [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`], + (error, result) => { + if (error) return cb(error); + cb( + null, + result && + result.rows.length && + result.rows[0].total_columns && + result.rows[0].total_columns != 0 + ? true + : false, + ); + }, + ); + }, + + regions: (cb) => { + larkin.queryPg( + "burwell", + ` SELECT sub.boundary_id, sub.name, sub.boundary_group, sub.boundary_type, sub.boundary_class, sub.descrip, sub.wiki_link, row_to_json( (SELECT x FROM (SELECT sources.source_id, sources.name, sources.url, sources.ref_title, sources.authors, sources.ref_year, sources.ref_source, COALESCE(sources.isbn_doi, '') AS isbn_doi) x) @@ -362,98 +416,120 @@ module.exports = (req, res, next) => { ) sub JOIN geologic_boundaries.sources ON sub.source_id = sources.source_id WHERE rn = 1 - `, [ `SRID=4326;POINT(${req.query.lng} ${req.query.lat})` ], (error, result) => { - if (error || !result || !result.rows) return cb(null, []) - cb(null, result.rows) - }) - }, - - burwell: (cb) => { - let where = [] - let params = [] - - if (req.query.map_id) { - where = [ `y.map_id = $1` ] - params = [ req.query.map_id ] - } else if (req.query.legend_id) { - where = [ `mm.legend_id = $1` ] - params = [ re.query.legend_id ] - } else { - where = [`ST_Intersects(y.geom, ST_GeomFromText($1, 4326))`] - params = [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`] - } - - // If no valid parameters passed, return an Error - if (where.length < 1 && !('sample' in req.query)) { - return cb('No valid parameters passed') - } - - where = ` WHERE ${where.join(' AND ')}` - - larkin.queryPg('burwell', buildSQL(scaleLookup[req.query.z], where), params, (error, result) => { - if (error) { - return cb(error) + `, + [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`], + (error, result) => { + if (error || !result || !result.rows) return cb(null, []); + cb(null, result.rows); + }, + ); + }, + + burwell: (cb) => { + let where = []; + let params = []; + + if (req.query.map_id) { + where = [`y.map_id = $1`]; + params = [req.query.map_id]; + } else if (req.query.legend_id) { + where = [`mm.legend_id = $1`]; + params = [re.query.legend_id]; + } else { + where = [`ST_Intersects(y.geom, ST_GeomFromText($1, 4326))`]; + params = [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`]; } - async.mapLimit(result.rows, 3, (mapPolygon, done) => { - let params = {} - if (mapPolygon.macro_units.length) { - params = { 'unit_ids': mapPolygon.macro_units } - } else if (mapPolygon.strat_names.length) { - params = { 'strat_name_ids': mapPolygon.strat_names } - } else { - mapPolygon.macrostrat = {} - return done(null, mapPolygon) - } - delete mapPolygon.strat_names - delete mapPolygon.macro_units - getUnits(params, (error, units) => { - if (error) { - return cb(error) - } - if (units.length) { - mapPolygon.macrostrat = units[0] - } else if (params.strat_name_ids) { - mapPolygon.macrostrat = { - strat_names: params.strat_name_ids - } - } else { - mapPolygon.macrostrat = {} - } - - done(null, mapPolygon) - }) - - // done(null, mapPolygon) - }, (error, results) => { - if (error) return larkin.error(req, res, next, error) - - cb(null, results) - }) - - }) - } - }, (error, data) => { - if (error) return larkin.error(req, res, next, error || null) + // If no valid parameters passed, return an Error + if (where.length < 1 && !("sample" in req.query)) { + return cb("No valid parameters passed"); + } - for (let i = 0; i < data.burwell.length; i++) { - data.burwell[i].lines = [] - for (let j = 0; j < data.lines.length; j++) { - if (data.burwell[i].source_id === data.lines[j].source_id) { - data.burwell[i].lines.push(data.lines[j]) + where = ` WHERE ${where.join(" AND ")}`; + + larkin.queryPg( + "burwell", + buildSQL(scaleLookup[req.query.z], where), + params, + (error, result) => { + if (error) { + return cb(error); + } + + async.mapLimit( + result.rows, + 3, + (mapPolygon, done) => { + let params = {}; + if (mapPolygon.macro_units.length) { + params = { unit_ids: mapPolygon.macro_units }; + } else if (mapPolygon.strat_names.length) { + params = { strat_name_ids: mapPolygon.strat_names }; + } else { + mapPolygon.macrostrat = {}; + return done(null, mapPolygon); + } + delete mapPolygon.strat_names; + delete mapPolygon.macro_units; + getUnits(params, (error, units) => { + if (error) { + return cb(error); + } + if (units.length) { + mapPolygon.macrostrat = units[0]; + } else if (params.strat_name_ids) { + mapPolygon.macrostrat = { + strat_names: params.strat_name_ids, + }; + } else { + mapPolygon.macrostrat = {}; + } + + done(null, mapPolygon); + }); + + // done(null, mapPolygon) + }, + (error, results) => { + if (error) return larkin.error(req, res, next, error); + + cb(null, results); + }, + ); + }, + ); + }, + }, + (error, data) => { + if (error) return larkin.error(req, res, next, error || null); + + for (let i = 0; i < data.burwell.length; i++) { + data.burwell[i].lines = []; + for (let j = 0; j < data.lines.length; j++) { + if (data.burwell[i].source_id === data.lines[j].source_id) { + data.burwell[i].lines.push(data.lines[j]); + } } } - } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : 'json', - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: { - elevation: data.elevation, - mapData: data.burwell, - regions: data.regions, - hasColumns: data.columns - } - }) - }) -} + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: { + elevation: data.elevation, + mapData: data.burwell, + regions: data.regions, + hasColumns: data.columns, + }, + }, + ); + }, + ); +}; diff --git a/v2/mobile/point.ts b/v2/mobile/point.ts index 5b148d07..f0291a28 100644 --- a/v2/mobile/point.ts +++ b/v2/mobile/point.ts @@ -1,17 +1,17 @@ -'use strict' +"use strict"; var api = require("../api"), - async = require("async"), - larkin = require("../larkin"); + async = require("async"), + larkin = require("../larkin"); -var _ = require("underscore") +var _ = require("underscore"); var priorities = { - 'tiny': ['tiny', 'small', 'medium', 'large'], - 'small': ['small', 'medium', 'large', 'tiny'], - 'medium': ['medium', 'large', 'small', 'tiny'], - 'large': ['large', 'medium', 'small', 'tiny'] -} + tiny: ["tiny", "small", "medium", "large"], + small: ["small", "medium", "large", "tiny"], + medium: ["medium", "large", "small", "tiny"], + large: ["large", "medium", "small", "tiny"], +}; function buildSQL(scale, where) { return ` @@ -44,96 +44,114 @@ function buildSQL(scale, where) { ${where} GROUP BY m.map_id ) - ` + `; } -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (!req.query.lat || !req.query.lng) { - return larkin.info(req, res, next) + return larkin.info(req, res, next); } - async.parallel({ - burwell: function(callback) { - let where = [` + async.parallel( + { + burwell: function (callback) { + let where = [ + ` ST_Intersects(m.geom, ST_GeomFromText($1, 4326)) - `] - let params = [ `SRID=4326;POINT(${req.query.lng} ${req.query.lat})` ] - - where = ' WHERE ' + where.join(' AND ') - - var scaleSQL = Object.keys(priorities).map(function(scale) { - return buildSQL(scale, where); - }).join(' UNION '); - - var toRun = `SELECT * FROM ( ${scaleSQL} ) doit`; - - larkin.queryPg("burwell", toRun, params, function(error, result) { - if (error || !result.rows || !result.rows.length) { - return callback(null, {}) - } - - var currentScale = "large" - var returnedScales = _.uniq(result.rows.map(function(d) { return d.scale })) - - var targetScales = [] - - // Iterate on possible scales given our z - for (var i = 0; i < priorities[currentScale].length; i++) { - // If that scale is present, record it - if (returnedScales.indexOf(priorities[currentScale][i]) > -1) { - targetScales.push(priorities[currentScale][i]) - if (currentScale != 'tiny' && currentScale != 'small') { - break - } else if (targetScales.length > 1) { - break - } - } - } - - var bestFit = result.rows.filter(function(d) { - if (targetScales.indexOf(d.scale) > -1) { - delete d.scale - return d - } - })[0] - callback(null, bestFit) - }) + `, + ]; + let params = [`SRID=4326;POINT(${req.query.lng} ${req.query.lat})`]; + + where = " WHERE " + where.join(" AND "); + + var scaleSQL = Object.keys(priorities) + .map(function (scale) { + return buildSQL(scale, where); + }) + .join(" UNION "); + + var toRun = `SELECT * FROM ( ${scaleSQL} ) doit`; + + larkin.queryPg("burwell", toRun, params, function (error, result) { + if (error || !result.rows || !result.rows.length) { + return callback(null, {}); + } + + var currentScale = "large"; + var returnedScales = _.uniq( + result.rows.map(function (d) { + return d.scale; + }), + ); + + var targetScales = []; + + // Iterate on possible scales given our z + for (var i = 0; i < priorities[currentScale].length; i++) { + // If that scale is present, record it + if (returnedScales.indexOf(priorities[currentScale][i]) > -1) { + targetScales.push(priorities[currentScale][i]); + if (currentScale != "tiny" && currentScale != "small") { + break; + } else if (targetScales.length > 1) { + break; + } + } + } + + var bestFit = result.rows.filter(function (d) { + if (targetScales.indexOf(d.scale) > -1) { + delete d.scale; + return d; + } + })[0]; + callback(null, bestFit); + }); + }, + + // Query Macrostrat for polygon + column: function (callback) { + require("../columns")(req, null, null, (error, result) => { + if (error) return callback(error); + + if (!result || !result.length) return callback(null, null); + + callback(null, result[0].col_id); + }); + }, }, - - // Query Macrostrat for polygon - column: function(callback) { - require('../columns')(req, null, null, (error, result) => { - if (error) return callback(error) - - if (!result || !result.length) return callback(null, null) - - callback(null, result[0].col_id) - }) - } - - }, function(error, result) { - if (error) { - larkin.error(req, res, next, error); - } else { - var response = { - "uid": result.burwell.map_id || "", - "rocktype": result.burwell.liths_full || [], - "age": result.burwell.age || "", - "name": result.burwell.name || "", - "desc": result.burwell.descrip || "", - "comm": result.burwell.comments || "", - "strat_unit": result.burwell.strat_name || "", - "map_ref": result.burwell.ref || {}, - "col_id": result.column || "", - }; - - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true - }, { - data: response - }); - } - }); -} + function (error, result) { + if (error) { + larkin.error(req, res, next, error); + } else { + var response = { + uid: result.burwell.map_id || "", + rocktype: result.burwell.liths_full || [], + age: result.burwell.age || "", + name: result.burwell.name || "", + desc: result.burwell.descrip || "", + comm: result.burwell.comments || "", + strat_unit: result.burwell.strat_name || "", + map_ref: result.burwell.ref || {}, + col_id: result.column || "", + }; + + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + compact: true, + }, + { + data: response, + }, + ); + } + }, + ); +}; diff --git a/v2/mobile/point_details.ts b/v2/mobile/point_details.ts index 6cce8843..fec4b3a6 100644 --- a/v2/mobile/point_details.ts +++ b/v2/mobile/point_details.ts @@ -1,57 +1,78 @@ var api = require("../api"), - async = require("async"), - wellknown = require("wellknown"), - gp = require("geojson-precision"), - larkin = require("../larkin"); + async = require("async"), + wellknown = require("wellknown"), + gp = require("geojson-precision"), + larkin = require("../larkin"); - -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (req.query.lat && req.query.lng) { - async.parallel({ - gmus: function(callback) { - larkin.queryPg("geomacro", "SELECT gid, (SELECT array_agg(DISTINCT rocktypes) FROM unnest(array[rocktype1, rocktype2, u_rocktype1, u_rocktype2, u_rocktype3]) rocktypes WHERE rocktypes IS NOT null) AS rocktype, unit_name, unit_age, unitdesc FROM gmus.lookup_units WHERE ST_Contains(geom, ST_GeomFromText($1, 4326))", ["POINT(" + req.query.lng + " " + req.query.lat + ")"], function(error, result) { - if (error) { - callback(error); - } else { - callback(null, result.rows[0]); - } - }); - }, - - column: function(callback) { - async.waterfall([ - function(callbackB) { - // Find nearest column - larkin.queryPg("geomacro", "SELECT id AS col_id, col_name, ST_AsGeoJSON(poly_geom) AS col_poly FROM macrostrat.cols WHERE ST_Contains(poly_geom, ST_GeomFromText($1, 4326)) and status_code='active'", ["POINT(" + req.query.lng + " " + req.query.lat + ")"], function(error, result) { + async.parallel( + { + gmus: function (callback) { + larkin.queryPg( + "geomacro", + "SELECT gid, (SELECT array_agg(DISTINCT rocktypes) FROM unnest(array[rocktype1, rocktype2, u_rocktype1, u_rocktype2, u_rocktype3]) rocktypes WHERE rocktypes IS NOT null) AS rocktype, unit_name, unit_age, unitdesc FROM gmus.lookup_units WHERE ST_Contains(geom, ST_GeomFromText($1, 4326))", + ["POINT(" + req.query.lng + " " + req.query.lat + ")"], + function (error, result) { if (error) { callback(error); } else { - /* If a column isn't immediately found, buffer the point by a degree, get all polygons that - intersect that buffer, and then find the closest one */ - if (result.rows.length < 1) { - larkin.queryPg("geomacro", "SELECT id AS col_id, col_name, ST_AsGeoJSON(poly_geom) AS col_poly FROM macrostrat.cols WHERE ST_Intersects(poly_geom, ST_Buffer(ST_GeomFromText($1, 4326), 1)) and status_code='active' ORDER BY ST_Distance(ST_GeomFromText($1, 4326), poly_geom) LIMIT 1", ["POINT(" + req.query.lng + " " + req.query.lat + ")"], function(error, result) { + callback(null, result.rows[0]); + } + }, + ); + }, + + column: function (callback) { + async.waterfall( + [ + function (callbackB) { + // Find nearest column + larkin.queryPg( + "geomacro", + "SELECT id AS col_id, col_name, ST_AsGeoJSON(poly_geom) AS col_poly FROM macrostrat.cols WHERE ST_Contains(poly_geom, ST_GeomFromText($1, 4326)) and status_code='active'", + ["POINT(" + req.query.lng + " " + req.query.lat + ")"], + function (error, result) { if (error) { callback(error); - - // If no columns are found within 1 degree, return an empty result - } else if (result.rows.length < 1) { - callbackB([]); } else { - // Otherwise return the closest one - callbackB(null, result.rows[0]); - } - }); - - } else { - callbackB(null, result.rows[0]); - } - } - }); - }, + /* If a column isn't immediately found, buffer the point by a degree, get all polygons that + intersect that buffer, and then find the closest one */ + if (result.rows.length < 1) { + larkin.queryPg( + "geomacro", + "SELECT id AS col_id, col_name, ST_AsGeoJSON(poly_geom) AS col_poly FROM macrostrat.cols WHERE ST_Intersects(poly_geom, ST_Buffer(ST_GeomFromText($1, 4326), 1)) and status_code='active' ORDER BY ST_Distance(ST_GeomFromText($1, 4326), poly_geom) LIMIT 1", + [ + "POINT(" + + req.query.lng + + " " + + req.query.lat + + ")", + ], + function (error, result) { + if (error) { + callback(error); - function(column, callbackB) { + // If no columns are found within 1 degree, return an empty result + } else if (result.rows.length < 1) { + callbackB([]); + } else { + // Otherwise return the closest one + callbackB(null, result.rows[0]); + } + }, + ); + } else { + callbackB(null, result.rows[0]); + } + } + }, + ); + }, - var sql = "SELECT units.id AS unit_id, units.strat_name, period, max_thick, min_thick, colors.unit_class, count(distinct collection_no) pbdb_cltns, lith_short AS lith FROM units \ + function (column, callbackB) { + var sql = + "SELECT units.id AS unit_id, units.strat_name, period, max_thick, min_thick, colors.unit_class, count(distinct collection_no) pbdb_cltns, lith_short AS lith FROM units \ JOIN colors ON colors.color = units.color \ JOIN units_sections ON units_sections.unit_id = units.id \ JOIN lookup_unit_liths ON lookup_unit_liths.unit_id=units.id \ @@ -62,125 +83,176 @@ module.exports = function(req, res, next) { WHERE units_sections.col_id = ? \ GROUP BY units.id ORDER BY t_age ASC"; - larkin.query(sql, [column.col_id], function(error, result) { - if (error) { - callbackB(error); - } else { - result.forEach(function(d) { - d.lith = larkin.fixLiths(d.lith); - }); + larkin.query(sql, [column.col_id], function (error, result) { + if (error) { + callbackB(error); + } else { + result.forEach(function (d) { + d.lith = larkin.fixLiths(d.lith); + }); - callbackB(null, column, result); + callbackB(null, column, result); + } + }); + }, + ], + // after the two queries are executed, send the result + function (err, column, units) { + if (err) { + if (err.length === 0) { + callback(null, {}); + } else { + callback(err); + } + } else { + var col = [ + { + col_id: column.col_id, + col_name: column.col_name, + col_poly: + req.query.geo_format === "wkt" + ? wellknown.stringify( + gp(JSON.parse(column.col_poly), 3), + ) + : gp(JSON.parse(column.col_poly), 3), + units: units, + }, + ]; + callback(null, col[0]); } - }); - } - ], - // after the two queries are executed, send the result - function(err, column, units) { - if (err) { - if (err.length === 0) { - callback(null, {}) - } else { - callback(err); - } - } else { - var col = [{ - "col_id": column.col_id, - "col_name": column.col_name, - "col_poly": (req.query.geo_format === "wkt") ? wellknown.stringify(gp(JSON.parse(column.col_poly), 3)) : gp(JSON.parse(column.col_poly), 3), - "units": units - }]; - callback(null, col[0]); - } - }); - } - }, function(error, results) { - if (error) { - console.log(error); - larkin.error(req, res, next, "Something went wrong"); - } else { - - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true - }, { - data: [results] - }); - } - }); - } else if (req.query.col_id && req.query.unit_id) { - async.parallel({ - gmus: function(callback) { - larkin.queryPg("geomacro", "SELECT gid, (SELECT array_agg(DISTINCT rocktypes) FROM unnest(array[rocktype1, rocktype2, u_rocktype1, u_rocktype2, u_rocktype3]) rocktypes WHERE rocktypes IS NOT null) AS rocktype, unit_name, unit_age, unitdesc FROM gmus.lookup_units WHERE gid = $1", [req.query.unit_id], function(error, result) { - if (error) { - callback(error); - } else { - callback(null, result.rows[0]); - } - }); + }, + ); + }, }, - - column: function(callback) { - async.waterfall([ - function(callbackB) { - larkin.queryPg("geomacro", "SELECT id AS col_id, col_name, ST_AsGeoJSON(poly_geom) AS col_poly FROM macrostrat.cols WHERE id = $1", [req.query.col_id], function(error, result) { + function (error, results) { + if (error) { + console.log(error); + larkin.error(req, res, next, "Something went wrong"); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + compact: true, + }, + { + data: [results], + }, + ); + } + }, + ); + } else if (req.query.col_id && req.query.unit_id) { + async.parallel( + { + gmus: function (callback) { + larkin.queryPg( + "geomacro", + "SELECT gid, (SELECT array_agg(DISTINCT rocktypes) FROM unnest(array[rocktype1, rocktype2, u_rocktype1, u_rocktype2, u_rocktype3]) rocktypes WHERE rocktypes IS NOT null) AS rocktype, unit_name, unit_age, unitdesc FROM gmus.lookup_units WHERE gid = $1", + [req.query.unit_id], + function (error, result) { if (error) { - callbackB(error); + callback(error); } else { - if (result.rows.length === 0) { - callback(null); - } else { - callbackB(null, result.rows[0]); - } + callback(null, result.rows[0]); } - }); - }, + }, + ); + }, - function(column, callbackB) { - larkin.query("SELECT units.id AS unit_id, units.strat_name, period, max_thick, min_thick, color, count(distinct collection_no) AS pbdb_cltns, lith_short AS lith FROM units JOIN units_sections ON units_sections.unit_id = units.id JOIN lookup_unit_liths ON lookup_unit_liths.unit_id=units.id JOIN lookup_unit_intervals ON units.id=lookup_unit_intervals.unit_id LEFT JOIN pbdb_matches ON pbdb_matches.unit_id = units.id AND pbdb_matches.release_date < now() WHERE units_sections.col_id = ? GROUP BY units.id ORDER BY t_age ASC", [req.query.col_id], function(error, result) { - if (error) { - callbackB(error); - } else { - result.forEach(function(d) { - d.lith = larkin.fixLiths(d.lith); - }); + column: function (callback) { + async.waterfall( + [ + function (callbackB) { + larkin.queryPg( + "geomacro", + "SELECT id AS col_id, col_name, ST_AsGeoJSON(poly_geom) AS col_poly FROM macrostrat.cols WHERE id = $1", + [req.query.col_id], + function (error, result) { + if (error) { + callbackB(error); + } else { + if (result.rows.length === 0) { + callback(null); + } else { + callbackB(null, result.rows[0]); + } + } + }, + ); + }, + + function (column, callbackB) { + larkin.query( + "SELECT units.id AS unit_id, units.strat_name, period, max_thick, min_thick, color, count(distinct collection_no) AS pbdb_cltns, lith_short AS lith FROM units JOIN units_sections ON units_sections.unit_id = units.id JOIN lookup_unit_liths ON lookup_unit_liths.unit_id=units.id JOIN lookup_unit_intervals ON units.id=lookup_unit_intervals.unit_id LEFT JOIN pbdb_matches ON pbdb_matches.unit_id = units.id AND pbdb_matches.release_date < now() WHERE units_sections.col_id = ? GROUP BY units.id ORDER BY t_age ASC", + [req.query.col_id], + function (error, result) { + if (error) { + callbackB(error); + } else { + result.forEach(function (d) { + d.lith = larkin.fixLiths(d.lith); + }); - callbackB(null, column, result); + callbackB(null, column, result); + } + }, + ); + }, + ], + // after the two queries are executed, send the result + function (err, column, units) { + if (err) { + callback(err); + } else { + var col = [ + { + col_id: column.col_id, + col_name: column.col_name, + col_poly: + req.query.geo_format === "wkt" + ? wellknown.stringify( + gp(JSON.parse(column.col_poly), 3), + ) + : gp(JSON.parse(column.col_poly), 3), + units: units, + }, + ]; + callback(null, col[0]); } - }); - } - ], - // after the two queries are executed, send the result - function(err, column, units) { - if (err) { - callback(err); - } else { - var col = [{ - "col_id": column.col_id, - "col_name": column.col_name, - "col_poly": (req.query.geo_format === "wkt") ? wellknown.stringify(gp(JSON.parse(column.col_poly), 3)) : gp(JSON.parse(column.col_poly), 3), - "units": units - }]; - callback(null, col[0]); - } - }); - } - }, function(error, results) { - if (error) { - console.log(error); - larkin.error(req, res, next, "Something went wrong"); - } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - compact: true - }, { - data: [results] - }); - } - }); + }, + ); + }, + }, + function (error, results) { + if (error) { + console.log(error); + larkin.error(req, res, next, "Something went wrong"); + } else { + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + compact: true, + }, + { + data: [results], + }, + ); + } + }, + ); } else { larkin.info(req, res, next); } -} +}; diff --git a/v2/paleogeography.ts b/v2/paleogeography.ts index 8ecfd54b..f35d8d6a 100644 --- a/v2/paleogeography.ts +++ b/v2/paleogeography.ts @@ -1,62 +1,89 @@ var api = require("./api"), - async = require("async"), - dbgeo = require("dbgeo"), - larkin = require("./larkin"); + async = require("async"), + dbgeo = require("dbgeo"), + larkin = require("./larkin"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (!req.query.age && !req.query.interval_name && !("sample" in req.query)) { larkin.info(req, res, next); } else { - async.waterfall([ - function(callback) { - if (req.query.age) { - callback(null, req.query.age); - } else if (req.query.interval_name) { - larkin.query("SELECT (age_bottom + age_top)/2 AS mid FROM intervals WHERE interval_name = ?", [req.query.interval_name], function(error, result) { - if (error) { - callback(error); - } else { - if (result.length === 1) { - callback(null, parseInt(result[0].mid)); + async.waterfall( + [ + function (callback) { + if (req.query.age) { + callback(null, req.query.age); + } else if (req.query.interval_name) { + larkin.query( + "SELECT (age_bottom + age_top)/2 AS mid FROM intervals WHERE interval_name = ?", + [req.query.interval_name], + function (error, result) { + if (error) { + callback(error); + } else { + if (result.length === 1) { + callback(null, parseInt(result[0].mid)); + } else { + larkin.error(req, res, next, "interval not found"); + } + } + }, + ); + } else if ("sample" in req.query) { + callback(null, 0); + } else { + callback("error"); + } + }, + function (year, callback) { + var limit = "sample" in req.query ? " LIMIT 5" : ""; + larkin.queryPg( + "alice", + "SELECT plateid1::integer AS plate_id, ST_AsGeoJSON(geom) AS geometry FROM earthbyte2013_raw.reconstructed_" + + year + + limit, + [], + function (error, result) { + callback(null, result.rows); + }, + ); + }, + ], + function (error, data) { + if (error) { + larkin.error(req, res, next, "Invalid query"); + } else { + dbgeo.parse( + data, + { + geometryType: "geojson", + geometryColumn: "geometry", + outputFormat: larkin.getOutputFormat(req.query.format), + }, + function (error, result) { + if (error) { + larkin.error(req, res, next, "Something went wrong"); } else { - larkin.error(req, res, next, "interval not found"); + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] + ? true + : false, + }, + { + data: result, + }, + ); } - } - }); - } else if ("sample" in req.query) { - callback(null, 0); - } else { - callback("error"); + }, + ); } }, - function(year, callback) { - var limit = ("sample" in req.query) ? " LIMIT 5" : ""; - larkin.queryPg("alice", "SELECT plateid1::integer AS plate_id, ST_AsGeoJSON(geom) AS geometry FROM earthbyte2013_raw.reconstructed_" + year + limit, [], function(error, result) { - callback(null, result.rows); - }); - } - ], function(error, data) { - if (error) { - larkin.error(req, res, next, "Invalid query"); - } else { - dbgeo.parse(data, { - "geometryType": "geojson", - "geometryColumn": "geometry", - "outputFormat": larkin.getOutputFormat(req.query.format) - }, function(error, result) { - if (error) { - larkin.error(req, res, next, "Something went wrong"); - } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: result - }); - } - } - ); - } - }); + ); } -} +}; diff --git a/v2/places.ts b/v2/places.ts index 515f48b6..d274c978 100644 --- a/v2/places.ts +++ b/v2/places.ts @@ -1,14 +1,14 @@ -'use strict' -const larkin = require('./larkin') -const api = require('./api') -const dbgeo = require('dbgeo') +"use strict"; +const larkin = require("./larkin"); +const api = require("./api"); +const dbgeo = require("dbgeo"); -const MAXRESULTS = 5000 +const MAXRESULTS = 5000; module.exports = (req, res, next, callback) => { - let where = [] - let params = [] - let limit = ('sample' in req.query) ? 'LIMIT 5' : '' + let where = []; + let params = []; + let limit = "sample" in req.query ? "LIMIT 5" : ""; if (req.query.wof_id) { if (req.query.childtype) { @@ -31,21 +31,27 @@ module.exports = (req, res, next, callback) => { END AND placetype = $2 - )`) - params.push(req.query.wof_id, req.query.childtype) + )`); + params.push(req.query.wof_id, req.query.childtype); } else { - where.push(`a.wof_id = ANY(\$${where.length + 1})`) - params.push(larkin.parseMultipleIds(req.query.wof_id)) + where.push(`a.wof_id = ANY(\$${where.length + 1})`); + params.push(larkin.parseMultipleIds(req.query.wof_id)); } } if (req.query.placetype && !req.query.childtype) { - where.push(`a.placetype = ANY(\$${where.length + 1})`) - params.push(larkin.parseMultipleStrings(req.query.placetype)) + where.push(`a.placetype = ANY(\$${where.length + 1})`); + params.push(larkin.parseMultipleStrings(req.query.placetype)); } if (req.query.name) { if (req.query.childtype) { if (!req.query.placetype) { - return larkin.error(req, res, next, 'You must provide a "placetype" when querying for children with a "name"', 401) + return larkin.error( + req, + res, + next, + 'You must provide a "placetype" when querying for children with a "name"', + 401, + ); } where.push(`a.wof_id IN ( @@ -67,27 +73,41 @@ module.exports = (req, res, next, callback) => { END AND placetype = $3 - )`) - params.push(larkin.parseMultipleStrings(req.query.name), req.query.placetype, req.query.childtype) + )`); + params.push( + larkin.parseMultipleStrings(req.query.name), + req.query.placetype, + req.query.childtype, + ); } else { - where.push(`a.name = ANY(\$${where.length + 1})`) - params.push(larkin.parseMultipleStrings(req.query.name)) + where.push(`a.name = ANY(\$${where.length + 1})`); + params.push(larkin.parseMultipleStrings(req.query.name)); } } if (req.query.name_like) { - where.push(`a.name = \$${where.length + 1}`) - params.push(`%${req.query.placetype}%`) + where.push(`a.name = \$${where.length + 1}`); + params.push(`%${req.query.placetype}%`); } if (req.query.lng && req.query.lat) { - where.push(`ST_Intersects(a.geom, ST_SetSRID(ST_MakePoint(\$${where.length + 1}, \$${where.length + 2}), 4326))`) - params.push(larkin.normalizeLng(req.query.lng), req.query.lat) + where.push( + `ST_Intersects(a.geom, ST_SetSRID(ST_MakePoint(\$${where.length + 1}, \$${where.length + 2}), 4326))`, + ); + params.push(larkin.normalizeLng(req.query.lng), req.query.lat); } - if (!where.length && !('sample' in req.query)) { - return larkin.error(req, res, next, 'Please provide at least one valid parameter', 400) + if (!where.length && !("sample" in req.query)) { + return larkin.error( + req, + res, + next, + "Please provide at least one valid parameter", + 400, + ); } - larkin.queryPg('wof', ` + larkin.queryPg( + "wof", + ` SELECT COUNT(*) AS n_rows FROM places a @@ -96,17 +116,27 @@ module.exports = (req, res, next, callback) => { LEFT JOIN places r ON r.wof_id = a.region LEFT JOIN places cntry ON cntry.wof_id = a.country LEFT JOIN places cnt ON cnt.wof_id = a.continent - WHERE ${where.join(' AND ')} + WHERE ${where.join(" AND ")} ${limit} - `, params, (error, result) => { - if (error || !result || !result.rows) { - return larkin.error(req, res, next, 'Internal error', 500) - } - if (result.rows[0].n_rows > MAXRESULTS) { - return larkin.error(req, res, next, 'Too many results returned by this query. Please refine your search and try again', 401) - } + `, + params, + (error, result) => { + if (error || !result || !result.rows) { + return larkin.error(req, res, next, "Internal error", 500); + } + if (result.rows[0].n_rows > MAXRESULTS) { + return larkin.error( + req, + res, + next, + "Too many results returned by this query. Please refine your search and try again", + 401, + ); + } - larkin.queryPg('wof', ` + larkin.queryPg( + "wof", + ` SELECT a.wof_id, a.placetype, @@ -118,37 +148,57 @@ module.exports = (req, res, next, callback) => { (SELECT row_to_json(_) FROM (SELECT c.wof_id, c.name) _) AS county, (SELECT row_to_json(_) FROM (SELECT l.wof_id, l.name) _) AS locality, hstore_to_json(a.other_names) AS other_names - ${req.query.format && api.acceptedFormats.geo[req.query.format] ? ', a.geom' : ''} + ${req.query.format && api.acceptedFormats.geo[req.query.format] ? ", a.geom" : ""} FROM places a LEFT JOIN places l ON l.wof_id = a.locality LEFT JOIN places c ON c.wof_id = a.county LEFT JOIN places r ON r.wof_id = a.region LEFT JOIN places cntry ON cntry.wof_id = a.country LEFT JOIN places cnt ON cnt.wof_id = a.continent - WHERE ${where.join(' AND ')} + WHERE ${where.join(" AND ")} ${limit} - `, params, (error, result) => { - if (error) { - return larkin.error(req, res, next, 'Internal error', 500) - } - // if a geographic format is requested - if (req.query.format && api.acceptedFormats.geo[req.query.format]) { - dbgeo.parse(result.rows, { - 'outputFormat': larkin.getOutputFormat(req.query.format), - 'precision': 6 - }, (error, result) => { + `, + params, + (error, result) => { if (error) { - return larkin.error(req, res, next, 'Internal error', 500) + return larkin.error(req, res, next, "Internal error", 500); } - larkin.sendData(req, res, next, {}, { - data: result - }) - }) - } else { - larkin.sendData(req, res, next, {}, { - data: result.rows - }) - } - }) - }) -} + // if a geographic format is requested + if (req.query.format && api.acceptedFormats.geo[req.query.format]) { + dbgeo.parse( + result.rows, + { + outputFormat: larkin.getOutputFormat(req.query.format), + precision: 6, + }, + (error, result) => { + if (error) { + return larkin.error(req, res, next, "Internal error", 500); + } + larkin.sendData( + req, + res, + next, + {}, + { + data: result, + }, + ); + }, + ); + } else { + larkin.sendData( + req, + res, + next, + {}, + { + data: result.rows, + }, + ); + } + }, + ); + }, + ); +}; diff --git a/v2/root.ts b/v2/root.ts index 86e3d3ca..e02797c5 100644 --- a/v2/root.ts +++ b/v2/root.ts @@ -1,29 +1,37 @@ var api = require("./api"), - defs = require("./defs"); + defs = require("./defs"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { var routes = {}; - api.stack.filter(function(d) { - if (d.route && d.route.path !== "*" && d.route.path !== null && d.route.path.length) { + api.stack.filter(function (d) { + if ( + d.route && + d.route.path !== "*" && + d.route.path !== null && + d.route.path.length + ) { if (defs[d.route.path] && defs[d.route.path].visible) { - routes[d.route.path] = (defs[d.route.path] && defs[d.route.path].description) ? defs[d.route.path].description : ""; + routes[d.route.path] = + defs[d.route.path] && defs[d.route.path].description + ? defs[d.route.path].description + : ""; } } }); - Object.keys(defs).filter(function(d) { + Object.keys(defs).filter(function (d) { if (defs[d].isParent) { routes[d] = defs[d].description; } }); res.json({ - "success": { - "v": api.version, - "description": "This is the root of the Macrostrat API", - "changelog": "/changes", - "license": api.license + ". More info at /meta", - "routes": routes - } + success: { + v: api.version, + description: "This is the root of the Macrostrat API", + changelog: "/changes", + license: api.license + ". More info at /meta", + routes: routes, + }, }); -} +}; diff --git a/v2/sections.ts b/v2/sections.ts index 86c5ff20..e8acc0cf 100644 --- a/v2/sections.ts +++ b/v2/sections.ts @@ -1,126 +1,173 @@ var api = require("./api"), - async = require("async"), - _ = require("underscore"), - larkin = require("./larkin"); + async = require("async"), + _ = require("underscore"), + larkin = require("./larkin"); function newSection(data) { return { - "t_age": data.t_age, - "b_age": data.b_age, - "units": [data] - } + t_age: data.t_age, + b_age: data.b_age, + units: [data], + }; } -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - async.waterfall([ - // First pass the request to units and get the units back - function(callback) { - require("./units")(req, null, null, function(error, result) { - if (error) { - return callback(error); - } - - callback(null, result); - }); - }, - - // The sauce. Process the units into sections, grouped by column - function(units, callback) { - - // First group by column - var columns = _.groupBy(units, function(d) { return d.col_id }); - - // Reorganize a bit - Object.keys(columns).forEach(function(d) { - columns[d] = { - sections: (function() { - // This holds the resultant packages - var sections = []; - - // Our first section is the first unit, as they are sorted by ascending t_age - var currentSection = newSection(columns[d][0]); + async.waterfall( + [ + // First pass the request to units and get the units back + function (callback) { + require("./units")(req, null, null, function (error, result) { + if (error) { + return callback(error); + } - for (var i = 1; i < columns[d].length; i++) { - if (columns[d][i].t_age >= currentSection.t_age && columns[d][i].t_age <= currentSection.b_age) { - // Bump the b_age down if needed - if (columns[d][i].b_age > currentSection.b_age) { - currentSection.b_age = columns[d][i].b_age; + callback(null, result); + }); + }, + + // The sauce. Process the units into sections, grouped by column + function (units, callback) { + // First group by column + var columns = _.groupBy(units, function (d) { + return d.col_id; + }); + + // Reorganize a bit + Object.keys(columns).forEach(function (d) { + columns[d] = { + sections: (function () { + // This holds the resultant packages + var sections = []; + + // Our first section is the first unit, as they are sorted by ascending t_age + var currentSection = newSection(columns[d][0]); + + for (var i = 1; i < columns[d].length; i++) { + if ( + columns[d][i].t_age >= currentSection.t_age && + columns[d][i].t_age <= currentSection.b_age + ) { + // Bump the b_age down if needed + if (columns[d][i].b_age > currentSection.b_age) { + currentSection.b_age = columns[d][i].b_age; + } + currentSection.units.push(columns[d][i]); + } else { + sections.push(currentSection); + currentSection = newSection(columns[d][i]); } - currentSection.units.push(columns[d][i]); - - } else { - sections.push(currentSection); - currentSection = newSection(columns[d][i]); } + // Add the last current section + sections.push(currentSection); + + return sections; + })(), + }; + }); + + callback(null, columns); + }, + + // Summarize each section and flatten into sections + function (columns, callback) { + var sections = []; + + Object.keys(columns).forEach(function (col_id) { + for (var i = 0; i < columns[col_id].sections.length; i++) { + // Summarize the section and push it to our result queue + var section = { + col_id: parseInt(col_id), + col_area: parseFloat( + columns[col_id].sections[i].units[0].col_area, + ), + section_id: columns[col_id].sections[i].units[0].section_id, + project_id: columns[col_id].sections[i].units[0].project_id, + + max_thick: columns[col_id].sections[i].units + .map(function (d) { + return d.max_thick; + }) + .reduce(function (a, b) { + return a + b; + }, 0) + .toFixed(2), + min_thick: columns[col_id].sections[i].units + .map(function (d) { + return d.min_thick; + }) + .reduce(function (a, b) { + return a + b; + }, 0) + .toFixed(2), + + t_age: _.min(columns[col_id].sections[i].units, function (d) { + return d.t_age; + }).t_age, + b_age: _.max(columns[col_id].sections[i].units, function (d) { + return d.b_age; + }).b_age, + + pbdb_collections: columns[col_id].sections[i].units + .map(function (d) { + return d.pbdb_collections; + }) + .reduce(function (a, b) { + return a + b; + }, 0), + }; + + if (req.query.response === "long") { + section["lith"] = larkin.summarizeAttribute( + columns[col_id].sections[i].units, + "lith", + ); + section["environ"] = larkin.summarizeAttribute( + columns[col_id].sections[i].units, + "environ", + ); + section["econ"] = larkin.summarizeAttribute( + columns[col_id].sections[i].units, + "econ", + ); } - // Add the last current section - sections.push(currentSection); - - return sections; - })() - } - }); - - callback(null, columns); - }, - // Summarize each section and flatten into sections - function(columns, callback) { - var sections = []; - - Object.keys(columns).forEach(function(col_id) { - for (var i = 0; i < columns[col_id].sections.length; i++) { - // Summarize the section and push it to our result queue - var section = { - "col_id": parseInt(col_id), - "col_area": parseFloat(columns[col_id].sections[i].units[0].col_area), - "section_id": columns[col_id].sections[i].units[0].section_id, - "project_id": columns[col_id].sections[i].units[0].project_id, - - "max_thick": columns[col_id].sections[i].units.map(function(d) { return d.max_thick }).reduce(function(a, b) { return a + b }, 0).toFixed(2), - "min_thick": columns[col_id].sections[i].units.map(function(d) { return d.min_thick }).reduce(function(a, b) { return a + b }, 0).toFixed(2), - - "t_age": _.min(columns[col_id].sections[i].units, function(d) { return d.t_age; }).t_age, - "b_age": _.max(columns[col_id].sections[i].units, function(d) { return d.b_age; }).b_age, - - "pbdb_collections": columns[col_id].sections[i].units.map(function(d) { return d.pbdb_collections }).reduce(function(a, b) { return a + b; }, 0) - } - - if (req.query.response === "long") { - section["lith"] = larkin.summarizeAttribute(columns[col_id].sections[i].units, "lith"); - section["environ"] = larkin.summarizeAttribute(columns[col_id].sections[i].units, "environ"); - section["econ"] = larkin.summarizeAttribute(columns[col_id].sections[i].units, "econ"); + sections.push(section); } + }); + + callback(null, sections); + }, + ], + function (error, sections) { + if (error) { + return larkin.error(req, res, next, error); + } - sections.push(section); + if (req.query.response === "long" && req.query.format === "csv") { + for (var i = 0; i < sections.length; i++) { + sections[i].lith = larkin.pipifyAttrs(sections[i].lith); + sections[i].environ = larkin.pipifyAttrs(sections[i].environ); + sections[i].econ = larkin.pipifyAttrs(sections[i].econ); } - }); - - callback(null, sections); - } - - ], function(error, sections) { - if (error) { - return larkin.error(req, res, next, error); - } - - if (req.query.response === "long" && req.query.format === "csv") { - for (var i = 0; i < sections.length; i++) { - sections[i].lith = larkin.pipifyAttrs(sections[i].lith); - sections[i].environ = larkin.pipifyAttrs(sections[i].environ); - sections[i].econ = larkin.pipifyAttrs(sections[i].econ); } - } - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json" - }, { - data: sections - }); - }); - -} + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + }, + { + data: sections, + }, + ); + }, + ); +}; diff --git a/v2/stats.ts b/v2/stats.ts index ca306d80..5c93b780 100644 --- a/v2/stats.ts +++ b/v2/stats.ts @@ -1,13 +1,14 @@ var api = require("./api"), - larkin = require("./larkin"), - multiline = require("multiline"); + larkin = require("./larkin"), + multiline = require("multiline"); -module.exports = function(req, res, next) { +module.exports = function (req, res, next) { if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); } - var sql = multiline(function() {/* + var sql = multiline(function () { + /* SELECT project_id, project, @@ -18,21 +19,31 @@ module.exports = function(req, res, next) { measurements, burwell_polygons AS t_polys FROM stats - */}); + */ + }); - var format = (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json"; + var format = api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json"; - larkin.query(sql, [], function(error, data) { + larkin.query(sql, [], function (error, data) { if (error) { larkin.error(req, res, next, error); } else { - larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false - }, { - data: data - }); - + larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + }, + { + data: data, + }, + ); } }); -} +}; diff --git a/v2/test/settings.ts b/v2/test/settings.ts index d6562e96..9e62714e 100644 --- a/v2/test/settings.ts +++ b/v2/test/settings.ts @@ -1,6 +1,6 @@ module.exports = { port: 5555, - get host () { - return 'http://localhost:' + this.port - } -} + get host() { + return "http://localhost:" + this.port; + }, +}; diff --git a/v2/test/test.ts b/v2/test/test.ts index 39a59aaa..672bc4d7 100644 --- a/v2/test/test.ts +++ b/v2/test/test.ts @@ -6,4 +6,4 @@ app.port = settings.port; app.start(); -describe('v2', require("./v2Tests")); +describe("v2", require("./v2Tests")); diff --git a/v2/test/v2Tests/carto_small.ts b/v2/test/v2Tests/carto_small.ts index 7f8546fb..bd1d6062 100644 --- a/v2/test/v2Tests/carto_small.ts +++ b/v2/test/v2Tests/carto_small.ts @@ -1,68 +1,69 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return metadata", function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/carto/small") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/carto/small?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a latitude and longitude", function(done) { + it("should accept a latitude and longitude", function (done) { request(settings.host) .get("/api/v2/carto/small?lat=43&lng=-89.3") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - - it("should return geometry when asked", function(done) { + it("should return geometry when asked", function (done) { request(settings.host) .get("/api/v2/carto/small?lat=43&lng=-89.3&format=geojson") .expect(validators.aSuccessfulRequest) .expect(validators.geoJSON) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a shape", function(done) { + it("should accept a shape", function (done) { this.timeout(5000); request(settings.host) - .get("/api/v2/carto/small?shape=POLYGON((-95.44921875 41.3355759731239,-95.44921875 43.0929606771163,-92.79052734375 43.0929606771163,-92.79052734375 41.3355759731239,-95.44921875 41.3355759731239))") + .get( + "/api/v2/carto/small?shape=POLYGON((-95.44921875 41.3355759731239,-95.44921875 43.0929606771163,-92.79052734375 43.0929606771163,-92.79052734375 41.3355759731239,-95.44921875 41.3355759731239))", + ) .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/columns.ts b/v2/test/v2Tests/columns.ts index 8a233611..3462b5fa 100644 --- a/v2/test/v2Tests/columns.ts +++ b/v2/test/v2Tests/columns.ts @@ -1,159 +1,157 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return metadata", function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/columns") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/columns?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an interval name", function(done) { + it("should accept an interval name", function (done) { request(settings.host) .get("/api/v2/columns?interval_name=Permian") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an age", function(done) { + it("should accept an age", function (done) { request(settings.host) .get("/api/v2/columns?age=271") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an age_top and age_bottom", function(done) { + it("should accept an age_top and age_bottom", function (done) { request(settings.host) .get("/api/v2/columns?age_top=200&age_bottom=250") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a strat_name parameter", function(done) { + it("should accept a strat_name parameter", function (done) { request(settings.host) .get("/api/v2/columns?strat_name=mancos") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a strat_name_id parameter", function(done) { + it("should accept a strat_name_id parameter", function (done) { request(settings.host) .get("/api/v2/columns?strat_name_id=1205") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - - it("should return topojson", function(done) { + it("should return topojson", function (done) { request(settings.host) .get("/api/v2/columns?age=2&format=topojson") .expect(validators.aSuccessfulRequest) .expect(validators.topoJSON) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return csv", function(done) { + it("should return csv", function (done) { request(settings.host) .get("/api/v2/columns?age=2&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a latitude and longitude", function(done) { + it("should accept a latitude and longitude", function (done) { request(settings.host) .get("/api/v2/columns?lat=43.3&lng=-89.3") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data[0].col_id != 187) { throw new Error("Columns returning the wrong column for the lat/lng"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a project_id", function(done) { + it("should accept a project_id", function (done) { request(settings.host) .get("/api/v2/columns?project_id=4") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a lat/lng and return all adjacent columns", function(done) { + it("should accept a lat/lng and return all adjacent columns", function (done) { request(settings.host) .get("/api/v2/columns?lat=43.3&lng=-89.3&adjacents=true") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length != 6) { throw new Error("Wrong number of adjacent columns being returned"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs.ts b/v2/test/v2Tests/defs.ts index 5399df7b..89fdbd8d 100644 --- a/v2/test/v2Tests/defs.ts +++ b/v2/test/v2Tests/defs.ts @@ -1,21 +1,21 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return available routes", function(done) { + it("should return available routes", function (done) { request(settings.host) .get("/api/v2/defs") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .expect(function(res) { + .expect(function (res) { if (res.body.success.routes.length < 5) { - throw new Error("Wrong number of definition routes") + throw new Error("Wrong number of definition routes"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_columns.ts b/v2/test/v2Tests/defs_columns.ts index 960d2661..b8154668 100644 --- a/v2/test/v2Tests/defs_columns.ts +++ b/v2/test/v2Tests/defs_columns.ts @@ -1,114 +1,118 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/columns") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/columns?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a col_group_id", function(done) { + it("should accept a col_group_id", function (done) { request(settings.host) .get("/api/v2/defs/columns?col_group_id=17") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept multiple col_group_ids", function(done) { + it("should accept multiple col_group_ids", function (done) { request(settings.host) .get("/api/v2/defs/columns?col_group_id=17,18") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 60) { - throw new Error("Wrong number of columns returned with multiple col_group_ids"); - } + throw new Error( + "Wrong number of columns returned with multiple col_group_ids", + ); + } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a col_id", function(done) { + it("should accept a col_id", function (done) { request(settings.host) .get("/api/v2/defs/columns?col_id=17") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept multiple col_ids", function(done) { + it("should accept multiple col_ids", function (done) { request(settings.host) .get("/api/v2/defs/columns?col_id=3,4") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length !== 2) { - throw new Error("Wrong number of columns returned with multiple col_ids"); - } + throw new Error( + "Wrong number of columns returned with multiple col_ids", + ); + } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a col_name", function(done) { + it("should accept a col_name", function (done) { request(settings.host) .get("/api/v2/defs/columns?col_name=Eastern%20Kentucky") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all columns", function(done) { + it("should return all columns", function (done) { request(settings.host) .get("/api/v2/defs/columns?id=1") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 1500) { throw new Error("Not enough results returned on defs/columns"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_econs.ts b/v2/test/v2Tests/defs_econs.ts index a2259a2a..c9a4d201 100644 --- a/v2/test/v2Tests/defs_econs.ts +++ b/v2/test/v2Tests/defs_econs.ts @@ -1,106 +1,106 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/econs") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/econs?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an econ_class", function(done) { + it("should accept an econ_class", function (done) { request(settings.host) .get("/api/v2/defs/econs?econ_class=energy") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an econ_type", function(done) { + it("should accept an econ_type", function (done) { request(settings.host) .get("/api/v2/defs/econs?econ_type=hydrocarbon") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an econ", function(done) { + it("should accept an econ", function (done) { request(settings.host) .get("/api/v2/defs/econs?environ=oil%20shale") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an econ_id", function(done) { + it("should accept an econ_id", function (done) { request(settings.host) .get("/api/v2/defs/econs?id=1") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all econ definitions", function(done) { + it("should return all econ definitions", function (done) { request(settings.host) .get("/api/v2/defs/econs?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 15) { throw new Error("Not enough results returned on defs/econs"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return CSV", function(done) { + it("should return CSV", function (done) { request(settings.host) .get("/api/v2/defs/econs?all&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_environments.ts b/v2/test/v2Tests/defs_environments.ts index 83452c95..775378f4 100644 --- a/v2/test/v2Tests/defs_environments.ts +++ b/v2/test/v2Tests/defs_environments.ts @@ -1,101 +1,101 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); - - it('should return metadata', function(done) { + validators = require("../validators"), + settings = require("../settings"); + + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/environments") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/environments?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an environment class", function(done) { + it("should accept an environment class", function (done) { request(settings.host) .get("/api/v2/defs/environments?environ_class=non-marine") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an environment type", function(done) { + it("should accept an environment type", function (done) { request(settings.host) .get("/api/v2/defs/environments?environ_type=carbonate") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an environment", function(done) { + it("should accept an environment", function (done) { request(settings.host) .get("/api/v2/defs/environments?environ=open%20shallow%20subtidal") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an environment id", function(done) { + it("should accept an environment id", function (done) { request(settings.host) .get("/api/v2/defs/environments?environ_id=1") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all environment definitions", function(done) { + it("should return all environment definitions", function (done) { request(settings.host) .get("/api/v2/defs/environments?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return CSV", function(done) { + it("should return CSV", function (done) { request(settings.host) .get("/api/v2/defs/environments?all&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_groups.ts b/v2/test/v2Tests/defs_groups.ts index 9b872e82..cb58fd09 100644 --- a/v2/test/v2Tests/defs_groups.ts +++ b/v2/test/v2Tests/defs_groups.ts @@ -1,53 +1,53 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); - - it('should return metadata', function(done) { + validators = require("../validators"), + settings = require("../settings"); + + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/groups") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/groups?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all column groups", function(done) { + it("should return all column groups", function (done) { request(settings.host) .get("/api/v2/defs/groups?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output CSV", function(done) { + it("should output CSV", function (done) { request(settings.host) .get("/api/v2/defs/groups?all&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_intervals.ts b/v2/test/v2Tests/defs_intervals.ts index b66882ea..fc578f23 100644 --- a/v2/test/v2Tests/defs_intervals.ts +++ b/v2/test/v2Tests/defs_intervals.ts @@ -1,101 +1,101 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/intervals") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/intervals?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a timescale parameter", function(done) { + it("should accept a timescale parameter", function (done) { request(settings.host) .get("/api/v2/defs/intervals?timescale=new%20zealand%20ages") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an interval id", function(done) { + it("should accept an interval id", function (done) { request(settings.host) .get("/api/v2/defs/intervals?id=366") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all definitions", function(done) { + it("should return all definitions", function (done) { request(settings.host) .get("/api/v2/defs/intervals?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return CSV", function(done) { + it("should return CSV", function (done) { request(settings.host) .get("/api/v2/defs/intervals?timescale=new%20zealand%20ages&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an early and late age", function(done) { + it("should accept an early and late age", function (done) { request(settings.host) .get("/api/v2/defs/intervals?late_age=0&early_age=130") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an age", function(done) { + it("should accept an age", function (done) { request(settings.host) .get("/api/v2/defs/intervals?age=200") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_lithologies.ts b/v2/test/v2Tests/defs_lithologies.ts index 23c86fec..75ffb41d 100644 --- a/v2/test/v2Tests/defs_lithologies.ts +++ b/v2/test/v2Tests/defs_lithologies.ts @@ -1,100 +1,104 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/lithologies") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/lithologies?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a lith_id", function(done) { + it("should accept a lith_id", function (done) { request(settings.host) .get("/api/v2/defs/lithologies?lith_id=3") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length !== 1) { - throw new Error("Should have returned 1 lith definition but returned more or less"); - } + throw new Error( + "Should have returned 1 lith definition but returned more or less", + ); + } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept multiple lith_ids", function(done) { + it("should accept multiple lith_ids", function (done) { request(settings.host) .get("/api/v2/defs/lithologies?lith_id=3,4,5") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length !== 3) { - throw new Error("Should have returned 3 lith definitions but returned more or less"); - } + throw new Error( + "Should have returned 3 lith definitions but returned more or less", + ); + } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a lith class", function(done) { + it("should accept a lith class", function (done) { request(settings.host) .get("/api/v2/defs/lithologies?lith_class=sedimentary") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should show all lith definitions when asked", function(done) { + it("should show all lith definitions when asked", function (done) { request(settings.host) .get("/api/v2/defs/lithologies?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 2) { throw new Error("Should have returned more than 2 lith_definitions"); - } + } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output CSV", function(done) { + it("should output CSV", function (done) { request(settings.host) .get("/api/v2/defs/lithologies?lith_id=3&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_lithology_attributes.ts b/v2/test/v2Tests/defs_lithology_attributes.ts index 6ecd3701..3d42049e 100644 --- a/v2/test/v2Tests/defs_lithology_attributes.ts +++ b/v2/test/v2Tests/defs_lithology_attributes.ts @@ -1,105 +1,107 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/lithology_attributes") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/lithology_attributes?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an att_type", function(done) { + it("should accept an att_type", function (done) { request(settings.host) .get("/api/v2/defs/lithology_attributes?att_type=bedform") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a lith_att", function(done) { + it("should accept a lith_att", function (done) { request(settings.host) .get("/api/v2/defs/lithology_attributes?lith_att=mounds") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a lith_att_id", function(done) { + it("should accept a lith_att_id", function (done) { request(settings.host) .get("/api/v2/defs/lithology_attributes?lith_att_id=1") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept multiple lith_att_ids", function(done) { + it("should accept multiple lith_att_ids", function (done) { request(settings.host) .get("/api/v2/defs/lithology_attributes?lith_att_id=3,4,5") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length !== 3) { - throw new Error("Should have returned 3 lithology attribute definitions but returned more or less"); - } + throw new Error( + "Should have returned 3 lithology attribute definitions but returned more or less", + ); + } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all records", function(done) { + it("should return all records", function (done) { request(settings.host) .get("/api/v2/defs/lithology_attributes?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output CSV", function(done) { + it("should output CSV", function (done) { request(settings.host) .get("/api/v2/defs/lithology_attributes?lith_att=mounds&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_measurements.ts b/v2/test/v2Tests/defs_measurements.ts index cef28a8a..b2e9c206 100644 --- a/v2/test/v2Tests/defs_measurements.ts +++ b/v2/test/v2Tests/defs_measurements.ts @@ -1,108 +1,110 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/measurements") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/measurements?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept measurement IDs", function(done) { + it("should accept measurement IDs", function (done) { request(settings.host) .get("/api/v2/defs/measurements?measure_id=3,4") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length !== 2) { throw new Error("Should have returned 2 measurements but did not"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a measurement class", function(done) { + it("should accept a measurement class", function (done) { request(settings.host) .get("/api/v2/defs/measurements?measurement_class=geochemical") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - res.body.success.data.forEach(function(d) { + .expect(function (res) { + res.body.success.data.forEach(function (d) { if (d.class != "geochemical") { throw new Error("Wrong measurement class returned"); } - }) + }); }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a measurement type", function(done) { + it("should accept a measurement type", function (done) { request(settings.host) .get("/api/v2/defs/measurements?measurement_type=geochronological") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - res.body.success.data.forEach(function(d) { + .expect(function (res) { + res.body.success.data.forEach(function (d) { if (d.type != "geochronological") { throw new Error("Wrong measurement type returned"); } - }) + }); }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all definitions", function(done) { + it("should return all definitions", function (done) { request(settings.host) .get("/api/v2/defs/measurements?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return CSV", function(done) { + it("should return CSV", function (done) { request(settings.host) - .get("/api/v2/defs/measurements?measurement_type=geochronological&format=csv") + .get( + "/api/v2/defs/measurements?measurement_type=geochronological&format=csv", + ) .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_minerals.ts b/v2/test/v2Tests/defs_minerals.ts index c0cbfb9b..f537af0b 100644 --- a/v2/test/v2Tests/defs_minerals.ts +++ b/v2/test/v2Tests/defs_minerals.ts @@ -1,90 +1,89 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/minerals") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/minerals?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a mineral_id", function(done) { + it("should accept a mineral_id", function (done) { request(settings.host) .get("/api/v2/defs/minerals?mineral_id=1") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a mineral name", function(done) { + it("should accept a mineral name", function (done) { request(settings.host) .get("/api/v2/defs/minerals?mineral=abhurite") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a mineral type", function(done) { + it("should accept a mineral type", function (done) { request(settings.host) .get("/api/v2/defs/minerals?minerals?mineral_type=clinopyroxene") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all definitions", function(done) { + it("should return all definitions", function (done) { request(settings.host) .get("/api/v2/defs/minerals?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return CSV", function(done) { + it("should return CSV", function (done) { request(settings.host) .get("/api/v2/defs/minerals?mineral=abhurite&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - -} +}; diff --git a/v2/test/v2Tests/defs_plates.ts b/v2/test/v2Tests/defs_plates.ts index 91333cdb..93a7c238 100644 --- a/v2/test/v2Tests/defs_plates.ts +++ b/v2/test/v2Tests/defs_plates.ts @@ -1,53 +1,53 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/plates") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/plates?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all plates", function(done) { + it("should return all plates", function (done) { request(settings.host) .get("/api/v2/defs/plates?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output CSV", function(done) { + it("should output CSV", function (done) { request(settings.host) .get("/api/v2/defs/plates?all&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_projects.ts b/v2/test/v2Tests/defs_projects.ts index a21b4736..8d402d24 100644 --- a/v2/test/v2Tests/defs_projects.ts +++ b/v2/test/v2Tests/defs_projects.ts @@ -1,53 +1,53 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/projects") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/projects?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all projects", function(done) { + it("should return all projects", function (done) { request(settings.host) .get("/api/v2/defs/projects?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output CSV", function(done) { + it("should output CSV", function (done) { request(settings.host) .get("/api/v2/defs/projects?all&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_refs.ts b/v2/test/v2Tests/defs_refs.ts index d422fcae..a93d930d 100644 --- a/v2/test/v2Tests/defs_refs.ts +++ b/v2/test/v2Tests/defs_refs.ts @@ -1,70 +1,72 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/refs") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/refs?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all refs", function(done) { + it("should return all refs", function (done) { request(settings.host) .get("/api/v2/defs/refs?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a ref_id", function(done) { + it("should accept a ref_id", function (done) { request(settings.host) .get("/api/v2/defs/refs?ref_id=1,2,3") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length !== 3) { - throw new Error("Should have returned 3 ref definitions but returned more or less"); - } + throw new Error( + "Should have returned 3 ref definitions but returned more or less", + ); + } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output CSV", function(done) { + it("should output CSV", function (done) { request(settings.host) .get("/api/v2/defs/refs?all&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_sources.ts b/v2/test/v2Tests/defs_sources.ts index 8a7758df..a8c93724 100644 --- a/v2/test/v2Tests/defs_sources.ts +++ b/v2/test/v2Tests/defs_sources.ts @@ -1,73 +1,73 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/sources") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/sources?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all sources", function(done) { + it("should return all sources", function (done) { request(settings.host) .get("/api/v2/defs/sources?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output CSV", function(done) { + it("should output CSV", function (done) { request(settings.host) .get("/api/v2/defs/sources?all&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a source_id", function(done) { + it("should accept a source_id", function (done) { request(settings.host) .get("/api/v2/defs/sources?source_id=1,2,3") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length != 3) { throw new Error("Wrong number of sources returned with source_id"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -/* + /* it("should return all sources as GeoJSON", function(done) { request(settings.host) .get("/api/v2/defs/sources?all&format=geojson") @@ -80,46 +80,48 @@ module.exports = function() { }); */ - it("should accept a scale", function(done) { + it("should accept a scale", function (done) { request(settings.host) .get("/api/v2/defs/sources?scale=medium") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - res.body.success.data.forEach(function(d) { + .expect(function (res) { + res.body.success.data.forEach(function (d) { if (d.scale != "medium") { throw new Error("Wrong scale returned when filtering by scale"); } }); }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a latitude and longitude", function(done) { + it("should accept a latitude and longitude", function (done) { request(settings.host) .get("/api/v2/defs/sources?lat=43&lng=-89") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a WKT shape", function(done) { + it("should accept a WKT shape", function (done) { request(settings.host) - .get("/api/v2/defs/sources?shape=LINESTRING(-122.3438%2037,-89.3527%2043.0582)&buffer=100") + .get( + "/api/v2/defs/sources?shape=LINESTRING(-122.3438%2037,-89.3527%2043.0582)&buffer=100", + ) .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_strat_name_concepts.ts b/v2/test/v2Tests/defs_strat_name_concepts.ts index 4b16b272..ac4cccd5 100644 --- a/v2/test/v2Tests/defs_strat_name_concepts.ts +++ b/v2/test/v2Tests/defs_strat_name_concepts.ts @@ -1,53 +1,53 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/strat_name_concepts") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/strat_name_concepts?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a concept_id", function(done) { + it("should accept a concept_id", function (done) { request(settings.host) .get("/api/v2/defs/strat_name_concepts?concept_id=1,2") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output CSV", function(done) { + it("should output CSV", function (done) { request(settings.host) .get("/api/v2/defs/strat_name_concepts?all&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_strat_names.ts b/v2/test/v2Tests/defs_strat_names.ts index e5254192..7a0dba68 100644 --- a/v2/test/v2Tests/defs_strat_names.ts +++ b/v2/test/v2Tests/defs_strat_names.ts @@ -1,106 +1,108 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/strat_names") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/strat_names?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a strat id", function(done) { + it("should accept a strat id", function (done) { request(settings.host) .get("/api/v2/defs/strat_names?strat_name_id=1") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept multiple strat ids", function(done) { + it("should accept multiple strat ids", function (done) { request(settings.host) .get("/api/v2/defs/strat_names?strat_name_id=2188,7145") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - if (res.body.success.data.length != 2 ) { - throw new Error("defs/strat_names does not return two results as expected"); + .expect(function (res) { + if (res.body.success.data.length != 2) { + throw new Error( + "defs/strat_names does not return two results as expected", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a strat name", function(done) { + it("should accept a strat name", function (done) { request(settings.host) .get("/api/v2/defs/strat_names?strat_name=Abercrombie") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a strat rank", function(done) { + it("should accept a strat rank", function (done) { request(settings.host) .get("/api/v2/defs/strat_names?rank=Gp") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all strat names", function(done) { + it("should return all strat names", function (done) { request(settings.host) .get("/api/v2/defs/strat_names?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output CSV", function(done) { + it("should output CSV", function (done) { request(settings.host) .get("/api/v2/defs/strat_names?strat_name=Abercrombie&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_structures.ts b/v2/test/v2Tests/defs_structures.ts index bbd9ed5a..86cff6a7 100644 --- a/v2/test/v2Tests/defs_structures.ts +++ b/v2/test/v2Tests/defs_structures.ts @@ -1,108 +1,108 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/structures") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/structures?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept structure IDs", function(done) { + it("should accept structure IDs", function (done) { request(settings.host) .get("/api/v2/defs/structures?structure_id=3,4") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length !== 2) { throw new Error("Should have returned 2 structures but did not"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a structure class", function(done) { + it("should accept a structure class", function (done) { request(settings.host) .get("/api/v2/defs/structures?structure_class=fabric") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - res.body.success.data.forEach(function(d) { + .expect(function (res) { + res.body.success.data.forEach(function (d) { if (d.class != "fabric") { throw new Error("Wrong structure class returned"); } - }) + }); }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a structure type", function(done) { + it("should accept a structure type", function (done) { request(settings.host) .get("/api/v2/defs/structures?structure_type=fault") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - res.body.success.data.forEach(function(d) { + .expect(function (res) { + res.body.success.data.forEach(function (d) { if (d.structure_type != "fault") { throw new Error("Wrong structure type returned"); } - }) + }); }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all definitions", function(done) { + it("should return all definitions", function (done) { request(settings.host) .get("/api/v2/defs/structures?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return CSV", function(done) { + it("should return CSV", function (done) { request(settings.host) .get("/api/v2/defs/structures?structure_type=fabric&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/defs_timescales.ts b/v2/test/v2Tests/defs_timescales.ts index 0027c2e2..414f9628 100644 --- a/v2/test/v2Tests/defs_timescales.ts +++ b/v2/test/v2Tests/defs_timescales.ts @@ -1,54 +1,53 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); - - it('should return metadata', function(done) { + validators = require("../validators"), + settings = require("../settings"); + + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/defs/timescales") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/defs/timescales?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return all timescales", function(done) { + it("should return all timescales", function (done) { request(settings.host) .get("/api/v2/defs/timescales?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output CSV", function(done) { + it("should output CSV", function (done) { request(settings.host) .get("/api/v2/defs/timescales?all&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - -} +}; diff --git a/v2/test/v2Tests/fossils.ts b/v2/test/v2Tests/fossils.ts index 79b18d14..ab30fc20 100644 --- a/v2/test/v2Tests/fossils.ts +++ b/v2/test/v2Tests/fossils.ts @@ -1,33 +1,33 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/fossils") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/fossils?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a time_interval", function(done) { + it("should accept a time_interval", function (done) { this.timeout(4000); request(settings.host) @@ -35,85 +35,87 @@ module.exports = function() { .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an age", function(done) { + it("should accept an age", function (done) { request(settings.host) .get("/api/v2/fossils?age=123") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an age_top and age_bottom", function(done) { + it("should accept an age_top and age_bottom", function (done) { request(settings.host) .get("/api/v2/fossils?age_top=100&age_bottom=120") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a col_id", function(done) { + it("should accept a col_id", function (done) { request(settings.host) .get("/api/v2/fossils?col_id=446") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept multiple col_ids", function(done) { + it("should accept multiple col_ids", function (done) { request(settings.host) .get("/api/v2/fossils?col_id=446,56") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 29) { - throw new Error("Wrong number of fossil collections returned with multiple IDs supplied"); + throw new Error( + "Wrong number of fossil collections returned with multiple IDs supplied", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept one or more unit_ids", function(done) { + it("should accept one or more unit_ids", function (done) { request(settings.host) .get("/api/v2/fossils?unit_id=14777,14949,15018,15211,15210") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output Topojson", function(done) { + it("should output Topojson", function (done) { request(settings.host) .get("/api/v2/fossils?interval_name=Permian&format=topojson") .expect(validators.aSuccessfulRequest) .expect(validators.topoJSON) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/geologic_units_burwell.ts b/v2/test/v2Tests/geologic_units_burwell.ts index f0ce4ab7..d44857e6 100644 --- a/v2/test/v2Tests/geologic_units_burwell.ts +++ b/v2/test/v2Tests/geologic_units_burwell.ts @@ -1,107 +1,111 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return metadata", function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/geologic_units/burwell") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/geologic_units/burwell?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a latitude and longitude", function(done) { + it("should accept a latitude and longitude", function (done) { request(settings.host) .get("/api/v2/geologic_units/burwell?lat=43&lng=-89.3&scale=large") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a map_id", function(done) { + it("should accept a map_id", function (done) { request(settings.host) .get("/api/v2/geologic_units/burwell?map_id=605211&scale=medium") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept multiple map_ids", function(done) { + it("should accept multiple map_ids", function (done) { request(settings.host) - .get("/api/v2/geologic_units/burwell?map_id=605211,605210,605209&scale=medium") + .get( + "/api/v2/geologic_units/burwell?map_id=605211,605210,605209&scale=medium", + ) .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length != 3) { - throw new Error("Wrong number of features returned with multiple map_ids"); + throw new Error( + "Wrong number of features returned with multiple map_ids", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a strat_name_id", function(done) { + it("should accept a strat_name_id", function (done) { request(settings.host) .get("/api/v2/geologic_units/burwell?strat_name_id=1205&scale=medium") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a unit_id", function(done) { + it("should accept a unit_id", function (done) { request(settings.host) .get("/api/v2/geologic_units/burwell?unit_id=6124&scale=medium") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - - it("should return geometry when asked", function(done) { + it("should return geometry when asked", function (done) { request(settings.host) - .get("/api/v2/geologic_units/burwell?lat=43&lng=-89.3&format=geojson&scale=medium") + .get( + "/api/v2/geologic_units/burwell?lat=43&lng=-89.3&format=geojson&scale=medium", + ) .expect(validators.aSuccessfulRequest) .expect(validators.geoJSON) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - -} +}; diff --git a/v2/test/v2Tests/geologic_units_gmna.ts b/v2/test/v2Tests/geologic_units_gmna.ts index 60cf639f..59ef2109 100644 --- a/v2/test/v2Tests/geologic_units_gmna.ts +++ b/v2/test/v2Tests/geologic_units_gmna.ts @@ -1,84 +1,83 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return metadata", function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmna") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmna?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a latitude and longitude", function(done) { + it("should accept a latitude and longitude", function (done) { this.timeout(3000); - + request(settings.host) .get("/api/v2/geologic_units/gmna?lat=43&lng=-89.3") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a GID ", function(done) { + it("should accept a GID ", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmna?gid=1234") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a time interval_name", function(done) { + it("should accept a time interval_name", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmna?interval_name=Permian") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - - it("should return geometry when asked", function(done) { + it("should return geometry when asked", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmna?lat=43&lng=-89.3&format=geojson") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a shape", function(done) { + it("should accept a shape", function (done) { this.timeout(4500); request(settings.host) @@ -86,9 +85,9 @@ module.exports = function() { .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/geologic_units_gmus.ts b/v2/test/v2Tests/geologic_units_gmus.ts index b0962400..0e75b678 100644 --- a/v2/test/v2Tests/geologic_units_gmus.ts +++ b/v2/test/v2Tests/geologic_units_gmus.ts @@ -1,64 +1,68 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return metadata", function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmus") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmus?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a latitude and longitude", function(done) { + it("should accept a latitude and longitude", function (done) { this.timeout(3000); - + request(settings.host) .get("/api/v2/geologic_units/gmus?lat=43&lng=-89.3") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept adjacents with a latitude and longitude", function(done) { + it("should accept adjacents with a latitude and longitude", function (done) { request(settings.host) - .get("/api/v2/geologic_units/gmus?lat=43.40205&lng=-89.82112&adjacents=true") + .get( + "/api/v2/geologic_units/gmus?lat=43.40205&lng=-89.82112&adjacents=true", + ) .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length !== 3) { - throw new Error("Wrong number of units returned with lat/lng and adjacents") + throw new Error( + "Wrong number of units returned with lat/lng and adjacents", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a time interval_name", function(done) { + it("should accept a time interval_name", function (done) { this.timeout(5000); request(settings.host) @@ -66,13 +70,13 @@ module.exports = function() { .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a search", function(done) { + it("should accept a search", function (done) { this.timeout(4000); request(settings.host) @@ -80,102 +84,102 @@ module.exports = function() { .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a unit_link", function(done) { + it("should accept a unit_link", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmus?unit_link=WIOp;0") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a GID", function(done) { + it("should accept a GID", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmus?gid=184506") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept adjacents with a GID", function(done) { + it("should accept adjacents with a GID", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmus?gid=184448&adjacents=true") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length !== 3) { - throw new Error("Wrong number of units returned with gid and adjacents") + throw new Error( + "Wrong number of units returned with gid and adjacents", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - - it("should accept a unit_id", function(done) { + it("should accept a unit_id", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmus?unit_id=2470,38484") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - - it("should accept a strat_name_id", function(done) { + it("should accept a strat_name_id", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmus?strat_name_id=1205") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); - }); + }); - it("should return geometry when asked", function(done) { + it("should return geometry when asked", function (done) { request(settings.host) .get("/api/v2/geologic_units/gmus?lat=43&lng=-89.3&format=geojson") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a shape", function(done) { - this.timeout(3500) + it("should accept a shape", function (done) { + this.timeout(3500); request(settings.host) .get("/api/v2/geologic_units/gmus?shape=LINESTRING(-88%2043,%20-90%2043)") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/index.ts b/v2/test/v2Tests/index.ts index d70bdb99..84f78cc1 100644 --- a/v2/test/v2Tests/index.ts +++ b/v2/test/v2Tests/index.ts @@ -1,5 +1,4 @@ -module.exports = function() { - +module.exports = function () { describe("root", require("./root")); describe("columns", require("./columns")); describe("sections", require("./sections")); @@ -41,5 +40,4 @@ module.exports = function() { describe("mobile/macro_summary", require("./mobile_macro_summary")); describe("mobile/map_query", require("./mobile_map_query")); describe("Mancos test cases", require("./mancos_test_cases")); - -} +}; diff --git a/v2/test/v2Tests/mancos_test_cases.ts b/v2/test/v2Tests/mancos_test_cases.ts index a8f90f28..bc884680 100644 --- a/v2/test/v2Tests/mancos_test_cases.ts +++ b/v2/test/v2Tests/mancos_test_cases.ts @@ -1,155 +1,170 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return point data for Detroit", function(done) { + it("should return point data for Detroit", function (done) { request(settings.host) .get("/api/v2/mobile/point?lat=42.331427&lng=-83.045754") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.uid !== 1114738) { - throw new Error("Wrong unit returned for Detroit") + throw new Error("Wrong unit returned for Detroit"); } if (res.body.success.data.rocktype.length < 2) { - throw new Error("Invalid rocktypes returned for Detroit") + throw new Error("Invalid rocktypes returned for Detroit"); } if (res.body.success.data.age !== "Middle Devonian") { - throw new Error("Invalid age returned for Detroit") + throw new Error("Invalid age returned for Detroit"); } - if (res.body.success.data.name.length < 2 || res.body.success.data.desc.length < 2 || res.body.success.data.comm.length < 2) { - throw new Error("Invalid data returned for Detroit") + if ( + res.body.success.data.name.length < 2 || + res.body.success.data.desc.length < 2 || + res.body.success.data.comm.length < 2 + ) { + throw new Error("Invalid data returned for Detroit"); } if (res.body.success.data.strat_unit.length > 0) { - throw new Error("Invalid strat unit returned for Detroit") + throw new Error("Invalid strat unit returned for Detroit"); } if (res.body.success.data.col_id !== 1594) { - throw new Error("Invalid column returned for Detroit") + throw new Error("Invalid column returned for Detroit"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return point details for Detroit", function(done) { + it("should return point details for Detroit", function (done) { request(settings.host) .get("/api/v2/mobile/point_details?lat=42.331427&lng=-83.045754") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - if (!res.body.success.data[0].column || !res.body.success.data[0].gmus) { - throw new Error("Missing details for Detroit") + .expect(function (res) { + if ( + !res.body.success.data[0].column || + !res.body.success.data[0].gmus + ) { + throw new Error("Missing details for Detroit"); } if (res.body.success.data[0].column.units.length < 5) { - throw new Error("Missing units from details for Detroit") + throw new Error("Missing units from details for Detroit"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return point data for Toronto", function(done) { + it("should return point data for Toronto", function (done) { request(settings.host) .get("/api/v2/mobile/point?lat=43.651893&lng=-79.381713") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.uid !== 619176) { - throw new Error("Wrong unit returned for Toronto") + throw new Error("Wrong unit returned for Toronto"); } if (res.body.success.data.rocktype.length < 1) { - throw new Error("Invalid rocktypes returned for Toronto") + throw new Error("Invalid rocktypes returned for Toronto"); } if (res.body.success.data.age !== "Late Ordovician") { - throw new Error("Invalid age returned for Toronto") + throw new Error("Invalid age returned for Toronto"); } if (res.body.success.data.name.length < 2) { - throw new Error("Invalid data returned for Toronto") + throw new Error("Invalid data returned for Toronto"); } - if (res.body.success.data.strat_unit.length > 0 || res.body.success.data.desc.length > 0 || res.body.success.data.comm.length > 0) { - throw new Error("Invalid data returned for Toronto") + if ( + res.body.success.data.strat_unit.length > 0 || + res.body.success.data.desc.length > 0 || + res.body.success.data.comm.length > 0 + ) { + throw new Error("Invalid data returned for Toronto"); } if (res.body.success.data.col_id !== 1598) { - throw new Error("Invalid column returned for Toronto") + throw new Error("Invalid column returned for Toronto"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return point details for Toronto", function(done) { + it("should return point details for Toronto", function (done) { request(settings.host) .get("/api/v2/mobile/point_details?lat=43.651893&lng=-79.381713") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (!res.body.success.data[0].column) { - throw new Error("Missing details for Toronto") + throw new Error("Missing details for Toronto"); } if (res.body.success.data[0].column.units.length < 5) { - throw new Error("Missing units from details for Toronto") + throw new Error("Missing units from details for Toronto"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return point data for Buenos Aires", function(done) { + it("should return point data for Buenos Aires", function (done) { request(settings.host) .get("/api/v2/mobile/point?lat=-34.565383&lng=-58.452759") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.uid.length > 0) { - throw new Error("Wrong unit returned for Buenos Aires") + throw new Error("Wrong unit returned for Buenos Aires"); } if (res.body.success.data.rocktype.length > 0) { - throw new Error("Invalid rocktypes returned for Buenos Aires") + throw new Error("Invalid rocktypes returned for Buenos Aires"); } if (res.body.success.data.age.length > 0) { - throw new Error("Invalid age returned for Buenos Aires") + throw new Error("Invalid age returned for Buenos Aires"); } if (res.body.success.data.name.length > 0) { - throw new Error("Invalid data returned for Buenos Aires") + throw new Error("Invalid data returned for Buenos Aires"); } - if (res.body.success.data.strat_unit.length > 0 || res.body.success.data.desc.length > 0 || res.body.success.data.comm.length > 0) { - throw new Error("Invalid data returned for Buenos Aires") + if ( + res.body.success.data.strat_unit.length > 0 || + res.body.success.data.desc.length > 0 || + res.body.success.data.comm.length > 0 + ) { + throw new Error("Invalid data returned for Buenos Aires"); } if (res.body.success.data.col_id.length > 0) { - throw new Error("Invalid column returned for Buenos Aires") + throw new Error("Invalid column returned for Buenos Aires"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return point details for Buenos Aires", function(done) { + it("should return point details for Buenos Aires", function (done) { request(settings.host) .get("/api/v2/mobile/point_details?lat=-34.565383&lng=-58.452759") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (!res.body.success.data[0].column) { - throw new Error("Missing empty column for Buenos Aires") + throw new Error("Missing empty column for Buenos Aires"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/mobile_fossil_collections.ts b/v2/test/v2Tests/mobile_fossil_collections.ts index 2d21f1c3..9dfdc452 100644 --- a/v2/test/v2Tests/mobile_fossil_collections.ts +++ b/v2/test/v2Tests/mobile_fossil_collections.ts @@ -1,40 +1,44 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return metadata", function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/mobile/fossil_collections") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a unit_id", function(done) { + it("should accept a unit_id", function (done) { request(settings.host) .get("/api/v2/mobile/fossil_collections?unit_id=154") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 2) { throw new Error("PBDB collections not returned"); } if (res.body.success.data[0].cltn_id !== 111035) { - throw new Error("Wrong collections returned on moble/fossil_collections") + throw new Error( + "Wrong collections returned on moble/fossil_collections", + ); } if (res.body.success.data[1].cltn_name !== "Lookout Mountain") { - throw new Error("Wrong collections returned on moble/fossil_collections") + throw new Error( + "Wrong collections returned on moble/fossil_collections", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/mobile_macro_summary.ts b/v2/test/v2Tests/mobile_macro_summary.ts index 4ed593c8..8657f819 100644 --- a/v2/test/v2Tests/mobile_macro_summary.ts +++ b/v2/test/v2Tests/mobile_macro_summary.ts @@ -1,35 +1,41 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return metadata", function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/mobile/macro_summary") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a latitude and longitude", function(done) { + it("should accept a latitude and longitude", function (done) { request(settings.host) .get("/api/v2/mobile/macro_summary?lat=43.0706192&lng=-89.406167") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { var response = res.body.success.data; - if (!response.lith.length || !response.environ.length || !response.econs.length || !response.strat_names.length || !response.strat_name_ids.length) { - throw new Error("Bad response") + if ( + !response.lith.length || + !response.environ.length || + !response.econs.length || + !response.strat_names.length || + !response.strat_name_ids.length + ) { + throw new Error("Bad response"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/mobile_map_query.ts b/v2/test/v2Tests/mobile_map_query.ts index 9eb715c8..349ecbdf 100644 --- a/v2/test/v2Tests/mobile_map_query.ts +++ b/v2/test/v2Tests/mobile_map_query.ts @@ -1,96 +1,98 @@ -module.exports = function() { - var request = require('supertest') - var validators = require('../validators') - var settings = require('../settings') +module.exports = function () { + var request = require("supertest"); + var validators = require("../validators"); + var settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) - .get('/api/v2/mobile/map_query') + .get("/api/v2/mobile/map_query") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { - if (error) return done(error) - done() - }) - }) + .end(function (error, res) { + if (error) return done(error); + done(); + }); + }); - it('should accept a latitude, longitude, and z', function(done) { + it("should accept a latitude, longitude, and z", function (done) { request(settings.host) - .get('/api/v2/mobile/map_query?lat=43.0706192&lng=-89.406167&z=8') + .get("/api/v2/mobile/map_query?lat=43.0706192&lng=-89.406167&z=8") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - var response = res.body.success.data - if (!response.hasOwnProperty('elevation')) { - throw new Error('Missing elevation from response') + .expect(function (res) { + var response = res.body.success.data; + if (!response.hasOwnProperty("elevation")) { + throw new Error("Missing elevation from response"); } - if (!response.hasOwnProperty('burwell')) { - throw new Error('Missing burwell from response') + if (!response.hasOwnProperty("burwell")) { + throw new Error("Missing burwell from response"); } - if (!response.hasOwnProperty('macrostrat')) { - throw new Error('Missing macrostrata from response') + if (!response.hasOwnProperty("macrostrat")) { + throw new Error("Missing macrostrata from response"); } - if (!response.hasOwnProperty('lines')) { - throw new Error('Missing lines from response') + if (!response.hasOwnProperty("lines")) { + throw new Error("Missing lines from response"); } if (!response.burwell.length) { - throw new Error('Bad response') + throw new Error("Bad response"); } }) - .end(function(error, res) { - if (error) return done(error) - done() - }) - }) + .end(function (error, res) { + if (error) return done(error); + done(); + }); + }); - it('should require a lat, lng, and z', function(done) { + it("should require a lat, lng, and z", function (done) { request(settings.host) - .get('/api/v2/mobile/map_query?lat=1&lng=1') + .get("/api/v2/mobile/map_query?lat=1&lng=1") .expect(validators.json) - .expect(function(res) { - // var response = res.body.success.data + .expect(function (res) { + // var response = res.body.success.data if (!res.statusCode == 400) { - throw new Error('Wrong status code') + throw new Error("Wrong status code"); } - if (!res.body.hasOwnProperty('error')) { - throw new Error('No error returned when one was expected') + if (!res.body.hasOwnProperty("error")) { + throw new Error("No error returned when one was expected"); } }) - .end(function(error, res) { - if (error) return done(error) - done() - }) - }) + .end(function (error, res) { + if (error) return done(error); + done(); + }); + }); - it('should not choke on a fractional zoom', function(done) { + it("should not choke on a fractional zoom", function (done) { request(settings.host) - .get('/api/v2/mobile/map_query?lat=43.0706192&lng=-89.406167&z=8.984324234') + .get( + "/api/v2/mobile/map_query?lat=43.0706192&lng=-89.406167&z=8.984324234", + ) .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - var response = res.body.success.data - if (!response.hasOwnProperty('elevation')) { - throw new Error('Missing elevation from response') + .expect(function (res) { + var response = res.body.success.data; + if (!response.hasOwnProperty("elevation")) { + throw new Error("Missing elevation from response"); } - if (!response.hasOwnProperty('burwell')) { - throw new Error('Missing burwell from response') + if (!response.hasOwnProperty("burwell")) { + throw new Error("Missing burwell from response"); } - if (!response.hasOwnProperty('macrostrat')) { - throw new Error('Missing macrostrata from response') + if (!response.hasOwnProperty("macrostrat")) { + throw new Error("Missing macrostrata from response"); } - if (!response.hasOwnProperty('lines')) { - throw new Error('Missing lines from response') + if (!response.hasOwnProperty("lines")) { + throw new Error("Missing lines from response"); } if (!response.burwell.length) { - throw new Error('Bad response') + throw new Error("Bad response"); } }) - .end(function(error, res) { - if (error) return done(error) - done() - }) - }) -} + .end(function (error, res) { + if (error) return done(error); + done(); + }); + }); +}; diff --git a/v2/test/v2Tests/mobile_point.ts b/v2/test/v2Tests/mobile_point.ts index 56544d1a..3e201756 100644 --- a/v2/test/v2Tests/mobile_point.ts +++ b/v2/test/v2Tests/mobile_point.ts @@ -1,29 +1,29 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return metadata", function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/mobile/point") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a latitude and longitude", function(done) { + it("should accept a latitude and longitude", function (done) { request(settings.host) .get("/api/v2/mobile/point?lat=43&lng=-89") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/mobile_point_details.ts b/v2/test/v2Tests/mobile_point_details.ts index dec2651d..e7cc4827 100644 --- a/v2/test/v2Tests/mobile_point_details.ts +++ b/v2/test/v2Tests/mobile_point_details.ts @@ -1,51 +1,57 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return metadata", function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/mobile/point_details") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a lat and lng", function(done) { + it("should accept a lat and lng", function (done) { request(settings.host) .get("/api/v2/mobile/point_details?lat=43&lng=-89") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - if (!res.body.success.data[0].column || !res.body.success.data[0].gmus) { + .expect(function (res) { + if ( + !res.body.success.data[0].column || + !res.body.success.data[0].gmus + ) { throw new Error("Response missing a data type"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a col_id and unit_id", function(done) { + it("should accept a col_id and unit_id", function (done) { request(settings.host) .get("/api/v2/mobile/point_details?col_id=187&unit_id=184506") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - if (!res.body.success.data[0].column || !res.body.success.data[0].gmus) { + .expect(function (res) { + if ( + !res.body.success.data[0].column || + !res.body.success.data[0].gmus + ) { throw new Error("Response missing a data type"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/paleogeography.ts b/v2/test/v2Tests/paleogeography.ts index d8852768..01612dd3 100644 --- a/v2/test/v2Tests/paleogeography.ts +++ b/v2/test/v2Tests/paleogeography.ts @@ -1,62 +1,62 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/paleogeography") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/paleogeography?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an age parameter", function(done) { + it("should accept an age parameter", function (done) { request(settings.host) .get("/api/v2/paleogeography?age=271") .expect(validators.aSuccessfulRequest) .expect(validators.geoJSON) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an interval name", function(done) { + it("should accept an interval name", function (done) { request(settings.host) .get("/api/v2/paleogeography?interval_name=Permian") .expect(validators.aSuccessfulRequest) .expect(validators.geoJSON) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return topojson", function(done) { + it("should return topojson", function (done) { request(settings.host) .get("/api/v2/paleogeography?interval_name=Permian&format=topojson") .expect(validators.aSuccessfulRequest) .expect(validators.topoJSON) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/root.ts b/v2/test/v2Tests/root.ts index c10b1739..b1eca620 100644 --- a/v2/test/v2Tests/root.ts +++ b/v2/test/v2Tests/root.ts @@ -1,16 +1,16 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return a list of all visible routes', function(done) { + it("should return a list of all visible routes", function (done) { request(settings.host) .get("/api/v2") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/sections.ts b/v2/test/v2Tests/sections.ts index 0a10d8c8..ff4aef2e 100644 --- a/v2/test/v2Tests/sections.ts +++ b/v2/test/v2Tests/sections.ts @@ -1,51 +1,51 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return metadata", function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/sections") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/sections?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a column id", function(done) { + it("should accept a column id", function (done) { request(settings.host) .get("/api/v2/sections?col_id=49") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return csv", function(done) { + it("should return csv", function (done) { request(settings.host) .get("/api/v2/sections?col_id=17&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/stats.ts b/v2/test/v2Tests/stats.ts index 781eac58..b2e48a97 100644 --- a/v2/test/v2Tests/stats.ts +++ b/v2/test/v2Tests/stats.ts @@ -1,40 +1,40 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/stats") .expect(validators.aSuccessfulRequest) .expect(validators.metadata) .expect(validators.json) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should show ALL THE STATS", function(done) { + it("should show ALL THE STATS", function (done) { request(settings.host) .get("/api/v2/stats?all") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output the stats in CSV", function(done) { + it("should output the stats in CSV", function (done) { request(settings.host) .get("/api/v2/stats?all&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) .expect("Content-Type", "text/csv; charset=utf-8") - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/v2Tests/tiles.ts b/v2/test/v2Tests/tiles.ts index d910e40f..396f6850 100644 --- a/v2/test/v2Tests/tiles.ts +++ b/v2/test/v2Tests/tiles.ts @@ -1,39 +1,38 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it("should return a tile for original", function(done) { + it("should return a tile for original", function (done) { request(settings.host) .get("/api/v2/maps/burwell/3/2/4/tile.png") .expect(validators.aSuccessfulRequest) .expect(validators.tile) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a tile for vanilla", function(done) { + it("should return a tile for vanilla", function (done) { request(settings.host) .get("/api/v2/maps/burwell/vanilla/3/2/4/tile.png") .expect(validators.aSuccessfulRequest) .expect(validators.tile) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a tile for emphasized", function(done) { + it("should return a tile for emphasized", function (done) { request(settings.host) .get("/api/v2/maps/burwell/emphasized/3/2/4/tile.png") .expect(validators.aSuccessfulRequest) .expect(validators.tile) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - -} +}; diff --git a/v2/test/v2Tests/units.ts b/v2/test/v2Tests/units.ts index 90596a3a..ee74ea8a 100644 --- a/v2/test/v2Tests/units.ts +++ b/v2/test/v2Tests/units.ts @@ -1,183 +1,192 @@ -module.exports = function() { +module.exports = function () { var request = require("supertest"), - validators = require("../validators"), - settings = require("../settings"); + validators = require("../validators"), + settings = require("../settings"); - it('should return metadata', function(done) { + it("should return metadata", function (done) { request(settings.host) .get("/api/v2/units") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.metadata) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should return a sample", function(done) { + it("should return a sample", function (done) { request(settings.host) .get("/api/v2/units?sample") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.aSample) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an interval_name", function(done) { + it("should accept an interval_name", function (done) { request(settings.host) .get("/api/v2/units?interval_name=Permian") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an age", function(done) { + it("should accept an age", function (done) { request(settings.host) .get("/api/v2/units?age=400") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an age_top and age_bottom", function(done) { + it("should accept an age_top and age_bottom", function (done) { request(settings.host) .get("/api/v2/units?age_top=200&age_bottom=250") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a section_id", function(done) { + it("should accept a section_id", function (done) { request(settings.host) .get("/api/v2/units?section_id=107") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a response parameter", function(done) { + it("should accept a response parameter", function (done) { request(settings.host) .get("/api/v2/units?age_top=200&age_bottom=250&response=long") .expect(validators.aSuccessfulRequest) .expect(validators.json) - .expect(function(res) { + .expect(function (res) { if (!res.body.success.data[0].b_int_name) { throw new Error("Extra data missing when requested"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a lith parameter", function(done) { + it("should accept a lith parameter", function (done) { request(settings.host) .get("/api/v2/units?lith=sandstone") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 800) { - throw new Error("Not enough results returned when using lith on units"); + throw new Error( + "Not enough results returned when using lith on units", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a lith_type parameter", function(done) { + it("should accept a lith_type parameter", function (done) { request(settings.host) .get("/api/v2/units?lith_type=organic") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 600) { - throw new Error("Not enough results returned when using lith_type on units"); + throw new Error( + "Not enough results returned when using lith_type on units", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a lith_class parameter", function(done) { + it("should accept a lith_class parameter", function (done) { request(settings.host) .get("/api/v2/units?lith_class=metamorphic") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 1800) { - throw new Error("Not enough results returned when using lith_class on units"); + throw new Error( + "Not enough results returned when using lith_class on units", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - - it("should accept a environ parameter", function(done) { + it("should accept a environ parameter", function (done) { request(settings.host) .get("/api/v2/units?environ=reef") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 100) { - throw new Error("Not enough results returned when using environ on units"); + throw new Error( + "Not enough results returned when using environ on units", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a environ_type parameter", function(done) { + it("should accept a environ_type parameter", function (done) { request(settings.host) .get("/api/v2/units?environ_type=carbonate") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 100) { - throw new Error("Not enough results returned when using environ_type on units"); + throw new Error( + "Not enough results returned when using environ_type on units", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a environ_class parameter", function(done) { + it("should accept a environ_class parameter", function (done) { this.timeout(5000); request(settings.host) @@ -185,138 +194,145 @@ module.exports = function() { .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 1000) { - throw new Error("Not enough results returned when using environ_class on units"); + throw new Error( + "Not enough results returned when using environ_class on units", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - - it("should accept a project_id", function(done) { + it("should accept a project_id", function (done) { request(settings.host) .get("/api/v2/units?project_id=4") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 130) { - throw new Error("Not enough results returned when using project_id on units"); + throw new Error( + "Not enough results returned when using project_id on units", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - - it("should accept a strat_name parameter", function(done) { + it("should accept a strat_name parameter", function (done) { request(settings.host) .get("/api/v2/units?strat_name=mancos") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length !== 22) { - throw new Error("Wrong number of units returned when using strat_name on units"); + throw new Error( + "Wrong number of units returned when using strat_name on units", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a strat_name_id parameter", function(done) { + it("should accept a strat_name_id parameter", function (done) { request(settings.host) .get("/api/v2/units?strat_name_id=1205") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length < 10) { - throw new Error("Wrong number of units returned when using strat_id on units"); + throw new Error( + "Wrong number of units returned when using strat_id on units", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output GeoJSON", function(done) { + it("should output GeoJSON", function (done) { request(settings.host) .get("/api/v2/units?strat_name_id=1205&format=geojson") .expect(validators.aSuccessfulRequest) .expect(validators.geoJSON) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output TopoJSON", function(done) { + it("should output TopoJSON", function (done) { request(settings.host) .get("/api/v2/units?strat_name_id=1205&format=topojson") .expect(validators.aSuccessfulRequest) .expect(validators.topoJSON) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a geom_age parameter", function(done) { + it("should accept a geom_age parameter", function (done) { request(settings.host) .get("/api/v2/units?strat_name_id=1205&format=geojson&geom_age=top") .expect(validators.aSuccessfulRequest) .expect(validators.geoJSON) - .expect(function(res) { - var coordLat = res.body.success.data.features[0].geometry.coordinates[1], - coordLng = res.body.success.data.features[0].geometry.coordinates[0], - topLat = res.body.success.data.features[0].properties.t_plat, - topLng = res.body.success.data.features[0].properties.t_plng; + .expect(function (res) { + var coordLat = + res.body.success.data.features[0].geometry.coordinates[1], + coordLng = res.body.success.data.features[0].geometry.coordinates[0], + topLat = res.body.success.data.features[0].properties.t_plat, + topLng = res.body.success.data.features[0].properties.t_plng; if (coordLat != topLat || coordLng != topLng) { - throw new Error("Incorrect coordinates used when specifying a geom_age on /units"); + throw new Error( + "Incorrect coordinates used when specifying a geom_age on /units", + ); } - }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should output CSV", function(done) { + it("should output CSV", function (done) { request(settings.host) .get("/api/v2/units?section_id=107&format=csv") .expect(validators.aSuccessfulRequest) .expect(validators.csv) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - - it("should accept an econ_id filter", function(done) { + it("should accept an econ_id filter", function (done) { request(settings.host) .get("/api/v2/units?econ_id=4&response=long") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - res.body.success.data.forEach(function(d) { + .expect(function (res) { + res.body.success.data.forEach(function (d) { var found = false; - d.econ.forEach(function(j) { + d.econ.forEach(function (j) { if (j.name === "oil reservoir") { - found = true + found = true; } }); if (!found) { @@ -324,22 +340,22 @@ module.exports = function() { } }); }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an econ filter", function(done) { + it("should accept an econ filter", function (done) { request(settings.host) .get("/api/v2/units?econ=uranium%20ore&response=long") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - res.body.success.data.forEach(function(d) { + .expect(function (res) { + res.body.success.data.forEach(function (d) { var found = false; - d.econ.forEach(function(j) { + d.econ.forEach(function (j) { if (j.name === "uranium ore") { found = true; } @@ -349,22 +365,22 @@ module.exports = function() { } }); }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an econ_type filter", function(done) { + it("should accept an econ_type filter", function (done) { request(settings.host) .get("/api/v2/units?econ_type=nuclear&response=long") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - res.body.success.data.forEach(function(d) { + .expect(function (res) { + res.body.success.data.forEach(function (d) { var found = false; - d.econ.forEach(function(j) { + d.econ.forEach(function (j) { if (j.type === "nuclear") { found = true; } @@ -374,71 +390,78 @@ module.exports = function() { } }); }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept an econ_class filter", function(done) { + it("should accept an econ_class filter", function (done) { request(settings.host) .get("/api/v2/units?econ_class=energy&response=long") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { - res.body.success.data.forEach(function(d) { + .expect(function (res) { + res.body.success.data.forEach(function (d) { var found = false; - d.econ.forEach(function(j) { + d.econ.forEach(function (j) { if (j.class === "energy") { found = true; } }); if (!found) { - throw new Error("Wrong econs returned when filtering by econ_class"); + throw new Error( + "Wrong econs returned when filtering by econ_class", + ); } }); }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should accept a PBDB collection filter", function(done) { + it("should accept a PBDB collection filter", function (done) { request(settings.host) .get("/api/v2/units?cltn_id=185,191") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length !== 2) { - throw new Error("Wrong number of units returned with PBDB collection filter") + throw new Error( + "Wrong number of units returned with PBDB collection filter", + ); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); - it("should order the output given the input", function(done) { + it("should order the output given the input", function (done) { request(settings.host) .get("/api/v2/units?unit_id=138,139,137") .expect(validators.aSuccessfulRequest) .expect(validators.json) .expect(validators.atLeastOneResult) - .expect(function(res) { + .expect(function (res) { if (res.body.success.data.length != 3) { throw new Error("Wrong number of units being returned"); } - if (res.body.success.data[0].unit_id != 138 || res.body.success.data[2].unit_id != 137) { + if ( + res.body.success.data[0].unit_id != 138 || + res.body.success.data[2].unit_id != 137 + ) { throw new Error("Wrong order of units returned"); } }) - .end(function(error, res) { + .end(function (error, res) { if (error) return done(error); done(); }); }); -} +}; diff --git a/v2/test/validators.ts b/v2/test/validators.ts index e5dc4497..d0a01d34 100644 --- a/v2/test/validators.ts +++ b/v2/test/validators.ts @@ -1,10 +1,9 @@ var sizeOf = require("image-size"); module.exports = { - - aSuccessfulRequest: function(res) { + aSuccessfulRequest: function (res) { if (res.statusCode !== 200) { - console.log(res.statusCode) + console.log(res.statusCode); throw new Error("Bad status code"); } if (res.headers["access-control-allow-origin"] !== "*") { @@ -12,8 +11,7 @@ module.exports = { } }, - - metadata: function(res) { + metadata: function (res) { // Make sure all the key metadata sections exist if (!res.body.success.description) { throw new Error("Route description missing"); @@ -63,7 +61,7 @@ module.exports = { } }, - aSample: function(res) { + aSample: function (res) { // Make sure 5 records were returned if (res.body.success.data.type) { if (res.body.success.data.features.length !== 5) { @@ -76,37 +74,42 @@ module.exports = { } }, - geoJSON: function(res) { + geoJSON: function (res) { if (res.body.success.data.type !== "FeatureCollection") { throw new Error("GeoJSON was not returned"); } - res.body.success.data.features.forEach(function(d) { - if (!d.geometry || !d.geometry.coordinates || !d.geometry.coordinates.length || !d.properties) { + res.body.success.data.features.forEach(function (d) { + if ( + !d.geometry || + !d.geometry.coordinates || + !d.geometry.coordinates.length || + !d.properties + ) { throw new Error("GeoJSON was malformed", d); } }); }, - topoJSON: function(res) { - if(res.body.success.data.type !== "Topology") { + topoJSON: function (res) { + if (res.body.success.data.type !== "Topology") { throw new Error("TopoJSON was not returned"); } }, - json: function(res) { + json: function (res) { if (!res.body.success && !res.body.error) { throw new Error("Request did not return valid JSON"); } }, - csv: function(res) { + csv: function (res) { if (res.body.length < 10) { throw new Error("No CSV output recieved"); } }, - tile: function(res) { + tile: function (res) { if (res.headers["content-type"] != "image/png") { throw new Error("Wrong content-type header on tile"); } @@ -119,9 +122,9 @@ module.exports = { } }, - atLeastOneResult: function(res) { + atLeastOneResult: function (res) { if (res.body.success.data.length < 1) { throw new Error("Should have returned at least one result"); } - } -} + }, +}; diff --git a/v2/units.ts b/v2/units.ts index 4f87be8f..d8dedbf4 100644 --- a/v2/units.ts +++ b/v2/units.ts @@ -1,12 +1,10 @@ var api = require("./api"), - async = require("async"), - dbgeo = require("dbgeo"), - gp = require("geojson-precision"), - larkin = require("./larkin"); + async = require("async"), + dbgeo = require("dbgeo"), + gp = require("geojson-precision"), + larkin = require("./larkin"); - - -module.exports = function(req, res, next, cb) { +module.exports = function (req, res, next, cb) { // If no parameters, send the route definition if (Object.keys(req.query).length < 1) { return larkin.info(req, res, next); @@ -14,181 +12,332 @@ module.exports = function(req, res, next, cb) { // First determine age range component of query, if any. // NB: ORDER MATTERS here. Do NOT add else if statements before req.query.interval_name, req.query.age or req.query.age_top else statements or those age parameters will be ommitted - async.waterfall([ - function(callback) { - if (req.query.interval_name) { - larkin.query("SELECT age_bottom, age_top, interval_name FROM intervals WHERE interval_name = ? LIMIT 1", [req.query.interval_name], function(error, result) { - if (error) { - callback(error); - } else { - if (result.length === 0) { - return larkin.error(req, res, next, "No results found"); - } else { - callback(null, {"interval_name": result[0].interval_name, "age_bottom": result[0].age_bottom, "age_top": result[0].age_top}); - } - } - }); - - } else if (req.query.int_id) { - larkin.query("SELECT age_bottom, age_top, interval_name FROM intervals WHERE id = ? LIMIT 1", [req.query.int_id], function(error, result) { - if (error) { - - callback(error); - } else { - - if (result.length === 0) { - callback(null, {"interval_name": "none", "age_bottom": 0, "age_top": 9999999}); - } else { - callback(null, {"interval_name": result[0].interval_name, "age_bottom": result[0].age_bottom, "age_top": result[0].age_top}); - } - } - }); - - } else if (req.query.age) { - callback(null, {"interval_name": "none", "age_bottom": req.query.age, "age_top": req.query.age}); - - } else if (req.query.age_top && req.query.age_bottom) { - callback(null, {"interval_name": "none", "age_bottom": req.query.age_bottom, "age_top": req.query.age_top}); - - } else if (req.query.shape) { - - larkin.queryPg("burwell", ` + async.waterfall( + [ + function (callback) { + if (req.query.interval_name) { + larkin.query( + "SELECT age_bottom, age_top, interval_name FROM intervals WHERE interval_name = ? LIMIT 1", + [req.query.interval_name], + function (error, result) { + if (error) { + callback(error); + } else { + if (result.length === 0) { + return larkin.error(req, res, next, "No results found"); + } else { + callback(null, { + interval_name: result[0].interval_name, + age_bottom: result[0].age_bottom, + age_top: result[0].age_top, + }); + } + } + }, + ); + } else if (req.query.int_id) { + larkin.query( + "SELECT age_bottom, age_top, interval_name FROM intervals WHERE id = ? LIMIT 1", + [req.query.int_id], + function (error, result) { + if (error) { + callback(error); + } else { + if (result.length === 0) { + callback(null, { + interval_name: "none", + age_bottom: 0, + age_top: 9999999, + }); + } else { + callback(null, { + interval_name: result[0].interval_name, + age_bottom: result[0].age_bottom, + age_top: result[0].age_top, + }); + } + } + }, + ); + } else if (req.query.age) { + callback(null, { + interval_name: "none", + age_bottom: req.query.age, + age_top: req.query.age, + }); + } else if (req.query.age_top && req.query.age_bottom) { + callback(null, { + interval_name: "none", + age_bottom: req.query.age_bottom, + age_top: req.query.age_top, + }); + } else if (req.query.shape) { + larkin.queryPg( + "burwell", + ` SELECT id FROM macrostrat.cols WHERE ST_Intersects(poly_geom, ST_GeomFromText($1, 4326)) - `, [req.query.shape], function(error, response) { - if (error) return callback(error); - - callback(null, {"interval_name": "none", "age_bottom": 99999, "age_top": 0, "col_ids": response.rows.map(function(d) { return d.id })}); - }); - - } else if (req.query.lat && req.query.lng) { - var sql = (req.query.adjacents === "true") ? "WITH containing_geom AS (SELECT poly_geom FROM macrostrat.cols WHERE ST_Contains(poly_geom, ST_GeomFromText($1, 4326))) SELECT id FROM macrostrat.cols WHERE ST_Intersects((SELECT * FROM containing_geom), poly_geom) ORDER BY ST_Distance(ST_Centroid(poly_geom), ST_GeomFromText($1, 4326))" : "SELECT id FROM macrostrat.cols WHERE ST_Contains(poly_geom, st_setsrid(ST_GeomFromText($1), 4326)) ORDER BY ST_Distance(ST_Centroid(poly_geom), ST_GeomFromText($1, 4326))"; - - larkin.queryPg("burwell", sql, ["POINT(" + larkin.normalizeLng(req.query.lng) + " " + req.query.lat + ")"], function(error, response) { - if (error) { - callback(error); - } else { - callback(null, {"interval_name": "none", "age_bottom": 99999, "age_top": 0, "col_ids": response.rows.map(function(d) { return d.id })}); - } - }); - - } else if (req.query.col_id && req.query.adjacents) { - var col_ids = larkin.parseMultipleIds(req.query.col_id), - placeholders = col_ids.map(function(d, i) { return "$" + (i + 1)}); - - var sql = "WITH containing_geom AS (SELECT poly_geom FROM macrostrat.cols WHERE id IN (" + placeholders.join(",") + ")) SELECT id FROM macrostrat.cols WHERE ST_Intersects((SELECT * FROM containing_geom), poly_geom)"; - - if (col_ids.length === 1) { - sql += " ORDER BY ST_Distance(ST_Centroid(poly_geom), (SELECT * FROM containing_geom))" - } - - larkin.queryPg("burwell", sql, col_ids, function(error, response) { - if (error) { - callback(error); - } else { - callback(null, {"interval_name": "none", "age_bottom": 99999, "age_top": 0, "col_ids": response.rows.map(function(d) { return d.id })}); - } - }); - - - } else if (req.query.col_group_id) { - larkin.query("SELECT id FROM cols WHERE col_group_id IN (:col_group_ids)", {"col_group_ids": larkin.parseMultipleIds(req.query.col_group_id)}, function(error, data) { - callback(null, {"interval_name": "none", "age_bottom": 99999, "age_top": 0, "col_ids": data.map(function(d) { return d.id })}); - }); - - } else if (req.query.strat_name) { - larkin.query("SELECT strat_name_id FROM lookup_strat_names WHERE strat_name LIKE ? ", ["%" + req.query.strat_name + "%"], function(error, result) { - if (error) { - callback(error); - } else { - if (result.length === 0) { - return larkin.error(req, res, next, "No results found"); - } else { - var ids = result.map(function(d) { return d.strat_name_id }); - callback(null, {"interval_name": "none", "age_bottom": 99999, "age_top": 0, "strat_ids": ids }); - } + `, + [req.query.shape], + function (error, response) { + if (error) return callback(error); + + callback(null, { + interval_name: "none", + age_bottom: 99999, + age_top: 0, + col_ids: response.rows.map(function (d) { + return d.id; + }), + }); + }, + ); + } else if (req.query.lat && req.query.lng) { + var sql = + req.query.adjacents === "true" + ? "WITH containing_geom AS (SELECT poly_geom FROM macrostrat.cols WHERE ST_Contains(poly_geom, ST_GeomFromText($1, 4326))) SELECT id FROM macrostrat.cols WHERE ST_Intersects((SELECT * FROM containing_geom), poly_geom) ORDER BY ST_Distance(ST_Centroid(poly_geom), ST_GeomFromText($1, 4326))" + : "SELECT id FROM macrostrat.cols WHERE ST_Contains(poly_geom, st_setsrid(ST_GeomFromText($1), 4326)) ORDER BY ST_Distance(ST_Centroid(poly_geom), ST_GeomFromText($1, 4326))"; + + larkin.queryPg( + "burwell", + sql, + [ + "POINT(" + + larkin.normalizeLng(req.query.lng) + + " " + + req.query.lat + + ")", + ], + function (error, response) { + if (error) { + callback(error); + } else { + callback(null, { + interval_name: "none", + age_bottom: 99999, + age_top: 0, + col_ids: response.rows.map(function (d) { + return d.id; + }), + }); + } + }, + ); + } else if (req.query.col_id && req.query.adjacents) { + var col_ids = larkin.parseMultipleIds(req.query.col_id), + placeholders = col_ids.map(function (d, i) { + return "$" + (i + 1); + }); + + var sql = + "WITH containing_geom AS (SELECT poly_geom FROM macrostrat.cols WHERE id IN (" + + placeholders.join(",") + + ")) SELECT id FROM macrostrat.cols WHERE ST_Intersects((SELECT * FROM containing_geom), poly_geom)"; + + if (col_ids.length === 1) { + sql += + " ORDER BY ST_Distance(ST_Centroid(poly_geom), (SELECT * FROM containing_geom))"; } - }); - } else if (req.query.strat_name_concept_id) { - larkin.query("SELECT id FROM strat_names WHERE concept_id IN (:strat_name_concept_ids) ", {"strat_name_concept_ids": larkin.parseMultipleIds(req.query.strat_name_concept_id)}, function(error, result) { - if (error) { - callback(error); - } else { - if (result.length === 0) { - callback(null, {"interval_name": "none", "age_bottom": 99999, "age_top": 0, "strat_ids": [null] }); - //return larkin.error(req, res, next, "No results found"); + larkin.queryPg("burwell", sql, col_ids, function (error, response) { + if (error) { + callback(error); } else { - var ids = result.map(function(d) { return d.id }); - callback(null, {"interval_name": "none", "age_bottom": 99999, "age_top": 0, "strat_ids": ids }); + callback(null, { + interval_name: "none", + age_bottom: 99999, + age_top: 0, + col_ids: response.rows.map(function (d) { + return d.id; + }), + }); } - } - }); - } else if (req.query.strat_name_id) { - var ids = larkin.parseMultipleIds(req.query.strat_name_id); - callback(null, {"interval_name": "none", "age_bottom": 99999, "age_top": 0, "strat_ids": ids }); - - } else if (req.query.unit_id || req.query.section_id || req.query.col_id || req.query.lith || req.query.lith_id || req.query.lith_class || req.query.lith_type || req.query.lith_group || req.query.environ || req.query.environ_id || req.query.environ_class || req.query.environ_type || req.query.project_id || "sample" in req.query|| "all" in req.query || req.query.econ_id || req.query.econ || req.query.econ_type || req.query.econ_class || req.query.cltn_id || req.query.lith_att_id || req.query.lith_att || req.query.lith_att_type || req.query.col_type || req.query.status_code) { - callback(null, {"interval_name": "none", "age_bottom": 99999, "age_top": 0}); - - } else { - callback("Invalid parameters passed"); - } - }, + }); + } else if (req.query.col_group_id) { + larkin.query( + "SELECT id FROM cols WHERE col_group_id IN (:col_group_ids)", + { col_group_ids: larkin.parseMultipleIds(req.query.col_group_id) }, + function (error, data) { + callback(null, { + interval_name: "none", + age_bottom: 99999, + age_top: 0, + col_ids: data.map(function (d) { + return d.id; + }), + }); + }, + ); + } else if (req.query.strat_name) { + larkin.query( + "SELECT strat_name_id FROM lookup_strat_names WHERE strat_name LIKE ? ", + ["%" + req.query.strat_name + "%"], + function (error, result) { + if (error) { + callback(error); + } else { + if (result.length === 0) { + return larkin.error(req, res, next, "No results found"); + } else { + var ids = result.map(function (d) { + return d.strat_name_id; + }); + callback(null, { + interval_name: "none", + age_bottom: 99999, + age_top: 0, + strat_ids: ids, + }); + } + } + }, + ); + } else if (req.query.strat_name_concept_id) { + larkin.query( + "SELECT id FROM strat_names WHERE concept_id IN (:strat_name_concept_ids) ", + { + strat_name_concept_ids: larkin.parseMultipleIds( + req.query.strat_name_concept_id, + ), + }, + function (error, result) { + if (error) { + callback(error); + } else { + if (result.length === 0) { + callback(null, { + interval_name: "none", + age_bottom: 99999, + age_top: 0, + strat_ids: [null], + }); + //return larkin.error(req, res, next, "No results found"); + } else { + var ids = result.map(function (d) { + return d.id; + }); + callback(null, { + interval_name: "none", + age_bottom: 99999, + age_top: 0, + strat_ids: ids, + }); + } + } + }, + ); + } else if (req.query.strat_name_id) { + var ids = larkin.parseMultipleIds(req.query.strat_name_id); + callback(null, { + interval_name: "none", + age_bottom: 99999, + age_top: 0, + strat_ids: ids, + }); + } else if ( + req.query.unit_id || + req.query.section_id || + req.query.col_id || + req.query.lith || + req.query.lith_id || + req.query.lith_class || + req.query.lith_type || + req.query.lith_group || + req.query.environ || + req.query.environ_id || + req.query.environ_class || + req.query.environ_type || + req.query.project_id || + "sample" in req.query || + "all" in req.query || + req.query.econ_id || + req.query.econ || + req.query.econ_type || + req.query.econ_class || + req.query.cltn_id || + req.query.lith_att_id || + req.query.lith_att || + req.query.lith_att_type || + req.query.col_type || + req.query.status_code + ) { + callback(null, { + interval_name: "none", + age_bottom: 99999, + age_top: 0, + }); + } else { + callback("Invalid parameters passed"); + } + }, - function(data, callback) { - var where = "", - limit = ("sample" in req.query) ? ((cb) ? " LIMIT 15 " : " LIMIT 5") : "", + function (data, callback) { + var where = "", + limit = "sample" in req.query ? (cb ? " LIMIT 15 " : " LIMIT 5") : "", orderby = [], params = {}; - if (req.query.status_code) { - where += "cols.status_code IN (:status_code)" - params["status_code"] = larkin.parseMultipleStrings(decodeURI(req.query.status_code)) - } else { - where += "cols.status_code = 'active'" - } - - if (req.query.lith || req.query.lith_class || req.query.lith_type || req.query.lith_id || req.query.lith_group) { - where += " AND units.id IN (SELECT unit_liths.unit_id FROM unit_liths JOIN liths ON lith_id = liths.id WHERE " - var lithWhere = [] - - if (req.query.lith) { - lithWhere.push("lith IN (:lith)") - params["lith"] = larkin.parseMultipleStrings(req.query.lith); - + if (req.query.status_code) { + where += "cols.status_code IN (:status_code)"; + params["status_code"] = larkin.parseMultipleStrings( + decodeURI(req.query.status_code), + ); + } else { + where += "cols.status_code = 'active'"; } - if (req.query.lith_class) { - lithWhere.push("lith_class IN (:lith_class)") - params["lith_class"] = larkin.parseMultipleStrings(req.query.lith_class); - - } + if ( + req.query.lith || + req.query.lith_class || + req.query.lith_type || + req.query.lith_id || + req.query.lith_group + ) { + where += + " AND units.id IN (SELECT unit_liths.unit_id FROM unit_liths JOIN liths ON lith_id = liths.id WHERE "; + var lithWhere = []; + + if (req.query.lith) { + lithWhere.push("lith IN (:lith)"); + params["lith"] = larkin.parseMultipleStrings(req.query.lith); + } - if (req.query.lith_type) { - lithWhere.push("lith_type IN (:lith_type)") - params["lith_type"] = larkin.parseMultipleStrings(req.query.lith_type); + if (req.query.lith_class) { + lithWhere.push("lith_class IN (:lith_class)"); + params["lith_class"] = larkin.parseMultipleStrings( + req.query.lith_class, + ); + } - } + if (req.query.lith_type) { + lithWhere.push("lith_type IN (:lith_type)"); + params["lith_type"] = larkin.parseMultipleStrings( + req.query.lith_type, + ); + } - if (req.query.lith_group) { - lithWhere.push("lith_group IN (:lith_group)") - params["lith_group"] = larkin.parseMultipleStrings(req.query.lith_group); + if (req.query.lith_group) { + lithWhere.push("lith_group IN (:lith_group)"); + params["lith_group"] = larkin.parseMultipleStrings( + req.query.lith_group, + ); + } - } + if (req.query.lith_id) { + lithWhere.push("liths.id IN (:lith_id)"); + params["lith_id"] = larkin.parseMultipleIds(req.query.lith_id); + } - if (req.query.lith_id) { - lithWhere.push("liths.id IN (:lith_id)") - params["lith_id"] = larkin.parseMultipleIds(req.query.lith_id); + where += lithWhere.join(" OR ") + ")"; } - where += (lithWhere.join(" OR ") + ")") - - } - - if (req.query.lith_att_id || req.query.lith_att || req.query.lith_att_type) { - where += ` + if ( + req.query.lith_att_id || + req.query.lith_att || + req.query.lith_att_type + ) { + where += ` AND units.id IN ( SELECT unit_liths.unit_id FROM unit_liths @@ -197,137 +346,160 @@ module.exports = function(req, res, next, cb) { JOIN lith_atts ON unit_liths_atts.lith_att_id = lith_atts.id WHERE ::lith_att_field`; - if (req.query.lith_att_id) { - where += " IN (:lith_att)) "; - params["lith_att_field"] = "unit_liths_atts.lith_att_id"; - params["lith_att"] = larkin.parseMultipleIds(req.query.lith_att_id); - - } else if (req.query.lith_att) { - where += " IN (:lith_att)) "; - params["lith_att_field"] = "lith_atts.lith_att"; - params["lith_att"] = larkin.parseMultipleStrings(req.query.lith_att); - - } else if (req.query.lith_att_type) { - where += " IN (:lith_att)) "; - params["lith_att_field"] = "lith_atts.att_type"; - params["lith_att"] = larkin.parseMultipleStrings(req.query.lith_att_type); + if (req.query.lith_att_id) { + where += " IN (:lith_att)) "; + params["lith_att_field"] = "unit_liths_atts.lith_att_id"; + params["lith_att"] = larkin.parseMultipleIds(req.query.lith_att_id); + } else if (req.query.lith_att) { + where += " IN (:lith_att)) "; + params["lith_att_field"] = "lith_atts.lith_att"; + params["lith_att"] = larkin.parseMultipleStrings( + req.query.lith_att, + ); + } else if (req.query.lith_att_type) { + where += " IN (:lith_att)) "; + params["lith_att_field"] = "lith_atts.att_type"; + params["lith_att"] = larkin.parseMultipleStrings( + req.query.lith_att_type, + ); + } } - } - if (data.age_bottom !== 99999) { - where += " AND b_age > :age_top AND t_age < :age_bottom"; - params["age_top"] = data.age_top; - params["age_bottom"] = data.age_bottom; - } - - if (req.query.unit_id) { - where += " AND units.id IN (:unit_ids)" - params["unit_ids"] = larkin.parseMultipleIds(req.query.unit_id); - orderby.push("FIELD(units.id, " + larkin.parseMultipleIds(req.query.unit_id).join(",") + ")"); - } - - if (req.query.section_id) { - where += " AND units_sections.section_id IN (:section_ids)"; - params["section_ids"] = larkin.parseMultipleIds(req.query.section_id); - } - - if ("col_ids" in data) { - where += " AND units_sections.col_id IN (:col_ids)"; - if (!(data.col_ids.length)) { - data.col_ids = ['']; + if (data.age_bottom !== 99999) { + where += " AND b_age > :age_top AND t_age < :age_bottom"; + params["age_top"] = data.age_top; + params["age_bottom"] = data.age_bottom; } - params["col_ids"] = data.col_ids; - } else if (req.query.col_id) { - where += " AND units_sections.col_id IN (:col_ids)"; - params["col_ids"] = larkin.parseMultipleIds(req.query.col_id); - } - - if (data.strat_ids) { - where += " AND (lookup_strat_names.bed_id IN (:strat_ids) OR lookup_strat_names.mbr_id IN (:strat_ids) OR lookup_strat_names.fm_id IN (:strat_ids) OR lookup_strat_names.gp_id IN (:strat_ids) OR lookup_strat_names.sgp_id IN (:strat_ids)) "; - params["strat_ids"] = data.strat_ids; - } - - if (req.query.project_id) { - where += " AND lookup_units.project_id IN (:project_id)"; - params["project_id"] = larkin.parseMultipleIds(req.query.project_id); - } - - if (req.query.environ_id || req.query.environ || req.query.environ_class || req.query.environ_type) { - where += " AND units.id IN (SELECT unit_environs.unit_id FROM unit_environs JOIN environs on environ_id=environs.id WHERE " - var environWhere = [] - - if (req.query.environ) { - environWhere.push("environ IN (:environ)") - params["environ"] = larkin.parseMultipleStrings(req.query.environ); + if (req.query.unit_id) { + where += " AND units.id IN (:unit_ids)"; + params["unit_ids"] = larkin.parseMultipleIds(req.query.unit_id); + orderby.push( + "FIELD(units.id, " + + larkin.parseMultipleIds(req.query.unit_id).join(",") + + ")", + ); } - if (req.query.environ_class) { - environWhere.push("environ_class IN (:environ_class)") - params["environ_class"] = larkin.parseMultipleStrings(req.query.environ_class); - + if (req.query.section_id) { + where += " AND units_sections.section_id IN (:section_ids)"; + params["section_ids"] = larkin.parseMultipleIds(req.query.section_id); } - if (req.query.environ_type) { - environWhere.push("environ_type IN (:environ_type)") - params["environ_type"] = larkin.parseMultipleStrings(req.query.environ_type); + if ("col_ids" in data) { + where += " AND units_sections.col_id IN (:col_ids)"; + if (!data.col_ids.length) { + data.col_ids = [""]; + } + params["col_ids"] = data.col_ids; + } else if (req.query.col_id) { + where += " AND units_sections.col_id IN (:col_ids)"; + params["col_ids"] = larkin.parseMultipleIds(req.query.col_id); + } + if (data.strat_ids) { + where += + " AND (lookup_strat_names.bed_id IN (:strat_ids) OR lookup_strat_names.mbr_id IN (:strat_ids) OR lookup_strat_names.fm_id IN (:strat_ids) OR lookup_strat_names.gp_id IN (:strat_ids) OR lookup_strat_names.sgp_id IN (:strat_ids)) "; + params["strat_ids"] = data.strat_ids; } - if (req.query.environ_id) { - environWhere.push("environs.id IN (:environ_id)") - params["environ_id"] = larkin.parseMultipleIds(req.query.environ_id); + if (req.query.project_id) { + where += " AND lookup_units.project_id IN (:project_id)"; + params["project_id"] = larkin.parseMultipleIds(req.query.project_id); } - where += (environWhere.join(" OR ") + ")") + if ( + req.query.environ_id || + req.query.environ || + req.query.environ_class || + req.query.environ_type + ) { + where += + " AND units.id IN (SELECT unit_environs.unit_id FROM unit_environs JOIN environs on environ_id=environs.id WHERE "; + var environWhere = []; + + if (req.query.environ) { + environWhere.push("environ IN (:environ)"); + params["environ"] = larkin.parseMultipleStrings(req.query.environ); + } - } + if (req.query.environ_class) { + environWhere.push("environ_class IN (:environ_class)"); + params["environ_class"] = larkin.parseMultipleStrings( + req.query.environ_class, + ); + } + if (req.query.environ_type) { + environWhere.push("environ_type IN (:environ_type)"); + params["environ_type"] = larkin.parseMultipleStrings( + req.query.environ_type, + ); + } - if (req.query.econ_id || req.query.econ || req.query.econ_type || req.query.econ_class) { - where += " AND units.id IN (SELECT unit_econs.unit_id FROM unit_econs JOIN econs on econ_id=econs.id WHERE ::econ_field"; + if (req.query.environ_id) { + environWhere.push("environs.id IN (:environ_id)"); + params["environ_id"] = larkin.parseMultipleIds( + req.query.environ_id, + ); + } - if (req.query.econ_id) { - where += " IN (:econ))"; - params["econ"] = larkin.parseMultipleIds(req.query.econ_id); - params["econ_field"] = "econs.id"; - } else if (req.query.econ) { - where += " IN (:econ))"; - params["econ"] = larkin.parseMultipleStrings(req.query.econ); - params["econ_field"] = "econs.econ"; - } - if (req.query.econ_type) { - where += " IN (:econ))"; - params["econ"] = larkin.parseMultipleStrings(req.query.econ_type); - params["econ_field"] = "econs.econ_type"; + where += environWhere.join(" OR ") + ")"; } - if (req.query.econ_class) { - where += " IN (:econ))"; - params["econ"] = larkin.parseMultipleStrings(req.query.econ_class); - params["econ_field"] = "econs.econ_class"; - } - } - - if (req.query.cltn_id) { - where += " AND units.id IN (SELECT unit_id FROM pbdb_matches WHERE collection_no IN (:cltn_ids))" - params["cltn_ids"] = larkin.parseMultipleIds(req.query.cltn_id); - } + if ( + req.query.econ_id || + req.query.econ || + req.query.econ_type || + req.query.econ_class + ) { + where += + " AND units.id IN (SELECT unit_econs.unit_id FROM unit_econs JOIN econs on econ_id=econs.id WHERE ::econ_field"; + + if (req.query.econ_id) { + where += " IN (:econ))"; + params["econ"] = larkin.parseMultipleIds(req.query.econ_id); + params["econ_field"] = "econs.id"; + } else if (req.query.econ) { + where += " IN (:econ))"; + params["econ"] = larkin.parseMultipleStrings(req.query.econ); + params["econ_field"] = "econs.econ"; + } + if (req.query.econ_type) { + where += " IN (:econ))"; + params["econ"] = larkin.parseMultipleStrings(req.query.econ_type); + params["econ_field"] = "econs.econ_type"; + } + if (req.query.econ_class) { + where += " IN (:econ))"; + params["econ"] = larkin.parseMultipleStrings(req.query.econ_class); + params["econ_field"] = "econs.econ_class"; + } + } - if (req.query.col_type) { - where += " AND cols.col_type IN (:col_type)" - params["col_type"] = larkin.parseMultipleStrings(req.query.col_type) - } + if (req.query.cltn_id) { + where += + " AND units.id IN (SELECT unit_id FROM pbdb_matches WHERE collection_no IN (:cltn_ids))"; + params["cltn_ids"] = larkin.parseMultipleIds(req.query.cltn_id); + } + if (req.query.col_type) { + where += " AND cols.col_type IN (:col_type)"; + params["col_type"] = larkin.parseMultipleStrings(req.query.col_type); + } - if ("sample" in req.query) { - // Speeds things up... - where += " AND units_sections.col_id IN (92, 488, 463, 289, 430, 481, 261, 534, 369, 798, 771, 1675) " - } + if ("sample" in req.query) { + // Speeds things up... + where += + " AND units_sections.col_id IN (92, 488, 463, 289, 430, 481, 261, 534, 369, 798, 771, 1675) "; + } - params["measure_field"] = ("summarize_measures" in req.query) ? "lookup_unit_attrs_api.measure_long" : "lookup_unit_attrs_api.measure_short"; + params["measure_field"] = + "summarize_measures" in req.query + ? "lookup_unit_attrs_api.measure_long" + : "lookup_unit_attrs_api.measure_short"; - var shortSQL = ` + var shortSQL = ` units.id AS unit_id, units_sections.section_id AS section_id, units_sections.col_id AS col_id, @@ -345,9 +517,9 @@ module.exports = function(req, res, next, cb) { units.min_thick, units.outcrop, lookup_units.pbdb_collections, - lookup_units.pbdb_occurrences` + lookup_units.pbdb_occurrences`; - var longSQL = `${shortSQL}, + var longSQL = `${shortSQL}, lookup_unit_attrs_api.lith, lookup_unit_attrs_api.environ, lookup_unit_attrs_api.econ, @@ -367,15 +539,19 @@ module.exports = function(req, res, next, cb) { lookup_units.units_below, lookup_strat_names.rank_name AS strat_name_long, GROUP_CONCAT(col_refs.ref_id SEPARATOR '|') AS refs - ` - if ("show_position" in req.query){ - longSQL += ", position_top AS t_pos, position_bottom AS b_pos" - } + `; + if ("show_position" in req.query) { + longSQL += ", position_top AS t_pos, position_bottom AS b_pos"; + } - var geometry = ((req.query.format && api.acceptedFormats.geo[req.query.format]) || req.query.response === "long") ? ", lookup_units.clat, lookup_units.clng, lookup_units.t_plat, lookup_units.t_plng, lookup_units.b_plat, lookup_units.b_plng " : ""; + var geometry = + (req.query.format && api.acceptedFormats.geo[req.query.format]) || + req.query.response === "long" + ? ", lookup_units.clat, lookup_units.clng, lookup_units.t_plat, lookup_units.t_plng, lookup_units.b_plat, lookup_units.b_plng " + : ""; - var sql = ` - SELECT ${(req.query.response === 'long' || cb) ? longSQL : shortSQL} ${geometry} + var sql = ` + SELECT ${req.query.response === "long" || cb ? longSQL : shortSQL} ${geometry} FROM units LEFT JOIN lookup_unit_attrs_api ON lookup_unit_attrs_api.unit_id = units.id LEFT JOIN lookup_units ON units.id = lookup_units.unit_id @@ -388,11 +564,11 @@ module.exports = function(req, res, next, cb) { WHERE ${where} GROUP BY units.id - ORDER BY ${(orderby.length > 0) ? orderby.join(', ') + ',' : ''} t_age ASC + ORDER BY ${orderby.length > 0 ? orderby.join(", ") + "," : ""} t_age ASC ${limit} - ` + `; - larkin.query(sql, params, function(error, result) { + larkin.query(sql, params, function (error, result) { if (error) { console.log(error); callback(error); @@ -405,13 +581,26 @@ module.exports = function(req, res, next, cb) { result[i].econ = JSON.parse(result[i].econ) || []; result[i].measure = JSON.parse(result[i].measure) || []; - result[i].units_above = larkin.jsonifyPipes(result[i].units_above, "integers"); - result[i].units_below = larkin.jsonifyPipes(result[i].units_below, "integers"); - result[i].refs = larkin.jsonifyPipes(result[i].refs, "integers"); + result[i].units_above = larkin.jsonifyPipes( + result[i].units_above, + "integers", + ); + result[i].units_below = larkin.jsonifyPipes( + result[i].units_below, + "integers", + ); + result[i].refs = larkin.jsonifyPipes( + result[i].refs, + "integers", + ); } } - if (req.query.format === "csv" && req.query.response === "long" && !cb) { + if ( + req.query.format === "csv" && + req.query.response === "long" && + !cb + ) { for (var i = 0; i < result.length; i++) { result[i].units_above = result[i].units_above.join(","); result[i].units_below = result[i].units_below.join(","); @@ -420,57 +609,83 @@ module.exports = function(req, res, next, cb) { result[i].environ = larkin.pipifyAttrs(result[i].environ); result[i].econ = larkin.pipifyAttrs(result[i].econ); - result[i].refs = result[i].refs.join('|'); - + result[i].refs = result[i].refs.join("|"); } } - if (req.query.format && api.acceptedFormats.geo[req.query.format] && !cb) { - var geomAge = (req.query.geom_age && req.query.geom_age === "top") ? ["t_plng", "t_plat"] : (req.query.geom_age === "bottom") ? ["b_plng", "b_plat"] : ["clng", "clat"]; - - dbgeo.parse(result, { - "geometryType": "ll", - "geometryColumn": geomAge, - "outputFormat": larkin.getOutputFormat(req.query.format) - }, function(error, output) { + if ( + req.query.format && + api.acceptedFormats.geo[req.query.format] && + !cb + ) { + var geomAge = + req.query.geom_age && req.query.geom_age === "top" + ? ["t_plng", "t_plat"] + : req.query.geom_age === "bottom" + ? ["b_plng", "b_plat"] + : ["clng", "clat"]; + + dbgeo.parse( + result, + { + geometryType: "ll", + geometryColumn: geomAge, + outputFormat: larkin.getOutputFormat(req.query.format), + }, + function (error, output) { if (error) { - return larkin.error(req, res, next, "An error was incurred during conversion"); + return larkin.error( + req, + res, + next, + "An error was incurred during conversion", + ); } else { - if (larkin.getOutputFormat(req.query.format) === "geojson") { + if ( + larkin.getOutputFormat(req.query.format) === "geojson" + ) { output = gp(output, 4); } callback(null, data, output); } - } + }, ); } else { callback(null, data, result); } } - }); - } - - ], function(error, data, result) { - if (error) { - console.log(error); - if (cb) { - cb(error) - } else { - return larkin.error(req, res, next, "Something went wrong"); - } - } else { - if (cb) { - cb(null, result); - } else { - return larkin.sendData(req, res, next, { - format: (api.acceptedFormats.standard[req.query.format]) ? req.query.format : "json", - bare: (api.acceptedFormats.bare[req.query.format]) ? true : false, - refs: (req.query.response === "long") ? "refs": false - }, { - data: result }); - + }, + ], + function (error, data, result) { + if (error) { + console.log(error); + if (cb) { + cb(error); + } else { + return larkin.error(req, res, next, "Something went wrong"); + } + } else { + if (cb) { + cb(null, result); + } else { + return larkin.sendData( + req, + res, + next, + { + format: api.acceptedFormats.standard[req.query.format] + ? req.query.format + : "json", + bare: api.acceptedFormats.bare[req.query.format] ? true : false, + refs: req.query.response === "long" ? "refs" : false, + }, + { + data: result, + }, + ); + } } - } - }); -} + }, + ); +}; diff --git a/yarn.lock b/yarn.lock index 2c2711ef..ac7c5d5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2161,6 +2161,7 @@ __metadata: pg: "npm:^8.7.1" pg-native: "npm:^3.0.0" portscanner: "npm:^1.0.0" + prettier: "npm:^3.2.3" redis: "npm:^2.4.2" should: "npm:^4.0.4" supertest: "npm:^0.14.0" @@ -2986,6 +2987,15 @@ __metadata: languageName: node linkType: hard +"prettier@npm:^3.2.3": + version: 3.2.3 + resolution: "prettier@npm:3.2.3" + bin: + prettier: bin/prettier.cjs + checksum: 210ad7faa80ebaa285573b1f72cbf852ee5efdf9ec67d4f480af64fcd0510f0c0ba4d92db538bba91bd0aec69772279937ccd30d8482fefb734d38e55173d4e8 + languageName: node + linkType: hard + "proc-log@npm:^3.0.0": version: 3.0.0 resolution: "proc-log@npm:3.0.0"