@unovis/ts 1.7.0 → 1.7.1-pre.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/leaflet-map/config.d.ts +6 -0
- package/components/leaflet-map/config.js +1 -0
- package/components/leaflet-map/config.js.map +1 -1
- package/components/leaflet-map/modules/map.js +13 -6
- package/components/leaflet-map/modules/map.js.map +1 -1
- package/components/leaflet-map/modules/maplibre-worker-source.js +7 -0
- package/components/leaflet-map/modules/maplibre-worker-source.js.map +1 -0
- package/maps/world-simple.json.d.ts +1 -1
- package/maps/world-simple.json.js +1 -1
- package/package.json +3 -3
|
@@ -6,6 +6,17 @@ import { LeafletMapRenderer } from "../types.js";
|
|
|
6
6
|
"use strict";
|
|
7
7
|
const initialMapCenter = [36, 14];
|
|
8
8
|
const initialMapZoom = 1.9;
|
|
9
|
+
let maplibreWorkerUrl;
|
|
10
|
+
async function getMaplibreWorkerUrl(maplibre) {
|
|
11
|
+
if (!maplibreWorkerUrl) {
|
|
12
|
+
const { default: workerSource, version: workerVersion } = await import("./maplibre-worker-source.js");
|
|
13
|
+
if (maplibre.getVersion() !== workerVersion) {
|
|
14
|
+
console.warn(`Unovis | LeafletMap: maplibre-gl ${maplibre.getVersion()} is loaded, but the bundled MapLibre worker was built from ${workerVersion}. If tiles don't render, align the versions or provide a matching worker with \`setWorkerUrl()\` before the map is initialized`);
|
|
15
|
+
}
|
|
16
|
+
maplibreWorkerUrl = URL.createObjectURL(new Blob([workerSource], { type: "text/javascript" }));
|
|
17
|
+
}
|
|
18
|
+
return maplibreWorkerUrl;
|
|
19
|
+
}
|
|
9
20
|
function updateTopoJson(maplibreMap, config) {
|
|
10
21
|
const { topoJSONLayer } = config;
|
|
11
22
|
if (topoJSONLayer.sources) {
|
|
@@ -100,12 +111,8 @@ async function setupMap(mapContainer, config) {
|
|
|
100
111
|
switch (renderer) {
|
|
101
112
|
case LeafletMapRenderer.MapLibre:
|
|
102
113
|
const maplibre = await import("maplibre-gl");
|
|
103
|
-
if (!maplibre.getWorkerUrl()) {
|
|
104
|
-
|
|
105
|
-
worker: new URL("data:text/javascript;base64,LyoqCiogTWFwTGlicmUgR0wgSlMKKiBAbGljZW5zZSAzLUNsYXVzZSBCU0QuIEZ1bGwgdGV4dCBvZiBsaWNlbnNlOiBodHRwczovL2dpdGh1Yi5jb20vbWFwbGlicmUvbWFwbGlicmUtZ2wtanMvYmxvYi92Ni43LjAvTElDRU5TRS50eHQKKi8KaW1wb3J0e0FuIGFzIGUsQiBhcyB0LEJpIGFzIG4sRCBhcyByLERuIGFzIGksRW4gYXMgYSxHIGFzIG8sSHIgYXMgcyxJIGFzIGMsTG4gYXMgbCxNbiBhcyB1LE90IGFzIGQsUCBhcyBmLFBuIGFzIHAsUnIgYXMgbSxTIGFzIGgsU3QgYXMgZyxVdCBhcyBfLFcgYXMgdixhciBhcyB5LGJyIGFzIGIsYyBhcyB4LGQgYXMgUyxkciBhcyBDLGZ0IGFzIHcsZyBhcyBULGd0IGFzIGVlLGkgYXMgRSxpbiBhcyBELGt0IGFzIE8sbCBhcyBrLG0gYXMgQSxtbiBhcyBqLG4gYXMgdGUsbyBhcyBuZSxwIGFzIHJlLHBuIGFzIGllLHByIGFzIE0scSBhcyBOLHJuIGFzIFAscnIgYXMgRixzbiBhcyBJLHZyIGFzIEwseCBhcyBSLHluIGFzIHosem4gYXMgQn1mcm9tIi4vbWFwbGlicmUtZ2wtc2hhcmVkLm1qcyI7ZnVuY3Rpb24gVihlKXtsZXQgdD10eXBlb2YgZTtpZih0PT09YG51bWJlcmB8fHQ9PT1gYm9vbGVhbmB8fHQ9PT1gc3RyaW5nYHx8ZT09bnVsbClyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSk7aWYoQXJyYXkuaXNBcnJheShlKSl7bGV0IHQ9YFtgO2ZvcihsZXQgbiBvZiBlKXQrPWAke1Yobil9LGA7cmV0dXJuYCR7dH1dYH1sZXQgbj1PYmplY3Qua2V5cyhlKS5zb3J0KCkscj1ge2A7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspcis9YCR7SlNPTi5zdHJpbmdpZnkoblt0XSl9OiR7VihlW25bdF1dKX0sYDtyZXR1cm5gJHtyfX1gfWZ1bmN0aW9uIEgoZSl7bGV0IHQ9YGA7Zm9yKGxldCBuIG9mIHopdCs9YC8ke1YoZVtuXSl9YDtyZXR1cm4gdH1mdW5jdGlvbiBVKGUsdCl7bGV0IG49e307Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2xldCBpPXQmJnRbZVtyXS5pZF18fEgoZVtyXSk7dCYmKHRbZVtyXS5pZF09aSk7bGV0IGE9bltpXTthfHw9bltpXT1bXSxhLnB1c2goZVtyXSl9bGV0IHI9W107Zm9yKGxldCBlIGluIG4pci5wdXNoKG5bZV0pO3JldHVybiByfXZhciBXPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5rZXlDYWNoZT17fSxlJiZ0aGlzLnJlcGxhY2UoZSx0KX1yZXBsYWNlKGUsdCl7dGhpcy5fbGF5ZXJDb25maWdzPXt9LHRoaXMuX2xheWVycz17fSx0aGlzLnVwZGF0ZShlLFtdLHQpfXVwZGF0ZShlLHQsbil7Zm9yKGxldCB0IG9mIGUpe3RoaXMuX2xheWVyQ29uZmlnc1t0LmlkXT10O2xldCBlPXRoaXMuX2xheWVyc1t0LmlkXT1oKHQsbik7ZS5fZmVhdHVyZUZpbHRlcj1pZShlLmZpbHRlcixgbGF5ZXJzWyR7dC5pZH1dLmZpbHRlcmAsbiksdGhpcy5rZXlDYWNoZVt0LmlkXSYmZGVsZXRlIHRoaXMua2V5Q2FjaGVbdC5pZF19Zm9yKGxldCBlIG9mIHQpZGVsZXRlIHRoaXMua2V5Q2FjaGVbZV0sZGVsZXRlIHRoaXMuX2xheWVyQ29uZmlnc1tlXSxkZWxldGUgdGhpcy5fbGF5ZXJzW2VdO3RoaXMuZmFtaWxpZXNCeVNvdXJjZT17fTtsZXQgcj1VKE9iamVjdC52YWx1ZXModGhpcy5fbGF5ZXJDb25maWdzKSx0aGlzLmtleUNhY2hlKTtmb3IobGV0IGUgb2Ygcil7bGV0IHQ9ZS5tYXAoZT0+dGhpcy5fbGF5ZXJzW2UuaWRdKSxuPXRbMF07aWYobi5pc0hpZGRlbigpKWNvbnRpbnVlO2xldCByPW4uc291cmNlfHxgYCxpPXRoaXMuZmFtaWxpZXNCeVNvdXJjZVtyXTtpfHw9dGhpcy5mYW1pbGllc0J5U291cmNlW3JdPXt9O2xldCBhPW4uc291cmNlTGF5ZXJ8fGBfZ2VvanNvblRpbGVMYXllcmAsbz1pW2FdO298fD1pW2FdPVtdLG8ucHVzaCh0KX19fSxHPWNsYXNze2NvbnN0cnVjdG9yKGUpe2xldCB0PXt9LG49W107Zm9yKGxldCByIGluIGUpe2xldCBpPWVbcl0sYT10W3JdPXt9O2ZvcihsZXQgZSBpbiBpKXtsZXQgdD1pW2VdO2lmKCF0fHx0LmJpdG1hcC53aWR0aD09PTB8fHQuYml0bWFwLmhlaWdodD09PTApY29udGludWU7bGV0IHI9e3g6MCx5OjAsdzp0LmJpdG1hcC53aWR0aCsyLGg6dC5iaXRtYXAuaGVpZ2h0KzJ9O24ucHVzaChyKSxhW2VdPXtyZWN0OnIsbWV0cmljczp0Lm1ldHJpY3N9fX1sZXR7dzpyLGg6aX09YyhuKSxhPW5ldyBkKHt3aWR0aDpyfHwxLGhlaWdodDppfHwxfSk7Zm9yKGxldCBuIGluIGUpe2xldCByPWVbbl07Zm9yKGxldCBlIGluIHIpe2xldCBpPXJbZV07aWYoIWl8fGkuYml0bWFwLndpZHRoPT09MHx8aS5iaXRtYXAuaGVpZ2h0PT09MCljb250aW51ZTtsZXQgbz10W25dW2VdLnJlY3Q7ZC5jb3B5KGkuYml0bWFwLGEse3g6MCx5OjB9LHt4Om8ueCsxLHk6by55KzF9LGkuYml0bWFwKX19dGhpcy5pbWFnZT1hLHRoaXMucG9zaXRpb25zPXR9fTtJKGBHbHlwaEF0bGFzYCxHKTt2YXIgSz1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnRpbGVJRD1uZXcgVChlLnRpbGVJRC5vdmVyc2NhbGVkWixlLnRpbGVJRC53cmFwLGUudGlsZUlELmNhbm9uaWNhbC56LGUudGlsZUlELmNhbm9uaWNhbC54LGUudGlsZUlELmNhbm9uaWNhbC55KSx0aGlzLnVpZD1lLnVpZCx0aGlzLnpvb209ZS56b29tLHRoaXMucGl4ZWxSYXRpbz1lLnBpeGVsUmF0aW8sdGhpcy50aWxlU2l6ZT1lLnRpbGVTaXplLHRoaXMuc291cmNlPWUuc291cmNlLHRoaXMub3ZlcnNjYWxpbmc9dGhpcy50aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCksdGhpcy5zaG93Q29sbGlzaW9uQm94ZXM9ZS5zaG93Q29sbGlzaW9uQm94ZXMsdGhpcy5jb2xsZWN0UmVzb3VyY2VUaW1pbmc9ISFlLmNvbGxlY3RSZXNvdXJjZVRpbWluZyx0aGlzLnJldHVybkRlcGVuZGVuY2llcz0hIWUucmV0dXJuRGVwZW5kZW5jaWVzLHRoaXMucHJvbW90ZUlkPWUucHJvbW90ZUlkLHRoaXMuaW5GbGlnaHREZXBlbmRlbmNpZXM9W119YXN5bmMgcGFyc2UoZSx0LG4saSxhKXt0aGlzLmRhdGE9ZSx0aGlzLmNvbGxpc2lvbkJveEFycmF5PW5ldyBfO2xldCBvPW5ldyBTKE9iamVjdC5rZXlzKGUubGF5ZXJzKS5zb3J0KCkpLHM9bmV3IHgodGhpcy50aWxlSUQsdGhpcy5wcm9tb3RlSWQpO3MuYnVja2V0TGF5ZXJJRHM9W107bGV0IGM9e30sbD17ZmVhdHVyZUluZGV4OnMsaWNvbkRlcGVuZGVuY2llczp7fSxwYXR0ZXJuRGVwZW5kZW5jaWVzOnt9LGdseXBoRGVwZW5kZW5jaWVzOnt9LGRhc2hEZXBlbmRlbmNpZXM6e30sYXZhaWxhYmxlSW1hZ2VzOm4sc3ViZGl2aXNpb25HcmFudWxhcml0eTphfSx1PXQuZmFtaWxpZXNCeVNvdXJjZVt0aGlzLnNvdXJjZV07Zm9yKGxldCB0IGluIHUpe2xldCByPWUubGF5ZXJzW3RdO2lmKCFyKWNvbnRpbnVlO3IudmVyc2lvbj09PTEmJm0oYFZlY3RvciB0aWxlIHNvdXJjZSAiJHt0aGlzLnNvdXJjZX0iIGxheWVyICIke3R9IiBkb2VzIG5vdCB1c2UgdmVjdG9yIHRpbGUgc3BlYyB2MiBhbmQgdGhlcmVmb3JlIG1heSBoYXZlIHNvbWUgcmVuZGVyaW5nIGVycm9ycy5gKTtsZXQgaT1vLmVuY29kZSh0KSxhPVtdO2ZvcihsZXQgZT0wO2U8ci5sZW5ndGg7ZSsrKXtsZXQgbj1yLmZlYXR1cmUoZSksbz1zLmdldElkKG4sdCk7YS5wdXNoKHtmZWF0dXJlOm4saWQ6byxpbmRleDplLHNvdXJjZUxheWVySW5kZXg6aX0pfWZvcihsZXQgZSBvZiB1W3RdKXtsZXQgdD1lWzBdO3Quc291cmNlIT09dGhpcy5zb3VyY2UmJm0oYGxheWVyLnNvdXJjZSA9ICR7dC5zb3VyY2V9IGRvZXMgbm90IGVxdWFsIHRoaXMuc291cmNlID0gJHt0aGlzLnNvdXJjZX1gKSwhdC5pc0hpZGRlbih0aGlzLnpvb20sITApJiYocShlLHRoaXMuem9vbSxuKSwoY1t0LmlkXT10LmNyZWF0ZUJ1Y2tldCh7aW5kZXg6cy5idWNrZXRMYXllcklEcy5sZW5ndGgsbGF5ZXJzOmUsem9vbTp0aGlzLnpvb20scGl4ZWxSYXRpbzp0aGlzLnBpeGVsUmF0aW8sb3ZlcnNjYWxpbmc6dGhpcy5vdmVyc2NhbGluZyxjb2xsaXNpb25Cb3hBcnJheTp0aGlzLmNvbGxpc2lvbkJveEFycmF5LHNvdXJjZUxheWVySW5kZXg6aSxzb3VyY2VJRDp0aGlzLnNvdXJjZX0pKS5wb3B1bGF0ZShhLGwsdGhpcy50aWxlSUQuY2Fub25pY2FsKSxzLmJ1Y2tldExheWVySURzLnB1c2goZS5tYXAoZT0+ZS5pZCkpKX19bGV0IGQ9YihsLmdseXBoRGVwZW5kZW5jaWVzLGU9Pk9iamVjdC5rZXlzKGUpKTtmb3IobGV0IGUgb2YgdGhpcy5pbkZsaWdodERlcGVuZGVuY2llcyllPy5hYm9ydCgpO3RoaXMuaW5GbGlnaHREZXBlbmRlbmNpZXM9W107bGV0IHA9UHJvbWlzZS5yZXNvbHZlKHt9KTtpZihPYmplY3Qua2V5cyhkKS5sZW5ndGgpe2xldCBlPW5ldyBBYm9ydENvbnRyb2xsZXI7dGhpcy5pbkZsaWdodERlcGVuZGVuY2llcy5wdXNoKGUpLHA9aS5zZW5kQXN5bmMoe3R5cGU6YEdHYCxkYXRhOntzdGFja3M6ZCxzb3VyY2U6dGhpcy5zb3VyY2UsdGlsZUlEOnRoaXMudGlsZUlELHR5cGU6YGdseXBoc2B9fSxlKX1sZXQgaD1PYmplY3Qua2V5cyhsLmljb25EZXBlbmRlbmNpZXMpLGc9UHJvbWlzZS5yZXNvbHZlKHt9KTtpZihoLmxlbmd0aCl7bGV0IGU9bmV3IEFib3J0Q29udHJvbGxlcjt0aGlzLmluRmxpZ2h0RGVwZW5kZW5jaWVzLnB1c2goZSksZz1pLnNlbmRBc3luYyh7dHlwZTpgR0lgLGRhdGE6e2ljb25zOmgsc291cmNlOnRoaXMuc291cmNlLHRpbGVJRDp0aGlzLnRpbGVJRCx0eXBlOmBpY29uc2B9fSxlKX1sZXQgeT1PYmplY3Qua2V5cyhsLnBhdHRlcm5EZXBlbmRlbmNpZXMpLEM9UHJvbWlzZS5yZXNvbHZlKHt9KTtpZih5Lmxlbmd0aCl7bGV0IGU9bmV3IEFib3J0Q29udHJvbGxlcjt0aGlzLmluRmxpZ2h0RGVwZW5kZW5jaWVzLnB1c2goZSksQz1pLnNlbmRBc3luYyh7dHlwZTpgR0lgLGRhdGE6e2ljb25zOnksc291cmNlOnRoaXMuc291cmNlLHRpbGVJRDp0aGlzLnRpbGVJRCx0eXBlOmBwYXR0ZXJuc2B9fSxlKX1sZXQgdz1sLmRhc2hEZXBlbmRlbmNpZXMsVD1Qcm9taXNlLnJlc29sdmUoe30pO2lmKE9iamVjdC5rZXlzKHcpLmxlbmd0aCl7bGV0IGU9bmV3IEFib3J0Q29udHJvbGxlcjt0aGlzLmluRmxpZ2h0RGVwZW5kZW5jaWVzLnB1c2goZSksVD1pLnNlbmRBc3luYyh7dHlwZTpgR0RBYCxkYXRhOntkYXNoZXM6d319LGUpfWxldFtFLEQsTyxrXT1hd2FpdCBQcm9taXNlLmFsbChbcCxnLEMsVF0pLEE9bmV3IEcoRSksaj1uZXcgZihELE8pO2ZvcihsZXQgZSBpbiBjKXtsZXQgdD1jW2VdO3QgaW5zdGFuY2VvZiByPyhxKHQubGF5ZXJzLHRoaXMuem9vbSxuKSx0ZSh7YnVja2V0OnQsZ2x5cGhNYXA6RSxnbHlwaFBvc2l0aW9uczpBLnBvc2l0aW9ucyxpbWFnZU1hcDpELGltYWdlUG9zaXRpb25zOmouaWNvblBvc2l0aW9ucyxzaG93Q29sbGlzaW9uQm94ZXM6dGhpcy5zaG93Q29sbGlzaW9uQm94ZXMsY2Fub25pY2FsOnRoaXMudGlsZUlELmNhbm9uaWNhbCxzdWJkaXZpc2lvbkdyYW51bGFyaXR5Omwuc3ViZGl2aXNpb25HcmFudWxhcml0eX0pKTp0Lmhhc0RlcGVuZGVuY2llcyYmKHQgaW5zdGFuY2VvZiBlZXx8dCBpbnN0YW5jZW9mIE58fHQgaW5zdGFuY2VvZiB2KSYmKHEodC5sYXllcnMsdGhpcy56b29tLG4pLHQuYWRkRmVhdHVyZXMobCx0aGlzLnRpbGVJRC5jYW5vbmljYWwsai5wYXR0ZXJuUG9zaXRpb25zLGspKX1yZXR1cm57YnVja2V0czpPYmplY3QudmFsdWVzKGMpLmZpbHRlcihlPT4hZS5pc0VtcHR5KCkpLGZlYXR1cmVJbmRleDpzLGNvbGxpc2lvbkJveEFycmF5OnRoaXMuY29sbGlzaW9uQm94QXJyYXksZ2x5cGhBdGxhc0ltYWdlOkEuaW1hZ2UsaW1hZ2VBdGxhczpqLGRhc2hQb3NpdGlvbnM6ayxnbHlwaE1hcDp0aGlzLnJldHVybkRlcGVuZGVuY2llcz9FOm51bGwsaWNvbk1hcDp0aGlzLnJldHVybkRlcGVuZGVuY2llcz9EOm51bGwsZ2x5cGhQb3NpdGlvbnM6dGhpcy5yZXR1cm5EZXBlbmRlbmNpZXM/QS5wb3NpdGlvbnM6bnVsbH19fTtmdW5jdGlvbiBxKGUsdCxuKXtsZXQgcj1uZXcgUCh0KTtmb3IobGV0IHQgb2YgZSl0LnJlY2FsY3VsYXRlKHIsbil9dmFyIEo9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmxvYWRpbmc9e30sdGhpcy5sb2FkZWQ9e30sdGhpcy5wYXJzaW5nPXt9fXN0YXJ0TG9hZGluZyhlLHQpe3RoaXMubG9hZGluZ1tlXT10fWZpbmlzaExvYWRpbmcoZSl7ZGVsZXRlIHRoaXMubG9hZGluZ1tlXX1hYm9ydChlKXtsZXQgdD10aGlzLmxvYWRpbmdbZV07dD8uYWJvcnQmJih0LmFib3J0LmFib3J0KCksZGVsZXRlIHRoaXMubG9hZGluZ1tlXSl9Z2V0UGFyc2luZyhlKXtyZXR1cm4gdGhpcy5wYXJzaW5nW2VdfXNldFBhcnNpbmcoZSx0KXt0aGlzLnBhcnNpbmdbZV09dH1yZW1vdmVQYXJzaW5nKGUpe2RlbGV0ZSB0aGlzLnBhcnNpbmdbZV19bWFya0xvYWRlZChlLHQpe3RoaXMubG9hZGVkW2VdPXR9Z2V0TG9hZGVkKGUpe2xldCB0PXRoaXMubG9hZGVkW2VdO2lmKHQpcmV0dXJuIHR9cmVtb3ZlTG9hZGVkKGUpe2RlbGV0ZSB0aGlzLmxvYWRlZFtlXX1jbGVhckxvYWRlZCgpe3RoaXMubG9hZGVkPXt9fX0sWT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnN0YXJ0PWAke2V9I3N0YXJ0YCx0aGlzLmVuZD1gJHtlfSNlbmRgLHRoaXMubWVhc3VyZT1lLHBlcmZvcm1hbmNlLm1hcmsodGhpcy5zdGFydCl9ZmluaXNoKCl7cGVyZm9ybWFuY2UubWFyayh0aGlzLmVuZCk7bGV0IGU9cGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZSh0aGlzLm1lYXN1cmUpO3JldHVybiBlLmxlbmd0aD09PTAmJihwZXJmb3JtYW5jZS5tZWFzdXJlKHRoaXMubWVhc3VyZSx0aGlzLnN0YXJ0LHRoaXMuZW5kKSxlPXBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUodGhpcy5tZWFzdXJlKSxwZXJmb3JtYW5jZS5jbGVhck1hcmtzKHRoaXMuc3RhcnQpLHBlcmZvcm1hbmNlLmNsZWFyTWFya3ModGhpcy5lbmQpLHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXModGhpcy5tZWFzdXJlKSksZX19LGFlPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLHIsaSl7dGhpcy50eXBlPWUsdGhpcy5wcm9wZXJ0aWVzPW58fHt9LHRoaXMuZXh0ZW50PWksdGhpcy5wb2ludHNBcnJheT10LHRoaXMuaWQ9cn1sb2FkR2VvbWV0cnkoKXtyZXR1cm4gdGhpcy5wb2ludHNBcnJheS5tYXAoZT0+ZS5tYXAoZT0+bmV3IG4oZS54LGUueSkpKX19LG9lPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnZlcnNpb249Mix0aGlzLl9teUZlYXR1cmVzPWUsdGhpcy5uYW1lPXQsdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5leHRlbnQ9bn1mZWF0dXJlKGUpe3JldHVybiB0aGlzLl9teUZlYXR1cmVzW2VdfX0sc2U9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmxheWVycz17fX1hZGRMYXllcihlKXt0aGlzLmxheWVyc1tlLm5hbWVdPWV9fTtmdW5jdGlvbiBjZShlLHQsbil7bGV0e2V4dGVudDpyfT1lLGk9MioqKG4uei10LnopLGE9KG4ueC10LngqaSkqcixvPShuLnktdC55KmkpKnIscz1bXTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IG49ZS5mZWF0dXJlKHQpLGM9bi5sb2FkR2VvbWV0cnkoKTtmb3IobGV0IGUgb2YgYylmb3IobGV0IHQgb2YgZSl0Lng9dC54KmktYSx0Lnk9dC55KmktbztjPUUoYyxuLnR5cGUsLTEyOCwtMTI4LHIrMTI4LHIrMTI4KSxjLmxlbmd0aCE9PTAmJnMucHVzaChuZXcgYWUobi50eXBlLGMsbi5wcm9wZXJ0aWVzLG4uaWQscikpfXJldHVybiBuZXcgb2UocyxlLm5hbWUscil9dmFyIGxlPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLmFjdG9yPWUsdGhpcy5sYXllckluZGV4PXQsdGhpcy5hdmFpbGFibGVJbWFnZXM9bix0aGlzLnRpbGVTdGF0ZT1uZXcgSix0aGlzLm92ZXJ6b29tZWRUaWxlUmVzdWx0Q2FjaGU9bmV3IG5lKDFlMyl9bG9hZFZlY3RvclRpbGUoZSxuKXt0cnl7cmV0dXJue3ZlY3RvclRpbGU6ZS5lbmNvZGluZz09PWBtbHRgP25ldyBrKG4pOm5ldyB3KG5ldyB0KG4pKSxyYXdEYXRhOm59fWNhdGNoKHQpe2xldCByPW5ldyBVaW50OEFycmF5KG4pLGk9clswXT09PTMxJiZyWzFdPT09MTM5LGE9YFVuYWJsZSB0byBwYXJzZSB0aGUgdGlsZSBhdCAke2UucmVxdWVzdC51cmx9LCBgO3Rocm93IGErPWk/YHBsZWFzZSBtYWtlIHN1cmUgdGhlIGRhdGEgaXMgbm90IGd6aXBwZWQgYW5kIHRoYXQgeW91IGhhdmUgY29uZmlndXJlZCB0aGUgcmVsZXZhbnQgaGVhZGVyIGluIHRoZSBzZXJ2ZXJgOmBnb3QgZXJyb3I6ICR7Rih0KS5tZXNzYWdlfWAsRXJyb3IoYSl9fWFzeW5jIGxvYWRUaWxlKGUpe2xldHt1aWQ6dCxvdmVyem9vbVBhcmFtZXRlcnM6bn09ZTtuJiYoZS5yZXF1ZXN0PW4ub3Zlcnpvb21SZXF1ZXN0KTtsZXQgcj10aGlzLl9zdGFydFJlcXVlc3RUaW1pbmcoZSksaT1uZXcgSyhlKTt0aGlzLnRpbGVTdGF0ZS5zdGFydExvYWRpbmcodCxpKTtsZXQgbz1uZXcgQWJvcnRDb250cm9sbGVyO2kuYWJvcnQ9bzt0cnl7bGV0IHM9YXdhaXQgYShlLnJlcXVlc3Qsbyk7aWYoZS5ldGFnJiZlLmV0YWc9PT1zLmV0YWcpcmV0dXJuIHRoaXMudGlsZVN0YXRlLmZpbmlzaExvYWRpbmcodCksdGhpcy5fZ2V0RXRhZ1VubW9kaWZpZWRSZXN1bHQocyxyKTtsZXQgYz10aGlzLmxvYWRWZWN0b3JUaWxlKGUscy5kYXRhKTtpZih0aGlzLnRpbGVTdGF0ZS5maW5pc2hMb2FkaW5nKHQpLCFjKXJldHVybiBudWxsO2xldHt2ZWN0b3JUaWxlOmwscmF3RGF0YTp1fT1jO24mJih7dmVjdG9yVGlsZTpsLHJhd0RhdGE6dX09dGhpcy5fZ2V0T3Zlcnpvb21UaWxlKGUsbCkpO2xldCBkPXRoaXMuX2dldEV4cGlyeURhdGEocyksZj10aGlzLl9maW5pc2hSZXF1ZXN0VGltaW5nKHIpO2kudmVjdG9yVGlsZT1sLGkuZXRhZz1zLmV0YWcsdGhpcy50aWxlU3RhdGUubWFya0xvYWRlZCh0LGkpO2xldCBwPXtyYXdEYXRhOnUsY2FjaGVDb250cm9sOmQscmVzb3VyY2VUaW1pbmc6Zn07cmV0dXJuIHRoaXMudGlsZVN0YXRlLnNldFBhcnNpbmcodCxwKSxhd2FpdCB0aGlzLl9wYXJzZVdvcmtlclRpbGUoaSxlKX1jYXRjaChlKXt0aHJvdyB0aGlzLnRpbGVTdGF0ZS5maW5pc2hMb2FkaW5nKHQpLHRoaXMudGlsZVN0YXRlLm1hcmtMb2FkZWQodCxpKSxlfX1fZ2V0RXRhZ1VubW9kaWZpZWRSZXN1bHQoZSx0KXtsZXQgbj10aGlzLl9nZXRFeHBpcnlEYXRhKGUpLHI9dGhpcy5fZmluaXNoUmVxdWVzdFRpbWluZyh0KTtyZXR1cm4geSh7ZXRhZ1VubW9kaWZpZWQ6ITB9LG4scil9YXN5bmMgX3BhcnNlV29ya2VyVGlsZShlLHQpe2xldCBuPXRoaXMudGlsZVN0YXRlLmdldFBhcnNpbmcoZS51aWQpLHI9YXdhaXQgZS5wYXJzZShlLnZlY3RvclRpbGUsdGhpcy5sYXllckluZGV4LHRoaXMuYXZhaWxhYmxlSW1hZ2VzLHRoaXMuYWN0b3IsdC5zdWJkaXZpc2lvbkdyYW51bGFyaXR5KTtpZihuKXtsZXR7cmF3RGF0YTppLGNhY2hlQ29udHJvbDphLHJlc291cmNlVGltaW5nOm99PW4scz10Lm92ZXJ6b29tUGFyYW1ldGVycz9gbXZ0YDp0LmVuY29kaW5nO3I9eSh7cmF3VGlsZURhdGE6aS5zbGljZSgwKSxlbmNvZGluZzpzfSxyLGEsbyksdGhpcy50aWxlU3RhdGUucmVtb3ZlUGFyc2luZyhlLnVpZCl9ZWxzZSBlLmV0YWcmJihyPXkocix7ZXRhZzplLmV0YWd9KSk7cmV0dXJuIHJ9X2dldEV4cGlyeURhdGEoe2V4cGlyZXM6ZSxjYWNoZUNvbnRyb2w6dCxldGFnOm59KXtsZXQgcj17fTtyZXR1cm4gZSYmKHIuZXhwaXJlcz1lKSx0JiYoci5jYWNoZUNvbnRyb2w9dCksbiYmKHIuZXRhZz1uKSxyfV9zdGFydFJlcXVlc3RUaW1pbmcoZSl7aWYoZS5yZXF1ZXN0Py5jb2xsZWN0UmVzb3VyY2VUaW1pbmcpcmV0dXJuIG5ldyBZKGUucmVxdWVzdC51cmwpfV9maW5pc2hSZXF1ZXN0VGltaW5nKGUpe2xldCB0PWU/LmZpbmlzaCgpO3JldHVybiB0P3tyZXNvdXJjZVRpbWluZzpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQpKX06e319X2dldE92ZXJ6b29tVGlsZShlLHQpe2xldHt0aWxlSUQ6bixzb3VyY2U6cixvdmVyem9vbVBhcmFtZXRlcnM6aX09ZSx7bWF4Wm9vbVRpbGVJRDphfT1pLG89YCR7YS5rZXl9XyR7bi5rZXl9XyR7ZS5yZXF1ZXN0Py51cmx9YCxzPXRoaXMub3Zlcnpvb21lZFRpbGVSZXN1bHRDYWNoZS5nZXQobyk7aWYocylyZXR1cm4gcztsZXQgYz1uZXcgc2UsbD10aGlzLmxheWVySW5kZXguZmFtaWxpZXNCeVNvdXJjZVtyXTtmb3IobGV0IGUgaW4gbCl7bGV0IHI9dC5sYXllcnNbZV07aWYoIXIpY29udGludWU7bGV0IGk9Y2UocixhLG4uY2Fub25pY2FsKTtpLmxlbmd0aD4wJiZjLmFkZExheWVyKGkpfWxldCB1PXt2ZWN0b3JUaWxlOmMscmF3RGF0YTpBKGMpLmJ1ZmZlcn07cmV0dXJuIHRoaXMub3Zlcnpvb21lZFRpbGVSZXN1bHRDYWNoZS5zZXQobyx1KSx1fWFzeW5jIHJlbG9hZFRpbGUoZSl7bGV0IHQ9ZS51aWQsbj10aGlzLnRpbGVTdGF0ZS5nZXRMb2FkZWQodCk7aWYoIW4pdGhyb3cgRXJyb3IoYFNob3VsZCBub3QgYmUgdHJ5aW5nIHRvIHJlbG9hZCBhIHRpbGUgdGhhdCB3YXMgbmV2ZXIgbG9hZGVkIG9yIGhhcyBiZWVuIHJlbW92ZWRgKTtpZihuLnZlY3RvclRpbGUpcmV0dXJuIG4uc2hvd0NvbGxpc2lvbkJveGVzPWUuc2hvd0NvbGxpc2lvbkJveGVzLGF3YWl0IHRoaXMuX3BhcnNlV29ya2VyVGlsZShuLGUpfWFzeW5jIGFib3J0VGlsZShlKXt0aGlzLnRpbGVTdGF0ZS5hYm9ydChlLnVpZCl9YXN5bmMgcmVtb3ZlVGlsZShlKXt0aGlzLnRpbGVTdGF0ZS5yZW1vdmVMb2FkZWQoZS51aWQpfX0sWD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMubG9hZGVkPXt9fWFzeW5jIGxvYWRUaWxlKGUpe2xldHt1aWQ6dCxlbmNvZGluZzpuLHJhd0ltYWdlRGF0YTpyLHJlZEZhY3RvcjppLGdyZWVuRmFjdG9yOmEsYmx1ZUZhY3RvcjpvLGJhc2VTaGlmdDpzfT1lLGM9ci53aWR0aCsyLGw9ci5oZWlnaHQrMix1PU0ocik/bmV3IE8oe3dpZHRoOmMsaGVpZ2h0Omx9LGF3YWl0IEMociwtMSwtMSxjLGwpKTpyLGQ9bmV3IGcodCx1LG4saSxhLG8scyk7cmV0dXJuIHRoaXMubG9hZGVkfHw9e30sdGhpcy5sb2FkZWRbdF09ZCxkfXJlbW92ZVRpbGUoZSl7bGV0IHQ9dGhpcy5sb2FkZWQsbj1lLnVpZDt0Py5bbl0mJmRlbGV0ZSB0W25dfX0sdWU9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scj1kZSl7dGhpcy5hY3Rvcj1lLHRoaXMubGF5ZXJJbmRleD10LHRoaXMuYXZhaWxhYmxlSW1hZ2VzPW4sdGhpcy50aWxlU3RhdGU9bmV3IEosdGhpcy5fY3JlYXRlR2VvSlNPTkluZGV4PXJ9bG9hZFZlY3RvclRpbGUoZSl7aWYoIXRoaXMuX2dlb0pTT05JbmRleCl0aHJvdyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIHRoZSBkYXRhIGludG8gYSBjbHVzdGVyIG9yIGdlb2pzb25gKTtsZXR7ejp0LHg6bix5OnJ9PWUudGlsZUlELmNhbm9uaWNhbCxpPXRoaXMuX2dlb0pTT05JbmRleC5nZXRUaWxlKHQsbixyKTtpZighaSlyZXR1cm4gbnVsbDtsZXQgYT1uZXcgcmUoaS5mZWF0dXJlcyx7dmVyc2lvbjoyLGV4dGVudDpzfSk7cmV0dXJue3ZlY3RvclRpbGU6YSxyYXdEYXRhOkEoYSxCKS5idWZmZXJ9fWFzeW5jIGxvYWRUaWxlKGUpe2xldHt1aWQ6dH09ZSxuPW5ldyBLKGUpO24uYWJvcnQ9bmV3IEFib3J0Q29udHJvbGxlcjt0cnl7bGV0IHI9dGhpcy5sb2FkVmVjdG9yVGlsZShlKTtpZighcilyZXR1cm4gbnVsbDtsZXR7dmVjdG9yVGlsZTppLHJhd0RhdGE6YX09cjtuLnZlY3RvclRpbGU9aSx0aGlzLnRpbGVTdGF0ZS5tYXJrTG9hZGVkKHQsbik7bGV0IG89e3Jhd0RhdGE6YX07cmV0dXJuIHRoaXMudGlsZVN0YXRlLnNldFBhcnNpbmcodCxvKSxhd2FpdCB0aGlzLl9wYXJzZVdvcmtlclRpbGUobixlKX1jYXRjaChlKXt0aHJvdyB0aGlzLnRpbGVTdGF0ZS5tYXJrTG9hZGVkKHQsbiksZX19YXN5bmMgX3BhcnNlV29ya2VyVGlsZShlLHQpe2xldCBuPXRoaXMudGlsZVN0YXRlLmdldFBhcnNpbmcoZS51aWQpLHI9YXdhaXQgZS5wYXJzZShlLnZlY3RvclRpbGUsdGhpcy5sYXllckluZGV4LHRoaXMuYXZhaWxhYmxlSW1hZ2VzLHRoaXMuYWN0b3IsdC5zdWJkaXZpc2lvbkdyYW51bGFyaXR5KTtpZihuKXtsZXR7cmF3RGF0YTp0fT1uO3I9eSh7cmF3VGlsZURhdGE6dC5zbGljZSgwKSxlbmNvZGluZzpgbXZ0YH0sciksdGhpcy50aWxlU3RhdGUucmVtb3ZlUGFyc2luZyhlLnVpZCl9cmV0dXJuIHJ9YXN5bmMgYWJvcnRUaWxlKGUpe3RoaXMudGlsZVN0YXRlLmFib3J0KGUudWlkKX1hc3luYyByZW1vdmVUaWxlKGUpe3RoaXMudGlsZVN0YXRlLnJlbW92ZUxvYWRlZChlLnVpZCl9YXN5bmMgbG9hZERhdGEoZSl7dGhpcy5fcGVuZGluZ1JlcXVlc3Q/LmFib3J0KCk7bGV0IHQ9dGhpcy5fc3RhcnRSZXF1ZXN0VGltaW5nKGUpO3RoaXMuX3BlbmRpbmdSZXF1ZXN0PW5ldyBBYm9ydENvbnRyb2xsZXI7dHJ5e2F3YWl0IHRoaXMubG9hZEFuZFByb2Nlc3NHZW9KU09OKGUsdGhpcy5fcGVuZGluZ1JlcXVlc3QpLGRlbGV0ZSB0aGlzLl9wZW5kaW5nUmVxdWVzdCx0aGlzLnRpbGVTdGF0ZS5jbGVhckxvYWRlZCgpO2xldCBuPXt9O3JldHVybiBlLnJlcXVlc3QmJihuLmRhdGE9ZS5kYXRhKSx0aGlzLl9maW5pc2hSZXF1ZXN0VGltaW5nKHQsZSxuKSxufWNhdGNoKGUpe2lmKGRlbGV0ZSB0aGlzLl9wZW5kaW5nUmVxdWVzdCwhbChlKSl0aHJvdyBlO3JldHVybnthYmFuZG9uZWQ6ITB9fX1fc3RhcnRSZXF1ZXN0VGltaW5nKGUpe2lmKGUucmVxdWVzdD8uY29sbGVjdFJlc291cmNlVGltaW5nKXJldHVybiBuZXcgWShlLnJlcXVlc3QudXJsKX1fZmluaXNoUmVxdWVzdFRpbWluZyhlLHQsbil7bGV0IHI9ZT8uZmluaXNoKCk7ciYmKG4ucmVzb3VyY2VUaW1pbmc9e1t0LnNvdXJjZV06SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyKSl9KX1hc3luYyByZWxvYWRUaWxlKGUpe2xldCB0PWUudWlkLG49dGhpcy50aWxlU3RhdGUuZ2V0TG9hZGVkKHQpO2lmKCFuKXJldHVybiBhd2FpdCB0aGlzLmxvYWRUaWxlKGUpO2lmKG4udmVjdG9yVGlsZSlyZXR1cm4gbi5zaG93Q29sbGlzaW9uQm94ZXM9ZS5zaG93Q29sbGlzaW9uQm94ZXMsYXdhaXQgdGhpcy5fcGFyc2VXb3JrZXJUaWxlKG4sZSl9YXN5bmMgbG9hZEFuZFByb2Nlc3NHZW9KU09OKGUsdCl7aWYoZS5yZXF1ZXN0JiYoZS5kYXRhPShhd2FpdCBpKGUucmVxdWVzdCx0KSkuZGF0YSksZS5kYXRhKXtlLmRhdGE9dGhpcy5fZmlsdGVyR2VvSlNPTihlLmRhdGEsZS5maWx0ZXIsZS5zb3VyY2UpLHRoaXMuX2dlb0pTT05JbmRleD10aGlzLl9jcmVhdGVHZW9KU09OSW5kZXgoZS5kYXRhLGUpO3JldHVybn1pZihlLmRhdGFEaWZmKXt0aGlzLl9nZW9KU09OSW5kZXg/Pz10aGlzLl9jcmVhdGVHZW9KU09OSW5kZXgoe3R5cGU6YEZlYXR1cmVDb2xsZWN0aW9uYCxmZWF0dXJlczpbXX0sZSksdGhpcy5fZ2VvSlNPTkluZGV4LnVwZGF0ZURhdGEoZS5kYXRhRGlmZix0aGlzLl9nZXRGaWx0ZXJQcmVkaWNhdGUoZS5maWx0ZXIsZS5zb3VyY2UpKTtyZXR1cm59aWYoZS51cGRhdGVDbHVzdGVyJiZ0aGlzLl9nZW9KU09OSW5kZXgudXBkYXRlQ2x1c3Rlck9wdGlvbnMoZS5nZW9qc29uVnRPcHRpb25zLmNsdXN0ZXIsWihlKSksdGhpcy5fZ2VvSlNPTkluZGV4PT1udWxsKXRocm93IEVycm9yKGBJbnB1dCBkYXRhIGdpdmVuIHRvICcke2Uuc291cmNlfScgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuYCl9X2ZpbHRlckdlb0pTT04oZSx0LG4pe2lmKGUudHlwZSE9PWBGZWF0dXJlQ29sbGVjdGlvbmApcmV0dXJuIGU7bGV0IHI9dGhpcy5fZ2V0RmlsdGVyUHJlZGljYXRlKHQsbik7cmV0dXJuIHI/e3R5cGU6YEZlYXR1cmVDb2xsZWN0aW9uYCxmZWF0dXJlczplLmZlYXR1cmVzLmZpbHRlcihlPT5yKGUpKX06ZX1fZ2V0RmlsdGVyUHJlZGljYXRlKGUsdCl7aWYodHlwZW9mIGUhPWBib29sZWFuYCYmIWU/Lmxlbmd0aClyZXR1cm47bGV0IG49aihlLGBzb3VyY2VzLiR7dH0uZmlsdGVyYCx7dHlwZTpgYm9vbGVhbmAsInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmAsb3ZlcnJpZGFibGU6ITEsdHJhbnNpdGlvbjohMX0pO2lmKG4ucmVzdWx0PT09YGVycm9yYCl0aHJvdyBFcnJvcihuLnZhbHVlLm1hcChlPT5gJHtlLmtleX06ICR7ZS5tZXNzYWdlfWApLmpvaW4oYCwgYCkpO3JldHVybiBlPT5uLnZhbHVlLmV2YWx1YXRlKHt6b29tOjB9LGUpfWFzeW5jIHJlbW92ZVNvdXJjZShlKXt0aGlzLl9wZW5kaW5nUmVxdWVzdD8uYWJvcnQoKX1nZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShlKXtyZXR1cm4gdGhpcy5fZ2VvSlNPTkluZGV4LmdldENsdXN0ZXJFeHBhbnNpb25ab29tKGUuY2x1c3RlcklkKX1nZXRDbHVzdGVyQ2hpbGRyZW4oZSl7cmV0dXJuIHRoaXMuX2dlb0pTT05JbmRleC5nZXRDbHVzdGVyQ2hpbGRyZW4oZS5jbHVzdGVySWQpfWdldENsdXN0ZXJMZWF2ZXMoZSl7cmV0dXJuIHRoaXMuX2dlb0pTT05JbmRleC5nZXRDbHVzdGVyTGVhdmVzKGUuY2x1c3RlcklkLGUubGltaXQsZS5vZmZzZXQpfX07ZnVuY3Rpb24gZGUoZSx0KXtsZXQgbj15KHQuZ2VvanNvblZ0T3B0aW9uc3x8e30se3VwZGF0ZWFibGU6ITAsY2x1c3Rlck9wdGlvbnM6Wih0KX0pO3JldHVybiBuZXcgbyhlLG4pfWZ1bmN0aW9uIFooe2dlb2pzb25WdE9wdGlvbnM6ZSxjbHVzdGVyUHJvcGVydGllczp0LHNvdXJjZTpufSl7aWYoIXR8fCFlLmNsdXN0ZXJPcHRpb25zKXJldHVybiBlLmNsdXN0ZXJPcHRpb25zO2xldCByPXt9LGk9e30sYT17YWNjdW11bGF0ZWQ6bnVsbCx6b29tOjB9LG89e3Byb3BlcnRpZXM6bnVsbH0scz1PYmplY3Qua2V5cyh0KTtmb3IobGV0IGUgb2Ygcyl7bGV0W2Esb109dFtlXSxzPWoobyxgc291cmNlcy4ke259LmNsdXN0ZXJQcm9wZXJ0aWVzLiR7ZX1bMV1gKSxjPWoodHlwZW9mIGE9PWBzdHJpbmdgP1thLFtgYWNjdW11bGF0ZWRgXSxbYGdldGAsZV1dOmEsYHNvdXJjZXMuJHtufS5jbHVzdGVyUHJvcGVydGllcy4ke2V9WzBdYCk7cltlXT1zLnZhbHVlLGlbZV09Yy52YWx1ZX1yZXR1cm4gZS5jbHVzdGVyT3B0aW9ucy5tYXA9ZT0+e28ucHJvcGVydGllcz1lO2xldCB0PXt9O2ZvcihsZXQgZSBvZiBzKXRbZV09cltlXS5ldmFsdWF0ZShhLG8pO3JldHVybiB0fSxlLmNsdXN0ZXJPcHRpb25zLnJlZHVjZT0oZSx0KT0+e28ucHJvcGVydGllcz10O2ZvcihsZXQgdCBvZiBzKWEuYWNjdW11bGF0ZWQ9ZVt0XSxlW3RdPWlbdF0uZXZhbHVhdGUoYSxvKX0sZS5jbHVzdGVyT3B0aW9uc31hc3luYyBmdW5jdGlvbiBRKGUpe2lmKGUuZW5kc1dpdGgoYC5tanNgKSl7YXdhaXQgaW1wb3J0KGUpO3JldHVybn1sZXQgdD1hd2FpdCBmZXRjaChlLHtjcmVkZW50aWFsczpgc2FtZS1vcmlnaW5gfSk7aWYoIXQub2spdGhyb3cgRXJyb3IoYEZhaWxlZCB0byBsb2FkICR7ZX06ICR7dC5zdGF0dXN9YCk7bGV0IG49YXdhaXQgdC50ZXh0KCk7aWYoL15bIFx0XSooaW1wb3J0fGV4cG9ydClccy9tLnRlc3Qobikpe2xldCBlPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW25dLHt0eXBlOmB0ZXh0L2phdmFzY3JpcHRgfSkpO3RyeXthd2FpdCBpbXBvcnQoZSl9ZmluYWxseXtVUkwucmV2b2tlT2JqZWN0VVJMKGUpfXJldHVybn1nbG9iYWxUaGlzLmV2YWwobil9dmFyICQ9Y2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5zZWxmPXQsdGhpcy5hY3Rvcj1uZXcgUih0KSx0aGlzLmxheWVySW5kZXhlcz17fSx0aGlzLmF2YWlsYWJsZUltYWdlcz17fSx0aGlzLndvcmtlclNvdXJjZXM9e30sdGhpcy5kZW1Xb3JrZXJTb3VyY2VzPXt9LHRoaXMuZXh0ZXJuYWxXb3JrZXJTb3VyY2VUeXBlcz17fSx0aGlzLmdsb2JhbFN0YXRlcz1uZXcgTWFwLHRoaXMuc2VsZi5yZWdpc3RlcldvcmtlclNvdXJjZT0oZSx0KT0+e2lmKHRoaXMuZXh0ZXJuYWxXb3JrZXJTb3VyY2VUeXBlc1tlXSl0aHJvdyBFcnJvcihgV29ya2VyIHNvdXJjZSB3aXRoIG5hbWUgIiR7ZX0iIGFscmVhZHkgcmVnaXN0ZXJlZC5gKTt0aGlzLmV4dGVybmFsV29ya2VyU291cmNlVHlwZXNbZV09dH0sdGhpcy5zZWxmLmFkZFByb3RvY29sPXUsdGhpcy5zZWxmLnJlbW92ZVByb3RvY29sPXAsdGhpcy5zZWxmLnJlZ2lzdGVyUlRMVGV4dFBsdWdpbj1lPT57RC5zZXRNZXRob2RzKGUpfSx0aGlzLnNlbGYubWFrZVJlcXVlc3Q9ZSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoYExEVGAsKGUsdCk9PnRoaXMuX2dldERFTVdvcmtlclNvdXJjZShlLHQuc291cmNlKS5sb2FkVGlsZSh0KSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGBSRFRgLGFzeW5jKGUsdCk9Pnt0aGlzLl9nZXRERU1Xb3JrZXJTb3VyY2UoZSx0LnNvdXJjZSkucmVtb3ZlVGlsZSh0KX0pLHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihgR0NFWmAsYXN5bmMoZSx0KT0+dGhpcy5fZ2V0V29ya2VyU291cmNlKGUsdC50eXBlLHQuc291cmNlKS5nZXRDbHVzdGVyRXhwYW5zaW9uWm9vbSh0KSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGBHQ0NgLGFzeW5jKGUsdCk9PnRoaXMuX2dldFdvcmtlclNvdXJjZShlLHQudHlwZSx0LnNvdXJjZSkuZ2V0Q2x1c3RlckNoaWxkcmVuKHQpKSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoYEdDTGAsYXN5bmMoZSx0KT0+dGhpcy5fZ2V0V29ya2VyU291cmNlKGUsdC50eXBlLHQuc291cmNlKS5nZXRDbHVzdGVyTGVhdmVzKHQpKSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoYExEYCwoZSx0KT0+dGhpcy5fZ2V0V29ya2VyU291cmNlKGUsdC50eXBlLHQuc291cmNlKS5sb2FkRGF0YSh0KSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGBMVGAsKGUsdCk9PnRoaXMuX2dldFdvcmtlclNvdXJjZShlLHQudHlwZSx0LnNvdXJjZSkubG9hZFRpbGUodCkpLHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihgUlRgLChlLHQpPT50aGlzLl9nZXRXb3JrZXJTb3VyY2UoZSx0LnR5cGUsdC5zb3VyY2UpLnJlbG9hZFRpbGUodCkpLHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihgQVRgLChlLHQpPT50aGlzLl9nZXRXb3JrZXJTb3VyY2UoZSx0LnR5cGUsdC5zb3VyY2UpLmFib3J0VGlsZSh0KSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGBSTVRgLChlLHQpPT50aGlzLl9nZXRXb3JrZXJTb3VyY2UoZSx0LnR5cGUsdC5zb3VyY2UpLnJlbW92ZVRpbGUodCkpLHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihgUlNgLGFzeW5jKGUsdCk9PntpZighdGhpcy53b3JrZXJTb3VyY2VzW2VdPy5bdC50eXBlXT8uW3Quc291cmNlXSlyZXR1cm47bGV0IG49dGhpcy53b3JrZXJTb3VyY2VzW2VdW3QudHlwZV1bdC5zb3VyY2VdO2RlbGV0ZSB0aGlzLndvcmtlclNvdXJjZXNbZV1bdC50eXBlXVt0LnNvdXJjZV0sbi5yZW1vdmVTb3VyY2UhPT12b2lkIDAmJm4ucmVtb3ZlU291cmNlKHQpfSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGBSTWAsYXN5bmMgZT0+e2RlbGV0ZSB0aGlzLmxheWVySW5kZXhlc1tlXSxkZWxldGUgdGhpcy5hdmFpbGFibGVJbWFnZXNbZV0sZGVsZXRlIHRoaXMud29ya2VyU291cmNlc1tlXSxkZWxldGUgdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW2VdLHRoaXMuZ2xvYmFsU3RhdGVzLmRlbGV0ZShlKX0pLHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihgU1JgLGFzeW5jKGUsdCk9Pnt0aGlzLnJlZmVycmVyPXR9KSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoYFNSUFNgLChlLHQpPT50aGlzLl9zeW5jUlRMUGx1Z2luU3RhdGUoZSx0KSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGBJU2AsYXN5bmMoZSx0KT0+e2F3YWl0IFEodCl9KSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoYFNJYCwoZSx0KT0+dGhpcy5fc2V0SW1hZ2VzKGUsdCkpLHRoaXMuYWN0b3IucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihgVUxgLGFzeW5jKGUsdCk9Pnt0aGlzLl9nZXRMYXllckluZGV4KGUpLnVwZGF0ZSh0LmxheWVycyx0LnJlbW92ZWRJZHMsdGhpcy5fZ2V0R2xvYmFsU3RhdGUoZSkpfSksdGhpcy5hY3Rvci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGBVR1NgLGFzeW5jKGUsdCk9PntsZXQgbj10aGlzLl9nZXRHbG9iYWxTdGF0ZShlKTtmb3IobGV0IGUgaW4gdCluW2VdPXRbZV19KSx0aGlzLmFjdG9yLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoYFNMYCxhc3luYyhlLHQpPT57dGhpcy5fZ2V0TGF5ZXJJbmRleChlKS5yZXBsYWNlKHQsdGhpcy5fZ2V0R2xvYmFsU3RhdGUoZSkpfSl9X2dldEdsb2JhbFN0YXRlKGUpe2xldCB0PXRoaXMuZ2xvYmFsU3RhdGVzLmdldChlKTtyZXR1cm4gdHx8KHQ9e30sdGhpcy5nbG9iYWxTdGF0ZXMuc2V0KGUsdCkpLHR9YXN5bmMgX3NldEltYWdlcyhlLHQpe3RoaXMuYXZhaWxhYmxlSW1hZ2VzW2VdPXQ7Zm9yKGxldCBuIGluIHRoaXMud29ya2VyU291cmNlc1tlXSl7bGV0IHI9dGhpcy53b3JrZXJTb3VyY2VzW2VdW25dO2ZvcihsZXQgZSBpbiByKXJbZV0uYXZhaWxhYmxlSW1hZ2VzPXR9fWFzeW5jIF9zeW5jUlRMUGx1Z2luU3RhdGUoZSx0KXtyZXR1cm4gYXdhaXQgRC5zeW5jU3RhdGUodCxRKX1fZ2V0QXZhaWxhYmxlSW1hZ2VzKGUpe2xldCB0PXRoaXMuYXZhaWxhYmxlSW1hZ2VzW2VdO3JldHVybiB0fHw9W10sdH1fZ2V0TGF5ZXJJbmRleChlKXtsZXQgdD10aGlzLmxheWVySW5kZXhlc1tlXTtyZXR1cm4gdHx8PXRoaXMubGF5ZXJJbmRleGVzW2VdPW5ldyBXLHR9X2dldFdvcmtlclNvdXJjZShlLHQsbil7aWYodGhpcy53b3JrZXJTb3VyY2VzW2VdfHw9e30sdGhpcy53b3JrZXJTb3VyY2VzW2VdW3RdfHw9e30sIXRoaXMud29ya2VyU291cmNlc1tlXVt0XVtuXSl7bGV0IHI9e3NlbmRBc3luYzoodCxuKT0+KHQudGFyZ2V0TWFwSWQ9ZSx0aGlzLmFjdG9yLnNlbmRBc3luYyh0LG4pKX07c3dpdGNoKHQpe2Nhc2VgdmVjdG9yYDp0aGlzLndvcmtlclNvdXJjZXNbZV1bdF1bbl09bmV3IGxlKHIsdGhpcy5fZ2V0TGF5ZXJJbmRleChlKSx0aGlzLl9nZXRBdmFpbGFibGVJbWFnZXMoZSkpO2JyZWFrO2Nhc2VgZ2VvanNvbmA6dGhpcy53b3JrZXJTb3VyY2VzW2VdW3RdW25dPW5ldyB1ZShyLHRoaXMuX2dldExheWVySW5kZXgoZSksdGhpcy5fZ2V0QXZhaWxhYmxlSW1hZ2VzKGUpKTticmVhaztkZWZhdWx0OnRoaXMud29ya2VyU291cmNlc1tlXVt0XVtuXT1uZXcgdGhpcy5leHRlcm5hbFdvcmtlclNvdXJjZVR5cGVzW3RdKHIsdGhpcy5fZ2V0TGF5ZXJJbmRleChlKSx0aGlzLl9nZXRBdmFpbGFibGVJbWFnZXMoZSkpfX1yZXR1cm4gdGhpcy53b3JrZXJTb3VyY2VzW2VdW3RdW25dfV9nZXRERU1Xb3JrZXJTb3VyY2UoZSx0KXtyZXR1cm4gdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW2VdfHw9e30sdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW2VdW3RdfHw9bmV3IFgsdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW2VdW3RdfX07TChzZWxmKSYmKHNlbGYud29ya2VyPW5ldyAkKHNlbGYpKTtleHBvcnR7JCBhcyBkZWZhdWx0fTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFwbGlicmUtZ2wtd29ya2VyLm1qcy5tYXA=", import.meta.url),
|
|
106
|
-
shared: new URL("data:text/javascript;base64,LyoqCiogTWFwTGlicmUgR0wgSlMKKiBAbGljZW5zZSAzLUNsYXVzZSBCU0QuIEZ1bGwgdGV4dCBvZiBsaWNlbnNlOiBodHRwczovL2dpdGh1Yi5jb20vbWFwbGlicmUvbWFwbGlicmUtZ2wtanMvYmxvYi92Ni43LjAvTElDRU5TRS50eHQKKi8KdmFyIGU9T2JqZWN0LmNyZWF0ZSx0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iscj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyxpPU9iamVjdC5nZXRQcm90b3R5cGVPZixhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksbz0oZSx0KT0+KCk9Pih0fHwoZSgodD17ZXhwb3J0czp7fX0pLmV4cG9ydHMsdCksZT1udWxsKSx0LmV4cG9ydHMpLHM9KGUsaSxvLHMpPT57aWYoaSYmdHlwZW9mIGk9PWBvYmplY3RgfHx0eXBlb2YgaT09YGZ1bmN0aW9uYClmb3IodmFyIGM9cihpKSxsPTAsdT1jLmxlbmd0aCxkO2w8dTtsKyspZD1jW2xdLCFhLmNhbGwoZSxkKSYmZCE9PW8mJnQoZSxkLHtnZXQ6KGU9PmlbZV0pLmJpbmQobnVsbCxkKSxlbnVtZXJhYmxlOiEocz1uKGksZCkpfHxzLmVudW1lcmFibGV9KTtyZXR1cm4gZX0sYz0obixyLG8pPT4obz1uPT1udWxsP3t9OmUoaShuKSkscyhyfHwhbnx8IW4uX19lc01vZHVsZXx8IWEuY2FsbChuLGBkZWZhdWx0YCk/dChvLGBkZWZhdWx0YCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwfSk6byxuKSk7ZnVuY3Rpb24gbChlLHQpe3RoaXMueD1lLHRoaXMueT10fWwucHJvdG90eXBlPXtjbG9uZSgpe3JldHVybiBuZXcgbCh0aGlzLngsdGhpcy55KX0sYWRkKGUpe3JldHVybiB0aGlzLmNsb25lKCkuX2FkZChlKX0sc3ViKGUpe3JldHVybiB0aGlzLmNsb25lKCkuX3N1YihlKX0sbXVsdEJ5UG9pbnQoZSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdEJ5UG9pbnQoZSl9LGRpdkJ5UG9pbnQoZSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2QnlQb2ludChlKX0sbXVsdChlKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0KGUpfSxkaXYoZSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KGUpfSxyb3RhdGUoZSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKGUpfSxyb3RhdGVBcm91bmQoZSx0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGVBcm91bmQoZSx0KX0sbWF0TXVsdChlKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KGUpfSx1bml0KCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fdW5pdCgpfSxwZXJwKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpfSxyb3VuZCgpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCl9LG1hZygpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX0sZXF1YWxzKGUpe3JldHVybiB0aGlzLng9PT1lLngmJnRoaXMueT09PWUueX0sZGlzdChlKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcihlKSl9LGRpc3RTcXIoZSl7bGV0IHQ9ZS54LXRoaXMueCxuPWUueS10aGlzLnk7cmV0dXJuIHQqdCtuKm59LGFuZ2xlKCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy55LHRoaXMueCl9LGFuZ2xlVG8oZSl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy55LWUueSx0aGlzLngtZS54KX0sYW5nbGVXaXRoKGUpe3JldHVybiB0aGlzLmFuZ2xlV2l0aFNlcChlLngsZS55KX0sYW5nbGVXaXRoU2VwKGUsdCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy54KnQtdGhpcy55KmUsdGhpcy54KmUrdGhpcy55KnQpfSxfbWF0TXVsdChlKXtsZXQgdD1lWzBdKnRoaXMueCtlWzFdKnRoaXMueSxuPWVbMl0qdGhpcy54K2VbM10qdGhpcy55O3JldHVybiB0aGlzLng9dCx0aGlzLnk9bix0aGlzfSxfYWRkKGUpe3JldHVybiB0aGlzLngrPWUueCx0aGlzLnkrPWUueSx0aGlzfSxfc3ViKGUpe3JldHVybiB0aGlzLngtPWUueCx0aGlzLnktPWUueSx0aGlzfSxfbXVsdChlKXtyZXR1cm4gdGhpcy54Kj1lLHRoaXMueSo9ZSx0aGlzfSxfZGl2KGUpe3JldHVybiB0aGlzLngvPWUsdGhpcy55Lz1lLHRoaXN9LF9tdWx0QnlQb2ludChlKXtyZXR1cm4gdGhpcy54Kj1lLngsdGhpcy55Kj1lLnksdGhpc30sX2RpdkJ5UG9pbnQoZSl7cmV0dXJuIHRoaXMueC89ZS54LHRoaXMueS89ZS55LHRoaXN9LF91bml0KCl7cmV0dXJuIHRoaXMuX2Rpdih0aGlzLm1hZygpKSx0aGlzfSxfcGVycCgpe2xldCBlPXRoaXMueTtyZXR1cm4gdGhpcy55PXRoaXMueCx0aGlzLng9LWUsdGhpc30sX3JvdGF0ZShlKXtsZXQgdD1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpLHI9dCp0aGlzLngtbip0aGlzLnksaT1uKnRoaXMueCt0KnRoaXMueTtyZXR1cm4gdGhpcy54PXIsdGhpcy55PWksdGhpc30sX3JvdGF0ZUFyb3VuZChlLHQpe2xldCBuPU1hdGguY29zKGUpLHI9TWF0aC5zaW4oZSksaT10LngrbioodGhpcy54LXQueCktcioodGhpcy55LXQueSksYT10LnkrcioodGhpcy54LXQueCkrbioodGhpcy55LXQueSk7cmV0dXJuIHRoaXMueD1pLHRoaXMueT1hLHRoaXN9LF9yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc30sY29uc3RydWN0b3I6bH0sbC5jb252ZXJ0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBsKXJldHVybiBlO2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG5ldyBsKCtlWzBdLCtlWzFdKTtpZihlLnghPT12b2lkIDAmJmUueSE9PXZvaWQgMClyZXR1cm4gbmV3IGwoK2UueCwrZS55KTt0aHJvdyBFcnJvcihgRXhwZWN0ZWQgW3gsIHldIG9yIHt4LCB5fSBwb2ludCBmb3JtYXRgKX07ZnVuY3Rpb24gdShlLHQsbixyKXtsZXQgaT0zKmUsYT0zKihuLWUpLWksbz0xLWktYSxzPTMqdCxjPTMqKHItdCktcyxsPTEtcy1jO3JldHVybiBmdW5jdGlvbihlLHQ9MWUtNil7aWYoZTw9MClyZXR1cm4gMDtpZihlPj0xKXJldHVybiAxO2xldCBuPWU7Zm9yKGxldCByPTA7cjw4O3IrKyl7bGV0IHI9KChvKm4rYSkqbitpKSpuLWU7aWYoTWF0aC5hYnMocik8dClyZXR1cm4oKGwqbitjKSpuK3MpKm47bGV0IHU9KDMqbypuKzIqYSkqbitpO2lmKE1hdGguYWJzKHUpPDFlLTYpYnJlYWs7bi09ci91fWxldCByPTAsdT0xO249ZTtmb3IobGV0IHM9MDtzPDIwO3MrKyl7bGV0IHM9KChvKm4rYSkqbitpKSpuO2lmKE1hdGguYWJzKHMtZSk8dClicmVhaztlPnM/cj1uOnU9bixuPShyK3UpKi41fXJldHVybigobCpuK2MpKm4rcykqbn19bGV0IGQ7ZnVuY3Rpb24gZigpe3JldHVybiBkPz89dHlwZW9mIE9mZnNjcmVlbkNhbnZhczxgdWAmJm5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKS5nZXRDb250ZXh0KGAyZGApJiZ0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXA9PWBmdW5jdGlvbmAsZH1sZXQgcDtmdW5jdGlvbiBtKCl7aWYocD09bnVsbCYmKHA9ITEsZigpKSl7bGV0IGU9bmV3IE9mZnNjcmVlbkNhbnZhcyg1LDUpLmdldENvbnRleHQoYDJkYCx7d2lsbFJlYWRGcmVxdWVudGx5OiEwfSk7aWYoZSl7Zm9yKGxldCB0PTA7dDwyNTt0Kyspe2xldCBuPXQqNDtlLmZpbGxTdHlsZT1gcmdiKCR7bn0sJHtuKzF9LCR7bisyfSlgLGUuZmlsbFJlY3QodCU1LE1hdGguZmxvb3IodC81KSwxLDEpfWxldCB0PWUuZ2V0SW1hZ2VEYXRhKDAsMCw1LDUpLmRhdGE7Zm9yKGxldCBlPTA7ZTwxMDA7ZSsrKWlmKGUlNCE9MyYmdFtlXSE9PWUpe3A9ITA7YnJlYWt9fX1yZXR1cm4gcHx8ITF9dmFyIGg9dHlwZW9mIEZsb2F0MzJBcnJheTxgdWA/RmxvYXQzMkFycmF5OkFycmF5O01hdGguUEkvMTgwLDE4MC9NYXRoLlBJO2Z1bmN0aW9uIGcoKXt2YXIgZT1uZXcgaCg5KTtyZXR1cm4gaCE9RmxvYXQzMkFycmF5JiYoZVsxXT0wLGVbMl09MCxlWzNdPTAsZVs1XT0wLGVbNl09MCxlWzddPTApLGVbMF09MSxlWzRdPTEsZVs4XT0xLGV9ZnVuY3Rpb24gXyhlKXt2YXIgdD1lWzBdLG49ZVsxXSxyPWVbMl0saT1lWzNdLGE9ZVs0XSxvPWVbNV0scz1lWzZdLGM9ZVs3XSxsPWVbOF07cmV0dXJuIHQqKGwqYS1vKmMpK24qKC1sKmkrbypzKStyKihjKmktYSpzKX1mdW5jdGlvbiB2KGUsdCl7dmFyIG49TWF0aC5zaW4odCkscj1NYXRoLmNvcyh0KTtyZXR1cm4gZVswXT1yLGVbMV09bixlWzJdPTAsZVszXT0tbixlWzRdPXIsZVs1XT0wLGVbNl09MCxlWzddPTAsZVs4XT0xLGV9ZnVuY3Rpb24geShlLHQpe3ZhciBuPXRbMF0scj10WzFdLGk9dFsyXSxhPXRbM10sbz1uK24scz1yK3IsYz1pK2ksbD1uKm8sdT1yKm8sZD1yKnMsZj1pKm8scD1pKnMsbT1pKmMsaD1hKm8sZz1hKnMsXz1hKmM7cmV0dXJuIGVbMF09MS1kLW0sZVszXT11LV8sZVs2XT1mK2csZVsxXT11K18sZVs0XT0xLWwtbSxlWzddPXAtaCxlWzJdPWYtZyxlWzVdPXAraCxlWzhdPTEtbC1kLGV9ZnVuY3Rpb24gYigpe3ZhciBlPW5ldyBoKDE2KTtyZXR1cm4gaCE9RmxvYXQzMkFycmF5JiYoZVsxXT0wLGVbMl09MCxlWzNdPTAsZVs0XT0wLGVbNl09MCxlWzddPTAsZVs4XT0wLGVbOV09MCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wKSxlWzBdPTEsZVs1XT0xLGVbMTBdPTEsZVsxNV09MSxlfWZ1bmN0aW9uIHgoZSl7dmFyIHQ9bmV3IGgoMTYpO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdFs0XT1lWzRdLHRbNV09ZVs1XSx0WzZdPWVbNl0sdFs3XT1lWzddLHRbOF09ZVs4XSx0WzldPWVbOV0sdFsxMF09ZVsxMF0sdFsxMV09ZVsxMV0sdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0sdH1mdW5jdGlvbiBTKGUsdCl7cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlWzRdPXRbNF0sZVs1XT10WzVdLGVbNl09dFs2XSxlWzddPXRbN10sZVs4XT10WzhdLGVbOV09dFs5XSxlWzEwXT10WzEwXSxlWzExXT10WzExXSxlWzEyXT10WzEyXSxlWzEzXT10WzEzXSxlWzE0XT10WzE0XSxlWzE1XT10WzE1XSxlfWZ1bmN0aW9uIEMoZSl7cmV0dXJuIGVbMF09MSxlWzFdPTAsZVsyXT0wLGVbM109MCxlWzRdPTAsZVs1XT0xLGVbNl09MCxlWzddPTAsZVs4XT0wLGVbOV09MCxlWzEwXT0xLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSxlfWZ1bmN0aW9uIHcoZSx0KXt2YXIgbj10WzBdLHI9dFsxXSxpPXRbMl0sYT10WzNdLG89dFs0XSxzPXRbNV0sYz10WzZdLGw9dFs3XSx1PXRbOF0sZD10WzldLGY9dFsxMF0scD10WzExXSxtPXRbMTJdLGg9dFsxM10sZz10WzE0XSxfPXRbMTVdLHY9bipzLXIqbyx5PW4qYy1pKm8sYj1uKmwtYSpvLHg9cipjLWkqcyxTPXIqbC1hKnMsQz1pKmwtYSpjLHc9dSpoLWQqbSxUPXUqZy1mKm0sRT11Kl8tcCptLEQ9ZCpnLWYqaCxPPWQqXy1wKmgsaz1mKl8tcCpnLEE9diprLXkqTytiKkQreCpFLVMqVCtDKnc7cmV0dXJuIEE/KEE9MS9BLGVbMF09KHMqay1jKk8rbCpEKSpBLGVbMV09KGkqTy1yKmstYSpEKSpBLGVbMl09KGgqQy1nKlMrXyp4KSpBLGVbM109KGYqUy1kKkMtcCp4KSpBLGVbNF09KGMqRS1vKmstbCpUKSpBLGVbNV09KG4qay1pKkUrYSpUKSpBLGVbNl09KGcqYi1tKkMtXyp5KSpBLGVbN109KHUqQy1mKmIrcCp5KSpBLGVbOF09KG8qTy1zKkUrbCp3KSpBLGVbOV09KHIqRS1uKk8tYSp3KSpBLGVbMTBdPShtKlMtaCpiK18qdikqQSxlWzExXT0oZCpiLXUqUy1wKnYpKkEsZVsxMl09KHMqVC1vKkQtYyp3KSpBLGVbMTNdPShuKkQtcipUK2kqdykqQSxlWzE0XT0oaCp5LW0qeC1nKnYpKkEsZVsxNV09KHUqeC1kKnkrZip2KSpBLGUpOm51bGx9ZnVuY3Rpb24gVChlLHQsbil7dmFyIHI9dFswXSxpPXRbMV0sYT10WzJdLG89dFszXSxzPXRbNF0sYz10WzVdLGw9dFs2XSx1PXRbN10sZD10WzhdLGY9dFs5XSxwPXRbMTBdLG09dFsxMV0saD10WzEyXSxnPXRbMTNdLF89dFsxNF0sdj10WzE1XSx5PW5bMF0sYj1uWzFdLHg9blsyXSxTPW5bM107cmV0dXJuIGVbMF09eSpyK2Iqcyt4KmQrUypoLGVbMV09eSppK2IqYyt4KmYrUypnLGVbMl09eSphK2IqbCt4KnArUypfLGVbM109eSpvK2IqdSt4Km0rUyp2LHk9bls0XSxiPW5bNV0seD1uWzZdLFM9bls3XSxlWzRdPXkqcitiKnMreCpkK1MqaCxlWzVdPXkqaStiKmMreCpmK1MqZyxlWzZdPXkqYStiKmwreCpwK1MqXyxlWzddPXkqbytiKnUreCptK1Mqdix5PW5bOF0sYj1uWzldLHg9blsxMF0sUz1uWzExXSxlWzhdPXkqcitiKnMreCpkK1MqaCxlWzldPXkqaStiKmMreCpmK1MqZyxlWzEwXT15KmErYipsK3gqcCtTKl8sZVsxMV09eSpvK2IqdSt4Km0rUyp2LHk9blsxMl0sYj1uWzEzXSx4PW5bMTRdLFM9blsxNV0sZVsxMl09eSpyK2Iqcyt4KmQrUypoLGVbMTNdPXkqaStiKmMreCpmK1MqZyxlWzE0XT15KmErYipsK3gqcCtTKl8sZVsxNV09eSpvK2IqdSt4Km0rUyp2LGV9ZnVuY3Rpb24gRShlLHQsbil7dmFyIHI9blswXSxpPW5bMV0sYT1uWzJdLG8scyxjLGwsdSxkLGYscCxtLGgsZyxfO3JldHVybiB0PT09ZT8oZVsxMl09dFswXSpyK3RbNF0qaSt0WzhdKmErdFsxMl0sZVsxM109dFsxXSpyK3RbNV0qaSt0WzldKmErdFsxM10sZVsxNF09dFsyXSpyK3RbNl0qaSt0WzEwXSphK3RbMTRdLGVbMTVdPXRbM10qcit0WzddKmkrdFsxMV0qYSt0WzE1XSk6KG89dFswXSxzPXRbMV0sYz10WzJdLGw9dFszXSx1PXRbNF0sZD10WzVdLGY9dFs2XSxwPXRbN10sbT10WzhdLGg9dFs5XSxnPXRbMTBdLF89dFsxMV0sZVswXT1vLGVbMV09cyxlWzJdPWMsZVszXT1sLGVbNF09dSxlWzVdPWQsZVs2XT1mLGVbN109cCxlWzhdPW0sZVs5XT1oLGVbMTBdPWcsZVsxMV09XyxlWzEyXT1vKnIrdSppK20qYSt0WzEyXSxlWzEzXT1zKnIrZCppK2gqYSt0WzEzXSxlWzE0XT1jKnIrZippK2cqYSt0WzE0XSxlWzE1XT1sKnIrcCppK18qYSt0WzE1XSksZX1mdW5jdGlvbiBEKGUsdCxuKXt2YXIgcj1uWzBdLGk9blsxXSxhPW5bMl07cmV0dXJuIGVbMF09dFswXSpyLGVbMV09dFsxXSpyLGVbMl09dFsyXSpyLGVbM109dFszXSpyLGVbNF09dFs0XSppLGVbNV09dFs1XSppLGVbNl09dFs2XSppLGVbN109dFs3XSppLGVbOF09dFs4XSphLGVbOV09dFs5XSphLGVbMTBdPXRbMTBdKmEsZVsxMV09dFsxMV0qYSxlWzEyXT10WzEyXSxlWzEzXT10WzEzXSxlWzE0XT10WzE0XSxlWzE1XT10WzE1XSxlfWZ1bmN0aW9uIE8oZSx0LG4pe3ZhciByPU1hdGguc2luKG4pLGk9TWF0aC5jb3MobiksYT10WzRdLG89dFs1XSxzPXRbNl0sYz10WzddLGw9dFs4XSx1PXRbOV0sZD10WzEwXSxmPXRbMTFdO3JldHVybiB0IT09ZSYmKGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlWzEyXT10WzEyXSxlWzEzXT10WzEzXSxlWzE0XT10WzE0XSxlWzE1XT10WzE1XSksZVs0XT1hKmkrbCpyLGVbNV09byppK3UqcixlWzZdPXMqaStkKnIsZVs3XT1jKmkrZipyLGVbOF09bCppLWEqcixlWzldPXUqaS1vKnIsZVsxMF09ZCppLXMqcixlWzExXT1mKmktYypyLGV9ZnVuY3Rpb24gayhlLHQsbil7dmFyIHI9TWF0aC5zaW4obiksaT1NYXRoLmNvcyhuKSxhPXRbMF0sbz10WzFdLHM9dFsyXSxjPXRbM10sbD10WzhdLHU9dFs5XSxkPXRbMTBdLGY9dFsxMV07cmV0dXJuIHQhPT1lJiYoZVs0XT10WzRdLGVbNV09dFs1XSxlWzZdPXRbNl0sZVs3XT10WzddLGVbMTJdPXRbMTJdLGVbMTNdPXRbMTNdLGVbMTRdPXRbMTRdLGVbMTVdPXRbMTVdKSxlWzBdPWEqaS1sKnIsZVsxXT1vKmktdSpyLGVbMl09cyppLWQqcixlWzNdPWMqaS1mKnIsZVs4XT1hKnIrbCppLGVbOV09bypyK3UqaSxlWzEwXT1zKnIrZCppLGVbMTFdPWMqcitmKmksZX1mdW5jdGlvbiBBKGUsdCxuKXt2YXIgcj1NYXRoLnNpbihuKSxpPU1hdGguY29zKG4pLGE9dFswXSxvPXRbMV0scz10WzJdLGM9dFszXSxsPXRbNF0sdT10WzVdLGQ9dFs2XSxmPXRbN107cmV0dXJuIHQhPT1lJiYoZVs4XT10WzhdLGVbOV09dFs5XSxlWzEwXT10WzEwXSxlWzExXT10WzExXSxlWzEyXT10WzEyXSxlWzEzXT10WzEzXSxlWzE0XT10WzE0XSxlWzE1XT10WzE1XSksZVswXT1hKmkrbCpyLGVbMV09byppK3UqcixlWzJdPXMqaStkKnIsZVszXT1jKmkrZipyLGVbNF09bCppLWEqcixlWzVdPXUqaS1vKnIsZVs2XT1kKmktcypyLGVbN109ZippLWMqcixlfWZ1bmN0aW9uIGVlKGUsdCl7cmV0dXJuIGVbMF09dFswXSxlWzFdPTAsZVsyXT0wLGVbM109MCxlWzRdPTAsZVs1XT10WzFdLGVbNl09MCxlWzddPTAsZVs4XT0wLGVbOV09MCxlWzEwXT10WzJdLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSxlfWZ1bmN0aW9uIHRlKGUsdCxuLHIsaSl7dmFyIGE9MS9NYXRoLnRhbih0LzIpO2lmKGVbMF09YS9uLGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09MCxlWzVdPWEsZVs2XT0wLGVbN109MCxlWzhdPTAsZVs5XT0wLGVbMTFdPS0xLGVbMTJdPTAsZVsxM109MCxlWzE1XT0wLGkhPW51bGwmJmkhPT0xLzApe3ZhciBvPTEvKHItaSk7ZVsxMF09KGkrcikqbyxlWzE0XT0yKmkqcipvfWVsc2UgZVsxMF09LTEsZVsxNF09LTIqcjtyZXR1cm4gZX12YXIgbmU9dGU7ZnVuY3Rpb24gcmUoZSx0LG4scixpLGEsbyl7dmFyIHM9MS8odC1uKSxjPTEvKHItaSksbD0xLyhhLW8pO3JldHVybiBlWzBdPS0yKnMsZVsxXT0wLGVbMl09MCxlWzNdPTAsZVs0XT0wLGVbNV09LTIqYyxlWzZdPTAsZVs3XT0wLGVbOF09MCxlWzldPTAsZVsxMF09MipsLGVbMTFdPTAsZVsxMl09KHQrbikqcyxlWzEzXT0oaStyKSpjLGVbMTRdPShvK2EpKmwsZVsxNV09MSxlfXZhciBpZT1yZTtmdW5jdGlvbiBhZShlLHQpe3JldHVybiBlWzBdPT09dFswXSYmZVsxXT09PXRbMV0mJmVbMl09PT10WzJdJiZlWzNdPT09dFszXSYmZVs0XT09PXRbNF0mJmVbNV09PT10WzVdJiZlWzZdPT09dFs2XSYmZVs3XT09PXRbN10mJmVbOF09PT10WzhdJiZlWzldPT09dFs5XSYmZVsxMF09PT10WzEwXSYmZVsxMV09PT10WzExXSYmZVsxMl09PT10WzEyXSYmZVsxM109PT10WzEzXSYmZVsxNF09PT10WzE0XSYmZVsxNV09PT10WzE1XX1mdW5jdGlvbiBvZShlLHQpe3ZhciBuPWVbMF0scj1lWzFdLGk9ZVsyXSxhPWVbM10sbz1lWzRdLHM9ZVs1XSxjPWVbNl0sbD1lWzddLHU9ZVs4XSxkPWVbOV0sZj1lWzEwXSxwPWVbMTFdLG09ZVsxMl0saD1lWzEzXSxnPWVbMTRdLF89ZVsxNV0sdj10WzBdLHk9dFsxXSxiPXRbMl0seD10WzNdLFM9dFs0XSxDPXRbNV0sdz10WzZdLFQ9dFs3XSxFPXRbOF0sRD10WzldLE89dFsxMF0saz10WzExXSxBPXRbMTJdLGVlPXRbMTNdLHRlPXRbMTRdLG5lPXRbMTVdO3JldHVybiBNYXRoLmFicyhuLXYpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMobiksTWF0aC5hYnModikpJiZNYXRoLmFicyhyLXkpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMoeSkpJiZNYXRoLmFicyhpLWIpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMoaSksTWF0aC5hYnMoYikpJiZNYXRoLmFicyhhLXgpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMoYSksTWF0aC5hYnMoeCkpJiZNYXRoLmFicyhvLVMpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnMoUykpJiZNYXRoLmFicyhzLUMpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMocyksTWF0aC5hYnMoQykpJiZNYXRoLmFicyhjLXcpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMoYyksTWF0aC5hYnModykpJiZNYXRoLmFicyhsLVQpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMobCksTWF0aC5hYnMoVCkpJiZNYXRoLmFicyh1LUUpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnModSksTWF0aC5hYnMoRSkpJiZNYXRoLmFicyhkLUQpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMoZCksTWF0aC5hYnMoRCkpJiZNYXRoLmFicyhmLU8pPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMoZiksTWF0aC5hYnMoTykpJiZNYXRoLmFicyhwLWspPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMocCksTWF0aC5hYnMoaykpJiZNYXRoLmFicyhtLUEpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMobSksTWF0aC5hYnMoQSkpJiZNYXRoLmFicyhoLWVlKTw9MWUtNipNYXRoLm1heCgxLE1hdGguYWJzKGgpLE1hdGguYWJzKGVlKSkmJk1hdGguYWJzKGctdGUpPD0xZS02Kk1hdGgubWF4KDEsTWF0aC5hYnMoZyksTWF0aC5hYnModGUpKSYmTWF0aC5hYnMoXy1uZSk8PTFlLTYqTWF0aC5tYXgoMSxNYXRoLmFicyhfKSxNYXRoLmFicyhuZSkpfWZ1bmN0aW9uIHNlKCl7dmFyIGU9bmV3IGgoMyk7cmV0dXJuIGghPUZsb2F0MzJBcnJheSYmKGVbMF09MCxlWzFdPTAsZVsyXT0wKSxlfWZ1bmN0aW9uIGNlKGUpe3ZhciB0PW5ldyBoKDMpO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0fWZ1bmN0aW9uIGxlKGUpe3ZhciB0PWVbMF0sbj1lWzFdLHI9ZVsyXTtyZXR1cm4gTWF0aC5zcXJ0KHQqdCtuKm4rcipyKX1mdW5jdGlvbiB1ZShlLHQsbil7dmFyIHI9bmV3IGgoMyk7cmV0dXJuIHJbMF09ZSxyWzFdPXQsclsyXT1uLHJ9ZnVuY3Rpb24gZGUoZSx0LG4pe3JldHVybiBlWzBdPXRbMF0rblswXSxlWzFdPXRbMV0rblsxXSxlWzJdPXRbMl0rblsyXSxlfWZ1bmN0aW9uIGZlKGUsdCxuKXtyZXR1cm4gZVswXT10WzBdLW5bMF0sZVsxXT10WzFdLW5bMV0sZVsyXT10WzJdLW5bMl0sZX1mdW5jdGlvbiBwZShlLHQsbil7cmV0dXJuIGVbMF09dFswXSpuLGVbMV09dFsxXSpuLGVbMl09dFsyXSpuLGV9ZnVuY3Rpb24gbWUoZSx0LG4scil7cmV0dXJuIGVbMF09dFswXStuWzBdKnIsZVsxXT10WzFdK25bMV0qcixlWzJdPXRbMl0rblsyXSpyLGV9ZnVuY3Rpb24gaGUoZSx0KXtyZXR1cm4gZVswXT0tdFswXSxlWzFdPS10WzFdLGVbMl09LXRbMl0sZX1mdW5jdGlvbiBnZShlLHQpe3ZhciBuPXRbMF0scj10WzFdLGk9dFsyXSxhPW4qbityKnIraSppO3JldHVybiBhPjAmJihhPTEvTWF0aC5zcXJ0KGEpKSxlWzBdPXRbMF0qYSxlWzFdPXRbMV0qYSxlWzJdPXRbMl0qYSxlfWZ1bmN0aW9uIF9lKGUsdCl7cmV0dXJuIGVbMF0qdFswXStlWzFdKnRbMV0rZVsyXSp0WzJdfWZ1bmN0aW9uIHZlKGUsdCxuKXt2YXIgcj10WzBdLGk9dFsxXSxhPXRbMl0sbz1uWzBdLHM9blsxXSxjPW5bMl07cmV0dXJuIGVbMF09aSpjLWEqcyxlWzFdPWEqby1yKmMsZVsyXT1yKnMtaSpvLGV9ZnVuY3Rpb24geWUoZSx0LG4pe3ZhciByPXRbMF0saT10WzFdLGE9dFsyXSxvPW5bM10qcituWzddKmkrblsxMV0qYStuWzE1XTtyZXR1cm4gb3x8PTEsZVswXT0oblswXSpyK25bNF0qaStuWzhdKmErblsxMl0pL28sZVsxXT0oblsxXSpyK25bNV0qaStuWzldKmErblsxM10pL28sZVsyXT0oblsyXSpyK25bNl0qaStuWzEwXSphK25bMTRdKS9vLGV9ZnVuY3Rpb24gYmUoZSx0LG4pe3ZhciByPXRbMF0saT10WzFdLGE9dFsyXTtyZXR1cm4gZVswXT1yKm5bMF0raSpuWzNdK2Eqbls2XSxlWzFdPXIqblsxXStpKm5bNF0rYSpuWzddLGVbMl09cipuWzJdK2kqbls1XSthKm5bOF0sZX1mdW5jdGlvbiB4ZShlLHQsbil7dmFyIHI9blswXSxpPW5bMV0sYT1uWzJdLG89blszXSxzPXRbMF0sYz10WzFdLGw9dFsyXSx1PWkqbC1hKmMsZD1hKnMtcipsLGY9cipjLWkqcztyZXR1cm4gdSs9dSxkKz1kLGYrPWYsZVswXT1zK28qdStpKmYtYSpkLGVbMV09YytvKmQrYSp1LXIqZixlWzJdPWwrbypmK3IqZC1pKnUsZX1mdW5jdGlvbiBTZShlLHQsbixyKXt2YXIgaT1bXSxhPVtdO3JldHVybiBpWzBdPXRbMF0tblswXSxpWzFdPXRbMV0tblsxXSxpWzJdPXRbMl0tblsyXSxhWzBdPWlbMF0sYVsxXT1pWzFdKk1hdGguY29zKHIpLWlbMl0qTWF0aC5zaW4ociksYVsyXT1pWzFdKk1hdGguc2luKHIpK2lbMl0qTWF0aC5jb3MociksZVswXT1hWzBdK25bMF0sZVsxXT1hWzFdK25bMV0sZVsyXT1hWzJdK25bMl0sZX1mdW5jdGlvbiBDZShlLHQsbixyKXt2YXIgaT1bXSxhPVtdO3JldHVybiBpWzBdPXRbMF0tblswXSxpWzFdPXRbMV0tblsxXSxpWzJdPXRbMl0tblsyXSxhWzBdPWlbMl0qTWF0aC5zaW4ocikraVswXSpNYXRoLmNvcyhyKSxhWzFdPWlbMV0sYVsyXT1pWzJdKk1hdGguY29zKHIpLWlbMF0qTWF0aC5zaW4ociksZVswXT1hWzBdK25bMF0sZVsxXT1hWzFdK25bMV0sZVsyXT1hWzJdK25bMl0sZX1mdW5jdGlvbiB3ZShlLHQsbixyKXt2YXIgaT1bXSxhPVtdO3JldHVybiBpWzBdPXRbMF0tblswXSxpWzFdPXRbMV0tblsxXSxpWzJdPXRbMl0tblsyXSxhWzBdPWlbMF0qTWF0aC5jb3MociktaVsxXSpNYXRoLnNpbihyKSxhWzFdPWlbMF0qTWF0aC5zaW4ocikraVsxXSpNYXRoLmNvcyhyKSxhWzJdPWlbMl0sZVswXT1hWzBdK25bMF0sZVsxXT1hWzFdK25bMV0sZVsyXT1hWzJdK25bMl0sZX1mdW5jdGlvbiBUZShlKXtyZXR1cm4gZVswXT0wLGVbMV09MCxlWzJdPTAsZX12YXIgRWU9ZmUsRGU9bGU7KGZ1bmN0aW9uKCl7dmFyIGU9c2UoKTtyZXR1cm4gZnVuY3Rpb24odCxuLHIsaSxhLG8pe3ZhciBzLGM7Zm9yKG58fD0zLHJ8fD0wLGM9aT9NYXRoLm1pbihpKm4rcix0Lmxlbmd0aCk6dC5sZW5ndGgscz1yO3M8YztzKz1uKWVbMF09dFtzXSxlWzFdPXRbcysxXSxlWzJdPXRbcysyXSxhKGUsZSxvKSx0W3NdPWVbMF0sdFtzKzFdPWVbMV0sdFtzKzJdPWVbMl07cmV0dXJuIHR9fSkoKTtmdW5jdGlvbiBPZSgpe3ZhciBlPW5ldyBoKDQpO3JldHVybiBoIT1GbG9hdDMyQXJyYXkmJihlWzBdPTAsZVsxXT0wLGVbMl09MCxlWzNdPTApLGV9ZnVuY3Rpb24ga2UoZSx0LG4scil7dmFyIGk9bmV3IGgoNCk7cmV0dXJuIGlbMF09ZSxpWzFdPXQsaVsyXT1uLGlbM109cixpfWZ1bmN0aW9uIEFlKGUsdCxuKXtyZXR1cm4gZVswXT10WzBdKm5bMF0sZVsxXT10WzFdKm5bMV0sZVsyXT10WzJdKm5bMl0sZVszXT10WzNdKm5bM10sZX1mdW5jdGlvbiBqZShlLHQsbil7cmV0dXJuIGVbMF09dFswXSpuLGVbMV09dFsxXSpuLGVbMl09dFsyXSpuLGVbM109dFszXSpuLGV9ZnVuY3Rpb24gTWUoZSx0KXt2YXIgbj10WzBdLHI9dFsxXSxpPXRbMl0sYT10WzNdLG89bipuK3IqcitpKmkrYSphO3JldHVybiBvPjAmJihvPTEvTWF0aC5zcXJ0KG8pKSxlWzBdPW4qbyxlWzFdPXIqbyxlWzJdPWkqbyxlWzNdPWEqbyxlfWZ1bmN0aW9uIE5lKGUsdCxuKXt2YXIgcj10WzBdLGk9dFsxXSxhPXRbMl0sbz10WzNdO3JldHVybiBlWzBdPW5bMF0qcituWzRdKmkrbls4XSphK25bMTJdKm8sZVsxXT1uWzFdKnIrbls1XSppK25bOV0qYStuWzEzXSpvLGVbMl09blsyXSpyK25bNl0qaStuWzEwXSphK25bMTRdKm8sZVszXT1uWzNdKnIrbls3XSppK25bMTFdKmErblsxNV0qbyxlfXZhciBQZT1BZTsoZnVuY3Rpb24oKXt2YXIgZT1PZSgpO3JldHVybiBmdW5jdGlvbih0LG4scixpLGEsbyl7dmFyIHMsYztmb3Iobnx8PTQscnx8PTAsYz1pP01hdGgubWluKGkqbityLHQubGVuZ3RoKTp0Lmxlbmd0aCxzPXI7czxjO3MrPW4pZVswXT10W3NdLGVbMV09dFtzKzFdLGVbMl09dFtzKzJdLGVbM109dFtzKzNdLGEoZSxlLG8pLHRbc109ZVswXSx0W3MrMV09ZVsxXSx0W3MrMl09ZVsyXSx0W3MrM109ZVszXTtyZXR1cm4gdH19KSgpO2Z1bmN0aW9uIEZlKCl7dmFyIGU9bmV3IGgoNCk7cmV0dXJuIGghPUZsb2F0MzJBcnJheSYmKGVbMF09MCxlWzFdPTAsZVsyXT0wKSxlWzNdPTEsZX1mdW5jdGlvbiBJZShlLHQsbil7bio9LjU7dmFyIHI9TWF0aC5zaW4obik7cmV0dXJuIGVbMF09cip0WzBdLGVbMV09cip0WzFdLGVbMl09cip0WzJdLGVbM109TWF0aC5jb3MobiksZX1mdW5jdGlvbiBMZShlLHQsbil7dmFyIHI9dFswXSxpPXRbMV0sYT10WzJdLG89dFszXSxzPW5bMF0sYz1uWzFdLGw9blsyXSx1PW5bM107cmV0dXJuIGVbMF09cip1K28qcytpKmwtYSpjLGVbMV09aSp1K28qYythKnMtcipsLGVbMl09YSp1K28qbCtyKmMtaSpzLGVbM109byp1LXIqcy1pKmMtYSpsLGV9ZnVuY3Rpb24gUmUoZSx0LG4scil7dmFyIGk9dFswXSxhPXRbMV0sbz10WzJdLHM9dFszXSxjPW5bMF0sbD1uWzFdLHU9blsyXSxkPW5bM10sZixwPWkqYythKmwrbyp1K3MqZCxtLGgsZztyZXR1cm4gcDwwJiYocD0tcCxjPS1jLGw9LWwsdT0tdSxkPS1kKSwxLXA+MWUtNj8oZj1NYXRoLmFjb3MocCksbT1NYXRoLnNpbihmKSxoPU1hdGguc2luKCgxLXIpKmYpL20sZz1NYXRoLnNpbihyKmYpL20pOihoPTEtcixnPXIpLGVbMF09aCppK2cqYyxlWzFdPWgqYStnKmwsZVsyXT1oKm8rZyp1LGVbM109aCpzK2cqZCxlfWZ1bmN0aW9uIHplKGUsdCl7dmFyIG49dFswXSt0WzRdK3RbOF0scjtpZihuPjApcj1NYXRoLnNxcnQobisxKSxlWzNdPS41KnIscj0uNS9yLGVbMF09KHRbNV0tdFs3XSkqcixlWzFdPSh0WzZdLXRbMl0pKnIsZVsyXT0odFsxXS10WzNdKSpyO2Vsc2V7dmFyIGk9MDt0WzRdPnRbMF0mJihpPTEpLHRbOF0+dFtpKjMraV0mJihpPTIpO3ZhciBhPShpKzEpJTMsbz0oaSsyKSUzO3I9TWF0aC5zcXJ0KHRbaSozK2ldLXRbYSozK2FdLXRbbyozK29dKzEpLGVbaV09LjUqcixyPS41L3IsZVszXT0odFthKjMrb10tdFtvKjMrYV0pKnIsZVthXT0odFthKjMraV0rdFtpKjMrYV0pKnIsZVtvXT0odFtvKjMraV0rdFtpKjMrb10pKnJ9cmV0dXJuIGV9ZnVuY3Rpb24gQmUoZSx0LG4scil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOmB6eXhgLGE9TWF0aC5QSS8zNjA7dCo9YSxyKj1hLG4qPWE7dmFyIG89TWF0aC5zaW4odCkscz1NYXRoLmNvcyh0KSxjPU1hdGguc2luKG4pLGw9TWF0aC5jb3MobiksdT1NYXRoLnNpbihyKSxkPU1hdGguY29zKHIpO3N3aXRjaChpKXtjYXNlYHh5emA6ZVswXT1vKmwqZCtzKmMqdSxlWzFdPXMqYypkLW8qbCp1LGVbMl09cypsKnUrbypjKmQsZVszXT1zKmwqZC1vKmMqdTticmVhaztjYXNlYHh6eWA6ZVswXT1vKmwqZC1zKmMqdSxlWzFdPXMqYypkLW8qbCp1LGVbMl09cypsKnUrbypjKmQsZVszXT1zKmwqZCtvKmMqdTticmVhaztjYXNlYHl4emA6ZVswXT1vKmwqZCtzKmMqdSxlWzFdPXMqYypkLW8qbCp1LGVbMl09cypsKnUtbypjKmQsZVszXT1zKmwqZCtvKmMqdTticmVhaztjYXNlYHl6eGA6ZVswXT1vKmwqZCtzKmMqdSxlWzFdPXMqYypkK28qbCp1LGVbMl09cypsKnUtbypjKmQsZVszXT1zKmwqZC1vKmMqdTticmVhaztjYXNlYHp4eWA6ZVswXT1vKmwqZC1zKmMqdSxlWzFdPXMqYypkK28qbCp1LGVbMl09cypsKnUrbypjKmQsZVszXT1zKmwqZC1vKmMqdTticmVhaztjYXNlYHp5eGA6ZVswXT1vKmwqZC1zKmMqdSxlWzFdPXMqYypkK28qbCp1LGVbMl09cypsKnUtbypjKmQsZVszXT1zKmwqZCtvKmMqdTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKGBVbmtub3duIGFuZ2xlIG9yZGVyIGAraSl9cmV0dXJuIGV9dmFyIFZlPWtlLEhlPU1lOyhmdW5jdGlvbigpe3ZhciBlPXNlKCksdD11ZSgxLDAsMCksbj11ZSgwLDEsMCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSxhKXt2YXIgbz1fZShpLGEpO3JldHVybiBvPC0uOTk5OTk5Pyh2ZShlLHQsaSksRGUoZSk8MWUtNiYmdmUoZSxuLGkpLGdlKGUsZSksSWUocixlLE1hdGguUEkpLHIpOm8+Ljk5OTk5OT8oclswXT0wLHJbMV09MCxyWzJdPTAsclszXT0xLHIpOih2ZShlLGksYSksclswXT1lWzBdLHJbMV09ZVsxXSxyWzJdPWVbMl0sclszXT0xK28sSGUocixyKSl9fSkoKSxmdW5jdGlvbigpe3ZhciBlPUZlKCksdD1GZSgpO3JldHVybiBmdW5jdGlvbihuLHIsaSxhLG8scyl7cmV0dXJuIFJlKGUscixvLHMpLFJlKHQsaSxhLHMpLFJlKG4sZSx0LDIqcyooMS1zKSksbn19KCksZnVuY3Rpb24oKXt2YXIgZT1nKCk7cmV0dXJuIGZ1bmN0aW9uKHQsbixyLGkpe3JldHVybiBlWzBdPXJbMF0sZVszXT1yWzFdLGVbNl09clsyXSxlWzFdPWlbMF0sZVs0XT1pWzFdLGVbN109aVsyXSxlWzJdPS1uWzBdLGVbNV09LW5bMV0sZVs4XT0tblsyXSxIZSh0LHplKHQsZSkpfX0oKTtmdW5jdGlvbiBVZSgpe3ZhciBlPW5ldyBoKDIpO3JldHVybiBoIT1GbG9hdDMyQXJyYXkmJihlWzBdPTAsZVsxXT0wKSxlfWZ1bmN0aW9uIFdlKGUsdCl7dmFyIG49bmV3IGgoMik7cmV0dXJuIG5bMF09ZSxuWzFdPXQsbn1mdW5jdGlvbiBHZShlLHQsbil7cmV0dXJuIGVbMF09dFswXSpuLGVbMV09dFsxXSpuLGV9ZnVuY3Rpb24gS2UoZSl7dmFyIHQ9ZVswXSxuPWVbMV07cmV0dXJuIE1hdGguc3FydCh0KnQrbipuKX1mdW5jdGlvbiBxZShlKXt2YXIgdD1lWzBdLG49ZVsxXTtyZXR1cm4gdCp0K24qbn1mdW5jdGlvbiBKZShlLHQpe3JldHVybiBlWzBdKnRbMF0rZVsxXSp0WzFdfWZ1bmN0aW9uIFllKGUpe3JldHVybiBlWzBdPTAsZVsxXT0wLGV9dmFyIFhlPXFlOyhmdW5jdGlvbigpe3ZhciBlPVVlKCk7cmV0dXJuIGZ1bmN0aW9uKHQsbixyLGksYSxvKXt2YXIgcyxjO2ZvcihufHw9MixyfHw9MCxjPWk/TWF0aC5taW4oaSpuK3IsdC5sZW5ndGgpOnQubGVuZ3RoLHM9cjtzPGM7cys9billWzBdPXRbc10sZVsxXT10W3MrMV0sYShlLGUsbyksdFtzXT1lWzBdLHRbcysxXT1lWzFdO3JldHVybiB0fX0pKCk7Y29uc3Qgaj04MTkyO2Z1bmN0aW9uIFplKGUsdCxuKXtyZXR1cm4gdCooai8oZS50aWxlU2l6ZSoyKioobi1lLnRpbGVJRC5vdmVyc2NhbGVkWikpKX1jb25zdCBRZT1gX18kanNvbl9fOmA7ZnVuY3Rpb24gJGUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvcj9lOkVycm9yKHR5cGVvZiBlPT1gc3RyaW5nYD9lOlN0cmluZyhlKSl9ZnVuY3Rpb24gZXQoKXtyZXR1cm4gbmV3IEZsb2F0NjRBcnJheSg0KX1mdW5jdGlvbiB0dCgpe3JldHVybiBuZXcgRmxvYXQ2NEFycmF5KDMpfWZ1bmN0aW9uIG50KCl7cmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkoMTYpfWZ1bmN0aW9uIHJ0KCl7bGV0IGU9bmV3IEZsb2F0NjRBcnJheSgxNik7cmV0dXJuIEMoZSksZX1mdW5jdGlvbiBpdCgpe2xldCBlPW5ldyBGbG9hdDMyQXJyYXkoMTYpO3JldHVybiBDKGUpLGV9ZnVuY3Rpb24gYXQoZSx0LG4scixpPSExKXtpZighblswXSYmIW5bMV0pcmV0dXJuWzAsMF07bGV0IGE9aT9yPT09YG1hcGA/LWUuYmVhcmluZ0luUmFkaWFuczowOnI9PT1gdmlld3BvcnRgP2UuYmVhcmluZ0luUmFkaWFuczowO2lmKGEpe2xldCBlPU1hdGguc2luKGEpLHQ9TWF0aC5jb3MoYSk7bj1bblswXSp0LW5bMV0qZSxuWzBdKmUrblsxXSp0XX1yZXR1cm5baT9uWzBdOlplKHQsblswXSxlLnpvb20pLGk/blsxXTpaZSh0LG5bMV0sZS56b29tKV19ZnVuY3Rpb24gb3QoZSx0KXtyZXR1cm4gZVswXSp0WzBdK2VbMV0qdFsxXStlWzJdKnRbMl0rZVszXX1mdW5jdGlvbiBzdChlLHQsbil7bGV0IHI9XyhbZVswXSxlWzFdLGVbMl0sdFswXSx0WzFdLHRbMl0sblswXSxuWzFdLG5bMl1dKTtpZihyPT09MClyZXR1cm4gbnVsbDtsZXQgaT12ZShbXSxbdFswXSx0WzFdLHRbMl1dLFtuWzBdLG5bMV0sblsyXV0pLGE9dmUoW10sW25bMF0sblsxXSxuWzJdXSxbZVswXSxlWzFdLGVbMl1dKSxvPXZlKFtdLFtlWzBdLGVbMV0sZVsyXV0sW3RbMF0sdFsxXSx0WzJdXSkscz1wZShbXSxpLC1lWzNdKTtyZXR1cm4gZGUocyxzLHBlKFtdLGEsLXRbM10pKSxkZShzLHMscGUoW10sbywtblszXSkpLHBlKHMscywxL3IpLHN9ZnVuY3Rpb24gY3QoZSx0LG4pe2xldCByPWVbMF0qblswXStlWzFdKm5bMV0rZVsyXSpuWzJdLGk9dFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl07cmV0dXJuIGk9PT0wP251bGw6KC1yLW5bM10pL2l9ZnVuY3Rpb24gbHQoZSx0LG4scil7bGV0IGk9TWF0aC5zcXJ0KGUqZSt0KnQpLGE9TWF0aC5zcXJ0KG4qbityKnIpO2UvPWksdC89aSxuLz1hLHIvPWE7bGV0IG89ZSpuK3QqcixzPU1hdGguYWNvcyhvKTtyZXR1cm4tdCpuK2Uqcj4wP3M6LXN9ZnVuY3Rpb24gdXQoZSx0KXtsZXQgbj1mdChlLDM2MCkscj1mdCh0LDM2MCksaT1yLW4sYT1yPm4/aS0zNjA6aSszNjA7cmV0dXJuIE1hdGguYWJzKGkpPE1hdGguYWJzKGEpP2k6YX1mdW5jdGlvbiBkdChlLHQpe2xldCBuPWZ0KGUsTWF0aC5QSSoyKSxyPWZ0KHQsTWF0aC5QSSoyKTtyZXR1cm4gTWF0aC5taW4oTWF0aC5hYnMobi1yKSxNYXRoLmFicyhuLXIrTWF0aC5QSSoyKSxNYXRoLmFicyhuLXItTWF0aC5QSSoyKSl9ZnVuY3Rpb24gZnQoZSx0KXtyZXR1cm4oZSV0K3QpJXR9ZnVuY3Rpb24gcHQoZSx0LG4scixpKXtyZXR1cm4gbXQocixpLGJ0KChlLXQpLyhuLXQpLDAsMSkpfWZ1bmN0aW9uIG10KGUsdCxuKXtyZXR1cm4gZSooMS1uKSt0Km59ZnVuY3Rpb24gaHQoZSl7bGV0IHQ9MS8wLG49MS8wLHI9LTEvMCxpPS0xLzA7Zm9yKGxldCBhIG9mIGUpdD1NYXRoLm1pbih0LGEueCksbj1NYXRoLm1pbihuLGEueSkscj1NYXRoLm1heChyLGEueCksaT1NYXRoLm1heChpLGEueSk7cmV0dXJuW3QsbixyLGldfWZ1bmN0aW9uIGd0KGUpe2lmKCFlLmxlbmd0aClyZXR1cm4gbmV3IFNldDtsZXQgdD1NYXRoLm1heCguLi5lLm1hcChlPT5lLmNhbm9uaWNhbC56KSksbj0xLzAscj0tMS8wLGk9MS8wLGE9LTEvMCxvPVtdO2ZvcihsZXQgcyBvZiBlKXtsZXR7eDplLHk6Yyx6Omx9PXMuY2Fub25pY2FsLHU9MioqKHQtbCksZD1lKnUsZj1jKnU7by5wdXNoKHtpZDpzLHg6ZCx5OmZ9KSxkPG4mJihuPWQpLGQ+ciYmKHI9ZCksZjxpJiYoaT1mKSxmPmEmJihhPWYpfWxldCBzPW5ldyBTZXQ7Zm9yKGxldCBlIG9mIG8pKGUueD09PW58fGUueD09PXJ8fGUueT09PWl8fGUueT09PWEpJiZzLmFkZChlLmlkKTtyZXR1cm4gc31mdW5jdGlvbiBfdChlKXtpZihlPD0wKXJldHVybiAwO2lmKGU+PTEpcmV0dXJuIDE7bGV0IHQ9ZSplLG49dCplO3JldHVybiA0KihlPC41P246MyooZS10KStuLS43NSl9ZnVuY3Rpb24gdnQoZSx0LG4scil7cmV0dXJuIHUoZSx0LG4scil9Y29uc3QgeXQ9dnQoLjI1LC4xLC4yNSwxKTtmdW5jdGlvbiBidChlLHQsbil7cmV0dXJuIE1hdGgubWluKG4sTWF0aC5tYXgodCxlKSl9ZnVuY3Rpb24geHQoZSx0LG4pe2xldCByPW4tdCxpPSgoZS10KSVyK3IpJXIrdDtyZXR1cm4gaT09PXQ/bjppfWZ1bmN0aW9uIFN0KGUsLi4udCl7Zm9yKGxldCBuIG9mIHQpZm9yKGxldCB0IGluIG4pZVt0XT1uW3RdO3JldHVybiBlfWZ1bmN0aW9uIEN0KGUsdCl7bGV0IG49e307Zm9yKGxldCByIG9mIHQpciBpbiBlJiYobltyXT1lW3JdKTtyZXR1cm4gbn1sZXQgd3Q9MTtmdW5jdGlvbiBUdCgpe3JldHVybiB3dCsrfWZ1bmN0aW9uIEV0KGUpe3JldHVybiBNYXRoLmxvZyhlKS9NYXRoLkxOMiUxPT0wfWZ1bmN0aW9uIER0KGUpe3JldHVybiBlPD0xPzE6MioqTWF0aC5jZWlsKE1hdGgubG9nKGUpL01hdGguTE4yKX1mdW5jdGlvbiBPdChlKXtyZXR1cm4gMioqZX1mdW5jdGlvbiBrdChlKXtyZXR1cm4gTWF0aC5sb2coZSkvTWF0aC5MTjJ9ZnVuY3Rpb24gQXQoZSx0LG4pe2lmKHQ8PTApcmV0dXJuIGU7bGV0IHI9MS90O3JldHVybiBuPT09dm9pZCAwfHxNYXRoLmFicyhuKTwxZS0xMD9NYXRoLnJvdW5kKGUqcikvcjoobj4wP01hdGguY2VpbChlKnItMWUtOSk6TWF0aC5mbG9vcihlKnIrMWUtMTApKS9yfWZ1bmN0aW9uIGp0KGUsdCxuKXtsZXQgcj17fTtmb3IobGV0IGkgaW4gZSlyW2ldPXQuY2FsbChufHx0aGlzLGVbaV0saSxlKTtyZXR1cm4gcn1mdW5jdGlvbiBNdChlLHQsbil7bGV0IHI9e307Zm9yKGxldCBpIGluIGUpdC5jYWxsKG58fHRoaXMsZVtpXSxpLGUpJiYocltpXT1lW2ldKTtyZXR1cm4gcn1mdW5jdGlvbiBOdChlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkpe2lmKCFBcnJheS5pc0FycmF5KHQpfHxlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWlmKCFOdChlW25dLHRbbl0pKXJldHVybiExO3JldHVybiEwfWlmKHR5cGVvZiBlPT1gb2JqZWN0YCYmZSYmdCE9PW51bGwpe2lmKHR5cGVvZiB0IT1gb2JqZWN0YHx8T2JqZWN0LmtleXMoZSkubGVuZ3RoIT09T2JqZWN0LmtleXModCkubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgbiBpbiBlKWlmKCFOdChlW25dLHRbbl0pKXJldHVybiExO3JldHVybiEwfXJldHVybiBlPT09dH1mdW5jdGlvbiBQdChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLm1hcChQdCk6dHlwZW9mIGU9PWBvYmplY3RgJiZlP2p0KGUsUHQpOmV9Y29uc3QgRnQ9e307ZnVuY3Rpb24gSXQoZSl7RnRbZV18fCh0eXBlb2YgY29uc29sZTxgdWAmJmNvbnNvbGUud2FybihlKSxGdFtlXT0hMCl9ZnVuY3Rpb24gTHQoZSx0LG4pe3JldHVybihuLnktZS55KSoodC54LWUueCk+KHQueS1lLnkpKihuLngtZS54KX1mdW5jdGlvbiBSdChlLHQsbixyKXtsZXQgaT10LnktZS55LGE9dC54LWUueCxvPXIueS1uLnkscz1yLngtbi54LGM9byphLXMqaTtpZihjPT09MClyZXR1cm4gbnVsbDtsZXQgdT1lLnktbi55LGQ9ZS54LW4ueCxmPShzKnUtbypkKS9jO3JldHVybiBuZXcgbChlLngrZiphLGUueStmKmkpfWZ1bmN0aW9uIHp0KFtlLHQsbl0pe3JldHVybiB0Kz05MCx0Kj1NYXRoLlBJLzE4MCxuKj1NYXRoLlBJLzE4MCxbZSpNYXRoLmNvcyh0KSpNYXRoLnNpbihuKSxlKk1hdGguc2luKHQpKk1hdGguc2luKG4pLGUqTWF0aC5jb3MobildfWZ1bmN0aW9uIEJ0KGUpe3JldHVybiB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGU8YHVgJiZlIT09dm9pZCAwJiZlIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGV9ZnVuY3Rpb24gVnQoZSl7bGV0IHQ9Lyg/Ol58KD86XHMqXCxccyopKShbXlx4MDAtXHgyMFwoXCk8PkBcLDtcOlxcIlwvXFtcXVw/XD1ce1x9XHg3Rl0rKSg/Olw9KD86KFteXHgwMC1ceDIwXChcKTw+QFwsO1w6XFwiXC9cW1xdXD9cPVx7XH1ceDdGXSspfCg/OlwiKCg/OlteIlxcXXxcXC4pKilcIikpKT8vZyxuPXt9O2lmKGUucmVwbGFjZSh0LChlLHQscixpKT0+e2xldCBhPXJ8fGk7cmV0dXJuIG5bdF09IWF8fGEudG9Mb3dlckNhc2UoKSxgYH0pLG5bYG1heC1hZ2VgXSl7bGV0IGU9cGFyc2VJbnQobltgbWF4LWFnZWBdLDEwKTtpc05hTihlKT9kZWxldGUgbltgbWF4LWFnZWBdOm5bYG1heC1hZ2VgXT1lfXJldHVybiBufWxldCBIdD1udWxsO2Z1bmN0aW9uIFV0KGUpe2lmKEh0PT1udWxsKXtsZXQgdD1lLm5hdmlnYXRvcj9lLm5hdmlnYXRvci51c2VyQWdlbnQ6bnVsbDtIdD0hIWUuc2FmYXJpfHwhISh0JiYoL1xiKGlQYWR8aVBob25lfGlQb2QpXGIvLnRlc3QodCl8fHQubWF0Y2goYFNhZmFyaWApJiYhdC5tYXRjaChgQ2hyb21lYCkpKX1yZXR1cm4gSHR9ZnVuY3Rpb24gV3QoZSl7cmV0dXJuIHR5cGVvZiBJbWFnZUJpdG1hcDxgdWAmJmUgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcH1jb25zdCBHdD1hc3luYyhlLHQpPT57aWYoZS5ieXRlTGVuZ3RoPT09MClyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAobmV3IEltYWdlRGF0YSgxLDEpLHQpO2xldCBuPW5ldyBCbG9iKFtuZXcgVWludDhBcnJheShlKV0se3R5cGU6YGltYWdlL3BuZ2B9KTt0cnl7cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKG4sdCl9Y2F0Y2goZSl7dGhyb3cgRXJyb3IoYENvdWxkIG5vdCBsb2FkIGltYWdlIGJlY2F1c2Ugb2YgJHskZShlKS5tZXNzYWdlfS4gUGxlYXNlIG1ha2Ugc3VyZSB0byB1c2UgYSBzdXBwb3J0ZWQgaW1hZ2UgdHlwZSBzdWNoIGFzIFBORyBvciBKUEVHLiBOb3RlIHRoYXQgU1ZHcyBhcmUgbm90IHN1cHBvcnRlZC5gKX19LEt0PWBkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQUJDQVlBQUFBZkZjU0pBQUFBQzBsRVFWUVlWMk5nQUFJQUFBVUFBYXJWeUZFQUFBQUFTVVZPUks1Q1lJST1gLHF0PWU9Pm5ldyBQcm9taXNlKCh0LG4pPT57bGV0IHI9bmV3IEltYWdlO3Iub25sb2FkPSgpPT57dChyKSxVUkwucmV2b2tlT2JqZWN0VVJMKHIuc3JjKSxyLm9ubG9hZD1udWxsLHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnIuc3JjPUt0KX0sci5vbmVycm9yPSgpPT5uKEVycm9yKGBDb3VsZCBub3QgbG9hZCBpbWFnZS4gUGxlYXNlIG1ha2Ugc3VyZSB0byB1c2UgYSBzdXBwb3J0ZWQgaW1hZ2UgdHlwZSBzdWNoIGFzIFBORyBvciBKUEVHLiBOb3RlIHRoYXQgU1ZHcyBhcmUgbm90IHN1cHBvcnRlZC5gKSk7bGV0IGk9bmV3IEJsb2IoW25ldyBVaW50OEFycmF5KGUpXSx7dHlwZTpgaW1hZ2UvcG5nYH0pO3Iuc3JjPWUuYnl0ZUxlbmd0aD9VUkwuY3JlYXRlT2JqZWN0VVJMKGkpOkt0fSk7ZnVuY3Rpb24gSnQoZSx0LG4scixpKXtsZXQgYT1NYXRoLm1heCgtdCwwKSo0LG89KE1hdGgubWF4KDAsbiktbikqcio0K2Escz1yKjQsYz1NYXRoLm1heCgwLHQpLGw9TWF0aC5tYXgoMCxuKSx1PU1hdGgubWluKGUud2lkdGgsdCtyKSxkPU1hdGgubWluKGUuaGVpZ2h0LG4raSk7cmV0dXJue3JlY3Q6e3g6Yyx5Omwsd2lkdGg6dS1jLGhlaWdodDpkLWx9LGxheW91dDpbe29mZnNldDpvLHN0cmlkZTpzfV19fWFzeW5jIGZ1bmN0aW9uIFl0KGUsdCxuLHIsaSl7aWYodHlwZW9mIFZpZGVvRnJhbWU+YHVgKXRocm93IEVycm9yKGBWaWRlb0ZyYW1lIG5vdCBzdXBwb3J0ZWRgKTtsZXQgYT1uZXcgVmlkZW9GcmFtZShlLHt0aW1lc3RhbXA6MH0pO3RyeXtsZXQgbz1hPy5mb3JtYXQ7aWYoIW98fCEoby5zdGFydHNXaXRoKGBCR1JgKXx8by5zdGFydHNXaXRoKGBSR0JgKSkpdGhyb3cgRXJyb3IoYFVucmVjb2duaXplZCBmb3JtYXQgJHtvfWApO2xldCBzPW8uc3RhcnRzV2l0aChgQkdSYCksYz1uZXcgVWludDhDbGFtcGVkQXJyYXkocippKjQpO2lmKGF3YWl0IGEuY29weVRvKGMsSnQoZSx0LG4scixpKSkscylmb3IobGV0IGU9MDtlPGMubGVuZ3RoO2UrPTQpe2xldCB0PWNbZV07Y1tlXT1jW2UrMl0sY1tlKzJdPXR9cmV0dXJuIGN9ZmluYWxseXthLmNsb3NlKCl9fWxldCBYdCxadDtmdW5jdGlvbiBRdChlLHQsbixyLGkpe2xldCBhPWUud2lkdGgsbz1lLmhlaWdodDsoIVh0fHwhWnQpJiYoWHQ9bmV3IE9mZnNjcmVlbkNhbnZhcyhhLG8pLFp0PVh0LmdldENvbnRleHQoYDJkYCx7d2lsbFJlYWRGcmVxdWVudGx5OiEwfSkpLFh0LndpZHRoPWEsWHQuaGVpZ2h0PW8sWnQuZHJhd0ltYWdlKGUsMCwwLGEsbyk7bGV0IHM9WnQuZ2V0SW1hZ2VEYXRhKHQsbixyLGkpO3JldHVybiBadC5jbGVhclJlY3QoMCwwLGEsbykscy5kYXRhfWFzeW5jIGZ1bmN0aW9uICR0KGUsdCxuLHIsaSl7aWYobSgpKXRyeXtyZXR1cm4gYXdhaXQgWXQoZSx0LG4scixpKX1jYXRjaHt9cmV0dXJuIFF0KGUsdCxuLHIsaSl9ZnVuY3Rpb24gZW4oZSx0LG4scil7cmV0dXJuIGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4scikse3Vuc3Vic2NyaWJlOigpPT57ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbixyKX19fWZ1bmN0aW9uIHRuKGUpe3JldHVybiBlKk1hdGguUEkvMTgwfWZ1bmN0aW9uIG5uKGUpe3JldHVybiBlL01hdGguUEkqMTgwfWZ1bmN0aW9uIHJuKGUsdCl7cmV0dXJuIGUucm9sbD09dC5yb2xsJiZlLnBpdGNoPT10LnBpdGNoJiZlLmJlYXJpbmc9PXQuYmVhcmluZ31mdW5jdGlvbiBhbihlKXtsZXQgdD1uZXcgRmxvYXQ2NEFycmF5KDkpO3kodCxlKTtsZXQgbj1ubigtTWF0aC5hc2luKGJ0KHRbMl0sLTEsMSkpKSxyLGk7cmV0dXJuIE1hdGguaHlwb3QodFs1XSx0WzhdKTwuMDAxPyhyPTAsaT0tbm4oTWF0aC5hdGFuMih0WzNdLHRbNF0pKSk6KHI9bm4odFs1XT09PTAmJnRbOF09PT0wPzA6TWF0aC5hdGFuMih0WzVdLHRbOF0pKSxpPW5uKHRbMV09PT0wJiZ0WzBdPT09MD8wOk1hdGguYXRhbjIodFsxXSx0WzBdKSkpLHtyb2xsOnIscGl0Y2g6bis5MCxiZWFyaW5nOml9fWZ1bmN0aW9uIG9uKGUsdCxuKXtsZXQgcj1XZSh0Lngtbi54LHQueS1uLnkpLGk9V2UoZS54LW4ueCxlLnktbi55KSxhPXJbMF0qaVsxXS1yWzFdKmlbMF07cmV0dXJuIG5uKE1hdGguYXRhbjIoYSxKZShyLGkpKSl9ZnVuY3Rpb24gc24oZSx0LG4pe2xldCByPW5ldyBGbG9hdDY0QXJyYXkoNCk7cmV0dXJuIEJlKHIsZSx0LTkwLG4pLHJ9Y29uc3QgY249ODUuMDUxMTI5LGxuPXt0b3VjaHN0YXJ0OiEwLHRvdWNobW92ZTohMCx0b3VjaG1vdmVXaW5kb3c6ITAsdG91Y2hlbmQ6ITAsdG91Y2hjYW5jZWw6ITB9LHVuPXtkYmxjbGljazohMCxjbGljazohMCxtb3VzZW92ZXI6ITAsbW91c2VvdXQ6ITAsbW91c2Vkb3duOiEwLG1vdXNlbW92ZTohMCxtb3VzZW1vdmVXaW5kb3c6ITAsbW91c2V1cDohMCxtb3VzZXVwV2luZG93OiEwLGNvbnRleHRtZW51OiEwLHdoZWVsOiEwfTtmdW5jdGlvbiBkbihlLHQpe3JldHVybiBsblt0XSYmYHRvdWNoZXNgaW4gZX1mdW5jdGlvbiBmbihlLHQpe2lmKCF1blt0XSlyZXR1cm4hMTtsZXQgbj1lLHI9KG4/LnRhcmdldCk/Lm93bmVyRG9jdW1lbnQ/LmRlZmF1bHRWaWV3fHx3aW5kb3c7cmV0dXJuIG4gaW5zdGFuY2VvZiByLk1vdXNlRXZlbnR8fG4gaW5zdGFuY2VvZiByLldoZWVsRXZlbnR9ZnVuY3Rpb24gcG4oZSl7cmV0dXJuIGxuW2VdfHx1bltlXX1jb25zdCBtbj1gQWJvcnRFcnJvcmA7dmFyIGhuPWNsYXNzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZT1tbil7c3VwZXIoZSBpbnN0YW5jZW9mIEVycm9yP2UubWVzc2FnZTplKSx0aGlzLm5hbWU9bW4sZSBpbnN0YW5jZW9mIEVycm9yJiZlLnN0YWNrJiYodGhpcy5zdGFjaz1lLnN0YWNrKX19O2Z1bmN0aW9uIGduKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRXJyb3ImJmUubmFtZT09PWBBYm9ydEVycm9yYH1mdW5jdGlvbiBfbihlKXtpZihlLmFib3J0ZWQpdGhyb3cgbmV3IGhuKGUucmVhc29uKX1jb25zdCB2bj17TUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTOjE2LE1BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUU19QRVJfRlJBTUU6OCxNQVhfVElMRV9DQUNIRV9aT09NX0xFVkVMUzo1LFJFR0lTVEVSRURfUFJPVE9DT0xTOnt9LFdPUktFUl9VUkw6YGB9O2Z1bmN0aW9uIHluKGUpe3JldHVybiB2bi5SRUdJU1RFUkVEX1BST1RPQ09MU1tlLnN1YnN0cmluZygwLGUuaW5kZXhPZihgOi8vYCkpXX1mdW5jdGlvbiBibihlLHQpe3ZuLlJFR0lTVEVSRURfUFJPVE9DT0xTW2VdPXR9ZnVuY3Rpb24geG4oZSl7ZGVsZXRlIHZuLlJFR0lTVEVSRURfUFJPVE9DT0xTW2VdfWNvbnN0IFNuPWBnbG9iYWwtZGlzcGF0Y2hlcmA7dmFyIENuPWNsYXNzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LG4scil7c3VwZXIoYEFKQVhFcnJvcjogJHt0fSAoJHtlfSk6ICR7bn1gKSx0aGlzLnN0YXR1cz1lLHRoaXMuc3RhdHVzVGV4dD10LHRoaXMudXJsPW4sdGhpcy5ib2R5PXJ9fTtmdW5jdGlvbiB3bigpe2lmKEJ0KHNlbGYpKXJldHVybiBzZWxmLndvcmtlcj8ucmVmZXJyZXI7aWYod2luZG93LmxvY2F0aW9uLnByb3RvY29sPT09YGJsb2I6YCl0cnl7cmV0dXJuIHdpbmRvdy5wYXJlbnQubG9jYXRpb24uaHJlZn1jYXRjaHt9cmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmfWNvbnN0IFRuPWU9PmUuc3RhcnRzV2l0aChgZmlsZTpgKXx8d24oKT8uc3RhcnRzV2l0aChgZmlsZTpgKSYmIS9eXHcrOi8udGVzdChlKTthc3luYyBmdW5jdGlvbiBFbihlLHQpe2xldCBuPW5ldyBSZXF1ZXN0KGUudXJsLHttZXRob2Q6ZS5tZXRob2R8fGBHRVRgLGJvZHk6ZS5ib2R5LGNyZWRlbnRpYWxzOmUuY3JlZGVudGlhbHMsaGVhZGVyczplLmhlYWRlcnMsY2FjaGU6ZS5jYWNoZSxyZWZlcnJlcjp3bigpLHJlZmVycmVyUG9saWN5OmUucmVmZXJyZXJQb2xpY3ksc2lnbmFsOnQuc2lnbmFsfSk7ZS50eXBlPT09YGpzb25gJiYhbi5oZWFkZXJzLmhhcyhgQWNjZXB0YCkmJm4uaGVhZGVycy5zZXQoYEFjY2VwdGAsYGFwcGxpY2F0aW9uL2pzb25gKTtsZXQgcjt0cnl7cj1hd2FpdCBmZXRjaChuKX1jYXRjaCh0KXt0aHJvdyBnbih0KT90Om5ldyBDbigwLCRlKHQpLm1lc3NhZ2UsZS51cmwsbmV3IEJsb2IpfWlmKCFyLm9rKXtsZXQgdD1hd2FpdCByLmJsb2IoKTt0aHJvdyBuZXcgQ24oci5zdGF0dXMsci5zdGF0dXNUZXh0LGUudXJsLHQpfWxldCBpO2k9ZS50eXBlPT09YGFycmF5QnVmZmVyYHx8ZS50eXBlPT09YGltYWdlYD9yLmFycmF5QnVmZmVyKCk6ZS50eXBlPT09YGpzb25gP3IuanNvbigpOnIudGV4dCgpO2xldCBhPWF3YWl0IGk7cmV0dXJuIF9uKHQuc2lnbmFsKSx7ZGF0YTphLGNhY2hlQ29udHJvbDpyLmhlYWRlcnMuZ2V0KGBDYWNoZS1Db250cm9sYCksZXhwaXJlczpyLmhlYWRlcnMuZ2V0KGBFeHBpcmVzYCksZXRhZzpyLmhlYWRlcnMuZ2V0KGBFVGFnYCl9fWZ1bmN0aW9uIERuKGUsdCl7cmV0dXJuIG5ldyBQcm9taXNlKChuLHIpPT57bGV0IGk9bmV3IFhNTEh0dHBSZXF1ZXN0O2kub3BlbihlLm1ldGhvZHx8YEdFVGAsZS51cmwsITApLChlLnR5cGU9PT1gYXJyYXlCdWZmZXJgfHxlLnR5cGU9PT1gaW1hZ2VgKSYmKGkucmVzcG9uc2VUeXBlPWBhcnJheWJ1ZmZlcmApO2ZvcihsZXQgdCBpbiBlLmhlYWRlcnMpaS5zZXRSZXF1ZXN0SGVhZGVyKHQsZS5oZWFkZXJzW3RdKTtlLnR5cGU9PT1ganNvbmAmJihpLnJlc3BvbnNlVHlwZT1gdGV4dGAsZS5oZWFkZXJzPy5BY2NlcHR8fGkuc2V0UmVxdWVzdEhlYWRlcihgQWNjZXB0YCxgYXBwbGljYXRpb24vanNvbmApKSxpLndpdGhDcmVkZW50aWFscz1lLmNyZWRlbnRpYWxzPT09YGluY2x1ZGVgLGkub25lcnJvcj0oKT0+e3IoRXJyb3IoaS5zdGF0dXNUZXh0KSl9LGkub25sb2FkPSgpPT57aWYoIXQuc2lnbmFsLmFib3J0ZWQpe2lmKChpLnN0YXR1cz49MjAwJiZpLnN0YXR1czwzMDB8fGkuc3RhdHVzPT09MCkmJmkucmVzcG9uc2UhPT1udWxsKXtsZXQgdD1pLnJlc3BvbnNlO2lmKGUudHlwZT09PWBqc29uYCl0cnl7dD1KU09OLnBhcnNlKGkucmVzcG9uc2UpfWNhdGNoKGUpe3IoZSk7cmV0dXJufW4oe2RhdGE6dCxjYWNoZUNvbnRyb2w6aS5nZXRSZXNwb25zZUhlYWRlcihgQ2FjaGUtQ29udHJvbGApLGV4cGlyZXM6aS5nZXRSZXNwb25zZUhlYWRlcihgRXhwaXJlc2ApLGV0YWc6aS5nZXRSZXNwb25zZUhlYWRlcihgRVRhZ2ApfSl9ZWxzZXtsZXQgdD1uZXcgQmxvYihbaS5yZXNwb25zZV0se3R5cGU6aS5nZXRSZXNwb25zZUhlYWRlcihgQ29udGVudC1UeXBlYCl9KTtyKG5ldyBDbihpLnN0YXR1cyxpLnN0YXR1c1RleHQsZS51cmwsdCkpfX19LHQuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoYGFib3J0YCwoKT0+e2kuYWJvcnQoKSxyKG5ldyBobih0LnNpZ25hbC5yZWFzb24pKX0pLGkuc2VuZChlLmJvZHkpfSl9Y29uc3QgT249YXN5bmMgZnVuY3Rpb24oZSx0KXtpZihlLnVybC5pbmNsdWRlcyhgOi8vYCkmJiEvXmh0dHBzPzp8XmZpbGU6Ly50ZXN0KGUudXJsKSl7bGV0IG49eW4oZS51cmwpO2lmKG4pe2xldCByPWF3YWl0IG4oZSx0KTtyZXR1cm4hci5kYXRhJiZlLnR5cGU9PT1gYXJyYXlCdWZmZXJgP1N0KHIse2RhdGE6bmV3IEFycmF5QnVmZmVyKDApfSk6cn1pZihCdChzZWxmKSYmc2VsZi53b3JrZXI/LmFjdG9yKXJldHVybiBzZWxmLndvcmtlci5hY3Rvci5zZW5kQXN5bmMoe3R5cGU6YEdSYCxkYXRhOmUsdGFyZ2V0TWFwSWQ6U259LHQpfWlmKCFUbihlLnVybCkpe2lmKGZldGNoJiZSZXF1ZXN0JiZBYm9ydENvbnRyb2xsZXImJk9iamVjdC5oYXNPd24oUmVxdWVzdC5wcm90b3R5cGUsYHNpZ25hbGApKXJldHVybiBFbihlLHQpO2lmKEJ0KHNlbGYpJiZzZWxmLndvcmtlcj8uYWN0b3IpcmV0dXJuIHNlbGYud29ya2VyLmFjdG9yLnNlbmRBc3luYyh7dHlwZTpgR1JgLGRhdGE6ZSxtdXN0UXVldWU6ITAsdGFyZ2V0TWFwSWQ6U259LHQpfXJldHVybiBEbihlLHQpfSxrbj0oZSx0KT0+T24oU3QoZSx7dHlwZTpganNvbmB9KSx0KSxBbj0oZSx0KT0+T24oU3QoZSx7dHlwZTpgYXJyYXlCdWZmZXJgfSksdCk7ZnVuY3Rpb24gam4oZSl7aWYoIWV8fGUuc3RhcnRzV2l0aChgZGF0YTppbWFnZS9gKSlyZXR1cm4hMDtpZihlLnN0YXJ0c1dpdGgoYGJsb2I6YCkmJihlPWUuc2xpY2UoNSksZS5zdGFydHNXaXRoKGBudWxsYCkpKXJldHVybiExO2lmKGUuaW5kZXhPZihgOi8vYCk8PTApcmV0dXJuITA7bGV0IHQ9bmV3IFVSTChlKSxuPXdpbmRvdy5sb2NhdGlvbjtyZXR1cm4gdC5wcm90b2NvbD09PW4ucHJvdG9jb2wmJnQuaG9zdD09PW4uaG9zdH1jb25zdCBNbj1lPT57bGV0IHQ9d2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYHZpZGVvYCk7cmV0dXJuIHQubXV0ZWQ9ITAsbmV3IFByb21pc2Uobj0+e3Qub25sb2Fkc3RhcnQ9KCk9PntuKHQpfTtmb3IobGV0IG4gb2YgZSl7bGV0IGU9d2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYHNvdXJjZWApO2puKG4pfHwodC5jcm9zc09yaWdpbj1gQW5vbnltb3VzYCksZS5zcmM9bix0LmFwcGVuZENoaWxkKGUpfX0pfTtmdW5jdGlvbiBObihlLHQsbil7bltlXT8uaW5jbHVkZXModCl8fChuW2VdfHw9W10sbltlXS5wdXNoKHQpKX1mdW5jdGlvbiBQbihlLHQsbil7aWYobj8uW2VdKXtsZXQgcj1uW2VdLmluZGV4T2YodCk7ciE9PS0xJiZuW2VdLnNwbGljZShyLDEpfX12YXIgRm49Y2xhc3N7Y29uc3RydWN0b3IoZSx0PXt9KXtTdCh0aGlzLHQpLHRoaXMudHlwZT1lfX0sSW49Y2xhc3MgZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlLHQ9e30pe3N1cGVyKGBlcnJvcmAsU3Qoe2Vycm9yOmV9LHQpKX19LExuPWNsYXNze29uKGUsdCl7cmV0dXJuIHRoaXMuX2xpc3RlbmVyc3x8PXt9LE5uKGUsdCx0aGlzLl9saXN0ZW5lcnMpLHt1bnN1YnNjcmliZTooKT0+e3RoaXMub2ZmKGUsdCl9fX1vZmYoZSx0KXtyZXR1cm4gUG4oZSx0LHRoaXMuX2xpc3RlbmVycyksUG4oZSx0LHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpLHRoaXN9b25jZShlLHQpe3JldHVybiB0Pyh0aGlzLl9vbmVUaW1lTGlzdGVuZXJzfHw9e30sTm4oZSx0LHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpLHRoaXMpOm5ldyBQcm9taXNlKHQ9PnRoaXMub25jZShlLHQpKX1maXJlKGUsdCl7bGV0IG49dHlwZW9mIGU9PWBzdHJpbmdgP25ldyBGbihlLHR8fHt9KTplLHI9bi50eXBlO2lmKHRoaXMubGlzdGVucyhyKSl7bi50YXJnZXQ9dGhpcztsZXQgZT10aGlzLl9saXN0ZW5lcnM/LltyXT8uc2xpY2UoKT8/W107Zm9yKGxldCB0IG9mIGUpdC5jYWxsKHRoaXMsbik7bGV0IHQ9dGhpcy5fb25lVGltZUxpc3RlbmVycz8uW3JdPy5zbGljZSgpPz9bXTtmb3IobGV0IGUgb2YgdClQbihyLGUsdGhpcy5fb25lVGltZUxpc3RlbmVycyksZS5jYWxsKHRoaXMsbik7bGV0IGk9dGhpcy5fZXZlbnRlZFBhcmVudDtpJiYoU3Qobix0eXBlb2YgdGhpcy5fZXZlbnRlZFBhcmVudERhdGE9PWBmdW5jdGlvbmA/dGhpcy5fZXZlbnRlZFBhcmVudERhdGEoKTp0aGlzLl9ldmVudGVkUGFyZW50RGF0YSksaS5maXJlKG4pKX1lbHNlIG4gaW5zdGFuY2VvZiBJbiYmY29uc29sZS5lcnJvcihuLmVycm9yKTtyZXR1cm4gdGhpc31saXN0ZW5zKGUpe3JldHVybiEhKHRoaXMuX2xpc3RlbmVycz8uW2VdPy5sZW5ndGh8fHRoaXMuX29uZVRpbWVMaXN0ZW5lcnM/LltlXT8ubGVuZ3RofHx0aGlzLl9ldmVudGVkUGFyZW50Py5saXN0ZW5zKGUpKX1zZXRFdmVudGVkUGFyZW50KGUsdCl7cmV0dXJuIHRoaXMuX2V2ZW50ZWRQYXJlbnQ9ZSx0aGlzLl9ldmVudGVkUGFyZW50RGF0YT10LHRoaXN9fSxSbj17JHZlcnNpb246OCwkcm9vdDp7dmVyc2lvbjp7cmVxdWlyZWQ6ITAsdHlwZTpgZW51bWAsdmFsdWVzOls4XX0sbmFtZTp7dHlwZTpgc3RyaW5nYH0sbWV0YWRhdGE6e3R5cGU6YCpgfSxjZW50ZXI6e3R5cGU6YGFycmF5YCx2YWx1ZTpgbnVtYmVyYCxsZW5ndGg6Mn0sY2VudGVyQWx0aXR1ZGU6e3R5cGU6YG51bWJlcmB9LHpvb206e3R5cGU6YG51bWJlcmB9LGJlYXJpbmc6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDowLHBlcmlvZDozNjAsdW5pdHM6YGRlZ3JlZXNgfSxwaXRjaDp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjAsdW5pdHM6YGRlZ3JlZXNgfSxyb2xsOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MCx1bml0czpgZGVncmVlc2B9LHN0YXRlOnt0eXBlOmBzdGF0ZWAsZGVmYXVsdDp7fX0sbGlnaHQ6e3R5cGU6YGxpZ2h0YH0sc2t5Ont0eXBlOmBza3lgfSxwcm9qZWN0aW9uOnt0eXBlOmBwcm9qZWN0aW9uYH0sdGVycmFpbjp7dHlwZTpgdGVycmFpbmB9LHNvdXJjZXM6e3JlcXVpcmVkOiEwLHR5cGU6YHNvdXJjZXNgfSxzcHJpdGU6e3R5cGU6YHNwcml0ZWB9LGdseXBoczp7dHlwZTpgc3RyaW5nYH0sImZvbnQtZmFjZXMiOnt0eXBlOmBmb250RmFjZXNgfSx0cmFuc2l0aW9uOnt0eXBlOmB0cmFuc2l0aW9uYH0sbGF5ZXJzOntyZXF1aXJlZDohMCx0eXBlOmBhcnJheWAsdmFsdWU6YGxheWVyYH19LHNvdXJjZXM6eyIqIjp7dHlwZTpgc291cmNlYH19LHNvdXJjZTpbYHNvdXJjZV92ZWN0b3JgLGBzb3VyY2VfcmFzdGVyYCxgc291cmNlX3Jhc3Rlcl9kZW1gLGBzb3VyY2VfZ2VvanNvbmAsYHNvdXJjZV92aWRlb2AsYHNvdXJjZV9pbWFnZWBdLHNvdXJjZV92ZWN0b3I6e3R5cGU6e3JlcXVpcmVkOiEwLHR5cGU6YGVudW1gLHZhbHVlczp7dmVjdG9yOnt9fX0sdXJsOnt0eXBlOmBzdHJpbmdgfSx0aWxlczp7dHlwZTpgYXJyYXlgLHZhbHVlOmBzdHJpbmdgfSxib3VuZHM6e3R5cGU6YGFycmF5YCx2YWx1ZTpgbnVtYmVyYCxsZW5ndGg6NCxkZWZhdWx0OlstMTgwLC04NS4wNTExMjksMTgwLDg1LjA1MTEyOV19LHNjaGVtZTp7dHlwZTpgZW51bWAsdmFsdWVzOnt4eXo6e30sdG1zOnt9fSxkZWZhdWx0OmB4eXpgfSxtaW56b29tOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MH0sbWF4em9vbTp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjIyfSxhdHRyaWJ1dGlvbjp7dHlwZTpgc3RyaW5nYH0scHJvbW90ZUlkOnt0eXBlOmBwcm9tb3RlSWRgfSx2b2xhdGlsZTp7dHlwZTpgYm9vbGVhbmAsZGVmYXVsdDohMX0sZW5jb2Rpbmc6e3R5cGU6YGVudW1gLHZhbHVlczp7bXZ0Ont9LG1sdDp7fX0sZGVmYXVsdDpgbXZ0YH0sIioiOnt0eXBlOmAqYH19LHNvdXJjZV9yYXN0ZXI6e3R5cGU6e3JlcXVpcmVkOiEwLHR5cGU6YGVudW1gLHZhbHVlczp7cmFzdGVyOnt9fX0sdXJsOnt0eXBlOmBzdHJpbmdgfSx0aWxlczp7dHlwZTpgYXJyYXlgLHZhbHVlOmBzdHJpbmdgfSxib3VuZHM6e3R5cGU6YGFycmF5YCx2YWx1ZTpgbnVtYmVyYCxsZW5ndGg6NCxkZWZhdWx0OlstMTgwLC04NS4wNTExMjksMTgwLDg1LjA1MTEyOV19LG1pbnpvb206e3R5cGU6YG51bWJlcmAsZGVmYXVsdDowfSxtYXh6b29tOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MjJ9LHRpbGVTaXplOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6NTEyLHVuaXRzOmBwaXhlbHNgfSxzY2hlbWU6e3R5cGU6YGVudW1gLHZhbHVlczp7eHl6Ont9LHRtczp7fX0sZGVmYXVsdDpgeHl6YH0sYXR0cmlidXRpb246e3R5cGU6YHN0cmluZ2B9LHZvbGF0aWxlOnt0eXBlOmBib29sZWFuYCxkZWZhdWx0OiExfSwiKiI6e3R5cGU6YCpgfX0sc291cmNlX3Jhc3Rlcl9kZW06e3R5cGU6e3JlcXVpcmVkOiEwLHR5cGU6YGVudW1gLHZhbHVlczp7InJhc3Rlci1kZW0iOnt9fX0sdXJsOnt0eXBlOmBzdHJpbmdgfSx0aWxlczp7dHlwZTpgYXJyYXlgLHZhbHVlOmBzdHJpbmdgfSxib3VuZHM6e3R5cGU6YGFycmF5YCx2YWx1ZTpgbnVtYmVyYCxsZW5ndGg6NCxkZWZhdWx0OlstMTgwLC04NS4wNTExMjksMTgwLDg1LjA1MTEyOV19LG1pbnpvb206e3R5cGU6YG51bWJlcmAsZGVmYXVsdDowfSxtYXh6b29tOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MjJ9LHRpbGVTaXplOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6NTEyLHVuaXRzOmBwaXhlbHNgfSxhdHRyaWJ1dGlvbjp7dHlwZTpgc3RyaW5nYH0sZW5jb2Rpbmc6e3R5cGU6YGVudW1gLHZhbHVlczp7dGVycmFyaXVtOnt9LG1hcGJveDp7fSxjdXN0b206e319LGRlZmF1bHQ6YG1hcGJveGB9LHJlZEZhY3Rvcjp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjF9LGJsdWVGYWN0b3I6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDoxfSxncmVlbkZhY3Rvcjp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjF9LGJhc2VTaGlmdDp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjB9LHZvbGF0aWxlOnt0eXBlOmBib29sZWFuYCxkZWZhdWx0OiExfSwiKiI6e3R5cGU6YCpgfX0sc291cmNlX2dlb2pzb246e3R5cGU6e3JlcXVpcmVkOiEwLHR5cGU6YGVudW1gLHZhbHVlczp7Z2VvanNvbjp7fX19LGRhdGE6e3JlcXVpcmVkOiEwLHR5cGU6YCpgfSxtYXh6b29tOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MTh9LGF0dHJpYnV0aW9uOnt0eXBlOmBzdHJpbmdgfSxidWZmZXI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDoxMjgsbWF4aW11bTo1MTIsbWluaW11bTowfSxmaWx0ZXI6e3R5cGU6YGZpbHRlcmB9LHRvbGVyYW5jZTp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0Oi4zNzV9LGNsdXN0ZXI6e3R5cGU6YGJvb2xlYW5gLGRlZmF1bHQ6ITF9LGNsdXN0ZXJSYWRpdXM6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDo1MCxtaW5pbXVtOjB9LGNsdXN0ZXJNYXhab29tOnt0eXBlOmBudW1iZXJgfSxjbHVzdGVyTWluUG9pbnRzOnt0eXBlOmBudW1iZXJgfSxjbHVzdGVyUHJvcGVydGllczp7dHlwZTpgKmB9LGxpbmVNZXRyaWNzOnt0eXBlOmBib29sZWFuYCxkZWZhdWx0OiExfSxnZW5lcmF0ZUlkOnt0eXBlOmBib29sZWFuYCxkZWZhdWx0OiExfSxwcm9tb3RlSWQ6e3R5cGU6YHByb21vdGVJZGB9fSxzb3VyY2VfdmlkZW86e3R5cGU6e3JlcXVpcmVkOiEwLHR5cGU6YGVudW1gLHZhbHVlczp7dmlkZW86e319fSx1cmxzOntyZXF1aXJlZDohMCx0eXBlOmBhcnJheWAsdmFsdWU6YHN0cmluZ2B9LGNvb3JkaW5hdGVzOntyZXF1aXJlZDohMCx0eXBlOmBhcnJheWAsbGVuZ3RoOjQsdmFsdWU6e3R5cGU6YGFycmF5YCxsZW5ndGg6Mix2YWx1ZTpgbnVtYmVyYH19fSxzb3VyY2VfaW1hZ2U6e3R5cGU6e3JlcXVpcmVkOiEwLHR5cGU6YGVudW1gLHZhbHVlczp7aW1hZ2U6e319fSx1cmw6e3R5cGU6YHN0cmluZ2B9LGNvb3JkaW5hdGVzOntyZXF1aXJlZDohMCx0eXBlOmBhcnJheWAsbGVuZ3RoOjQsdmFsdWU6e3R5cGU6YGFycmF5YCxsZW5ndGg6Mix2YWx1ZTpgbnVtYmVyYH19fSxsYXllcjp7aWQ6e3R5cGU6YHN0cmluZ2AscmVxdWlyZWQ6ITB9LHR5cGU6e3R5cGU6YGVudW1gLHZhbHVlczp7ZmlsbDp7fSxsaW5lOnt9LHN5bWJvbDp7fSxjaXJjbGU6e30saGVhdG1hcDp7fSwiZmlsbC1leHRydXNpb24iOnt9LHJhc3Rlcjp7fSxoaWxsc2hhZGU6e30sImNvbG9yLXJlbGllZiI6e30sYmFja2dyb3VuZDp7fX0scmVxdWlyZWQ6ITB9LG1ldGFkYXRhOnt0eXBlOmAqYH0sc291cmNlOnt0eXBlOmBzdHJpbmdgfSwic291cmNlLWxheWVyIjp7dHlwZTpgc3RyaW5nYH0sbWluem9vbTp7dHlwZTpgbnVtYmVyYCxtaW5pbXVtOjAsbWF4aW11bToyNH0sbWF4em9vbTp7dHlwZTpgbnVtYmVyYCxtaW5pbXVtOjAsbWF4aW11bToyNH0sZmlsdGVyOnt0eXBlOmBmaWx0ZXJgfSxsYXlvdXQ6e3R5cGU6YGxheW91dGB9LHBhaW50Ont0eXBlOmBwYWludGB9fSxsYXlvdXQ6W2BsYXlvdXRfZmlsbGAsYGxheW91dF9saW5lYCxgbGF5b3V0X2NpcmNsZWAsYGxheW91dF9oZWF0bWFwYCxgbGF5b3V0X2ZpbGwtZXh0cnVzaW9uYCxgbGF5b3V0X3N5bWJvbGAsYGxheW91dF9yYXN0ZXJgLGBsYXlvdXRfaGlsbHNoYWRlYCxgbGF5b3V0X2NvbG9yLXJlbGllZmAsYGxheW91dF9iYWNrZ3JvdW5kYF0sbGF5b3V0X2JhY2tncm91bmQ6e3Zpc2liaWxpdHk6e3R5cGU6YGVudW1gLHZhbHVlczp7dmlzaWJsZTp7fSxub25lOnt9fSxkZWZhdWx0OmB2aXNpYmxlYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYGdsb2JhbC1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfX0sbGF5b3V0X2ZpbGw6eyJmaWxsLXNvcnQta2V5Ijp7dHlwZTpgbnVtYmVyYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSx2aXNpYmlsaXR5Ont0eXBlOmBlbnVtYCx2YWx1ZXM6e3Zpc2libGU6e30sbm9uZTp7fX0sZGVmYXVsdDpgdmlzaWJsZWAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2BnbG9iYWwtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH19LGxheW91dF9jaXJjbGU6eyJjaXJjbGUtc29ydC1rZXkiOnt0eXBlOmBudW1iZXJgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LHZpc2liaWxpdHk6e3R5cGU6YGVudW1gLHZhbHVlczp7dmlzaWJsZTp7fSxub25lOnt9fSxkZWZhdWx0OmB2aXNpYmxlYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYGdsb2JhbC1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfX0sbGF5b3V0X2hlYXRtYXA6e3Zpc2liaWxpdHk6e3R5cGU6YGVudW1gLHZhbHVlczp7dmlzaWJsZTp7fSxub25lOnt9fSxkZWZhdWx0OmB2aXNpYmxlYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYGdsb2JhbC1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfX0sImxheW91dF9maWxsLWV4dHJ1c2lvbiI6e3Zpc2liaWxpdHk6e3R5cGU6YGVudW1gLHZhbHVlczp7dmlzaWJsZTp7fSxub25lOnt9fSxkZWZhdWx0OmB2aXNpYmxlYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYGdsb2JhbC1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiZmlsbC1leHRydXNpb24tcm91bmRlZC1jb3JuZXItZGlzdGFuY2UiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MCxtaW5pbXVtOjAsdW5pdHM6YG1ldGVyc2AsInByb3BlcnR5LXR5cGUiOmBjb25zdGFudGB9fSxsYXlvdXRfbGluZTp7ImxpbmUtY2FwIjp7dHlwZTpgZW51bWAsdmFsdWVzOntidXR0Ont9LHJvdW5kOnt9LHNxdWFyZTp7fX0sZGVmYXVsdDpgYnV0dGAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImxpbmUtam9pbiI6e3R5cGU6YGVudW1gLHZhbHVlczp7YmV2ZWw6e30scm91bmQ6e30sbWl0ZXI6e319LGRlZmF1bHQ6YG1pdGVyYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwibGluZS1taXRlci1saW1pdCI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDoyLHJlcXVpcmVzOlt7ImxpbmUtam9pbiI6YG1pdGVyYH1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJsaW5lLXJvdW5kLWxpbWl0Ijp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjEuMDUscmVxdWlyZXM6W3sibGluZS1qb2luIjpgcm91bmRgfV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImxpbmUtc29ydC1rZXkiOnt0eXBlOmBudW1iZXJgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LHZpc2liaWxpdHk6e3R5cGU6YGVudW1gLHZhbHVlczp7dmlzaWJsZTp7fSxub25lOnt9fSxkZWZhdWx0OmB2aXNpYmxlYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYGdsb2JhbC1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfX0sbGF5b3V0X3N5bWJvbDp7InN5bWJvbC1wbGFjZW1lbnQiOnt0eXBlOmBlbnVtYCx2YWx1ZXM6e3BvaW50Ont9LGxpbmU6e30sImxpbmUtY2VudGVyIjp7fX0sZGVmYXVsdDpgcG9pbnRgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwic3ltYm9sLXNwYWNpbmciOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MjUwLG1pbmltdW06MSx1bml0czpgcGl4ZWxzYCxyZXF1aXJlczpbeyJzeW1ib2wtcGxhY2VtZW50IjpgbGluZWB9XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sInN5bWJvbC1hdm9pZC1lZGdlcyI6e3R5cGU6YGJvb2xlYW5gLGRlZmF1bHQ6ITEsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJzeW1ib2wtc29ydC1rZXkiOnt0eXBlOmBudW1iZXJgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJzeW1ib2wtei1vcmRlciI6e3R5cGU6YGVudW1gLHZhbHVlczp7YXV0bzp7fSwidmlld3BvcnQteSI6e30sc291cmNlOnt9fSxkZWZhdWx0OmBhdXRvYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sImljb24tYWxsb3ctb3ZlcmxhcCI6e3R5cGU6YGJvb2xlYW5gLGRlZmF1bHQ6ITEscmVxdWlyZXM6W2BpY29uLWltYWdlYCx7IiEiOmBpY29uLW92ZXJsYXBgfV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJpY29uLW92ZXJsYXAiOnt0eXBlOmBlbnVtYCx2YWx1ZXM6e25ldmVyOnt9LGFsd2F5czp7fSxjb29wZXJhdGl2ZTp7fX0scmVxdWlyZXM6W2BpY29uLWltYWdlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJpY29uLWlnbm9yZS1wbGFjZW1lbnQiOnt0eXBlOmBib29sZWFuYCxkZWZhdWx0OiExLHJlcXVpcmVzOltgaWNvbi1pbWFnZWBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiaWNvbi1vcHRpb25hbCI6e3R5cGU6YGJvb2xlYW5gLGRlZmF1bHQ6ITEscmVxdWlyZXM6W2BpY29uLWltYWdlYCxgdGV4dC1maWVsZGBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQiOnt0eXBlOmBlbnVtYCx2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fSxhdXRvOnt9fSxkZWZhdWx0OmBhdXRvYCxyZXF1aXJlczpbYGljb24taW1hZ2VgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwiaWNvbi1zaXplIjp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjEsbWluaW11bTowLHVuaXRzOmBmYWN0b3Igb2YgdGhlIG9yaWdpbmFsIGljb24gc2l6ZWAscmVxdWlyZXM6W2BpY29uLWltYWdlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImljb24tdGV4dC1maXQiOnt0eXBlOmBlbnVtYCx2YWx1ZXM6e25vbmU6e30sd2lkdGg6e30saGVpZ2h0Ont9LGJvdGg6e319LGRlZmF1bHQ6YG5vbmVgLHJlcXVpcmVzOltgaWNvbi1pbWFnZWAsYHRleHQtZmllbGRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sImljb24tdGV4dC1maXQtcGFkZGluZyI6e3R5cGU6YGFycmF5YCx2YWx1ZTpgbnVtYmVyYCxsZW5ndGg6NCxkZWZhdWx0OlswLDAsMCwwXSx1bml0czpgcGl4ZWxzYCxyZXF1aXJlczpbYGljb24taW1hZ2VgLGB0ZXh0LWZpZWxkYCx7Imljb24tdGV4dC1maXQiOltgYm90aGAsYHdpZHRoYCxgaGVpZ2h0YF19XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sImljb24taW1hZ2UiOnt0eXBlOmByZXNvbHZlZEltYWdlYCx0b2tlbnM6ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImljb24tcm90YXRlIjp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjAscGVyaW9kOjM2MCx1bml0czpgZGVncmVlc2AscmVxdWlyZXM6W2BpY29uLWltYWdlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImljb24tcGFkZGluZyI6e3R5cGU6YHBhZGRpbmdgLGRlZmF1bHQ6WzJdLHVuaXRzOmBwaXhlbHNgLHJlcXVpcmVzOltgaWNvbi1pbWFnZWBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJpY29uLWtlZXAtdXByaWdodCI6e3R5cGU6YGJvb2xlYW5gLGRlZmF1bHQ6ITEscmVxdWlyZXM6W2BpY29uLWltYWdlYCx7Imljb24tcm90YXRpb24tYWxpZ25tZW50IjpgbWFwYH0seyJzeW1ib2wtcGxhY2VtZW50IjpbYGxpbmVgLGBsaW5lLWNlbnRlcmBdfV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJpY29uLW9mZnNldCI6e3R5cGU6YGFycmF5YCx2YWx1ZTpgbnVtYmVyYCxsZW5ndGg6MixkZWZhdWx0OlswLDBdLHJlcXVpcmVzOltgaWNvbi1pbWFnZWBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJpY29uLWFuY2hvciI6e3R5cGU6YGVudW1gLHZhbHVlczp7Y2VudGVyOnt9LGxlZnQ6e30scmlnaHQ6e30sdG9wOnt9LGJvdHRvbTp7fSwidG9wLWxlZnQiOnt9LCJ0b3AtcmlnaHQiOnt9LCJib3R0b20tbGVmdCI6e30sImJvdHRvbS1yaWdodCI6e319LGRlZmF1bHQ6YGNlbnRlcmAscmVxdWlyZXM6W2BpY29uLWltYWdlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImljb24tcGl0Y2gtYWxpZ25tZW50Ijp7dHlwZTpgZW51bWAsdmFsdWVzOnttYXA6e30sdmlld3BvcnQ6e30sYXV0bzp7fX0sZGVmYXVsdDpgYXV0b2AscmVxdWlyZXM6W2BpY29uLWltYWdlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJ0ZXh0LXBpdGNoLWFsaWdubWVudCI6e3R5cGU6YGVudW1gLHZhbHVlczp7bWFwOnt9LHZpZXdwb3J0Ont9LGF1dG86e319LGRlZmF1bHQ6YGF1dG9gLHJlcXVpcmVzOltgdGV4dC1maWVsZGBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQiOnt0eXBlOmBlbnVtYCx2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fSwidmlld3BvcnQtZ2x5cGgiOnt9LGF1dG86e319LGRlZmF1bHQ6YGF1dG9gLHJlcXVpcmVzOltgdGV4dC1maWVsZGBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwidGV4dC1maWVsZCI6e3R5cGU6YGZvcm1hdHRlZGAsZGVmYXVsdDpgYCx0b2tlbnM6ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sInRleHQtZm9udCI6e3R5cGU6YGFycmF5YCx2YWx1ZTpgc3RyaW5nYCxkZWZhdWx0OltgT3BlbiBTYW5zIFJlZ3VsYXJgLGBBcmlhbCBVbmljb2RlIE1TIFJlZ3VsYXJgXSxyZXF1aXJlczpbYHRleHQtZmllbGRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwidGV4dC1zaXplIjp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjE2LG1pbmltdW06MCx1bml0czpgcGl4ZWxzYCxyZXF1aXJlczpbYHRleHQtZmllbGRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwidGV4dC1tYXgtd2lkdGgiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MTAsbWluaW11bTowLHVuaXRzOmBlbXNgLHJlcXVpcmVzOltgdGV4dC1maWVsZGBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJ0ZXh0LWxpbmUtaGVpZ2h0Ijp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjEuMix1bml0czpgZW1zYCxyZXF1aXJlczpbYHRleHQtZmllbGRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sInRleHQtbGV0dGVyLXNwYWNpbmciOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MCx1bml0czpgZW1zYCxyZXF1aXJlczpbYHRleHQtZmllbGRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwidGV4dC1qdXN0aWZ5Ijp7dHlwZTpgZW51bWAsdmFsdWVzOnthdXRvOnt9LGxlZnQ6e30sY2VudGVyOnt9LHJpZ2h0Ont9fSxkZWZhdWx0OmBjZW50ZXJgLHJlcXVpcmVzOltgdGV4dC1maWVsZGBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJ0ZXh0LXJhZGlhbC1vZmZzZXQiOnt0eXBlOmBudW1iZXJgLHVuaXRzOmBlbXNgLGRlZmF1bHQ6MCxyZXF1aXJlczpbYHRleHQtZmllbGRgXSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYF19fSwidGV4dC12YXJpYWJsZS1hbmNob3IiOnt0eXBlOmBhcnJheWAsdmFsdWU6YGVudW1gLHZhbHVlczp7Y2VudGVyOnt9LGxlZnQ6e30scmlnaHQ6e30sdG9wOnt9LGJvdHRvbTp7fSwidG9wLWxlZnQiOnt9LCJ0b3AtcmlnaHQiOnt9LCJib3R0b20tbGVmdCI6e30sImJvdHRvbS1yaWdodCI6e319LHJlcXVpcmVzOltgdGV4dC1maWVsZGAseyJzeW1ib2wtcGxhY2VtZW50IjpbYHBvaW50YF19XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sInRleHQtdmFyaWFibGUtYW5jaG9yLW9mZnNldCI6e3R5cGU6YHZhcmlhYmxlQW5jaG9yT2Zmc2V0Q29sbGVjdGlvbmAscmVxdWlyZXM6W2B0ZXh0LWZpZWxkYCx7InN5bWJvbC1wbGFjZW1lbnQiOltgcG9pbnRgXX1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJ0ZXh0LWFuY2hvciI6e3R5cGU6YGVudW1gLHZhbHVlczp7Y2VudGVyOnt9LGxlZnQ6e30scmlnaHQ6e30sdG9wOnt9LGJvdHRvbTp7fSwidG9wLWxlZnQiOnt9LCJ0b3AtcmlnaHQiOnt9LCJib3R0b20tbGVmdCI6e30sImJvdHRvbS1yaWdodCI6e319LGRlZmF1bHQ6YGNlbnRlcmAscmVxdWlyZXM6W2B0ZXh0LWZpZWxkYCx7IiEiOmB0ZXh0LXZhcmlhYmxlLWFuY2hvcmB9XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwidGV4dC1tYXgtYW5nbGUiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6NDUsdW5pdHM6YGRlZ3JlZXNgLHJlcXVpcmVzOltgdGV4dC1maWVsZGAseyJzeW1ib2wtcGxhY2VtZW50IjpbYGxpbmVgLGBsaW5lLWNlbnRlcmBdfV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJ0ZXh0LXdyaXRpbmctbW9kZSI6e3R5cGU6YGFycmF5YCx2YWx1ZTpgZW51bWAsdmFsdWVzOntob3Jpem9udGFsOnt9LHZlcnRpY2FsOnt9fSxyZXF1aXJlczpbYHRleHQtZmllbGRgLHsic3ltYm9sLXBsYWNlbWVudCI6W2Bwb2ludGBdfV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJ0ZXh0LXJvdGF0ZSI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDowLHBlcmlvZDozNjAsdW5pdHM6YGRlZ3JlZXNgLHJlcXVpcmVzOltgdGV4dC1maWVsZGBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJ0ZXh0LXBhZGRpbmciOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MixtaW5pbXVtOjAsdW5pdHM6YHBpeGVsc2AscmVxdWlyZXM6W2B0ZXh0LWZpZWxkYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJ0ZXh0LWtlZXAtdXByaWdodCI6e3R5cGU6YGJvb2xlYW5gLGRlZmF1bHQ6ITAscmVxdWlyZXM6W2B0ZXh0LWZpZWxkYCx7InRleHQtcm90YXRpb24tYWxpZ25tZW50IjpgbWFwYH0seyJzeW1ib2wtcGxhY2VtZW50IjpbYGxpbmVgLGBsaW5lLWNlbnRlcmBdfV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJ0ZXh0LXRyYW5zZm9ybSI6e3R5cGU6YGVudW1gLHZhbHVlczp7bm9uZTp7fSx1cHBlcmNhc2U6e30sbG93ZXJjYXNlOnt9fSxkZWZhdWx0OmBub25lYCxyZXF1aXJlczpbYHRleHQtZmllbGRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwidGV4dC1vZmZzZXQiOnt0eXBlOmBhcnJheWAsdmFsdWU6YG51bWJlcmAsdW5pdHM6YGVtc2AsbGVuZ3RoOjIsZGVmYXVsdDpbMCwwXSxyZXF1aXJlczpbYHRleHQtZmllbGRgLHsiISI6YHRleHQtcmFkaWFsLW9mZnNldGB9XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwidGV4dC1hbGxvdy1vdmVybGFwIjp7dHlwZTpgYm9vbGVhbmAsZGVmYXVsdDohMSxyZXF1aXJlczpbYHRleHQtZmllbGRgLHsiISI6YHRleHQtb3ZlcmxhcGB9XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sInRleHQtb3ZlcmxhcCI6e3R5cGU6YGVudW1gLHZhbHVlczp7bmV2ZXI6e30sYWx3YXlzOnt9LGNvb3BlcmF0aXZlOnt9fSxyZXF1aXJlczpbYHRleHQtZmllbGRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sInRleHQtaWdub3JlLXBsYWNlbWVudCI6e3R5cGU6YGJvb2xlYW5gLGRlZmF1bHQ6ITEscmVxdWlyZXM6W2B0ZXh0LWZpZWxkYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJ0ZXh0LW9wdGlvbmFsIjp7dHlwZTpgYm9vbGVhbmAsZGVmYXVsdDohMSxyZXF1aXJlczpbYHRleHQtZmllbGRgLGBpY29uLWltYWdlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJzeW1ib2wtaGVpZ2h0LW9mZnNldCI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDowLHVuaXRzOmBtZXRlcnNgLHJlcXVpcmVzOlt7InN5bWJvbC1wbGFjZW1lbnQiOltgcG9pbnRgXX1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJzeW1ib2wtaGVpZ2h0LWFuY2hvciI6e3R5cGU6YGVudW1gLHZhbHVlczp7Z3JvdW5kOnt9LGFic29sdXRlOnt9fSxkZWZhdWx0OmBncm91bmRgLHJlcXVpcmVzOltgc3ltYm9sLWhlaWdodC1vZmZzZXRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sdmlzaWJpbGl0eTp7dHlwZTpgZW51bWAsdmFsdWVzOnt2aXNpYmxlOnt9LG5vbmU6e319LGRlZmF1bHQ6YHZpc2libGVgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgZ2xvYmFsLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9fSxsYXlvdXRfcmFzdGVyOnt2aXNpYmlsaXR5Ont0eXBlOmBlbnVtYCx2YWx1ZXM6e3Zpc2libGU6e30sbm9uZTp7fX0sZGVmYXVsdDpgdmlzaWJsZWAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2BnbG9iYWwtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH19LGxheW91dF9oaWxsc2hhZGU6e3Zpc2liaWxpdHk6e3R5cGU6YGVudW1gLHZhbHVlczp7dmlzaWJsZTp7fSxub25lOnt9fSxkZWZhdWx0OmB2aXNpYmxlYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYGdsb2JhbC1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfX0sImxheW91dF9jb2xvci1yZWxpZWYiOnt2aXNpYmlsaXR5Ont0eXBlOmBlbnVtYCx2YWx1ZXM6e3Zpc2libGU6e30sbm9uZTp7fX0sZGVmYXVsdDpgdmlzaWJsZWAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2BnbG9iYWwtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH19LGZpbHRlcjp7dHlwZTpgYm9vbGVhbmAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sZmlsdGVyX29wZXJhdG9yOnt0eXBlOmBlbnVtYCx2YWx1ZXM6eyI9PSI6e30sIiE9Ijp7fSwiPiI6e30sIj49Ijp7fSwiPCI6e30sIjw9Ijp7fSxpbjp7fSwiIWluIjp7fSxhbGw6e30sYW55Ont9LG5vbmU6e30saGFzOnt9LCIhaGFzIjp7fX19LGdlb21ldHJ5X3R5cGU6e3R5cGU6YGVudW1gLHZhbHVlczp7UG9pbnQ6e30sTGluZVN0cmluZzp7fSxQb2x5Z29uOnt9fX0sZnVuY3Rpb246e2V4cHJlc3Npb246e3R5cGU6YGV4cHJlc3Npb25gfSxzdG9wczp7dHlwZTpgYXJyYXlgLHZhbHVlOmBmdW5jdGlvbl9zdG9wYH0sYmFzZTp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjEsbWluaW11bTowfSxwcm9wZXJ0eTp7dHlwZTpgc3RyaW5nYCxkZWZhdWx0OmAkem9vbWB9LHR5cGU6e3R5cGU6YGVudW1gLHZhbHVlczp7aWRlbnRpdHk6e30sZXhwb25lbnRpYWw6e30saW50ZXJ2YWw6e30sY2F0ZWdvcmljYWw6e319LGRlZmF1bHQ6YGV4cG9uZW50aWFsYH0sY29sb3JTcGFjZTp7dHlwZTpgZW51bWAsdmFsdWVzOntyZ2I6e30sbGFiOnt9LGhjbDp7fX0sZGVmYXVsdDpgcmdiYH0sZGVmYXVsdDp7dHlwZTpgKmAscmVxdWlyZWQ6ITF9fSxmdW5jdGlvbl9zdG9wOnt0eXBlOmBhcnJheWAsbWluaW11bTowLG1heGltdW06MjQsdmFsdWU6W2BudW1iZXJgLGBjb2xvcmBdLGxlbmd0aDoyfSxleHByZXNzaW9uOnt0eXBlOmBhcnJheWAsdmFsdWU6YGV4cHJlc3Npb25fbmFtZWAsbWluaW11bToxfSxsaWdodDp7YW5jaG9yOnt0eXBlOmBlbnVtYCxkZWZhdWx0OmB2aWV3cG9ydGAsdmFsdWVzOnttYXA6e30sdmlld3BvcnQ6e319LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGAsdHJhbnNpdGlvbjohMSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gXX19LHBvc2l0aW9uOnt0eXBlOmBhcnJheWAsZGVmYXVsdDpbMS4xNSwyMTAsMzBdLGxlbmd0aDozLHZhbHVlOmBudW1iZXJgLCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGAsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX19LGNvbG9yOnt0eXBlOmBjb2xvcmAsInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YCxkZWZhdWx0OmAjZmZmZmZmYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sdHJhbnNpdGlvbjohMH0saW50ZW5zaXR5Ont0eXBlOmBudW1iZXJgLCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGAsZGVmYXVsdDouNSxtaW5pbXVtOjAsbWF4aW11bToxLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWBdfSx0cmFuc2l0aW9uOiEwfX0sc2t5Onsic2t5LWNvbG9yIjp7dHlwZTpgY29sb3JgLCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGAsZGVmYXVsdDpgIzg4QzZGQ2AsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19LHRyYW5zaXRpb246ITB9LCJob3Jpem9uLWNvbG9yIjp7dHlwZTpgY29sb3JgLCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGAsZGVmYXVsdDpgI2ZmZmZmZmAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19LHRyYW5zaXRpb246ITB9LCJmb2ctY29sb3IiOnt0eXBlOmBjb2xvcmAsInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YCxkZWZhdWx0OmAjZmZmZmZmYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sdHJhbnNpdGlvbjohMH0sImZvZy1ncm91bmQtYmxlbmQiOnt0eXBlOmBudW1iZXJgLCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGAsZGVmYXVsdDouNSxtaW5pbXVtOjAsbWF4aW11bToxLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWBdfSx0cmFuc2l0aW9uOiEwfSwiaG9yaXpvbi1mb2ctYmxlbmQiOnt0eXBlOmBudW1iZXJgLCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGAsZGVmYXVsdDouOCxtaW5pbXVtOjAsbWF4aW11bToxLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWBdfSx0cmFuc2l0aW9uOiEwfSwic2t5LWhvcml6b24tYmxlbmQiOnt0eXBlOmBudW1iZXJgLCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGAsZGVmYXVsdDouOCxtaW5pbXVtOjAsbWF4aW11bToxLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWBdfSx0cmFuc2l0aW9uOiEwfSwiYXRtb3NwaGVyZS1ibGVuZCI6e3R5cGU6YG51bWJlcmAsInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YCxkZWZhdWx0Oi44LG1pbmltdW06MCxtYXhpbXVtOjEsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19LHRyYW5zaXRpb246ITB9fSx0ZXJyYWluOntzb3VyY2U6e3R5cGU6YHN0cmluZ2AscmVxdWlyZWQ6ITB9LGV4YWdnZXJhdGlvbjp7dHlwZTpgbnVtYmVyYCxtaW5pbXVtOjAsZGVmYXVsdDoxfX0scHJvamVjdGlvbjp7dHlwZTp7dHlwZTpgcHJvamVjdGlvbkRlZmluaXRpb25gLGRlZmF1bHQ6YG1lcmNhdG9yYCwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgLHRyYW5zaXRpb246ITEsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19fX0scGFpbnQ6W2BwYWludF9maWxsYCxgcGFpbnRfbGluZWAsYHBhaW50X2NpcmNsZWAsYHBhaW50X2hlYXRtYXBgLGBwYWludF9maWxsLWV4dHJ1c2lvbmAsYHBhaW50X3N5bWJvbGAsYHBhaW50X3Jhc3RlcmAsYHBhaW50X2hpbGxzaGFkZWAsYHBhaW50X2NvbG9yLXJlbGllZmAsYHBhaW50X2JhY2tncm91bmRgXSxwYWludF9maWxsOnsiZmlsbC1hbnRpYWxpYXMiOnt0eXBlOmBib29sZWFuYCxkZWZhdWx0OiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiZmlsbC1vcGFjaXR5Ijp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjEsbWluaW11bTowLG1heGltdW06MSx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwiZmlsbC1sYXllci1vcGFjaXR5Ijp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjEsbWluaW11bTowLG1heGltdW06MSx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGdsb2JhbC1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiZmlsbC1jb2xvciI6e3R5cGU6YGNvbG9yYCxkZWZhdWx0OmAjMDAwMDAwYCx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwiZmlsbC1vdXRsaW5lLWNvbG9yIjp7dHlwZTpgY29sb3JgLHRyYW5zaXRpb246ITAscmVxdWlyZXM6W3siISI6YGZpbGwtcGF0dGVybmB9LHsiZmlsbC1hbnRpYWxpYXMiOiEwfV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWAsYGZlYXR1cmUtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJmaWxsLXRyYW5zbGF0ZSI6e3R5cGU6YGFycmF5YCx2YWx1ZTpgbnVtYmVyYCxsZW5ndGg6MixkZWZhdWx0OlswLDBdLHRyYW5zaXRpb246ITAsdW5pdHM6YHBpeGVsc2AsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJmaWxsLXRyYW5zbGF0ZS1hbmNob3IiOnt0eXBlOmBlbnVtYCx2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fX0sZGVmYXVsdDpgbWFwYCxyZXF1aXJlczpbYGZpbGwtdHJhbnNsYXRlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJmaWxsLXBhdHRlcm4iOnt0eXBlOmByZXNvbHZlZEltYWdlYCx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBjcm9zcy1mYWRlZC1kYXRhLWRyaXZlbmB9fSwicGFpbnRfZmlsbC1leHRydXNpb24iOnsiZmlsbC1leHRydXNpb24tb3BhY2l0eSI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDoxLG1pbmltdW06MCxtYXhpbXVtOjEsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sImZpbGwtZXh0cnVzaW9uLWNvbG9yIjp7dHlwZTpgY29sb3JgLGRlZmF1bHQ6YCMwMDAwMDBgLHRyYW5zaXRpb246ITAscmVxdWlyZXM6W3siISI6YGZpbGwtZXh0cnVzaW9uLXBhdHRlcm5gfV0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWAsYGZlYXR1cmUtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUiOnt0eXBlOmBhcnJheWAsdmFsdWU6YG51bWJlcmAsbGVuZ3RoOjIsZGVmYXVsdDpbMCwwXSx0cmFuc2l0aW9uOiEwLHVuaXRzOmBwaXhlbHNgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvciI6e3R5cGU6YGVudW1gLHZhbHVlczp7bWFwOnt9LHZpZXdwb3J0Ont9fSxkZWZhdWx0OmBtYXBgLHJlcXVpcmVzOltgZmlsbC1leHRydXNpb24tdHJhbnNsYXRlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuIjp7dHlwZTpgcmVzb2x2ZWRJbWFnZWAsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYF19LCJwcm9wZXJ0eS10eXBlIjpgY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW5gfSwiZmlsbC1leHRydXNpb24taGVpZ2h0Ijp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjAsbWluaW11bTowLHVuaXRzOmBtZXRlcnNgLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWAsYGZlYXR1cmUtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJmaWxsLWV4dHJ1c2lvbi1iYXNlIjp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjAsbWluaW11bTowLHVuaXRzOmBtZXRlcnNgLHRyYW5zaXRpb246ITAscmVxdWlyZXM6W2BmaWxsLWV4dHJ1c2lvbi1oZWlnaHRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYCxgZmVhdHVyZS1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50Ijp7dHlwZTpgYm9vbGVhbmAsZGVmYXVsdDohMCx0cmFuc2l0aW9uOiExLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfX0scGFpbnRfbGluZTp7ImxpbmUtb3BhY2l0eSI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDoxLG1pbmltdW06MCxtYXhpbXVtOjEsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYCxgZmVhdHVyZS1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImxpbmUtbGF5ZXItb3BhY2l0eSI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDoxLG1pbmltdW06MCxtYXhpbXVtOjEsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBnbG9iYWwtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sImxpbmUtY29sb3IiOnt0eXBlOmBjb2xvcmAsZGVmYXVsdDpgIzAwMDAwMGAsdHJhbnNpdGlvbjohMCxyZXF1aXJlczpbeyIhIjpgbGluZS1wYXR0ZXJuYH1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwibGluZS10cmFuc2xhdGUiOnt0eXBlOmBhcnJheWAsdmFsdWU6YG51bWJlcmAsbGVuZ3RoOjIsZGVmYXVsdDpbMCwwXSx0cmFuc2l0aW9uOiEwLHVuaXRzOmBwaXhlbHNgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwibGluZS10cmFuc2xhdGUtYW5jaG9yIjp7dHlwZTpgZW51bWAsdmFsdWVzOnttYXA6e30sdmlld3BvcnQ6e319LGRlZmF1bHQ6YG1hcGAscmVxdWlyZXM6W2BsaW5lLXRyYW5zbGF0ZWBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwibGluZS13aWR0aCI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDoxLG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLHVuaXRzOmBwaXhlbHNgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwibGluZS1nYXAtd2lkdGgiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MCxtaW5pbXVtOjAsdHJhbnNpdGlvbjohMCx1bml0czpgcGl4ZWxzYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYCxgZmVhdHVyZS1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImxpbmUtb2Zmc2V0Ijp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjAsdHJhbnNpdGlvbjohMCx1bml0czpgcGl4ZWxzYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYCxgZmVhdHVyZS1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImxpbmUtYmx1ciI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDowLG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLHVuaXRzOmBwaXhlbHNgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwibGluZS1kYXNoYXJyYXkiOnt0eXBlOmBhcnJheWAsdmFsdWU6YG51bWJlcmAsbWluaW11bTowLHRyYW5zaXRpb246ITAsdW5pdHM6YGxpbmUgd2lkdGhzYCxyZXF1aXJlczpbeyIhIjpgbGluZS1wYXR0ZXJuYH1dLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBjcm9zcy1mYWRlZC1kYXRhLWRyaXZlbmB9LCJsaW5lLXBhdHRlcm4iOnt0eXBlOmByZXNvbHZlZEltYWdlYCx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgXX0sInByb3BlcnR5LXR5cGUiOmBjcm9zcy1mYWRlZC1kYXRhLWRyaXZlbmB9LCJsaW5lLWdyYWRpZW50Ijp7dHlwZTpgY29sb3JgLHRyYW5zaXRpb246ITEscmVxdWlyZXM6W3siISI6YGxpbmUtZGFzaGFycmF5YH0seyIhIjpgbGluZS1wYXR0ZXJuYH0se3NvdXJjZTpgZ2VvanNvbmAsaGFzOntsaW5lTWV0cmljczohMH19XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYGxpbmUtcHJvZ3Jlc3NgXX0sInByb3BlcnR5LXR5cGUiOmBjb2xvci1yYW1wYH19LHBhaW50X2NpcmNsZTp7ImNpcmNsZS1yYWRpdXMiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6NSxtaW5pbXVtOjAsdHJhbnNpdGlvbjohMCx1bml0czpgcGl4ZWxzYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYCxgZmVhdHVyZS1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImNpcmNsZS1jb2xvciI6e3R5cGU6YGNvbG9yYCxkZWZhdWx0OmAjMDAwMDAwYCx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwiY2lyY2xlLWJsdXIiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MCx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwiY2lyY2xlLW9wYWNpdHkiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWAsYGZlYXR1cmUtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJjaXJjbGUtdHJhbnNsYXRlIjp7dHlwZTpgYXJyYXlgLHZhbHVlOmBudW1iZXJgLGxlbmd0aDoyLGRlZmF1bHQ6WzAsMF0sdHJhbnNpdGlvbjohMCx1bml0czpgcGl4ZWxzYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sImNpcmNsZS10cmFuc2xhdGUtYW5jaG9yIjp7dHlwZTpgZW51bWAsdmFsdWVzOnttYXA6e30sdmlld3BvcnQ6e319LGRlZmF1bHQ6YG1hcGAscmVxdWlyZXM6W2BjaXJjbGUtdHJhbnNsYXRlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJjaXJjbGUtcGl0Y2gtc2NhbGUiOnt0eXBlOmBlbnVtYCx2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fX0sZGVmYXVsdDpgbWFwYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sImNpcmNsZS1waXRjaC1hbGlnbm1lbnQiOnt0eXBlOmBlbnVtYCx2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fX0sZGVmYXVsdDpgdmlld3BvcnRgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiY2lyY2xlLXN0cm9rZS13aWR0aCI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDowLG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLHVuaXRzOmBwaXhlbHNgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwiY2lyY2xlLXN0cm9rZS1jb2xvciI6e3R5cGU6YGNvbG9yYCxkZWZhdWx0OmAjMDAwMDAwYCx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwiY2lyY2xlLXN0cm9rZS1vcGFjaXR5Ijp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjEsbWluaW11bTowLG1heGltdW06MSx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfX0scGFpbnRfaGVhdG1hcDp7ImhlYXRtYXAtcmFkaXVzIjp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjMwLG1pbmltdW06MSx0cmFuc2l0aW9uOiEwLHVuaXRzOmBwaXhlbHNgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwiaGVhdG1hcC13ZWlnaHQiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MSxtaW5pbXVtOjAsdHJhbnNpdGlvbjohMSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYCxgZmVhdHVyZS1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImhlYXRtYXAtaW50ZW5zaXR5Ijp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjEsbWluaW11bTowLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJoZWF0bWFwLWNvbG9yIjp7dHlwZTpgY29sb3JgLGRlZmF1bHQ6W2BpbnRlcnBvbGF0ZWAsW2BsaW5lYXJgXSxbYGhlYXRtYXAtZGVuc2l0eWBdLDAsYHJnYmEoMCwgMCwgMjU1LCAwKWAsLjEsYHJveWFsYmx1ZWAsLjMsYGN5YW5gLC41LGBsaW1lYCwuNyxgeWVsbG93YCwxLGByZWRgXSx0cmFuc2l0aW9uOiExLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgaGVhdG1hcC1kZW5zaXR5YF19LCJwcm9wZXJ0eS10eXBlIjpgY29sb3ItcmFtcGB9LCJoZWF0bWFwLW9wYWNpdHkiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9fSxwYWludF9zeW1ib2w6eyJpY29uLW9wYWNpdHkiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAscmVxdWlyZXM6W2BpY29uLWltYWdlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWAsYGZlYXR1cmUtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJpY29uLWNvbG9yIjp7dHlwZTpgY29sb3JgLGRlZmF1bHQ6YCMwMDAwMDBgLHRyYW5zaXRpb246ITAscmVxdWlyZXM6W2BpY29uLWltYWdlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWAsYGZlYXR1cmUtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJpY29uLWhhbG8tY29sb3IiOnt0eXBlOmBjb2xvcmAsZGVmYXVsdDpgcmdiYSgwLCAwLCAwLCAwKWAsdHJhbnNpdGlvbjohMCxyZXF1aXJlczpbYGljb24taW1hZ2VgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYCxgZmVhdHVyZS1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImljb24taGFsby13aWR0aCI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDowLG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLHVuaXRzOmBwaXhlbHNgLHJlcXVpcmVzOltgaWNvbi1pbWFnZWBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwiaWNvbi1oYWxvLWJsdXIiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MCxtaW5pbXVtOjAsdHJhbnNpdGlvbjohMCx1bml0czpgcGl4ZWxzYCxyZXF1aXJlczpbYGljb24taW1hZ2VgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYCxgZmVhdHVyZS1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sImljb24tdHJhbnNsYXRlIjp7dHlwZTpgYXJyYXlgLHZhbHVlOmBudW1iZXJgLGxlbmd0aDoyLGRlZmF1bHQ6WzAsMF0sdHJhbnNpdGlvbjohMCx1bml0czpgcGl4ZWxzYCxyZXF1aXJlczpbYGljb24taW1hZ2VgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sImljb24tdHJhbnNsYXRlLWFuY2hvciI6e3R5cGU6YGVudW1gLHZhbHVlczp7bWFwOnt9LHZpZXdwb3J0Ont9fSxkZWZhdWx0OmBtYXBgLHJlcXVpcmVzOltgaWNvbi1pbWFnZWAsYGljb24tdHJhbnNsYXRlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJ0ZXh0LW9wYWNpdHkiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAscmVxdWlyZXM6W2B0ZXh0LWZpZWxkYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWAsYGZlYXR1cmUtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJ0ZXh0LWNvbG9yIjp7dHlwZTpgY29sb3JgLGRlZmF1bHQ6YCMwMDAwMDBgLHRyYW5zaXRpb246ITAsb3ZlcnJpZGFibGU6ITAscmVxdWlyZXM6W2B0ZXh0LWZpZWxkYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWAsYGZlYXR1cmUtc3RhdGVgXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmB9LCJ0ZXh0LWhhbG8tY29sb3IiOnt0eXBlOmBjb2xvcmAsZGVmYXVsdDpgcmdiYSgwLCAwLCAwLCAwKWAsdHJhbnNpdGlvbjohMCxyZXF1aXJlczpbYHRleHQtZmllbGRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYCxgZmVhdHVyZS1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sInRleHQtaGFsby13aWR0aCI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDowLG1pbmltdW06MCx0cmFuc2l0aW9uOiEwLHVuaXRzOmBwaXhlbHNgLHJlcXVpcmVzOltgdGV4dC1maWVsZGBdLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWAsYGZlYXR1cmVgLGBmZWF0dXJlLXN0YXRlYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1kcml2ZW5gfSwidGV4dC1oYWxvLWJsdXIiOnt0eXBlOmBudW1iZXJgLGRlZmF1bHQ6MCxtaW5pbXVtOjAsdHJhbnNpdGlvbjohMCx1bml0czpgcGl4ZWxzYCxyZXF1aXJlczpbYHRleHQtZmllbGRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gLGBmZWF0dXJlYCxgZmVhdHVyZS1zdGF0ZWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtZHJpdmVuYH0sInRleHQtdHJhbnNsYXRlIjp7dHlwZTpgYXJyYXlgLHZhbHVlOmBudW1iZXJgLGxlbmd0aDoyLGRlZmF1bHQ6WzAsMF0sdHJhbnNpdGlvbjohMCx1bml0czpgcGl4ZWxzYCxyZXF1aXJlczpbYHRleHQtZmllbGRgXSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sInRleHQtdHJhbnNsYXRlLWFuY2hvciI6e3R5cGU6YGVudW1gLHZhbHVlczp7bWFwOnt9LHZpZXdwb3J0Ont9fSxkZWZhdWx0OmBtYXBgLHJlcXVpcmVzOltgdGV4dC1maWVsZGAsYHRleHQtdHJhbnNsYXRlYF0sZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9fSxwYWludF9yYXN0ZXI6eyJyYXN0ZXItb3BhY2l0eSI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDoxLG1pbmltdW06MCxtYXhpbXVtOjEsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sInJhc3Rlci1odWUtcm90YXRlIjp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjAscGVyaW9kOjM2MCx0cmFuc2l0aW9uOiEwLHVuaXRzOmBkZWdyZWVzYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sInJhc3Rlci1icmlnaHRuZXNzLW1pbiI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDowLG1pbmltdW06MCxtYXhpbXVtOjEsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sInJhc3Rlci1icmlnaHRuZXNzLW1heCI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDoxLG1pbmltdW06MCxtYXhpbXVtOjEsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sInJhc3Rlci1zYXR1cmF0aW9uIjp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjAsbWluaW11bTotMSxtYXhpbXVtOjEsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sInJhc3Rlci1jb250cmFzdCI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDowLG1pbmltdW06LTEsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LHJlc2FtcGxpbmc6e3R5cGU6YGVudW1gLHZhbHVlczp7bGluZWFyOnt9LG5lYXJlc3Q6e319LGRlZmF1bHQ6YGxpbmVhcmAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJyYXN0ZXItcmVzYW1wbGluZyI6e3R5cGU6YGVudW1gLHZhbHVlczp7bGluZWFyOnt9LG5lYXJlc3Q6e319LGRlZmF1bHQ6YGxpbmVhcmAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJyYXN0ZXItZmFkZS1kdXJhdGlvbiI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDozMDAsbWluaW11bTowLHRyYW5zaXRpb246ITEsdW5pdHM6YG1pbGxpc2Vjb25kc2AsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9fSxwYWludF9oaWxsc2hhZGU6eyJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvbiI6e3R5cGU6YG51bWJlckFycmF5YCxkZWZhdWx0OjMzNSxtaW5pbXVtOjAsbWF4aW11bTozNTksdHJhbnNpdGlvbjohMSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYWx0aXR1ZGUiOnt0eXBlOmBudW1iZXJBcnJheWAsZGVmYXVsdDo0NSxtaW5pbXVtOjAsbWF4aW11bTo5MCx0cmFuc2l0aW9uOiExLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3IiOnt0eXBlOmBlbnVtYCx2YWx1ZXM6e21hcDp7fSx2aWV3cG9ydDp7fX0sZGVmYXVsdDpgdmlld3BvcnRgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiaGlsbHNoYWRlLWV4YWdnZXJhdGlvbiI6e3R5cGU6YG51bWJlcmAsZGVmYXVsdDouNSxtaW5pbXVtOjAsbWF4aW11bToxLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yIjp7dHlwZTpgY29sb3JBcnJheWAsZGVmYXVsdDpgIzAwMDAwMGAsdHJhbnNpdGlvbjohMCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3IiOnt0eXBlOmBjb2xvckFycmF5YCxkZWZhdWx0OmAjRkZGRkZGYCx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiaGlsbHNoYWRlLWFjY2VudC1jb2xvciI6e3R5cGU6YGNvbG9yYCxkZWZhdWx0OmAjMDAwMDAwYCx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiaGlsbHNoYWRlLW1ldGhvZCI6e3R5cGU6YGVudW1gLHZhbHVlczp7c3RhbmRhcmQ6e30sYmFzaWM6e30sY29tYmluZWQ6e30saWdvcjp7fSxtdWx0aWRpcmVjdGlvbmFsOnt9fSxkZWZhdWx0OmBzdGFuZGFyZGAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9LHJlc2FtcGxpbmc6e3R5cGU6YGVudW1gLHZhbHVlczp7bGluZWFyOnt9LG5lYXJlc3Q6e319LGRlZmF1bHQ6YGxpbmVhcmAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgZGF0YS1jb25zdGFudGB9fSwicGFpbnRfY29sb3ItcmVsaWVmIjp7ImNvbG9yLXJlbGllZi1vcGFjaXR5Ijp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjEsbWluaW11bTowLG1heGltdW06MSx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfSwiY29sb3ItcmVsaWVmLWNvbG9yIjp7dHlwZTpgY29sb3JgLHRyYW5zaXRpb246ITEsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiEwLHBhcmFtZXRlcnM6W2BlbGV2YXRpb25gXX0sInByb3BlcnR5LXR5cGUiOmBjb2xvci1yYW1wYH0scmVzYW1wbGluZzp7dHlwZTpgZW51bWAsdmFsdWVzOntsaW5lYXI6e30sbmVhcmVzdDp7fX0sZGVmYXVsdDpgbGluZWFyYCxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITEscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH19LHBhaW50X2JhY2tncm91bmQ6eyJiYWNrZ3JvdW5kLWNvbG9yIjp7dHlwZTpgY29sb3JgLGRlZmF1bHQ6YCMwMDAwMDBgLHRyYW5zaXRpb246ITAscmVxdWlyZXM6W3siISI6YGJhY2tncm91bmQtcGF0dGVybmB9XSxleHByZXNzaW9uOntpbnRlcnBvbGF0ZWQ6ITAscGFyYW1ldGVyczpbYHpvb21gXX0sInByb3BlcnR5LXR5cGUiOmBkYXRhLWNvbnN0YW50YH0sImJhY2tncm91bmQtcGF0dGVybiI6e3R5cGU6YHJlc29sdmVkSW1hZ2VgLHRyYW5zaXRpb246ITAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYF19LCJwcm9wZXJ0eS10eXBlIjpgY3Jvc3MtZmFkZWRgfSwiYmFja2dyb3VuZC1vcGFjaXR5Ijp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjEsbWluaW11bTowLG1heGltdW06MSx0cmFuc2l0aW9uOiEwLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMCxwYXJhbWV0ZXJzOltgem9vbWBdfSwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgfX0sdHJhbnNpdGlvbjp7ZHVyYXRpb246e3R5cGU6YG51bWJlcmAsZGVmYXVsdDozMDAsbWluaW11bTowLHVuaXRzOmBtaWxsaXNlY29uZHNgfSxkZWxheTp7dHlwZTpgbnVtYmVyYCxkZWZhdWx0OjAsbWluaW11bTowLHVuaXRzOmBtaWxsaXNlY29uZHNgfX0sInByb3BlcnR5LXR5cGUiOnsiZGF0YS1kcml2ZW4iOnt0eXBlOmBwcm9wZXJ0eS10eXBlYH0sImNyb3NzLWZhZGVkIjp7dHlwZTpgcHJvcGVydHktdHlwZWB9LCJjcm9zcy1mYWRlZC1kYXRhLWRyaXZlbiI6e3R5cGU6YHByb3BlcnR5LXR5cGVgfSwiY29sb3ItcmFtcCI6e3R5cGU6YHByb3BlcnR5LXR5cGVgfSwiZGF0YS1jb25zdGFudCI6e3R5cGU6YHByb3BlcnR5LXR5cGVgfSxjb25zdGFudDp7dHlwZTpgcHJvcGVydHktdHlwZWB9fSxwcm9tb3RlSWQ6eyIqIjp7dHlwZTpgc3RyaW5nYH19LGludGVycG9sYXRpb246e3R5cGU6YGFycmF5YCx2YWx1ZTpgaW50ZXJwb2xhdGlvbl9uYW1lYCxtaW5pbXVtOjF9LGludGVycG9sYXRpb25fbmFtZTp7dHlwZTpgZW51bWAsdmFsdWVzOntsaW5lYXI6e3N5bnRheDp7b3ZlcmxvYWRzOlt7cGFyYW1ldGVyczpbXSwib3V0cHV0LXR5cGUiOmBpbnRlcnBvbGF0aW9uYH1dLHBhcmFtZXRlcnM6W119fSxleHBvbmVudGlhbDp7c3ludGF4OntvdmVybG9hZHM6W3twYXJhbWV0ZXJzOltgYmFzZWBdLCJvdXRwdXQtdHlwZSI6YGludGVycG9sYXRpb25gfV0scGFyYW1ldGVyczpbe25hbWU6YGJhc2VgLHR5cGU6YG51bWJlciBsaXRlcmFsYH1dfX0sImN1YmljLWJlemllciI6e3N5bnRheDp7b3ZlcmxvYWRzOlt7cGFyYW1ldGVyczpbYHgxYCxgeTFgLGB4MmAsYHkyYF0sIm91dHB1dC10eXBlIjpgaW50ZXJwb2xhdGlvbmB9XSxwYXJhbWV0ZXJzOlt7bmFtZTpgeDFgLHR5cGU6YG51bWJlciBsaXRlcmFsYH0se25hbWU6YHkxYCx0eXBlOmBudW1iZXIgbGl0ZXJhbGB9LHtuYW1lOmB4MmAsdHlwZTpgbnVtYmVyIGxpdGVyYWxgfSx7bmFtZTpgeTJgLHR5cGU6YG51bWJlciBsaXRlcmFsYH1dfX19fX07Y29uc3QgTT1Sbix6bj1bYHR5cGVgLGBzb3VyY2VgLGBzb3VyY2UtbGF5ZXJgLGBtaW56b29tYCxgbWF4em9vbWAsYGZpbHRlcmAsYGxheW91dGBdO3ZhciBOPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLHIsaT1gZXJyb3JgKXt0aGlzLm1lc3NhZ2U9KGU/YCR7ZX06IGA6YGApK24sciYmKHRoaXMuaWRlbnRpZmllcj1yKSx0aGlzLnNldmVyaXR5PWksdCE9bnVsbCYmdC5fX2xpbmVfXyYmKHRoaXMubGluZT10Ll9fbGluZV9fKX19O2NvbnN0IEJuPXtraW5kOmBudWxsYH0sUD17a2luZDpgbnVtYmVyYH0sRj17a2luZDpgc3RyaW5nYH0sST17a2luZDpgYm9vbGVhbmB9LFZuPXtraW5kOmBjb2xvcmB9LEhuPXtraW5kOmBwcm9qZWN0aW9uRGVmaW5pdGlvbmB9LFVuPXtraW5kOmBvYmplY3RgfSxMPXtraW5kOmB2YWx1ZWB9LFduPXtraW5kOmBlcnJvcmB9LEduPXtraW5kOmBjb2xsYXRvcmB9LEtuPXtraW5kOmBmb3JtYXR0ZWRgfSxxbj17a2luZDpgcGFkZGluZ2B9LEpuPXtraW5kOmBjb2xvckFycmF5YH0sWW49e2tpbmQ6YG51bWJlckFycmF5YH0sWG49e2tpbmQ6YHJlc29sdmVkSW1hZ2VgfSxabj17a2luZDpgdmFyaWFibGVBbmNob3JPZmZzZXRDb2xsZWN0aW9uYH07ZnVuY3Rpb24gUW4oZSx0KXtyZXR1cm57a2luZDpgYXJyYXlgLGl0ZW1UeXBlOmUsTjp0fX1mdW5jdGlvbiBSKGUpe2lmKGUua2luZD09PWBhcnJheWApe2xldCB0PVIoZS5pdGVtVHlwZSk7cmV0dXJuIHR5cGVvZiBlLk49PWBudW1iZXJgP2BhcnJheTwke3R9LCAke2UuTn0+YDplLml0ZW1UeXBlLmtpbmQ9PT1gdmFsdWVgP2BhcnJheWA6YGFycmF5PCR7dH0+YH1yZXR1cm4gZS5raW5kfWNvbnN0ICRuPVtCbixQLEYsSSxWbixIbixLbixVbixRbihMKSxxbixZbixKbixYbixabl07ZnVuY3Rpb24gZXIoZSx0KXtpZih0LmtpbmQ9PT1gZXJyb3JgKXJldHVybiBudWxsO2lmKGUua2luZD09PWBhcnJheWApe2lmKHQua2luZD09PWBhcnJheWAmJih0Lk49PT0wJiZ0Lml0ZW1UeXBlLmtpbmQ9PT1gdmFsdWVgfHwhZXIoZS5pdGVtVHlwZSx0Lml0ZW1UeXBlKSkmJih0eXBlb2YgZS5OIT1gbnVtYmVyYHx8ZS5OPT09dC5OKSlyZXR1cm4gbnVsbH1lbHNlIGlmKGUua2luZD09PXQua2luZClyZXR1cm4gbnVsbDtlbHNlIGlmKGUua2luZD09PWB2YWx1ZWApe2ZvcihsZXQgZSBvZiAkbilpZighZXIoZSx0KSlyZXR1cm4gbnVsbH1yZXR1cm5gRXhwZWN0ZWQgJHtSKGUpfSBidXQgZm91bmQgJHtSKHQpfSBpbnN0ZWFkLmB9ZnVuY3Rpb24gdHIoZSx0KXtyZXR1cm4gdC5zb21lKHQ9PnQua2luZD09PWUua2luZCl9ZnVuY3Rpb24gbnIoZSx0KXtyZXR1cm4gdC5zb21lKHQ9PnQ9PT1gbnVsbGA/ZT09PW51bGw6dD09PWBhcnJheWA/QXJyYXkuaXNBcnJheShlKTp0PT09YG9iamVjdGA/ZSYmIUFycmF5LmlzQXJyYXkoZSkmJnR5cGVvZiBlPT1gb2JqZWN0YDp0PT09dHlwZW9mIGUpfWZ1bmN0aW9uIHJyKGUsdCl7cmV0dXJuIGUua2luZD09PWBhcnJheWAmJnQua2luZD09PWBhcnJheWA/ZS5pdGVtVHlwZS5raW5kPT09dC5pdGVtVHlwZS5raW5kJiZ0eXBlb2YgZS5OPT1gbnVtYmVyYDplLmtpbmQ9PT10LmtpbmR9Y29uc3QgaXI9Ljk2NDIyLGFyPS44MjUyMSxvcj00LzI5LHNyPTYvMjksY3I9Mypzcipzcixscj1NYXRoLlBJLzE4MCx1cj0xODAvTWF0aC5QSTtmdW5jdGlvbiBkcihlKXtyZXR1cm4gZSU9MzYwLGU8MCYmKGUrPTM2MCksZX1mdW5jdGlvbiBmcihbZSx0LG4scl0pe2U9cHIoZSksdD1wcih0KSxuPXByKG4pO2xldCBpLGEsbz1tcigoLjIyMjUwNDUqZSsuNzE2ODc4Nip0Ky4wNjA2MTY5Km4pLzEpO2U9PT10JiZ0PT09bj9pPWE9bzooaT1tcigoLjQzNjA3NDcqZSsuMzg1MDY0OSp0Ky4xNDMwODA0Km4pL2lyKSxhPW1yKCguMDEzOTMyMiplKy4wOTcxMDQ1KnQrLjcxNDE3MzMqbikvYXIpKTtsZXQgcz0xMTYqby0xNjtyZXR1cm5bczwwPzA6cyw1MDAqKGktbyksMjAwKihvLWEpLHJdfWZ1bmN0aW9uIHByKGUpe3JldHVybiBlPD0uMDQwNDU/ZS8xMi45MjooKGUrLjA1NSkvMS4wNTUpKioyLjR9ZnVuY3Rpb24gbXIoZSl7cmV0dXJuIGU+LjAwODg1NjQ1MTY3OTAzNTYzMT9lKiooMS8zKTplL2NyK29yfWZ1bmN0aW9uIGhyKFtlLHQsbixyXSl7bGV0IGk9KGUrMTYpLzExNixhPWlzTmFOKHQpP2k6aSt0LzUwMCxvPWlzTmFOKG4pP2k6aS1uLzIwMDtyZXR1cm4gaT0xKl9yKGkpLGE9aXIqX3IoYSksbz1hcipfcihvKSxbZ3IoMy4xMzM4NTYxKmEtMS42MTY4NjY3KmktLjQ5MDYxNDYqbyksZ3IoLS45Nzg3Njg0KmErMS45MTYxNDE1KmkrLjAzMzQ1NCpvKSxnciguMDcxOTQ1MyphLS4yMjg5OTE0KmkrMS40MDUyNDI3Km8pLHJdfWZ1bmN0aW9uIGdyKGUpe3JldHVybiBlPWU8PS4wMDMwND8xMi45MiplOjEuMDU1KmUqKigxLzIuNCktLjA1NSxlPDA/MDplPjE/MTplfWZ1bmN0aW9uIF9yKGUpe3JldHVybiBlPnNyP2UqZSplOmNyKihlLW9yKX1mdW5jdGlvbiB2cihlKXtsZXRbdCxuLHIsaV09ZnIoZSksYT1NYXRoLnNxcnQobipuK3Iqcik7cmV0dXJuW01hdGgucm91bmQoYSoxZTQpP2RyKE1hdGguYXRhbjIocixuKSp1cik6TmFOLGEsdCxpXX1mdW5jdGlvbiB5cihbZSx0LG4scl0pe3JldHVybiBlPWlzTmFOKGUpPzA6ZSpscixocihbbixNYXRoLmNvcyhlKSp0LE1hdGguc2luKGUpKnQscl0pfWZ1bmN0aW9uIGJyKFtlLHQsbixyXSl7ZT1kcihlKSx0Lz0xMDAsbi89MTAwO2Z1bmN0aW9uIGkocil7bGV0IGk9KHIrZS8zMCklMTIsYT10Kk1hdGgubWluKG4sMS1uKTtyZXR1cm4gbi1hKk1hdGgubWF4KC0xLE1hdGgubWluKGktMyw5LWksMSkpfXJldHVybltpKDApLGkoOCksaSg0KSxyXX1jb25zdCB4cj1PYmplY3QuaGFzT3dufHxmdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX07ZnVuY3Rpb24gU3IoZSx0KXtyZXR1cm4geHIoZSx0KT9lW3RdOnZvaWQgMH1mdW5jdGlvbiBDcihlKXtpZihlPWUudG9Mb3dlckNhc2UoKS50cmltKCksZT09PWB0cmFuc3BhcmVudGApcmV0dXJuWzAsMCwwLDBdO2xldCB0PVNyKE9yLGUpO2lmKHQpe2xldFtlLG4scl09dDtyZXR1cm5bZS8yNTUsbi8yNTUsci8yNTUsMV19aWYoZS5zdGFydHNXaXRoKGAjYCkmJi9eIyg/OlswLTlhLWZdezMsNH18WzAtOWEtZl17Nn18WzAtOWEtZl17OH0pJC8udGVzdChlKSl7bGV0IHQ9ZS5sZW5ndGg8Nj8xOjIsbj0xO3JldHVyblt3cihlLnNsaWNlKG4sbis9dCkpLHdyKGUuc2xpY2UobixuKz10KSksd3IoZS5zbGljZShuLG4rPXQpKSx3cihlLnNsaWNlKG4sbit0KXx8YGZmYCldfWlmKGUuc3RhcnRzV2l0aChgcmdiYCkpe2xldCB0PWUubWF0Y2goL15yZ2JhP1woXHMqKFtcZGUuKy1dKykoJSk/KD86XHMrfFxzKigsKVxzKikoW1xkZS4rLV0rKSglKT8oPzpccyt8XHMqKCwpXHMqKShbXGRlListXSspKCUpPyg/OlxzKihbLFwvXSlccyooW1xkZS4rLV0rKSglKT8pP1xzKlwpJC8pO2lmKHQpe2xldFtlLG4scixpLGEsbyxzLGMsbCx1LGQsZl09dCxwPVtpfHxgIGAsc3x8YCBgLHVdLmpvaW4oYGApO2lmKHA9PT1gICBgfHxwPT09YCAgL2B8fHA9PT1gLCxgfHxwPT09YCwsLGApe2xldCBlPVtyLG8sbF0uam9pbihgYCksdD1lPT09YCUlJWA/MTAwOmU9PT1gYD8yNTU6MDtpZih0KXtsZXQgZT1bRXIoK24vdCwwLDEpLEVyKCthL3QsMCwxKSxFcigrYy90LDAsMSksZD9UcigrZCxmKToxXTtpZihEcihlKSlyZXR1cm4gZX19cmV0dXJufX1sZXQgbj1lLm1hdGNoKC9eaHNsYT9cKFxzKihbXGRlListXSspKD86ZGVnKT8oPzpccyt8XHMqKCwpXHMqKShbXGRlListXSspJSg/OlxzK3xccyooLClccyopKFtcZGUuKy1dKyklKD86XHMqKFssXC9dKVxzKihbXGRlListXSspKCUpPyk/XHMqXCkkLyk7aWYobil7bGV0W2UsdCxyLGksYSxvLHMsYyxsXT1uLHU9W3J8fGAgYCxhfHxgIGAsc10uam9pbihgYCk7aWYodT09PWAgIGB8fHU9PT1gICAvYHx8dT09PWAsLGB8fHU9PT1gLCwsYCl7bGV0IGU9Wyt0LEVyKCtpLDAsMTAwKSxFcigrbywwLDEwMCksYz9UcigrYyxsKToxXTtpZihEcihlKSlyZXR1cm4gYnIoZSl9fX1mdW5jdGlvbiB3cihlKXtyZXR1cm4gcGFyc2VJbnQoZS5wYWRFbmQoMixlKSwxNikvMjU1fWZ1bmN0aW9uIFRyKGUsdCl7cmV0dXJuIEVyKHQ/ZS8xMDA6ZSwwLDEpfWZ1bmN0aW9uIEVyKGUsdCxuKXtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodCxlKSxuKX1mdW5jdGlvbiBEcihlKXtyZXR1cm4hZS5zb21lKE51bWJlci5pc05hTil9Y29uc3QgT3I9e2FsaWNlYmx1ZTpbMjQwLDI0OCwyNTVdLGFudGlxdWV3aGl0ZTpbMjUwLDIzNSwyMTVdLGFxdWE6WzAsMjU1LDI1NV0sYXF1YW1hcmluZTpbMTI3LDI1NSwyMTJdLGF6dXJlOlsyNDAsMjU1LDI1NV0sYmVpZ2U6WzI0NSwyNDUsMjIwXSxiaXNxdWU6WzI1NSwyMjgsMTk2XSxibGFjazpbMCwwLDBdLGJsYW5jaGVkYWxtb25kOlsyNTUsMjM1LDIwNV0sYmx1ZTpbMCwwLDI1NV0sYmx1ZXZpb2xldDpbMTM4LDQzLDIyNl0sYnJvd246WzE2NSw0Miw0Ml0sYnVybHl3b29kOlsyMjIsMTg0LDEzNV0sY2FkZXRibHVlOls5NSwxNTgsMTYwXSxjaGFydHJldXNlOlsxMjcsMjU1LDBdLGNob2NvbGF0ZTpbMjEwLDEwNSwzMF0sY29yYWw6WzI1NSwxMjcsODBdLGNvcm5mbG93ZXJibHVlOlsxMDAsMTQ5LDIzN10sY29ybnNpbGs6WzI1NSwyNDgsMjIwXSxjcmltc29uOlsyMjAsMjAsNjBdLGN5YW46WzAsMjU1LDI1NV0sZGFya2JsdWU6WzAsMCwxMzldLGRhcmtjeWFuOlswLDEzOSwxMzldLGRhcmtnb2xkZW5yb2Q6WzE4NCwxMzQsMTFdLGRhcmtncmF5OlsxNjksMTY5LDE2OV0sZGFya2dyZWVuOlswLDEwMCwwXSxkYXJrZ3JleTpbMTY5LDE2OSwxNjldLGRhcmtraGFraTpbMTg5LDE4MywxMDddLGRhcmttYWdlbnRhOlsxMzksMCwxMzldLGRhcmtvbGl2ZWdyZWVuOls4NSwxMDcsNDddLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMF0sZGFya29yY2hpZDpbMTUzLDUwLDIwNF0sZGFya3JlZDpbMTM5LDAsMF0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjJdLGRhcmtzZWFncmVlbjpbMTQzLDE4OCwxNDNdLGRhcmtzbGF0ZWJsdWU6WzcyLDYxLDEzOV0sZGFya3NsYXRlZ3JheTpbNDcsNzksNzldLGRhcmtzbGF0ZWdyZXk6WzQ3LDc5LDc5XSxkYXJrdHVycXVvaXNlOlswLDIwNiwyMDldLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMV0sZGVlcHBpbms6WzI1NSwyMCwxNDddLGRlZXBza3libHVlOlswLDE5MSwyNTVdLGRpbWdyYXk6WzEwNSwxMDUsMTA1XSxkaW1ncmV5OlsxMDUsMTA1LDEwNV0sZG9kZ2VyYmx1ZTpbMzAsMTQ0LDI1NV0sZmlyZWJyaWNrOlsxNzgsMzQsMzRdLGZsb3JhbHdoaXRlOlsyNTUsMjUwLDI0MF0sZm9yZXN0Z3JlZW46WzM0LDEzOSwzNF0sZnVjaHNpYTpbMjU1LDAsMjU1XSxnYWluc2Jvcm86WzIyMCwyMjAsMjIwXSxnaG9zdHdoaXRlOlsyNDgsMjQ4LDI1NV0sZ29sZDpbMjU1LDIxNSwwXSxnb2xkZW5yb2Q6WzIxOCwxNjUsMzJdLGdyYXk6WzEyOCwxMjgsMTI4XSxncmVlbjpbMCwxMjgsMF0sZ3JlZW55ZWxsb3c6WzE3MywyNTUsNDddLGdyZXk6WzEyOCwxMjgsMTI4XSxob25leWRldzpbMjQwLDI1NSwyNDBdLGhvdHBpbms6WzI1NSwxMDUsMTgwXSxpbmRpYW5yZWQ6WzIwNSw5Miw5Ml0saW5kaWdvOls3NSwwLDEzMF0saXZvcnk6WzI1NSwyNTUsMjQwXSxraGFraTpbMjQwLDIzMCwxNDBdLGxhdmVuZGVyOlsyMzAsMjMwLDI1MF0sbGF2ZW5kZXJibHVzaDpbMjU1LDI0MCwyNDVdLGxhd25ncmVlbjpbMTI0LDI1MiwwXSxsZW1vbmNoaWZmb246WzI1NSwyNTAsMjA1XSxsaWdodGJsdWU6WzE3MywyMTYsMjMwXSxsaWdodGNvcmFsOlsyNDAsMTI4LDEyOF0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NV0sbGlnaHRnb2xkZW5yb2R5ZWxsb3c6WzI1MCwyNTAsMjEwXSxsaWdodGdyYXk6WzIxMSwyMTEsMjExXSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NF0sbGlnaHRncmV5OlsyMTEsMjExLDIxMV0sbGlnaHRwaW5rOlsyNTUsMTgyLDE5M10sbGlnaHRzYWxtb246WzI1NSwxNjAsMTIyXSxsaWdodHNlYWdyZWVuOlszMiwxNzgsMTcwXSxsaWdodHNreWJsdWU6WzEzNSwyMDYsMjUwXSxsaWdodHNsYXRlZ3JheTpbMTE5LDEzNiwxNTNdLGxpZ2h0c2xhdGVncmV5OlsxMTksMTM2LDE1M10sbGlnaHRzdGVlbGJsdWU6WzE3NiwxOTYsMjIyXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjRdLGxpbWU6WzAsMjU1LDBdLGxpbWVncmVlbjpbNTAsMjA1LDUwXSxsaW5lbjpbMjUwLDI0MCwyMzBdLG1hZ2VudGE6WzI1NSwwLDI1NV0sbWFyb29uOlsxMjgsMCwwXSxtZWRpdW1hcXVhbWFyaW5lOlsxMDIsMjA1LDE3MF0sbWVkaXVtYmx1ZTpbMCwwLDIwNV0sbWVkaXVtb3JjaGlkOlsxODYsODUsMjExXSxtZWRpdW1wdXJwbGU6WzE0NywxMTIsMjE5XSxtZWRpdW1zZWFncmVlbjpbNjAsMTc5LDExM10sbWVkaXVtc2xhdGVibHVlOlsxMjMsMTA0LDIzOF0sbWVkaXVtc3ByaW5nZ3JlZW46WzAsMjUwLDE1NF0sbWVkaXVtdHVycXVvaXNlOls3MiwyMDksMjA0XSxtZWRpdW12aW9sZXRyZWQ6WzE5OSwyMSwxMzNdLG1pZG5pZ2h0Ymx1ZTpbMjUsMjUsMTEyXSxtaW50Y3JlYW06WzI0NSwyNTUsMjUwXSxtaXN0eXJvc2U6WzI1NSwyMjgsMjI1XSxtb2NjYXNpbjpbMjU1LDIyOCwxODFdLG5hdmFqb3doaXRlOlsyNTUsMjIyLDE3M10sbmF2eTpbMCwwLDEyOF0sb2xkbGFjZTpbMjUzLDI0NSwyMzBdLG9saXZlOlsxMjgsMTI4LDBdLG9saXZlZHJhYjpbMTA3LDE0MiwzNV0sb3JhbmdlOlsyNTUsMTY1LDBdLG9yYW5nZXJlZDpbMjU1LDY5LDBdLG9yY2hpZDpbMjE4LDExMiwyMTRdLHBhbGVnb2xkZW5yb2Q6WzIzOCwyMzIsMTcwXSxwYWxlZ3JlZW46WzE1MiwyNTEsMTUyXSxwYWxldHVycXVvaXNlOlsxNzUsMjM4LDIzOF0scGFsZXZpb2xldHJlZDpbMjE5LDExMiwxNDddLHBhcGF5YXdoaXA6WzI1NSwyMzksMjEzXSxwZWFjaHB1ZmY6WzI1NSwyMTgsMTg1XSxwZXJ1OlsyMDUsMTMzLDYzXSxwaW5rOlsyNTUsMTkyLDIwM10scGx1bTpbMjIxLDE2MCwyMjFdLHBvd2RlcmJsdWU6WzE3NiwyMjQsMjMwXSxwdXJwbGU6WzEyOCwwLDEyOF0scmViZWNjYXB1cnBsZTpbMTAyLDUxLDE1M10scmVkOlsyNTUsMCwwXSxyb3N5YnJvd246WzE4OCwxNDMsMTQzXSxyb3lhbGJsdWU6WzY1LDEwNSwyMjVdLHNhZGRsZWJyb3duOlsxMzksNjksMTldLHNhbG1vbjpbMjUwLDEyOCwxMTRdLHNhbmR5YnJvd246WzI0NCwxNjQsOTZdLHNlYWdyZWVuOls0NiwxMzksODddLHNlYXNoZWxsOlsyNTUsMjQ1LDIzOF0sc2llbm5hOlsxNjAsODIsNDVdLHNpbHZlcjpbMTkyLDE5MiwxOTJdLHNreWJsdWU6WzEzNSwyMDYsMjM1XSxzbGF0ZWJsdWU6WzEwNiw5MCwyMDVdLHNsYXRlZ3JheTpbMTEyLDEyOCwxNDRdLHNsYXRlZ3JleTpbMTEyLDEyOCwxNDRdLHNub3c6WzI1NSwyNTAsMjUwXSxzcHJpbmdncmVlbjpbMCwyNTUsMTI3XSxzdGVlbGJsdWU6WzcwLDEzMCwxODBdLHRhbjpbMjEwLDE4MCwxNDBdLHRlYWw6WzAsMTI4LDEyOF0sdGhpc3RsZTpbMjE2LDE5MSwyMTZdLHRvbWF0bzpbMjU1LDk5LDcxXSx0dXJxdW9pc2U6WzY0LDIyNCwyMDhdLHZpb2xldDpbMjM4LDEzMCwyMzhdLHdoZWF0OlsyNDUsMjIyLDE3OV0sd2hpdGU6WzI1NSwyNTUsMjU1XSx3aGl0ZXNtb2tlOlsyNDUsMjQ1LDI0NV0seWVsbG93OlsyNTUsMjU1LDBdLHllbGxvd2dyZWVuOlsxNTQsMjA1LDUwXX07ZnVuY3Rpb24ga3IoZSx0LG4pe3JldHVybiBlK24qKHQtZSl9ZnVuY3Rpb24gQXIoZSx0LG4pe3JldHVybiBlLm1hcCgoZSxyKT0+a3IoZSx0W3JdLG4pKX1mdW5jdGlvbiBqcihlKXtyZXR1cm4gZT09PWByZ2JgfHxlPT09YGhjbGB8fGU9PT1gbGFiYH12YXIgej1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCxuLHI9MSxpPSEwKXt0aGlzLnI9ZSx0aGlzLmc9dCx0aGlzLmI9bix0aGlzLmE9cixpfHwodGhpcy5yKj1yLHRoaXMuZyo9cix0aGlzLmIqPXIscnx8dGhpcy5vdmVyd3JpdGVHZXR0ZXIoYHJnYmAsW2UsdCxuLHJdKSl9c3RhdGlje3RoaXMuYmxhY2s9bmV3IGUoMCwwLDAsMSl9c3RhdGlje3RoaXMud2hpdGU9bmV3IGUoMSwxLDEsMSl9c3RhdGlje3RoaXMudHJhbnNwYXJlbnQ9bmV3IGUoMCwwLDAsMCl9c3RhdGlje3RoaXMucmVkPW5ldyBlKDEsMCwwLDEpfXN0YXRpYyBwYXJzZSh0KXtpZih0IGluc3RhbmNlb2YgZSlyZXR1cm4gdDtpZih0eXBlb2YgdCE9YHN0cmluZ2ApcmV0dXJuO2xldCBuPUNyKHQpO2lmKG4pcmV0dXJuIG5ldyBlKC4uLm4sITEpfWdldCByZ2IoKXtsZXR7cjplLGc6dCxiOm4sYTpyfT10aGlzLGk9cnx8MS8wO3JldHVybiB0aGlzLm92ZXJ3cml0ZUdldHRlcihgcmdiYCxbZS9pLHQvaSxuL2kscl0pfWdldCBoY2woKXtyZXR1cm4gdGhpcy5vdmVyd3JpdGVHZXR0ZXIoYGhjbGAsdnIodGhpcy5yZ2IpKX1nZXQgbGFiKCl7cmV0dXJuIHRoaXMub3ZlcndyaXRlR2V0dGVyKGBsYWJgLGZyKHRoaXMucmdiKSl9b3ZlcndyaXRlR2V0dGVyKGUsdCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse3ZhbHVlOnR9KSx0fXRvU3RyaW5nKCl7bGV0W2UsdCxuLHJdPXRoaXMucmdiO3JldHVybmByZ2JhKCR7W2UsdCxuXS5tYXAoZT0+TWF0aC5yb3VuZChlKjI1NSkpLmpvaW4oYCxgKX0sJHtyfSlgfXN0YXRpYyBpbnRlcnBvbGF0ZSh0LG4scixpPWByZ2JgKXtzd2l0Y2goaSl7Y2FzZWByZ2JgOntsZXRbaSxhLG8sc109QXIodC5yZ2Isbi5yZ2Iscik7cmV0dXJuIG5ldyBlKGksYSxvLHMsITEpfWNhc2VgaGNsYDp7bGV0W2ksYSxvLHNdPXQuaGNsLFtjLGwsdSxkXT1uLmhjbCxmLHA7aWYoIWlzTmFOKGkpJiYhaXNOYU4oYykpe2xldCBlPWMtaTtjPmkmJmU+MTgwP2UtPTM2MDpjPGkmJmktYz4xODAmJihlKz0zNjApLGY9aStyKmV9ZWxzZSBpc05hTihpKT9pc05hTihjKT9mPU5hTjooZj1jLChvPT09MXx8bz09PTApJiYocD1sKSk6KGY9aSwodT09PTF8fHU9PT0wKSYmKHA9YSkpO2xldFttLGgsZyxfXT15cihbZixwPz9rcihhLGwsciksa3Iobyx1LHIpLGtyKHMsZCxyKV0pO3JldHVybiBuZXcgZShtLGgsZyxfLCExKX1jYXNlYGxhYmA6e2xldFtpLGEsbyxzXT1ocihBcih0LmxhYixuLmxhYixyKSk7cmV0dXJuIG5ldyBlKGksYSxvLHMsITEpfX19fTtjb25zdCBNcj1bYGJvdHRvbWAsYGNlbnRlcmAsYHRvcGBdO3ZhciBOcj1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbixyLGksYSl7dGhpcy50ZXh0PWUsdGhpcy5pbWFnZT10LHRoaXMuc2NhbGU9bix0aGlzLmZvbnRTdGFjaz1yLHRoaXMudGV4dENvbG9yPWksdGhpcy52ZXJ0aWNhbEFsaWduPWF9fSxQcj1jbGFzcyBle2NvbnN0cnVjdG9yKGUpe3RoaXMuc2VjdGlvbnM9ZX1zdGF0aWMgZnJvbVN0cmluZyh0KXtyZXR1cm4gbmV3IGUoW25ldyBOcih0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCldKX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMuc2VjdGlvbnMubGVuZ3RoPT09MHx8IXRoaXMuc2VjdGlvbnMuc29tZShlPT5lLnRleHQubGVuZ3RoIT09MHx8ZS5pbWFnZSYmZS5pbWFnZS5uYW1lLmxlbmd0aCE9PTApfXN0YXRpYyBmYWN0b3J5KHQpe3JldHVybiB0IGluc3RhbmNlb2YgZT90OmUuZnJvbVN0cmluZyh0KX10b1N0cmluZygpe3JldHVybiB0aGlzLnNlY3Rpb25zLmxlbmd0aD09PTA/YGA6dGhpcy5zZWN0aW9ucy5tYXAoZT0+ZS50ZXh0KS5qb2luKGBgKX19LEZyPWNsYXNzIGV7Y29uc3RydWN0b3IoZSl7dGhpcy52YWx1ZXM9ZS5zbGljZSgpfXN0YXRpYyBwYXJzZSh0KXtpZih0IGluc3RhbmNlb2YgZSlyZXR1cm4gdDtpZih0eXBlb2YgdD09YG51bWJlcmApcmV0dXJuIG5ldyBlKFt0LHQsdCx0XSk7aWYoQXJyYXkuaXNBcnJheSh0KSYmISh0Lmxlbmd0aDwxfHx0Lmxlbmd0aD40KSl7Zm9yKGxldCBlIG9mIHQpaWYodHlwZW9mIGUhPWBudW1iZXJgKXJldHVybjtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTp0PVt0WzBdLHRbMF0sdFswXSx0WzBdXTticmVhaztjYXNlIDI6dD1bdFswXSx0WzFdLHRbMF0sdFsxXV07YnJlYWs7Y2FzZSAzOnQ9W3RbMF0sdFsxXSx0WzJdLHRbMV1dfXJldHVybiBuZXcgZSh0KX19dG9TdHJpbmcoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXMpfXN0YXRpYyBpbnRlcnBvbGF0ZSh0LG4scil7cmV0dXJuIG5ldyBlKEFyKHQudmFsdWVzLG4udmFsdWVzLHIpKX19LElyPWNsYXNzIGV7Y29uc3RydWN0b3IoZSl7dGhpcy52YWx1ZXM9ZS5zbGljZSgpfXN0YXRpYyBwYXJzZSh0KXtpZih0IGluc3RhbmNlb2YgZSlyZXR1cm4gdDtpZih0eXBlb2YgdD09YG51bWJlcmApcmV0dXJuIG5ldyBlKFt0XSk7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKGxldCBlIG9mIHQpaWYodHlwZW9mIGUhPWBudW1iZXJgKXJldHVybjtyZXR1cm4gbmV3IGUodCl9fXRvU3RyaW5nKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudmFsdWVzKX1zdGF0aWMgaW50ZXJwb2xhdGUodCxuLHIpe3JldHVybiBuZXcgZShBcih0LnZhbHVlcyxuLnZhbHVlcyxyKSl9fSxMcj1jbGFzcyBle2NvbnN0cnVjdG9yKGUpe3RoaXMudmFsdWVzPWUuc2xpY2UoKX1zdGF0aWMgcGFyc2UodCl7aWYodCBpbnN0YW5jZW9mIGUpcmV0dXJuIHQ7aWYodHlwZW9mIHQ9PWBzdHJpbmdgKXtsZXQgbj16LnBhcnNlKHQpO3JldHVybiBuP25ldyBlKFtuXSk6dm9pZCAwfWlmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybjtsZXQgbj1bXTtmb3IobGV0IGUgb2YgdCl7aWYodHlwZW9mIGUhPWBzdHJpbmdgKXJldHVybjtsZXQgdD16LnBhcnNlKGUpO2lmKCF0KXJldHVybjtuLnB1c2godCl9cmV0dXJuIG5ldyBlKG4pfXRvU3RyaW5nKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudmFsdWVzKX1zdGF0aWMgaW50ZXJwb2xhdGUodCxuLHIsaT1gcmdiYCl7bGV0IGE9W107aWYodC52YWx1ZXMubGVuZ3RoIT1uLnZhbHVlcy5sZW5ndGgpdGhyb3cgRXJyb3IoYGNvbG9yQXJyYXk6IEFycmF5cyBoYXZlIG1pc21hdGNoZWQgbGVuZ3RoICgke3QudmFsdWVzLmxlbmd0aH0gdnMuICR7bi52YWx1ZXMubGVuZ3RofSksIGNhbm5vdCBpbnRlcnBvbGF0ZS5gKTtmb3IobGV0IGU9MDtlPHQudmFsdWVzLmxlbmd0aDtlKyspYS5wdXNoKHouaW50ZXJwb2xhdGUodC52YWx1ZXNbZV0sbi52YWx1ZXNbZV0scixpKSk7cmV0dXJuIG5ldyBlKGEpfX0sQj1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSksdGhpcy5uYW1lPWBSdW50aW1lRXJyb3JgLHRoaXMucGF0aD10fXRvSlNPTigpe3JldHVybiB0aGlzLm1lc3NhZ2V9fTtjb25zdCBScj1uZXcgU2V0KFtgY2VudGVyYCxgbGVmdGAsYHJpZ2h0YCxgdG9wYCxgYm90dG9tYCxgdG9wLWxlZnRgLGB0b3AtcmlnaHRgLGBib3R0b20tbGVmdGAsYGJvdHRvbS1yaWdodGBdKTt2YXIgenI9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlKXt0aGlzLnZhbHVlcz1lLnNsaWNlKCl9c3RhdGljIHBhcnNlKHQpe2lmKHQgaW5zdGFuY2VvZiBlKXJldHVybiB0O2lmKCEoIUFycmF5LmlzQXJyYXkodCl8fHQubGVuZ3RoPDF8fHQubGVuZ3RoJTIhPTApKXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrPTIpe2xldCBuPXRbZV0scj10W2UrMV07aWYodHlwZW9mIG4hPWBzdHJpbmdgfHwhUnIuaGFzKG4pfHwhQXJyYXkuaXNBcnJheShyKXx8ci5sZW5ndGghPT0yfHx0eXBlb2YgclswXSE9YG51bWJlcmB8fHR5cGVvZiByWzFdIT1gbnVtYmVyYClyZXR1cm59cmV0dXJuIG5ldyBlKHQpfX10b1N0cmluZygpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlcyl9c3RhdGljIGludGVycG9sYXRlKHQsbixyLGkpe2xldCBhPXQudmFsdWVzLG89bi52YWx1ZXM7aWYoYS5sZW5ndGghPT1vLmxlbmd0aCl0aHJvdyBuZXcgQihgQ2Fubm90IGludGVycG9sYXRlIHZhbHVlcyBvZiBkaWZmZXJlbnQgbGVuZ3RoLiBmcm9tOiAke3QudG9TdHJpbmcoKX0sIHRvOiAke24udG9TdHJpbmcoKX1gLGkpO2xldCBzPVtdO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGg7ZSs9Mil7aWYoYVtlXSE9PW9bZV0pdGhyb3cgbmV3IEIoYENhbm5vdCBpbnRlcnBvbGF0ZSB2YWx1ZXMgY29udGFpbmluZyBtaXNtYXRjaGVkIGFuY2hvcnMuIGZyb21bJHtlfV06ICR7YVtlXX0sIHRvWyR7ZX1dOiAke29bZV19YCxpKTtzLnB1c2goYVtlXSk7bGV0W3Qsbl09YVtlKzFdLFtjLGxdPW9bZSsxXTtzLnB1c2goW2tyKHQsYyxyKSxrcihuLGwscildKX1yZXR1cm4gbmV3IGUocyl9fSxCcj1jbGFzcyBle2NvbnN0cnVjdG9yKGUpe3RoaXMubmFtZT1lLm5hbWUsdGhpcy5hdmFpbGFibGU9ZS5hdmFpbGFibGV9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5uYW1lfXN0YXRpYyBmcm9tU3RyaW5nKHQpe3JldHVybiB0P25ldyBlKHtuYW1lOnQsYXZhaWxhYmxlOiExfSk6bnVsbH19LFZyPWNsYXNzIGV7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuZnJvbT1lLHRoaXMudG89dCx0aGlzLnRyYW5zaXRpb249bn10b1N0cmluZygpe3JldHVybiB0aGlzLmZyb209PT10aGlzLnRvJiZ0aGlzLnRyYW5zaXRpb249PT0xP3RoaXMuZnJvbTpKU09OLnN0cmluZ2lmeShbdGhpcy5mcm9tLHRoaXMudG8sdGhpcy50cmFuc2l0aW9uXSl9c3RhdGljIGludGVycG9sYXRlKHQsbixyKXtyZXR1cm4gbmV3IGUodCxuLHIpfXN0YXRpYyBwYXJzZSh0KXtpZih0IGluc3RhbmNlb2YgZSlyZXR1cm4gdDtpZihBcnJheS5pc0FycmF5KHQpJiZ0Lmxlbmd0aD09PTMmJnR5cGVvZiB0WzBdPT1gc3RyaW5nYCYmdHlwZW9mIHRbMV09PWBzdHJpbmdgJiZ0eXBlb2YgdFsyXT09YG51bWJlcmApcmV0dXJuIG5ldyBlKHRbMF0sdFsxXSx0WzJdKTtpZih0eXBlb2YgdD09YG9iamVjdGAmJnR5cGVvZiB0LmZyb209PWBzdHJpbmdgJiZ0eXBlb2YgdC50bz09YHN0cmluZ2AmJnR5cGVvZiB0LnRyYW5zaXRpb249PWBudW1iZXJgKXJldHVybiBuZXcgZSh0LmZyb20sdC50byx0LnRyYW5zaXRpb24pO2lmKHR5cGVvZiB0PT1gc3RyaW5nYClyZXR1cm4gbmV3IGUodCx0LDEpfX0sSHI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuc2Vuc2l0aXZpdHk9ZT90P2B2YXJpYW50YDpgY2FzZWA6dD9gYWNjZW50YDpgYmFzZWAsdGhpcy5sb2NhbGU9bix0aGlzLmNvbGxhdG9yPW5ldyBJbnRsLkNvbGxhdG9yKHRoaXMubG9jYWxlP3RoaXMubG9jYWxlOltdLHtzZW5zaXRpdml0eTp0aGlzLnNlbnNpdGl2aXR5LHVzYWdlOmBzZWFyY2hgfSl9Y29tcGFyZShlLHQpe3JldHVybiB0aGlzLmNvbGxhdG9yLmNvbXBhcmUoZSx0KX1yZXNvbHZlZExvY2FsZSgpe3JldHVybiBuZXcgSW50bC5Db2xsYXRvcih0aGlzLmxvY2FsZT90aGlzLmxvY2FsZTpbXSkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlfX07ZnVuY3Rpb24gVXIoZSx0LG4scil7cmV0dXJuIHR5cGVvZiBlPT1gbnVtYmVyYCYmZT49MCYmZTw9MjU1JiZ0eXBlb2YgdD09YG51bWJlcmAmJnQ+PTAmJnQ8PTI1NSYmdHlwZW9mIG49PWBudW1iZXJgJiZuPj0wJiZuPD0yNTU/cj09PXZvaWQgMHx8dHlwZW9mIHI9PWBudW1iZXJgJiZyPj0wJiZyPD0xP251bGw6YEludmFsaWQgcmdiYSB2YWx1ZSBbJHtbZSx0LG4scl0uam9pbihgLCBgKX1dOiAnYScgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEuYDpgSW52YWxpZCByZ2JhIHZhbHVlIFskeyh0eXBlb2Ygcj09YG51bWJlcmA/W2UsdCxuLHJdOltlLHQsbl0pLmpvaW4oYCwgYCl9XTogJ3InLCAnZycsIGFuZCAnYicgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NS5gfWZ1bmN0aW9uIFdyKGUpe2lmKGU9PT1udWxsfHx0eXBlb2YgZT09YHN0cmluZ2B8fHR5cGVvZiBlPT1gYm9vbGVhbmB8fHR5cGVvZiBlPT1gbnVtYmVyYHx8ZSBpbnN0YW5jZW9mIFZyfHxlIGluc3RhbmNlb2Ygenx8ZSBpbnN0YW5jZW9mIEhyfHxlIGluc3RhbmNlb2YgUHJ8fGUgaW5zdGFuY2VvZiBGcnx8ZSBpbnN0YW5jZW9mIElyfHxlIGluc3RhbmNlb2YgTHJ8fGUgaW5zdGFuY2VvZiB6cnx8ZSBpbnN0YW5jZW9mIEJyKXJldHVybiEwO2lmKEFycmF5LmlzQXJyYXkoZSkpe2ZvcihsZXQgdCBvZiBlKWlmKCFXcih0KSlyZXR1cm4hMTtyZXR1cm4hMH1pZih0eXBlb2YgZT09YG9iamVjdGApe2ZvcihsZXQgdCBpbiBlKWlmKCFXcihlW3RdKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBHcihlKXtpZihlPT09bnVsbClyZXR1cm4gQm47aWYodHlwZW9mIGU9PWBzdHJpbmdgKXJldHVybiBGO2lmKHR5cGVvZiBlPT1gYm9vbGVhbmApcmV0dXJuIEk7aWYodHlwZW9mIGU9PWBudW1iZXJgKXJldHVybiBQO2lmKGUgaW5zdGFuY2VvZiB6KXJldHVybiBWbjtpZihlIGluc3RhbmNlb2YgVnIpcmV0dXJuIEhuO2lmKGUgaW5zdGFuY2VvZiBIcilyZXR1cm4gR247aWYoZSBpbnN0YW5jZW9mIFByKXJldHVybiBLbjtpZihlIGluc3RhbmNlb2YgRnIpcmV0dXJuIHFuO2lmKGUgaW5zdGFuY2VvZiBJcilyZXR1cm4gWW47aWYoZSBpbnN0YW5jZW9mIExyKXJldHVybiBKbjtpZihlIGluc3RhbmNlb2YgenIpcmV0dXJuIFpuO2lmKGUgaW5zdGFuY2VvZiBCcilyZXR1cm4gWG47aWYoQXJyYXkuaXNBcnJheShlKSl7bGV0IHQ9ZS5sZW5ndGgsbjtmb3IobGV0IHQgb2YgZSl7bGV0IGU9R3IodCk7aWYoIW4pbj1lO2Vsc2UgaWYobj09PWUpY29udGludWU7ZWxzZXtuPUw7YnJlYWt9fXJldHVybiBRbihufHxMLHQpfXJldHVybiBVbn1mdW5jdGlvbiBLcihlKXtsZXQgdD10eXBlb2YgZTtyZXR1cm4gZT09PW51bGw/YGA6dD09PWBzdHJpbmdgfHx0PT09YG51bWJlcmB8fHQ9PT1gYm9vbGVhbmA/U3RyaW5nKGUpOmUgaW5zdGFuY2VvZiB6fHxlIGluc3RhbmNlb2YgVnJ8fGUgaW5zdGFuY2VvZiBQcnx8ZSBpbnN0YW5jZW9mIEZyfHxlIGluc3RhbmNlb2YgSXJ8fGUgaW5zdGFuY2VvZiBMcnx8ZSBpbnN0YW5jZW9mIHpyfHxlIGluc3RhbmNlb2YgQnI/ZS50b1N0cmluZygpOkpTT04uc3RyaW5naWZ5KGUpfXZhciBxcj1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy52YWx1ZT10fXN0YXRpYyBwYXJzZSh0LG4pe2lmKHQubGVuZ3RoIT09MilyZXR1cm4gbi5lcnJvcihgJ2xpdGVyYWwnIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIGJ1dCBmb3VuZCAke3QubGVuZ3RoLTF9IGluc3RlYWQuYCk7aWYoIVdyKHRbMV0pKXJldHVybiBuLmVycm9yKGBpbnZhbGlkIHZhbHVlIG9mIHR5cGUgIiR7dHlwZW9mIHRbMV19ImApO2xldCByPXRbMV0saT1HcihyKSxhPW4uZXhwZWN0ZWRUeXBlO3JldHVybiBpLmtpbmQ9PT1gYXJyYXlgJiZpLk49PT0wJiZhJiZhLmtpbmQ9PT1gYXJyYXlgJiYodHlwZW9mIGEuTiE9YG51bWJlcmB8fGEuTj09PTApJiYoaT1hKSxuZXcgZShpLHIpfWV2YWx1YXRlKCl7cmV0dXJuIHRoaXMudmFsdWV9ZWFjaENoaWxkKCl7fW91dHB1dERlZmluZWQoKXtyZXR1cm4hMH19O2NvbnN0IEpyPVtgVW5rbm93bmAsYFBvaW50YCxgTGluZVN0cmluZ2AsYFBvbHlnb25gXTt2YXIgWXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmdsb2JhbHM9bnVsbCx0aGlzLmZlYXR1cmU9bnVsbCx0aGlzLmZlYXR1cmVTdGF0ZT1udWxsLHRoaXMuZm9ybWF0dGVkU2VjdGlvbj1udWxsLHRoaXMuX3BhcnNlQ29sb3JDYWNoZT1uZXcgTWFwLHRoaXMuYXZhaWxhYmxlSW1hZ2VzPW51bGwsdGhpcy5jYW5vbmljYWw9bnVsbH1pZCgpe3JldHVybiB0aGlzLmZlYXR1cmUmJmBpZGBpbiB0aGlzLmZlYXR1cmU/dGhpcy5mZWF0dXJlLmlkOm51bGx9Z2VvbWV0cnlUeXBlKCl7cmV0dXJuIHRoaXMuZmVhdHVyZT90eXBlb2YgdGhpcy5mZWF0dXJlLnR5cGU9PWBudW1iZXJgP0pyW3RoaXMuZmVhdHVyZS50eXBlXTp0aGlzLmZlYXR1cmUudHlwZTpudWxsfWdlb21ldHJ5KCl7cmV0dXJuIHRoaXMuZmVhdHVyZSYmYGdlb21ldHJ5YGluIHRoaXMuZmVhdHVyZT90aGlzLmZlYXR1cmUuZ2VvbWV0cnk6bnVsbH1jYW5vbmljYWxJRCgpe3JldHVybiB0aGlzLmNhbm9uaWNhbH1wcm9wZXJ0aWVzKCl7cmV0dXJuIHRoaXMuZmVhdHVyZSYmdGhpcy5mZWF0dXJlLnByb3BlcnRpZXN8fHt9fXBhcnNlQ29sb3IoZSl7bGV0IHQ9dGhpcy5fcGFyc2VDb2xvckNhY2hlLmdldChlKTtyZXR1cm4gdHx8KHQ9ei5wYXJzZShlKSx0aGlzLl9wYXJzZUNvbG9yQ2FjaGUuc2V0KGUsdCkpLHR9fTtmdW5jdGlvbiBYcihlLHQsbil7bGV0IHI9ZS5sZW5ndGgtMSxpPTAsYT1yLG89MCxzLGM7Zm9yKDtpPD1hOylpZihvPU1hdGguZmxvb3IoKGkrYSkvMikscz1lW29dLGM9ZVtvKzFdLHM8PXQpe2lmKG89PT1yfHx0PGMpcmV0dXJuIG87aT1vKzF9ZWxzZSBpZihzPnQpYT1vLTE7ZWxzZSB0aHJvdyBuZXcgQihgSW5wdXQgaXMgbm90IGEgbnVtYmVyLmAsbik7cmV0dXJuIDB9dmFyIFpyPWNsYXNzIGV7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy50eXBlPWUsdGhpcy5pbnB1dD10LHRoaXMua2V5PXIsdGhpcy5sYWJlbHM9W10sdGhpcy5vdXRwdXRzPVtdO2ZvcihsZXRbZSx0XW9mIG4pdGhpcy5sYWJlbHMucHVzaChlKSx0aGlzLm91dHB1dHMucHVzaCh0KX1zdGF0aWMgcGFyc2UodCxuKXtpZih0Lmxlbmd0aC0xPDQpcmV0dXJuIG4uZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke3QubGVuZ3RoLTF9LmApO2lmKCh0Lmxlbmd0aC0xKSUyIT0wKXJldHVybiBuLmVycm9yKGBFeHBlY3RlZCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuYCk7bGV0IHI9bi5wYXJzZSh0WzFdLDEsUCk7aWYoIXIpcmV0dXJuIG51bGw7bGV0IGk9W10sYT1udWxsO24uZXhwZWN0ZWRUeXBlJiZuLmV4cGVjdGVkVHlwZS5raW5kIT09YHZhbHVlYCYmKGE9bi5leHBlY3RlZFR5cGUpO2ZvcihsZXQgZT0xO2U8dC5sZW5ndGg7ZSs9Mil7bGV0IHI9ZT09PTE/LTEvMDp0W2VdLG89dFtlKzFdLHM9ZSxjPWUrMTtpZih0eXBlb2YgciE9YG51bWJlcmApcmV0dXJuIG4uZXJyb3IoYElucHV0L291dHB1dCBwYWlycyBmb3IgInN0ZXAiIGV4cHJlc3Npb25zIG11c3QgYmUgZGVmaW5lZCB1c2luZyBsaXRlcmFsIG51bWVyaWMgdmFsdWVzIChub3QgY29tcHV0ZWQgZXhwcmVzc2lvbnMpIGZvciB0aGUgaW5wdXQgdmFsdWVzLmAscyk7aWYoaS5sZW5ndGgmJmlbaS5sZW5ndGgtMV1bMF0+PXIpcmV0dXJuIG4uZXJyb3IoYElucHV0L291dHB1dCBwYWlycyBmb3IgInN0ZXAiIGV4cHJlc3Npb25zIG11c3QgYmUgYXJyYW5nZWQgd2l0aCBpbnB1dCB2YWx1ZXMgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLmAscyk7bGV0IGw9bi5wYXJzZShvLGMsYSk7aWYoIWwpcmV0dXJuIG51bGw7YXx8PWwudHlwZSxpLnB1c2goW3IsbF0pfXJldHVybiBuZXcgZShhLHIsaSxuLmtleSl9ZXZhbHVhdGUoZSl7bGV0IHQ9dGhpcy5sYWJlbHMsbj10aGlzLm91dHB1dHM7aWYodC5sZW5ndGg9PT0xKXJldHVybiBuWzBdLmV2YWx1YXRlKGUpO2xldCByPXRoaXMuaW5wdXQuZXZhbHVhdGUoZSk7aWYocjw9dFswXSlyZXR1cm4gblswXS5ldmFsdWF0ZShlKTtsZXQgaT10Lmxlbmd0aDtyZXR1cm4gcj49dFtpLTFdP25baS0xXS5ldmFsdWF0ZShlKTpuW1hyKHQscix0aGlzLmtleSldLmV2YWx1YXRlKGUpfWVhY2hDaGlsZChlKXtlKHRoaXMuaW5wdXQpO2ZvcihsZXQgdCBvZiB0aGlzLm91dHB1dHMpZSh0KX1vdXRwdXREZWZpbmVkKCl7cmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShlPT5lLm91dHB1dERlZmluZWQoKSl9fTtmdW5jdGlvbiBRcihlLHQsbixyKXtsZXQgaT0zKmUsYT0zKihuLWUpLWksbz0xLWktYSxzPTMqdCxjPTMqKHItdCktcyxsPTEtcy1jO3JldHVybiBmdW5jdGlvbihlLHQ9MWUtNil7aWYoZTw9MClyZXR1cm4gMDtpZihlPj0xKXJldHVybiAxO2xldCBuPWU7Zm9yKGxldCByPTA7cjw4O3IrKyl7bGV0IHI9KChvKm4rYSkqbitpKSpuLWU7aWYoTWF0aC5hYnMocik8dClyZXR1cm4oKGwqbitjKSpuK3MpKm47bGV0IHU9KDMqbypuKzIqYSkqbitpO2lmKE1hdGguYWJzKHUpPDFlLTYpYnJlYWs7bi09ci91fWxldCByPTAsdT0xO249ZTtmb3IobGV0IHM9MDtzPDIwO3MrKyl7bGV0IHM9KChvKm4rYSkqbitpKSpuO2lmKE1hdGguYWJzKHMtZSk8dClicmVhaztlPnM/cj1uOnU9bixuPShyK3UpKi41fXJldHVybigobCpuK2MpKm4rcykqbn19dmFyICRyPWNsYXNzIGV7Y29uc3RydWN0b3IoZSx0LG4scixpLGEpe3RoaXMudHlwZT1lLHRoaXMub3BlcmF0b3I9dCx0aGlzLmludGVycG9sYXRpb249bix0aGlzLmlucHV0PXIsdGhpcy5rZXk9YSx0aGlzLmxhYmVscz1bXSx0aGlzLm91dHB1dHM9W107Zm9yKGxldFtlLHRdb2YgaSl0aGlzLmxhYmVscy5wdXNoKGUpLHRoaXMub3V0cHV0cy5wdXNoKHQpfXN0YXRpYyBpbnRlcnBvbGF0aW9uRmFjdG9yKGUsdCxuLHIpe2xldCBpPTA7aWYoZS5uYW1lPT09YGV4cG9uZW50aWFsYClpPWVpKHQsZS5iYXNlLG4scik7ZWxzZSBpZihlLm5hbWU9PT1gbGluZWFyYClpPWVpKHQsMSxuLHIpO2Vsc2UgaWYoZS5uYW1lPT09YGN1YmljLWJlemllcmApe2xldCBhPWUuY29udHJvbFBvaW50cztpPVFyKGFbMF0sYVsxXSxhWzJdLGFbM10pKGVpKHQsMSxuLHIpKX1yZXR1cm4gaX1zdGF0aWMgcGFyc2UodCxuKXtsZXRbcixpLGEsLi4ub109dDtpZighQXJyYXkuaXNBcnJheShpKXx8aS5sZW5ndGg9PT0wKXJldHVybiBuLmVycm9yKGBFeHBlY3RlZCBhbiBpbnRlcnBvbGF0aW9uIHR5cGUgZXhwcmVzc2lvbi5gLDEpO2lmKGlbMF09PT1gbGluZWFyYClpPXtuYW1lOmBsaW5lYXJgfTtlbHNlIGlmKGlbMF09PT1gZXhwb25lbnRpYWxgKXtsZXQgZT1pWzFdO2lmKHR5cGVvZiBlIT1gbnVtYmVyYClyZXR1cm4gbi5lcnJvcihgRXhwb25lbnRpYWwgaW50ZXJwb2xhdGlvbiByZXF1aXJlcyBhIG51bWVyaWMgYmFzZS5gLDEsMSk7aT17bmFtZTpgZXhwb25lbnRpYWxgLGJhc2U6ZX19ZWxzZSBpZihpWzBdPT09YGN1YmljLWJlemllcmApe2xldCBlPWkuc2xpY2UoMSk7aWYoZS5sZW5ndGghPT00fHxlLnNvbWUoZT0+dHlwZW9mIGUhPWBudW1iZXJgfHxlPDB8fGU+MSkpcmV0dXJuIG4uZXJyb3IoYEN1YmljIGJlemllciBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGZvdXIgbnVtZXJpYyBhcmd1bWVudHMgd2l0aCB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxLmAsMSk7aT17bmFtZTpgY3ViaWMtYmV6aWVyYCxjb250cm9sUG9pbnRzOmV9fWVsc2UgcmV0dXJuIG4uZXJyb3IoYFVua25vd24gaW50ZXJwb2xhdGlvbiB0eXBlICR7U3RyaW5nKGlbMF0pfWAsMSwwKTtpZih0Lmxlbmd0aC0xPDQpcmV0dXJuIG4uZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke3QubGVuZ3RoLTF9LmApO2lmKCh0Lmxlbmd0aC0xKSUyIT0wKXJldHVybiBuLmVycm9yKGBFeHBlY3RlZCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuYCk7aWYoYT1uLnBhcnNlKGEsMixQKSwhYSlyZXR1cm4gbnVsbDtsZXQgcz1bXSxjPW51bGw7KHI9PT1gaW50ZXJwb2xhdGUtaGNsYHx8cj09PWBpbnRlcnBvbGF0ZS1sYWJgKSYmbi5leHBlY3RlZFR5cGUhPUpuP2M9Vm46bi5leHBlY3RlZFR5cGUmJm4uZXhwZWN0ZWRUeXBlLmtpbmQhPT1gdmFsdWVgJiYoYz1uLmV4cGVjdGVkVHlwZSk7Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKz0yKXtsZXQgdD1vW2VdLHI9b1tlKzFdLGk9ZSszLGE9ZSs0O2lmKHR5cGVvZiB0IT1gbnVtYmVyYClyZXR1cm4gbi5lcnJvcihgSW5wdXQvb3V0cHV0IHBhaXJzIGZvciAiaW50ZXJwb2xhdGUiIGV4cHJlc3Npb25zIG11c3QgYmUgZGVmaW5lZCB1c2luZyBsaXRlcmFsIG51bWVyaWMgdmFsdWVzIChub3QgY29tcHV0ZWQgZXhwcmVzc2lvbnMpIGZvciB0aGUgaW5wdXQgdmFsdWVzLmAsaSk7aWYocy5sZW5ndGgmJnNbcy5sZW5ndGgtMV1bMF0+PXQpcmV0dXJuIG4uZXJyb3IoYElucHV0L291dHB1dCBwYWlycyBmb3IgImludGVycG9sYXRlIiBleHByZXNzaW9ucyBtdXN0IGJlIGFycmFuZ2VkIHdpdGggaW5wdXQgdmFsdWVzIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlci5gLGkpO2xldCBsPW4ucGFyc2UocixhLGMpO2lmKCFsKXJldHVybiBudWxsO2N8fD1sLnR5cGUscy5wdXNoKFt0LGxdKX1yZXR1cm4hcnIoYyxQKSYmIXJyKGMsSG4pJiYhcnIoYyxWbikmJiFycihjLHFuKSYmIXJyKGMsWW4pJiYhcnIoYyxKbikmJiFycihjLFpuKSYmIXJyKGMsUW4oUCkpP24uZXJyb3IoYFR5cGUgJHtSKGMpfSBpcyBub3QgaW50ZXJwb2xhdGFibGUuYCk6bmV3IGUoYyxyLGksYSxzLG4ua2V5KX1ldmFsdWF0ZSh0KXtsZXQgbj10aGlzLmxhYmVscyxyPXRoaXMub3V0cHV0cztpZihuLmxlbmd0aD09PTEpcmV0dXJuIHJbMF0uZXZhbHVhdGUodCk7bGV0IGk9dGhpcy5pbnB1dC5ldmFsdWF0ZSh0KTtpZihpPD1uWzBdKXJldHVybiByWzBdLmV2YWx1YXRlKHQpO2xldCBhPW4ubGVuZ3RoO2lmKGk+PW5bYS0xXSlyZXR1cm4gclthLTFdLmV2YWx1YXRlKHQpO2xldCBvPVhyKG4saSx0aGlzLmtleSkscz1uW29dLGM9bltvKzFdLGw9ZS5pbnRlcnBvbGF0aW9uRmFjdG9yKHRoaXMuaW50ZXJwb2xhdGlvbixpLHMsYyksdT1yW29dLmV2YWx1YXRlKHQpLGQ9cltvKzFdLmV2YWx1YXRlKHQpO3N3aXRjaCh0aGlzLm9wZXJhdG9yKXtjYXNlYGludGVycG9sYXRlYDpzd2l0Y2godGhpcy50eXBlLmtpbmQpe2Nhc2VgbnVtYmVyYDpyZXR1cm4ga3IodSxkLGwpO2Nhc2VgY29sb3JgOnJldHVybiB6LmludGVycG9sYXRlKHUsZCxsKTtjYXNlYHBhZGRpbmdgOnJldHVybiBGci5pbnRlcnBvbGF0ZSh1LGQsbCk7Y2FzZWBjb2xvckFycmF5YDpyZXR1cm4gTHIuaW50ZXJwb2xhdGUodSxkLGwpO2Nhc2VgbnVtYmVyQXJyYXlgOnJldHVybiBJci5pbnRlcnBvbGF0ZSh1LGQsbCk7Y2FzZWB2YXJpYWJsZUFuY2hvck9mZnNldENvbGxlY3Rpb25gOnJldHVybiB6ci5pbnRlcnBvbGF0ZSh1LGQsbCx0aGlzLmtleSk7Y2FzZWBhcnJheWA6cmV0dXJuIEFyKHUsZCxsKTtjYXNlYHByb2plY3Rpb25EZWZpbml0aW9uYDpyZXR1cm4gVnIuaW50ZXJwb2xhdGUodSxkLGwpfWNhc2VgaW50ZXJwb2xhdGUtaGNsYDpzd2l0Y2godGhpcy50eXBlLmtpbmQpe2Nhc2VgY29sb3JgOnJldHVybiB6LmludGVycG9sYXRlKHUsZCxsLGBoY2xgKTtjYXNlYGNvbG9yQXJyYXlgOnJldHVybiBMci5pbnRlcnBvbGF0ZSh1LGQsbCxgaGNsYCl9Y2FzZWBpbnRlcnBvbGF0ZS1sYWJgOnN3aXRjaCh0aGlzLnR5cGUua2luZCl7Y2FzZWBjb2xvcmA6cmV0dXJuIHouaW50ZXJwb2xhdGUodSxkLGwsYGxhYmApO2Nhc2VgY29sb3JBcnJheWA6cmV0dXJuIExyLmludGVycG9sYXRlKHUsZCxsLGBsYWJgKX19fWVhY2hDaGlsZChlKXtlKHRoaXMuaW5wdXQpO2ZvcihsZXQgdCBvZiB0aGlzLm91dHB1dHMpZSh0KX1vdXRwdXREZWZpbmVkKCl7cmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShlPT5lLm91dHB1dERlZmluZWQoKSl9fTtmdW5jdGlvbiBlaShlLHQsbixyKXtsZXQgaT1yLW4sYT1lLW47cmV0dXJuIGk9PT0wPzA6dD09PTE/YS9pOih0KiorYS0xKS8odCoqK2ktMSl9Y29uc3QgdGk9e2NvbG9yOnouaW50ZXJwb2xhdGUsbnVtYmVyOmtyLHBhZGRpbmc6RnIuaW50ZXJwb2xhdGUsbnVtYmVyQXJyYXk6SXIuaW50ZXJwb2xhdGUsY29sb3JBcnJheTpMci5pbnRlcnBvbGF0ZSx2YXJpYWJsZUFuY2hvck9mZnNldENvbGxlY3Rpb246enIuaW50ZXJwb2xhdGUsYXJyYXk6QXJ9O3ZhciBuaT1jbGFzcyBle2NvbnN0cnVjdG9yKGUpe3RoaXMudHlwZT1Lbix0aGlzLnNlY3Rpb25zPWV9c3RhdGljIHBhcnNlKHQsbil7aWYodC5sZW5ndGg8MilyZXR1cm4gbi5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LmApO2xldCByPXRbMV07aWYoIUFycmF5LmlzQXJyYXkocikmJnR5cGVvZiByPT1gb2JqZWN0YClyZXR1cm4gbi5lcnJvcihgRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBpbWFnZSBvciB0ZXh0IHNlY3Rpb24uYCk7bGV0IGk9W10sYT0hMTtmb3IobGV0IGU9MTtlPD10Lmxlbmd0aC0xOysrZSl7bGV0IHI9dFtlXTtpZihhJiZ0eXBlb2Ygcj09YG9iamVjdGAmJiFBcnJheS5pc0FycmF5KHIpKXthPSExO2xldCBlPW51bGw7aWYocltgZm9udC1zY2FsZWBdJiYoZT1uLnBhcnNlKHJbYGZvbnQtc2NhbGVgXSwxLFApLCFlKSlyZXR1cm4gbnVsbDtsZXQgdD1udWxsO2lmKHJbYHRleHQtZm9udGBdJiYodD1uLnBhcnNlKHJbYHRleHQtZm9udGBdLDEsUW4oRikpLCF0KSlyZXR1cm4gbnVsbDtsZXQgbz1udWxsO2lmKHJbYHRleHQtY29sb3JgXSYmKG89bi5wYXJzZShyW2B0ZXh0LWNvbG9yYF0sMSxWbiksIW8pKXJldHVybiBudWxsO2xldCBzPW51bGw7aWYocltgdmVydGljYWwtYWxpZ25gXSl7aWYodHlwZW9mIHJbYHZlcnRpY2FsLWFsaWduYF09PWBzdHJpbmdgJiYhTXIuaW5jbHVkZXMocltgdmVydGljYWwtYWxpZ25gXSkpcmV0dXJuIG4uZXJyb3IoYCd2ZXJ0aWNhbC1hbGlnbicgbXVzdCBiZSBvbmUgb2Y6ICdib3R0b20nLCAnY2VudGVyJywgJ3RvcCcgYnV0IGZvdW5kICcke3JbYHZlcnRpY2FsLWFsaWduYF19JyBpbnN0ZWFkLmApO2lmKHM9bi5wYXJzZShyW2B2ZXJ0aWNhbC1hbGlnbmBdLDEsRiksIXMpcmV0dXJuIG51bGx9bGV0IGM9aVtpLmxlbmd0aC0xXTtjLnNjYWxlPWUsYy5mb250PXQsYy50ZXh0Q29sb3I9byxjLnZlcnRpY2FsQWxpZ249c31lbHNle2xldCByPW4ucGFyc2UodFtlXSwxLEwpO2lmKCFyKXJldHVybiBudWxsO2xldCBvPXIudHlwZS5raW5kO2lmKG8hPT1gc3RyaW5nYCYmbyE9PWB2YWx1ZWAmJm8hPT1gbnVsbGAmJm8hPT1gcmVzb2x2ZWRJbWFnZWApcmV0dXJuIG4uZXJyb3IoYEZvcm1hdHRlZCB0ZXh0IHR5cGUgbXVzdCBiZSAnc3RyaW5nJywgJ3ZhbHVlJywgJ2ltYWdlJyBvciAnbnVsbCcuYCk7YT0hMCxpLnB1c2goe2NvbnRlbnQ6cixzY2FsZTpudWxsLGZvbnQ6bnVsbCx0ZXh0Q29sb3I6bnVsbCx2ZXJ0aWNhbEFsaWduOm51bGx9KX19cmV0dXJuIG5ldyBlKGkpfWV2YWx1YXRlKGUpe3JldHVybiBuZXcgUHIodGhpcy5zZWN0aW9ucy5tYXAodD0+e2xldCBuPXQuY29udGVudC5ldmFsdWF0ZShlKTtyZXR1cm4gR3Iobik9PT1Ybj9uZXcgTnIoYGAsbixudWxsLG51bGwsbnVsbCx0LnZlcnRpY2FsQWxpZ24/dC52ZXJ0aWNhbEFsaWduLmV2YWx1YXRlKGUpOm51bGwpOm5ldyBOcihLcihuKSxudWxsLHQuc2NhbGU/dC5zY2FsZS5ldmFsdWF0ZShlKTpudWxsLHQuZm9udD90LmZvbnQuZXZhbHVhdGUoZSkuam9pbihgLGApOm51bGwsdC50ZXh0Q29sb3I/dC50ZXh0Q29sb3IuZXZhbHVhdGUoZSk6bnVsbCx0LnZlcnRpY2FsQWxpZ24/dC52ZXJ0aWNhbEFsaWduLmV2YWx1YXRlKGUpOm51bGwpfSkpfWVhY2hDaGlsZChlKXtmb3IobGV0IHQgb2YgdGhpcy5zZWN0aW9ucyllKHQuY29udGVudCksdC5zY2FsZSYmZSh0LnNjYWxlKSx0LmZvbnQmJmUodC5mb250KSx0LnRleHRDb2xvciYmZSh0LnRleHRDb2xvciksdC52ZXJ0aWNhbEFsaWduJiZlKHQudmVydGljYWxBbGlnbil9b3V0cHV0RGVmaW5lZCgpe3JldHVybiExfX07ZnVuY3Rpb24gcmkoZSx0LG49MCxyPWUubGVuZ3RoLTEsaT1haSl7Zm9yKDtyPm47KXtpZihyLW4+NjAwKXtsZXQgYT1yLW4rMSxvPXQtbisxLHM9TWF0aC5sb2coYSksYz0uNSpNYXRoLmV4cCgyKnMvMyksbD0uNSpNYXRoLnNxcnQocypjKihhLWMpL2EpKihvLWEvMjwwPy0xOjEpO3JpKGUsdCxNYXRoLm1heChuLE1hdGguZmxvb3IodC1vKmMvYStsKSksTWF0aC5taW4ocixNYXRoLmZsb29yKHQrKGEtbykqYy9hK2wpKSxpKX1sZXQgYT1lW3RdLG89bixzPXI7Zm9yKGlpKGUsbix0KSxpKGVbcl0sYSk+MCYmaWkoZSxuLHIpO288czspe2ZvcihpaShlLG8scyksbysrLHMtLTtpKGVbb10sYSk8MDspbysrO2Zvcig7aShlW3NdLGEpPjA7KXMtLX1pKGVbbl0sYSk9PT0wP2lpKGUsbixzKToocysrLGlpKGUscyxyKSksczw9dCYmKG49cysxKSx0PD1zJiYocj1zLTEpfX1mdW5jdGlvbiBpaShlLHQsbil7bGV0IHI9ZVt0XTtlW3RdPWVbbl0sZVtuXT1yfWZ1bmN0aW9uIGFpKGUsdCl7cmV0dXJuIGU8dD8tMTorKGU+dCl9ZnVuY3Rpb24gb2koZSx0KXtpZihlLmxlbmd0aDw9MSlyZXR1cm5bZV07bGV0IG49W10scixpO2ZvcihsZXQgdCBvZiBlKXtsZXQgZT1jaSh0KTtlIT09MCYmKHQuYXJlYT1NYXRoLmFicyhlKSxpPT09dm9pZCAwJiYoaT1lPDApLGk9PT1lPDA/KHImJm4ucHVzaChyKSxyPVt0XSk6ci5wdXNoKHQpKX1pZihyJiZuLnB1c2gociksdD4xKWZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKW5bZV0ubGVuZ3RoPD10fHwocmkobltlXSx0LDEsbltlXS5sZW5ndGgtMSxzaSksbltlXT1uW2VdLnNsaWNlKDAsdCkpO3JldHVybiBufWZ1bmN0aW9uIHNpKGUsdCl7cmV0dXJuIHQuYXJlYS1lLmFyZWF9ZnVuY3Rpb24gY2koZSl7bGV0IHQ9MDtmb3IobGV0IG49MCxyPWUubGVuZ3RoLGk9ci0xLGEsbztuPHI7aT1uKyspYT1lW25dLG89ZVtpXSx0Kz0oby54LWEueCkqKGEueStvLnkpO3JldHVybiB0fWNvbnN0IGxpPXtzdHJpbmc6RixudW1iZXI6UCxib29sZWFuOkksb2JqZWN0OlVufTt2YXIgdWk9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy50eXBlPWUsdGhpcy5hcmdzPXQsdGhpcy5rZXk9bn1zdGF0aWMgcGFyc2UodCxuKXtpZih0Lmxlbmd0aDwyKXJldHVybiBuLmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuYCk7bGV0IHI9MSxpLGE9dFswXTtpZihhPT09YGFycmF5YCl7bGV0IGU7aWYodC5sZW5ndGg+Mil7bGV0IGk9dFsxXTtpZih0eXBlb2YgaSE9YHN0cmluZ2B8fCEoaSBpbiBsaSl8fGk9PT1gb2JqZWN0YClyZXR1cm4gbi5lcnJvcihgVGhlIGl0ZW0gdHlwZSBhcmd1bWVudCBvZiAiYXJyYXkiIG11c3QgYmUgb25lIG9mIHN0cmluZywgbnVtYmVyLCBib29sZWFuYCwxKTtlPWxpW2ldLHIrK31lbHNlIGU9TDtsZXQgYTtpZih0Lmxlbmd0aD4zKXtpZih0WzJdIT09bnVsbCYmKHR5cGVvZiB0WzJdIT1gbnVtYmVyYHx8dFsyXTwwfHx0WzJdIT09TWF0aC5mbG9vcih0WzJdKSkpcmV0dXJuIG4uZXJyb3IoYFRoZSBsZW5ndGggYXJndW1lbnQgdG8gImFycmF5IiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBsaXRlcmFsYCwyKTthPXRbMl0scisrfWk9UW4oZSxhKX1lbHNle2lmKCFsaVthXSl0aHJvdyBFcnJvcihgVHlwZXMgZG9lc24ndCBjb250YWluIG5hbWUgPSAke2F9YCk7aT1saVthXX1sZXQgbz1bXTtmb3IoO3I8dC5sZW5ndGg7cisrKXtsZXQgZT1uLnBhcnNlKHRbcl0scixMKTtpZighZSlyZXR1cm4gbnVsbDtvLnB1c2goZSl9cmV0dXJuIG5ldyBlKGksbyxuLmtleSl9ZXZhbHVhdGUoZSl7Zm9yKGxldCB0PTA7dDx0aGlzLmFyZ3MubGVuZ3RoO3QrKyl7bGV0IG49dGhpcy5hcmdzW3RdLmV2YWx1YXRlKGUpO2lmKCFlcih0aGlzLnR5cGUsR3IobikpKXJldHVybiBuO2lmKHQ9PT10aGlzLmFyZ3MubGVuZ3RoLTEpdGhyb3cgbmV3IEIoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9mIHR5cGUgJHtSKHRoaXMudHlwZSl9LCBidXQgZm91bmQgJHtSKEdyKG4pKX0gaW5zdGVhZC5gLHRoaXMua2V5KX10aHJvdyBFcnJvcigpfWVhY2hDaGlsZChlKXt0aGlzLmFyZ3MuZm9yRWFjaChlKX1vdXRwdXREZWZpbmVkKCl7cmV0dXJuIHRoaXMuYXJncy5ldmVyeShlPT5lLm91dHB1dERlZmluZWQoKSl9fTtjb25zdCBkaT17InRvLWJvb2xlYW4iOkksInRvLWNvbG9yIjpWbiwidG8tbnVtYmVyIjpQLCJ0by1zdHJpbmciOkZ9O3ZhciBmaT1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnR5cGU9ZSx0aGlzLmFyZ3M9dCx0aGlzLmtleT1ufXN0YXRpYyBwYXJzZSh0LG4pe2lmKHQubGVuZ3RoPDIpcmV0dXJuIG4uZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtsZXQgcj10WzBdO2lmKCFkaVtyXSl0aHJvdyBFcnJvcihgQ2FuJ3QgcGFyc2UgJHtyfSBhcyBpdCBpcyBub3QgcGFydCBvZiB0aGUga25vd24gdHlwZXNgKTtpZigocj09PWB0by1ib29sZWFuYHx8cj09PWB0by1zdHJpbmdgKSYmdC5sZW5ndGghPT0yKXJldHVybiBuLmVycm9yKGBFeHBlY3RlZCBvbmUgYXJndW1lbnQuYCk7bGV0IGk9ZGlbcl0sYT1bXTtmb3IobGV0IGU9MTtlPHQubGVuZ3RoO2UrKyl7bGV0IHI9bi5wYXJzZSh0W2VdLGUsTCk7aWYoIXIpcmV0dXJuIG51bGw7YS5wdXNoKHIpfXJldHVybiBuZXcgZShpLGEsbi5rZXkpfWV2YWx1YXRlKGUpe3N3aXRjaCh0aGlzLnR5cGUua2luZCl7Y2FzZWBib29sZWFuYDpyZXR1cm4hIXRoaXMuYXJnc1swXS5ldmFsdWF0ZShlKTtjYXNlYGNvbG9yYDp7bGV0IHQsbjtmb3IobGV0IHIgb2YgdGhpcy5hcmdzKXtpZih0PXIuZXZhbHVhdGUoZSksbj1udWxsLHQgaW5zdGFuY2VvZiB6KXJldHVybiB0O2lmKHR5cGVvZiB0PT1gc3RyaW5nYCl7bGV0IG49ZS5wYXJzZUNvbG9yKHQpO2lmKG4pcmV0dXJuIG59ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpJiYobj10Lmxlbmd0aDwzfHx0Lmxlbmd0aD40P2BJbnZhbGlkIHJnYmEgdmFsdWUgJHtKU09OLnN0cmluZ2lmeSh0KX06IGV4cGVjdGVkIGFuIGFycmF5IGNvbnRhaW5pbmcgZWl0aGVyIHRocmVlIG9yIGZvdXIgbnVtZXJpYyB2YWx1ZXMuYDpVcih0WzBdLHRbMV0sdFsyXSx0WzNdKSwhbikpcmV0dXJuIG5ldyB6KHRbMF0vMjU1LHRbMV0vMjU1LHRbMl0vMjU1LHRbM10pfXRocm93IG5ldyBCKG58fGBDb3VsZCBub3QgcGFyc2UgY29sb3IgZnJvbSB2YWx1ZSAnJHt0eXBlb2YgdD09YHN0cmluZ2A/dDpKU09OLnN0cmluZ2lmeSh0KX0nYCx0aGlzLmtleSl9Y2FzZWBwYWRkaW5nYDp7bGV0IHQ7Zm9yKGxldCBuIG9mIHRoaXMuYXJncyl7dD1uLmV2YWx1YXRlKGUpO2xldCByPUZyLnBhcnNlKHQpO2lmKHIpcmV0dXJuIHJ9dGhyb3cgbmV3IEIoYENvdWxkIG5vdCBwYXJzZSBwYWRkaW5nIGZyb20gdmFsdWUgJyR7dHlwZW9mIHQ9PWBzdHJpbmdgP3Q6SlNPTi5zdHJpbmdpZnkodCl9J2AsdGhpcy5rZXkpfWNhc2VgbnVtYmVyQXJyYXlgOntsZXQgdDtmb3IobGV0IG4gb2YgdGhpcy5hcmdzKXt0PW4uZXZhbHVhdGUoZSk7bGV0IHI9SXIucGFyc2UodCk7aWYocilyZXR1cm4gcn10aHJvdyBuZXcgQihgQ291bGQgbm90IHBhcnNlIG51bWJlckFycmF5IGZyb20gdmFsdWUgJyR7dHlwZW9mIHQ9PWBzdHJpbmdgP3Q6SlNPTi5zdHJpbmdpZnkodCl9J2AsdGhpcy5rZXkpfWNhc2VgY29sb3JBcnJheWA6e2xldCB0O2ZvcihsZXQgbiBvZiB0aGlzLmFyZ3Mpe3Q9bi5ldmFsdWF0ZShlKTtsZXQgcj1Mci5wYXJzZSh0KTtpZihyKXJldHVybiByfXRocm93IG5ldyBCKGBDb3VsZCBub3QgcGFyc2UgY29sb3JBcnJheSBmcm9tIHZhbHVlICcke3R5cGVvZiB0PT1gc3RyaW5nYD90OkpTT04uc3RyaW5naWZ5KHQpfSdgLHRoaXMua2V5KX1jYXNlYHZhcmlhYmxlQW5jaG9yT2Zmc2V0Q29sbGVjdGlvbmA6e2xldCB0O2ZvcihsZXQgbiBvZiB0aGlzLmFyZ3Mpe3Q9bi5ldmFsdWF0ZShlKTtsZXQgcj16ci5wYXJzZSh0KTtpZihyKXJldHVybiByfXRocm93IG5ldyBCKGBDb3VsZCBub3QgcGFyc2UgdmFyaWFibGVBbmNob3JPZmZzZXRDb2xsZWN0aW9uIGZyb20gdmFsdWUgJyR7dHlwZW9mIHQ9PWBzdHJpbmdgP3Q6SlNPTi5zdHJpbmdpZnkodCl9J2AsdGhpcy5rZXkpfWNhc2VgbnVtYmVyYDp7bGV0IHQ9bnVsbDtmb3IobGV0IG4gb2YgdGhpcy5hcmdzKXtpZih0PW4uZXZhbHVhdGUoZSksdD09PW51bGwpcmV0dXJuIDA7bGV0IHI9TnVtYmVyKHQpO2lmKCFpc05hTihyKSlyZXR1cm4gcn10aHJvdyBuZXcgQihgQ291bGQgbm90IGNvbnZlcnQgJHtKU09OLnN0cmluZ2lmeSh0KX0gdG8gbnVtYmVyLmAsdGhpcy5rZXkpfWNhc2VgZm9ybWF0dGVkYDpyZXR1cm4gUHIuZnJvbVN0cmluZyhLcih0aGlzLmFyZ3NbMF0uZXZhbHVhdGUoZSkpKTtjYXNlYHJlc29sdmVkSW1hZ2VgOnJldHVybiBCci5mcm9tU3RyaW5nKEtyKHRoaXMuYXJnc1swXS5ldmFsdWF0ZShlKSkpO2Nhc2VgcHJvamVjdGlvbkRlZmluaXRpb25gOntsZXQgdD10aGlzLmFyZ3NbMF0uZXZhbHVhdGUoZSk7aWYoVnIucGFyc2UodCkpcmV0dXJuIHQ7dGhyb3cgbmV3IEIoYENvdWxkIG5vdCBwYXJzZSBwcm9qZWN0aW9uRGVmaW5pdGlvbiBmcm9tIHZhbHVlICcke3R5cGVvZiB0PT1gc3RyaW5nYD90OkpTT04uc3RyaW5naWZ5KHQpfSdgLHRoaXMua2V5KX1kZWZhdWx0OnJldHVybiBLcih0aGlzLmFyZ3NbMF0uZXZhbHVhdGUoZSkpfX1lYWNoQ2hpbGQoZSl7dGhpcy5hcmdzLmZvckVhY2goZSl9b3V0cHV0RGVmaW5lZCgpe3JldHVybiB0aGlzLmFyZ3MuZXZlcnkoZT0+ZS5vdXRwdXREZWZpbmVkKCkpfX0scGk9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlLHQpe3RoaXMudHlwZT10LnR5cGUsdGhpcy5iaW5kaW5ncz1bXS5jb25jYXQoZSksdGhpcy5yZXN1bHQ9dH1ldmFsdWF0ZShlKXtyZXR1cm4gdGhpcy5yZXN1bHQuZXZhbHVhdGUoZSl9ZWFjaENoaWxkKGUpe2ZvcihsZXQgdCBvZiB0aGlzLmJpbmRpbmdzKWUodFsxXSk7ZSh0aGlzLnJlc3VsdCl9c3RhdGljIHBhcnNlKHQsbil7aWYodC5sZW5ndGg8NClyZXR1cm4gbi5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgMyBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke3QubGVuZ3RoLTF9IGluc3RlYWQuYCk7bGV0IHI9W107Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aC0xO2UrPTIpe2xldCBpPXRbZV07aWYodHlwZW9mIGkhPWBzdHJpbmdgKXJldHVybiBuLmVycm9yKGBFeHBlY3RlZCBzdHJpbmcsIGJ1dCBmb3VuZCAke3R5cGVvZiBpfSBpbnN0ZWFkLmAsZSk7aWYoL1teYS16QS1aMC05X10vLnRlc3QoaSkpcmV0dXJuIG4uZXJyb3IoYFZhcmlhYmxlIG5hbWVzIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yICdfJy5gLGUpO2xldCBhPW4ucGFyc2UodFtlKzFdLGUrMSk7aWYoIWEpcmV0dXJuIG51bGw7ci5wdXNoKFtpLGFdKX1sZXQgaT1uLnBhcnNlKHRbdC5sZW5ndGgtMV0sdC5sZW5ndGgtMSxuLmV4cGVjdGVkVHlwZSxyKTtyZXR1cm4gaT9uZXcgZShyLGkpOm51bGx9b3V0cHV0RGVmaW5lZCgpe3JldHVybiB0aGlzLnJlc3VsdC5vdXRwdXREZWZpbmVkKCl9fSxtaT1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPXQudHlwZSx0aGlzLm5hbWU9ZSx0aGlzLmJvdW5kRXhwcmVzc2lvbj10fXN0YXRpYyBwYXJzZSh0LG4pe2lmKHQubGVuZ3RoIT09Mnx8dHlwZW9mIHRbMV0hPWBzdHJpbmdgKXJldHVybiBuLmVycm9yKGAndmFyJyBleHByZXNzaW9uIHJlcXVpcmVzIGV4YWN0bHkgb25lIHN0cmluZyBsaXRlcmFsIGFyZ3VtZW50LmApO2xldCByPXRbMV07cmV0dXJuIG4uc2NvcGUuaGFzKHIpP25ldyBlKHIsbi5zY29wZS5nZXQocikpOm4uZXJyb3IoYFVua25vd24gdmFyaWFibGUgIiR7cn0iLiBNYWtlIHN1cmUgIiR7cn0iIGhhcyBiZWVuIGJvdW5kIGluIGFuIGVuY2xvc2luZyAibGV0IiBleHByZXNzaW9uIGJlZm9yZSB1c2luZyBpdC5gLDEpfWV2YWx1YXRlKGUpe3JldHVybiB0aGlzLmJvdW5kRXhwcmVzc2lvbi5ldmFsdWF0ZShlKX1lYWNoQ2hpbGQoKXt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiExfX0saGk9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlLHQsbixyKXt0aGlzLnR5cGU9ZSx0aGlzLmluZGV4PXQsdGhpcy5pbnB1dD1uLHRoaXMua2V5PXJ9c3RhdGljIHBhcnNlKHQsbil7aWYodC5sZW5ndGghPT0zKXJldHVybiBuLmVycm9yKGBFeHBlY3RlZCAyIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7dC5sZW5ndGgtMX0gaW5zdGVhZC5gKTtsZXQgcj1uLnBhcnNlKHRbMV0sMSxQKSxpPW4ucGFyc2UodFsyXSwyLFFuKG4uZXhwZWN0ZWRUeXBlfHxMKSk7aWYoIXJ8fCFpKXJldHVybiBudWxsO2xldCBhPWkudHlwZTtyZXR1cm4gbmV3IGUoYS5pdGVtVHlwZSxyLGksbi5rZXkpfWV2YWx1YXRlKGUpe2xldCB0PXRoaXMuaW5kZXguZXZhbHVhdGUoZSksbj10aGlzLmlucHV0LmV2YWx1YXRlKGUpO2lmKHQ8MCl0aHJvdyBuZXcgQihgQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kczogJHt0fSA8IDAuYCx0aGlzLmtleSk7aWYodD49bi5sZW5ndGgpdGhyb3cgbmV3IEIoYEFycmF5IGluZGV4IG91dCBvZiBib3VuZHM6ICR7dH0gPiAke24ubGVuZ3RoLTF9LmAsdGhpcy5rZXkpO2lmKHQhPT1NYXRoLmZsb29yKHQpKXRocm93IG5ldyBCKGBBcnJheSBpbmRleCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBmb3VuZCAke3R9IGluc3RlYWQuYCx0aGlzLmtleSk7cmV0dXJuIG5bdF19ZWFjaENoaWxkKGUpe2UodGhpcy5pbmRleCksZSh0aGlzLmlucHV0KX1vdXRwdXREZWZpbmVkKCl7cmV0dXJuITF9fSxnaT1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLm5lZWRsZT1lLHRoaXMuaGF5c3RhY2s9dCx0aGlzLmtleT1uLHRoaXMudHlwZT1JfXN0YXRpYyBwYXJzZSh0LG4pe2lmKHQubGVuZ3RoIT09MylyZXR1cm4gbi5lcnJvcihgRXhwZWN0ZWQgMiBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke3QubGVuZ3RoLTF9IGluc3RlYWQuYCk7bGV0IHI9bi5wYXJzZSh0WzFdLDEsTCksaT1uLnBhcnNlKHRbMl0sMixMKTtyZXR1cm4hcnx8IWk/bnVsbDp0cihyLnR5cGUsW0ksRixQLEJuLExdKT9uZXcgZShyLGksbi5rZXkpOm4uZXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kICR7UihyLnR5cGUpfSBpbnN0ZWFkYCl9ZXZhbHVhdGUoZSl7bGV0IHQ9dGhpcy5uZWVkbGUuZXZhbHVhdGUoZSksbj10aGlzLmhheXN0YWNrLmV2YWx1YXRlKGUpO2lmKCFuKXJldHVybiExO2lmKCFucih0LFtgYm9vbGVhbmAsYHN0cmluZ2AsYG51bWJlcmAsYG51bGxgXSkpdGhyb3cgbmV3IEIoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kICR7UihHcih0KSl9IGluc3RlYWQuYCx0aGlzLmtleSk7aWYoIW5yKG4sW2BzdHJpbmdgLGBhcnJheWBdKSl0aHJvdyBuZXcgQihgRXhwZWN0ZWQgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHtSKEdyKG4pKX0gaW5zdGVhZC5gLHRoaXMua2V5KTtyZXR1cm4gbi5pbmRleE9mKHQpPj0wfWVhY2hDaGlsZChlKXtlKHRoaXMubmVlZGxlKSxlKHRoaXMuaGF5c3RhY2spfW91dHB1dERlZmluZWQoKXtyZXR1cm4hMH19LF9pPWNsYXNzIGV7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5uZWVkbGU9ZSx0aGlzLmhheXN0YWNrPXQsdGhpcy5rZXk9bix0aGlzLmZyb21JbmRleD1yLHRoaXMudHlwZT1QfXN0YXRpYyBwYXJzZSh0LG4pe2lmKHQubGVuZ3RoPD0yfHx0Lmxlbmd0aD49NSlyZXR1cm4gbi5lcnJvcihgRXhwZWN0ZWQgMiBvciAzIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7dC5sZW5ndGgtMX0gaW5zdGVhZC5gKTtsZXQgcj1uLnBhcnNlKHRbMV0sMSxMKSxpPW4ucGFyc2UodFsyXSwyLEwpO2lmKCFyfHwhaSlyZXR1cm4gbnVsbDtpZighdHIoci50eXBlLFtJLEYsUCxCbixMXSkpcmV0dXJuIG4uZXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kICR7UihyLnR5cGUpfSBpbnN0ZWFkYCk7aWYodC5sZW5ndGg9PT00KXtsZXQgYT1uLnBhcnNlKHRbM10sMyxQKTtyZXR1cm4gYT9uZXcgZShyLGksbi5rZXksYSk6bnVsbH1yZXR1cm4gbmV3IGUocixpLG4ua2V5KX1ldmFsdWF0ZShlKXtsZXQgdD10aGlzLm5lZWRsZS5ldmFsdWF0ZShlKSxuPXRoaXMuaGF5c3RhY2suZXZhbHVhdGUoZSk7aWYoIW5yKHQsW2Bib29sZWFuYCxgc3RyaW5nYCxgbnVtYmVyYCxgbnVsbGBdKSl0aHJvdyBuZXcgQihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgJHtSKEdyKHQpKX0gaW5zdGVhZC5gLHRoaXMua2V5KTtsZXQgcjtpZih0aGlzLmZyb21JbmRleCYmKHI9dGhpcy5mcm9tSW5kZXguZXZhbHVhdGUoZSkpLG5yKG4sW2BzdHJpbmdgXSkpe2xldCBlPW4uaW5kZXhPZih0LHIpO3JldHVybiBlPT09LTE/LTE6Wy4uLm4uc2xpY2UoMCxlKV0ubGVuZ3RofWlmKG5yKG4sW2BhcnJheWBdKSlyZXR1cm4gbi5pbmRleE9mKHQscik7dGhyb3cgbmV3IEIoYEV4cGVjdGVkIHNlY29uZCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGFycmF5IG9yIHN0cmluZywgYnV0IGZvdW5kICR7UihHcihuKSl9IGluc3RlYWQuYCx0aGlzLmtleSl9ZWFjaENoaWxkKGUpe2UodGhpcy5uZWVkbGUpLGUodGhpcy5oYXlzdGFjayksdGhpcy5mcm9tSW5kZXgmJmUodGhpcy5mcm9tSW5kZXgpfW91dHB1dERlZmluZWQoKXtyZXR1cm4hMX19LHZpPWNsYXNzIGV7Y29uc3RydWN0b3IoZSx0LG4scixpLGEpe3RoaXMuaW5wdXRUeXBlPWUsdGhpcy50eXBlPXQsdGhpcy5pbnB1dD1uLHRoaXMuY2FzZXM9cix0aGlzLm91dHB1dHM9aSx0aGlzLm90aGVyd2lzZT1hfXN0YXRpYyBwYXJzZSh0LG4pe2lmKHQubGVuZ3RoPDUpcmV0dXJuIG4uZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke3QubGVuZ3RoLTF9LmApO2lmKHQubGVuZ3RoJTIhPTEpcmV0dXJuIG4uZXJyb3IoYEV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5gKTtsZXQgcixpO24uZXhwZWN0ZWRUeXBlJiZuLmV4cGVjdGVkVHlwZS5raW5kIT09YHZhbHVlYCYmKGk9bi5leHBlY3RlZFR5cGUpO2xldCBhPXt9LG89W107Zm9yKGxldCBlPTI7ZTx0Lmxlbmd0aC0xO2UrPTIpe2xldCBzPXRbZV0sYz10W2UrMV07QXJyYXkuaXNBcnJheShzKXx8KHM9W3NdKTtsZXQgbD1uLmNvbmNhdChlKTtpZihzLmxlbmd0aD09PTApcmV0dXJuIGwuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBicmFuY2ggbGFiZWwuYCk7Zm9yKGxldCBlIG9mIHMpe2lmKHR5cGVvZiBlIT1gbnVtYmVyYCYmdHlwZW9mIGUhPWBzdHJpbmdgKXJldHVybiBsLmVycm9yKGBCcmFuY2ggbGFiZWxzIG11c3QgYmUgbnVtYmVycyBvciBzdHJpbmdzLmApO2lmKHR5cGVvZiBlPT1gbnVtYmVyYCYmTWF0aC5hYnMoZSk+MioqNTMtMSlyZXR1cm4gbC5lcnJvcihgQnJhbmNoIGxhYmVscyBtdXN0IGJlIGludGVnZXJzIG5vIGxhcmdlciB0aGFuICR7MioqNTMtMX0uYCk7aWYodHlwZW9mIGU9PWBudW1iZXJgJiZNYXRoLmZsb29yKGUpIT09ZSlyZXR1cm4gbC5lcnJvcihgTnVtZXJpYyBicmFuY2ggbGFiZWxzIG11c3QgYmUgaW50ZWdlciB2YWx1ZXMuYCk7aWYoIXIpcj1HcihlKTtlbHNlIGlmKGwuY2hlY2tTdWJ0eXBlKHIsR3IoZSkpKXJldHVybiBudWxsO2lmKGFbU3RyaW5nKGUpXSE9PXZvaWQgMClyZXR1cm4gbC5lcnJvcihgQnJhbmNoIGxhYmVscyBtdXN0IGJlIHVuaXF1ZS5gKTthW1N0cmluZyhlKV09by5sZW5ndGh9bGV0IHU9bi5wYXJzZShjLGUsaSk7aWYoIXUpcmV0dXJuIG51bGw7aXx8PXUudHlwZSxvLnB1c2godSl9bGV0IHM9bi5wYXJzZSh0WzFdLDEsTCk7aWYoIXMpcmV0dXJuIG51bGw7bGV0IGM9bi5wYXJzZSh0W3QubGVuZ3RoLTFdLHQubGVuZ3RoLTEsaSk7cmV0dXJuIWN8fHMudHlwZS5raW5kIT09YHZhbHVlYCYmbi5jb25jYXQoMSkuY2hlY2tTdWJ0eXBlKHIscy50eXBlKT9udWxsOm5ldyBlKHIsaSxzLGEsbyxjKX1ldmFsdWF0ZShlKXtsZXQgdD10aGlzLmlucHV0LmV2YWx1YXRlKGUpO3JldHVybihHcih0KT09PXRoaXMuaW5wdXRUeXBlJiZ0aGlzLm91dHB1dHNbdGhpcy5jYXNlc1t0XV18fHRoaXMub3RoZXJ3aXNlKS5ldmFsdWF0ZShlKX1lYWNoQ2hpbGQoZSl7ZSh0aGlzLmlucHV0KSx0aGlzLm91dHB1dHMuZm9yRWFjaChlKSxlKHRoaXMub3RoZXJ3aXNlKX1vdXRwdXREZWZpbmVkKCl7cmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShlPT5lLm91dHB1dERlZmluZWQoKSkmJnRoaXMub3RoZXJ3aXNlLm91dHB1dERlZmluZWQoKX19LHlpPWNsYXNzIGV7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMudHlwZT1lLHRoaXMuYnJhbmNoZXM9dCx0aGlzLm90aGVyd2lzZT1ufXN0YXRpYyBwYXJzZSh0LG4pe2lmKHQubGVuZ3RoPDQpcmV0dXJuIG4uZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDMgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke3QubGVuZ3RoLTF9LmApO2lmKHQubGVuZ3RoJTIhPTApcmV0dXJuIG4uZXJyb3IoYEV4cGVjdGVkIGFuIG9kZCBudW1iZXIgb2YgYXJndW1lbnRzLmApO2xldCByO24uZXhwZWN0ZWRUeXBlJiZuLmV4cGVjdGVkVHlwZS5raW5kIT09YHZhbHVlYCYmKHI9bi5leHBlY3RlZFR5cGUpO2xldCBpPVtdO2ZvcihsZXQgZT0xO2U8dC5sZW5ndGgtMTtlKz0yKXtsZXQgYT1uLnBhcnNlKHRbZV0sZSxJKTtpZighYSlyZXR1cm4gbnVsbDtsZXQgbz1uLnBhcnNlKHRbZSsxXSxlKzEscik7aWYoIW8pcmV0dXJuIG51bGw7aS5wdXNoKFthLG9dKSxyfHw9by50eXBlfWxldCBhPW4ucGFyc2UodFt0Lmxlbmd0aC0xXSx0Lmxlbmd0aC0xLHIpO2lmKCFhKXJldHVybiBudWxsO2lmKCFyKXRocm93IEVycm9yKGBDYW4ndCBpbmZlciBvdXRwdXQgdHlwZWApO3JldHVybiBuZXcgZShyLGksYSl9ZXZhbHVhdGUoZSl7Zm9yKGxldFt0LG5db2YgdGhpcy5icmFuY2hlcylpZih0LmV2YWx1YXRlKGUpKXJldHVybiBuLmV2YWx1YXRlKGUpO3JldHVybiB0aGlzLm90aGVyd2lzZS5ldmFsdWF0ZShlKX1lYWNoQ2hpbGQoZSl7Zm9yKGxldFt0LG5db2YgdGhpcy5icmFuY2hlcyllKHQpLGUobik7ZSh0aGlzLm90aGVyd2lzZSl9b3V0cHV0RGVmaW5lZCgpe3JldHVybiB0aGlzLmJyYW5jaGVzLmV2ZXJ5KChbZSx0XSk9PnQub3V0cHV0RGVmaW5lZCgpKSYmdGhpcy5vdGhlcndpc2Uub3V0cHV0RGVmaW5lZCgpfX0sYmk9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlLHQsbixyLGkpe3RoaXMudHlwZT1lLHRoaXMuaW5wdXQ9dCx0aGlzLmJlZ2luSW5kZXg9bix0aGlzLmtleT1yLHRoaXMuZW5kSW5kZXg9aX1zdGF0aWMgcGFyc2UodCxuKXtpZih0Lmxlbmd0aDw9Mnx8dC5sZW5ndGg+PTUpcmV0dXJuIG4uZXJyb3IoYEV4cGVjdGVkIDIgb3IgMyBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke3QubGVuZ3RoLTF9IGluc3RlYWQuYCk7bGV0IHI9bi5wYXJzZSh0WzFdLDEsTCksaT1uLnBhcnNlKHRbMl0sMixQKTtpZighcnx8IWkpcmV0dXJuIG51bGw7aWYoIXRyKHIudHlwZSxbUW4oTCksRixMXSkpcmV0dXJuIG4uZXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHtSKHIudHlwZSl9IGluc3RlYWRgKTtpZih0Lmxlbmd0aD09PTQpe2xldCBhPW4ucGFyc2UodFszXSwzLFApO3JldHVybiBhP25ldyBlKHIudHlwZSxyLGksbi5rZXksYSk6bnVsbH1yZXR1cm4gbmV3IGUoci50eXBlLHIsaSxuLmtleSl9ZXZhbHVhdGUoZSl7bGV0IHQ9dGhpcy5pbnB1dC5ldmFsdWF0ZShlKSxuPXRoaXMuYmVnaW5JbmRleC5ldmFsdWF0ZShlKSxyO2lmKHRoaXMuZW5kSW5kZXgmJihyPXRoaXMuZW5kSW5kZXguZXZhbHVhdGUoZSkpLG5yKHQsW2BzdHJpbmdgXSkpcmV0dXJuWy4uLnRdLnNsaWNlKG4scikuam9pbihgYCk7aWYobnIodCxbYGFycmF5YF0pKXJldHVybiB0LnNsaWNlKG4scik7dGhyb3cgbmV3IEIoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHtSKEdyKHQpKX0gaW5zdGVhZC5gLHRoaXMua2V5KX1lYWNoQ2hpbGQoZSl7ZSh0aGlzLmlucHV0KSxlKHRoaXMuYmVnaW5JbmRleCksdGhpcy5lbmRJbmRleCYmZSh0aGlzLmVuZEluZGV4KX1vdXRwdXREZWZpbmVkKCl7cmV0dXJuITF9fSx4aT1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5hcmdzPXR9c3RhdGljIHBhcnNlKHQsbil7aWYodC5sZW5ndGg8MilyZXR1cm4gbi5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LmApO2xldCByPW51bGwsaT1uLmV4cGVjdGVkVHlwZTtpJiZpLmtpbmQhPT1gdmFsdWVgJiYocj1pKTtsZXQgYT1bXTtmb3IobGV0IGUgb2YgdC5zbGljZSgxKSl7bGV0IHQ9bi5wYXJzZShlLDErYS5sZW5ndGgscix2b2lkIDAse3R5cGVBbm5vdGF0aW9uOmBvbWl0YH0pO2lmKCF0KXJldHVybiBudWxsO3J8fD10LnR5cGUsYS5wdXNoKHQpfWlmKCFyKXRocm93IEVycm9yKGBObyBvdXRwdXQgdHlwZWApO3JldHVybiBpJiZhLnNvbWUoZT0+ZXIoaSxlLnR5cGUpKT9uZXcgZShMLGEpOm5ldyBlKHIsYSl9ZXZhbHVhdGUoZSl7bGV0IHQ9bnVsbCxuPTAscjtmb3IobGV0IGkgb2YgdGhpcy5hcmdzKWlmKG4rKyx0PWkuZXZhbHVhdGUoZSksdCYmdCBpbnN0YW5jZW9mIEJyJiYhdC5hdmFpbGFibGUmJihyfHw9dC5uYW1lLHQ9bnVsbCxuPT09dGhpcy5hcmdzLmxlbmd0aCYmKHQ9cikpLHQhPT1udWxsKWJyZWFrO3JldHVybiB0fWVhY2hDaGlsZChlKXt0aGlzLmFyZ3MuZm9yRWFjaChlKX1vdXRwdXREZWZpbmVkKCl7cmV0dXJuIHRoaXMuYXJncy5ldmVyeShlPT5lLm91dHB1dERlZmluZWQoKSl9fTtmdW5jdGlvbiBTaShlLHQpe3JldHVybiBlPT09YD09YHx8ZT09PWAhPWA/dC5raW5kPT09YGJvb2xlYW5gfHx0LmtpbmQ9PT1gc3RyaW5nYHx8dC5raW5kPT09YG51bWJlcmB8fHQua2luZD09PWBudWxsYHx8dC5raW5kPT09YHZhbHVlYDp0LmtpbmQ9PT1gc3RyaW5nYHx8dC5raW5kPT09YG51bWJlcmB8fHQua2luZD09PWB2YWx1ZWB9ZnVuY3Rpb24gQ2koZSx0LG4pe3JldHVybiB0PT09bn1mdW5jdGlvbiB3aShlLHQsbil7cmV0dXJuIHQhPT1ufWZ1bmN0aW9uIFRpKGUsdCxuKXtyZXR1cm4gdDxufWZ1bmN0aW9uIEVpKGUsdCxuKXtyZXR1cm4gdD5ufWZ1bmN0aW9uIERpKGUsdCxuKXtyZXR1cm4gdDw9bn1mdW5jdGlvbiBPaShlLHQsbil7cmV0dXJuIHQ+PW59ZnVuY3Rpb24ga2koZSx0LG4scil7cmV0dXJuIHIuY29tcGFyZSh0LG4pPT09MH1mdW5jdGlvbiBBaShlLHQsbixyKXtyZXR1cm4ha2koZSx0LG4scil9ZnVuY3Rpb24gamkoZSx0LG4scil7cmV0dXJuIHIuY29tcGFyZSh0LG4pPDB9ZnVuY3Rpb24gTWkoZSx0LG4scil7cmV0dXJuIHIuY29tcGFyZSh0LG4pPjB9ZnVuY3Rpb24gTmkoZSx0LG4scil7cmV0dXJuIHIuY29tcGFyZSh0LG4pPD0wfWZ1bmN0aW9uIFBpKGUsdCxuLHIpe3JldHVybiByLmNvbXBhcmUodCxuKT49MH1mdW5jdGlvbiBGaShlLHQsbil7bGV0IHI9ZSE9PWA9PWAmJmUhPT1gIT1gO3JldHVybiBjbGFzcyBpe2NvbnN0cnVjdG9yKGUsdCxuLHIpe3RoaXMubGhzPWUsdGhpcy5yaHM9dCx0aGlzLmtleT1uLHRoaXMuY29sbGF0b3I9cix0aGlzLnR5cGU9SSx0aGlzLmhhc1VudHlwZWRBcmd1bWVudD1lLnR5cGUua2luZD09PWB2YWx1ZWB8fHQudHlwZS5raW5kPT09YHZhbHVlYH1zdGF0aWMgcGFyc2UoZSx0KXtpZihlLmxlbmd0aCE9PTMmJmUubGVuZ3RoIT09NClyZXR1cm4gdC5lcnJvcihgRXhwZWN0ZWQgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy5gKTtsZXQgbj1lWzBdLGE9dC5wYXJzZShlWzFdLDEsTCk7aWYoIWEpcmV0dXJuIG51bGw7aWYoIVNpKG4sYS50eXBlKSlyZXR1cm4gdC5jb25jYXQoMSkuZXJyb3IoYCIke259IiBjb21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdHlwZSAnJHtSKGEudHlwZSl9Jy5gKTtsZXQgbz10LnBhcnNlKGVbMl0sMixMKTtpZighbylyZXR1cm4gbnVsbDtpZighU2kobixvLnR5cGUpKXJldHVybiB0LmNvbmNhdCgyKS5lcnJvcihgIiR7bn0iIGNvbXBhcmlzb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciB0eXBlICcke1Ioby50eXBlKX0nLmApO2lmKGEudHlwZS5raW5kIT09by50eXBlLmtpbmQmJmEudHlwZS5raW5kIT09YHZhbHVlYCYmby50eXBlLmtpbmQhPT1gdmFsdWVgKXJldHVybiB0LmVycm9yKGBDYW5ub3QgY29tcGFyZSB0eXBlcyAnJHtSKGEudHlwZSl9JyBhbmQgJyR7UihvLnR5cGUpfScuYCk7ciYmKGEudHlwZS5raW5kPT09YHZhbHVlYCYmby50eXBlLmtpbmQhPT1gdmFsdWVgP2E9bmV3IHVpKG8udHlwZSxbYV0sdC5rZXkpOmEudHlwZS5raW5kIT09YHZhbHVlYCYmby50eXBlLmtpbmQ9PT1gdmFsdWVgJiYobz1uZXcgdWkoYS50eXBlLFtvXSx0LmtleSkpKTtsZXQgcz1udWxsO2lmKGUubGVuZ3RoPT09NCl7aWYoYS50eXBlLmtpbmQhPT1gc3RyaW5nYCYmby50eXBlLmtpbmQhPT1gc3RyaW5nYCYmYS50eXBlLmtpbmQhPT1gdmFsdWVgJiZvLnR5cGUua2luZCE9PWB2YWx1ZWApcmV0dXJuIHQuZXJyb3IoYENhbm5vdCB1c2UgY29sbGF0b3IgdG8gY29tcGFyZSBub24tc3RyaW5nIHR5cGVzLmApO2lmKHM9dC5wYXJzZShlWzNdLDMsR24pLCFzKXJldHVybiBudWxsfXJldHVybiBuZXcgaShhLG8sdC5rZXkscyl9ZXZhbHVhdGUoaSl7bGV0IGE9dGhpcy5saHMuZXZhbHVhdGUoaSksbz10aGlzLnJocy5ldmFsdWF0ZShpKTtpZihyJiZ0aGlzLmhhc1VudHlwZWRBcmd1bWVudCl7bGV0IHQ9R3IoYSksbj1HcihvKTtpZih0LmtpbmQhPT1uLmtpbmR8fHQua2luZCE9PWBzdHJpbmdgJiZ0LmtpbmQhPT1gbnVtYmVyYCl0aHJvdyBuZXcgQihgRXhwZWN0ZWQgYXJndW1lbnRzIGZvciAiJHtlfSIgdG8gYmUgKHN0cmluZywgc3RyaW5nKSBvciAobnVtYmVyLCBudW1iZXIpLCBidXQgZm91bmQgKCR7dC5raW5kfSwgJHtuLmtpbmR9KSBpbnN0ZWFkLmAsdGhpcy5rZXkpfWlmKHRoaXMuY29sbGF0b3ImJiFyJiZ0aGlzLmhhc1VudHlwZWRBcmd1bWVudCl7bGV0IGU9R3IoYSksbj1HcihvKTtpZihlLmtpbmQhPT1gc3RyaW5nYHx8bi5raW5kIT09YHN0cmluZ2ApcmV0dXJuIHQoaSxhLG8pfXJldHVybiB0aGlzLmNvbGxhdG9yP24oaSxhLG8sdGhpcy5jb2xsYXRvci5ldmFsdWF0ZShpKSk6dChpLGEsbyl9ZWFjaENoaWxkKGUpe2UodGhpcy5saHMpLGUodGhpcy5yaHMpLHRoaXMuY29sbGF0b3ImJmUodGhpcy5jb2xsYXRvcil9b3V0cHV0RGVmaW5lZCgpe3JldHVybiEwfX19Y29uc3QgSWk9RmkoYD09YCxDaSxraSksTGk9RmkoYCE9YCx3aSxBaSksUmk9RmkoYDxgLFRpLGppKSx6aT1GaShgPmAsRWksTWkpLEJpPUZpKGA8PWAsRGksTmkpLFZpPUZpKGA+PWAsT2ksUGkpO3ZhciBIaT1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnR5cGU9R24sdGhpcy5sb2NhbGU9bix0aGlzLmNhc2VTZW5zaXRpdmU9ZSx0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZT10fXN0YXRpYyBwYXJzZSh0LG4pe2lmKHQubGVuZ3RoIT09MilyZXR1cm4gbi5lcnJvcihgRXhwZWN0ZWQgb25lIGFyZ3VtZW50LmApO2xldCByPXRbMV07aWYodHlwZW9mIHIhPWBvYmplY3RgfHxBcnJheS5pc0FycmF5KHIpKXJldHVybiBuLmVycm9yKGBDb2xsYXRvciBvcHRpb25zIGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0LmApO2xldCBpPW4ucGFyc2UocltgY2FzZS1zZW5zaXRpdmVgXSE9PXZvaWQgMCYmcltgY2FzZS1zZW5zaXRpdmVgXSwxLEkpO2lmKCFpKXJldHVybiBudWxsO2xldCBhPW4ucGFyc2UocltgZGlhY3JpdGljLXNlbnNpdGl2ZWBdIT09dm9pZCAwJiZyW2BkaWFjcml0aWMtc2Vuc2l0aXZlYF0sMSxJKTtpZighYSlyZXR1cm4gbnVsbDtsZXQgbz1udWxsO3JldHVybiByLmxvY2FsZSYmKG89bi5wYXJzZShyLmxvY2FsZSwxLEYpLCFvKT9udWxsOm5ldyBlKGksYSxvKX1ldmFsdWF0ZShlKXtyZXR1cm4gbmV3IEhyKHRoaXMuY2FzZVNlbnNpdGl2ZS5ldmFsdWF0ZShlKSx0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZS5ldmFsdWF0ZShlKSx0aGlzLmxvY2FsZT90aGlzLmxvY2FsZS5ldmFsdWF0ZShlKTpudWxsKX1lYWNoQ2hpbGQoZSl7ZSh0aGlzLmNhc2VTZW5zaXRpdmUpLGUodGhpcy5kaWFjcml0aWNTZW5zaXRpdmUpLHRoaXMubG9jYWxlJiZlKHRoaXMubG9jYWxlKX1vdXRwdXREZWZpbmVkKCl7cmV0dXJuITF9fSxVaT1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCxuLHIsaSxhKXt0aGlzLnR5cGU9Rix0aGlzLm51bWJlcj1lLHRoaXMubG9jYWxlPXQsdGhpcy5jdXJyZW5jeT1uLHRoaXMudW5pdD1yLHRoaXMubWluRnJhY3Rpb25EaWdpdHM9aSx0aGlzLm1heEZyYWN0aW9uRGlnaXRzPWF9c3RhdGljIHBhcnNlKHQsbil7aWYodC5sZW5ndGghPT0zKXJldHVybiBuLmVycm9yKGBFeHBlY3RlZCB0d28gYXJndW1lbnRzLmApO2xldCByPW4ucGFyc2UodFsxXSwxLFApO2lmKCFyKXJldHVybiBudWxsO2xldCBpPXRbMl07aWYodHlwZW9mIGkhPWBvYmplY3RgfHxBcnJheS5pc0FycmF5KGkpKXJldHVybiBuLmVycm9yKGBOdW1iZXJGb3JtYXQgb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5gKTtsZXQgYT1udWxsO2lmKGkubG9jYWxlJiYoYT1uLnBhcnNlKGkubG9jYWxlLDEsRiksIWEpKXJldHVybiBudWxsO2xldCBvPW51bGw7aWYoaS5jdXJyZW5jeSYmKG89bi5wYXJzZShpLmN1cnJlbmN5LDEsRiksIW8pKXJldHVybiBudWxsO2xldCBzPW51bGw7aWYoaS51bml0JiYocz1uLnBhcnNlKGkudW5pdCwxLEYpLCFzKSlyZXR1cm4gbnVsbDtpZihvJiZzKXJldHVybiBuLmVycm9yKCJOdW1iZXJGb3JtYXQgb3B0aW9ucyBgY3VycmVuY3lgIGFuZCBgdW5pdGAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSIpO2xldCBjPW51bGw7aWYoaVtgbWluLWZyYWN0aW9uLWRpZ2l0c2BdJiYoYz1uLnBhcnNlKGlbYG1pbi1mcmFjdGlvbi1kaWdpdHNgXSwxLFApLCFjKSlyZXR1cm4gbnVsbDtsZXQgbD1udWxsO3JldHVybiBpW2BtYXgtZnJhY3Rpb24tZGlnaXRzYF0mJihsPW4ucGFyc2UoaVtgbWF4LWZyYWN0aW9uLWRpZ2l0c2BdLDEsUCksIWwpP251bGw6bmV3IGUocixhLG8scyxjLGwpfWV2YWx1YXRlKGUpe3JldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5sb2NhbGU/dGhpcy5sb2NhbGUuZXZhbHVhdGUoZSk6W10se3N0eWxlOnRoaXMuY3VycmVuY3k/YGN1cnJlbmN5YDp0aGlzLnVuaXQ/YHVuaXRgOmBkZWNpbWFsYCxjdXJyZW5jeTp0aGlzLmN1cnJlbmN5P3RoaXMuY3VycmVuY3kuZXZhbHVhdGUoZSk6dm9pZCAwLHVuaXQ6dGhpcy51bml0P3RoaXMudW5pdC5ldmFsdWF0ZShlKTp2b2lkIDAsbWluaW11bUZyYWN0aW9uRGlnaXRzOnRoaXMubWluRnJhY3Rpb25EaWdpdHM/dGhpcy5taW5GcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZShlKTp2b2lkIDAsbWF4aW11bUZyYWN0aW9uRGlnaXRzOnRoaXMubWF4RnJhY3Rpb25EaWdpdHM/dGhpcy5tYXhGcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZShlKTp2b2lkIDB9KS5mb3JtYXQodGhpcy5udW1iZXIuZXZhbHVhdGUoZSkpfWVhY2hDaGlsZChlKXtlKHRoaXMubnVtYmVyKSx0aGlzLmxvY2FsZSYmZSh0aGlzLmxvY2FsZSksdGhpcy5jdXJyZW5jeSYmZSh0aGlzLmN1cnJlbmN5KSx0aGlzLnVuaXQmJmUodGhpcy51bml0KSx0aGlzLm1pbkZyYWN0aW9uRGlnaXRzJiZlKHRoaXMubWluRnJhY3Rpb25EaWdpdHMpLHRoaXMubWF4RnJhY3Rpb25EaWdpdHMmJmUodGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyl9b3V0cHV0RGVmaW5lZCgpe3JldHVybiExfX0sV2k9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlKXt0aGlzLnR5cGU9WG4sdGhpcy5pbnB1dD1lfXN0YXRpYyBwYXJzZSh0LG4pe2lmKHQubGVuZ3RoIT09MilyZXR1cm4gbi5lcnJvcihgRXhwZWN0ZWQgdHdvIGFyZ3VtZW50cy5gKTtsZXQgcj1uLnBhcnNlKHRbMV0sMSxGKTtyZXR1cm4gcj9uZXcgZShyKTpuLmVycm9yKGBObyBpbWFnZSBuYW1lIHByb3ZpZGVkLmApfWV2YWx1YXRlKGUpe2xldCB0PXRoaXMuaW5wdXQuZXZhbHVhdGUoZSksbj1Cci5mcm9tU3RyaW5nKHQpO3JldHVybiBuJiZlLmF2YWlsYWJsZUltYWdlcyYmKG4uYXZhaWxhYmxlPWUuYXZhaWxhYmxlSW1hZ2VzLmluZGV4T2YodCk+LTEpLG59ZWFjaENoaWxkKGUpe2UodGhpcy5pbnB1dCl9b3V0cHV0RGVmaW5lZCgpe3JldHVybiExfX0sR2k9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuaW5wdXQ9ZSx0aGlzLmtleT10LHRoaXMudHlwZT1QfXN0YXRpYyBwYXJzZSh0LG4pe2lmKHQubGVuZ3RoIT09MilyZXR1cm4gbi5lcnJvcihgRXhwZWN0ZWQgMSBhcmd1bWVudCwgYnV0IGZvdW5kICR7dC5sZW5ndGgtMX0gaW5zdGVhZC5gKTtsZXQgcj1uLnBhcnNlKHRbMV0sMSk7cmV0dXJuIHI/ci50eXBlLmtpbmQhPT1gYXJyYXlgJiZyLnR5cGUua2luZCE9PWBzdHJpbmdgJiZyLnR5cGUua2luZCE9PWB2YWx1ZWA/bi5lcnJvcihgRXhwZWN0ZWQgYXJndW1lbnQgb2YgdHlwZSBzdHJpbmcgb3IgYXJyYXksIGJ1dCBmb3VuZCAke1Ioci50eXBlKX0gaW5zdGVhZC5gKTpuZXcgZShyLG4ua2V5KTpudWxsfWV2YWx1YXRlKGUpe2xldCB0PXRoaXMuaW5wdXQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIHQ9PWBzdHJpbmdgKXJldHVyblsuLi50XS5sZW5ndGg7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdC5sZW5ndGg7dGhyb3cgbmV3IEIoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9mIHR5cGUgc3RyaW5nIG9yIGFycmF5LCBidXQgZm91bmQgJHtSKEdyKHQpKX0gaW5zdGVhZC5gLHRoaXMua2V5KX1lYWNoQ2hpbGQoZSl7ZSh0aGlzLmlucHV0KX1vdXRwdXREZWZpbmVkKCl7cmV0dXJuITF9fTtjb25zdCBLaT04MTkyO2Z1bmN0aW9uIHFpKGUsdCl7bGV0IG49WWkoZVswXSkscj1aaShlWzFdKSxpPTIqKnQuejtyZXR1cm5bTWF0aC5yb3VuZChuKmkqS2kpLE1hdGgucm91bmQocippKktpKV19ZnVuY3Rpb24gSmkoZSx0KXtsZXQgbj0yKip0Lnoscj0oZVswXS9LaSt0LngpL24saT0oZVsxXS9LaSt0LnkpL247cmV0dXJuW1hpKHIpLFFpKGkpXX1mdW5jdGlvbiBZaShlKXtyZXR1cm4oMTgwK2UpLzM2MH1mdW5jdGlvbiBYaShlKXtyZXR1cm4gZSozNjAtMTgwfWZ1bmN0aW9uIFppKGUpe3JldHVybigxODAtMTgwL01hdGguUEkqTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K2UqTWF0aC5QSS8zNjApKSkvMzYwfWZ1bmN0aW9uIFFpKGUpe3JldHVybiAzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoKDE4MC1lKjM2MCkqTWF0aC5QSS8xODApKS05MH1mdW5jdGlvbiAkaShlLHQpe2VbMF09TWF0aC5taW4oZVswXSx0WzBdKSxlWzFdPU1hdGgubWluKGVbMV0sdFsxXSksZVsyXT1NYXRoLm1heChlWzJdLHRbMF0pLGVbM109TWF0aC5tYXgoZVszXSx0WzFdKX1mdW5jdGlvbiBlYShlLHQpe3JldHVybiEoZVswXTw9dFswXXx8ZVsyXT49dFsyXXx8ZVsxXTw9dFsxXXx8ZVszXT49dFszXSl9ZnVuY3Rpb24gdGEoZSx0LG4pe3JldHVybiB0WzFdPmVbMV0hPW5bMV0+ZVsxXSYmZVswXTwoblswXS10WzBdKSooZVsxXS10WzFdKS8oblsxXS10WzFdKSt0WzBdfWZ1bmN0aW9uIG5hKGUsdCxuKXtsZXQgcj1lWzBdLXRbMF0saT1lWzFdLXRbMV0sYT1lWzBdLW5bMF0sbz1lWzFdLW5bMV07cmV0dXJuIHIqby1hKmk9PT0wJiZyKmE8PTAmJmkqbzw9MH1mdW5jdGlvbiByYShlLHQsbixyKXtsZXQgaT1bdFswXS1lWzBdLHRbMV0tZVsxXV07cmV0dXJuIGxhKFtyWzBdLW5bMF0sclsxXS1uWzFdXSxpKSE9PTAmJiEhKHVhKGUsdCxuLHIpJiZ1YShuLHIsZSx0KSl9ZnVuY3Rpb24gaWEoZSx0LG4pe2ZvcihsZXQgciBvZiBuKWZvcihsZXQgbj0wO248ci5sZW5ndGgtMTsrK24paWYocmEoZSx0LHJbbl0scltuKzFdKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBhYShlLHQsbj0hMSl7bGV0IHI9ITE7Zm9yKGxldCBpIG9mIHQpZm9yKGxldCB0PTA7dDxpLmxlbmd0aC0xO3QrKyl7aWYobmEoZSxpW3RdLGlbdCsxXSkpcmV0dXJuIG47dGEoZSxpW3RdLGlbdCsxXSkmJihyPSFyKX1yZXR1cm4gcn1mdW5jdGlvbiBvYShlLHQpe2ZvcihsZXQgbiBvZiB0KWlmKGFhKGUsbikpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gc2EoZSx0KXtmb3IobGV0IG4gb2YgZSlpZighYWEobix0KSlyZXR1cm4hMTtmb3IobGV0IG49MDtuPGUubGVuZ3RoLTE7KytuKWlmKGlhKGVbbl0sZVtuKzFdLHQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGNhKGUsdCl7Zm9yKGxldCBuIG9mIHQpaWYoc2EoZSxuKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBsYShlLHQpe3JldHVybiBlWzBdKnRbMV0tZVsxXSp0WzBdfWZ1bmN0aW9uIHVhKGUsdCxuLHIpe2xldCBpPWVbMF0tblswXSxhPWVbMV0tblsxXSxvPXRbMF0tblswXSxzPXRbMV0tblsxXSxjPXJbMF0tblswXSxsPXJbMV0tblsxXSx1PWkqbC1jKmEsZD1vKmwtYypzO3JldHVybiB1PjAmJmQ8MHx8dTwwJiZkPjB9ZnVuY3Rpb24gZGEoZSx0LG4pe2xldCByPVtdO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXQgYT1bXTtmb3IobGV0IHI9MDtyPGVbaV0ubGVuZ3RoO3IrKyl7bGV0IG89cWkoZVtpXVtyXSxuKTskaSh0LG8pLGEucHVzaChvKX1yLnB1c2goYSl9cmV0dXJuIHJ9ZnVuY3Rpb24gZmEoZSx0LG4pe2xldCByPVtdO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXQgYT1kYShlW2ldLHQsbik7ci5wdXNoKGEpfXJldHVybiByfWZ1bmN0aW9uIHBhKGUsdCxuLHIpe2lmKGVbMF08blswXXx8ZVswXT5uWzJdKXtsZXQgdD1yKi41LGk9ZVswXS1uWzBdPnQ/LXI6blswXS1lWzBdPnQ/cjowO2k9PT0wJiYoaT1lWzBdLW5bMl0+dD8tcjpuWzJdLWVbMF0+dD9yOjApLGVbMF0rPWl9JGkodCxlKX1mdW5jdGlvbiBtYShlKXtlWzBdPWVbMV09MS8wLGVbMl09ZVszXT0tMS8wfWZ1bmN0aW9uIGhhKGUsdCxuLHIpe2xldCBpPTIqKnIueipLaSxhPVtyLngqS2ksci55KktpXSxvPVtdO2ZvcihsZXQgciBvZiBlKWZvcihsZXQgZSBvZiByKXtsZXQgcj1bZS54K2FbMF0sZS55K2FbMV1dO3BhKHIsdCxuLGkpLG8ucHVzaChyKX1yZXR1cm4gb31mdW5jdGlvbiBnYShlLHQsbixyKXtsZXQgaT0yKipyLnoqS2ksYT1bci54KktpLHIueSpLaV0sbz1bXTtmb3IobGV0IG4gb2YgZSl7bGV0IGU9W107Zm9yKGxldCByIG9mIG4pe2xldCBuPVtyLngrYVswXSxyLnkrYVsxXV07JGkodCxuKSxlLnB1c2gobil9by5wdXNoKGUpfWlmKHRbMl0tdFswXTw9aS8yKXttYSh0KTtmb3IobGV0IGUgb2Ygbylmb3IobGV0IHIgb2YgZSlwYShyLHQsbixpKX1yZXR1cm4gb31mdW5jdGlvbiBfYShlLHQpe2xldCBuPVsxLzAsMS8wLC0xLzAsLTEvMF0scj1bMS8wLDEvMCwtMS8wLC0xLzBdLGk9ZS5jYW5vbmljYWxJRCgpO2lmKHQudHlwZT09PWBQb2x5Z29uYCl7bGV0IGE9ZGEodC5jb29yZGluYXRlcyxyLGkpLG89aGEoZS5nZW9tZXRyeSgpLG4scixpKTtpZighZWEobixyKSlyZXR1cm4hMTtmb3IobGV0IGUgb2YgbylpZighYWEoZSxhKSlyZXR1cm4hMX1pZih0LnR5cGU9PT1gTXVsdGlQb2x5Z29uYCl7bGV0IGE9ZmEodC5jb29yZGluYXRlcyxyLGkpLG89aGEoZS5nZW9tZXRyeSgpLG4scixpKTtpZighZWEobixyKSlyZXR1cm4hMTtmb3IobGV0IGUgb2YgbylpZighb2EoZSxhKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiB2YShlLHQpe2xldCBuPVsxLzAsMS8wLC0xLzAsLTEvMF0scj1bMS8wLDEvMCwtMS8wLC0xLzBdLGk9ZS5jYW5vbmljYWxJRCgpO2lmKHQudHlwZT09PWBQb2x5Z29uYCl7bGV0IGE9ZGEodC5jb29yZGluYXRlcyxyLGkpLG89Z2EoZS5nZW9tZXRyeSgpLG4scixpKTtpZighZWEobixyKSlyZXR1cm4hMTtmb3IobGV0IGUgb2YgbylpZighc2EoZSxhKSlyZXR1cm4hMX1pZih0LnR5cGU9PT1gTXVsdGlQb2x5Z29uYCl7bGV0IGE9ZmEodC5jb29yZGluYXRlcyxyLGkpLG89Z2EoZS5nZW9tZXRyeSgpLG4scixpKTtpZighZWEobixyKSlyZXR1cm4hMTtmb3IobGV0IGUgb2YgbylpZighY2EoZSxhKSlyZXR1cm4hMX1yZXR1cm4hMH12YXIgeWE9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlLHQpe3RoaXMudHlwZT1JLHRoaXMuZ2VvanNvbj1lLHRoaXMuZ2VvbWV0cmllcz10fXN0YXRpYyBwYXJzZSh0LG4pe2lmKHQubGVuZ3RoIT09MilyZXR1cm4gbi5lcnJvcihgJ3dpdGhpbicgZXhwcmVzc2lvbiByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgYnV0IGZvdW5kICR7dC5sZW5ndGgtMX0gaW5zdGVhZC5gKTtpZihXcih0WzFdKSl7bGV0IG49dFsxXTtpZihuLnR5cGU9PT1gRmVhdHVyZUNvbGxlY3Rpb25gKXtsZXQgdD1bXTtmb3IobGV0IGUgb2Ygbi5mZWF0dXJlcyl7bGV0e3R5cGU6bixjb29yZGluYXRlczpyfT1lLmdlb21ldHJ5O249PT1gUG9seWdvbmAmJnQucHVzaChyKSxuPT09YE11bHRpUG9seWdvbmAmJnQucHVzaCguLi5yKX1pZih0Lmxlbmd0aClyZXR1cm4gbmV3IGUobix7dHlwZTpgTXVsdGlQb2x5Z29uYCxjb29yZGluYXRlczp0fSl9ZWxzZSBpZihuLnR5cGU9PT1gRmVhdHVyZWApe2xldCB0PW4uZ2VvbWV0cnkudHlwZTtpZih0PT09YFBvbHlnb25gfHx0PT09YE11bHRpUG9seWdvbmApcmV0dXJuIG5ldyBlKG4sbi5nZW9tZXRyeSl9ZWxzZSBpZihuLnR5cGU9PT1gUG9seWdvbmB8fG4udHlwZT09PWBNdWx0aVBvbHlnb25gKXJldHVybiBuZXcgZShuLG4pfXJldHVybiBuLmVycm9yKGAnd2l0aGluJyBleHByZXNzaW9uIHJlcXVpcmVzIHZhbGlkIGdlb2pzb24gb2JqZWN0IHRoYXQgY29udGFpbnMgcG9seWdvbiBnZW9tZXRyeSB0eXBlLmApfWV2YWx1YXRlKGUpe2lmKGUuZ2VvbWV0cnkoKSE9bnVsbCYmZS5jYW5vbmljYWxJRCgpIT1udWxsKXtpZihlLmdlb21ldHJ5VHlwZSgpPT09YFBvaW50YClyZXR1cm4gX2EoZSx0aGlzLmdlb21ldHJpZXMpO2lmKGUuZ2VvbWV0cnlUeXBlKCk9PT1gTGluZVN0cmluZ2ApcmV0dXJuIHZhKGUsdGhpcy5nZW9tZXRyaWVzKX1yZXR1cm4hMX1lYWNoQ2hpbGQoKXt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiEwfX0sYmE9Y2xhc3N7Y29uc3RydWN0b3IoZT1bXSx0PShlLHQpPT5lPHQ/LTE6KyhlPnQpKXtpZih0aGlzLmRhdGE9ZSx0aGlzLmxlbmd0aD10aGlzLmRhdGEubGVuZ3RoLHRoaXMuY29tcGFyZT10LHRoaXMubGVuZ3RoPjApZm9yKGxldCBlPSh0aGlzLmxlbmd0aD4+MSktMTtlPj0wO2UtLSl0aGlzLl9kb3duKGUpfXB1c2goZSl7dGhpcy5kYXRhLnB1c2goZSksdGhpcy5fdXAodGhpcy5sZW5ndGgrKyl9cG9wKCl7aWYodGhpcy5sZW5ndGg9PT0wKXJldHVybjtsZXQgZT10aGlzLmRhdGFbMF0sdD10aGlzLmRhdGEucG9wKCk7cmV0dXJuLS10aGlzLmxlbmd0aD4wJiYodGhpcy5kYXRhWzBdPXQsdGhpcy5fZG93bigwKSksZX1wZWVrKCl7cmV0dXJuIHRoaXMuZGF0YVswXX1fdXAoZSl7bGV0e2RhdGE6dCxjb21wYXJlOm59PXRoaXMscj10W2VdO2Zvcig7ZT4wOyl7bGV0IGk9ZS0xPj4xLGE9dFtpXTtpZihuKHIsYSk+PTApYnJlYWs7dFtlXT1hLGU9aX10W2VdPXJ9X2Rvd24oZSl7bGV0e2RhdGE6dCxjb21wYXJlOm59PXRoaXMscj10aGlzLmxlbmd0aD4+MSxpPXRbZV07Zm9yKDtlPHI7KXtsZXQgcj0oZTw8MSkrMSxhPXIrMTtpZihhPHRoaXMubGVuZ3RoJiZuKHRbYV0sdFtyXSk8MCYmKHI9YSksbih0W3JdLGkpPj0wKWJyZWFrO3RbZV09dFtyXSxlPXJ9dFtlXT1pfX07Y29uc3QgeGE9TWF0aC5QSS8xODA7dmFyIFNhPWNsYXNze2NvbnN0cnVjdG9yKGUpe2xldCB0PXhhKjYzNzguMTM3KjFlMyxuPU1hdGguY29zKGUqeGEpLHI9MS8oMS0uMDA2Njk0Mzc5OTkwMTQxMzE2NSooMS1uKm4pKSxpPU1hdGguc3FydChyKTt0aGlzLmt4PXQqaSpuLHRoaXMua3k9dCppKnIqLjk5MzMwNTYyMDAwOTg1ODd9ZGlzdGFuY2UoZSx0KXtsZXQgbj10aGlzLndyYXAoZVswXS10WzBdKSp0aGlzLmt4LHI9KGVbMV0tdFsxXSkqdGhpcy5reTtyZXR1cm4gTWF0aC5zcXJ0KG4qbityKnIpfXBvaW50T25MaW5lKGUsdCl7bGV0IG49MS8wLHIsaSxhLG87Zm9yKGxldCBzPTA7czxlLmxlbmd0aC0xO3MrKyl7bGV0IGM9ZVtzXVswXSxsPWVbc11bMV0sdT10aGlzLndyYXAoZVtzKzFdWzBdLWMpKnRoaXMua3gsZD0oZVtzKzFdWzFdLWwpKnRoaXMua3ksZj0wOyh1IT09MHx8ZCE9PTApJiYoZj0odGhpcy53cmFwKHRbMF0tYykqdGhpcy5reCp1Kyh0WzFdLWwpKnRoaXMua3kqZCkvKHUqdStkKmQpLGY+MT8oYz1lW3MrMV1bMF0sbD1lW3MrMV1bMV0pOmY+MCYmKGMrPXUvdGhpcy5reCpmLGwrPWQvdGhpcy5reSpmKSksdT10aGlzLndyYXAodFswXS1jKSp0aGlzLmt4LGQ9KHRbMV0tbCkqdGhpcy5reTtsZXQgcD11KnUrZCpkO3A8biYmKG49cCxyPWMsaT1sLGE9cyxvPWYpfXJldHVybntwb2ludDpbcixpXSxpbmRleDphLHQ6TWF0aC5tYXgoMCxNYXRoLm1pbigxLG8pKX19d3JhcChlKXtmb3IoO2U8LTE4MDspZSs9MzYwO2Zvcig7ZT4xODA7KWUtPTM2MDtyZXR1cm4gZX19O2Z1bmN0aW9uIENhKGUsdCl7cmV0dXJuIHRbMF0tZVswXX1mdW5jdGlvbiB3YShlKXtyZXR1cm4gZVsxXS1lWzBdKzF9ZnVuY3Rpb24gVGEoZSx0KXtyZXR1cm4gZVsxXT49ZVswXSYmZVsxXTx0fWZ1bmN0aW9uIEVhKGUsdCl7aWYoZVswXT5lWzFdKXJldHVybltudWxsLG51bGxdO2xldCBuPXdhKGUpO2lmKHQpe2lmKG49PT0yKXJldHVybltlLG51bGxdO2xldCB0PU1hdGguZmxvb3Iobi8yKTtyZXR1cm5bW2VbMF0sZVswXSt0XSxbZVswXSt0LGVbMV1dXX1pZihuPT09MSlyZXR1cm5bZSxudWxsXTtsZXQgcj1NYXRoLmZsb29yKG4vMiktMTtyZXR1cm5bW2VbMF0sZVswXStyXSxbZVswXStyKzEsZVsxXV1dfWZ1bmN0aW9uIERhKGUsdCl7aWYoIVRhKHQsZS5sZW5ndGgpKXJldHVyblsxLzAsMS8wLC0xLzAsLTEvMF07bGV0IG49WzEvMCwxLzAsLTEvMCwtMS8wXTtmb3IobGV0IHI9dFswXTtyPD10WzFdOysrcikkaShuLGVbcl0pO3JldHVybiBufWZ1bmN0aW9uIE9hKGUpe2xldCB0PVsxLzAsMS8wLC0xLzAsLTEvMF07Zm9yKGxldCBuIG9mIGUpZm9yKGxldCBlIG9mIG4pJGkodCxlKTtyZXR1cm4gdH1mdW5jdGlvbiBrYShlKXtyZXR1cm4gZVswXSE9PS0xLzAmJmVbMV0hPT0tMS8wJiZlWzJdIT09MS8wJiZlWzNdIT09MS8wfWZ1bmN0aW9uIEFhKGUsdCxuKXtpZigha2EoZSl8fCFrYSh0KSlyZXR1cm4gTmFOO2xldCByPTAsaT0wO3JldHVybiBlWzJdPHRbMF0mJihyPXRbMF0tZVsyXSksZVswXT50WzJdJiYocj1lWzBdLXRbMl0pLGVbMV0+dFszXSYmKGk9ZVsxXS10WzNdKSxlWzNdPHRbMV0mJihpPXRbMV0tZVszXSksbi5kaXN0YW5jZShbMCwwXSxbcixpXSl9ZnVuY3Rpb24gamEoZSx0LG4pe2xldCByPW4ucG9pbnRPbkxpbmUodCxlKTtyZXR1cm4gbi5kaXN0YW5jZShlLHIucG9pbnQpfWZ1bmN0aW9uIE1hKGUsdCxuLHIsaSl7bGV0IGE9TWF0aC5taW4oamEoZSxbbixyXSxpKSxqYSh0LFtuLHJdLGkpKSxvPU1hdGgubWluKGphKG4sW2UsdF0saSksamEocixbZSx0XSxpKSk7cmV0dXJuIE1hdGgubWluKGEsbyl9ZnVuY3Rpb24gTmEoZSx0LG4scixpKXtpZighKFRhKHQsZS5sZW5ndGgpJiZUYShyLG4ubGVuZ3RoKSkpcmV0dXJuIDEvMDtsZXQgYT0xLzA7Zm9yKGxldCBvPXRbMF07bzx0WzFdOysrbyl7bGV0IHQ9ZVtvXSxzPWVbbysxXTtmb3IobGV0IGU9clswXTtlPHJbMV07KytlKXtsZXQgcj1uW2VdLG89bltlKzFdO2lmKHJhKHQscyxyLG8pKXJldHVybiAwO2E9TWF0aC5taW4oYSxNYSh0LHMscixvLGkpKX19cmV0dXJuIGF9ZnVuY3Rpb24gUGEoZSx0LG4scixpKXtpZighKFRhKHQsZS5sZW5ndGgpJiZUYShyLG4ubGVuZ3RoKSkpcmV0dXJuIE5hTjtsZXQgYT0xLzA7Zm9yKGxldCBvPXRbMF07bzw9dFsxXTsrK28pZm9yKGxldCB0PXJbMF07dDw9clsxXTsrK3QpaWYoYT1NYXRoLm1pbihhLGkuZGlzdGFuY2UoZVtvXSxuW3RdKSksYT09PTApcmV0dXJuIGE7cmV0dXJuIGF9ZnVuY3Rpb24gRmEoZSx0LG4pe2lmKGFhKGUsdCwhMCkpcmV0dXJuIDA7bGV0IHI9MS8wO2ZvcihsZXQgaSBvZiB0KXtsZXQgdD1pWzBdLGE9aVtpLmxlbmd0aC0xXTtpZih0IT09YSYmKHI9TWF0aC5taW4ocixqYShlLFthLHRdLG4pKSxyPT09MCkpcmV0dXJuIHI7bGV0IG89bi5wb2ludE9uTGluZShpLGUpO2lmKHI9TWF0aC5taW4ocixuLmRpc3RhbmNlKGUsby5wb2ludCkpLHI9PT0wKXJldHVybiByfXJldHVybiByfWZ1bmN0aW9uIElhKGUsdCxuLHIpe2lmKCFUYSh0LGUubGVuZ3RoKSlyZXR1cm4gTmFOO2ZvcihsZXQgcj10WzBdO3I8PXRbMV07KytyKWlmKGFhKGVbcl0sbiwhMCkpcmV0dXJuIDA7bGV0IGk9MS8wO2ZvcihsZXQgYT10WzBdO2E8dFsxXTsrK2Epe2xldCB0PWVbYV0sbz1lW2ErMV07Zm9yKGxldCBlIG9mIG4pZm9yKGxldCBuPTAsYT1lLmxlbmd0aCxzPWEtMTtuPGE7cz1uKyspe2xldCBhPWVbc10sYz1lW25dO2lmKHJhKHQsbyxhLGMpKXJldHVybiAwO2k9TWF0aC5taW4oaSxNYSh0LG8sYSxjLHIpKX19cmV0dXJuIGl9ZnVuY3Rpb24gTGEoZSx0KXtmb3IobGV0IG4gb2YgZSlmb3IobGV0IGUgb2YgbilpZihhYShlLHQsITApKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIFJhKGUsdCxuLHI9MS8wKXtsZXQgaT1PYShlKSxhPU9hKHQpO2lmKHIhPT0xLzAmJkFhKGksYSxuKT49cilyZXR1cm4gcjtpZihlYShpLGEpKXtpZihMYShlLHQpKXJldHVybiAwfWVsc2UgaWYoTGEodCxlKSlyZXR1cm4gMDtsZXQgbz0xLzA7Zm9yKGxldCByIG9mIGUpZm9yKGxldCBlPTAsaT1yLmxlbmd0aCxhPWktMTtlPGk7YT1lKyspe2xldCBpPXJbYV0scz1yW2VdO2ZvcihsZXQgZSBvZiB0KWZvcihsZXQgdD0wLHI9ZS5sZW5ndGgsYT1yLTE7dDxyO2E9dCsrKXtsZXQgcj1lW2FdLGM9ZVt0XTtpZihyYShpLHMscixjKSlyZXR1cm4gMDtvPU1hdGgubWluKG8sTWEoaSxzLHIsYyxuKSl9fXJldHVybiBvfWZ1bmN0aW9uIHphKGUsdCxuLHIsaSxhKXtpZighYSlyZXR1cm47bGV0IG89QWEoRGEocixhKSxpLG4pO288dCYmZS5wdXNoKFtvLGEsWzAsMF1dKX1mdW5jdGlvbiBCYShlLHQsbixyLGksYSxvKXtpZighYXx8IW8pcmV0dXJuO2xldCBzPUFhKERhKHIsYSksRGEoaSxvKSxuKTtzPHQmJmUucHVzaChbcyxhLG9dKX1mdW5jdGlvbiBWYShlLHQsbixyLGk9MS8wKXtsZXQgYT1NYXRoLm1pbihyLmRpc3RhbmNlKGVbMF0sblswXVswXSksaSk7aWYoYT09PTApcmV0dXJuIGE7bGV0IG89bmV3IGJhKFtbMCxbMCxlLmxlbmd0aC0xXSxbMCwwXV1dLENhKSxzPU9hKG4pO2Zvcig7by5sZW5ndGg+MDspe2xldCBpPW8ucG9wKCk7aWYoaVswXT49YSljb250aW51ZTtsZXQgYz1pWzFdLGw9dD81MDoxMDA7aWYod2EoYyk8PWwpe2lmKCFUYShjLGUubGVuZ3RoKSlyZXR1cm4gTmFOO2lmKHQpe2xldCB0PUlhKGUsYyxuLHIpO2lmKGlzTmFOKHQpfHx0PT09MClyZXR1cm4gdDthPU1hdGgubWluKGEsdCl9ZWxzZSBmb3IobGV0IHQ9Y1swXTt0PD1jWzFdOysrdCl7bGV0IGk9RmEoZVt0XSxuLHIpO2lmKGE9TWF0aC5taW4oYSxpKSxhPT09MClyZXR1cm4gMH19ZWxzZXtsZXQgbj1FYShjLHQpO3phKG8sYSxyLGUscyxuWzBdKSx6YShvLGEscixlLHMsblsxXSl9fXJldHVybiBhfWZ1bmN0aW9uIEhhKGUsdCxuLHIsaSxhPTEvMCl7bGV0IG89TWF0aC5taW4oYSxpLmRpc3RhbmNlKGVbMF0sblswXSkpO2lmKG89PT0wKXJldHVybiBvO2xldCBzPW5ldyBiYShbWzAsWzAsZS5sZW5ndGgtMV0sWzAsbi5sZW5ndGgtMV1dXSxDYSk7Zm9yKDtzLmxlbmd0aD4wOyl7bGV0IGE9cy5wb3AoKTtpZihhWzBdPj1vKWNvbnRpbnVlO2xldCBjPWFbMV0sbD1hWzJdLHU9dD81MDoxMDAsZD1yPzUwOjEwMDtpZih3YShjKTw9dSYmd2EobCk8PWQpe2lmKCFUYShjLGUubGVuZ3RoKSYmVGEobCxuLmxlbmd0aCkpcmV0dXJuIE5hTjtsZXQgYTtpZih0JiZyKWE9TmEoZSxjLG4sbCxpKSxvPU1hdGgubWluKG8sYSk7ZWxzZSBpZih0JiYhcil7bGV0IHQ9ZS5zbGljZShjWzBdLGNbMV0rMSk7Zm9yKGxldCBlPWxbMF07ZTw9bFsxXTsrK2UpaWYoYT1qYShuW2VdLHQsaSksbz1NYXRoLm1pbihvLGEpLG89PT0wKXJldHVybiBvfWVsc2UgaWYoIXQmJnIpe2xldCB0PW4uc2xpY2UobFswXSxsWzFdKzEpO2ZvcihsZXQgbj1jWzBdO248PWNbMV07KytuKWlmKGE9amEoZVtuXSx0LGkpLG89TWF0aC5taW4obyxhKSxvPT09MClyZXR1cm4gb31lbHNlIGE9UGEoZSxjLG4sbCxpKSxvPU1hdGgubWluKG8sYSl9ZWxzZXtsZXQgYT1FYShjLHQpLHU9RWEobCxyKTtCYShzLG8saSxlLG4sYVswXSx1WzBdKSxCYShzLG8saSxlLG4sYVswXSx1WzFdKSxCYShzLG8saSxlLG4sYVsxXSx1WzBdKSxCYShzLG8saSxlLG4sYVsxXSx1WzFdKX19cmV0dXJuIG99ZnVuY3Rpb24gVWEoZSx0KXtsZXQgbj1lLmdlb21ldHJ5KCkscj1uLmZsYXQoKS5tYXAodD0+SmkoW3QueCx0LnldLGUuY2Fub25pY2FsKSk7aWYobi5sZW5ndGg9PT0wKXJldHVybiBOYU47bGV0IGk9bmV3IFNhKHJbMF1bMV0pLGE9MS8wO2ZvcihsZXQgZSBvZiB0KXtzd2l0Y2goZS50eXBlKXtjYXNlYFBvaW50YDphPU1hdGgubWluKGEsSGEociwhMSxbZS5jb29yZGluYXRlc10sITEsaSxhKSk7YnJlYWs7Y2FzZWBMaW5lU3RyaW5nYDphPU1hdGgubWluKGEsSGEociwhMSxlLmNvb3JkaW5hdGVzLCEwLGksYSkpO2JyZWFrO2Nhc2VgUG9seWdvbmA6YT1NYXRoLm1pbihhLFZhKHIsITEsZS5jb29yZGluYXRlcyxpLGEpKX1pZihhPT09MClyZXR1cm4gYX1yZXR1cm4gYX1mdW5jdGlvbiBXYShlLHQpe2xldCBuPWUuZ2VvbWV0cnkoKSxyPW4uZmxhdCgpLm1hcCh0PT5KaShbdC54LHQueV0sZS5jYW5vbmljYWwpKTtpZihuLmxlbmd0aD09PTApcmV0dXJuIE5hTjtsZXQgaT1uZXcgU2EoclswXVsxXSksYT0xLzA7Zm9yKGxldCBlIG9mIHQpe3N3aXRjaChlLnR5cGUpe2Nhc2VgUG9pbnRgOmE9TWF0aC5taW4oYSxIYShyLCEwLFtlLmNvb3JkaW5hdGVzXSwhMSxpLGEpKTticmVhaztjYXNlYExpbmVTdHJpbmdgOmE9TWF0aC5taW4oYSxIYShyLCEwLGUuY29vcmRpbmF0ZXMsITAsaSxhKSk7YnJlYWs7Y2FzZWBQb2x5Z29uYDphPU1hdGgubWluKGEsVmEociwhMCxlLmNvb3JkaW5hdGVzLGksYSkpfWlmKGE9PT0wKXJldHVybiBhfXJldHVybiBhfWZ1bmN0aW9uIEdhKGUsdCl7bGV0IG49ZS5nZW9tZXRyeSgpO2lmKG4ubGVuZ3RoPT09MHx8blswXS5sZW5ndGg9PT0wKXJldHVybiBOYU47bGV0IHI9b2kobiwwKS5tYXAodD0+dC5tYXAodD0+dC5tYXAodD0+SmkoW3QueCx0LnldLGUuY2Fub25pY2FsKSkpKSxpPW5ldyBTYShyWzBdWzBdWzBdWzFdKSxhPTEvMDtmb3IobGV0IGUgb2YgdClmb3IobGV0IHQgb2Ygcil7c3dpdGNoKGUudHlwZSl7Y2FzZWBQb2ludGA6YT1NYXRoLm1pbihhLFZhKFtlLmNvb3JkaW5hdGVzXSwhMSx0LGksYSkpO2JyZWFrO2Nhc2VgTGluZVN0cmluZ2A6YT1NYXRoLm1pbihhLFZhKGUuY29vcmRpbmF0ZXMsITAsdCxpLGEpKTticmVhaztjYXNlYFBvbHlnb25gOmE9TWF0aC5taW4oYSxSYSh0LGUuY29vcmRpbmF0ZXMsaSxhKSl9aWYoYT09PTApcmV0dXJuIGF9cmV0dXJuIGF9ZnVuY3Rpb24gS2EoZSl7cmV0dXJuIGUudHlwZT09PWBNdWx0aVBvbHlnb25gP2UuY29vcmRpbmF0ZXMubWFwKGU9Pih7dHlwZTpgUG9seWdvbmAsY29vcmRpbmF0ZXM6ZX0pKTplLnR5cGU9PT1gTXVsdGlMaW5lU3RyaW5nYD9lLmNvb3JkaW5hdGVzLm1hcChlPT4oe3R5cGU6YExpbmVTdHJpbmdgLGNvb3JkaW5hdGVzOmV9KSk6ZS50eXBlPT09YE11bHRpUG9pbnRgP2UuY29vcmRpbmF0ZXMubWFwKGU9Pih7dHlwZTpgUG9pbnRgLGNvb3JkaW5hdGVzOmV9KSk6W2VdfXZhciBxYT1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPVAsdGhpcy5nZW9qc29uPWUsdGhpcy5nZW9tZXRyaWVzPXR9c3RhdGljIHBhcnNlKHQsbil7aWYodC5sZW5ndGghPT0yKXJldHVybiBuLmVycm9yKGAnZGlzdGFuY2UnIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIGJ1dCBmb3VuZCAke3QubGVuZ3RoLTF9IGluc3RlYWQuYCk7aWYoV3IodFsxXSkpe2xldCBuPXRbMV07aWYobi50eXBlPT09YEZlYXR1cmVDb2xsZWN0aW9uYClyZXR1cm4gbmV3IGUobixuLmZlYXR1cmVzLm1hcChlPT5LYShlLmdlb21ldHJ5KSkuZmxhdCgpKTtpZihuLnR5cGU9PT1gRmVhdHVyZWApcmV0dXJuIG5ldyBlKG4sS2Eobi5nZW9tZXRyeSkpO2lmKGB0eXBlYGluIG4mJmBjb29yZGluYXRlc2BpbiBuKXJldHVybiBuZXcgZShuLEthKG4pKX1yZXR1cm4gbi5lcnJvcihgJ2Rpc3RhbmNlJyBleHByZXNzaW9uIHJlcXVpcmVzIHZhbGlkIGdlb2pzb24gb2JqZWN0IHRoYXQgY29udGFpbnMgcG9seWdvbiBnZW9tZXRyeSB0eXBlLmApfWV2YWx1YXRlKGUpe2lmKGUuZ2VvbWV0cnkoKSE9bnVsbCYmZS5jYW5vbmljYWxJRCgpIT1udWxsKXtpZihlLmdlb21ldHJ5VHlwZSgpPT09YFBvaW50YClyZXR1cm4gVWEoZSx0aGlzLmdlb21ldHJpZXMpO2lmKGUuZ2VvbWV0cnlUeXBlKCk9PT1gTGluZVN0cmluZ2ApcmV0dXJuIFdhKGUsdGhpcy5nZW9tZXRyaWVzKTtpZihlLmdlb21ldHJ5VHlwZSgpPT09YFBvbHlnb25gKXJldHVybiBHYShlLHRoaXMuZ2VvbWV0cmllcyl9cmV0dXJuIE5hTn1lYWNoQ2hpbGQoKXt9b3V0cHV0RGVmaW5lZCgpe3JldHVybiEwfX0sSmE9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlKXtsZXQgdD1udWxsO2ZvcihsZXQgbiBvZiBlKWlmKCF0KXQ9bi50eXBlO2Vsc2UgaWYodD09PW4udHlwZSljb250aW51ZTtlbHNle3Q9TDticmVha310aGlzLnR5cGU9UW4odD8/TCxlLmxlbmd0aCksdGhpcy5hcnI9ZX1zdGF0aWMgcGFyc2UodCxuKXtpZih0Lmxlbmd0aCE9PTIpcmV0dXJuIG4uZXJyb3IoYCdzZW1pbGl0ZXJhbCcgZXhwcmVzc2lvbiByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgYnV0IGZvdW5kICR7dC5sZW5ndGgtMX0gaW5zdGVhZC5gKTtpZighV3IodFsxXSkpcmV0dXJuIG4uZXJyb3IoYGludmFsaWQgdmFsdWUgb2YgdHlwZSAiJHt0eXBlb2YgdFsxXX0iYCk7bGV0IHI9dFsxXSxpPUdyKHIpO2lmKGkua2luZD09PWBhcnJheWApe2xldCB0PXIubWFwKGU9Pm4ucGFyc2UoZSxudWxsLEwpKTtyZXR1cm4gbmV3IGUodCl9cmV0dXJuIG5ldyBxcihpLHIpfWV2YWx1YXRlKGUpe3JldHVybiB0aGlzLmFyci5tYXAodD0+dC5ldmFsdWF0ZShlKSl9ZWFjaENoaWxkKGUpe3RoaXMuYXJyLmZvckVhY2goZSl9b3V0cHV0RGVmaW5lZCgpe3JldHVybiB0aGlzLmFyci5ldmVyeShlPT5lLm91dHB1dERlZmluZWQoKSl9fSxZYT1jbGFzcyBle2NvbnN0cnVjdG9yKGUpe3RoaXMua2V5PWUsdGhpcy50eXBlPUx9c3RhdGljIHBhcnNlKHQsbil7aWYodC5sZW5ndGghPT0yKXJldHVybiBuLmVycm9yKGBFeHBlY3RlZCAxIGFyZ3VtZW50LCBidXQgZm91bmQgJHt0Lmxlbmd0aC0xfSBpbnN0ZWFkLmApO2xldCByPXRbMV07cmV0dXJuIHI9PW51bGw/bi5lcnJvcihgR2xvYmFsIHN0YXRlIHByb3BlcnR5IG11c3QgYmUgZGVmaW5lZC5gKTp0eXBlb2Ygcj09YHN0cmluZ2A/bmV3IGUocik6bi5lcnJvcihgR2xvYmFsIHN0YXRlIHByb3BlcnR5IG11c3QgYmUgc3RyaW5nLCBidXQgZm91bmQgJHt0eXBlb2YgdFsxXX0gaW5zdGVhZC5gKX1ldmFsdWF0ZShlKXtsZXQgdD1lLmdsb2JhbHM/Lmdsb2JhbFN0YXRlO3JldHVybiF0fHxPYmplY3Qua2V5cyh0KS5sZW5ndGg9PT0wP251bGw6U3IodCx0aGlzLmtleSk/P251bGx9ZWFjaENoaWxkKCl7fW91dHB1dERlZmluZWQoKXtyZXR1cm4hMX19O2NvbnN0IFhhPXsiPT0iOklpLCIhPSI6TGksIj4iOnppLCI8IjpSaSwiPj0iOlZpLCI8PSI6QmksYXJyYXk6dWksYXQ6aGksYm9vbGVhbjp1aSxjYXNlOnlpLGNvYWxlc2NlOnhpLGNvbGxhdG9yOkhpLGZvcm1hdDpuaSxpbWFnZTpXaSxpbjpnaSwiaW5kZXgtb2YiOl9pLGludGVycG9sYXRlOiRyLCJpbnRlcnBvbGF0ZS1oY2wiOiRyLCJpbnRlcnBvbGF0ZS1sYWIiOiRyLGxlbmd0aDpHaSxsZXQ6cGksbGl0ZXJhbDpxcixtYXRjaDp2aSxudW1iZXI6dWksIm51bWJlci1mb3JtYXQiOlVpLG9iamVjdDp1aSxzZW1pbGl0ZXJhbDpKYSxzbGljZTpiaSxzdGVwOlpyLHN0cmluZzp1aSwidG8tYm9vbGVhbiI6ZmksInRvLWNvbG9yIjpmaSwidG8tbnVtYmVyIjpmaSwidG8tc3RyaW5nIjpmaSx2YXI6bWksd2l0aGluOnlhLGRpc3RhbmNlOnFhLCJnbG9iYWwtc3RhdGUiOllhfTt2YXIgWmE9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKHQpLHRoaXMubWVzc2FnZT10LHRoaXMua2V5PWV9fSxRYT1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdD1bXSl7dGhpcy5wYXJlbnQ9ZSx0aGlzLmJpbmRpbmdzPXt9O2ZvcihsZXRbZSxuXW9mIHQpdGhpcy5iaW5kaW5nc1tlXT1ufWNvbmNhdCh0KXtyZXR1cm4gbmV3IGUodGhpcyx0KX1nZXQoZSl7aWYodGhpcy5iaW5kaW5nc1tlXSlyZXR1cm4gdGhpcy5iaW5kaW5nc1tlXTtpZih0aGlzLnBhcmVudClyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0KGUpO3Rocm93IEVycm9yKGAke2V9IG5vdCBmb3VuZCBpbiBzY29wZS5gKX1oYXMoZSl7cmV0dXJuIHRoaXMuYmluZGluZ3NbZV0/ITA6dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQuaGFzKGUpOiExfX0sJGE9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlLHQsbj1bXSxyLGk9bmV3IFFhLGE9W10pe3RoaXMucmVnaXN0cnk9ZSx0aGlzLnBhdGg9bix0aGlzLmtleT1uLm1hcChlPT5gWyR7ZX1dYCkuam9pbihgYCksdGhpcy5zY29wZT1pLHRoaXMuZXJyb3JzPWEsdGhpcy5leHBlY3RlZFR5cGU9cix0aGlzLl9pc0NvbnN0YW50PXR9cGFyc2UoZSx0LG4scixpPXt9KXtyZXR1cm4gdD90aGlzLmNvbmNhdCh0LG4scikuX3BhcnNlKGUsaSk6dGhpcy5fcGFyc2UoZSxpKX1fcGFyc2UoZSx0KXsoZT09PW51bGx8fHR5cGVvZiBlPT1gc3RyaW5nYHx8dHlwZW9mIGU9PWBib29sZWFuYHx8dHlwZW9mIGU9PWBudW1iZXJgKSYmKGU9W2BsaXRlcmFsYCxlXSk7bGV0IG49dGhpcy5rZXk7ZnVuY3Rpb24gcihlLHQscil7cmV0dXJuIHI9PT1gYXNzZXJ0YD9uZXcgdWkodCxbZV0sbik6cj09PWBjb2VyY2VgP25ldyBmaSh0LFtlXSxuKTplfWlmKEFycmF5LmlzQXJyYXkoZSkpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4gdGhpcy5lcnJvcihgRXhwZWN0ZWQgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudC4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbImxpdGVyYWwiLCBbXV0uYCk7bGV0IG49ZVswXTtpZih0eXBlb2YgbiE9YHN0cmluZ2ApcmV0dXJuIHRoaXMuZXJyb3IoYEV4cHJlc3Npb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBidXQgZm91bmQgJHt0eXBlb2Ygbn0gaW5zdGVhZC4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbImxpdGVyYWwiLCBbLi4uXV0uYCwwKSxudWxsO2xldCBpPXRoaXMucmVnaXN0cnlbbl07aWYoaSl7bGV0IG49aS5wYXJzZShlLHRoaXMpO2lmKCFuKXJldHVybiBudWxsO2lmKHRoaXMuZXhwZWN0ZWRUeXBlKXtsZXQgZT10aGlzLmV4cGVjdGVkVHlwZSxpPW4udHlwZTtpZigoZS5raW5kPT09YHN0cmluZ2B8fGUua2luZD09PWBudW1iZXJgfHxlLmtpbmQ9PT1gYm9vbGVhbmB8fGUua2luZD09PWBvYmplY3RgfHxlLmtpbmQ9PT1gYXJyYXlgKSYmaS5raW5kPT09YHZhbHVlYCluPXIobixlLHQudHlwZUFubm90YXRpb258fGBhc3NlcnRgKTtlbHNlIGlmKGUua2luZD09PWBwcm9qZWN0aW9uRGVmaW5pdGlvbmAmJltgc3RyaW5nYCxgYXJyYXlgLGB2YWx1ZWBdLmluY2x1ZGVzKGkua2luZCl8fFtgY29sb3JgLGBmb3JtYXR0ZWRgLGByZXNvbHZlZEltYWdlYF0uaW5jbHVkZXMoZS5raW5kKSYmW2B2YWx1ZWAsYHN0cmluZ2BdLmluY2x1ZGVzKGkua2luZCl8fFtgcGFkZGluZ2AsYG51bWJlckFycmF5YF0uaW5jbHVkZXMoZS5raW5kKSYmW2B2YWx1ZWAsYG51bWJlcmAsYGFycmF5YF0uaW5jbHVkZXMoaS5raW5kKXx8ZS5raW5kPT09YGNvbG9yQXJyYXlgJiZbYHZhbHVlYCxgc3RyaW5nYCxgYXJyYXlgXS5pbmNsdWRlcyhpLmtpbmQpfHxlLmtpbmQ9PT1gdmFyaWFibGVBbmNob3JPZmZzZXRDb2xsZWN0aW9uYCYmW2B2YWx1ZWAsYGFycmF5YF0uaW5jbHVkZXMoaS5raW5kKSluPXIobixlLHQudHlwZUFubm90YXRpb258fGBjb2VyY2VgKTtlbHNlIGlmKHRoaXMuY2hlY2tTdWJ0eXBlKGUsaSkpcmV0dXJuIG51bGx9aWYoIShuIGluc3RhbmNlb2YgcXIpJiZuLnR5cGUua2luZCE9PWByZXNvbHZlZEltYWdlYCYmdGhpcy5faXNDb25zdGFudChuKSl7bGV0IGU9bmV3IFlyO3RyeXtuPW5ldyBxcihuLnR5cGUsbi5ldmFsdWF0ZShlKSl9Y2F0Y2goZSl7cmV0dXJuIHRoaXMuZXJyb3IoZS5tZXNzYWdlKSxudWxsfX1yZXR1cm4gbn1yZXR1cm4gdGhpcy5lcnJvcihgVW5rbm93biBleHByZXNzaW9uICIke259Ii4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbImxpdGVyYWwiLCBbLi4uXV0uYCwwKX1yZXR1cm4gZT09PXZvaWQgMD90aGlzLmVycm9yKGAndW5kZWZpbmVkJyB2YWx1ZSBpbnZhbGlkLiBVc2UgbnVsbCBpbnN0ZWFkLmApOnR5cGVvZiBlPT1gb2JqZWN0YD90aGlzLmVycm9yKGBCYXJlIG9iamVjdHMgaW52YWxpZC4gVXNlIFsibGl0ZXJhbCIsIHsuLi59XSBpbnN0ZWFkLmApOnRoaXMuZXJyb3IoYEV4cGVjdGVkIGFuIGFycmF5LCBidXQgZm91bmQgJHt0eXBlb2YgZX0gaW5zdGVhZC5gKX1jb25jYXQodCxuLHIpe2xldCBpPXR5cGVvZiB0PT1gbnVtYmVyYD90aGlzLnBhdGguY29uY2F0KHQpOnRoaXMucGF0aCxhPXI/dGhpcy5zY29wZS5jb25jYXQocik6dGhpcy5zY29wZTtyZXR1cm4gbmV3IGUodGhpcy5yZWdpc3RyeSx0aGlzLl9pc0NvbnN0YW50LGksbnx8bnVsbCxhLHRoaXMuZXJyb3JzKX1lcnJvcihlLC4uLnQpe2xldCBuPWAke3RoaXMua2V5fSR7dC5tYXAoZT0+YFske2V9XWApLmpvaW4oYGApfWA7dGhpcy5lcnJvcnMucHVzaChuZXcgWmEobixlKSl9Y2hlY2tTdWJ0eXBlKGUsdCl7bGV0IG49ZXIoZSx0KTtyZXR1cm4gbiYmdGhpcy5lcnJvcihuKSxufX0sZW89Y2xhc3MgZXtjb25zdHJ1Y3RvcihlLHQsbixyLGkpe3RoaXMubmFtZT1lLHRoaXMudHlwZT10LHRoaXMuX2V2YWx1YXRlPW4sdGhpcy5hcmdzPXIsdGhpcy5rZXk9aX1ldmFsdWF0ZShlKXtyZXR1cm4gdGhpcy5fZXZhbHVhdGUoZSx0aGlzLmFyZ3MsdGhpcy5rZXkpfWVhY2hDaGlsZChlKXt0aGlzLmFyZ3MuZm9yRWFjaChlKX1vdXRwdXREZWZpbmVkKCl7cmV0dXJuITF9c3RhdGljIHBhcnNlKHQsbil7bGV0IHI9dFswXSxpPWUuZGVmaW5pdGlvbnNbcl07aWYoIWkpcmV0dXJuIG4uZXJyb3IoYFVua25vd24gZXhwcmVzc2lvbiAiJHtyfSIuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgWyJsaXRlcmFsIiwgWy4uLl1dLmAsMCk7bGV0IGE9QXJyYXkuaXNBcnJheShpKT9pWzBdOmkudHlwZSxvPUFycmF5LmlzQXJyYXkoaSk/W1tpWzFdLGlbMl1dXTppLm92ZXJsb2FkcyxzPW8uZmlsdGVyKChbZV0pPT4hQXJyYXkuaXNBcnJheShlKXx8ZS5sZW5ndGg9PT10Lmxlbmd0aC0xKSxjPW51bGw7Zm9yKGxldFtpLG9db2Ygcyl7Yz1uZXcgJGEobi5yZWdpc3RyeSxzbyxuLnBhdGgsbnVsbCxuLnNjb3BlKTtsZXQgcz1bXSxsPSExO2ZvcihsZXQgZT0xO2U8dC5sZW5ndGg7ZSsrKXtsZXQgbj10W2VdLHI9QXJyYXkuaXNBcnJheShpKT9pW2UtMV06aS50eXBlLGE9Yy5wYXJzZShuLDErcy5sZW5ndGgscik7aWYoIWEpe2w9ITA7YnJlYWt9cy5wdXNoKGEpfWlmKCFsKXtpZihBcnJheS5pc0FycmF5KGkpJiZpLmxlbmd0aCE9PXMubGVuZ3RoKXtjLmVycm9yKGBFeHBlY3RlZCAke2kubGVuZ3RofSBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke3MubGVuZ3RofSBpbnN0ZWFkLmApO2NvbnRpbnVlfWZvcihsZXQgZT0wO2U8cy5sZW5ndGg7ZSsrKXtsZXQgdD1BcnJheS5pc0FycmF5KGkpP2lbZV06aS50eXBlLG49c1tlXTtjLmNvbmNhdChlKzEpLmNoZWNrU3VidHlwZSh0LG4udHlwZSl9aWYoYy5lcnJvcnMubGVuZ3RoPT09MClyZXR1cm4gbmV3IGUocixhLG8scyxuLmtleSl9fWlmKHMubGVuZ3RoPT09MSluLmVycm9ycy5wdXNoKC4uLmMuZXJyb3JzKTtlbHNle2xldCBlPShzLmxlbmd0aD9zOm8pLm1hcCgoW2VdKT0+b28oZSkpLmpvaW4oYCB8IGApLHI9W107Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aDtlKyspe2xldCBpPW4ucGFyc2UodFtlXSwxK3IubGVuZ3RoKTtpZighaSlyZXR1cm4gbnVsbDtyLnB1c2goUihpLnR5cGUpKX1uLmVycm9yKGBFeHBlY3RlZCBhcmd1bWVudHMgb2YgdHlwZSAke2V9LCBidXQgZm91bmQgKCR7ci5qb2luKGAsIGApfSkgaW5zdGVhZC5gKX1yZXR1cm4gbnVsbH1zdGF0aWMgcmVnaXN0ZXIodCxuKXtlLmRlZmluaXRpb25zPW47Zm9yKGxldCByIGluIG4pdFtyXT1lfX07ZnVuY3Rpb24gdG8oZSxbdCxuLHIsaV0sYSl7dD10LmV2YWx1YXRlKGUpLG49bi5ldmFsdWF0ZShlKSxyPXIuZXZhbHVhdGUoZSk7bGV0IG89aT9pLmV2YWx1YXRlKGUpOjEscz1Vcih0LG4scixvKTtpZihzKXRocm93IG5ldyBCKHMsYSk7cmV0dXJuIG5ldyB6KHQvMjU1LG4vMjU1LHIvMjU1LG8sITEpfWZ1bmN0aW9uIG5vKGUsdCl7cmV0dXJuIGUgaW4gdCYmdFtlXSE9PXZvaWQgMH1mdW5jdGlvbiBybyhlLHQpe2xldCBuPXRbZV07cmV0dXJuIG49PT12b2lkIDA/bnVsbDpufWZ1bmN0aW9uIGlvKGUsdCxuLHIpe2Zvcig7bjw9cjspe2xldCBpPW4rcj4+MTtpZih0W2ldPT09ZSlyZXR1cm4hMDt0W2ldPmU/cj1pLTE6bj1pKzF9cmV0dXJuITF9ZnVuY3Rpb24gYW8oZSl7cmV0dXJue3R5cGU6ZX19ZW8ucmVnaXN0ZXIoWGEse2Vycm9yOltXbixbRl0sKGUsW3RdLG4pPT57dGhyb3cgbmV3IEIodC5ldmFsdWF0ZShlKSxuKX1dLHR5cGVvZjpbRixbTF0sKGUsW3RdKT0+UihHcih0LmV2YWx1YXRlKGUpKSldLCJ0by1yZ2JhIjpbUW4oUCw0KSxbVm5dLChlLFt0XSk9PntsZXRbbixyLGksYV09dC5ldmFsdWF0ZShlKS5yZ2I7cmV0dXJuW24qMjU1LHIqMjU1LGkqMjU1LGFdfV0scmdiOltWbixbUCxQLFBdLHRvXSxyZ2JhOltWbixbUCxQLFAsUF0sdG9dLGhhczp7dHlwZTpJLG92ZXJsb2FkczpbW1tGXSwoZSxbdF0pPT5ubyh0LmV2YWx1YXRlKGUpLGUucHJvcGVydGllcygpKV0sW1tGLFVuXSwoZSxbdCxuXSk9Pm5vKHQuZXZhbHVhdGUoZSksbi5ldmFsdWF0ZShlKSldXX0sZ2V0Ont0eXBlOkwsb3ZlcmxvYWRzOltbW0ZdLChlLFt0XSk9PnJvKHQuZXZhbHVhdGUoZSksZS5wcm9wZXJ0aWVzKCkpXSxbW0YsVW5dLChlLFt0LG5dKT0+cm8odC5ldmFsdWF0ZShlKSxuLmV2YWx1YXRlKGUpKV1dfSwiZmVhdHVyZS1zdGF0ZSI6W0wsW0ZdLChlLFt0XSk9PnJvKHQuZXZhbHVhdGUoZSksZS5mZWF0dXJlU3RhdGV8fHt9KV0scHJvcGVydGllczpbVW4sW10sZT0+ZS5wcm9wZXJ0aWVzKCldLCJnZW9tZXRyeS10eXBlIjpbRixbXSxlPT5lLmdlb21ldHJ5VHlwZSgpXSxpZDpbTCxbXSxlPT5lLmlkKCldLHpvb206W1AsW10sZT0+ZS5nbG9iYWxzLnpvb21dLCJoZWF0bWFwLWRlbnNpdHkiOltQLFtdLGU9PmUuZ2xvYmFscy5oZWF0bWFwRGVuc2l0eXx8MF0sZWxldmF0aW9uOltQLFtdLGU9PmUuZ2xvYmFscy5lbGV2YXRpb258fDBdLCJsaW5lLXByb2dyZXNzIjpbUCxbXSxlPT5lLmdsb2JhbHMubGluZVByb2dyZXNzfHwwXSxhY2N1bXVsYXRlZDpbTCxbXSxlPT5lLmdsb2JhbHMuYWNjdW11bGF0ZWQ9PT12b2lkIDA/bnVsbDplLmdsb2JhbHMuYWNjdW11bGF0ZWRdLCIrIjpbUCxhbyhQKSwoZSx0KT0+e2xldCBuPTA7Zm9yKGxldCByIG9mIHQpbis9ci5ldmFsdWF0ZShlKTtyZXR1cm4gbn1dLCIqIjpbUCxhbyhQKSwoZSx0KT0+e2xldCBuPTE7Zm9yKGxldCByIG9mIHQpbio9ci5ldmFsdWF0ZShlKTtyZXR1cm4gbn1dLCItIjp7dHlwZTpQLG92ZXJsb2FkczpbW1tQLFBdLChlLFt0LG5dKT0+dC5ldmFsdWF0ZShlKS1uLmV2YWx1YXRlKGUpXSxbW1BdLChlLFt0XSk9Pi10LmV2YWx1YXRlKGUpXV19LCIvIjpbUCxbUCxQXSwoZSxbdCxuXSk9PnQuZXZhbHVhdGUoZSkvbi5ldmFsdWF0ZShlKV0sIiUiOltQLFtQLFBdLChlLFt0LG5dKT0+dC5ldmFsdWF0ZShlKSVuLmV2YWx1YXRlKGUpXSxsbjI6W1AsW10sKCk9Pk1hdGguTE4yXSxwaTpbUCxbXSwoKT0+TWF0aC5QSV0sZTpbUCxbXSwoKT0+TWF0aC5FXSwiXiI6W1AsW1AsUF0sKGUsW3Qsbl0pPT50LmV2YWx1YXRlKGUpKiorbi5ldmFsdWF0ZShlKV0sc3FydDpbUCxbUF0sKGUsW3RdKT0+TWF0aC5zcXJ0KHQuZXZhbHVhdGUoZSkpXSxsb2cxMDpbUCxbUF0sKGUsW3RdKT0+TWF0aC5sb2codC5ldmFsdWF0ZShlKSkvTWF0aC5MTjEwXSxsbjpbUCxbUF0sKGUsW3RdKT0+TWF0aC5sb2codC5ldmFsdWF0ZShlKSldLGxvZzI6W1AsW1BdLChlLFt0XSk9Pk1hdGgubG9nKHQuZXZhbHVhdGUoZSkpL01hdGguTE4yXSxzaW46W1AsW1BdLChlLFt0XSk9Pk1hdGguc2luKHQuZXZhbHVhdGUoZSkpXSxjb3M6W1AsW1BdLChlLFt0XSk9Pk1hdGguY29zKHQuZXZhbHVhdGUoZSkpXSx0YW46W1AsW1BdLChlLFt0XSk9Pk1hdGgudGFuKHQuZXZhbHVhdGUoZSkpXSxhc2luOltQLFtQXSwoZSxbdF0pPT5NYXRoLmFzaW4odC5ldmFsdWF0ZShlKSldLGFjb3M6W1AsW1BdLChlLFt0XSk9Pk1hdGguYWNvcyh0LmV2YWx1YXRlKGUpKV0sYXRhbjpbUCxbUF0sKGUsW3RdKT0+TWF0aC5hdGFuKHQuZXZhbHVhdGUoZSkpXSxtaW46W1AsYW8oUCksKGUsdCk9Pk1hdGgubWluKC4uLnQubWFwKHQ9PnQuZXZhbHVhdGUoZSkpKV0sbWF4OltQLGFvKFApLChlLHQpPT5NYXRoLm1heCguLi50Lm1hcCh0PT50LmV2YWx1YXRlKGUpKSldLGFiczpbUCxbUF0sKGUsW3RdKT0+TWF0aC5hYnModC5ldmFsdWF0ZShlKSldLHJvdW5kOltQLFtQXSwoZSxbdF0pPT57bGV0IG49dC5ldmFsdWF0ZShlKTtyZXR1cm4gbjwwPy1NYXRoLnJvdW5kKC1uKTpNYXRoLnJvdW5kKG4pfV0sZmxvb3I6W1AsW1BdLChlLFt0XSk9Pk1hdGguZmxvb3IodC5ldmFsdWF0ZShlKSldLGNlaWw6W1AsW1BdLChlLFt0XSk9Pk1hdGguY2VpbCh0LmV2YWx1YXRlKGUpKV0sImZpbHRlci09PSI6W0ksW0YsTF0sKGUsW3Qsbl0pPT5lLnByb3BlcnRpZXMoKVt0LnZhbHVlXT09PW4udmFsdWVdLCJmaWx0ZXItaWQtPT0iOltJLFtMXSwoZSxbdF0pPT5lLmlkKCk9PT10LnZhbHVlXSwiZmlsdGVyLXR5cGUtPT0iOltJLFtGXSwoZSxbdF0pPT5lLmdlb21ldHJ5VHlwZSgpPT09dC52YWx1ZV0sImZpbHRlci08IjpbSSxbRixMXSwoZSxbdCxuXSk9PntsZXQgcj1lLnByb3BlcnRpZXMoKVt0LnZhbHVlXSxpPW4udmFsdWU7cmV0dXJuIHR5cGVvZiByPT10eXBlb2YgaSYmcjxpfV0sImZpbHRlci1pZC08IjpbSSxbTF0sKGUsW3RdKT0+e2xldCBuPWUuaWQoKSxyPXQudmFsdWU7cmV0dXJuIHR5cGVvZiBuPT10eXBlb2YgciYmbjxyfV0sImZpbHRlci0+IjpbSSxbRixMXSwoZSxbdCxuXSk9PntsZXQgcj1lLnByb3BlcnRpZXMoKVt0LnZhbHVlXSxpPW4udmFsdWU7cmV0dXJuIHR5cGVvZiByPT10eXBlb2YgaSYmcj5pfV0sImZpbHRlci1pZC0+IjpbSSxbTF0sKGUsW3RdKT0+e2xldCBuPWUuaWQoKSxyPXQudmFsdWU7cmV0dXJuIHR5cGVvZiBuPT10eXBlb2YgciYmbj5yfV0sImZpbHRlci08PSI6W0ksW0YsTF0sKGUsW3Qsbl0pPT57bGV0IHI9ZS5wcm9wZXJ0aWVzKClbdC52YWx1ZV0saT1uLnZhbHVlO3JldHVybiB0eXBlb2Ygcj09dHlwZW9mIGkmJnI8PWl9XSwiZmlsdGVyLWlkLTw9IjpbSSxbTF0sKGUsW3RdKT0+e2xldCBuPWUuaWQoKSxyPXQudmFsdWU7cmV0dXJuIHR5cGVvZiBuPT10eXBlb2YgciYmbjw9cn1dLCJmaWx0ZXItPj0iOltJLFtGLExdLChlLFt0LG5dKT0+e2xldCByPWUucHJvcGVydGllcygpW3QudmFsdWVdLGk9bi52YWx1ZTtyZXR1cm4gdHlwZW9mIHI9PXR5cGVvZiBpJiZyPj1pfV0sImZpbHRlci1pZC0+PSI6W0ksW0xdLChlLFt0XSk9PntsZXQgbj1lLmlkKCkscj10LnZhbHVlO3JldHVybiB0eXBlb2Ygbj09dHlwZW9mIHImJm4+PXJ9XSwiZmlsdGVyLWhhcyI6W0ksW0xdLChlLFt0XSk9PntsZXQgbj10LnZhbHVlLHI9ZS5wcm9wZXJ0aWVzKCk7cmV0dXJuIG4gaW4gciYmcltuXSE9PXZvaWQgMH1dLCJmaWx0ZXItaGFzLWlkIjpbSSxbXSxlPT5lLmlkKCkhPT1udWxsJiZlLmlkKCkhPT12b2lkIDBdLCJmaWx0ZXItdHlwZS1pbiI6W0ksW1FuKEYpXSwoZSxbdF0pPT50LnZhbHVlLmluZGV4T2YoZS5nZW9tZXRyeVR5cGUoKSk+PTBdLCJmaWx0ZXItaWQtaW4iOltJLFtRbihMKV0sKGUsW3RdKT0+dC52YWx1ZS5pbmRleE9mKGUuaWQoKSk+PTBdLCJmaWx0ZXItaW4tc21hbGwiOltJLFtGLFFuKEwpXSwoZSxbdCxuXSk9Pm4udmFsdWUuaW5kZXhPZihlLnByb3BlcnRpZXMoKVt0LnZhbHVlXSk+PTBdLCJmaWx0ZXItaW4tbGFyZ2UiOltJLFtGLFFuKEwpXSwoZSxbdCxuXSk9PmlvKGUucHJvcGVydGllcygpW3QudmFsdWVdLG4udmFsdWUsMCxuLnZhbHVlLmxlbmd0aC0xKV0sYWxsOnt0eXBlOkksb3ZlcmxvYWRzOltbW0ksSV0sKGUsW3Qsbl0pPT50LmV2YWx1YXRlKGUpJiZuLmV2YWx1YXRlKGUpXSxbYW8oSSksKGUsdCk9Pntmb3IobGV0IG4gb2YgdClpZighbi5ldmFsdWF0ZShlKSlyZXR1cm4hMTtyZXR1cm4hMH1dXX0sYW55Ont0eXBlOkksb3ZlcmxvYWRzOltbW0ksSV0sKGUsW3Qsbl0pPT50LmV2YWx1YXRlKGUpfHxuLmV2YWx1YXRlKGUpXSxbYW8oSSksKGUsdCk9Pntmb3IobGV0IG4gb2YgdClpZihuLmV2YWx1YXRlKGUpKXJldHVybiEwO3JldHVybiExfV1dfSwiISI6W0ksW0ldLChlLFt0XSk9PiF0LmV2YWx1YXRlKGUpXSwiaXMtc3VwcG9ydGVkLXNjcmlwdCI6W0ksW0ZdLChlLFt0XSk9PntsZXQgbj1lLmdsb2JhbHMmJmUuZ2xvYmFscy5pc1N1cHBvcnRlZFNjcmlwdDtyZXR1cm4hbnx8bih0LmV2YWx1YXRlKGUpKX1dLHVwY2FzZTpbRixbRl0sKGUsW3RdKT0+dC5ldmFsdWF0ZShlKS50b1VwcGVyQ2FzZSgpXSxkb3duY2FzZTpbRixbRl0sKGUsW3RdKT0+dC5ldmFsdWF0ZShlKS50b0xvd2VyQ2FzZSgpXSxjb25jYXQ6W0YsYW8oTCksKGUsdCk9PnQubWFwKHQ9PktyKHQuZXZhbHVhdGUoZSkpKS5qb2luKGBgKV0sc3BsaXQ6W1FuKEYpLFtGLEZdLChlLFt0LG5dKT0+dC5ldmFsdWF0ZShlKS5zcGxpdChuLmV2YWx1YXRlKGUpKV0sam9pbjpbRixbUW4oRiksRl0sKGUsW3Qsbl0pPT50LmV2YWx1YXRlKGUpLmpvaW4obi5ldmFsdWF0ZShlKSldLCJyZXNvbHZlZC1sb2NhbGUiOltGLFtHbl0sKGUsW3RdKT0+dC5ldmFsdWF0ZShlKS5yZXNvbHZlZExvY2FsZSgpXX0pO2Z1bmN0aW9uIG9vKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2AoJHtlLm1hcChSKS5qb2luKGAsIGApfSlgOmAoJHtSKGUudHlwZSl9Li4uKWB9ZnVuY3Rpb24gc28oZSl7aWYoZSBpbnN0YW5jZW9mIG1pKXJldHVybiBzbyhlLmJvdW5kRXhwcmVzc2lvbik7aWYoZSBpbnN0YW5jZW9mIGVvJiZlLm5hbWU9PT1gZXJyb3JgfHxlIGluc3RhbmNlb2YgSGl8fGUgaW5zdGFuY2VvZiB5YXx8ZSBpbnN0YW5jZW9mIHFhfHxlIGluc3RhbmNlb2YgWWEpcmV0dXJuITE7bGV0IHQ9ZSBpbnN0YW5jZW9mIGZpfHxlIGluc3RhbmNlb2YgdWksbj0hMDtyZXR1cm4gZS5lYWNoQ2hpbGQoZT0+e24mJj10P3NvKGUpOmUgaW5zdGFuY2VvZiBxcn0pLG4/Y28oZSkmJnVvKGUsW2B6b29tYCxgaGVhdG1hcC1kZW5zaXR5YCxgZWxldmF0aW9uYCxgbGluZS1wcm9ncmVzc2AsYGFjY3VtdWxhdGVkYCxgaXMtc3VwcG9ydGVkLXNjcmlwdGBdKTohMX1mdW5jdGlvbiBjbyhlKXtpZihlIGluc3RhbmNlb2YgZW8mJihlLm5hbWU9PT1gZ2V0YCYmZS5hcmdzLmxlbmd0aD09PTF8fGUubmFtZT09PWBmZWF0dXJlLXN0YXRlYHx8ZS5uYW1lPT09YGhhc2AmJmUuYXJncy5sZW5ndGg9PT0xfHxlLm5hbWU9PT1gcHJvcGVydGllc2B8fGUubmFtZT09PWBnZW9tZXRyeS10eXBlYHx8ZS5uYW1lPT09YGlkYHx8L15maWx0ZXItLy50ZXN0KGUubmFtZSkpfHxlIGluc3RhbmNlb2YgeWF8fGUgaW5zdGFuY2VvZiBxYSlyZXR1cm4hMTtsZXQgdD0hMDtyZXR1cm4gZS5lYWNoQ2hpbGQoZT0+e3QmJiFjbyhlKSYmKHQ9ITEpfSksdH1mdW5jdGlvbiBsbyhlKXtpZihlIGluc3RhbmNlb2YgZW8mJmUubmFtZT09PWBmZWF0dXJlLXN0YXRlYClyZXR1cm4hMTtsZXQgdD0hMDtyZXR1cm4gZS5lYWNoQ2hpbGQoZT0+e3QmJiFsbyhlKSYmKHQ9ITEpfSksdH1mdW5jdGlvbiB1byhlLHQpe2lmKGUgaW5zdGFuY2VvZiBlbyYmdC5pbmRleE9mKGUubmFtZSk+PTApcmV0dXJuITE7bGV0IG49ITA7cmV0dXJuIGUuZWFjaENoaWxkKGU9PntuJiYhdW8oZSx0KSYmKG49ITEpfSksbn1mdW5jdGlvbiBmbyhlKXtyZXR1cm4gZVtgcHJvcGVydHktdHlwZWBdPT09YGRhdGEtZHJpdmVuYHx8ZVtgcHJvcGVydHktdHlwZWBdPT09YGNyb3NzLWZhZGVkLWRhdGEtZHJpdmVuYH1mdW5jdGlvbiBwbyhlKXtyZXR1cm4hIWUuZXhwcmVzc2lvbiYmZS5leHByZXNzaW9uLnBhcmFtZXRlcnMuaW5kZXhPZihgem9vbWApPi0xfWZ1bmN0aW9uIG1vKGUpe3JldHVybiEhZS5leHByZXNzaW9uJiZlLmV4cHJlc3Npb24uaW50ZXJwb2xhdGVkfWZ1bmN0aW9uIGhvKGUsLi4udCl7Zm9yKGxldCBuIG9mIHQpZm9yKGxldCB0IGluIG4pZVt0XT1uW3RdO3JldHVybiBlfWZ1bmN0aW9uIFYoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBOdW1iZXI/YG51bWJlcmA6ZSBpbnN0YW5jZW9mIFN0cmluZz9gc3RyaW5nYDplIGluc3RhbmNlb2YgQm9vbGVhbj9gYm9vbGVhbmA6QXJyYXkuaXNBcnJheShlKT9gYXJyYXlgOmU9PT1udWxsP2BudWxsYDp0eXBlb2YgZX1mdW5jdGlvbiBnbyhlKXtyZXR1cm4gdHlwZW9mIGU9PWBvYmplY3RgJiYhIWUmJiFBcnJheS5pc0FycmF5KGUpJiZHcihlKT09PVVufWZ1bmN0aW9uIF9vKGUpe3JldHVybiBlfWZ1bmN0aW9uIHZvKGUpe3N3aXRjaChlLnR5cGUpe2Nhc2VgY29sb3JgOnJldHVybiB6LnBhcnNlO2Nhc2VgcGFkZGluZ2A6cmV0dXJuIEZyLnBhcnNlO2Nhc2VgbnVtYmVyQXJyYXlgOnJldHVybiBJci5wYXJzZTtjYXNlYGNvbG9yQXJyYXlgOnJldHVybiBMci5wYXJzZTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiB5byhlKXtzd2l0Y2goZSl7Y2FzZWBleHBvbmVudGlhbGA6cmV0dXJuIHdvO2Nhc2VgaW50ZXJ2YWxgOnJldHVybiBDbztjYXNlYGNhdGVnb3JpY2FsYDpyZXR1cm4gU287Y2FzZWBpZGVudGl0eWA6cmV0dXJuIFRvO2RlZmF1bHQ6dGhyb3cgRXJyb3IoYFVua25vd24gZnVuY3Rpb24gdHlwZSAiJHtlfSJgKX19ZnVuY3Rpb24gYm8oZSx0KXtsZXQgbj1lLnN0b3BzJiZ0eXBlb2YgZS5zdG9wc1swXVswXT09YG9iamVjdGAscj1ufHxlLnByb3BlcnR5IT09dm9pZCAwLGk9bnx8IXIsYT1lLnR5cGV8fChtbyh0KT9gZXhwb25lbnRpYWxgOmBpbnRlcnZhbGApLG89dm8odCk7aWYobyYmKGU9aG8oe30sZSksZS5zdG9wcyYmKGUuc3RvcHM9ZS5zdG9wcy5tYXAoZT0+W2VbMF0sbyhlWzFdKV0pKSxlLmRlZmF1bHQ/ZS5kZWZhdWx0PW8oZS5kZWZhdWx0KTplLmRlZmF1bHQ9byh0LmRlZmF1bHQpKSxlLmNvbG9yU3BhY2UmJiFqcihlLmNvbG9yU3BhY2UpKXRocm93IEVycm9yKGBVbmtub3duIGNvbG9yIHNwYWNlOiAiJHtlLmNvbG9yU3BhY2V9ImApO2xldCBzPXlvKGEpLGMsbDtpZihhPT09YGNhdGVnb3JpY2FsYCl7Yz1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihsZXQgdCBvZiBlLnN0b3BzKWNbdFswXV09dFsxXTtsPXR5cGVvZiBlLnN0b3BzWzBdWzBdfWlmKG4pe2xldCBuPXt9LHI9W107Zm9yKGxldCB0PTA7dDxlLnN0b3BzLmxlbmd0aDt0Kyspe2xldCBpPWUuc3RvcHNbdF0sYT1pWzBdLnpvb207blthXT09PXZvaWQgMCYmKG5bYV09e3pvb206YSx0eXBlOmUudHlwZSxwcm9wZXJ0eTplLnByb3BlcnR5LGRlZmF1bHQ6ZS5kZWZhdWx0LHN0b3BzOltdfSxyLnB1c2goYSkpLG5bYV0uc3RvcHMucHVzaChbaVswXS52YWx1ZSxpWzFdXSl9bGV0IGk9W107Zm9yKGxldCBlIG9mIHIpaS5wdXNoKFtuW2VdLnpvb20sYm8obltlXSx0KV0pO2xldCBhPXtuYW1lOmBsaW5lYXJgfTtyZXR1cm57a2luZDpgY29tcG9zaXRlYCxpbnRlcnBvbGF0aW9uVHlwZTphLGludGVycG9sYXRpb25GYWN0b3I6JHIuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHZvaWQgMCxhKSx6b29tU3RvcHM6aS5tYXAoZT0+ZVswXSksZXZhbHVhdGUoe3pvb206bn0scil7cmV0dXJuIHdvKHtzdG9wczppLGJhc2U6ZS5iYXNlfSx0LG4pLmV2YWx1YXRlKG4scil9fX1pZihpKXtsZXQgbj1hPT09YGV4cG9uZW50aWFsYD97bmFtZTpgZXhwb25lbnRpYWxgLGJhc2U6ZS5iYXNlPT09dm9pZCAwPzE6ZS5iYXNlfTpudWxsO3JldHVybntraW5kOmBjYW1lcmFgLGludGVycG9sYXRpb25UeXBlOm4saW50ZXJwb2xhdGlvbkZhY3Rvcjokci5pbnRlcnBvbGF0aW9uRmFjdG9yLmJpbmQodm9pZCAwLG4pLHpvb21TdG9wczplLnN0b3BzLm1hcChlPT5lWzBdKSxldmFsdWF0ZTooe3pvb206bn0pPT5zKGUsdCxuLGMsbCl9fXJldHVybntraW5kOmBzb3VyY2VgLGV2YWx1YXRlKG4scil7bGV0IGk9ciYmci5wcm9wZXJ0aWVzP3IucHJvcGVydGllc1tlLnByb3BlcnR5XTp2b2lkIDA7cmV0dXJuIGk9PT12b2lkIDA/eG8oZS5kZWZhdWx0LHQuZGVmYXVsdCk6cyhlLHQsaSxjLGwpfX19ZnVuY3Rpb24geG8oZSx0LG4pe2lmKGUhPT12b2lkIDApcmV0dXJuIGU7aWYodCE9PXZvaWQgMClyZXR1cm4gdDtpZihuIT09dm9pZCAwKXJldHVybiBufWZ1bmN0aW9uIFNvKGUsdCxuLHIsaSl7cmV0dXJuIHhvKHR5cGVvZiBuPT09aT9yW25dOnZvaWQgMCxlLmRlZmF1bHQsdC5kZWZhdWx0KX1mdW5jdGlvbiBDbyhlLHQsbil7aWYoVihuKSE9PWBudW1iZXJgKXJldHVybiB4byhlLmRlZmF1bHQsdC5kZWZhdWx0KTtsZXQgcj1lLnN0b3BzLmxlbmd0aDtpZihyPT09MXx8bjw9ZS5zdG9wc1swXVswXSlyZXR1cm4gZS5zdG9wc1swXVsxXTtpZihuPj1lLnN0b3BzW3ItMV1bMF0pcmV0dXJuIGUuc3RvcHNbci0xXVsxXTtsZXQgaT1YcihlLnN0b3BzLm1hcChlPT5lWzBdKSxuLGBgKTtyZXR1cm4gZS5zdG9wc1tpXVsxXX1mdW5jdGlvbiB3byhlLHQsbil7bGV0IHI9ZS5iYXNlPT09dm9pZCAwPzE6ZS5iYXNlO2lmKFYobikhPT1gbnVtYmVyYClyZXR1cm4geG8oZS5kZWZhdWx0LHQuZGVmYXVsdCk7bGV0IGk9ZS5zdG9wcy5sZW5ndGg7aWYoaT09PTF8fG48PWUuc3RvcHNbMF1bMF0pcmV0dXJuIGUuc3RvcHNbMF1bMV07aWYobj49ZS5zdG9wc1tpLTFdWzBdKXJldHVybiBlLnN0b3BzW2ktMV1bMV07bGV0IGE9WHIoZS5zdG9wcy5tYXAoZT0+ZVswXSksbixgYCksbz1FbyhuLHIsZS5zdG9wc1thXVswXSxlLnN0b3BzW2ErMV1bMF0pLHM9ZS5zdG9wc1thXVsxXSxjPWUuc3RvcHNbYSsxXVsxXSxsPXRpW3QudHlwZV18fF9vO3JldHVybiB0eXBlb2Ygcy5ldmFsdWF0ZT09YGZ1bmN0aW9uYD97ZXZhbHVhdGUoLi4udCl7bGV0IG49cy5ldmFsdWF0ZS5hcHBseSh2b2lkIDAsdCkscj1jLmV2YWx1YXRlLmFwcGx5KHZvaWQgMCx0KTtpZihuIT09dm9pZCAwJiZyIT09dm9pZCAwKXJldHVybiBsKG4scixvLGUuY29sb3JTcGFjZSl9fTpsKHMsYyxvLGUuY29sb3JTcGFjZSl9ZnVuY3Rpb24gVG8oZSx0LG4pe3N3aXRjaCh0LnR5cGUpe2Nhc2VgY29sb3JgOm49ei5wYXJzZShuKTticmVhaztjYXNlYGZvcm1hdHRlZGA6bj1Qci5mcm9tU3RyaW5nKG4udG9TdHJpbmcoKSk7YnJlYWs7Y2FzZWByZXNvbHZlZEltYWdlYDpuPUJyLmZyb21TdHJpbmcobi50b1N0cmluZygpKTticmVhaztjYXNlYHBhZGRpbmdgOm49RnIucGFyc2Uobik7YnJlYWs7Y2FzZWBjb2xvckFycmF5YDpuPUxyLnBhcnNlKG4pO2JyZWFrO2Nhc2VgbnVtYmVyQXJyYXlgOm49SXIucGFyc2Uobik7YnJlYWs7ZGVmYXVsdDpWKG4pIT09dC50eXBlJiYodC50eXBlIT09YGVudW1gfHwhdC52YWx1ZXNbbl0pJiYobj12b2lkIDApfXJldHVybiB4byhuLGUuZGVmYXVsdCx0LmRlZmF1bHQpfWZ1bmN0aW9uIEVvKGUsdCxuLHIpe2xldCBpPXItbixhPWUtbjtyZXR1cm4gaT09PTA/MDp0PT09MT9hL2k6KHQqKithLTEpLyh0KioraS0xKX1mdW5jdGlvbiBEbyhlKXtyZXR1cm57cmVzdWx0OmBzdWNjZXNzYCx2YWx1ZTplfX1mdW5jdGlvbiBPbyhlKXtyZXR1cm57cmVzdWx0OmBlcnJvcmAsdmFsdWU6ZX19dmFyIGtvPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLHIpe3RoaXMuZXhwcmVzc2lvbj1lLHRoaXMuX3dhcm5pbmdIaXN0b3J5PXt9LHRoaXMuX2V2YWx1YXRvcj1uZXcgWXIsdGhpcy5fZGVmYXVsdFZhbHVlPW4/VW8obik6bnVsbCx0aGlzLl9lbnVtVmFsdWVzPW4mJm4udHlwZT09PWBlbnVtYD9uLnZhbHVlczpudWxsLHRoaXMuX2dsb2JhbFN0YXRlPXIsdGhpcy5fcm9vdEtleT10fWV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZSx0LG4scixpLGEpe3JldHVybiB0aGlzLl9nbG9iYWxTdGF0ZSYmKGU9V28oZSx0aGlzLl9nbG9iYWxTdGF0ZSkpLHRoaXMuX2V2YWx1YXRvci5nbG9iYWxzPWUsdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmU9dCx0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZVN0YXRlPW4sdGhpcy5fZXZhbHVhdG9yLmNhbm9uaWNhbD1yLHRoaXMuX2V2YWx1YXRvci5hdmFpbGFibGVJbWFnZXM9aXx8bnVsbCx0aGlzLl9ldmFsdWF0b3IuZm9ybWF0dGVkU2VjdGlvbj1hLHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh0aGlzLl9ldmFsdWF0b3IpfWV2YWx1YXRlKGUsdCxuLHIsaSxhKXt0aGlzLl9nbG9iYWxTdGF0ZSYmKGU9V28oZSx0aGlzLl9nbG9iYWxTdGF0ZSkpLHRoaXMuX2V2YWx1YXRvci5nbG9iYWxzPWUsdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmU9dHx8bnVsbCx0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZVN0YXRlPW58fG51bGwsdGhpcy5fZXZhbHVhdG9yLmNhbm9uaWNhbD1yLHRoaXMuX2V2YWx1YXRvci5hdmFpbGFibGVJbWFnZXM9aXx8bnVsbCx0aGlzLl9ldmFsdWF0b3IuZm9ybWF0dGVkU2VjdGlvbj1hfHxudWxsO3RyeXtsZXQgZT10aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtpZihlPT1udWxsfHx0eXBlb2YgZT09YG51bWJlcmAmJmUhPT1lKXJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7aWYodGhpcy5fZW51bVZhbHVlcyYmIShlIGluIHRoaXMuX2VudW1WYWx1ZXMpKXRocm93IG5ldyBCKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvbmUgb2YgJHtPYmplY3Qua2V5cyh0aGlzLl9lbnVtVmFsdWVzKS5tYXAoZT0+SlNPTi5zdHJpbmdpZnkoZSkpLmpvaW4oYCwgYCl9LCBidXQgZm91bmQgJHtKU09OLnN0cmluZ2lmeShlKX0gaW5zdGVhZC5gLGBgKTtyZXR1cm4gZX1jYXRjaChlKXtsZXQgdD1lIGluc3RhbmNlb2YgQj9lLnBhdGg6YGAsbj1gJHt0fXwke2UubWVzc2FnZX1gO3JldHVybiB0aGlzLl93YXJuaW5nSGlzdG9yeVtuXXx8KHRoaXMuX3dhcm5pbmdIaXN0b3J5W25dPSEwLHR5cGVvZiBjb25zb2xlPGB1YCYmY29uc29sZS53YXJuKEFvKHRoaXMuX3Jvb3RLZXksdCxlLm1lc3NhZ2UsdGhpcy5fZGVmYXVsdFZhbHVlKSkpLHRoaXMuX2RlZmF1bHRWYWx1ZX19fTtmdW5jdGlvbiBBbyhlLHQsbixyKXtyZXR1cm5gJHtlfSR7dH06ICR7bn0ke3I9PW51bGw/YGA6YCBGYWxsaW5nIGJhY2sgdG8gJHtTdHJpbmcocil9LmB9YH1mdW5jdGlvbiBqbyhlKXtpZighZSl0aHJvdyBFcnJvcihgcm9vdEtleSBtdXN0IGlkZW50aWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBpbiB0aGUgc3R5bGUgSlNPTiwgZS5nLiAibGF5ZXJzWzNdLnBhaW50LmxpbmUtd2lkdGgiLmApfWZ1bmN0aW9uIE1vKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD4wJiZ0eXBlb2YgZVswXT09YHN0cmluZ2AmJmVbMF1pbiBYYX1mdW5jdGlvbiBObyhlLHQsbixyKXtqbyh0KTtsZXQgaT1uZXcgJGEoWGEsc28sW10sbj9IbyhuKTp2b2lkIDApLGE9aS5wYXJzZShlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLG4mJm4udHlwZT09PWBzdHJpbmdgP3t0eXBlQW5ub3RhdGlvbjpgY29lcmNlYH06dm9pZCAwKTtyZXR1cm4gYT9EbyhuZXcga28oYSx0LG4scikpOk9vKGkuZXJyb3JzKX12YXIgUG89Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMua2luZD1lLHRoaXMuX3N0eWxlRXhwcmVzc2lvbj10LHRoaXMuaXNTdGF0ZURlcGVuZGVudD1lIT09YGNvbnN0YW50YCYmIWxvKHQuZXhwcmVzc2lvbiksdGhpcy5nbG9iYWxTdGF0ZVJlZnM9Vm8odC5leHByZXNzaW9uKSx0aGlzLl9nbG9iYWxTdGF0ZT1ufWV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZSx0LG4scixpLGEpe3JldHVybiB0aGlzLl9nbG9iYWxTdGF0ZSYmKGU9V28oZSx0aGlzLl9nbG9iYWxTdGF0ZSkpLHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGUsdCxuLHIsaSxhKX1ldmFsdWF0ZShlLHQsbixyLGksYSl7cmV0dXJuIHRoaXMuX2dsb2JhbFN0YXRlJiYoZT1XbyhlLHRoaXMuX2dsb2JhbFN0YXRlKSksdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlKGUsdCxuLHIsaSxhKX19LEZvPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLHIsaSl7dGhpcy5raW5kPWUsdGhpcy56b29tU3RvcHM9bix0aGlzLl9zdHlsZUV4cHJlc3Npb249dCx0aGlzLmlzU3RhdGVEZXBlbmRlbnQ9ZSE9PWBjYW1lcmFgJiYhbG8odC5leHByZXNzaW9uKSx0aGlzLmdsb2JhbFN0YXRlUmVmcz1Wbyh0LmV4cHJlc3Npb24pLHRoaXMuaW50ZXJwb2xhdGlvblR5cGU9cix0aGlzLl9nbG9iYWxTdGF0ZT1pfWV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZSx0LG4scixpLGEpe3JldHVybiB0aGlzLl9nbG9iYWxTdGF0ZSYmKGU9V28oZSx0aGlzLl9nbG9iYWxTdGF0ZSkpLHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGUsdCxuLHIsaSxhKX1ldmFsdWF0ZShlLHQsbixyLGksYSl7cmV0dXJuIHRoaXMuX2dsb2JhbFN0YXRlJiYoZT1XbyhlLHRoaXMuX2dsb2JhbFN0YXRlKSksdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlKGUsdCxuLHIsaSxhKX1pbnRlcnBvbGF0aW9uRmFjdG9yKGUsdCxuKXtyZXR1cm4gdGhpcy5pbnRlcnBvbGF0aW9uVHlwZT8kci5pbnRlcnBvbGF0aW9uRmFjdG9yKHRoaXMuaW50ZXJwb2xhdGlvblR5cGUsZSx0LG4pOjB9fTtmdW5jdGlvbiBJbyhlKXtyZXR1cm4gZS5fc3R5bGVFeHByZXNzaW9uIT09dm9pZCAwfWZ1bmN0aW9uIExvKGUsdCxuLHIpe2xldCBpPU5vKGUsdCxuLHIpO2lmKGkucmVzdWx0PT09YGVycm9yYClyZXR1cm4gaTtsZXQgYT1pLnZhbHVlLmV4cHJlc3Npb24sbz1jbyhhKTtpZighbyYmIWZvKG4pKXJldHVybiBPbyhbbmV3IFphKGBgLGBkYXRhIGV4cHJlc3Npb25zIG5vdCBzdXBwb3J0ZWRgKV0pO2xldCBzPXVvKGEsW2B6b29tYF0pO2lmKCFzJiYhcG8obikpcmV0dXJuIE9vKFtuZXcgWmEoYGAsYHpvb20gZXhwcmVzc2lvbnMgbm90IHN1cHBvcnRlZGApXSk7bGV0IGM9Qm8oYSk7aWYoIWMmJiFzKXJldHVybiBPbyhbbmV3IFphKGBgLGAiem9vbSIgZXhwcmVzc2lvbiBtYXkgb25seSBiZSB1c2VkIGFzIGlucHV0IHRvIGEgdG9wLWxldmVsICJzdGVwIiBvciAiaW50ZXJwb2xhdGUiIGV4cHJlc3Npb24uYCldKTtpZihjIGluc3RhbmNlb2YgWmEpcmV0dXJuIE9vKFtjXSk7aWYoYyBpbnN0YW5jZW9mICRyJiYhbW8obikpcmV0dXJuIE9vKFtuZXcgWmEoYGAsYCJpbnRlcnBvbGF0ZSIgZXhwcmVzc2lvbnMgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHByb3BlcnR5YCldKTtpZighYylyZXR1cm4gRG8obz9uZXcgUG8oYGNvbnN0YW50YCxpLnZhbHVlLHIpOm5ldyBQbyhgc291cmNlYCxpLnZhbHVlLHIpKTtsZXQgbD1jIGluc3RhbmNlb2YgJHI/Yy5pbnRlcnBvbGF0aW9uOnZvaWQgMDtyZXR1cm4gRG8obz9uZXcgRm8oYGNhbWVyYWAsaS52YWx1ZSxjLmxhYmVscyxsLHIpOm5ldyBGbyhgY29tcG9zaXRlYCxpLnZhbHVlLGMubGFiZWxzLGwscikpfXZhciBSbz1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLmlzU3RhdGVEZXBlbmRlbnQ9ITEsdGhpcy5nbG9iYWxTdGF0ZVJlZnM9bmV3IFNldCx0aGlzLl9nbG9iYWxTdGF0ZT1udWxsLGpvKHQpLHRoaXMuX3BhcmFtZXRlcnM9ZSx0aGlzLl9zcGVjaWZpY2F0aW9uPW4sdGhpcy5fcm9vdEtleT10LHRoaXMuX2RlZmF1bHRWYWx1ZT1VbyhuKSx0aGlzLl93YXJuaW5nSGlzdG9yeT17fTtsZXQgcj1ibyh0aGlzLl9wYXJhbWV0ZXJzLHRoaXMuX3NwZWNpZmljYXRpb24pO3RoaXMua2luZD1yLmtpbmQsdGhpcy5pbnRlcnBvbGF0aW9uRmFjdG9yPXIuaW50ZXJwb2xhdGlvbkZhY3Rvcix0aGlzLnpvb21TdG9wcz1yLnpvb21TdG9wcyx0aGlzLmludGVycG9sYXRpb25UeXBlPXIuaW50ZXJwb2xhdGlvblR5cGUsdGhpcy5faW5uZXJFdmFsdWF0ZT1yLmV2YWx1YXRlfWV2YWx1YXRlKGUsdCl7dHJ5e3JldHVybiB0aGlzLl9pbm5lckV2YWx1YXRlKGUsdCl9Y2F0Y2goZSl7bGV0IHQ9ZSBpbnN0YW5jZW9mIEVycm9yP2UubWVzc2FnZTpTdHJpbmcoZSksbj1gfCR7dH1gO3JldHVybiB0aGlzLl93YXJuaW5nSGlzdG9yeVtuXXx8KHRoaXMuX3dhcm5pbmdIaXN0b3J5W25dPSEwLHR5cGVvZiBjb25zb2xlPGB1YCYmY29uc29sZS53YXJuKEFvKHRoaXMuX3Jvb3RLZXksYGAsdCx0aGlzLl9kZWZhdWx0VmFsdWUpKSksdGhpcy5fZGVmYXVsdFZhbHVlfX1zdGF0aWMgZGVzZXJpYWxpemUodCl7cmV0dXJuIG5ldyBlKHQuX3BhcmFtZXRlcnMsdC5fcm9vdEtleSx0Ll9zcGVjaWZpY2F0aW9uKX1zdGF0aWMgc2VyaWFsaXplKGUpe3JldHVybntfcGFyYW1ldGVyczplLl9wYXJhbWV0ZXJzLF9zcGVjaWZpY2F0aW9uOmUuX3NwZWNpZmljYXRpb24sX3Jvb3RLZXk6ZS5fcm9vdEtleX19fTtmdW5jdGlvbiB6byhlLHQsbixyKXtpZihnbyhlKSlyZXR1cm4gbmV3IFJvKGUsdCxuKTtpZihNbyhlKSl7bGV0IGk9TG8oZSx0LG4scik7aWYoaS5yZXN1bHQ9PT1gZXJyb3JgKXRocm93IEVycm9yKGkudmFsdWUubWFwKGU9PmAke2Uua2V5fTogJHtlLm1lc3NhZ2V9YCkuam9pbihgLCBgKSk7cmV0dXJuIGkudmFsdWV9e2xldCB0PWU7cmV0dXJuIG4udHlwZT09PWBjb2xvcmAmJnR5cGVvZiBlPT1gc3RyaW5nYD90PXoucGFyc2UoZSk6bi50eXBlPT09YHBhZGRpbmdgJiYodHlwZW9mIGU9PWBudW1iZXJgfHxBcnJheS5pc0FycmF5KGUpKT90PUZyLnBhcnNlKGUpOm4udHlwZT09PWBudW1iZXJBcnJheWAmJih0eXBlb2YgZT09YG51bWJlcmB8fEFycmF5LmlzQXJyYXkoZSkpP3Q9SXIucGFyc2UoZSk6bi50eXBlPT09YGNvbG9yQXJyYXlgJiYodHlwZW9mIGU9PWBzdHJpbmdgfHxBcnJheS5pc0FycmF5KGUpKT90PUxyLnBhcnNlKGUpOm4udHlwZT09PWB2YXJpYWJsZUFuY2hvck9mZnNldENvbGxlY3Rpb25gJiZBcnJheS5pc0FycmF5KGUpP3Q9enIucGFyc2UoZSk6bi50eXBlPT09YHByb2plY3Rpb25EZWZpbml0aW9uYCYmdHlwZW9mIGU9PWBzdHJpbmdgJiYodD1Wci5wYXJzZShlKSkse2dsb2JhbFN0YXRlUmVmczpuZXcgU2V0LF9nbG9iYWxTdGF0ZTpudWxsLGtpbmQ6YGNvbnN0YW50YCxldmFsdWF0ZTooKT0+dH19fWZ1bmN0aW9uIEJvKGUpe2xldCB0PW51bGw7aWYoZSBpbnN0YW5jZW9mIHBpKXQ9Qm8oZS5yZXN1bHQpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIHhpKXtmb3IobGV0IG4gb2YgZS5hcmdzKWlmKHQ9Qm8obiksdClicmVha31lbHNlKGUgaW5zdGFuY2VvZiBacnx8ZSBpbnN0YW5jZW9mICRyKSYmZS5pbnB1dCBpbnN0YW5jZW9mIGVvJiZlLmlucHV0Lm5hbWU9PT1gem9vbWAmJih0PWUpO3JldHVybiB0IGluc3RhbmNlb2YgWmF8fGUuZWFjaENoaWxkKGU9PntsZXQgbj1CbyhlKTtuIGluc3RhbmNlb2YgWmE/dD1uOiF0JiZuP3Q9bmV3IFphKGBgLGAiem9vbSIgZXhwcmVzc2lvbiBtYXkgb25seSBiZSB1c2VkIGFzIGlucHV0IHRvIGEgdG9wLWxldmVsICJzdGVwIiBvciAiaW50ZXJwb2xhdGUiIGV4cHJlc3Npb24uYCk6dCYmbiYmdCE9PW4mJih0PW5ldyBaYShgYCxgT25seSBvbmUgem9vbS1iYXNlZCAic3RlcCIgb3IgImludGVycG9sYXRlIiBzdWJleHByZXNzaW9uIG1heSBiZSB1c2VkIGluIGFuIGV4cHJlc3Npb24uYCkpfSksdH1mdW5jdGlvbiBWbyhlLHQ9bmV3IFNldCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBZYSYmdC5hZGQoZS5rZXkpLGUuZWFjaENoaWxkKGU9PntWbyhlLHQpfSksdH1mdW5jdGlvbiBIbyhlKXtsZXQgdD17Y29sb3I6Vm4sc3RyaW5nOkYsbnVtYmVyOlAsZW51bTpGLGJvb2xlYW46SSxmb3JtYXR0ZWQ6S24scGFkZGluZzpxbixudW1iZXJBcnJheTpZbixjb2xvckFycmF5OkpuLHByb2plY3Rpb25EZWZpbml0aW9uOkhuLHJlc29sdmVkSW1hZ2U6WG4sdmFyaWFibGVBbmNob3JPZmZzZXRDb2xsZWN0aW9uOlpufTtyZXR1cm4gZS50eXBlPT09YGFycmF5YD9Rbih0W2UudmFsdWVdfHxMLGUubGVuZ3RoKTp0W2UudHlwZV19ZnVuY3Rpb24gVW8oZSl7aWYoZS50eXBlPT09YGNvbG9yYCYmZ28oZS5kZWZhdWx0KSlyZXR1cm4gbmV3IHooMCwwLDAsMCk7c3dpdGNoKGUudHlwZSl7Y2FzZWBjb2xvcmA6cmV0dXJuIHoucGFyc2UoZS5kZWZhdWx0KXx8bnVsbDtjYXNlYHBhZGRpbmdgOnJldHVybiBGci5wYXJzZShlLmRlZmF1bHQpfHxudWxsO2Nhc2VgbnVtYmVyQXJyYXlgOnJldHVybiBJci5wYXJzZShlLmRlZmF1bHQpfHxudWxsO2Nhc2VgY29sb3JBcnJheWA6cmV0dXJuIExyLnBhcnNlKGUuZGVmYXVsdCl8fG51bGw7Y2FzZWB2YXJpYWJsZUFuY2hvck9mZnNldENvbGxlY3Rpb25gOnJldHVybiB6ci5wYXJzZShlLmRlZmF1bHQpfHxudWxsO2Nhc2VgcHJvamVjdGlvbkRlZmluaXRpb25gOnJldHVybiBWci5wYXJzZShlLmRlZmF1bHQpfHxudWxsO2RlZmF1bHQ6cmV0dXJuIGUuZGVmYXVsdD09PXZvaWQgMD9udWxsOmUuZGVmYXVsdH19ZnVuY3Rpb24gV28oZSx0KXtsZXR7em9vbTpuLGhlYXRtYXBEZW5zaXR5OnIsZWxldmF0aW9uOmksbGluZVByb2dyZXNzOmEsaXNTdXBwb3J0ZWRTY3JpcHQ6byxhY2N1bXVsYXRlZDpzfT1lPz97fTtyZXR1cm57em9vbTpuLGhlYXRtYXBEZW5zaXR5OnIsZWxldmF0aW9uOmksbGluZVByb2dyZXNzOmEsaXNTdXBwb3J0ZWRTY3JpcHQ6byxhY2N1bXVsYXRlZDpzLGdsb2JhbFN0YXRlOnR9fWZ1bmN0aW9uIEdvKGUpe2xldCB0PSExO2ZvcihsZXQgbiBvZiBlKXtsZXQgZT1LbyhuKTtpZihlPT09YGV4cHJlc3Npb25gKXJldHVybmBleHByZXNzaW9uYDtlPT09YGxlZ2FjeWAmJih0PSEwKX1yZXR1cm4gdD9gbGVnYWN5YDpgbmV1dHJhbGB9ZnVuY3Rpb24gS28oZSl7aWYodHlwZW9mIGU9PWBib29sZWFuYClyZXR1cm5gbmV1dHJhbGA7aWYoIUFycmF5LmlzQXJyYXkoZSl8fGUubGVuZ3RoPT09MClyZXR1cm5gbGVnYWN5YDtzd2l0Y2goZVswXSl7Y2FzZWBoYXNgOnJldHVybiBlLmxlbmd0aDwyfHxlWzFdPT09YCRpZGB8fGVbMV09PT1gJHR5cGVgP2BsZWdhY3lgOmUubGVuZ3RoPT09Mj9gbmV1dHJhbGA6YGV4cHJlc3Npb25gO2Nhc2VgaW5gOnJldHVybiBlLmxlbmd0aD49MyYmKHR5cGVvZiBlWzFdIT1gc3RyaW5nYHx8QXJyYXkuaXNBcnJheShlWzJdKSk/YGV4cHJlc3Npb25gOmBsZWdhY3lgO2Nhc2VgIWluYDpjYXNlYCFoYXNgOnJldHVybmBsZWdhY3lgO2Nhc2VgPT1gOmNhc2VgIT1gOmNhc2VgPmA6Y2FzZWA+PWA6Y2FzZWA8YDpjYXNlYDw9YDpyZXR1cm4gZS5sZW5ndGghPT0zfHxBcnJheS5pc0FycmF5KGVbMV0pfHxBcnJheS5pc0FycmF5KGVbMl0pP2BleHByZXNzaW9uYDpgbGVnYWN5YDtjYXNlYG5vbmVgOnJldHVybmBsZWdhY3lgO2Nhc2VgYW55YDpjYXNlYGFsbGA6cmV0dXJuIEdvKGUuc2xpY2UoMSkpO2RlZmF1bHQ6cmV0dXJuYGV4cHJlc3Npb25gfX1mdW5jdGlvbiBxbyhlKXtyZXR1cm4gS28oZSkhPT1gbGVnYWN5YH1mdW5jdGlvbiBKbyhlKXtyZXR1cm4gZT09PWAkdHlwZWA/W2BnZW9tZXRyeS10eXBlYF06ZT09PWAkaWRgP1tgaWRgXTpbYGdldGAsZV19ZnVuY3Rpb24gWW8oZSl7c3dpdGNoKGVbMF0pe2Nhc2VgPT1gOmNhc2VgIT1gOmNhc2VgPGA6Y2FzZWA8PWA6Y2FzZWA+YDpjYXNlYD49YDpyZXR1cm4gZS5sZW5ndGghPT0zfHx0eXBlb2YgZVsxXSE9YHN0cmluZ2A/bnVsbDpbZVswXSxKbyhlWzFdKSxlWzJdXTtjYXNlYGluYDpjYXNlYCFpbmA6e2lmKGUubGVuZ3RoPDJ8fHR5cGVvZiBlWzFdIT1gc3RyaW5nYClyZXR1cm4gbnVsbDtsZXQgdD1bYGluYCxKbyhlWzFdKSxbYGxpdGVyYWxgLGUuc2xpY2UoMildXTtyZXR1cm4gZVswXT09PWAhaW5gP1tgIWAsdF06dH1jYXNlYGhhc2A6Y2FzZWAhaGFzYDp7aWYoZS5sZW5ndGghPT0yfHx0eXBlb2YgZVsxXSE9YHN0cmluZ2B8fGVbMV09PT1gJHR5cGVgfHxlWzFdPT09YCRpZGApcmV0dXJuIG51bGw7bGV0IHQ9W2BoYXNgLGVbMV1dO3JldHVybiBlWzBdPT09YCFoYXNgP1tgIWAsdF06dH1kZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBYbyhlKXtpZigoZVswXT09PWA8YHx8ZVswXT09PWA8PWB8fGVbMF09PT1gPmB8fGVbMF09PT1gPj1gKSYmZVsxXT09PWAkdHlwZWApcmV0dXJuYCIkdHlwZSIgY2Fubm90IGJlIHVzZSB3aXRoIG9wZXJhdG9yICIke2VbMF19ImA7bGV0IHQ9WW8oZSk7cmV0dXJuIHQ/YE1peGluZyBkZXByZWNhdGVkIGZpbHRlciBzeW50YXggd2l0aCBleHByZXNzaW9uIHN5bnRheCBpcyBub3Qgc3VwcG9ydGVkLiBSZXBsYWNlICR7SlNPTi5zdHJpbmdpZnkoZSl9IHdpdGggJHtKU09OLnN0cmluZ2lmeSh0KX0uYDpgTWl4aW5nIGRlcHJlY2F0ZWQgZmlsdGVyIHN5bnRheCB3aXRoIGV4cHJlc3Npb24gc3ludGF4IGlzIG5vdCBzdXBwb3J0ZWQuIENvbnZlcnQgJHtKU09OLnN0cmluZ2lmeShlKX0gdG8gZXhwcmVzc2lvbiBzeW50YXguYH1mdW5jdGlvbiBabyhlLHQsbil7bGV0IHI9bltlXTtyZXR1cm4gQXJyYXkuaXNBcnJheShyKT9xbyhyKT9RbyhyLHQuY29uY2F0KGUpKTp7cGF0aDp0LmNvbmNhdChlKSxsZWdhY3lGaWx0ZXI6cn06bnVsbH1mdW5jdGlvbiBRbyhlLHQ9W10pe2lmKCFBcnJheS5pc0FycmF5KGUpfHxlLmxlbmd0aDwxKXJldHVybiBudWxsO3N3aXRjaChlWzBdKXtjYXNlYGFsbGA6Y2FzZWBhbnlgOmNhc2Vgbm9uZWA6Zm9yKGxldCBuPTE7bjxlLmxlbmd0aDtuKyspe2xldCByPVpvKG4sdCxlKTtpZihyKXJldHVybiByfWJyZWFrO2Nhc2VgIWA6e2xldCBuPVpvKDEsdCxlKTtpZihuKXJldHVybiBuO2JyZWFrfWNhc2VgY2FzZWA6Zm9yKGxldCBuPTE7bjxlLmxlbmd0aC0xO24rPTIpe2xldCByPVpvKG4sdCxlKTtpZihyKXJldHVybiByfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiAkbyhlLHQpe2xldCBuPVFvKGUpO2lmKCFufHx0eXBlb2YgY29uc29sZT5gdWApcmV0dXJuO2xldCByPW4ucGF0aC5tYXAoZT0+YFske2V9XWApLmpvaW4oYGApO2NvbnNvbGUud2FybihgJHt0fSR7cn06ICR7WG8obi5sZWdhY3lGaWx0ZXIpfWApfWNvbnN0IGVzPXt0eXBlOmBib29sZWFuYCxkZWZhdWx0OiExLHRyYW5zaXRpb246ITEsInByb3BlcnR5LXR5cGUiOmBkYXRhLWRyaXZlbmAsZXhwcmVzc2lvbjp7aW50ZXJwb2xhdGVkOiExLHBhcmFtZXRlcnM6W2B6b29tYCxgZmVhdHVyZWBdfX07ZnVuY3Rpb24gdHMoZSx0LG4pe2lmKGU9PW51bGwpcmV0dXJue2ZpbHRlcjooKT0+ITAsbmVlZEdlb21ldHJ5OiExLGdldEdsb2JhbFN0YXRlUmVmczooKT0+bmV3IFNldH07cW8oZSk/JG8oZSx0KTplPWlzKGUpO2xldCByPU5vKGUsdCxlcyxuKTtpZihyLnJlc3VsdD09PWBlcnJvcmApdGhyb3cgRXJyb3Ioci52YWx1ZS5tYXAoZT0+YCR7ZS5rZXl9OiAke2UubWVzc2FnZX1gKS5qb2luKGAsIGApKTtyZXR1cm57ZmlsdGVyOihlLHQsbik9PnIudmFsdWUuZXZhbHVhdGUoZSx0LHt9LG4pLG5lZWRHZW9tZXRyeTpycyhlKSxnZXRHbG9iYWxTdGF0ZVJlZnM6KCk9PlZvKHIudmFsdWUuZXhwcmVzc2lvbil9fWZ1bmN0aW9uIG5zKGUsdCl7cmV0dXJuIGU8dD8tMTorKGU+dCl9ZnVuY3Rpb24gcnMoZSl7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuITE7aWYoZVswXT09PWB3aXRoaW5gfHxlWzBdPT09YGRpc3RhbmNlYClyZXR1cm4hMDtmb3IobGV0IHQ9MTt0PGUubGVuZ3RoO3QrKylpZihycyhlW3RdKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBpcyhlKXtpZighZSlyZXR1cm4hMDtsZXQgdD1lWzBdO3JldHVybiBlLmxlbmd0aDw9MT90IT09YGFueWA6dD09PWA9PWA/YXMoZVsxXSxlWzJdLGA9PWApOnQ9PT1gIT1gP2xzKGFzKGVbMV0sZVsyXSxgPT1gKSk6dD09PWA8YHx8dD09PWA+YHx8dD09PWA8PWB8fHQ9PT1gPj1gP2FzKGVbMV0sZVsyXSx0KTp0PT09YGFueWA/b3MoZS5zbGljZSgxKSk6dD09PWBhbGxgP1tgYWxsYF0uY29uY2F0KGUuc2xpY2UoMSkubWFwKGlzKSk6dD09PWBub25lYD9bYGFsbGBdLmNvbmNhdChlLnNsaWNlKDEpLm1hcChpcykubWFwKGxzKSk6dD09PWBpbmA/c3MoZVsxXSxlLnNsaWNlKDIpKTp0PT09YCFpbmA/bHMoc3MoZVsxXSxlLnNsaWNlKDIpKSk6dD09PWBoYXNgP2NzKGVbMV0pOnQhPT1gIWhhc2B8fGxzKGNzKGVbMV0pKX1mdW5jdGlvbiBhcyhlLHQsbil7c3dpdGNoKGUpe2Nhc2VgJHR5cGVgOnJldHVybltgZmlsdGVyLXR5cGUtJHtufWAsdF07Y2FzZWAkaWRgOnJldHVybltgZmlsdGVyLWlkLSR7bn1gLHRdO2RlZmF1bHQ6cmV0dXJuW2BmaWx0ZXItJHtufWAsZSx0XX19ZnVuY3Rpb24gb3MoZSl7cmV0dXJuW2BhbnlgXS5jb25jYXQoZS5tYXAoaXMpKX1mdW5jdGlvbiBzcyhlLHQpe2lmKHQubGVuZ3RoPT09MClyZXR1cm4hMTtzd2l0Y2goZSl7Y2FzZWAkdHlwZWA6cmV0dXJuW2BmaWx0ZXItdHlwZS1pbmAsW2BsaXRlcmFsYCx0XV07Y2FzZWAkaWRgOnJldHVybltgZmlsdGVyLWlkLWluYCxbYGxpdGVyYWxgLHRdXTtkZWZhdWx0OnJldHVybiB0Lmxlbmd0aD4yMDAmJiF0LnNvbWUoZT0+dHlwZW9mIGUhPXR5cGVvZiB0WzBdKT9bYGZpbHRlci1pbi1sYXJnZWAsZSxbYGxpdGVyYWxgLHQuc29ydChucyldXTpbYGZpbHRlci1pbi1zbWFsbGAsZSxbYGxpdGVyYWxgLHRdXX19ZnVuY3Rpb24gY3MoZSl7c3dpdGNoKGUpe2Nhc2VgJHR5cGVgOnJldHVybiEwO2Nhc2VgJGlkYDpyZXR1cm5bYGZpbHRlci1oYXMtaWRgXTtkZWZhdWx0OnJldHVybltgZmlsdGVyLWhhc2AsZV19fWZ1bmN0aW9uIGxzKGUpe3JldHVybltgIWAsZV19ZnVuY3Rpb24gdXMoZSl7bGV0IHQ9ZS5rZXksbj1lLnZhbHVlO3JldHVybiBuP1tuZXcgTih0LG4sYGNvbnN0YW50cyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhcyBvZiB2OGApXTpbXX1mdW5jdGlvbiBkcyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE51bWJlcnx8ZSBpbnN0YW5jZW9mIFN0cmluZ3x8ZSBpbnN0YW5jZW9mIEJvb2xlYW4/ZS52YWx1ZU9mKCk6ZX1mdW5jdGlvbiBmcyhlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlLm1hcChmcyk7aWYoZSBpbnN0YW5jZW9mIE9iamVjdCYmIShlIGluc3RhbmNlb2YgTnVtYmVyfHxlIGluc3RhbmNlb2YgU3RyaW5nfHxlIGluc3RhbmNlb2YgQm9vbGVhbikpe2xldCB0PXt9O2ZvcihsZXQgbiBpbiBlKXRbbl09ZnMoZVtuXSk7cmV0dXJuIHR9cmV0dXJuIGRzKGUpfWZ1bmN0aW9uIHBzKGUpe2xldCB0PWUua2V5LG49ZS52YWx1ZSxyPWUudmFsdWVTcGVjfHx7fSxpPWUub2JqZWN0RWxlbWVudFZhbGlkYXRvcnN8fHt9LGE9ZS5zdHlsZSxvPWUuc3R5bGVTcGVjLHM9ZS52YWxpZGF0ZVNwZWMsYz1bXSxsPVYobik7aWYobCE9PWBvYmplY3RgKXJldHVybltuZXcgTih0LG4sYG9iamVjdCBleHBlY3RlZCwgJHtsfSBmb3VuZGApXTtmb3IobGV0IGUgaW4gbil7bGV0IGw9ZS5zcGxpdChgLmApWzBdLHU9U3IocixsKXx8cltgKmBdLGQ7aWYoU3IoaSxsKSlkPWlbbF07ZWxzZSBpZihTcihyLGwpKXtpZihuW2VdPT09dm9pZCAwKWNvbnRpbnVlO2Q9c31lbHNlIGlmKGlbYCpgXSlkPWlbYCpgXTtlbHNlIGlmKHJbYCpgXSlkPXM7ZWxzZXtjLnB1c2gobmV3IE4odCxuW2VdLGB1bmtub3duIHByb3BlcnR5ICIke2V9ImApKTtjb250aW51ZX1jPWMuY29uY2F0KGQoe2tleToodCYmYCR7dH0uYCkrZSx2YWx1ZTpuW2VdLHZhbHVlU3BlYzp1LHN0eWxlOmEsc3R5bGVTcGVjOm8sb2JqZWN0Om4sb2JqZWN0S2V5OmUsdmFsaWRhdGVTcGVjOnN9LG4pKX1mb3IobGV0IGUgaW4gcilpW2VdfHxyW2VdLnJlcXVpcmVkJiZyW2VdLmRlZmF1bHQ9PT12b2lkIDAmJm5bZV09PT12b2lkIDAmJmMucHVzaChuZXcgTih0LG4sYG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgIiR7ZX0iYCkpO3JldHVybiBjfWZ1bmN0aW9uIG1zKGUpe2xldCB0PWUudmFsdWUsbj1lLnZhbHVlU3BlYyxyPWUudmFsaWRhdGVTcGVjLGk9ZS5zdHlsZSxhPWUuc3R5bGVTcGVjLG89ZS5rZXkscz1lLmFycmF5RWxlbWVudFZhbGlkYXRvcnx8cjtpZihWKHQpIT09YGFycmF5YClyZXR1cm5bbmV3IE4obyx0LGBhcnJheSBleHBlY3RlZCwgJHtWKHQpfSBmb3VuZGApXTtpZihuLmxlbmd0aCYmdC5sZW5ndGghPT1uLmxlbmd0aClyZXR1cm5bbmV3IE4obyx0LGBhcnJheSBsZW5ndGggJHtuLmxlbmd0aH0gZXhwZWN0ZWQsIGxlbmd0aCAke3QubGVuZ3RofSBmb3VuZGApXTtsZXQgYz17dHlwZTpuLnZhbHVlLHZhbHVlczpuLnZhbHVlc307YS4kdmVyc2lvbjw3JiYoYy5mdW5jdGlvbj1uLmZ1bmN0aW9uKSxWKG4udmFsdWUpPT09YG9iamVjdGAmJihjPW4udmFsdWUpO2xldCBsPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWw9bC5jb25jYXQocyh7YXJyYXk6dCxhcnJheUluZGV4Om4sdmFsdWU6dFtuXSx2YWx1ZVNwZWM6Yyx2YWxpZGF0ZVNwZWM6ZS52YWxpZGF0ZVNwZWMsc3R5bGU6aSxzdHlsZVNwZWM6YSxrZXk6YCR7b31bJHtufV1gfSkpO3JldHVybiBsfWZ1bmN0aW9uIGhzKGUpe2xldCB0PWUua2V5LG49ZS52YWx1ZSxyPWUudmFsdWVTcGVjLGk9VihuKTtyZXR1cm4gaT09PWBudW1iZXJgJiZuIT09biYmKGk9YE5hTmApLGk9PT1gbnVtYmVyYD9gbWluaW11bWBpbiByJiZuPHIubWluaW11bT9bbmV3IE4odCxuLGAke259IGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSAke3IubWluaW11bX1gKV06YG1heGltdW1gaW4gciYmbj5yLm1heGltdW0/W25ldyBOKHQsbixgJHtufSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgJHtyLm1heGltdW19YCldOltdOltuZXcgTih0LG4sYG51bWJlciBleHBlY3RlZCwgJHtpfSBmb3VuZGApXX1mdW5jdGlvbiBncyhlKXtsZXQgdD1lLnZhbHVlU3BlYyxuPWRzKGUudmFsdWUudHlwZSkscixpPXt9LGEsbyxzPW4hPT1gY2F0ZWdvcmljYWxgJiZlLnZhbHVlLnByb3BlcnR5PT09dm9pZCAwLGM9IXMsbD1WKGUudmFsdWUuc3RvcHMpPT09YGFycmF5YCYmVihlLnZhbHVlLnN0b3BzWzBdKT09PWBhcnJheWAmJlYoZS52YWx1ZS5zdG9wc1swXVswXSk9PT1gb2JqZWN0YCx1PXBzKHtrZXk6ZS5rZXksdmFsdWU6ZS52YWx1ZSx2YWx1ZVNwZWM6ZS5zdHlsZVNwZWMuZnVuY3Rpb24sdmFsaWRhdGVTcGVjOmUudmFsaWRhdGVTcGVjLHN0eWxlOmUuc3R5bGUsc3R5bGVTcGVjOmUuc3R5bGVTcGVjLG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOntzdG9wczpkLGRlZmF1bHQ6bX19KTtyZXR1cm4gbj09PWBpZGVudGl0eWAmJnMmJnUucHVzaChuZXcgTihlLmtleSxlLnZhbHVlLGBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5ICJwcm9wZXJ0eSJgKSksbiE9PWBpZGVudGl0eWAmJiFlLnZhbHVlLnN0b3BzJiZ1LnB1c2gobmV3IE4oZS5rZXksZS52YWx1ZSxgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSAic3RvcHMiYCkpLG49PT1gZXhwb25lbnRpYWxgJiZlLnZhbHVlU3BlYy5leHByZXNzaW9uJiYhbW8oZS52YWx1ZVNwZWMpJiZ1LnB1c2gobmV3IE4oZS5rZXksZS52YWx1ZSxgZXhwb25lbnRpYWwgZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWRgKSksZS5zdHlsZVNwZWMuJHZlcnNpb24+PTgmJihjJiYhZm8oZS52YWx1ZVNwZWMpP3UucHVzaChuZXcgTihlLmtleSxlLnZhbHVlLGBwcm9wZXJ0eSBmdW5jdGlvbnMgbm90IHN1cHBvcnRlZGApKTpzJiYhcG8oZS52YWx1ZVNwZWMpJiZ1LnB1c2gobmV3IE4oZS5rZXksZS52YWx1ZSxgem9vbSBmdW5jdGlvbnMgbm90IHN1cHBvcnRlZGApKSksKG49PT1gY2F0ZWdvcmljYWxgfHxsKSYmZS52YWx1ZS5wcm9wZXJ0eT09PXZvaWQgMCYmdS5wdXNoKG5ldyBOKGUua2V5LGUudmFsdWUsYCJwcm9wZXJ0eSIgcHJvcGVydHkgaXMgcmVxdWlyZWRgKSksdTtmdW5jdGlvbiBkKGUpe2lmKG49PT1gaWRlbnRpdHlgKXJldHVybltuZXcgTihlLmtleSxlLnZhbHVlLGBpZGVudGl0eSBmdW5jdGlvbiBtYXkgbm90IGhhdmUgYSAic3RvcHMiIHByb3BlcnR5YCldO2xldCB0PVtdLHI9ZS52YWx1ZTtyZXR1cm4gdD10LmNvbmNhdChtcyh7a2V5OmUua2V5LHZhbHVlOnIsdmFsdWVTcGVjOmUudmFsdWVTcGVjLHZhbGlkYXRlU3BlYzplLnZhbGlkYXRlU3BlYyxzdHlsZTplLnN0eWxlLHN0eWxlU3BlYzplLnN0eWxlU3BlYyxhcnJheUVsZW1lbnRWYWxpZGF0b3I6Zn0pKSxWKHIpPT09YGFycmF5YCYmci5sZW5ndGg9PT0wJiZ0LnB1c2gobmV3IE4oZS5rZXkscixgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdG9wYCkpLHR9ZnVuY3Rpb24gZihlKXtsZXQgbj1bXSxyPWUudmFsdWUscz1lLmtleTtpZihWKHIpIT09YGFycmF5YClyZXR1cm5bbmV3IE4ocyxyLGBhcnJheSBleHBlY3RlZCwgJHtWKHIpfSBmb3VuZGApXTtpZihyLmxlbmd0aCE9PTIpcmV0dXJuW25ldyBOKHMscixgYXJyYXkgbGVuZ3RoIDIgZXhwZWN0ZWQsIGxlbmd0aCAke3IubGVuZ3RofSBmb3VuZGApXTtpZihsKXtpZihWKHJbMF0pIT09YG9iamVjdGApcmV0dXJuW25ldyBOKHMscixgb2JqZWN0IGV4cGVjdGVkLCAke1YoclswXSl9IGZvdW5kYCldO2lmKHJbMF0uem9vbT09PXZvaWQgMClyZXR1cm5bbmV3IE4ocyxyLGBvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHpvb21gKV07aWYoclswXS52YWx1ZT09PXZvaWQgMClyZXR1cm5bbmV3IE4ocyxyLGBvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHZhbHVlYCldO2lmKG8mJm8+ZHMoclswXS56b29tKSlyZXR1cm5bbmV3IE4ocyxyWzBdLnpvb20sYHN0b3Agem9vbSB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyYCldO2RzKHJbMF0uem9vbSkhPT1vJiYobz1kcyhyWzBdLnpvb20pLGE9dm9pZCAwLGk9e30pLG49bi5jb25jYXQocHMoe2tleTpgJHtzfVswXWAsdmFsdWU6clswXSx2YWx1ZVNwZWM6e3pvb206e319LHZhbGlkYXRlU3BlYzplLnZhbGlkYXRlU3BlYyxzdHlsZTplLnN0eWxlLHN0eWxlU3BlYzplLnN0eWxlU3BlYyxvYmplY3RFbGVtZW50VmFsaWRhdG9yczp7em9vbTpocyx2YWx1ZTpwfX0pKX1lbHNlIG49bi5jb25jYXQocCh7a2V5OmAke3N9WzBdYCx2YWx1ZTpyWzBdLHZhbHVlU3BlYzp7fSx2YWxpZGF0ZVNwZWM6ZS52YWxpZGF0ZVNwZWMsc3R5bGU6ZS5zdHlsZSxzdHlsZVNwZWM6ZS5zdHlsZVNwZWN9LHIpKTtyZXR1cm4gTW8oZnMoclsxXSkpP24uY29uY2F0KFtuZXcgTihgJHtzfVsxXWAsclsxXSxgZXhwcmVzc2lvbnMgYXJlIG5vdCBhbGxvd2VkIGluIGZ1bmN0aW9uIHN0b3BzLmApXSk6bi5jb25jYXQoZS52YWxpZGF0ZVNwZWMoe2tleTpgJHtzfVsxXWAsdmFsdWU6clsxXSx2YWx1ZVNwZWM6dCx2YWxpZGF0ZVNwZWM6ZS52YWxpZGF0ZVNwZWMsc3R5bGU6ZS5zdHlsZSxzdHlsZVNwZWM6ZS5zdHlsZVNwZWN9KSl9ZnVuY3Rpb24gcChlLG8pe2xldCBzPVYoZS52YWx1ZSksYz1kcyhlLnZhbHVlKSxsPWUudmFsdWU9PT1udWxsP286ZS52YWx1ZTtpZighcilyPXM7ZWxzZSBpZihzIT09cilyZXR1cm5bbmV3IE4oZS5rZXksbCxgJHtzfSBzdG9wIGRvbWFpbiB0eXBlIG11c3QgbWF0Y2ggcHJldmlvdXMgc3RvcCBkb21haW4gdHlwZSAke3J9YCldO2lmKHMhPT1gbnVtYmVyYCYmcyE9PWBzdHJpbmdgJiZzIT09YGJvb2xlYW5gKXJldHVybltuZXcgTihlLmtleSxsLGBzdG9wIGRvbWFpbiB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyLCBzdHJpbmcsIG9yIGJvb2xlYW5gKV07aWYocyE9PWBudW1iZXJgJiZuIT09YGNhdGVnb3JpY2FsYCl7bGV0IHI9YG51bWJlciBleHBlY3RlZCwgJHtzfSBmb3VuZGA7cmV0dXJuIGZvKHQpJiZuPT09dm9pZCAwJiYocis9J1xuSWYgeW91IGludGVuZGVkIHRvIHVzZSBhIGNhdGVnb3JpY2FsIGZ1bmN0aW9uLCBzcGVjaWZ5IGAidHlwZSI6ICJjYXRlZ29yaWNhbCJgLicpLFtuZXcgTihlLmtleSxsLHIpXX1yZXR1cm4gbj09PWBjYXRlZ29yaWNhbGAmJnM9PT1gbnVtYmVyYCYmKCFpc0Zpbml0ZShjKXx8TWF0aC5mbG9vcihjKSE9PWMpP1tuZXcgTihlLmtleSxsLGBpbnRlZ2VyIGV4cGVjdGVkLCBmb3VuZCAke2N9YCldOm4hPT1gY2F0ZWdvcmljYWxgJiZzPT09YG51bWJlcmAmJmEhPT12b2lkIDAmJmM8YT9bbmV3IE4oZS5rZXksbCxgc3RvcCBkb21haW4gdmFsdWVzIG11c3QgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlcmApXTooYT1jLG49PT1gY2F0ZWdvcmljYWxgJiZjIGluIGk/W25ldyBOKGUua2V5LGwsYHN0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZWApXTooaVtjXT0hMCxbXSkpfWZ1bmN0aW9uIG0oZSl7cmV0dXJuIGUudmFsaWRhdGVTcGVjKHtrZXk6ZS5rZXksdmFsdWU6ZS52YWx1ZSx2YWx1ZVNwZWM6dCx2YWxpZGF0ZVNwZWM6ZS52YWxpZGF0ZVNwZWMsc3R5bGU6ZS5zdHlsZSxzdHlsZVNwZWM6ZS5zdHlsZVNwZWN9KX19ZnVuY3Rpb24gX3MoZSl7bGV0IHQ9KGUuZXhwcmVzc2lvbkNvbnRleHQ9PT1gcHJvcGVydHlgP0xvOk5vKShmcyhlLnZhbHVlKSxlLmtleSxlLnZhbHVlU3BlYyk7aWYodC5yZXN1bHQ9PT1gZXJyb3JgKXJldHVybiB0LnZhbHVlLm1hcCh0PT5uZXcgTihgJHtlLmtleX0ke3Qua2V5fWAsZS52YWx1ZSx0Lm1lc3NhZ2UpKTtsZXQgbj10LnZhbHVlLmV4cHJlc3Npb258fHQudmFsdWUuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uO2lmKGUuZXhwcmVzc2lvbkNvbnRleHQ9PT1gcHJvcGVydHlgJiZlLnByb3BlcnR5S2V5PT09YHRleHQtZm9udGAmJiFuLm91dHB1dERlZmluZWQoKSlyZXR1cm5bbmV3IE4oZS5rZXksZS52YWx1ZSxgSW52YWxpZCBkYXRhIGV4cHJlc3Npb24gZm9yICIke2UucHJvcGVydHlLZXl9Ii4gT3V0cHV0IHZhbHVlcyBtdXN0IGJlIGNvbnRhaW5lZCBhcyBsaXRlcmFscyB3aXRoaW4gdGhlIGV4cHJlc3Npb24uYCldO2lmKGUuZXhwcmVzc2lvbkNvbnRleHQ9PT1gcHJvcGVydHlgJiZlLnByb3BlcnR5VHlwZT09PWBsYXlvdXRgJiYhbG8obikpcmV0dXJuW25ldyBOKGUua2V5LGUudmFsdWUsYCJmZWF0dXJlLXN0YXRlIiBkYXRhIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbGF5b3V0IHByb3BlcnRpZXMuYCldO2lmKGUuZXhwcmVzc2lvbkNvbnRleHQ9PT1gZmlsdGVyYCYmIWxvKG4pKXJldHVybltuZXcgTihlLmtleSxlLnZhbHVlLGAiZmVhdHVyZS1zdGF0ZSIgZGF0YSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGZpbHRlcnMuYCldO2lmKGUuZXhwcmVzc2lvbkNvbnRleHQmJmUuZXhwcmVzc2lvbkNvbnRleHQuaW5kZXhPZihgY2x1c3RlcmApPT09MCl7aWYoIXVvKG4sW2B6b29tYCxgZmVhdHVyZS1zdGF0ZWBdKSlyZXR1cm5bbmV3IE4oZS5rZXksZS52YWx1ZSxgInpvb20iIGFuZCAiZmVhdHVyZS1zdGF0ZSIgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBjbHVzdGVyIHByb3BlcnRpZXMuYCldO2lmKGUuZXhwcmVzc2lvbkNvbnRleHQ9PT1gY2x1c3Rlci1pbml0aWFsYCYmIWNvKG4pKXJldHVybltuZXcgTihlLmtleSxlLnZhbHVlLGBGZWF0dXJlIGRhdGEgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBpbml0aWFsIGV4cHJlc3Npb24gcGFydCBvZiBjbHVzdGVyIHByb3BlcnRpZXMuYCldfXJldHVybltdfWZ1bmN0aW9uIHZzKGUpe2xldCB0PWUudmFsdWUsbj1lLmtleSxyPVYodCk7cmV0dXJuIHI9PT1gYm9vbGVhbmA/W106W25ldyBOKG4sdCxgYm9vbGVhbiBleHBlY3RlZCwgJHtyfSBmb3VuZGApXX1mdW5jdGlvbiB5cyhlKXtsZXQgdD1lLmtleSxuPWUudmFsdWUscj1WKG4pO3JldHVybiByPT09YHN0cmluZ2A/ei5wYXJzZShTdHJpbmcobikpP1tdOltuZXcgTih0LG4sYGNvbG9yIGV4cGVjdGVkLCAiJHtufSIgZm91bmRgKV06W25ldyBOKHQsbixgY29sb3IgZXhwZWN0ZWQsICR7cn0gZm91bmRgKV19ZnVuY3Rpb24gYnMoZSl7bGV0IHQ9ZS5rZXksbj1lLnZhbHVlLHI9ZS52YWx1ZVNwZWMsaT1bXTtyZXR1cm4gQXJyYXkuaXNBcnJheShyLnZhbHVlcyk/ci52YWx1ZXMuaW5kZXhPZihkcyhuKSk9PT0tMSYmaS5wdXNoKG5ldyBOKHQsbixgZXhwZWN0ZWQgb25lIG9mIFske3IudmFsdWVzLmpvaW4oYCwgYCl9XSwgJHtKU09OLnN0cmluZ2lmeShuKX0gZm91bmRgKSk6T2JqZWN0LmtleXMoci52YWx1ZXMpLmluZGV4T2YoZHMobikpPT09LTEmJmkucHVzaChuZXcgTih0LG4sYGV4cGVjdGVkIG9uZSBvZiBbJHtPYmplY3Qua2V5cyhyLnZhbHVlcykuam9pbihgLCBgKX1dLCAke0pTT04uc3RyaW5naWZ5KG4pfSBmb3VuZGApKSxpfWZ1bmN0aW9uIHhzKGUsdCl7bGV0IG49ZTtmb3IobGV0IGUgb2YgdCluPW5bZV07cmV0dXJuIG59ZnVuY3Rpb24gU3MoZSx0KXtsZXQgbj1Rbyh0KTtyZXR1cm4gbj9bbmV3IE4oYCR7ZS5rZXl9JHtuLnBhdGgubWFwKGU9PmBbJHtlfV1gKS5qb2luKGBgKX1gLHhzKGUudmFsdWUsbi5wYXRoKSxYbyhuLmxlZ2FjeUZpbHRlciksbnVsbCxgd2FybmluZ2ApXTpbXX1mdW5jdGlvbiBDcyhlKXtsZXQgdD1mcyhlLnZhbHVlKTtyZXR1cm4gcW8odCk/Wy4uLlNzKGUsdCksLi4uX3MoaG8oe30sZSx7ZXhwcmVzc2lvbkNvbnRleHQ6YGZpbHRlcmAsdmFsdWVTcGVjOnt2YWx1ZTpgYm9vbGVhbmB9fSkpXTp3cyhlKX1mdW5jdGlvbiB3cyhlKXtsZXQgdD1lLnZhbHVlLG49ZS5rZXk7aWYoVih0KSE9PWBhcnJheWApcmV0dXJuW25ldyBOKG4sdCxgYXJyYXkgZXhwZWN0ZWQsICR7Vih0KX0gZm91bmRgKV07bGV0IHI9ZS5zdHlsZVNwZWMsaSxhPVtdO2lmKHQubGVuZ3RoPDEpcmV0dXJuW25ldyBOKG4sdCxgZmlsdGVyIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCAxIGVsZW1lbnRgKV07c3dpdGNoKGE9YS5jb25jYXQoYnMoe2tleTpgJHtufVswXWAsdmFsdWU6dFswXSx2YWx1ZVNwZWM6ci5maWx0ZXJfb3BlcmF0b3Isc3R5bGU6ZS5zdHlsZSxzdHlsZVNwZWM6ZS5zdHlsZVNwZWN9KSksZHModFswXSkpe2Nhc2VgPGA6Y2FzZWA8PWA6Y2FzZWA+YDpjYXNlYD49YDp0Lmxlbmd0aD49MiYmZHModFsxXSk9PT1gJHR5cGVgJiZhLnB1c2gobmV3IE4obix0LGAiJHR5cGUiIGNhbm5vdCBiZSB1c2Ugd2l0aCBvcGVyYXRvciAiJHt0WzBdfSJgKSk7Y2FzZWA9PWA6Y2FzZWAhPWA6dC5sZW5ndGghPT0zJiZhLnB1c2gobmV3IE4obix0LGBmaWx0ZXIgYXJyYXkgZm9yIG9wZXJhdG9yICIke3RbMF19IiBtdXN0IGhhdmUgMyBlbGVtZW50c2ApKTtjYXNlYGluYDpjYXNlYCFpbmA6dC5sZW5ndGg+PTImJihpPVYodFsxXSksaSE9PWBzdHJpbmdgJiZhLnB1c2gobmV3IE4oYCR7bn1bMV1gLHRbMV0sYHN0cmluZyBleHBlY3RlZCwgJHtpfSBmb3VuZGApKSk7Zm9yKGxldCBvPTI7bzx0Lmxlbmd0aDtvKyspaT1WKHRbb10pLGRzKHRbMV0pPT09YCR0eXBlYD9hPWEuY29uY2F0KGJzKHtrZXk6YCR7bn1bJHtvfV1gLHZhbHVlOnRbb10sdmFsdWVTcGVjOnIuZ2VvbWV0cnlfdHlwZSxzdHlsZTplLnN0eWxlLHN0eWxlU3BlYzplLnN0eWxlU3BlY30pKTppIT09YHN0cmluZ2AmJmkhPT1gbnVtYmVyYCYmaSE9PWBib29sZWFuYCYmYS5wdXNoKG5ldyBOKGAke259WyR7b31dYCx0W29dLGBzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbiBleHBlY3RlZCwgJHtpfSBmb3VuZGApKTticmVhaztjYXNlYGFueWA6Y2FzZWBhbGxgOmNhc2Vgbm9uZWA6Zm9yKGxldCByPTE7cjx0Lmxlbmd0aDtyKyspYT1hLmNvbmNhdCh3cyh7a2V5OmAke259WyR7cn1dYCx2YWx1ZTp0W3JdLHN0eWxlOmUuc3R5bGUsc3R5bGVTcGVjOmUuc3R5bGVTcGVjfSkpO2JyZWFrO2Nhc2VgaGFzYDpjYXNlYCFoYXNgOmk9Vih0WzFdKSx0Lmxlbmd0aD09PTI/aSE9PWBzdHJpbmdgJiZhLnB1c2gobmV3IE4oYCR7bn1bMV1gLHRbMV0sYHN0cmluZyBleHBlY3RlZCwgJHtpfSBmb3VuZGApKTphLnB1c2gobmV3IE4obix0LGBmaWx0ZXIgYXJyYXkgZm9yICIke3RbMF19IiBvcGVyYXRvciBtdXN0IGhhdmUgMiBlbGVtZW50c2ApKX1yZXR1cm4gYX1mdW5jdGlvbiBUcyhlLHQpe2xldCBuPWUua2V5LHI9ZS52YWxpZGF0ZVNwZWMsaT1lLnN0eWxlLGE9ZS5zdHlsZVNwZWMsbz1lLnZhbHVlLHM9ZS5vYmplY3RLZXksYz1hW2Ake3R9XyR7ZS5sYXllclR5cGV9YF07aWYoIWMpcmV0dXJuW107bGV0IGw9cy5tYXRjaCgvXiguKiktdHJhbnNpdGlvbiQvKTtpZih0PT09YHBhaW50YCYmbCYmY1tsWzFdXSYmY1tsWzFdXS50cmFuc2l0aW9uKXJldHVybiByKHtrZXk6bix2YWx1ZTpvLHZhbHVlU3BlYzphLnRyYW5zaXRpb24sc3R5bGU6aSxzdHlsZVNwZWM6YX0pO2xldCB1PWUudmFsdWVTcGVjfHxjW3NdO2lmKCF1KXJldHVybltuZXcgTihuLG8sYHVua25vd24gcHJvcGVydHkgIiR7c30iYCldO2xldCBkO2lmKFYobyk9PT1gc3RyaW5nYCYmZm8odSkmJiF1LnRva2VucyYmKGQ9L157KFtefV0rKX0kLy5leGVjKG8pKSlyZXR1cm5bbmV3IE4obixvLGAiJHtzfSIgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcnBvbGF0aW9uIHN5bnRheFxuVXNlIGFuIGlkZW50aXR5IHByb3BlcnR5IGZ1bmN0aW9uIGluc3RlYWQ6IFxgeyAidHlwZSI6ICJpZGVudGl0eSIsICJwcm9wZXJ0eSI6ICR7SlNPTi5zdHJpbmdpZnkoZFsxXSl9IH1cYC5gKV07bGV0IGY9W107cmV0dXJuIGUubGF5ZXJUeXBlPT09YHN5bWJvbGAmJnM9PT1gdGV4dC1mb250YCYmZ28oZnMobykpJiZkcyhvLnR5cGUpPT09YGlkZW50aXR5YCYmZi5wdXNoKG5ldyBOKG4sbyxgInRleHQtZm9udCIgZG9lcyBub3Qgc3VwcG9ydCBpZGVudGl0eSBmdW5jdGlvbnNgKSksZi5jb25jYXQocih7a2V5OmUua2V5LHZhbHVlOm8sdmFsdWVTcGVjOnUsc3R5bGU6aSxzdHlsZVNwZWM6YSxleHByZXNzaW9uQ29udGV4dDpgcHJvcGVydHlgLHByb3BlcnR5VHlwZTp0LHByb3BlcnR5S2V5OnN9KSl9ZnVuY3Rpb24gRXMoZSl7cmV0dXJuIFRzKGUsYHBhaW50YCl9ZnVuY3Rpb24gRHMoZSl7cmV0dXJuIFRzKGUsYGxheW91dGApfWZ1bmN0aW9uIE9zKGUpe2xldCB0PVtdLG49ZS52YWx1ZSxyPWUua2V5LGk9ZS5zdHlsZSxhPWUuc3R5bGVTcGVjO2lmKFYobikhPT1gb2JqZWN0YClyZXR1cm5bbmV3IE4ocixuLGBvYmplY3QgZXhwZWN0ZWQsICR7VihuKX0gZm91bmRgKV07IW4udHlwZSYmIW4ucmVmJiZ0LnB1c2gobmV3IE4ocixuLGBlaXRoZXIgInR5cGUiIG9yICJyZWYiIGlzIHJlcXVpcmVkYCkpO2xldCBvPWRzKG4udHlwZSkscz1kcyhuLnJlZik7aWYobi5pZCl7bGV0IGE9ZHMobi5pZCk7Zm9yKGxldCBvPTA7bzxlLmFycmF5SW5kZXg7bysrKXtsZXQgZT1pLmxheWVyc1tvXTtkcyhlLmlkKT09PWEmJnQucHVzaChuZXcgTihyLG4uaWQsYGR1cGxpY2F0ZSBsYXllciBpZCAiJHtuLmlkfSIsIHByZXZpb3VzbHkgdXNlZCBhdCBsaW5lICR7ZS5pZC5fX2xpbmVfX31gKSl9fWlmKGByZWZgaW4gbil7W2B0eXBlYCxgc291cmNlYCxgc291cmNlLWxheWVyYCxgZmlsdGVyYCxgbGF5b3V0YF0uZm9yRWFjaChlPT57ZSBpbiBuJiZ0LnB1c2gobmV3IE4ocixuW2VdLGAiJHtlfSIgaXMgcHJvaGliaXRlZCBmb3IgcmVmIGxheWVyc2ApKX0pO2xldCBlO2kubGF5ZXJzLmZvckVhY2godD0+e2RzKHQuaWQpPT09cyYmKGU9dCl9KSxlP2UucmVmP3QucHVzaChuZXcgTihyLG4ucmVmLGByZWYgY2Fubm90IHJlZmVyZW5jZSBhbm90aGVyIHJlZiBsYXllcmApKTpvPWRzKGUudHlwZSk6dC5wdXNoKG5ldyBOKHIsbi5yZWYsYHJlZiBsYXllciAiJHtzfSIgbm90IGZvdW5kYCkpfWVsc2UgaWYobyE9PWBiYWNrZ3JvdW5kYCl7aWYoIW4uc291cmNlKXQucHVzaChuZXcgTihyLG4sYG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgInNvdXJjZSJgKSk7ZWxzZXtsZXQgZT1pLnNvdXJjZXMmJmkuc291cmNlc1tuLnNvdXJjZV0sYT1lJiZkcyhlLnR5cGUpO2U/YT09PWB2ZWN0b3JgJiZvPT09YHJhc3RlcmA/dC5wdXNoKG5ldyBOKHIsbi5zb3VyY2UsYGxheWVyICIke24uaWR9IiByZXF1aXJlcyBhIHJhc3RlciBzb3VyY2VgKSk6YSE9PWByYXN0ZXItZGVtYCYmbz09PWBoaWxsc2hhZGVgfHxhIT09YHJhc3Rlci1kZW1gJiZvPT09YGNvbG9yLXJlbGllZmA/dC5wdXNoKG5ldyBOKHIsbi5zb3VyY2UsYGxheWVyICIke24uaWR9IiByZXF1aXJlcyBhIHJhc3Rlci1kZW0gc291cmNlYCkpOmE9PT1gcmFzdGVyYCYmbyE9PWByYXN0ZXJgP3QucHVzaChuZXcgTihyLG4uc291cmNlLGBsYXllciAiJHtuLmlkfSIgcmVxdWlyZXMgYSB2ZWN0b3Igc291cmNlYCkpOmE9PT1gdmVjdG9yYCYmIW5bYHNvdXJjZS1sYXllcmBdP3QucHVzaChuZXcgTihyLG4sYGxheWVyICIke24uaWR9IiBtdXN0IHNwZWNpZnkgYSAic291cmNlLWxheWVyImApKTphPT09YHJhc3Rlci1kZW1gJiZvIT09YGhpbGxzaGFkZWAmJm8hPT1gY29sb3ItcmVsaWVmYD90LnB1c2gobmV3IE4ocixuLnNvdXJjZSxgcmFzdGVyLWRlbSBzb3VyY2UgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGxheWVyIHR5cGUgJ2hpbGxzaGFkZScgb3IgJ2NvbG9yLXJlbGllZicuYCkpOm89PT1gbGluZWAmJm4ucGFpbnQmJm4ucGFpbnRbYGxpbmUtZ3JhZGllbnRgXSYmKGEhPT1gZ2VvanNvbmB8fCFlLmxpbmVNZXRyaWNzKSYmdC5wdXNoKG5ldyBOKHIsbixgbGF5ZXIgIiR7bi5pZH0iIHNwZWNpZmllcyBhIGxpbmUtZ3JhZGllbnQsIHdoaWNoIHJlcXVpcmVzIGEgR2VvSlNPTiBzb3VyY2Ugd2l0aCBcYGxpbmVNZXRyaWNzXGAgZW5hYmxlZC5gKSk6dC5wdXNoKG5ldyBOKHIsbi5zb3VyY2UsYHNvdXJjZSAiJHtuLnNvdXJjZX0iIG5vdCBmb3VuZGApKX19cmV0dXJuIG89PT1gcmFzdGVyYCYmbi5wYWludD8ucmVzYW1wbGluZyYmbi5wYWludD8uW2ByYXN0ZXItcmVzYW1wbGluZ2BdJiZ0LnB1c2gobmV3IE4ocixuLnBhaW50LGBsYXllciAiJHtuLmlkfSIgcmVkdW5kYW50bHkgc3BlY2lmaWVzICJyZXNhbXBsaW5nIiBhbmQgInJhc3Rlci1yZXNhbXBsaW5nIiBwYWludCBwcm9wZXJ0aWVzLCBidXQgb25seSBvbmUgaXMgYWxsb3dlZC4gSXQgaXMgYWR2aXNlZCB0byB1c2UgInJlc2FtcGxpbmciLmApKSx0PXQuY29uY2F0KHBzKHtrZXk6cix2YWx1ZTpuLHZhbHVlU3BlYzphLmxheWVyLHN0eWxlOmUuc3R5bGUsc3R5bGVTcGVjOmUuc3R5bGVTcGVjLHZhbGlkYXRlU3BlYzplLnZhbGlkYXRlU3BlYyxvYmplY3RFbGVtZW50VmFsaWRhdG9yczp7IioiKCl7cmV0dXJuW119LHR5cGUoKXtyZXR1cm4gZS52YWxpZGF0ZVNwZWMoe2tleTpgJHtyfS50eXBlYCx2YWx1ZTpuLnR5cGUsdmFsdWVTcGVjOmEubGF5ZXIudHlwZSxzdHlsZTplLnN0eWxlLHN0eWxlU3BlYzplLnN0eWxlU3BlYyx2YWxpZGF0ZVNwZWM6ZS52YWxpZGF0ZVNwZWMsb2JqZWN0Om4sb2JqZWN0S2V5OmB0eXBlYH0pfSxmaWx0ZXI6Q3MsbGF5b3V0KGUpe3JldHVybiBwcyh7bGF5ZXI6bixrZXk6ZS5rZXksdmFsdWU6ZS52YWx1ZSxzdHlsZTplLnN0eWxlLHN0eWxlU3BlYzplLnN0eWxlU3BlYyx2YWxpZGF0ZVNwZWM6ZS52YWxpZGF0ZVNwZWMsb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6eyIqIihlKXtyZXR1cm4gRHMoaG8oe2xheWVyVHlwZTpvfSxlKSl9fX0pfSxwYWludChlKXtyZXR1cm4gcHMoe2xheWVyOm4sa2V5OmUua2V5LHZhbHVlOmUudmFsdWUsc3R5bGU6ZS5zdHlsZSxzdHlsZVNwZWM6ZS5zdHlsZVNwZWMsdmFsaWRhdGVTcGVjOmUudmFsaWRhdGVTcGVjLG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOnsiKiIoZSl7cmV0dXJuIEVzKGhvKHtsYXllclR5cGU6b30sZSkpfX19KX19fSkpLHR9ZnVuY3Rpb24ga3MoZSl7bGV0IHQ9ZS52YWx1ZSxuPWUua2V5LHI9Vih0KTtyZXR1cm4gcj09PWBzdHJpbmdgP1tdOltuZXcgTihuLHQsYHN0cmluZyBleHBlY3RlZCwgJHtyfSBmb3VuZGApXX1mdW5jdGlvbiBBcyhlKXtsZXQgdD1lLnNvdXJjZU5hbWU/P2BgLG49ZS52YWx1ZSxyPWUuc3R5bGVTcGVjLGk9ci5zb3VyY2VfcmFzdGVyX2RlbSxhPWUuc3R5bGUsbz1bXSxzPVYobik7aWYobj09PXZvaWQgMClyZXR1cm4gbztpZihzIT09YG9iamVjdGApcmV0dXJuIG8ucHVzaChuZXcgTihgc291cmNlX3Jhc3Rlcl9kZW1gLG4sYG9iamVjdCBleHBlY3RlZCwgJHtzfSBmb3VuZGApKSxvO2xldCBjPWRzKG4uZW5jb2RpbmcpPT09YGN1c3RvbWAsbD1bYHJlZEZhY3RvcmAsYGdyZWVuRmFjdG9yYCxgYmx1ZUZhY3RvcmAsYGJhc2VTaGlmdGBdLHU9ZS52YWx1ZS5lbmNvZGluZz9gIiR7ZS52YWx1ZS5lbmNvZGluZ30iYDpgRGVmYXVsdGA7Zm9yKGxldCBzIGluIG4pIWMmJmwuaW5jbHVkZXMocyk/by5wdXNoKG5ldyBOKHMsbltzXSxgSW4gIiR7dH0iOiAiJHtzfSIgaXMgb25seSB2YWxpZCB3aGVuICJlbmNvZGluZyIgaXMgc2V0IHRvICJjdXN0b20iLiAke3V9IGVuY29kaW5nIGZvdW5kYCkpOmlbc10/bz1vLmNvbmNhdChlLnZhbGlkYXRlU3BlYyh7a2V5OnMsdmFsdWU6bltzXSx2YWx1ZVNwZWM6aVtzXSx2YWxpZGF0ZVNwZWM6ZS52YWxpZGF0ZVNwZWMsc3R5bGU6YSxzdHlsZVNwZWM6cn0pKTpvLnB1c2gobmV3IE4ocyxuW3NdLGB1bmtub3duIHByb3BlcnR5ICIke3N9ImApKTtyZXR1cm4gb31jb25zdCBqcz17cHJvbW90ZUlkOk5zfTtmdW5jdGlvbiBNcyhlKXtsZXQgdD1lLnZhbHVlLG49ZS5rZXkscj1lLnN0eWxlU3BlYyxpPWUuc3R5bGUsYT1lLnZhbGlkYXRlU3BlYztpZighdC50eXBlKXJldHVybltuZXcgTihuLHQsYCJ0eXBlIiBpcyByZXF1aXJlZGApXTtsZXQgbz1kcyh0LnR5cGUpLHM7c3dpdGNoKG8pe2Nhc2VgdmVjdG9yYDpjYXNlYHJhc3RlcmA6cmV0dXJuIHM9cHMoe2tleTpuLHZhbHVlOnQsdmFsdWVTcGVjOnJbYHNvdXJjZV8ke28ucmVwbGFjZShgLWAsYF9gKX1gXSxzdHlsZTplLnN0eWxlLHN0eWxlU3BlYzpyLG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOmpzLHZhbGlkYXRlU3BlYzphfSkscztjYXNlYHJhc3Rlci1kZW1gOnJldHVybiBzPUFzKHtzb3VyY2VOYW1lOm4sdmFsdWU6dCxzdHlsZTplLnN0eWxlLHN0eWxlU3BlYzpyLHZhbGlkYXRlU3BlYzphfSkscztjYXNlYGdlb2pzb25gOmlmKHM9cHMoe2tleTpuLHZhbHVlOnQsdmFsdWVTcGVjOnIuc291cmNlX2dlb2pzb24sc3R5bGU6aSxzdHlsZVNwZWM6cix2YWxpZGF0ZVNwZWM6YSxvYmplY3RFbGVtZW50VmFsaWRhdG9yczpqc30pLHQuY2x1c3Rlcilmb3IobGV0IGUgaW4gdC5jbHVzdGVyUHJvcGVydGllcyl7bGV0W3IsaV09dC5jbHVzdGVyUHJvcGVydGllc1tlXSxvPXR5cGVvZiByPT1gc3RyaW5nYD9bcixbYGFjY3VtdWxhdGVkYF0sW2BnZXRgLGVdXTpyO3MucHVzaCguLi5fcyh7a2V5OmAke259LiR7ZX0ubWFwYCx2YWx1ZTppLHZhbGlkYXRlU3BlYzphLGV4cHJlc3Npb25Db250ZXh0OmBjbHVzdGVyLW1hcGB9KSkscy5wdXNoKC4uLl9zKHtrZXk6YCR7bn0uJHtlfS5yZWR1Y2VgLHZhbHVlOm8sdmFsaWRhdGVTcGVjOmEsZXhwcmVzc2lvbkNvbnRleHQ6YGNsdXN0ZXItcmVkdWNlYH0pKX1yZXR1cm4gcztjYXNlYHZpZGVvYDpyZXR1cm4gcHMoe2tleTpuLHZhbHVlOnQsdmFsdWVTcGVjOnIuc291cmNlX3ZpZGVvLHN0eWxlOmksdmFsaWRhdGVTcGVjOmEsc3R5bGVTcGVjOnJ9KTtjYXNlYGltYWdlYDpyZXR1cm4gcHMoe2tleTpuLHZhbHVlOnQsdmFsdWVTcGVjOnIuc291cmNlX2ltYWdlLHN0eWxlOmksdmFsaWRhdGVTcGVjOmEsc3R5bGVTcGVjOnJ9KTtjYXNlYGNhbnZhc2A6cmV0dXJuW25ldyBOKG4sbnVsbCxgUGxlYXNlIHVzZSBydW50aW1lIEFQSXMgdG8gYWRkIGNhbnZhcyBzb3VyY2VzLCByYXRoZXIgdGhhbiBpbmNsdWRpbmcgdGhlbSBpbiBzdHlsZXNoZWV0cy5gLGBzb3VyY2UuY2FudmFzYCldO2RlZmF1bHQ6cmV0dXJuIGJzKHtrZXk6YCR7bn0udHlwZWAsdmFsdWU6dC50eXBlLHZhbHVlU3BlYzp7dmFsdWVzOltgdmVjdG9yYCxgcmFzdGVyYCxgcmFzdGVyLWRlbWAsYGdlb2pzb25gLGB2aWRlb2AsYGltYWdlYF19LHN0eWxlOmksdmFsaWRhdGVTcGVjOmEsc3R5bGVTcGVjOnJ9KX19ZnVuY3Rpb24gTnMoe2tleTplLHZhbHVlOnR9KXtpZihWKHQpPT09YHN0cmluZ2ApcmV0dXJuIGtzKHtrZXk6ZSx2YWx1ZTp0fSk7e2xldCBuPVtdO2ZvcihsZXQgciBpbiB0KW4ucHVzaCguLi5rcyh7a2V5OmAke2V9LiR7cn1gLHZhbHVlOnRbcl19KSk7cmV0dXJuIG59fWZ1bmN0aW9uIFBzKGUpe2xldCB0PWUudmFsdWUsbj1lLnN0eWxlU3BlYyxyPW4ubGlnaHQsaT1lLnN0eWxlLGE9W10sbz1WKHQpO2lmKHQ9PT12b2lkIDApcmV0dXJuIGE7aWYobyE9PWBvYmplY3RgKXJldHVybiBhPWEuY29uY2F0KFtuZXcgTihgbGlnaHRgLHQsYG9iamVjdCBleHBlY3RlZCwgJHtvfSBmb3VuZGApXSksYTtmb3IobGV0IG8gaW4gdCl7bGV0IHM9by5tYXRjaCgvXiguKiktdHJhbnNpdGlvbiQvKTthPXMmJnJbc1sxXV0mJnJbc1sxXV0udHJhbnNpdGlvbj9hLmNvbmNhdChlLnZhbGlkYXRlU3BlYyh7a2V5Om8sdmFsdWU6dFtvXSx2YWx1ZVNwZWM6bi50cmFuc2l0aW9uLHZhbGlkYXRlU3BlYzplLnZhbGlkYXRlU3BlYyxzdHlsZTppLHN0eWxlU3BlYzpufSkpOnJbb10/YS5jb25jYXQoZS52YWxpZGF0ZVNwZWMoe2tleTpvLHZhbHVlOnRbb10sdmFsdWVTcGVjOnJbb10sdmFsaWRhdGVTcGVjOmUudmFsaWRhdGVTcGVjLHN0eWxlOmksc3R5bGVTcGVjOm59KSk6YS5jb25jYXQoW25ldyBOKG8sdFtvXSxgdW5rbm93biBwcm9wZXJ0eSAiJHtvfSJgKV0pfXJldHVybiBhfWZ1bmN0aW9uIEZzKGUpe2xldCB0PWUudmFsdWUsbj1lLnN0eWxlU3BlYyxyPW4uc2t5LGk9ZS5zdHlsZSxhPVYodCk7aWYodD09PXZvaWQgMClyZXR1cm5bXTtpZihhIT09YG9iamVjdGApcmV0dXJuW25ldyBOKGBza3lgLHQsYG9iamVjdCBleHBlY3RlZCwgJHthfSBmb3VuZGApXTtsZXQgbz1bXTtmb3IobGV0IGEgaW4gdClvPXJbYV0/by5jb25jYXQoZS52YWxpZGF0ZVNwZWMoe2tleTphLHZhbHVlOnRbYV0sdmFsdWVTcGVjOnJbYV0sc3R5bGU6aSxzdHlsZVNwZWM6bn0pKTpvLmNvbmNhdChbbmV3IE4oYSx0W2FdLGB1bmtub3duIHByb3BlcnR5ICIke2F9ImApXSk7cmV0dXJuIG99ZnVuY3Rpb24gSXMoZSl7bGV0IHQ9ZS52YWx1ZSxuPWUuc3R5bGVTcGVjLHI9bi50ZXJyYWluLGk9ZS5zdHlsZSxhPVtdLG89Vih0KTtpZih0PT09dm9pZCAwKXJldHVybiBhO2lmKG8hPT1gb2JqZWN0YClyZXR1cm4gYT1hLmNvbmNhdChbbmV3IE4oYHRlcnJhaW5gLHQsYG9iamVjdCBleHBlY3RlZCwgJHtvfSBmb3VuZGApXSksYTtmb3IobGV0IG8gaW4gdClhPXJbb10/YS5jb25jYXQoZS52YWxpZGF0ZVNwZWMoe2tleTpvLHZhbHVlOnRbb10sdmFsdWVTcGVjOnJbb10sdmFsaWRhdGVTcGVjOmUudmFsaWRhdGVTcGVjLHN0eWxlOmksc3R5bGVTcGVjOm59KSk6YS5jb25jYXQoW25ldyBOKG8sdFtvXSxgdW5rbm93biBwcm9wZXJ0eSAiJHtvfSJgKV0pO3JldHVybiBhfWZ1bmN0aW9uIExzKGUpe3JldHVybiBrcyhlKS5sZW5ndGg9PT0wP1tdOl9zKGUpfWZ1bmN0aW9uIFJzKGUpe3JldHVybiBrcyhlKS5sZW5ndGg9PT0wP1tdOl9zKGUpfWZ1bmN0aW9uIHpzKGUpe2xldCB0PWUua2V5LG49ZS52YWx1ZTtpZihWKG4pPT09YGFycmF5YCl7aWYobi5sZW5ndGg8MXx8bi5sZW5ndGg+NClyZXR1cm5bbmV3IE4odCxuLGBwYWRkaW5nIHJlcXVpcmVzIDEgdG8gNCB2YWx1ZXM7ICR7bi5sZW5ndGh9IHZhbHVlcyBmb3VuZGApXTtsZXQgcj17dHlwZTpgbnVtYmVyYH0saT1bXTtmb3IobGV0IGE9MDthPG4ubGVuZ3RoO2ErKylpPWkuY29uY2F0KGUudmFsaWRhdGVTcGVjKHtrZXk6YCR7dH1bJHthfV1gLHZhbHVlOm5bYV0sdmFsaWRhdGVTcGVjOmUudmFsaWRhdGVTcGVjLHZhbHVlU3BlYzpyfSkpO3JldHVybiBpfXJldHVybiBocyh7a2V5OnQsdmFsdWU6bix2YWx1ZVNwZWM6e319KX1mdW5jdGlvbiBCcyhlKXtsZXQgdD1lLmtleSxuPWUudmFsdWU7aWYoVihuKT09PWBhcnJheWApe2xldCByPXt0eXBlOmBudW1iZXJgfTtpZihuLmxlbmd0aDwxKXJldHVybltuZXcgTih0LG4sYGFycmF5IGxlbmd0aCBhdCBsZWFzdCAxIGV4cGVjdGVkLCBsZW5ndGggMCBmb3VuZGApXTtsZXQgaT1bXTtmb3IobGV0IGE9MDthPG4ubGVuZ3RoO2ErKylpPWkuY29uY2F0KGUudmFsaWRhdGVTcGVjKHtrZXk6YCR7dH1bJHthfV1gLHZhbHVlOm5bYV0sdmFsaWRhdGVTcGVjOmUudmFsaWRhdGVTcGVjLHZhbHVlU3BlYzpyfSkpO3JldHVybiBpfXJldHVybiBocyh7a2V5OnQsdmFsdWU6bix2YWx1ZVNwZWM6e319KX1mdW5jdGlvbiBWcyhlKXtsZXQgdD1lLmtleSxuPWUudmFsdWU7aWYoVihuKT09PWBhcnJheWApe2lmKG4ubGVuZ3RoPDEpcmV0dXJuW25ldyBOKHQsbixgYXJyYXkgbGVuZ3RoIGF0IGxlYXN0IDEgZXhwZWN0ZWQsIGxlbmd0aCAwIGZvdW5kYCldO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKWU9ZS5jb25jYXQoeXMoe2tleTpgJHt0fVske3J9XWAsdmFsdWU6bltyXSx2YWx1ZVNwZWM6e319KSk7cmV0dXJuIGV9cmV0dXJuIHlzKHtrZXk6dCx2YWx1ZTpuLHZhbHVlU3BlYzp7fX0pfWZ1bmN0aW9uIEhzKGUpe2xldCB0PWUua2V5LG49ZS52YWx1ZSxyPVYobiksaT1lLnN0eWxlU3BlYztpZihyIT09YGFycmF5YHx8bi5sZW5ndGg8MXx8bi5sZW5ndGglMiE9MClyZXR1cm5bbmV3IE4odCxuLGB2YXJpYWJsZUFuY2hvck9mZnNldENvbGxlY3Rpb24gcmVxdWlyZXMgYSBub24tZW1wdHkgYXJyYXkgb2YgZXZlbiBsZW5ndGhgKV07bGV0IGE9W107Zm9yKGxldCByPTA7cjxuLmxlbmd0aDtyKz0yKWE9YS5jb25jYXQoYnMoe2tleTpgJHt0fVske3J9XWAsdmFsdWU6bltyXSx2YWx1ZVNwZWM6aS5sYXlvdXRfc3ltYm9sW2B0ZXh0LWFuY2hvcmBdfSkpLGE9YS5jb25jYXQobXMoe2tleTpgJHt0fVske3IrMX1dYCx2YWx1ZTpuW3IrMV0sdmFsdWVTcGVjOntsZW5ndGg6Mix2YWx1ZTpgbnVtYmVyYH0sdmFsaWRhdGVTcGVjOmUudmFsaWRhdGVTcGVjLHN0eWxlOmUuc3R5bGUsc3R5bGVTcGVjOml9KSk7cmV0dXJuIGF9ZnVuY3Rpb24gVXMoZSl7bGV0IHQ9W10sbj1lLnZhbHVlLHI9ZS5rZXk7aWYoQXJyYXkuaXNBcnJheShuKSl7bGV0IGk9W10sYT1bXTtmb3IobGV0IG8gaW4gbiluW29dLmlkJiZpLmluY2x1ZGVzKG5bb10uaWQpJiZ0LnB1c2gobmV3IE4ocixuLGBhbGwgdGhlIHNwcml0ZXMnIGlkcyBtdXN0IGJlIHVuaXF1ZSwgYnV0ICR7bltvXS5pZH0gaXMgZHVwbGljYXRlZGApKSxpLnB1c2gobltvXS5pZCksbltvXS51cmwmJmEuaW5jbHVkZXMobltvXS51cmwpJiZ0LnB1c2gobmV3IE4ocixuLGBhbGwgdGhlIHNwcml0ZXMnIFVSTHMgbXVzdCBiZSB1bmlxdWUsIGJ1dCAke25bb10udXJsfSBpcyBkdXBsaWNhdGVkYCkpLGEucHVzaChuW29dLnVybCksdD10LmNvbmNhdChwcyh7a2V5OmAke3J9WyR7b31dYCx2YWx1ZTpuW29dLHZhbHVlU3BlYzp7aWQ6e3R5cGU6YHN0cmluZ2AscmVxdWlyZWQ6ITB9LHVybDp7dHlwZTpgc3RyaW5nYCxyZXF1aXJlZDohMH19LHZhbGlkYXRlU3BlYzplLnZhbGlkYXRlU3BlY30pKTtyZXR1cm4gdH1yZXR1cm4ga3Moe2tleTpyLHZhbHVlOm59KX1mdW5jdGlvbiBXcyhlKXtsZXQgdD1lLnZhbHVlLG49ZS5zdHlsZVNwZWMscj1uLnByb2plY3Rpb24saT1lLnN0eWxlLGE9Vih0KTtpZih0PT09dm9pZCAwKXJldHVybltdO2lmKGEhPT1gb2JqZWN0YClyZXR1cm5bbmV3IE4oYHByb2plY3Rpb25gLHQsYG9iamVjdCBleHBlY3RlZCwgJHthfSBmb3VuZGApXTtsZXQgbz1bXTtmb3IobGV0IGEgaW4gdClvPXJbYV0/by5jb25jYXQoZS52YWxpZGF0ZVNwZWMoe2tleTphLHZhbHVlOnRbYV0sdmFsdWVTcGVjOnJbYV0sc3R5bGU6aSxzdHlsZVNwZWM6bn0pKTpvLmNvbmNhdChbbmV3IE4oYSx0W2FdLGB1bmtub3duIHByb3BlcnR5ICIke2F9ImApXSk7cmV0dXJuIG99ZnVuY3Rpb24gR3MoZSl7bGV0IHQ9ZS5rZXksbj1lLnZhbHVlO249biBpbnN0YW5jZW9mIFN0cmluZz9uLnZhbHVlT2YoKTpuO2xldCByPVYobik7cmV0dXJuIHI9PT1gYXJyYXlgJiYhcXMobikmJiFLcyhuKT9bbmV3IE4odCxuLGBwcm9qZWN0aW9uIGV4cGVjdGVkLCBpbnZhbGlkIGFycmF5ICR7SlNPTi5zdHJpbmdpZnkobil9IGZvdW5kYCldOltgYXJyYXlgLGBzdHJpbmdgXS5pbmNsdWRlcyhyKT9bXTpbbmV3IE4odCxuLGBwcm9qZWN0aW9uIGV4cGVjdGVkLCBpbnZhbGlkIHR5cGUgIiR7cn0iIGZvdW5kYCldfWZ1bmN0aW9uIEtzKGUpe3JldHVybiEhW2BpbnRlcnBvbGF0ZWAsYHN0ZXBgLGBsaXRlcmFsYF0uaW5jbHVkZXMoZVswXSl9ZnVuY3Rpb24gcXMoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MyYmdHlwZW9mIGVbMF09PWBzdHJpbmdgJiZ0eXBlb2YgZVsxXT09YHN0cmluZ2AmJnR5cGVvZiBlWzJdPT1gbnVtYmVyYH1mdW5jdGlvbiBKcyhlKXtyZXR1cm4hIWUmJmUuY29uc3RydWN0b3I9PT1PYmplY3R9ZnVuY3Rpb24gWXMoZSl7cmV0dXJuIEpzKGUudmFsdWUpP1tdOltuZXcgTihlLmtleSxlLnZhbHVlLGBvYmplY3QgZXhwZWN0ZWQsICR7VihlLnZhbHVlKX0gZm91bmRgKV19Y29uc3QgWHM9MTExNDExMSxacz0vXnVcKyg/OihbMC05YS1mXXsxLDZ9KSg/Oi0oWzAtOWEtZl17MSw2fSkpP3woWzAtOWEtZl17MCw1fVw/ezEsNn0pKSQvaTtmdW5jdGlvbiBRcyhlLHQpe2lmKFYodCkhPT1gc3RyaW5nYClyZXR1cm5bXTtsZXQgbj1gJHt0fWAscj0oKT0+W25ldyBOKGUsdCxgaW52YWxpZCB1bmljb2RlIHJhbmdlLCBleHBlY3RlZCBhIHZhbHVlIHN1Y2ggYXMgIlUrMjYiLCAiVSswLTEwRkZGRiIgb3IgIlUrND8/ImApXSxpPW4ubWF0Y2goWnMpO2lmKCFpKXJldHVybiByKCk7bGV0WyxhLG8sc109aTtpZihzIT09dm9pZCAwKXJldHVybiBzLmxlbmd0aD42P3IoKTpbXTtsZXQgYz1wYXJzZUludChhLDE2KSxsPW89PT12b2lkIDA/YzpwYXJzZUludChvLDE2KTtyZXR1cm4gYz5Yc3x8bD5Ycz9bbmV3IE4oZSx0LGB1bmljb2RlIHJhbmdlIGlzIG91dCBvZiBib3VuZHMsIHRoZSBtYXhpbXVtIGNvZGUgcG9pbnQgaXMgVSsxMEZGRkZgKV06Yz5sP1tuZXcgTihlLHQsYHVuaWNvZGUgcmFuZ2Ugc3RhcnQgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIGl0cyBlbmQsIGJ1dCAke259IGlzYCldOltdfWZ1bmN0aW9uICRzKGUpe2xldCB0PWUua2V5Pz9gZm9udC1mYWNlc2Asbj1lLnZhbHVlLHI9ZS52YWxpZGF0ZVNwZWMsaT1lLnN0eWxlU3BlYz8/Um4sYT1lLnN0eWxlO2lmKCFKcyhuKSlyZXR1cm5bbmV3IE4odCxuLGBvYmplY3QgZXhwZWN0ZWQsICR7VihuKX0gZm91bmRgKV07bGV0IG89W107Zm9yKGxldCBlIGluIG4pe2xldCBzPW5bZV0sYz1WKHMpO2lmKGM9PT1gc3RyaW5nYClvLnB1c2goLi4ua3Moe2tleTpgJHt0fS4ke2V9YCx2YWx1ZTpzfSkpO2Vsc2UgaWYoYz09PWBhcnJheWApe2xldCBuPXt1cmw6e3R5cGU6YHN0cmluZ2AscmVxdWlyZWQ6ITB9LCJ1bmljb2RlLXJhbmdlIjp7dHlwZTpgYXJyYXlgLHZhbHVlOmBzdHJpbmdgfX07Zm9yKGxldFtjLGxdb2Ygcy5lbnRyaWVzKCkpe2xldCBzPWAke3R9LiR7ZX1bJHtjfV1gO28ucHVzaCguLi5wcyh7a2V5OnMsdmFsdWU6bCx2YWx1ZVNwZWM6bixzdHlsZVNwZWM6aSxzdHlsZTphLHZhbGlkYXRlU3BlYzpyfSkpO2xldCB1PUpzKGwpP2xbYHVuaWNvZGUtcmFuZ2VgXTp2b2lkIDA7aWYoVih1KT09PWBhcnJheWApZm9yKGxldFtlLHRdb2YgdS5lbnRyaWVzKCkpby5wdXNoKC4uLlFzKGAke3N9LnVuaWNvZGUtcmFuZ2VbJHtlfV1gLHQpKX19ZWxzZSBvLnB1c2gobmV3IE4oYCR7dH0uJHtlfWAscyxgc3RyaW5nIG9yIGFycmF5IGV4cGVjdGVkLCAke2N9IGZvdW5kYCkpfXJldHVybiBvfWNvbnN0IGVjPXsiKiIoKXtyZXR1cm5bXX0sYXJyYXk6bXMsYm9vbGVhbjp2cyxudW1iZXI6aHMsY29sb3I6eXMsY29uc3RhbnRzOnVzLGVudW06YnMsZmlsdGVyOkNzLGZ1bmN0aW9uOmdzLGxheWVyOk9zLG9iamVjdDpwcyxzb3VyY2U6TXMsbGlnaHQ6UHMsc2t5OkZzLHRlcnJhaW46SXMscHJvamVjdGlvbjpXcyxwcm9qZWN0aW9uRGVmaW5pdGlvbjpHcyxzdHJpbmc6a3MsZm9ybWF0dGVkOkxzLHJlc29sdmVkSW1hZ2U6UnMscGFkZGluZzp6cyxudW1iZXJBcnJheTpCcyxjb2xvckFycmF5OlZzLHZhcmlhYmxlQW5jaG9yT2Zmc2V0Q29sbGVjdGlvbjpIcyxzcHJpdGU6VXMsc3RhdGU6WXMsZm9udEZhY2VzOiRzfTtmdW5jdGlvbiB0YyhlKXtsZXQgdD1lLnZhbHVlLG49ZS52YWx1ZVNwZWMscj1lLnN0eWxlU3BlYztyZXR1cm4gZS52YWxpZGF0ZVNwZWM9dGMsbi5leHByZXNzaW9uJiZnbyhkcyh0KSk/Z3MoZSk6bi5leHByZXNzaW9uJiZNbyhmcyh0KSk/X3MoZSk6bi50eXBlJiZlY1tuLnR5cGVdP2VjW24udHlwZV0oZSk6cHMoaG8oe30sZSx7dmFsdWVTcGVjOm4udHlwZT9yW24udHlwZV06bn0pKX1mdW5jdGlvbiBuYyhlKXtsZXQgdD1lLnZhbHVlLG49ZS5rZXkscj1rcyhlKTtyZXR1cm4gci5sZW5ndGg/cjoodC5pbmRleE9mKGB7Zm9udHN0YWNrfWApPT09LTEmJnIucHVzaChuZXcgTihuLHQsYCJnbHlwaHMiIHVybCBtdXN0IGluY2x1ZGUgYSAie2ZvbnRzdGFja30iIHRva2VuYCkpLHQuaW5kZXhPZihge3JhbmdlfWApPT09LTEmJnIucHVzaChuZXcgTihuLHQsYCJnbHlwaHMiIHVybCBtdXN0IGluY2x1ZGUgYSAie3JhbmdlfSIgdG9rZW5gKSkscil9ZnVuY3Rpb24gcmMoZSx0PU0pe2xldCBuPVtdO3JldHVybiBuPW4uY29uY2F0KHRjKHtrZXk6YGAsdmFsdWU6ZSx2YWx1ZVNwZWM6dC4kcm9vdCxzdHlsZVNwZWM6dCxzdHlsZTplLHZhbGlkYXRlU3BlYzp0YyxvYmplY3RFbGVtZW50VmFsaWRhdG9yczp7Z2x5cGhzOm5jLCIqIigpe3JldHVybltdfX19KSksZS5jb25zdGFudHMmJihuPW4uY29uY2F0KHVzKHtrZXk6YGNvbnN0YW50c2AsdmFsdWU6ZS5jb25zdGFudHMsc3R5bGU6ZSxzdHlsZVNwZWM6dCx2YWxpZGF0ZVNwZWM6dGN9KSkpLGFjKG4pfXJjLnNvdXJjZT1vYyhpYyhNcykpLHJjLnNwcml0ZT1vYyhpYyhVcykpLHJjLmdseXBocz1vYyhpYyhuYykpLHJjLmZvbnRGYWNlcz1vYyhpYygkcykpLHJjLmxpZ2h0PW9jKGljKFBzKSkscmMuc2t5PW9jKGljKEZzKSkscmMudGVycmFpbj1vYyhpYyhJcykpLHJjLnN0YXRlPW9jKGljKFlzKSkscmMubGF5ZXI9b2MoaWMoT3MpKSxyYy5maWx0ZXI9b2MoaWMoQ3MpKSxyYy5wYWludFByb3BlcnR5PW9jKGljKEVzKSkscmMubGF5b3V0UHJvcGVydHk9b2MoaWMoRHMpKTtmdW5jdGlvbiBpYyhlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUoT2JqZWN0LmFzc2lnbih7fSx0LHt2YWxpZGF0ZVNwZWM6dGN9KSl9fWZ1bmN0aW9uIGFjKGUpe3JldHVybltdLmNvbmNhdChlKS5zb3J0KChlLHQpPT5lLmxpbmUtdC5saW5lKX1mdW5jdGlvbiBvYyhlKXtyZXR1cm4gZnVuY3Rpb24oLi4udCl7cmV0dXJuIGFjKGUuYXBwbHkodGhpcyx0KSl9fWNvbnN0IHNjPXt0eXBlOmBlbnVtYCwicHJvcGVydHktdHlwZSI6YGRhdGEtY29uc3RhbnRgLGV4cHJlc3Npb246e2ludGVycG9sYXRlZDohMSxwYXJhbWV0ZXJzOltgZ2xvYmFsLXN0YXRlYF19LHZhbHVlczp7dmlzaWJsZTp7fSxub25lOnt9fSx0cmFuc2l0aW9uOiExLGRlZmF1bHQ6YHZpc2libGVgfTt2YXIgY2M9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuX3Jvb3RLZXk9dCx0aGlzLl9nbG9iYWxTdGF0ZT1uLHRoaXMuc2V0VmFsdWUoZSl9ZXZhbHVhdGUoKXtyZXR1cm4gdGhpcy5fbGl0ZXJhbFZhbHVlPz90aGlzLl9jb21waWxlZFZhbHVlLmV2YWx1YXRlKHt9KX1zZXRWYWx1ZShlKXtpZihlPT1udWxsfHxlPT09YHZpc2libGVgfHxlPT09YG5vbmVgKXt0aGlzLl9saXRlcmFsVmFsdWU9ZT09PWBub25lYD9gbm9uZWA6YHZpc2libGVgLHRoaXMuX2NvbXBpbGVkVmFsdWU9dm9pZCAwLHRoaXMuX2dsb2JhbFN0YXRlUmVmcz1uZXcgU2V0O3JldHVybn1sZXQgdD1ObyhlLHRoaXMuX3Jvb3RLZXksc2MsdGhpcy5fZ2xvYmFsU3RhdGUpO2lmKHQucmVzdWx0PT09YGVycm9yYCl0aHJvdyB0aGlzLl9saXRlcmFsVmFsdWU9YHZpc2libGVgLHRoaXMuX2NvbXBpbGVkVmFsdWU9dm9pZCAwLEVycm9yKHQudmFsdWUubWFwKGU9PmAke2Uua2V5fTogJHtlLm1lc3NhZ2V9YCkuam9pbihgLCBgKSk7dGhpcy5fbGl0ZXJhbFZhbHVlPXZvaWQgMCx0aGlzLl9jb21waWxlZFZhbHVlPXQudmFsdWUsdGhpcy5fZ2xvYmFsU3RhdGVSZWZzPVZvKHQudmFsdWUuZXhwcmVzc2lvbil9Z2V0R2xvYmFsU3RhdGVSZWZzKCl7cmV0dXJuIHRoaXMuX2dsb2JhbFN0YXRlUmVmc319O2Z1bmN0aW9uIGxjKGUsdCxuKXtyZXR1cm4gbmV3IGNjKGUsdCxuKX1jb25zdCB1Yz1yYyxkYz1uZXcgU2V0KE9iamVjdC5rZXlzKE0pLmZpbHRlcihlPT5lLnN0YXJ0c1dpdGgoYHNvdXJjZV9gKSkubWFwKGU9PmUuc2xpY2UoNykucmVwbGFjZUFsbChgX2AsYC1gKSkpO2Z1bmN0aW9uIGZjKGUpe3JldHVybiBPYmplY3QuZW50cmllcyhlLnNvdXJjZXM/P3t9KS5maWx0ZXIoKFssZV0pPT4hZGMuaGFzKGUudHlwZSkpLm1hcCgoW2VdKT0+YHNvdXJjZXMuJHtlfWApfWZ1bmN0aW9uIHBjKGUsdCl7bGV0IG49ZmModCk7cmV0dXJuIG1jKGUsdWModCkuZmlsdGVyKCh7bWVzc2FnZTplfSk9PiFuLnNvbWUodD0+ZS5zdGFydHNXaXRoKGAke3R9OmApfHxlLnN0YXJ0c1dpdGgoYCR7dH0uYCkpKSl9ZnVuY3Rpb24gbWMoZSx0KXtsZXQgbj0hMTtmb3IobGV0IHIgb2YgdCl7aWYoci5zZXZlcml0eT09PWB3YXJuaW5nYCl7SXQoci5tZXNzYWdlKTtjb250aW51ZX1lLmZpcmUobmV3IEluKEVycm9yKHIubWVzc2FnZSkpKSxuPSEwfXJldHVybiBufWZ1bmN0aW9uIGhjKGUsdCxuLHIpe3JldHVybiByPy52YWxpZGF0ZSE9PSExJiZtYyhlLHQoe3N0eWxlU3BlYzpNLC4uLm59KSl9dmFyIGdjPWNsYXNzIGV7Y29uc3RydWN0b3IoZSx0LG4pe2xldCByPXRoaXMuY2VsbHM9W107aWYoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXt0aGlzLmFycmF5QnVmZmVyPWU7bGV0IGk9bmV3IEludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7ZT1pWzBdLHQ9aVsxXSxuPWlbMl0sdGhpcy5kPXQrMipuO2ZvcihsZXQgZT0wO2U8dGhpcy5kKnRoaXMuZDtlKyspe2xldCB0PWlbMytlXSxuPWlbMytlKzFdO3IucHVzaCh0PT09bj9udWxsOmkuc3ViYXJyYXkodCxuKSl9bGV0IGE9aVszK3IubGVuZ3RoXSxvPWlbMytyLmxlbmd0aCsxXTt0aGlzLmtleXM9aS5zdWJhcnJheShhLG8pLHRoaXMuYmJveGVzPWkuc3ViYXJyYXkobyksdGhpcy5pbnNlcnQ9dGhpcy5faW5zZXJ0UmVhZG9ubHl9ZWxzZXt0aGlzLmQ9dCsyKm47Zm9yKGxldCBlPTA7ZTx0aGlzLmQqdGhpcy5kO2UrKylyLnB1c2goW10pO3RoaXMua2V5cz1bXSx0aGlzLmJib3hlcz1bXX10aGlzLm49dCx0aGlzLmV4dGVudD1lLHRoaXMucGFkZGluZz1uLHRoaXMuc2NhbGU9dC9lLHRoaXMudWlkPTA7bGV0IGk9bi90KmU7dGhpcy5taW49LWksdGhpcy5tYXg9ZStpfWluc2VydChlLHQsbixyLGkpe3RoaXMuX2ZvckVhY2hDZWxsKHQsbixyLGksdGhpcy5faW5zZXJ0Q2VsbCx0aGlzLnVpZCsrLHZvaWQgMCx2b2lkIDApLHRoaXMua2V5cy5wdXNoKGUpLHRoaXMuYmJveGVzLnB1c2godCksdGhpcy5iYm94ZXMucHVzaChuKSx0aGlzLmJib3hlcy5wdXNoKHIpLHRoaXMuYmJveGVzLnB1c2goaSl9X2luc2VydFJlYWRvbmx5KCl7dGhyb3cgRXJyb3IoYENhbm5vdCBpbnNlcnQgaW50byBhIEdyaWRJbmRleCBjcmVhdGVkIGZyb20gYW4gQXJyYXlCdWZmZXIuYCl9X2luc2VydENlbGwoZSx0LG4scixpLGEpe3RoaXMuY2VsbHNbaV0ucHVzaChhKX1xdWVyeShlLHQsbixyLGkpe2xldCBhPXRoaXMubWluLG89dGhpcy5tYXg7aWYoZTw9YSYmdDw9YSYmbzw9biYmbzw9ciYmIWkpcmV0dXJuWy4uLnRoaXMua2V5c107e2xldCBhPVtdO3JldHVybiB0aGlzLl9mb3JFYWNoQ2VsbChlLHQsbixyLHRoaXMuX3F1ZXJ5Q2VsbCxhLHt9LGkpLGF9fV9xdWVyeUNlbGwoZSx0LG4scixpLGEsbyxzKXtsZXQgYz10aGlzLmNlbGxzW2ldO2lmKGMhPT1udWxsKXtsZXQgaT10aGlzLmtleXMsbD10aGlzLmJib3hlcztmb3IobGV0IHUgb2YgYylpZihvW3VdPT09dm9pZCAwKXtsZXQgYz11KjQ7KHM/cyhsW2MrMF0sbFtjKzFdLGxbYysyXSxsW2MrM10pOmU8PWxbYysyXSYmdDw9bFtjKzNdJiZuPj1sW2MrMF0mJnI+PWxbYysxXSk/KG9bdV09ITAsYS5wdXNoKGlbdV0pKTpvW3VdPSExfX19X2ZvckVhY2hDZWxsKGUsdCxuLHIsaSxhLG8scyl7bGV0IGM9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKGUpLGw9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHQpLHU9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKG4pLGQ9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHIpO2ZvcihsZXQgZj1jO2Y8PXU7ZisrKWZvcihsZXQgYz1sO2M8PWQ7YysrKXtsZXQgbD10aGlzLmQqYytmO2lmKCEocyYmIXModGhpcy5fY29udmVydEZyb21DZWxsQ29vcmQoZiksdGhpcy5fY29udmVydEZyb21DZWxsQ29vcmQoYyksdGhpcy5fY29udmVydEZyb21DZWxsQ29vcmQoZisxKSx0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZChjKzEpKSkmJmkuY2FsbCh0aGlzLGUsdCxuLHIsbCxhLG8scykpcmV0dXJufX1fY29udmVydEZyb21DZWxsQ29vcmQoZSl7cmV0dXJuKGUtdGhpcy5wYWRkaW5nKS90aGlzLnNjYWxlfV9jb252ZXJ0VG9DZWxsQ29vcmQoZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5kLTEsTWF0aC5mbG9vcihlKnRoaXMuc2NhbGUpK3RoaXMucGFkZGluZykpfXRvQXJyYXlCdWZmZXIoKXtpZih0aGlzLmFycmF5QnVmZmVyKXJldHVybiB0aGlzLmFycmF5QnVmZmVyO2xldCBlPXRoaXMuY2VsbHMsdD0zK3RoaXMuY2VsbHMubGVuZ3RoKzErMSxuPTA7Zm9yKGxldCBlIG9mIHRoaXMuY2VsbHMpbis9ZS5sZW5ndGg7bGV0IHI9bmV3IEludDMyQXJyYXkodCtuK3RoaXMua2V5cy5sZW5ndGgrdGhpcy5iYm94ZXMubGVuZ3RoKTtyWzBdPXRoaXMuZXh0ZW50LHJbMV09dGhpcy5uLHJbMl09dGhpcy5wYWRkaW5nO2xldCBpPXQ7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBuPWVbdF07clszK3RdPWksci5zZXQobixpKSxpKz1uLmxlbmd0aH1yZXR1cm4gclszK2UubGVuZ3RoXT1pLHIuc2V0KHRoaXMua2V5cyxpKSxpKz10aGlzLmtleXMubGVuZ3RoLHJbMytlLmxlbmd0aCsxXT1pLHIuc2V0KHRoaXMuYmJveGVzLGkpLGkrPXRoaXMuYmJveGVzLmxlbmd0aCxyLmJ1ZmZlcn1zdGF0aWMgc2VyaWFsaXplKGUsdCl7bGV0IG49ZS50b0FycmF5QnVmZmVyKCk7cmV0dXJuIHQmJnQucHVzaChuKSx7YnVmZmVyOm59fXN0YXRpYyBkZXNlcmlhbGl6ZSh0KXtyZXR1cm4gbmV3IGUodC5idWZmZXIpfX07Y29uc3QgX2M9e307ZnVuY3Rpb24gSChlLHQsbj17fSl7aWYoX2NbZV0pdGhyb3cgRXJyb3IoYCR7ZX0gaXMgYWxyZWFkeSByZWdpc3RlcmVkLmApO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfY2xhc3NSZWdpc3RyeUtleSIse3ZhbHVlOmUsd3JpdGVhYmxlOiExfSksX2NbZV09e2tsYXNzOnQsb21pdDpuLm9taXR8fFtdLHNoYWxsb3c6bi5zaGFsbG93fHxbXX19SChgT2JqZWN0YCxPYmplY3QpLEgoYFNldGAsU2V0KSxIKGBUcmFuc2ZlcmFibGVHcmlkSW5kZXhgLGdjKSxIKGBDb2xvcmAseiksSChgRXJyb3JgLEVycm9yKSxIKGBBSkFYRXJyb3JgLENuKSxIKGBSZXNvbHZlZEltYWdlYCxCciksSChgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uYCxSbyksSChgU3R5bGVFeHByZXNzaW9uYCxrbyx7b21pdDpbYF9ldmFsdWF0b3JgXX0pLEgoYFpvb21EZXBlbmRlbnRFeHByZXNzaW9uYCxGbyksSChgWm9vbUNvbnN0YW50RXhwcmVzc2lvbmAsUG8pLEgoYENvbXBvdW5kRXhwcmVzc2lvbmAsZW8se29taXQ6W2BfZXZhbHVhdGVgXX0pO2ZvcihsZXQgZSBpbiBYYSlYYVtlXS5fY2xhc3NSZWdpc3RyeUtleXx8SChgRXhwcmVzc2lvbl8ke2V9YCxYYVtlXSk7ZnVuY3Rpb24gdmMoZSl7cmV0dXJuIGUmJnR5cGVvZiBBcnJheUJ1ZmZlcjxgdWAmJihlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fGUuY29uc3RydWN0b3I/Lm5hbWU9PT1gQXJyYXlCdWZmZXJgKX1mdW5jdGlvbiB5YyhlKXtsZXQgdD1lLmNvbnN0cnVjdG9yO3JldHVybiBlLiRuYW1lfHx0Ll9jbGFzc1JlZ2lzdHJ5S2V5fWZ1bmN0aW9uIGJjKGUpe2lmKHR5cGVvZiBlIT1gb2JqZWN0YHx8IWUpcmV0dXJuITE7bGV0IHQ9eWMoZSk7cmV0dXJuIHQmJnQhPT1gT2JqZWN0YH1mdW5jdGlvbiB4YyhlKXtyZXR1cm4hYmMoZSkmJihlPT1udWxsfHx0eXBlb2YgZT09YGJvb2xlYW5gfHx0eXBlb2YgZT09YG51bWJlcmB8fHR5cGVvZiBlPT1gc3RyaW5nYHx8ZSBpbnN0YW5jZW9mIEJvb2xlYW58fGUgaW5zdGFuY2VvZiBOdW1iZXJ8fGUgaW5zdGFuY2VvZiBTdHJpbmd8fGUgaW5zdGFuY2VvZiBEYXRlfHxlIGluc3RhbmNlb2YgUmVnRXhwfHxlIGluc3RhbmNlb2YgQmxvYnx8ZSBpbnN0YW5jZW9mIEVycm9yfHx2YyhlKXx8V3QoZSl8fEFycmF5QnVmZmVyLmlzVmlldyhlKXx8ZSBpbnN0YW5jZW9mIEltYWdlRGF0YSl9ZnVuY3Rpb24gU2MoZSx0KXtpZih4YyhlKSlyZXR1cm4odmMoZSl8fFd0KGUpKSYmdCYmdC5wdXNoKGUpLEFycmF5QnVmZmVyLmlzVmlldyhlKSYmdCYmdC5wdXNoKGUuYnVmZmVyKSxlIGluc3RhbmNlb2YgSW1hZ2VEYXRhJiZ0JiZ0LnB1c2goZS5kYXRhLmJ1ZmZlciksZTtpZihBcnJheS5pc0FycmF5KGUpKXtsZXQgbj1bXTtmb3IobGV0IHIgb2YgZSluLnB1c2goU2Mocix0KSk7cmV0dXJuIG59aWYodHlwZW9mIGUhPWBvYmplY3RgKXRocm93IEVycm9yKGBjYW4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUgJHt0eXBlb2YgZX1gKTtsZXQgbj15YyhlKTtpZighbil0aHJvdyBFcnJvcihgY2FuJ3Qgc2VyaWFsaXplIG9iamVjdCBvZiB1bnJlZ2lzdGVyZWQgY2xhc3MgJHtlLmNvbnN0cnVjdG9yLm5hbWV9YCk7aWYoIV9jW25dKXRocm93IEVycm9yKGAke259IGlzIG5vdCByZWdpc3RlcmVkLmApO2xldHtrbGFzczpyfT1fY1tuXSxpPXIuc2VyaWFsaXplP3Iuc2VyaWFsaXplKGUsdCk6e307aWYoIXIuc2VyaWFsaXplKXtmb3IobGV0IHIgaW4gZSl7aWYoIWUuaGFzT3duUHJvcGVydHkocil8fF9jW25dLm9taXQuaW5jbHVkZXMocikpY29udGludWU7bGV0IGE9ZVtyXTthIT09dm9pZCAwJiYoaVtyXT1fY1tuXS5zaGFsbG93LmluY2x1ZGVzKHIpP2E6U2MoYSx0KSl9ZSBpbnN0YW5jZW9mIEVycm9yJiYoaS5tZXNzYWdlPWUubWVzc2FnZSl9ZWxzZSBpZihpPT09dD8uW3QubGVuZ3RoLTFdKXRocm93IEVycm9yKGBzdGF0aWNhbGx5IHNlcmlhbGl6ZWQgb2JqZWN0IHdvbid0IHN1cnZpdmUgdHJhbnNmZXIgb2YgJG5hbWUgcHJvcGVydHlgKTtpZihpLiRuYW1lKXRocm93IEVycm9yKGAkbmFtZSBwcm9wZXJ0eSBpcyByZXNlcnZlZCBmb3Igd29ya2VyIHNlcmlhbGl6YXRpb24gbG9naWMuYCk7cmV0dXJuIG4hPT1gT2JqZWN0YCYmKGkuJG5hbWU9biksaX1mdW5jdGlvbiBDYyhlKXtpZih4YyhlKSlyZXR1cm4gZTtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlLm1hcChDYyk7aWYodHlwZW9mIGUhPWBvYmplY3RgKXRocm93IEVycm9yKGBjYW4ndCBkZXNlcmlhbGl6ZSBvYmplY3Qgb2YgdHlwZSAke3R5cGVvZiBlfWApO2xldCB0PXljKGUpfHxgT2JqZWN0YDtpZighX2NbdF0pdGhyb3cgRXJyb3IoYGNhbid0IGRlc2VyaWFsaXplIHVucmVnaXN0ZXJlZCBjbGFzcyAke3R9YCk7bGV0e2tsYXNzOm59PV9jW3RdO2lmKCFuKXRocm93IEVycm9yKGBjYW4ndCBkZXNlcmlhbGl6ZSB1bnJlZ2lzdGVyZWQgY2xhc3MgJHt0fWApO2lmKG4uZGVzZXJpYWxpemUpcmV0dXJuIG4uZGVzZXJpYWxpemUoZSk7bGV0IHI9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSk7Zm9yKGxldCBuIG9mIE9iamVjdC5rZXlzKGUpKXtpZihuPT09YCRuYW1lYCljb250aW51ZTtsZXQgaT1lW25dO3Jbbl09X2NbdF0uc2hhbGxvdy5pbmNsdWRlcyhuKT9pOkNjKGkpfXJldHVybiByfXZhciB3Yz1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuZmlyc3Q9ITB9dXBkYXRlKGUsdCl7bGV0IG49TWF0aC5mbG9vcihlKTtyZXR1cm4gdGhpcy5maXJzdD8odGhpcy5maXJzdD0hMSx0aGlzLmxhc3RJbnRlZ2VyWm9vbT1uLHRoaXMubGFzdEludGVnZXJab29tVGltZT0wLHRoaXMubGFzdFpvb209ZSx0aGlzLmxhc3RGbG9vclpvb209biwhMCk6KHRoaXMubGFzdEZsb29yWm9vbT5uPyh0aGlzLmxhc3RJbnRlZ2VyWm9vbT1uKzEsdGhpcy5sYXN0SW50ZWdlclpvb21UaW1lPXQpOnRoaXMubGFzdEZsb29yWm9vbTxuJiYodGhpcy5sYXN0SW50ZWdlclpvb209bix0aGlzLmxhc3RJbnRlZ2VyWm9vbVRpbWU9dCksZSE9PXRoaXMubGFzdFpvb20mJih0aGlzLmxhc3Rab29tPWUsdGhpcy5sYXN0Rmxvb3Jab29tPW4sITApKX19O2Z1bmN0aW9uIFRjKGUpe3JldHVybi9bXHUwMkVBXHUwMkVCXHUxMTAwLVx1MTFGRlx1MkU4MC1cdTJGREZcdTMwMDAtXHUzMEZGXHUzMTA1LVx1MzEyRlx1MzEzMS1cdTMxOEVcdTMxQTAtXHU0REJGXHU0RTAwLVx1QTQ4Q1x1QTQ5MC1cdUE0QzZcdUE5NjAtXHVBOTdDXHVBQzAwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkUxMC1cdUZFMUZcdUZFMzAtXHVGRTRGXHVGRjAwLVx1RkZFRl18XHVEODFCW1x1REZFMC1cdURGRkZdfFtcdUQ4MUMtXHVEODIyXHVEODQwLVx1RDg2OFx1RDg2QS1cdUQ4NkRcdUQ4NkYtXHVEODcyXHVEODc0LVx1RDg3OVx1RDg4MC1cdUQ4ODNcdUQ4ODUtXHVEODhDXVtcdURDMDAtXHVERkZGXXxcdUQ4MjNbXHVEQzAwLVx1RENENVx1RENGRi1cdUREMUVcdUREODAtXHVEREYyXXxcdUQ4MkJbXHVERkYwLVx1REZGRl18XHVEODJDW1x1REMwMC1cdURFRkJdfFx1RDgzQ1tcdURFMDAtXHVERUZGXXxcdUQ4NjlbXHVEQzAwLVx1REVERlx1REYwMC1cdURGRkZdfFx1RDg2RVtcdURDMDAtXHVEQzFEXHVEQzIwLVx1REZGRl18XHVEODczW1x1REMwMC1cdURFQURcdURFQjAtXHVERkZGXXxcdUQ4N0FbXHVEQzAwLVx1REZFMFx1REZGMC1cdURGRkZdfFx1RDg3QltcdURDMDAtXHVERTVEXXxcdUQ4N0VbXHVEQzAwLVx1REUxRF18XHVEODg0W1x1REMwMC1cdURGNEFcdURGNTAtXHVERkZGXXxcdUQ4OERbXHVEQzAwLVx1REM3OV0vZ2ltLnRlc3QoU3RyaW5nLmZyb21Db2RlUG9pbnQoZSkpfWZ1bmN0aW9uIEVjKGUpe3JldHVybi9bXHUwMkVBXHUwMkVCXHUyRTgwLVx1MkZERlx1MkZGMC1cdTMwM0ZcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkQtXHUzMEZGXHUzMTA1LVx1MzEyRlx1MzFBMC1cdTREQkZcdTRFMDAtXHVBNDhDXHVBNDkwLVx1QTRDNlx1RjkwMC1cdUZBNkRcdUZBNzAtXHVGQUQ5XHVGRTEwLVx1RkUxRlx1RkUzMC1cdUZFNEZcdUZGMDAtXHVGRkVGXXxcdUQ4MUJbXHVERkUwLVx1REZGRl18W1x1RDgxQy1cdUQ4MjJcdUQ4NDAtXHVEODY4XHVEODZBLVx1RDg2RFx1RDg2Ri1cdUQ4NzJcdUQ4NzQtXHVEODc5XHVEODgwLVx1RDg4M1x1RDg4NS1cdUQ4OENdW1x1REMwMC1cdURGRkZdfFx1RDgyM1tcdURDMDAtXHVEQ0Q1XHVEQ0ZGLVx1REQxRVx1REQ4MC1cdURERjJdfFx1RDgyQltcdURGRjAtXHVERkZGXXxcdUQ4MkNbXHVEQzAwLVx1REVGQl18XHVEODNDW1x1REUwMC1cdURFRkZdfFx1RDg2OVtcdURDMDAtXHVERURGXHVERjAwLVx1REZGRl18XHVEODZFW1x1REMwMC1cdURDMURcdURDMjAtXHVERkZGXXxcdUQ4NzNbXHVEQzAwLVx1REVBRFx1REVCMC1cdURGRkZdfFx1RDg3QVtcdURDMDAtXHVERkUwXHVERkYwLVx1REZGRl18XHVEODdCW1x1REMwMC1cdURFNURdfFx1RDg3RVtcdURDMDAtXHVERTFEXXxcdUQ4ODRbXHVEQzAwLVx1REY0QVx1REY1MC1cdURGRkZdfFx1RDg4RFtcdURDMDAtXHVEQzc5XS9naW0udGVzdChTdHJpbmcuZnJvbUNvZGVQb2ludChlKSl9ZnVuY3Rpb24gRGMoZSl7cmV0dXJuL1tcdTAyRUFcdTAyRUJcdTExMDAtXHUxMUZGXHUxNDAwLVx1MTY3Rlx1MThCMC1cdTE4RjVcdTJFODAtXHUyRTk5XHUyRTlCLVx1MkVGM1x1MkYwMC1cdTJGRDVcdTJGRjAtXHUzMDA3XHUzMDEyXHUzMDEzXHUzMDIwLVx1MzAyRlx1MzAzMS1cdTMwM0ZcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzBGQlx1MzBGRC1cdTMwRkZcdTMxMDUtXHUzMTJGXHUzMTMxLVx1MzE4RVx1MzE5MC1cdUE0OENcdUE0OTAtXHVBNEM2XHVBOTYwLVx1QTk3Q1x1QUMwMC1cdUQ3QTNcdUQ3QjAtXHVEN0M2XHVEN0NCLVx1RDdGQlx1RjkwMC1cdUZBNkRcdUZBNzAtXHVGQUQ5XHVGRTEwLVx1RkUxRlx1RkUzMC1cdUZFNDhcdUZFNTAtXHVGRTU3XHVGRTVGLVx1RkU2Mlx1RkU2Ny1cdUZFNkZcdUZGMDAtXHVGRjA3XHVGRjBBLVx1RkYwQ1x1RkYwRS1cdUZGMTlcdUZGMUYtXHVGRjNBXHVGRjNDXHVGRjNFXHVGRjQwLVx1RkY1QVx1RkZFMC1cdUZGRTJcdUZGRTQtXHVGRkU3XXxcdUQ4MDJbXHVERDgwLVx1REQ5Rl18XHVEODA1W1x1REQ4MC1cdURERkZdfFx1RDgwNltcdURFMDAtXHVERUJGXXxcdUQ4MTFbXHVEQzAwLVx1REU3Rl18XHVEODFCW1x1REZFMC1cdURGRTRcdURGRjAtXHVERkY2XXxbXHVEODFDLVx1RDgyMlx1RDgzRFx1RDg0MC1cdUQ4NjhcdUQ4NkEtXHVEODZEXHVEODZGLVx1RDg3Mlx1RDg3NC1cdUQ4NzlcdUQ4ODAtXHVEODgzXHVEODg1LVx1RDg4Q11bXHVEQzAwLVx1REZGRl18XHVEODIzW1x1REMwMC1cdURDRDVcdURDRkYtXHVERDFFXHVERDgwLVx1RERGMl18XHVEODJCW1x1REZGMC1cdURGRjNcdURGRjUtXHVERkZCXHVERkZEXHVERkZFXXxcdUQ4MkNbXHVEQzAwLVx1REQyMlx1REQzMC1cdURFRkJdfFx1RDgzM1tcdURFQzAtXHVERkNGXXxcdUQ4MzRbXHVEQzAwLVx1RERGRlx1REVFMC1cdURGN0ZdfFx1RDgzNltcdURDMDAtXHVERUFGXXxcdUQ4M0NbXHVEQzAwLVx1REUwMFx1REYwMC1cdURGRkZdfFx1RDgzRVtcdUREMDAtXHVERUZGXXxcdUQ4NjlbXHVEQzAwLVx1REVERlx1REYwMC1cdURGRkZdfFx1RDg2RVtcdURDMDAtXHVEQzFEXHVEQzIwLVx1REZGRl18XHVEODczW1x1REMwMC1cdURFQURcdURFQjAtXHVERkZGXXxcdUQ4N0FbXHVEQzAwLVx1REZFMFx1REZGMC1cdURGRkZdfFx1RDg3QltcdURDMDAtXHVERTVEXXxcdUQ4N0VbXHVEQzAwLVx1REUxRF18XHVEODg0W1x1REMwMC1cdURGNEFcdURGNTAtXHVERkZGXXxcdUQ4OERbXHVEQzAwLVx1REM3OV0vZ2ltLnRlc3QoU3RyaW5nLmZyb21Db2RlUG9pbnQoZSkpfWZ1bmN0aW9uIE9jKGUpe3JldHVybi9bXHhBN1x4QTlceEFFXHhCMVx4QkMtXHhCRVx4RDdceEY3XHUyMDE2XHUyMDIwXHUyMDIxXHUyMDMwXHUyMDMxXHUyMDNCXHUyMDNDXHUyMDQyXHUyMDQ3LVx1MjA0OVx1MjA1MVx1MjEwMC1cdTIxOEZcdTIyMUVcdTIyMzRcdTIyMzVcdTIzMDAtXHUyMzA3XHUyMzBDLVx1MjMxRlx1MjMyNC1cdTIzMjhcdTIzMkJcdTIzN0QtXHUyMzlBXHUyM0JFLVx1MjNDRFx1MjNDRlx1MjNEMS1cdTIzREJcdTIzRTItXHUyNDIyXHUyNDI0LVx1MjRGRlx1MjVBMC1cdTI2MTlcdTI2MjAtXHUyNzY3XHUyNzc2LVx1Mjc5M1x1MkIxMi1cdTJCMkZcdTJCNTAtXHUyQjU5XHUyQkI4LVx1MkJFQlx1MzAwMC1cdTMwM0ZcdTMwQTAtXHUzMEZGXHVFMDAwLVx1RjhGRlx1RkUzMC1cdUZFNkZcdUZGMDAtXHVGRkVGXHVGRkZDXHVGRkZEXXxbXHVEQjgwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0vZ2ltLnRlc3QoU3RyaW5nLmZyb21Db2RlUG9pbnQoZSkpfWZ1bmN0aW9uIGtjKGUpe3JldHVybi9bXHUwOTAwLVx1MERGRlx1MEYwMC1cdTEwOUZcdTE3ODAtXHUxN0ZGXS9naW0udGVzdChTdHJpbmcuZnJvbUNvZGVQb2ludChlKSl9ZnVuY3Rpb24gQWMoZSl7cmV0dXJuL1tcclx1MDMwMC1cdTAzNkZcdTA0ODMtXHUwNDg5XHUwNTkxLVx1MDVCRFx1MDVCRlx1MDVDMVx1MDVDMlx1MDVDNFx1MDVDNVx1MDVDN1x1MDYwMC1cdTA2MDVcdTA2MTAtXHUwNjFBXHUwNjRCLVx1MDY1Rlx1MDY3MFx1MDZENi1cdTA2RERcdTA2REYtXHUwNkU0XHUwNkU3XHUwNkU4XHUwNkVBLVx1MDZFRFx1MDcwRlx1MDcxMVx1MDczMC1cdTA3NEFcdTA3QTYtXHUwN0IwXHUwN0VCLVx1MDdGM1x1MDdGRFx1MDgxNi1cdTA4MTlcdTA4MUItXHUwODIzXHUwODI1LVx1MDgyN1x1MDgyOS1cdTA4MkRcdTA4NTktXHUwODVCXHUwODkwXHUwODkxXHUwODk3LVx1MDg5Rlx1MDhDQS1cdTA5MDNcdTA5M0EtXHUwOTNDXHUwOTNFLVx1MDk0Rlx1MDk1MS1cdTA5NTdcdTA5NjJcdTA5NjNcdTA5ODEtXHUwOTgzXHUwOUJDXHUwOUJFLVx1MDlDNFx1MDlDN1x1MDlDOFx1MDlDQi1cdTA5Q0RcdTA5RDdcdTA5RTJcdTA5RTNcdTA5RkVcdTBBMDEtXHUwQTAzXHUwQTNDXHUwQTNFLVx1MEE0Mlx1MEE0N1x1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNTFcdTBBNzBcdTBBNzFcdTBBNzVcdTBBODEtXHUwQTgzXHUwQUJDXHUwQUJFLVx1MEFDNVx1MEFDNy1cdTBBQzlcdTBBQ0ItXHUwQUNEXHUwQUUyXHUwQUUzXHUwQUZBLVx1MEFGRlx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQ0XHUwQjQ3XHUwQjQ4XHUwQjRCLVx1MEI0RFx1MEI1NS1cdTBCNTdcdTBCNjJcdTBCNjNcdTBCODJcdTBCQkUtXHUwQkMyXHUwQkM2LVx1MEJDOFx1MEJDQS1cdTBCQ0RcdTBCRDdcdTBDMDAtXHUwQzA0XHUwQzNDXHUwQzNFLVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1XHUwQzU2XHUwQzYyXHUwQzYzXHUwQzgxLVx1MEM4M1x1MENCQ1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENVx1MENENlx1MENFMlx1MENFM1x1MENGM1x1MEQwMC1cdTBEMDNcdTBEM0JcdTBEM0NcdTBEM0UtXHUwRDQ0XHUwRDQ2LVx1MEQ0OFx1MEQ0QS1cdTBENEVcdTBENTdcdTBENjJcdTBENjNcdTBEODEtXHUwRDgzXHUwRENBXHUwRENGLVx1MERENFx1MERENlx1MEREOC1cdTBEREZcdTBERjJcdTBERjNcdTBFMzFcdTBFMzMtXHUwRTNBXHUwRTQ3LVx1MEU0RVx1MEVCMVx1MEVCMy1cdTBFQkNcdTBFQzgtXHUwRUNFXHUwRjE4XHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Nlx1MEY4N1x1MEY4RC1cdTBGOTdcdTBGOTktXHUwRkJDXHUwRkM2XHUxMDJELVx1MTAzN1x1MTAzOS1cdTEwM0VcdTEwNTYtXHUxMDU5XHUxMDVFLVx1MTA2MFx1MTA3MS1cdTEwNzRcdTEwODJcdTEwODQtXHUxMDg2XHUxMDhEXHUxMDlEXHUxMTAwLVx1MTFGRlx1MTM1RC1cdTEzNUZcdTE3MTItXHUxNzE1XHUxNzMyLVx1MTczNFx1MTc1Mlx1MTc1M1x1MTc3Mlx1MTc3M1x1MTdCNC1cdTE3RDNcdTE3RERcdTE4MEItXHUxODBEXHUxODBGXHUxODg1XHUxODg2XHUxOEE5XHUxOTIwLVx1MTkyQlx1MTkzMC1cdTE5M0JcdTFBMTctXHUxQTFCXHUxQTU1LVx1MUE1RVx1MUE2MFx1MUE2Mlx1MUE2NS1cdTFBN0NcdTFBN0ZcdTFBQjAtXHUxQUREXHUxQUUwLVx1MUFFQlx1MUIwMC1cdTFCMDRcdTFCMzQtXHUxQjQ0XHUxQjZCLVx1MUI3M1x1MUI4MC1cdTFCODJcdTFCQTEtXHUxQkFEXHUxQkU2LVx1MUJGM1x1MUMyNC1cdTFDMzdcdTFDRDAtXHUxQ0QyXHUxQ0Q0LVx1MUNFOFx1MUNFRFx1MUNGNFx1MUNGNy1cdTFDRjlcdTFEQzAtXHUxREZGXHUyMDBDXHUyMDBEXHUyMEQwLVx1MjBGMFx1MkNFRi1cdTJDRjFcdTJEN0ZcdTJERTAtXHUyREZGXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QVx1QTY2Ri1cdUE2NzJcdUE2NzQtXHVBNjdEXHVBNjlFXHVBNjlGXHVBNkYwXHVBNkYxXHVBODAyXHVBODA2XHVBODBCXHVBODIzLVx1QTgyN1x1QTgyQ1x1QTg4MFx1QTg4MVx1QThCNC1cdUE4QzVcdUE4RTAtXHVBOEYxXHVBOEZGXHVBOTI2LVx1QTkyRFx1QTk0Ny1cdUE5NTNcdUE5NjAtXHVBOTdDXHVBOTgwLVx1QTk4M1x1QTlCMy1cdUE5QzBcdUE5RTVcdUFBMjktXHVBQTM2XHVBQTQzXHVBQTRDXHVBQTREXHVBQTdDXHVBQUIwXHVBQUIyLVx1QUFCNFx1QUFCN1x1QUFCOFx1QUFCRVx1QUFCRlx1QUFDMVx1QUFFQi1cdUFBRUZcdUFBRjVcdUFBRjZcdUFCRTMtXHVBQkVBXHVBQkVDXHVBQkVEXHVBQzAwLVx1RDdBM1x1RDdCMC1cdUQ3QzZcdUQ3Q0ItXHVEN0ZCXHVGQjFFXHVGRTAwLVx1RkUwRlx1RkUyMC1cdUZFMkZcdUZGOUVcdUZGOUZdfFx1RDgwMFtcdURERkRcdURFRTBcdURGNzYtXHVERjdBXXxcdUQ4MDJbXHVERTAxLVx1REUwM1x1REUwNVx1REUwNlx1REUwQy1cdURFMEZcdURFMzgtXHVERTNBXHVERTNGXHVERUU1XHVERUU2XXxcdUQ4MDNbXHVERDI0LVx1REQyN1x1REQ2OS1cdURENkRcdURFQUJcdURFQUNcdURFRkEtXHVERUZGXHVERjQ2LVx1REY1MFx1REY4Mi1cdURGODVdfFx1RDgwNFtcdURDMDAtXHVEQzAyXHVEQzM4LVx1REM0Nlx1REM3MFx1REM3M1x1REM3NFx1REM3Ri1cdURDODJcdURDQjAtXHVEQ0JBXHVEQ0JEXHVEQ0MyXHVEQ0NEXHVERDAwLVx1REQwMlx1REQyNy1cdUREMzRcdURENDVcdURENDZcdURENzNcdUREODAtXHVERDgyXHVEREIzLVx1RERDMFx1RERDMlx1RERDM1x1RERDOS1cdUREQ0NcdUREQ0VcdUREQ0ZcdURFMkMtXHVERTM3XHVERTNFXHVERTQxXHVERURGLVx1REVFQVx1REYwMC1cdURGMDNcdURGM0JcdURGM0NcdURGM0UtXHVERjQ0XHVERjQ3XHVERjQ4XHVERjRCLVx1REY0RFx1REY1N1x1REY2Mlx1REY2M1x1REY2Ni1cdURGNkNcdURGNzAtXHVERjc0XHVERkI4LVx1REZDMFx1REZDMlx1REZDNVx1REZDNy1cdURGQ0FcdURGQ0MtXHVERkQyXHVERkUxXHVERkUyXXxcdUQ4MDVbXHVEQzM1LVx1REM0Nlx1REM1RVx1RENCMC1cdURDQzNcdUREQUYtXHVEREI1XHVEREI4LVx1RERDMFx1REREQ1x1RERERFx1REUzMC1cdURFNDBcdURFQUItXHVERUI3XHVERjFELVx1REYxRlx1REYyMi1cdURGMkJdfFx1RDgwNltcdURDMkMtXHVEQzNBXHVERDMwLVx1REQzNVx1REQzN1x1REQzOFx1REQzQi1cdURENDNcdURERDEtXHVEREQ3XHVERERBLVx1RERFMFx1RERFNFx1REUwMS1cdURFMEFcdURFMzMtXHVERTM5XHVERTNCLVx1REUzRVx1REU0N1x1REU1MS1cdURFNUJcdURFODQtXHVERTk5XHVERjYwLVx1REY2N118XHVEODA3W1x1REMyRi1cdURDMzZcdURDMzgtXHVEQzNGXHVEQzkyLVx1RENBN1x1RENBOS1cdURDQjZcdUREMzEtXHVERDM2XHVERDNBXHVERDNDXHVERDNEXHVERDNGLVx1REQ0N1x1REQ4QS1cdUREOEVcdUREOTBcdUREOTFcdUREOTMtXHVERDk3XHVERUYzLVx1REVGNlx1REYwMC1cdURGMDNcdURGMzQtXHVERjNBXHVERjNFLVx1REY0Mlx1REY1QV18XHVEODBEW1x1REM0MFx1REM0Ny1cdURDNTVdfFx1RDgxOFtcdUREMUUtXHVERDJGXXxcdUQ4MUFbXHVERUYwLVx1REVGNFx1REYzMC1cdURGMzZdfFx1RDgxQltcdURENjNcdURENjctXHVERDZBXHVERjRGXHVERjUxLVx1REY4N1x1REY4Ri1cdURGOTJcdURGRTRcdURGRjBcdURGRjFdfFx1RDgyRltcdURDOURcdURDOUVdfFx1RDgzM1tcdURGMDAtXHVERjJEXHVERjMwLVx1REY0Nl18XHVEODM0W1x1REQ2NS1cdURENjlcdURENkQtXHVERDcyXHVERDdCLVx1REQ4Mlx1REQ4NS1cdUREOEJcdUREQUEtXHVEREFEXHVERTQyLVx1REU0NF18XHVEODM2W1x1REUwMC1cdURFMzZcdURFM0ItXHVERTZDXHVERTc1XHVERTg0XHVERTlCLVx1REU5Rlx1REVBMS1cdURFQUZdfFx1RDgzOFtcdURDMDAtXHVEQzA2XHVEQzA4LVx1REMxOFx1REMxQi1cdURDMjFcdURDMjNcdURDMjRcdURDMjYtXHVEQzJBXHVEQzhGXHVERDMwLVx1REQzNlx1REVBRVx1REVFQy1cdURFRUZdfFx1RDgzOVtcdURDRUMtXHVEQ0VGXHVEREVFXHVEREVGXHVERUUzXHVERUU2XHVERUVFXHVERUVGXHVERUY1XXxcdUQ4M0FbXHVEQ0QwLVx1RENENlx1REQ0NC1cdURENEFdfFx1RDgzQ1tcdURERTYtXHVEREZGXHVERkZCLVx1REZGRl18XHVEQjQwW1x1REMyMC1cdURDN0ZcdUREMDAtXHVEREVGXS8udGVzdChlKX1mdW5jdGlvbiBqYyhlKXtyZXR1cm4vW1x1MEUwMS1cdTBFM0FcdTBFNDAtXHUwRTVCXHUwRTgxXHUwRTgyXHUwRTg0XHUwRTg2LVx1MEU4QVx1MEU4Qy1cdTBFQTNcdTBFQTVcdTBFQTctXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVDOC1cdTBFQ0VcdTBFRDAtXHUwRUQ5XHUwRURDLVx1MEVERlx1MEYwMC1cdTBGNDdcdTBGNDktXHUwRjZDXHUwRjcxLVx1MEY5N1x1MEY5OS1cdTBGQkNcdTBGQkUtXHUwRkNDXHUwRkNFLVx1MEZENFx1MEZEOVx1MEZEQVx1MTAwMC1cdTEwOUZcdTE3ODAtXHUxN0REXHUxN0UwLVx1MTdFOVx1MTdGMC1cdTE3RjlcdTE5RTAtXHUxOUZGXHUxQjAwLVx1MUI0Q1x1MUI0RS1cdTFCN0ZcdUE5ODAtXHVBOUNEXHVBOUQwLVx1QTlEOVx1QTlERS1cdUE5RkVcdUFBNjAtXHVBQTdGXXxcdUQ4MDVbXHVERUQwLVx1REVFM10vZ2ltLnRlc3QoU3RyaW5nLmZyb21Db2RlUG9pbnQoZSkpfWZ1bmN0aW9uIE1jKGUsdCl7cmV0dXJuLyg/OltcdTEwMzlcdTE3RDJcdTFBNjBcdTFCQUJcdTIwMERcdUFBRjZdfFx1RDgwMlx1REUzRnxcdUQ4MDRbXHVERDMzXHVERkQwXXxcdUQ4MDZbXHVERDNFXHVERTQ3XHVERTk5XXxcdUQ4MDdbXHVERDQ1XHVERDk3XHVERjQyXSkkLy50ZXN0KGUpfHwvXlxwe2djPU1jfS91LnRlc3QodCl9ZnVuY3Rpb24gTmMoZSl7cmV0dXJuL1xzL3UudGVzdChTdHJpbmcuZnJvbUNvZGVQb2ludChlKSl9ZnVuY3Rpb24gUGMoZSl7Zm9yKGxldCB0IG9mIGUpaWYoRGModC5jb2RlUG9pbnRBdCgwKSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gRmMoZSl7Zm9yKGxldCB0IG9mIGUpaWYoIVJjKHQuY29kZVBvaW50QXQoMCkpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIEljKGUpe2xldCB0PWUubWFwKGU9Pnt0cnl7cmV0dXJuIFJlZ0V4cChgXFxwe3NjPSR7ZX19YCxgdWApLnNvdXJjZX1jYXRjaHtyZXR1cm4gbnVsbH19KS5maWx0ZXIoZT0+ZSk7cmV0dXJuIG5ldyBSZWdFeHAodC5qb2luKGB8YCksYHVgKX1jb25zdCBMYz1JYyhbYEFyYWJgLGBEdXBsYCxgTW9uZ2AsYE91Z3JgLGBTeXJjYF0pO2Z1bmN0aW9uIFJjKGUpe3JldHVybiFMYy50ZXN0KFN0cmluZy5mcm9tQ29kZVBvaW50KGUpKX1mdW5jdGlvbiB6YyhlKXtyZXR1cm4hKERjKGUpfHxPYyhlKSl9ZnVuY3Rpb24gQmMoZSl7cmV0dXJuL1xwe3NjPUFyYWJ9L3UudGVzdChTdHJpbmcuZnJvbUNvZGVQb2ludChlKSl9Y29uc3QgVmM9SWMoYEFkbG0uQXJhYi5Bcm1pLkF2c3QuQ2hycy5DcHJ0LkVneXAuRWx5bS5HYXJhLkhhdHIuSGVici5IdW5nLktoYXIuTHlkaS5NYW5kLk1hbmkuTWVuZC5NZXJjLk1lcm8uTmFyYi5OYmF0Lk5rb28uT3JraC5QYWxtLlBobGkuUGhscC5QaG54LlBydGkuUm9oZy5TYW1yLlNhcmIuU29nby5TeXJjLlRoYWEuVG9kci5ZZXppYC5zcGxpdChgLmApKTtmdW5jdGlvbiBIYyhlKXtyZXR1cm4gVmMudGVzdChTdHJpbmcuZnJvbUNvZGVQb2ludChlKSl9ZnVuY3Rpb24gVWMoZSx0KXtyZXR1cm4hdCYmSGMoZSk/ITE6IWtjKGUpfWZ1bmN0aW9uIFdjKGUpe2ZvcihsZXQgdCBvZiBlKWlmKEhjKHQuY29kZVBvaW50QXQoMCkpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIEdjKGUsdCl7Zm9yKGxldCBuIG9mIGUpaWYoIVVjKG4uY29kZVBvaW50QXQoMCksdCkpcmV0dXJuITE7cmV0dXJuITB9Y29uc3QgS2M9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5USU1FT1VUPTVlMyx0aGlzLmFwcGx5QXJhYmljU2hhcGluZz1udWxsLHRoaXMucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0PW51bGwsdGhpcy5wcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ9bnVsbCx0aGlzLnBsdWdpblN0YXR1cz1gdW5hdmFpbGFibGVgLHRoaXMucGx1Z2luVVJMPW51bGwsdGhpcy5sb2FkU2NyaXB0UmVzb2x2ZT0oKT0+e319c2V0U3RhdGUoZSl7dGhpcy5wbHVnaW5TdGF0dXM9ZS5wbHVnaW5TdGF0dXMsdGhpcy5wbHVnaW5VUkw9ZS5wbHVnaW5VUkx9Z2V0U3RhdGUoKXtyZXR1cm57cGx1Z2luU3RhdHVzOnRoaXMucGx1Z2luU3RhdHVzLHBsdWdpblVSTDp0aGlzLnBsdWdpblVSTH19c2V0TWV0aG9kcyhlKXtpZihLYy5pc1BhcnNlZCgpKXRocm93IEVycm9yKGBSVEwgdGV4dCBwbHVnaW4gYWxyZWFkeSByZWdpc3RlcmVkLmApO3RoaXMuYXBwbHlBcmFiaWNTaGFwaW5nPWUuYXBwbHlBcmFiaWNTaGFwaW5nLHRoaXMucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0PWUucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0LHRoaXMucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0PWUucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0LHRoaXMubG9hZFNjcmlwdFJlc29sdmUoKX1pc1BhcnNlZCgpe3JldHVybiB0aGlzLmFwcGx5QXJhYmljU2hhcGluZyE9bnVsbCYmdGhpcy5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQhPW51bGwmJnRoaXMucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0IT1udWxsfWdldFJUTFRleHRQbHVnaW5TdGF0dXMoKXtyZXR1cm4gdGhpcy5wbHVnaW5TdGF0dXN9YXN5bmMgc3luY1N0YXRlKGUsdCl7aWYodGhpcy5pc1BhcnNlZCgpKXJldHVybiB0aGlzLmdldFN0YXRlKCk7aWYoZS5wbHVnaW5TdGF0dXMhPT1gbG9hZGluZ2ApcmV0dXJuIHRoaXMuc2V0U3RhdGUoZSksZTtsZXQgbj1lLnBsdWdpblVSTCxyPW5ldyBQcm9taXNlKGU9Pnt0aGlzLmxvYWRTY3JpcHRSZXNvbHZlPWV9KSxpPW5ldyBQcm9taXNlKGU9PnNldFRpbWVvdXQoKCk9PmUoKSx0aGlzLlRJTUVPVVQpKTtpZihhd2FpdCB0KG4pLGF3YWl0IFByb21pc2UucmFjZShbcixpXSksdGhpcy5pc1BhcnNlZCgpKXtsZXQgZT17cGx1Z2luU3RhdHVzOmBsb2FkZWRgLHBsdWdpblVSTDpufTtyZXR1cm4gdGhpcy5zZXRTdGF0ZShlKSxlfXRocm93IHRoaXMuc2V0U3RhdGUoe3BsdWdpblN0YXR1czpgZXJyb3JgLHBsdWdpblVSTDpgYH0pLEVycm9yKGBSVEwgVGV4dCBQbHVnaW4gZmFpbGVkIHRvIGltcG9ydCBzY3JpcHRzIGZyb20gJHtufWApfX07dmFyIFU9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmlzU3VwcG9ydGVkU2NyaXB0PXFjLHRoaXMuem9vbT1lLHQ/KHRoaXMubm93PXQubm93fHwwLHRoaXMuZmFkZUR1cmF0aW9uPXQuZmFkZUR1cmF0aW9ufHwwLHRoaXMuem9vbUhpc3Rvcnk9dC56b29tSGlzdG9yeXx8bmV3IHdjLHRoaXMudHJhbnNpdGlvbj10LnRyYW5zaXRpb258fHt9KToodGhpcy5ub3c9MCx0aGlzLmZhZGVEdXJhdGlvbj0wLHRoaXMuem9vbUhpc3Rvcnk9bmV3IHdjLHRoaXMudHJhbnNpdGlvbj17fSl9Y3Jvc3NGYWRpbmdGYWN0b3IoKXtyZXR1cm4gdGhpcy5mYWRlRHVyYXRpb249PT0wPzE6TWF0aC5taW4oKHRoaXMubm93LXRoaXMuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tVGltZSkvdGhpcy5mYWRlRHVyYXRpb24sMSl9Z2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpe2xldCBlPXRoaXMuem9vbSx0PWUtTWF0aC5mbG9vcihlKSxuPXRoaXMuY3Jvc3NGYWRpbmdGYWN0b3IoKTtyZXR1cm4gZT50aGlzLnpvb21IaXN0b3J5Lmxhc3RJbnRlZ2VyWm9vbT97ZnJvbVNjYWxlOjIsdG9TY2FsZToxLHQ6dCsoMS10KSpufTp7ZnJvbVNjYWxlOi41LHRvU2NhbGU6MSx0OjEtKDEtbikqdH19fTtmdW5jdGlvbiBxYyhlKXtyZXR1cm4gR2MoZSxLYy5nZXRSVExUZXh0UGx1Z2luU3RhdHVzKCk9PT1gbG9hZGVkYCl9Y29uc3QgSmM9YC10cmFuc2l0aW9uYDt2YXIgWWM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5wcm9wZXJ0eT1lLHRoaXMudmFsdWU9dCx0aGlzLmV4cHJlc3Npb249em8odD09PXZvaWQgMD9lLnNwZWNpZmljYXRpb24uZGVmYXVsdDp0LG4sZS5zcGVjaWZpY2F0aW9uLHIpfWlzRGF0YURyaXZlbigpe3JldHVybiB0aGlzLmV4cHJlc3Npb24ua2luZD09PWBzb3VyY2VgfHx0aGlzLmV4cHJlc3Npb24ua2luZD09PWBjb21wb3NpdGVgfWdldEdsb2JhbFN0YXRlUmVmcygpe3JldHVybiB0aGlzLmV4cHJlc3Npb24uZ2xvYmFsU3RhdGVSZWZzfHxuZXcgU2V0fXBvc3NpYmx5RXZhbHVhdGUoZSx0LG4pe3JldHVybiB0aGlzLnByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGUodGhpcyxlLHQsbil9fSxYYz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5wcm9wZXJ0eT1lLHRoaXMudmFsdWU9bmV3IFljKGUsdm9pZCAwLHQsbil9dHJhbnNpdGlvbmVkKGUsdCl7cmV0dXJuIG5ldyBRYyh0aGlzLnByb3BlcnR5LHRoaXMudmFsdWUsdCxTdCh7fSxlLnRyYW5zaXRpb24sdGhpcy50cmFuc2l0aW9uKSxlLm5vdyl9dW50cmFuc2l0aW9uZWQoKXtyZXR1cm4gbmV3IFFjKHRoaXMucHJvcGVydHksdGhpcy52YWx1ZSxudWxsLHt9LDApfX0sWmM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuX3Byb3BlcnRpZXM9ZSx0aGlzLl92YWx1ZXM9T2JqZWN0LmNyZWF0ZShlLmRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzKSx0aGlzLl9nbG9iYWxTdGF0ZT1uLHRoaXMuX3Jvb3RLZXk9dH1fcHJvcGVydHlSb290S2V5KGUpe3JldHVybmAke3RoaXMuX3Jvb3RLZXl9LiR7U3RyaW5nKGUpfWB9aGFzUHJvcGVydHkoZSl7cmV0dXJuIGUgaW4gdGhpcy5fcHJvcGVydGllcy5kZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlc31nZXRWYWx1ZShlKXtyZXR1cm4gUHQodGhpcy5fdmFsdWVzW2VdLnZhbHVlLnZhbHVlKX1zZXRWYWx1ZShlLHQpe09iamVjdC5oYXNPd24odGhpcy5fdmFsdWVzLGUpfHwodGhpcy5fdmFsdWVzW2VdPW5ldyBYYyh0aGlzLl92YWx1ZXNbZV0ucHJvcGVydHksdGhpcy5fcHJvcGVydHlSb290S2V5KGUpLHRoaXMuX2dsb2JhbFN0YXRlKSksdGhpcy5fdmFsdWVzW2VdLnZhbHVlPW5ldyBZYyh0aGlzLl92YWx1ZXNbZV0ucHJvcGVydHksdD09PW51bGw/dm9pZCAwOlB0KHQpLHRoaXMuX3Byb3BlcnR5Um9vdEtleShlKSx0aGlzLl9nbG9iYWxTdGF0ZSl9Z2V0VHJhbnNpdGlvbihlKXtyZXR1cm4gUHQodGhpcy5fdmFsdWVzW2VdLnRyYW5zaXRpb24pfXNldFRyYW5zaXRpb24oZSx0KXtPYmplY3QuaGFzT3duKHRoaXMuX3ZhbHVlcyxlKXx8KHRoaXMuX3ZhbHVlc1tlXT1uZXcgWGModGhpcy5fdmFsdWVzW2VdLnByb3BlcnR5LHRoaXMuX3Byb3BlcnR5Um9vdEtleShlKSx0aGlzLl9nbG9iYWxTdGF0ZSkpLHRoaXMuX3ZhbHVlc1tlXS50cmFuc2l0aW9uPVB0KHQpfHx2b2lkIDB9c2VyaWFsaXplKCl7bGV0IGU9e307Zm9yKGxldCB0IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpe2xldCBuPXRoaXMuZ2V0VmFsdWUodCk7biE9PXZvaWQgMCYmKGVbdF09bik7bGV0IHI9dGhpcy5nZXRUcmFuc2l0aW9uKHQpO3IhPT12b2lkIDAmJihlW2Ake3R9JHtKY31gXT1yKX1yZXR1cm4gZX10cmFuc2l0aW9uZWQoZSx0KXtsZXQgbj1uZXcgJGModGhpcy5fcHJvcGVydGllcyk7Zm9yKGxldCByIG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpbi5fdmFsdWVzW3JdPXRoaXMuX3ZhbHVlc1tyXS50cmFuc2l0aW9uZWQoZSx0Ll92YWx1ZXNbcl0pO3JldHVybiBufXVudHJhbnNpdGlvbmVkKCl7bGV0IGU9bmV3ICRjKHRoaXMuX3Byb3BlcnRpZXMpO2ZvcihsZXQgdCBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKWUuX3ZhbHVlc1t0XT10aGlzLl92YWx1ZXNbdF0udW50cmFuc2l0aW9uZWQoKTtyZXR1cm4gZX19LFFjPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLHIsaSl7dGhpcy5wcm9wZXJ0eT1lLHRoaXMudmFsdWU9dCx0aGlzLmJlZ2luPWkrci5kZWxheXx8MCx0aGlzLmVuZD10aGlzLmJlZ2luK3IuZHVyYXRpb258fDAsZS5zcGVjaWZpY2F0aW9uLnRyYW5zaXRpb24mJihyLmRlbGF5fHxyLmR1cmF0aW9uKSYmKHRoaXMucHJpb3I9bil9cG9zc2libHlFdmFsdWF0ZShlLHQsbil7bGV0IHI9ZS5ub3d8fDAsaT10aGlzLnZhbHVlLnBvc3NpYmx5RXZhbHVhdGUoZSx0LG4pLGE9dGhpcy5wcmlvcjtpZighYSlyZXR1cm4gaTtpZihyPnRoaXMuZW5kfHx0aGlzLnZhbHVlLmlzRGF0YURyaXZlbigpKXJldHVybiB0aGlzLnByaW9yPW51bGwsaTtpZihyPHRoaXMuYmVnaW4pcmV0dXJuIGEucG9zc2libHlFdmFsdWF0ZShlLHQsbik7e2xldCBvPShyLXRoaXMuYmVnaW4pLyh0aGlzLmVuZC10aGlzLmJlZ2luKTtyZXR1cm4gdGhpcy5wcm9wZXJ0eS5pbnRlcnBvbGF0ZShhLnBvc3NpYmx5RXZhbHVhdGUoZSx0LG4pLGksX3QobykpfX19LCRjPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX3Byb3BlcnRpZXM9ZSx0aGlzLl92YWx1ZXM9T2JqZWN0LmNyZWF0ZShlLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXMpfXBvc3NpYmx5RXZhbHVhdGUoZSx0LG4pe2xldCByPW5ldyBubCh0aGlzLl9wcm9wZXJ0aWVzKTtmb3IobGV0IGkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSlyLl92YWx1ZXNbaV09dGhpcy5fdmFsdWVzW2ldLnBvc3NpYmx5RXZhbHVhdGUoZSx0LG4pO3JldHVybiByfWhhc1RyYW5zaXRpb24oKXtmb3IobGV0IGUgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSlpZih0aGlzLl92YWx1ZXNbZV0ucHJpb3IpcmV0dXJuITA7cmV0dXJuITF9fSxlbD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5fcHJvcGVydGllcz1lLHRoaXMuX3ZhbHVlcz1PYmplY3QuY3JlYXRlKGUuZGVmYXVsdFByb3BlcnR5VmFsdWVzKSx0aGlzLl9nbG9iYWxTdGF0ZT1uLHRoaXMuX3Jvb3RLZXk9dH1fcHJvcGVydHlSb290S2V5KGUpe3JldHVybmAke3RoaXMuX3Jvb3RLZXl9LiR7U3RyaW5nKGUpfWB9aGFzVmFsdWUoZSl7cmV0dXJuIHRoaXMuX3ZhbHVlc1tlXS52YWx1ZSE9PXZvaWQgMH1oYXNQcm9wZXJ0eShlKXtyZXR1cm4gZSBpbiB0aGlzLl9wcm9wZXJ0aWVzLmRlZmF1bHRQcm9wZXJ0eVZhbHVlc31nZXRWYWx1ZShlKXtyZXR1cm4gUHQodGhpcy5fdmFsdWVzW2VdLnZhbHVlKX1zZXRWYWx1ZShlLHQpe3RoaXMuX3ZhbHVlc1tlXT1uZXcgWWModGhpcy5fdmFsdWVzW2VdLnByb3BlcnR5LHQ9PT1udWxsP3ZvaWQgMDpQdCh0KSx0aGlzLl9wcm9wZXJ0eVJvb3RLZXkoZSksdGhpcy5fZ2xvYmFsU3RhdGUpfXNlcmlhbGl6ZSgpe2xldCBlPXt9O2ZvcihsZXQgdCBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKXtsZXQgbj10aGlzLmdldFZhbHVlKHQpO24hPT12b2lkIDAmJihlW3RdPW4pfXJldHVybiBlfXBvc3NpYmx5RXZhbHVhdGUoZSx0LG4pe2xldCByPW5ldyBubCh0aGlzLl9wcm9wZXJ0aWVzKTtmb3IobGV0IGkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSlyLl92YWx1ZXNbaV09dGhpcy5fdmFsdWVzW2ldLnBvc3NpYmx5RXZhbHVhdGUoZSx0LG4pO3JldHVybiByfX0sdGw9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMucHJvcGVydHk9ZSx0aGlzLnZhbHVlPXQsdGhpcy5wYXJhbWV0ZXJzPW59aXNDb25zdGFudCgpe3JldHVybiB0aGlzLnZhbHVlLmtpbmQ9PT1gY29uc3RhbnRgfWNvbnN0YW50T3IoZSl7cmV0dXJuIHRoaXMudmFsdWUua2luZD09PWBjb25zdGFudGA/dGhpcy52YWx1ZS52YWx1ZTplfWV2YWx1YXRlKGUsdCxuLHIpe3JldHVybiB0aGlzLnByb3BlcnR5LmV2YWx1YXRlKHRoaXMudmFsdWUsdGhpcy5wYXJhbWV0ZXJzLGUsdCxuLHIpfX0sbmw9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fcHJvcGVydGllcz1lLHRoaXMuX3ZhbHVlcz1PYmplY3QuY3JlYXRlKGUuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzKX1nZXQoZSl7cmV0dXJuIHRoaXMuX3ZhbHVlc1tlXX19O2Z1bmN0aW9uIHJsKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGUubGVuZ3RoO2xldCB0PWU/LnZhbHVlcztyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90Lmxlbmd0aDp2b2lkIDB9ZnVuY3Rpb24gaWwoZSx0KXtsZXQgbj1ybChlKSxyPXJsKHQpO3JldHVybiBuIT09dm9pZCAwJiZyIT09dm9pZCAwJiZuIT09cn12YXIgVz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuc3BlY2lmaWNhdGlvbj1lLHRoaXMubmFtZT10fXBvc3NpYmx5RXZhbHVhdGUoZSx0KXtpZihlLmlzRGF0YURyaXZlbigpKXRocm93IEVycm9yKGBWYWx1ZSBzaG91bGQgbm90IGJlIGRhdGEgZHJpdmVuYCk7cmV0dXJuIGUuZXhwcmVzc2lvbi5ldmFsdWF0ZSh0KX1pbnRlcnBvbGF0ZShlLHQsbil7aWYoaWwoZSx0KSlyZXR1cm4gSXQoYFByb3BlcnR5ICIke3RoaXMubmFtZX0iIGlzIHRyeWluZyB0byBpbnRlcnBvbGF0ZSBhcnJheXMgb2YgZGlmZmVyZW50IGxlbmd0aHMuIFJlbmRlcmluZyBtYXkgJ2p1bXAnLmApLHQ7bGV0IHI9dGhpcy5zcGVjaWZpY2F0aW9uLnR5cGUsaT10aVtyXTtyZXR1cm4gaT9pKGUsdCxuKTplfX0sRz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5zcGVjaWZpY2F0aW9uPWUsdGhpcy5uYW1lPXQsdGhpcy5vdmVycmlkZXM9bn1wb3NzaWJseUV2YWx1YXRlKGUsdCxuLHIpe3JldHVybiBlLmV4cHJlc3Npb24ua2luZD09PWBjb25zdGFudGB8fGUuZXhwcmVzc2lvbi5raW5kPT09YGNhbWVyYWA/bmV3IHRsKHRoaXMse2tpbmQ6YGNvbnN0YW50YCx2YWx1ZTplLmV4cHJlc3Npb24uZXZhbHVhdGUodCxudWxsLHt9LG4scil9LHQpOm5ldyB0bCh0aGlzLGUuZXhwcmVzc2lvbix0KX1pbnRlcnBvbGF0ZShlLHQsbil7aWYoZS52YWx1ZS5raW5kIT09YGNvbnN0YW50YHx8dC52YWx1ZS5raW5kIT09YGNvbnN0YW50YClyZXR1cm4gZTtpZihlLnZhbHVlLnZhbHVlPT09dm9pZCAwfHx0LnZhbHVlLnZhbHVlPT09dm9pZCAwKXJldHVybiBuZXcgdGwodGhpcyx7a2luZDpgY29uc3RhbnRgLHZhbHVlOnZvaWQgMH0sZS5wYXJhbWV0ZXJzKTtpZihpbChlLnZhbHVlLnZhbHVlLHQudmFsdWUudmFsdWUpKXJldHVybiBJdChgUHJvcGVydHkgIiR7dGhpcy5uYW1lfSIgaXMgdHJ5aW5nIHRvIGludGVycG9sYXRlIGFycmF5cyBvZiBkaWZmZXJlbnQgbGVuZ3Rocy4gUmVuZGVyaW5nIG1heSAnanVtcCcuYCksdDtsZXQgcj10aGlzLnNwZWNpZmljYXRpb24udHlwZSxpPXRpW3JdO2lmKGkpe2xldCByPWkoZS52YWx1ZS52YWx1ZSx0LnZhbHVlLnZhbHVlLG4pO3JldHVybiBuZXcgdGwodGhpcyx7a2luZDpgY29uc3RhbnRgLHZhbHVlOnJ9LGUucGFyYW1ldGVycyl9cmV0dXJuIGV9ZXZhbHVhdGUoZSx0LG4scixpLGEpe3JldHVybiBlLmtpbmQ9PT1gY29uc3RhbnRgP2UudmFsdWU6ZS5ldmFsdWF0ZSh0LG4scixpLGEpfX0sYWw9Y2xhc3MgZXh0ZW5kcyBHe3Bvc3NpYmx5RXZhbHVhdGUoZSx0LG4scil7aWYoZS52YWx1ZT09PXZvaWQgMClyZXR1cm4gbmV3IHRsKHRoaXMse2tpbmQ6YGNvbnN0YW50YCx2YWx1ZTp2b2lkIDB9LHQpO2lmKGUuZXhwcmVzc2lvbi5raW5kPT09YGNvbnN0YW50YCl7bGV0IGk9ZS5leHByZXNzaW9uLmV2YWx1YXRlKHQsbnVsbCx7fSxuLHIpLGE9ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLnR5cGU9PT1gcmVzb2x2ZWRJbWFnZWAmJnR5cGVvZiBpIT1gc3RyaW5nYD9pLm5hbWU6aSxvPXRoaXMuX2NhbGN1bGF0ZShhLGEsYSx0KTtyZXR1cm4gbmV3IHRsKHRoaXMse2tpbmQ6YGNvbnN0YW50YCx2YWx1ZTpvfSx0KX1pZihlLmV4cHJlc3Npb24ua2luZD09PWBjYW1lcmFgKXtsZXQgbj10aGlzLl9jYWxjdWxhdGUoZS5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOnQuem9vbS0xfSksZS5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOnQuem9vbX0pLGUuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTp0Lnpvb20rMX0pLHQpO3JldHVybiBuZXcgdGwodGhpcyx7a2luZDpgY29uc3RhbnRgLHZhbHVlOm59LHQpfXJldHVybiBuZXcgdGwodGhpcyxlLmV4cHJlc3Npb24sdCl9ZXZhbHVhdGUoZSx0LG4scixpLGEpe2lmKGUua2luZD09PWBzb3VyY2VgKXtsZXQgbz1lLmV2YWx1YXRlKHQsbixyLGksYSk7cmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShvLG8sbyx0KX1yZXR1cm4gZS5raW5kPT09YGNvbXBvc2l0ZWA/dGhpcy5fY2FsY3VsYXRlKGUuZXZhbHVhdGUoe3pvb206TWF0aC5mbG9vcih0Lnpvb20pLTF9LG4sciksZS5ldmFsdWF0ZSh7em9vbTpNYXRoLmZsb29yKHQuem9vbSl9LG4sciksZS5ldmFsdWF0ZSh7em9vbTpNYXRoLmZsb29yKHQuem9vbSkrMX0sbixyKSx0KTplLnZhbHVlfV9jYWxjdWxhdGUoZSx0LG4scil7cmV0dXJuIHIuem9vbT5yLnpvb21IaXN0b3J5Lmxhc3RJbnRlZ2VyWm9vbT97ZnJvbTplLHRvOnR9Ontmcm9tOm4sdG86dH19aW50ZXJwb2xhdGUoZSl7cmV0dXJuIGV9fSxvbD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuc3BlY2lmaWNhdGlvbj1lLHRoaXMubmFtZT10fXBvc3NpYmx5RXZhbHVhdGUoZSx0LG4scil7aWYoZS52YWx1ZSE9PXZvaWQgMCl7aWYoZS5leHByZXNzaW9uLmtpbmQ9PT1gY29uc3RhbnRgKXtsZXQgaT1lLmV4cHJlc3Npb24uZXZhbHVhdGUodCxudWxsLHt9LG4scik7cmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShpLGksaSx0KX1yZXR1cm4gdGhpcy5fY2FsY3VsYXRlKGUuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgVShNYXRoLmZsb29yKHQuem9vbS0xKSx0KSksZS5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBVKE1hdGguZmxvb3IodC56b29tKSx0KSksZS5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBVKE1hdGguZmxvb3IodC56b29tKzEpLHQpKSx0KX19X2NhbGN1bGF0ZShlLHQsbixyKXtyZXR1cm4gci56b29tPnIuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tP3tmcm9tOmUsdG86dH06e2Zyb206bix0bzp0fX1pbnRlcnBvbGF0ZShlKXtyZXR1cm4gZX19LHNsPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5zcGVjaWZpY2F0aW9uPWUsdGhpcy5uYW1lPXR9cG9zc2libHlFdmFsdWF0ZShlLHQsbixyKXtyZXR1cm4hIWUuZXhwcmVzc2lvbi5ldmFsdWF0ZSh0LG51bGwse30sbixyKX1pbnRlcnBvbGF0ZSgpe3JldHVybiExfX0sY2w9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5wcm9wZXJ0aWVzPWUsdGhpcy5kZWZhdWx0UHJvcGVydHlWYWx1ZXM9e30sdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlcz17fSx0aGlzLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXM9e30sdGhpcy5kZWZhdWx0UG9zc2libHlFdmFsdWF0ZWRWYWx1ZXM9e30sdGhpcy5vdmVycmlkYWJsZVByb3BlcnRpZXM9W107Zm9yKGxldCB0IGluIGUpe2xldCBuPWVbdF07bi5zcGVjaWZpY2F0aW9uLm92ZXJyaWRhYmxlJiZ0aGlzLm92ZXJyaWRhYmxlUHJvcGVydGllcy5wdXNoKHQpO2xldCByPXRoaXMuZGVmYXVsdFByb3BlcnR5VmFsdWVzW3RdPW5ldyBZYyhuLHZvaWQgMCxuLm5hbWUsdm9pZCAwKSxpPXRoaXMuZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXNbdF09bmV3IFhjKG4sbi5uYW1lLHZvaWQgMCk7dGhpcy5kZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzW3RdPWkudW50cmFuc2l0aW9uZWQoKSx0aGlzLmRlZmF1bHRQb3NzaWJseUV2YWx1YXRlZFZhbHVlc1t0XT1yLnBvc3NpYmx5RXZhbHVhdGUoe30pfX19O0goYERhdGFEcml2ZW5Qcm9wZXJ0eWAsRyksSChgRGF0YUNvbnN0YW50UHJvcGVydHlgLFcpLEgoYENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHlgLGFsKSxIKGBDcm9zc0ZhZGVkUHJvcGVydHlgLG9sKSxIKGBDb2xvclJhbXBQcm9wZXJ0eWAsc2wpO2NvbnN0IGxsPWAgaXMgYSBQQUlOVCBwcm9wZXJ0eSBub3QgYSBMQVlPVVQgcHJvcGVydHkuIFVzZSBnZXQvc2V0UGFpbnRQcm9wZXJ0eSBpbnN0ZWFkP2AsdWw9YCBpcyBhIExBWU9VVCBwcm9wZXJ0eSBub3QgYSBQQUlOVCBwcm9wZXJ0eS4gVXNlIGdldC9zZXRMYXlvdXRQcm9wZXJ0eSBpbnN0ZWFkP2A7dmFyIGRsPWNsYXNzIGV4dGVuZHMgTG57Y29uc3RydWN0b3IoZSx0LG4pe2lmKHN1cGVyKCksdGhpcy5pZD1lLmlkLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5fZ2xvYmFsU3RhdGU9bix0aGlzLl9mZWF0dXJlRmlsdGVyPXtmaWx0ZXI6KCk9PiEwLG5lZWRHZW9tZXRyeTohMSxnZXRHbG9iYWxTdGF0ZVJlZnM6KCk9Pm5ldyBTZXR9LHRoaXMuX3Zpc2liaWxpdHlFeHByZXNzaW9uPWxjKHRoaXMudmlzaWJpbGl0eSxgbGF5ZXJzWyR7dGhpcy5pZH1dLmxheW91dC52aXNpYmlsaXR5YCxuKSxlLnR5cGUhPT1gY3VzdG9tYCYmKHRoaXMubWV0YWRhdGE9ZS5tZXRhZGF0YSx0aGlzLm1pbnpvb209ZS5taW56b29tLHRoaXMubWF4em9vbT1lLm1heHpvb20sZS50eXBlIT09YGJhY2tncm91bmRgJiYodGhpcy5zb3VyY2U9ZS5zb3VyY2UsdGhpcy5zb3VyY2VMYXllcj1lW2Bzb3VyY2UtbGF5ZXJgXSx0aGlzLmZpbHRlcj1lLmZpbHRlcix0aGlzLl9mZWF0dXJlRmlsdGVyPXRzKGUuZmlsdGVyLGBsYXllcnNbJHt0aGlzLmlkfV0uZmlsdGVyYCxuKSksdC5sYXlvdXQmJih0aGlzLl91bmV2YWx1YXRlZExheW91dD1uZXcgZWwodC5sYXlvdXQsYGxheWVyc1ske3RoaXMuaWR9XS5sYXlvdXRgLG4pKSx0LnBhaW50KSl7dGhpcy5fdHJhbnNpdGlvbmFibGVQYWludD1uZXcgWmModC5wYWludCxgbGF5ZXJzWyR7dGhpcy5pZH1dLnBhaW50YCxuKTtmb3IobGV0IHQgaW4gZS5wYWludCl0aGlzLnNldFBhaW50UHJvcGVydHkodCxlLnBhaW50W3RdLHt2YWxpZGF0ZTohMX0pO2ZvcihsZXQgdCBpbiBlLmxheW91dCl0aGlzLnNldExheW91dFByb3BlcnR5KHQsZS5sYXlvdXRbdF0se3ZhbGlkYXRlOiExfSk7dGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50PXRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudW50cmFuc2l0aW9uZWQoKSx0aGlzLnBhaW50PW5ldyBubCh0LnBhaW50KX19c2V0RmlsdGVyKGUpe3RoaXMuZmlsdGVyPWUsdGhpcy5fZmVhdHVyZUZpbHRlcj10cyhlLGBsYXllcnNbJHt0aGlzLmlkfV0uZmlsdGVyYCx0aGlzLl9nbG9iYWxTdGF0ZSl9Z2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpe3JldHVybiB0aGlzLl9jcm9zc2ZhZGVQYXJhbWV0ZXJzfWdldExheW91dFByb3BlcnR5KGUpe2lmKGU9PT1gdmlzaWJpbGl0eWApcmV0dXJuIHRoaXMudmlzaWJpbGl0eTtpZih0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Py5oYXNQcm9wZXJ0eShlKSl0aHJvdyBFcnJvcihlK2xsKTtpZighdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQpdGhyb3cgRXJyb3IoYENhbm5vdCBnZXQgbGF5b3V0IHByb3BlcnR5ICIke2V9IiBvbiBsYXllciB0eXBlICIke3RoaXMudHlwZX0iIHdoaWNoIGhhcyBubyBsYXlvdXQgcHJvcGVydGllcy5gKTtyZXR1cm4gdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuZ2V0VmFsdWUoZSl9Z2V0TGF5b3V0QWZmZWN0aW5nR2xvYmFsU3RhdGVSZWZzKCl7bGV0IGU9bmV3IFNldDtmb3IobGV0IHQgb2YgdGhpcy5fdmlzaWJpbGl0eUV4cHJlc3Npb24uZ2V0R2xvYmFsU3RhdGVSZWZzKCkpZS5hZGQodCk7aWYodGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQpZm9yKGxldCB0IGluIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXMpe2xldCBuPXRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXNbdF07Zm9yKGxldCB0IG9mIG4uZ2V0R2xvYmFsU3RhdGVSZWZzKCkpZS5hZGQodCl9Zm9yKGxldCB0IG9mIHRoaXMuX2ZlYXR1cmVGaWx0ZXIuZ2V0R2xvYmFsU3RhdGVSZWZzKCkpZS5hZGQodCk7cmV0dXJuIGV9Z2V0UGFpbnRBZmZlY3RpbmdHbG9iYWxTdGF0ZVJlZnMoKXtsZXQgZT1uZXcgZ2xvYmFsVGhpcy5NYXA7aWYodGhpcy5fdHJhbnNpdGlvbmFibGVQYWludClmb3IobGV0IHQgaW4gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzKXtsZXQgbj10aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbdF0udmFsdWU7Zm9yKGxldCByIG9mIG4uZ2V0R2xvYmFsU3RhdGVSZWZzKCkpe2xldCBpPWUuZ2V0KHIpPz9bXTtpLnB1c2goe25hbWU6dCx2YWx1ZTpuLnZhbHVlfSksZS5zZXQocixpKX19cmV0dXJuIGV9Z2V0VmlzaWJpbGl0eUFmZmVjdGluZ0dsb2JhbFN0YXRlUmVmcygpe3JldHVybiB0aGlzLl92aXNpYmlsaXR5RXhwcmVzc2lvbi5nZXRHbG9iYWxTdGF0ZVJlZnMoKX1zZXRMYXlvdXRQcm9wZXJ0eShlLHQsbj17fSl7aWYoZT09PWB2aXNpYmlsaXR5YCl7dGhpcy52aXNpYmlsaXR5PXQsdGhpcy5fdmlzaWJpbGl0eUV4cHJlc3Npb24uc2V0VmFsdWUodCksdGhpcy5yZWNhbGN1bGF0ZVZpc2liaWxpdHkoKTtyZXR1cm59aWYodGhpcy5fdHJhbnNpdGlvbmFibGVQYWludD8uaGFzUHJvcGVydHkoZSkpe3RoaXMuZmlyZShuZXcgSW4oRXJyb3IoZStsbCkpKTtyZXR1cm59dCE9bnVsbCYmdGhpcy5fdmFsaWRhdGUodWMubGF5b3V0UHJvcGVydHksYGxheWVycy4ke3RoaXMuaWR9LmxheW91dC4ke2V9YCxlLHQsbil8fHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LnNldFZhbHVlKGUsdCl9Z2V0UGFpbnRQcm9wZXJ0eShlKXtpZihlLmVuZHNXaXRoKGAtdHJhbnNpdGlvbmApKXtsZXQgdD1lLnNsaWNlKDAsLTExKTtpZih0PT09YHZpc2liaWxpdHlgfHx0aGlzLl91bmV2YWx1YXRlZExheW91dD8uaGFzUHJvcGVydHkodCkpdGhyb3cgRXJyb3IoZSt1bCk7cmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuZ2V0VHJhbnNpdGlvbih0KX1pZihlPT09YHZpc2liaWxpdHlgfHx0aGlzLl91bmV2YWx1YXRlZExheW91dD8uaGFzUHJvcGVydHkoZSkpdGhyb3cgRXJyb3IoZSt1bCk7cmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuZ2V0VmFsdWUoZSl9c2V0UGFpbnRQcm9wZXJ0eShlLHQsbj17fSl7aWYoZT09PWB2aXNpYmlsaXR5YHx8dGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQ/Lmhhc1Byb3BlcnR5KGUpKXJldHVybiB0aGlzLmZpcmUobmV3IEluKEVycm9yKGUrdWwpKSksITE7aWYodCE9bnVsbCYmdGhpcy5fdmFsaWRhdGUodWMucGFpbnRQcm9wZXJ0eSxgbGF5ZXJzLiR7dGhpcy5pZH0ucGFpbnQuJHtlfWAsZSx0LG4pKXJldHVybiExO2lmKGUuZW5kc1dpdGgoYC10cmFuc2l0aW9uYCkpcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2V0VHJhbnNpdGlvbihlLnNsaWNlKDAsLTExKSx0fHx2b2lkIDApLCExO3tsZXQgbj10aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbZV0scj1uLnByb3BlcnR5LnNwZWNpZmljYXRpb25bYHByb3BlcnR5LXR5cGVgXT09PWBjcm9zcy1mYWRlZC1kYXRhLWRyaXZlbmAsaT1uLnZhbHVlLmlzRGF0YURyaXZlbigpLGE9bi52YWx1ZTt0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNldFZhbHVlKGUsdCksdGhpcy5faGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUoZSk7bGV0IG89dGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW2VdLnZhbHVlO3JldHVybiBvLmlzRGF0YURyaXZlbigpfHxpfHxyfHx0aGlzLl9oYW5kbGVPdmVycmlkYWJsZVBhaW50UHJvcGVydHlVcGRhdGUoZSxhLG8pfX1faGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUoZSl7fV9oYW5kbGVPdmVycmlkYWJsZVBhaW50UHJvcGVydHlVcGRhdGUoZSx0LG4pe3JldHVybiExfWlzSGlkZGVuKGU9dGhpcy5taW56b29tLHQ9ITEpe3JldHVybiB0aGlzLm1pbnpvb20mJmU8KHQ/TWF0aC5mbG9vcih0aGlzLm1pbnpvb20pOnRoaXMubWluem9vbSl8fHRoaXMubWF4em9vbSYmZT49dGhpcy5tYXh6b29tPyEwOnRoaXMuX2V2YWx1YXRlZFZpc2liaWxpdHk9PT1gbm9uZWB9dXBkYXRlVHJhbnNpdGlvbnMoZSl7dGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50PXRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudHJhbnNpdGlvbmVkKGUsdGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50KX1oYXNUcmFuc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludC5oYXNUcmFuc2l0aW9uKCl9cmVjYWxjdWxhdGVWaXNpYmlsaXR5KCl7dGhpcy5fZXZhbHVhdGVkVmlzaWJpbGl0eT10aGlzLl92aXNpYmlsaXR5RXhwcmVzc2lvbi5ldmFsdWF0ZSgpfXJlY2FsY3VsYXRlKGUsdCl7ZS5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzJiYodGhpcy5fY3Jvc3NmYWRlUGFyYW1ldGVycz1lLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKSksdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQmJih0aGlzLmxheW91dD10aGlzLl91bmV2YWx1YXRlZExheW91dC5wb3NzaWJseUV2YWx1YXRlKGUsdm9pZCAwLHQpKSx0aGlzLnBhaW50PXRoaXMuX3RyYW5zaXRpb25pbmdQYWludC5wb3NzaWJseUV2YWx1YXRlKGUsdm9pZCAwLHQpfXNlcmlhbGl6ZSgpe2xldCBlPXtpZDp0aGlzLmlkLHR5cGU6dGhpcy50eXBlLHNvdXJjZTp0aGlzLnNvdXJjZSwic291cmNlLWxheWVyIjp0aGlzLnNvdXJjZUxheWVyLG1ldGFkYXRhOnRoaXMubWV0YWRhdGEsbWluem9vbTp0aGlzLm1pbnpvb20sbWF4em9vbTp0aGlzLm1heHpvb20sZmlsdGVyOnRoaXMuZmlsdGVyLGxheW91dDp0aGlzLl91bmV2YWx1YXRlZExheW91dD8uc2VyaWFsaXplKCkscGFpbnQ6dGhpcy5fdHJhbnNpdGlvbmFibGVQYWludD8uc2VyaWFsaXplKCl9O3JldHVybiB0aGlzLnZpc2liaWxpdHkmJihlLmxheW91dHx8PXt9LGUubGF5b3V0LnZpc2liaWxpdHk9dGhpcy52aXNpYmlsaXR5KSxNdChlLChlLHQpPT5lIT09dm9pZCAwJiYhKHQ9PT1gbGF5b3V0YCYmIU9iamVjdC5rZXlzKGUpLmxlbmd0aCkmJiEodD09PWBwYWludGAmJiFPYmplY3Qua2V5cyhlKS5sZW5ndGgpKX1fdmFsaWRhdGUoZSx0LG4scixpPXt9KXtyZXR1cm4gaGModGhpcyxlLHtrZXk6dCxsYXllclR5cGU6dGhpcy50eXBlLG9iamVjdEtleTpuLHZhbHVlOnJ9LGkpfWlzM0QoKXtyZXR1cm4hMX1pc1RpbGVDbGlwcGVkKCl7cmV0dXJuITF9aGFzT2Zmc2NyZWVuUGFzcygpe3JldHVybiExfXJlc2l6ZSgpe31pc1N0YXRlRGVwZW5kZW50KCl7Zm9yKGxldCBlIGluIHRoaXMucGFpbnQuX3ZhbHVlcyl7bGV0IHQ9dGhpcy5wYWludC5nZXQoZSk7aWYoISghKHQgaW5zdGFuY2VvZiB0bCl8fCFmbyh0LnByb3BlcnR5LnNwZWNpZmljYXRpb24pKSYmKHQudmFsdWUua2luZD09PWBzb3VyY2VgfHx0LnZhbHVlLmtpbmQ9PT1gY29tcG9zaXRlYCkmJnQudmFsdWUuaXNTdGF0ZURlcGVuZGVudClyZXR1cm4hMH1yZXR1cm4hMX19O2xldCBmbDtjb25zdCBwbD0oKT0+Zmx8fD1uZXcgY2woeyJyYXN0ZXItb3BhY2l0eSI6bmV3IFcoTS5wYWludF9yYXN0ZXJbYHJhc3Rlci1vcGFjaXR5YF0sYHJhc3Rlci1vcGFjaXR5YCksInJhc3Rlci1odWUtcm90YXRlIjpuZXcgVyhNLnBhaW50X3Jhc3RlcltgcmFzdGVyLWh1ZS1yb3RhdGVgXSxgcmFzdGVyLWh1ZS1yb3RhdGVgKSwicmFzdGVyLWJyaWdodG5lc3MtbWluIjpuZXcgVyhNLnBhaW50X3Jhc3RlcltgcmFzdGVyLWJyaWdodG5lc3MtbWluYF0sYHJhc3Rlci1icmlnaHRuZXNzLW1pbmApLCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXgiOm5ldyBXKE0ucGFpbnRfcmFzdGVyW2ByYXN0ZXItYnJpZ2h0bmVzcy1tYXhgXSxgcmFzdGVyLWJyaWdodG5lc3MtbWF4YCksInJhc3Rlci1zYXR1cmF0aW9uIjpuZXcgVyhNLnBhaW50X3Jhc3RlcltgcmFzdGVyLXNhdHVyYXRpb25gXSxgcmFzdGVyLXNhdHVyYXRpb25gKSwicmFzdGVyLWNvbnRyYXN0IjpuZXcgVyhNLnBhaW50X3Jhc3RlcltgcmFzdGVyLWNvbnRyYXN0YF0sYHJhc3Rlci1jb250cmFzdGApLHJlc2FtcGxpbmc6bmV3IFcoTS5wYWludF9yYXN0ZXIucmVzYW1wbGluZyxgcmVzYW1wbGluZ2ApLCJyYXN0ZXItcmVzYW1wbGluZyI6bmV3IFcoTS5wYWludF9yYXN0ZXJbYHJhc3Rlci1yZXNhbXBsaW5nYF0sYHJhc3Rlci1yZXNhbXBsaW5nYCksInJhc3Rlci1mYWRlLWR1cmF0aW9uIjpuZXcgVyhNLnBhaW50X3Jhc3RlcltgcmFzdGVyLWZhZGUtZHVyYXRpb25gXSxgcmFzdGVyLWZhZGUtZHVyYXRpb25gKX0pO3ZhciBtbD17Z2V0IHBhaW50KCl7cmV0dXJuIHBsKCl9fTtjb25zdCBobD1lPT5lLnR5cGU9PT1gcmFzdGVyYDt2YXIgZ2w9Y2xhc3MgZXh0ZW5kcyBkbHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsbWwsdCl9fTtjb25zdCBfbD17SW50ODpJbnQ4QXJyYXksVWludDg6VWludDhBcnJheSxJbnQxNjpJbnQxNkFycmF5LFVpbnQxNjpVaW50MTZBcnJheSxJbnQzMjpJbnQzMkFycmF5LFVpbnQzMjpVaW50MzJBcnJheSxGbG9hdDMyOkZsb2F0MzJBcnJheX07dmFyIHZsPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fc3RydWN0QXJyYXk9ZSx0aGlzLl9wb3MxPXQqdGhpcy5zaXplLHRoaXMuX3BvczI9dGhpcy5fcG9zMS8yLHRoaXMuX3BvczQ9dGhpcy5fcG9zMS80LHRoaXMuX3Bvczg9dGhpcy5fcG9zMS84fX0sSz1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuaXNUcmFuc2ZlcnJlZD0hMSx0aGlzLmNhcGFjaXR5PS0xLHRoaXMucmVzaXplKDApfXN0YXRpYyBzZXJpYWxpemUoZSx0KXtyZXR1cm4gZS5fdHJpbSgpLHQmJihlLmlzVHJhbnNmZXJyZWQ9ITAsdC5wdXNoKGUuYXJyYXlCdWZmZXIpKSx7bGVuZ3RoOmUubGVuZ3RoLGFycmF5QnVmZmVyOmUuYXJyYXlCdWZmZXJ9fXN0YXRpYyBkZXNlcmlhbGl6ZShlKXtsZXQgdD1PYmplY3QuY3JlYXRlKHRoaXMucHJvdG90eXBlKTtyZXR1cm4gdC5hcnJheUJ1ZmZlcj1lLmFycmF5QnVmZmVyLHQubGVuZ3RoPWUubGVuZ3RoLHQuY2FwYWNpdHk9ZS5hcnJheUJ1ZmZlci5ieXRlTGVuZ3RoL3QuYnl0ZXNQZXJFbGVtZW50LHQuX3JlZnJlc2hWaWV3cygpLHR9X3RyaW0oKXt0aGlzLmxlbmd0aCE9PXRoaXMuY2FwYWNpdHkmJih0aGlzLmNhcGFjaXR5PXRoaXMubGVuZ3RoLHRoaXMuYXJyYXlCdWZmZXI9dGhpcy5hcnJheUJ1ZmZlci5zbGljZSgwLHRoaXMubGVuZ3RoKnRoaXMuYnl0ZXNQZXJFbGVtZW50KSx0aGlzLl9yZWZyZXNoVmlld3MoKSl9Y2xlYXIoKXt0aGlzLmxlbmd0aD0wfXJlc2l6ZShlKXt0aGlzLnJlc2VydmUoZSksdGhpcy5sZW5ndGg9ZX1yZXNlcnZlKGUpe2lmKGU+dGhpcy5jYXBhY2l0eSl7dGhpcy5jYXBhY2l0eT1NYXRoLm1heChlLE1hdGguZmxvb3IodGhpcy5jYXBhY2l0eSo1KSwxMjgpLHRoaXMuYXJyYXlCdWZmZXI9bmV3IEFycmF5QnVmZmVyKHRoaXMuY2FwYWNpdHkqdGhpcy5ieXRlc1BlckVsZW1lbnQpO2xldCB0PXRoaXMudWludDg7dGhpcy5fcmVmcmVzaFZpZXdzKCksdCYmdGhpcy51aW50OC5zZXQodCl9fV9yZWZyZXNoVmlld3MoKXt0aHJvdyBFcnJvcihgX3JlZnJlc2hWaWV3cygpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZWFjaCBjb25jcmV0ZSBTdHJ1Y3RBcnJheSBsYXlvdXRgKX1mcmVlQnVmZmVyQWZ0ZXJVcGxvYWQoKXt0aGlzLmFycmF5QnVmZmVyPW5ldyBBcnJheUJ1ZmZlcigwKSx0aGlzLl9yZWZyZXNoVmlld3MoKX19O2Z1bmN0aW9uIHEoZSx0PTEpe2xldCBuPTAscj0wO3JldHVybnttZW1iZXJzOmUubWFwKGU9PntsZXQgaT15bChlLnR5cGUpLGE9bj1ibChuLE1hdGgubWF4KHQsaSkpLG89ZS5jb21wb25lbnRzfHwxO3JldHVybiByPU1hdGgubWF4KHIsaSksbis9aSpvLHtuYW1lOmUubmFtZSx0eXBlOmUudHlwZSxjb21wb25lbnRzOm8sb2Zmc2V0OmF9fSksc2l6ZTpibChuLE1hdGgubWF4KHIsdCkpLGFsaWdubWVudDp0fX1mdW5jdGlvbiB5bChlKXtyZXR1cm4gX2xbZV0uQllURVNfUEVSX0VMRU1FTlR9ZnVuY3Rpb24gYmwoZSx0KXtyZXR1cm4gTWF0aC5jZWlsKGUvdCkqdH12YXIgeGw9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcil9ZW1wbGFjZUJhY2soZSx0KXtsZXQgbj10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUobisxKSx0aGlzLmVtcGxhY2UobixlLHQpfWVtcGxhY2UoZSx0LG4pe2xldCByPWUqMjtyZXR1cm4gdGhpcy5pbnQxNltyKzBdPXQsdGhpcy5pbnQxNltyKzFdPW4sZX19O3hsLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9NCxIKGBTdHJ1Y3RBcnJheUxheW91dDJpNGAseGwpO3ZhciBTbD1jbGFzcyBleHRlbmRzIEt7X3JlZnJlc2hWaWV3cygpe3RoaXMudWludDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy5pbnQxNj1uZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlLHQsbil7bGV0IHI9dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKHIrMSksdGhpcy5lbXBsYWNlKHIsZSx0LG4pfWVtcGxhY2UoZSx0LG4scil7bGV0IGk9ZSozO3JldHVybiB0aGlzLmludDE2W2krMF09dCx0aGlzLmludDE2W2krMV09bix0aGlzLmludDE2W2krMl09cixlfX07U2wucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD02LEgoYFN0cnVjdEFycmF5TGF5b3V0M2k2YCxTbCk7dmFyIENsPWNsYXNzIGV4dGVuZHMgS3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmludDE2PW5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpfWVtcGxhY2VCYWNrKGUsdCxuLHIpe2xldCBpPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShpKzEpLHRoaXMuZW1wbGFjZShpLGUsdCxuLHIpfWVtcGxhY2UoZSx0LG4scixpKXtsZXQgYT1lKjQ7cmV0dXJuIHRoaXMuaW50MTZbYSswXT10LHRoaXMuaW50MTZbYSsxXT1uLHRoaXMuaW50MTZbYSsyXT1yLHRoaXMuaW50MTZbYSszXT1pLGV9fTtDbC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTgsSChgU3RydWN0QXJyYXlMYXlvdXQ0aThgLENsKTt2YXIgd2w9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcil9ZW1wbGFjZUJhY2soZSx0LG4scixpLGEpe2xldCBvPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShvKzEpLHRoaXMuZW1wbGFjZShvLGUsdCxuLHIsaSxhKX1lbXBsYWNlKGUsdCxuLHIsaSxhLG8pe2xldCBzPWUqNjtyZXR1cm4gdGhpcy5pbnQxNltzKzBdPXQsdGhpcy5pbnQxNltzKzFdPW4sdGhpcy5pbnQxNltzKzJdPXIsdGhpcy5pbnQxNltzKzNdPWksdGhpcy5pbnQxNltzKzRdPWEsdGhpcy5pbnQxNltzKzVdPW8sZX19O3dsLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9MTIsSChgU3RydWN0QXJyYXlMYXlvdXQyaTRpMTJgLHdsKTt2YXIgVGw9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcil9ZW1wbGFjZUJhY2soZSx0LG4scixpLGEpe2xldCBvPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShvKzEpLHRoaXMuZW1wbGFjZShvLGUsdCxuLHIsaSxhKX1lbXBsYWNlKGUsdCxuLHIsaSxhLG8pe2xldCBzPWUqNCxjPWUqODtyZXR1cm4gdGhpcy5pbnQxNltzKzBdPXQsdGhpcy5pbnQxNltzKzFdPW4sdGhpcy51aW50OFtjKzRdPXIsdGhpcy51aW50OFtjKzVdPWksdGhpcy51aW50OFtjKzZdPWEsdGhpcy51aW50OFtjKzddPW8sZX19O1RsLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9OCxIKGBTdHJ1Y3RBcnJheUxheW91dDJpNHViOGAsVGwpO3ZhciBFbD1jbGFzcyBleHRlbmRzIEt7X3JlZnJlc2hWaWV3cygpe3RoaXMudWludDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy5mbG9hdDMyPW5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcil9ZW1wbGFjZUJhY2soZSx0KXtsZXQgbj10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUobisxKSx0aGlzLmVtcGxhY2UobixlLHQpfWVtcGxhY2UoZSx0LG4pe2xldCByPWUqMjtyZXR1cm4gdGhpcy5mbG9hdDMyW3IrMF09dCx0aGlzLmZsb2F0MzJbcisxXT1uLGV9fTtFbC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTgsSChgU3RydWN0QXJyYXlMYXlvdXQyZjhgLEVsKTt2YXIgRGw9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDE2PW5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlLHQsbixyLGksYSxvLHMsYyxsKXtsZXQgdT10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUodSsxKSx0aGlzLmVtcGxhY2UodSxlLHQsbixyLGksYSxvLHMsYyxsKX1lbXBsYWNlKGUsdCxuLHIsaSxhLG8scyxjLGwsdSl7bGV0IGQ9ZSoxMDtyZXR1cm4gdGhpcy51aW50MTZbZCswXT10LHRoaXMudWludDE2W2QrMV09bix0aGlzLnVpbnQxNltkKzJdPXIsdGhpcy51aW50MTZbZCszXT1pLHRoaXMudWludDE2W2QrNF09YSx0aGlzLnVpbnQxNltkKzVdPW8sdGhpcy51aW50MTZbZCs2XT1zLHRoaXMudWludDE2W2QrN109Yyx0aGlzLnVpbnQxNltkKzhdPWwsdGhpcy51aW50MTZbZCs5XT11LGV9fTtEbC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTIwLEgoYFN0cnVjdEFycmF5TGF5b3V0MTB1aTIwYCxEbCk7dmFyIE9sPWNsYXNzIGV4dGVuZHMgS3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLnVpbnQxNj1uZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcil9ZW1wbGFjZUJhY2soZSx0LG4scixpLGEsbyxzKXtsZXQgYz10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUoYysxKSx0aGlzLmVtcGxhY2UoYyxlLHQsbixyLGksYSxvLHMpfWVtcGxhY2UoZSx0LG4scixpLGEsbyxzLGMpe2xldCBsPWUqODtyZXR1cm4gdGhpcy51aW50MTZbbCswXT10LHRoaXMudWludDE2W2wrMV09bix0aGlzLnVpbnQxNltsKzJdPXIsdGhpcy51aW50MTZbbCszXT1pLHRoaXMudWludDE2W2wrNF09YSx0aGlzLnVpbnQxNltsKzVdPW8sdGhpcy51aW50MTZbbCs2XT1zLHRoaXMudWludDE2W2wrN109YyxlfX07T2wucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD0xNixIKGBTdHJ1Y3RBcnJheUxheW91dDh1aTE2YCxPbCk7dmFyIGtsPWNsYXNzIGV4dGVuZHMgS3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmludDE2PW5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDE2PW5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlLHQsbixyLGksYSxvLHMsYyxsLHUsZCxmKXtsZXQgcD10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUocCsxKSx0aGlzLmVtcGxhY2UocCxlLHQsbixyLGksYSxvLHMsYyxsLHUsZCxmKX1lbXBsYWNlKGUsdCxuLHIsaSxhLG8scyxjLGwsdSxkLGYscCl7bGV0IG09ZSoxNCxoPWUqNztyZXR1cm4gdGhpcy5pbnQxNlttKzBdPXQsdGhpcy5pbnQxNlttKzFdPW4sdGhpcy5pbnQxNlttKzJdPXIsdGhpcy5pbnQxNlttKzNdPWksdGhpcy51aW50MTZbbSs0XT1hLHRoaXMudWludDE2W20rNV09byx0aGlzLnVpbnQxNlttKzZdPXMsdGhpcy51aW50MTZbbSs3XT1jLHRoaXMuaW50MTZbbSs4XT1sLHRoaXMuaW50MTZbbSs5XT11LHRoaXMuaW50MTZbbSsxMF09ZCx0aGlzLmludDE2W20rMTFdPWYsdGhpcy5mbG9hdDMyW2grNl09cCxlfX07a2wucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD0yOCxIKGBTdHJ1Y3RBcnJheUxheW91dDRpNHVpNGkxZjI4YCxrbCk7dmFyIEFsPWNsYXNzIGV4dGVuZHMgS3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlLHQsbil7bGV0IHI9dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKHIrMSksdGhpcy5lbXBsYWNlKHIsZSx0LG4pfWVtcGxhY2UoZSx0LG4scil7bGV0IGk9ZSozO3JldHVybiB0aGlzLmZsb2F0MzJbaSswXT10LHRoaXMuZmxvYXQzMltpKzFdPW4sdGhpcy5mbG9hdDMyW2krMl09cixlfX07QWwucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD0xMixIKGBTdHJ1Y3RBcnJheUxheW91dDNmMTJgLEFsKTt2YXIgamw9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDMyPW5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlKXtsZXQgdD10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUodCsxKSx0aGlzLmVtcGxhY2UodCxlKX1lbXBsYWNlKGUsdCl7bGV0IG49ZSoxO3JldHVybiB0aGlzLnVpbnQzMltuKzBdPXQsZX19O2psLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9NCxIKGBTdHJ1Y3RBcnJheUxheW91dDF1bDRgLGpsKTt2YXIgTWw9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy51aW50MzI9bmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDE2PW5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlLHQsbixyLGksYSxvLHMsYyl7bGV0IGw9dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKGwrMSksdGhpcy5lbXBsYWNlKGwsZSx0LG4scixpLGEsbyxzLGMpfWVtcGxhY2UoZSx0LG4scixpLGEsbyxzLGMsbCl7bGV0IHU9ZSoxMCxkPWUqNTtyZXR1cm4gdGhpcy5pbnQxNlt1KzBdPXQsdGhpcy5pbnQxNlt1KzFdPW4sdGhpcy5pbnQxNlt1KzJdPXIsdGhpcy5pbnQxNlt1KzNdPWksdGhpcy5pbnQxNlt1KzRdPWEsdGhpcy5pbnQxNlt1KzVdPW8sdGhpcy51aW50MzJbZCszXT1zLHRoaXMudWludDE2W3UrOF09Yyx0aGlzLnVpbnQxNlt1KzldPWwsZX19O01sLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9MjAsSChgU3RydWN0QXJyYXlMYXlvdXQ2aTF1bDJ1aTIwYCxNbCk7dmFyIE5sPWNsYXNzIGV4dGVuZHMgS3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmludDE2PW5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpfWVtcGxhY2VCYWNrKGUsdCxuLHIsaSxhKXtsZXQgbz10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUobysxKSx0aGlzLmVtcGxhY2UobyxlLHQsbixyLGksYSl9ZW1wbGFjZShlLHQsbixyLGksYSxvKXtsZXQgcz1lKjY7cmV0dXJuIHRoaXMuaW50MTZbcyswXT10LHRoaXMuaW50MTZbcysxXT1uLHRoaXMuaW50MTZbcysyXT1yLHRoaXMuaW50MTZbcyszXT1pLHRoaXMuaW50MTZbcys0XT1hLHRoaXMuaW50MTZbcys1XT1vLGV9fTtObC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTEyLEgoYFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTJgLE5sKTt2YXIgUGw9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuZmxvYXQzMj1uZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcil9ZW1wbGFjZUJhY2soZSx0LG4scixpKXtsZXQgYT10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUoYSsxKSx0aGlzLmVtcGxhY2UoYSxlLHQsbixyLGkpfWVtcGxhY2UoZSx0LG4scixpLGEpe2xldCBvPWUqNCxzPWUqODtyZXR1cm4gdGhpcy5mbG9hdDMyW28rMF09dCx0aGlzLmZsb2F0MzJbbysxXT1uLHRoaXMuZmxvYXQzMltvKzJdPXIsdGhpcy5pbnQxNltzKzZdPWksdGhpcy5pbnQxNltzKzddPWEsZX19O1BsLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9MTYsSChgU3RydWN0QXJyYXlMYXlvdXQyZjFmMmkxNmAsUGwpO3ZhciBGbD1jbGFzcyBleHRlbmRzIEt7X3JlZnJlc2hWaWV3cygpe3RoaXMudWludDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy5mbG9hdDMyPW5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy5pbnQxNj1uZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlLHQsbixyLGksYSl7bGV0IG89dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKG8rMSksdGhpcy5lbXBsYWNlKG8sZSx0LG4scixpLGEpfWVtcGxhY2UoZSx0LG4scixpLGEsbyl7bGV0IHM9ZSoxNixjPWUqNCxsPWUqODtyZXR1cm4gdGhpcy51aW50OFtzKzBdPXQsdGhpcy51aW50OFtzKzFdPW4sdGhpcy5mbG9hdDMyW2MrMV09cix0aGlzLmZsb2F0MzJbYysyXT1pLHRoaXMuaW50MTZbbCs2XT1hLHRoaXMuaW50MTZbbCs3XT1vLGV9fTtGbC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTE2LEgoYFN0cnVjdEFycmF5TGF5b3V0MnViMmYyaTE2YCxGbCk7dmFyIElsPWNsYXNzIGV4dGVuZHMgS3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLnVpbnQxNj1uZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcil9ZW1wbGFjZUJhY2soZSx0LG4pe2xldCByPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShyKzEpLHRoaXMuZW1wbGFjZShyLGUsdCxuKX1lbXBsYWNlKGUsdCxuLHIpe2xldCBpPWUqMztyZXR1cm4gdGhpcy51aW50MTZbaSswXT10LHRoaXMudWludDE2W2krMV09bix0aGlzLnVpbnQxNltpKzJdPXIsZX19O0lsLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9NixIKGBTdHJ1Y3RBcnJheUxheW91dDN1aTZgLElsKTt2YXIgTGw9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy51aW50MTY9bmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDMyPW5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlLHQsbixyLGksYSxvLHMsYyxsLHUsZCxmLHAsbSxoLGcsXyl7bGV0IHY9dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKHYrMSksdGhpcy5lbXBsYWNlKHYsZSx0LG4scixpLGEsbyxzLGMsbCx1LGQsZixwLG0saCxnLF8pfWVtcGxhY2UoZSx0LG4scixpLGEsbyxzLGMsbCx1LGQsZixwLG0saCxnLF8sdil7bGV0IHk9ZSoyNixiPWUqMTMseD1lKjUyO3JldHVybiB0aGlzLmludDE2W3krMF09dCx0aGlzLmludDE2W3krMV09bix0aGlzLnVpbnQxNlt5KzJdPXIsdGhpcy51aW50MTZbeSszXT1pLHRoaXMudWludDMyW2IrMl09YSx0aGlzLnVpbnQzMltiKzNdPW8sdGhpcy51aW50MzJbYis0XT1zLHRoaXMudWludDE2W3krMTBdPWMsdGhpcy51aW50MTZbeSsxMV09bCx0aGlzLnVpbnQxNlt5KzEyXT11LHRoaXMuZmxvYXQzMltiKzddPWQsdGhpcy5mbG9hdDMyW2IrOF09Zix0aGlzLnVpbnQ4W3grMzZdPXAsdGhpcy51aW50OFt4KzM3XT1tLHRoaXMudWludDhbeCszOF09aCx0aGlzLnVpbnQzMltiKzEwXT1nLHRoaXMuaW50MTZbeSsyMl09Xyx0aGlzLmZsb2F0MzJbYisxMl09dixlfX07TGwucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD01MixIKGBTdHJ1Y3RBcnJheUxheW91dDJpMnVpM3VsM3VpMmYzdWIxdWwxaTFmNTJgLExsKTt2YXIgUmw9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuaW50MTY9bmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy51aW50MTY9bmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDMyPW5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlLHQsbixyLGksYSxvLHMsYyxsLHUsZCxmLHAsbSxoLGcsXyx2LHksYix4LFMsQyx3LFQsRSxELE8pe2xldCBrPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShrKzEpLHRoaXMuZW1wbGFjZShrLGUsdCxuLHIsaSxhLG8scyxjLGwsdSxkLGYscCxtLGgsZyxfLHYseSxiLHgsUyxDLHcsVCxFLEQsTyl9ZW1wbGFjZShlLHQsbixyLGksYSxvLHMsYyxsLHUsZCxmLHAsbSxoLGcsXyx2LHksYix4LFMsQyx3LFQsRSxELE8sayl7bGV0IEE9ZSozNCxlZT1lKjE3O3JldHVybiB0aGlzLmludDE2W0ErMF09dCx0aGlzLmludDE2W0ErMV09bix0aGlzLmludDE2W0ErMl09cix0aGlzLmludDE2W0ErM109aSx0aGlzLmludDE2W0ErNF09YSx0aGlzLmludDE2W0ErNV09byx0aGlzLmludDE2W0ErNl09cyx0aGlzLmludDE2W0ErN109Yyx0aGlzLnVpbnQxNltBKzhdPWwsdGhpcy51aW50MTZbQSs5XT11LHRoaXMudWludDE2W0ErMTBdPWQsdGhpcy51aW50MTZbQSsxMV09Zix0aGlzLnVpbnQxNltBKzEyXT1wLHRoaXMudWludDE2W0ErMTNdPW0sdGhpcy51aW50MTZbQSsxNF09aCx0aGlzLnVpbnQxNltBKzE1XT1nLHRoaXMudWludDE2W0ErMTZdPV8sdGhpcy51aW50MTZbQSsxN109dix0aGlzLnVpbnQxNltBKzE4XT15LHRoaXMudWludDE2W0ErMTldPWIsdGhpcy51aW50MTZbQSsyMF09eCx0aGlzLnVpbnQxNltBKzIxXT1TLHRoaXMudWludDE2W0ErMjJdPUMsdGhpcy51aW50MzJbZWUrMTJdPXcsdGhpcy5mbG9hdDMyW2VlKzEzXT1ULHRoaXMuZmxvYXQzMltlZSsxNF09RSx0aGlzLnVpbnQxNltBKzMwXT1ELHRoaXMudWludDE2W0ErMzFdPU8sdGhpcy5mbG9hdDMyW2VlKzE2XT1rLGV9fTtSbC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTY4LEgoYFN0cnVjdEFycmF5TGF5b3V0OGkxNXVpMXVsMmYydWkxZjY4YCxSbCk7dmFyIHpsPWNsYXNzIGV4dGVuZHMgS3tfcmVmcmVzaFZpZXdzKCl7dGhpcy51aW50OD1uZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlKXtsZXQgdD10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUodCsxKSx0aGlzLmVtcGxhY2UodCxlKX1lbXBsYWNlKGUsdCl7bGV0IG49ZSoxO3JldHVybiB0aGlzLmZsb2F0MzJbbiswXT10LGV9fTt6bC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTQsSChgU3RydWN0QXJyYXlMYXlvdXQxZjRgLHpsKTt2YXIgQmw9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDE2PW5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKSx0aGlzLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlLHQsbil7bGV0IHI9dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKHIrMSksdGhpcy5lbXBsYWNlKHIsZSx0LG4pfWVtcGxhY2UoZSx0LG4scil7bGV0IGk9ZSo2LGE9ZSozO3JldHVybiB0aGlzLnVpbnQxNltpKzBdPXQsdGhpcy5mbG9hdDMyW2ErMV09bix0aGlzLmZsb2F0MzJbYSsyXT1yLGV9fTtCbC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50PTEyLEgoYFN0cnVjdEFycmF5TGF5b3V0MXVpMmYxMmAsQmwpO3ZhciBWbD1jbGFzcyBleHRlbmRzIEt7X3JlZnJlc2hWaWV3cygpe3RoaXMudWludDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy51aW50MzI9bmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDE2PW5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlLHQsbil7bGV0IHI9dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKHIrMSksdGhpcy5lbXBsYWNlKHIsZSx0LG4pfWVtcGxhY2UoZSx0LG4scil7bGV0IGk9ZSoyLGE9ZSo0O3JldHVybiB0aGlzLnVpbnQzMltpKzBdPXQsdGhpcy51aW50MTZbYSsyXT1uLHRoaXMudWludDE2W2ErM109cixlfX07VmwucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudD04LEgoYFN0cnVjdEFycmF5TGF5b3V0MXVsMnVpOGAsVmwpO3ZhciBIbD1jbGFzcyBleHRlbmRzIEt7X3JlZnJlc2hWaWV3cygpe3RoaXMudWludDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksdGhpcy51aW50MTY9bmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpfWVtcGxhY2VCYWNrKGUsdCl7bGV0IG49dGhpcy5sZW5ndGg7cmV0dXJuIHRoaXMucmVzaXplKG4rMSksdGhpcy5lbXBsYWNlKG4sZSx0KX1lbXBsYWNlKGUsdCxuKXtsZXQgcj1lKjI7cmV0dXJuIHRoaXMudWludDE2W3IrMF09dCx0aGlzLnVpbnQxNltyKzFdPW4sZX19O0hsLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9NCxIKGBTdHJ1Y3RBcnJheUxheW91dDJ1aTRgLEhsKTt2YXIgVWw9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMudWludDE2PW5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKX1lbXBsYWNlQmFjayhlKXtsZXQgdD10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5yZXNpemUodCsxKSx0aGlzLmVtcGxhY2UodCxlKX1lbXBsYWNlKGUsdCl7bGV0IG49ZSoxO3JldHVybiB0aGlzLnVpbnQxNltuKzBdPXQsZX19O1VsLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9MixIKGBTdHJ1Y3RBcnJheUxheW91dDF1aTJgLFVsKTt2YXIgV2w9Y2xhc3MgZXh0ZW5kcyBLe19yZWZyZXNoVmlld3MoKXt0aGlzLnVpbnQ4PW5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLHRoaXMuZmxvYXQzMj1uZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpfWVtcGxhY2VCYWNrKGUsdCxuLHIpe2xldCBpPXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnJlc2l6ZShpKzEpLHRoaXMuZW1wbGFjZShpLGUsdCxuLHIpfWVtcGxhY2UoZSx0LG4scixpKXtsZXQgYT1lKjQ7cmV0dXJuIHRoaXMuZmxvYXQzMlthKzBdPXQsdGhpcy5mbG9hdDMyW2ErMV09bix0aGlzLmZsb2F0MzJbYSsyXT1yLHRoaXMuZmxvYXQzMlthKzNdPWksZX19O1dsLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9MTYsSChgU3RydWN0QXJyYXlMYXlvdXQ0ZjE2YCxXbCk7dmFyIEdsPWNsYXNzIGV4dGVuZHMgdmx7Z2V0IGFuY2hvclBvaW50WCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyKzBdfWdldCBhbmNob3JQb2ludFkoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMisxXX1nZXQgeDEoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMisyXX1nZXQgeTEoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiszXX1nZXQgeDIoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMis0XX1nZXQgeTIoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMis1XX1nZXQgZmVhdHVyZUluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0KzNdfWdldCBzb3VyY2VMYXllckluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzhdfWdldCBidWNrZXRJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMis5XX1nZXQgYW5jaG9yUG9pbnQoKXtyZXR1cm4gbmV3IGwodGhpcy5hbmNob3JQb2ludFgsdGhpcy5hbmNob3JQb2ludFkpfX07R2wucHJvdG90eXBlLnNpemU9MjA7dmFyIEtsPWNsYXNzIGV4dGVuZHMgTWx7Z2V0KGUpe3JldHVybiBuZXcgR2wodGhpcyxlKX19O0goYENvbGxpc2lvbkJveEFycmF5YCxLbCk7dmFyIHFsPWNsYXNzIGV4dGVuZHMgdmx7Z2V0IGFuY2hvclgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiswXX1nZXQgYW5jaG9yWSgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyKzFdfWdldCBnbHlwaFN0YXJ0SW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMl19Z2V0IG51bUdseXBocygpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiszXX1nZXQgdmVydGV4U3RhcnRJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCsyXX1nZXQgbGluZVN0YXJ0SW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQrM119Z2V0IGxpbmVMZW5ndGgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQrNF19Z2V0IHNlZ21lbnQoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMTBdfWdldCBsb3dlclNpemUoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMTFdfWdldCB1cHBlclNpemUoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMTJdfWdldCBsaW5lT2Zmc2V0WCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQrN119Z2V0IGxpbmVPZmZzZXRZKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCs4XX1nZXQgd3JpdGluZ01vZGUoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSszNl19Z2V0IHBsYWNlZE9yaWVudGF0aW9uKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczErMzddfXNldCBwbGFjZWRPcmllbnRhdGlvbihlKXt0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxKzM3XT1lfWdldCBoaWRkZW4oKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSszOF19c2V0IGhpZGRlbihlKXt0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxKzM4XT1lfWdldCBjcm9zc1RpbGVJRCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCsxMF19c2V0IGNyb3NzVGlsZUlEKGUpe3RoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0KzEwXT1lfWdldCBhc3NvY2lhdGVkSWNvbkluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrMjJdfWdldCBoZWlnaHRPZmZzZXQoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0KzEyXX19O3FsLnByb3RvdHlwZS5zaXplPTUyO3ZhciBKbD1jbGFzcyBleHRlbmRzIExse2dldChlKXtyZXR1cm4gbmV3IHFsKHRoaXMsZSl9fTtIKGBQbGFjZWRTeW1ib2xBcnJheWAsSmwpO3ZhciBZbD1jbGFzcyBleHRlbmRzIHZse2dldCBhbmNob3JYKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrMF19Z2V0IGFuY2hvclkoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMisxXX1nZXQgcmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMisyXX1nZXQgY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrM119Z2V0IGxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMis0XX1nZXQgdmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMis1XX1nZXQgcGxhY2VkSWNvblN5bWJvbEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrNl19Z2V0IHZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIrN119Z2V0IGtleSgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMis4XX1nZXQgdGV4dEJveFN0YXJ0SW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrOV19Z2V0IHRleHRCb3hFbmRJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMisxMF19Z2V0IHZlcnRpY2FsVGV4dEJveFN0YXJ0SW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMTFdfWdldCB2ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMisxMl19Z2V0IGljb25Cb3hTdGFydEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzEzXX1nZXQgaWNvbkJveEVuZEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzE0XX1nZXQgdmVydGljYWxJY29uQm94U3RhcnRJbmRleCgpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMisxNV19Z2V0IHZlcnRpY2FsSWNvbkJveEVuZEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzE2XX1nZXQgZmVhdHVyZUluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzE3XX1nZXQgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMThdfWdldCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMTldfWdldCBudW1JY29uVmVydGljZXMoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMjBdfWdldCBudW1WZXJ0aWNhbEljb25WZXJ0aWNlcygpe3JldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMisyMV19Z2V0IHVzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzIyXX1nZXQgY3Jvc3NUaWxlSUQoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQrMTJdfXNldCBjcm9zc1RpbGVJRChlKXt0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCsxMl09ZX1nZXQgdGV4dEJveFNjYWxlKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCsxM119Z2V0IGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCsxNF19Z2V0IHRleHRBbmNob3JPZmZzZXRTdGFydEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzMwXX1nZXQgdGV4dEFuY2hvck9mZnNldEVuZEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzMxXX1nZXQgaGVpZ2h0T2Zmc2V0KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCsxNl19fTtZbC5wcm90b3R5cGUuc2l6ZT02ODt2YXIgWGw9Y2xhc3MgZXh0ZW5kcyBSbHtnZXQoZSl7cmV0dXJuIG5ldyBZbCh0aGlzLGUpfX07SChgU3ltYm9sSW5zdGFuY2VBcnJheWAsWGwpO3ZhciBabD1jbGFzcyBleHRlbmRzIHpse2dldG9mZnNldFgoZSl7cmV0dXJuIHRoaXMuZmxvYXQzMltlKjErMF19fTtIKGBHbHlwaE9mZnNldEFycmF5YCxabCk7dmFyIFFsPWNsYXNzIGV4dGVuZHMgU2x7Z2V0eChlKXtyZXR1cm4gdGhpcy5pbnQxNltlKjMrMF19Z2V0eShlKXtyZXR1cm4gdGhpcy5pbnQxNltlKjMrMV19Z2V0dGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoZSl7cmV0dXJuIHRoaXMuaW50MTZbZSozKzJdfX07SChgU3ltYm9sTGluZVZlcnRleEFycmF5YCxRbCk7dmFyICRsPWNsYXNzIGV4dGVuZHMgdmx7Z2V0IHRleHRBbmNob3IoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMF19Z2V0IHRleHRPZmZzZXQwKCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCsxXX1nZXQgdGV4dE9mZnNldDEoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0KzJdfX07JGwucHJvdG90eXBlLnNpemU9MTI7dmFyIGV1PWNsYXNzIGV4dGVuZHMgQmx7Z2V0KGUpe3JldHVybiBuZXcgJGwodGhpcyxlKX19O0goYFRleHRBbmNob3JPZmZzZXRBcnJheWAsZXUpO3ZhciB0dT1jbGFzcyBleHRlbmRzIHZse2dldCBmZWF0dXJlSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQrMF19Z2V0IHNvdXJjZUxheWVySW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIrMl19Z2V0IGJ1Y2tldEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyKzNdfX07dHUucHJvdG90eXBlLnNpemU9ODt2YXIgbnU9Y2xhc3MgZXh0ZW5kcyBWbHtnZXQoZSl7cmV0dXJuIG5ldyB0dSh0aGlzLGUpfX07SChgRmVhdHVyZUluZGV4QXJyYXlgLG51KTt2YXIgcnU9Y2xhc3MgZXh0ZW5kcyB4bHt9LGl1PWNsYXNzIGV4dGVuZHMgU2x7fSxhdT1jbGFzcyBleHRlbmRzIENse30sb3U9Y2xhc3MgZXh0ZW5kcyB4bHt9LHN1PWNsYXNzIGV4dGVuZHMgeGx7fSxjdT1jbGFzcyBleHRlbmRzIHdse30sbHU9Y2xhc3MgZXh0ZW5kcyBUbHt9LHV1PWNsYXNzIGV4dGVuZHMgRWx7fSxkdT1jbGFzcyBleHRlbmRzIERse30sZnU9Y2xhc3MgZXh0ZW5kcyBPbHt9LHB1PWNsYXNzIGV4dGVuZHMga2x7fSxtdT1jbGFzcyBleHRlbmRzIEFse30saHU9Y2xhc3MgZXh0ZW5kcyBqbHt9LGd1PWNsYXNzIGV4dGVuZHMgTmx7fSxfdT1jbGFzcyBleHRlbmRzIFBse30sdnU9Y2xhc3MgZXh0ZW5kcyBGbHt9LHl1PWNsYXNzIGV4dGVuZHMgSWx7fSxidT1jbGFzcyBleHRlbmRzIElse30seHU9Y2xhc3MgZXh0ZW5kcyBIbHt9LFN1PWNsYXNzIGV4dGVuZHMgVWx7fTtjb25zdCBDdT1xKFt7bmFtZTpgYV9wb3NgLGNvbXBvbmVudHM6Mix0eXBlOmBJbnQxNmB9XSw0KSx3dT1DdS5tZW1iZXJzO0N1LnNpemUsQ3UuYWxpZ25tZW50O3ZhciBUdT1jbGFzcyBle2NvbnN0cnVjdG9yKGU9W10pe3RoaXMuX2ZvcmNlTmV3U2VnbWVudE9uTmV4dFByZXBhcmU9ITEsdGhpcy5zZWdtZW50cz1lfXByZXBhcmVTZWdtZW50KHQsbixyLGkpe2xldCBhPXRoaXMuc2VnbWVudHNbdGhpcy5zZWdtZW50cy5sZW5ndGgtMV07cmV0dXJuIHQ+ZS5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCYmSXQoYE1heCB2ZXJ0aWNlcyBwZXIgc2VnbWVudCBpcyAke2UuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEh9OiBidWNrZXQgcmVxdWVzdGVkICR7dH0uIENvbnNpZGVyIHVzaW5nIHRoZSBcYGZpbGxMYXJnZU1lc2hBcnJheXNcYCBmdW5jdGlvbiBpZiB5b3UgcmVxdWlyZSBtZXNoZXMgd2l0aCBtb3JlIHRoYW4gJHtlLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIfSB2ZXJ0aWNlcy5gKSx0aGlzLl9mb3JjZU5ld1NlZ21lbnRPbk5leHRQcmVwYXJlfHwhYXx8YS52ZXJ0ZXhMZW5ndGgrdD5lLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIfHxhLnNvcnRLZXkhPT1pP3RoaXMuY3JlYXRlTmV3U2VnbWVudChuLHIsaSk6YX1jcmVhdGVOZXdTZWdtZW50KGUsdCxuKXtsZXQgcj17dmVydGV4T2Zmc2V0OmUubGVuZ3RoLHByaW1pdGl2ZU9mZnNldDp0Lmxlbmd0aCx2ZXJ0ZXhMZW5ndGg6MCxwcmltaXRpdmVMZW5ndGg6MCx2YW9zOnt9fTtyZXR1cm4gbiE9PXZvaWQgMCYmKHIuc29ydEtleT1uKSx0aGlzLl9mb3JjZU5ld1NlZ21lbnRPbk5leHRQcmVwYXJlPSExLHRoaXMuc2VnbWVudHMucHVzaChyKSxyfWdldE9yQ3JlYXRlTGF0ZXN0U2VnbWVudChlLHQsbil7cmV0dXJuIHRoaXMucHJlcGFyZVNlZ21lbnQoMCxlLHQsbil9Zm9yY2VOZXdTZWdtZW50T25OZXh0UHJlcGFyZSgpe3RoaXMuX2ZvcmNlTmV3U2VnbWVudE9uTmV4dFByZXBhcmU9ITB9Z2V0KCl7cmV0dXJuIHRoaXMuc2VnbWVudHN9ZGVzdHJveSgpe2ZvcihsZXQgZSBvZiB0aGlzLnNlZ21lbnRzKWZvcihsZXQgdCBpbiBlLnZhb3MpZS52YW9zW3RdLmRlc3Ryb3koKX1zdGF0aWMgc2ltcGxlU2VnbWVudCh0LG4scixpKXtyZXR1cm4gbmV3IGUoW3t2ZXJ0ZXhPZmZzZXQ6dCxwcmltaXRpdmVPZmZzZXQ6bix2ZXJ0ZXhMZW5ndGg6cixwcmltaXRpdmVMZW5ndGg6aSx2YW9zOnt9LHNvcnRLZXk6MH1dKX19O1R1Lk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIPTIqKjE2LTEsSChgU2VnbWVudFZlY3RvcmAsVHUpO2Z1bmN0aW9uIEV1KGUsdCl7cmV0dXJuIGU9YnQoTWF0aC5mbG9vcihlKSwwLDI1NSksdD1idChNYXRoLmZsb29yKHQpLDAsMjU1KSwyNTYqZSt0fWNvbnN0IER1PXEoW3tuYW1lOmBhX3BhdHRlcm5fZnJvbWAsY29tcG9uZW50czo0LHR5cGU6YFVpbnQxNmB9LHtuYW1lOmBhX3BhdHRlcm5fdG9gLGNvbXBvbmVudHM6NCx0eXBlOmBVaW50MTZgfSx7bmFtZTpgYV9waXhlbF9yYXRpb19mcm9tYCxjb21wb25lbnRzOjEsdHlwZTpgVWludDE2YH0se25hbWU6YGFfcGl4ZWxfcmF0aW9fdG9gLGNvbXBvbmVudHM6MSx0eXBlOmBVaW50MTZgfV0pLE91PXEoW3tuYW1lOmBhX2Rhc2hhcnJheV9mcm9tYCxjb21wb25lbnRzOjQsdHlwZTpgVWludDE2YH0se25hbWU6YGFfZGFzaGFycmF5X3RvYCxjb21wb25lbnRzOjQsdHlwZTpgVWludDE2YH1dKTt2YXIga3U9bygoKGUsdCk9PntmdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoJjMscj1lLmxlbmd0aC1uLGk9dCxhLG89MzQzMjkxODM1MyxzPTQ2MTg0NTkwNyxjLGw9MDtsPHI7KWM9ZS5jaGFyQ29kZUF0KGwpJjI1NXwoZS5jaGFyQ29kZUF0KCsrbCkmMjU1KTw8OHwoZS5jaGFyQ29kZUF0KCsrbCkmMjU1KTw8MTZ8KGUuY2hhckNvZGVBdCgrK2wpJjI1NSk8PDI0LCsrbCxjPShjJjY1NTM1KSpvKygoKGM+Pj4xNikqbyY2NTUzNSk8PDE2KSY0Mjk0OTY3Mjk1LGM9Yzw8MTV8Yz4+PjE3LGM9KGMmNjU1MzUpKnMrKCgoYz4+PjE2KSpzJjY1NTM1KTw8MTYpJjQyOTQ5NjcyOTUsaV49YyxpPWk8PDEzfGk+Pj4xOSxhPShpJjY1NTM1KSo1KygoKGk+Pj4xNikqNSY2NTUzNSk8PDE2KSY0Mjk0OTY3Mjk1LGk9KGEmNjU1MzUpKzI3NDkyKygoKGE+Pj4xNikrNTg5NjQmNjU1MzUpPDwxNik7c3dpdGNoKGM9MCxuKXtjYXNlIDM6Y149KGUuY2hhckNvZGVBdChsKzIpJjI1NSk8PDE2O2Nhc2UgMjpjXj0oZS5jaGFyQ29kZUF0KGwrMSkmMjU1KTw8ODtjYXNlIDE6Y149ZS5jaGFyQ29kZUF0KGwpJjI1NSxjPShjJjY1NTM1KSpvKygoKGM+Pj4xNikqbyY2NTUzNSk8PDE2KSY0Mjk0OTY3Mjk1LGM9Yzw8MTV8Yz4+PjE3LGM9KGMmNjU1MzUpKnMrKCgoYz4+PjE2KSpzJjY1NTM1KTw8MTYpJjQyOTQ5NjcyOTUsaV49Y31yZXR1cm4gaV49ZS5sZW5ndGgsaV49aT4+PjE2LGk9KGkmNjU1MzUpKjIyNDY4MjI1MDcrKCgoaT4+PjE2KSoyMjQ2ODIyNTA3JjY1NTM1KTw8MTYpJjQyOTQ5NjcyOTUsaV49aT4+PjEzLGk9KGkmNjU1MzUpKjMyNjY0ODk5MDkrKCgoaT4+PjE2KSozMjY2NDg5OTA5JjY1NTM1KTw8MTYpJjQyOTQ5NjcyOTUsaV49aT4+PjE2LGk+Pj4wfXQhPT12b2lkIDAmJih0LmV4cG9ydHM9bil9KSksQXU9bygoKGUsdCk9PntmdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9dF5uLGk9MCxhO24+PTQ7KWE9ZS5jaGFyQ29kZUF0KGkpJjI1NXwoZS5jaGFyQ29kZUF0KCsraSkmMjU1KTw8OHwoZS5jaGFyQ29kZUF0KCsraSkmMjU1KTw8MTZ8KGUuY2hhckNvZGVBdCgrK2kpJjI1NSk8PDI0LGE9KGEmNjU1MzUpKjE1NDA0ODM0NzcrKCgoYT4+PjE2KSoxNTQwNDgzNDc3JjY1NTM1KTw8MTYpLGFePWE+Pj4yNCxhPShhJjY1NTM1KSoxNTQwNDgzNDc3KygoKGE+Pj4xNikqMTU0MDQ4MzQ3NyY2NTUzNSk8PDE2KSxyPShyJjY1NTM1KSoxNTQwNDgzNDc3KygoKHI+Pj4xNikqMTU0MDQ4MzQ3NyY2NTUzNSk8PDE2KV5hLG4tPTQsKytpO3N3aXRjaChuKXtjYXNlIDM6cl49KGUuY2hhckNvZGVBdChpKzIpJjI1NSk8PDE2O2Nhc2UgMjpyXj0oZS5jaGFyQ29kZUF0KGkrMSkmMjU1KTw8ODtjYXNlIDE6cl49ZS5jaGFyQ29kZUF0KGkpJjI1NSxyPShyJjY1NTM1KSoxNTQwNDgzNDc3KygoKHI+Pj4xNikqMTU0MDQ4MzQ3NyY2NTUzNSk8PDE2KX1yZXR1cm4gcl49cj4+PjEzLHI9KHImNjU1MzUpKjE1NDA0ODM0NzcrKCgocj4+PjE2KSoxNTQwNDgzNDc3JjY1NTM1KTw8MTYpLHJePXI+Pj4xNSxyPj4+MH10LmV4cG9ydHM9bn0pKSxqdT1jKG8oKChlLHQpPT57dmFyIG49a3UoKSxyPUF1KCk7dC5leHBvcnRzPW4sdC5leHBvcnRzLm11cm11cjM9bix0LmV4cG9ydHMubXVybXVyMj1yfSkpKCksMSksTXU9Y2xhc3MgZXtjb25zdHJ1Y3Rvcigpe3RoaXMuaWRzPVtdLHRoaXMucG9zaXRpb25zPVtdLHRoaXMuaW5kZXhlZD0hMX1hZGQoZSx0LG4scil7dGhpcy5pZHMucHVzaChOdShlKSksdGhpcy5wb3NpdGlvbnMucHVzaCh0LG4scil9Z2V0UG9zaXRpb25zKGUpe2lmKCF0aGlzLmluZGV4ZWQpdGhyb3cgRXJyb3IoYFRyeWluZyB0byBnZXQgaW5kZXgsIGJ1dCBmZWF0dXJlIHBvc2l0aW9ucyBhcmUgbm90IGluZGV4ZWRgKTtsZXQgdD1OdShlKSxuPTAscj10aGlzLmlkcy5sZW5ndGgtMTtmb3IoO248cjspe2xldCBlPW4rcj4+MTt0aGlzLmlkc1tlXT49dD9yPWU6bj1lKzF9bGV0IGk9W107Zm9yKDt0aGlzLmlkc1tuXT09PXQ7KXtsZXQgZT10aGlzLnBvc2l0aW9uc1szKm5dLHQ9dGhpcy5wb3NpdGlvbnNbMypuKzFdLHI9dGhpcy5wb3NpdGlvbnNbMypuKzJdO2kucHVzaCh7aW5kZXg6ZSxzdGFydDp0LGVuZDpyfSksbisrfXJldHVybiBpfXN0YXRpYyBzZXJpYWxpemUoZSx0KXtsZXQgbj1uZXcgRmxvYXQ2NEFycmF5KGUuaWRzKSxyPW5ldyBVaW50MzJBcnJheShlLnBvc2l0aW9ucyk7cmV0dXJuIFB1KG4sciwwLG4ubGVuZ3RoLTEpLHQmJnQucHVzaChuLmJ1ZmZlcixyLmJ1ZmZlcikse2lkczpuLHBvc2l0aW9uczpyfX1zdGF0aWMgZGVzZXJpYWxpemUodCl7bGV0IG49bmV3IGU7cmV0dXJuIG4uaWRzPXQuaWRzLG4ucG9zaXRpb25zPXQucG9zaXRpb25zLG4uaW5kZXhlZD0hMCxufX07ZnVuY3Rpb24gTnUoZSl7bGV0IHQ9K2U7cmV0dXJuIWlzTmFOKHQpJiZ0PD0yKio1My0xP3Q6KDAsanUuZGVmYXVsdCkoU3RyaW5nKGUpKX1mdW5jdGlvbiBQdShlLHQsbixyKXtmb3IoO248cjspe2xldCBpPWVbbityPj4xXSxhPW4tMSxvPXIrMTtmb3IoOzspe2RvIGErKzt3aGlsZShlW2FdPGkpO2RvIG8tLTt3aGlsZShlW29dPmkpO2lmKGE+PW8pYnJlYWs7RnUoZSxhLG8pLEZ1KHQsMyphLDMqbyksRnUodCwzKmErMSwzKm8rMSksRnUodCwzKmErMiwzKm8rMil9by1uPHItbz8oUHUoZSx0LG4sbyksbj1vKzEpOihQdShlLHQsbysxLHIpLHI9byl9fWZ1bmN0aW9uIEZ1KGUsdCxuKXtsZXQgcj1lW3RdO2VbdF09ZVtuXSxlW25dPXJ9SChgRmVhdHVyZVBvc2l0aW9uTWFwYCxNdSk7dmFyIEl1PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5nbD1lLmdsLHRoaXMubG9jYXRpb249dH19LEx1PWNsYXNzIGV4dGVuZHMgSXV7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXMuY3VycmVudD0wfXNldChlKXt0aGlzLmN1cnJlbnQhPT1lJiYodGhpcy5jdXJyZW50PWUsdGhpcy5nbC51bmlmb3JtMWkodGhpcy5sb2NhdGlvbixlKSl9fSxSdT1jbGFzcyBleHRlbmRzIEl1e2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KSx0aGlzLmN1cnJlbnQ9MH1zZXQoZSl7dGhpcy5jdXJyZW50IT09ZSYmKHRoaXMuY3VycmVudD1lLHRoaXMuZ2wudW5pZm9ybTFmKHRoaXMubG9jYXRpb24sZSkpfX0senU9Y2xhc3MgZXh0ZW5kcyBJdXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy5jdXJyZW50PVswLDBdfXNldChlKXsoZVswXSE9PXRoaXMuY3VycmVudFswXXx8ZVsxXSE9PXRoaXMuY3VycmVudFsxXSkmJih0aGlzLmN1cnJlbnQ9ZSx0aGlzLmdsLnVuaWZvcm0yZih0aGlzLmxvY2F0aW9uLGVbMF0sZVsxXSkpfX0sQnU9Y2xhc3MgZXh0ZW5kcyBJdXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy5jdXJyZW50PVswLDAsMF19c2V0KGUpeyhlWzBdIT09dGhpcy5jdXJyZW50WzBdfHxlWzFdIT09dGhpcy5jdXJyZW50WzFdfHxlWzJdIT09dGhpcy5jdXJyZW50WzJdKSYmKHRoaXMuY3VycmVudD1lLHRoaXMuZ2wudW5pZm9ybTNmKHRoaXMubG9jYXRpb24sZVswXSxlWzFdLGVbMl0pKX19LFZ1PWNsYXNzIGV4dGVuZHMgSXV7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXMuY3VycmVudD1bMCwwLDAsMF19c2V0KGUpeyhlWzBdIT09dGhpcy5jdXJyZW50WzBdfHxlWzFdIT09dGhpcy5jdXJyZW50WzFdfHxlWzJdIT09dGhpcy5jdXJyZW50WzJdfHxlWzNdIT09dGhpcy5jdXJyZW50WzNdKSYmKHRoaXMuY3VycmVudD1lLHRoaXMuZ2wudW5pZm9ybTRmKHRoaXMubG9jYXRpb24sZVswXSxlWzFdLGVbMl0sZVszXSkpfX0sSHU9Y2xhc3MgZXh0ZW5kcyBJdXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy5jdXJyZW50PXoudHJhbnNwYXJlbnR9c2V0KGUpeyhlLnIhPT10aGlzLmN1cnJlbnQucnx8ZS5nIT09dGhpcy5jdXJyZW50Lmd8fGUuYiE9PXRoaXMuY3VycmVudC5ifHxlLmEhPT10aGlzLmN1cnJlbnQuYSkmJih0aGlzLmN1cnJlbnQ9ZSx0aGlzLmdsLnVuaWZvcm00Zih0aGlzLmxvY2F0aW9uLGUucixlLmcsZS5iLGUuYSkpfX0sVXU9Y2xhc3MgZXh0ZW5kcyBJdXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy5jdXJyZW50PVtdfXNldChlKXtpZihlIT10aGlzLmN1cnJlbnQpe3RoaXMuY3VycmVudD1lO2xldCB0PW5ldyBGbG9hdDMyQXJyYXkoZS5sZW5ndGgqNCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdFs0Km5dPWVbbl0ucix0WzQqbisxXT1lW25dLmcsdFs0Km4rMl09ZVtuXS5iLHRbNCpuKzNdPWVbbl0uYTt0aGlzLmdsLnVuaWZvcm00ZnYodGhpcy5sb2NhdGlvbix0KX19fSxXdT1jbGFzcyBleHRlbmRzIEl1e2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KSx0aGlzLmN1cnJlbnQ9W119c2V0KGUpe2lmKGUhPXRoaXMuY3VycmVudCl7dGhpcy5jdXJyZW50PWU7bGV0IHQ9bmV3IEZsb2F0MzJBcnJheShlKTt0aGlzLmdsLnVuaWZvcm0xZnYodGhpcy5sb2NhdGlvbix0KX19fTtjb25zdCBHdT1uZXcgRmxvYXQzMkFycmF5KDE2KTt2YXIgS3U9Y2xhc3MgZXh0ZW5kcyBJdXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy5jdXJyZW50PUd1fXNldChlKXtpZihlWzEyXSE9PXRoaXMuY3VycmVudFsxMl18fGVbMF0hPT10aGlzLmN1cnJlbnRbMF0pe3RoaXMuY3VycmVudD1lLHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLmxvY2F0aW9uLCExLGUpO3JldHVybn1mb3IobGV0IHQ9MTt0PDE2O3QrKylpZihlW3RdIT09dGhpcy5jdXJyZW50W3RdKXt0aGlzLmN1cnJlbnQ9ZSx0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5sb2NhdGlvbiwhMSxlKTticmVha319fTtmdW5jdGlvbiBxdShlKXtyZXR1cm5bRXUoMjU1KmUuciwyNTUqZS5nKSxFdSgyNTUqZS5iLDI1NSplLmEpXX12YXIgSnU9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMudmFsdWU9ZSx0aGlzLnVuaWZvcm1OYW1lcz10Lm1hcChlPT5gdV8ke2V9YCksdGhpcy50eXBlPW59c2V0VW5pZm9ybShlLHQsbil7ZS5zZXQobi5jb25zdGFudE9yKHRoaXMudmFsdWUpKX1nZXRCaW5kaW5nKGUsdCxuKXtyZXR1cm4gdGhpcy50eXBlPT09YGNvbG9yYD9uZXcgSHUoZSx0KTpuZXcgUnUoZSx0KX19LFl1PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy51bmlmb3JtTmFtZXM9dC5tYXAoZT0+YHVfJHtlfWApLHRoaXMucGF0dGVybkZyb209bnVsbCx0aGlzLnBhdHRlcm5Ubz1udWxsLHRoaXMucGl4ZWxSYXRpb0Zyb209MSx0aGlzLnBpeGVsUmF0aW9Ubz0xfXNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhlLHQpe3RoaXMucGl4ZWxSYXRpb0Zyb209dC5waXhlbFJhdGlvLHRoaXMucGl4ZWxSYXRpb1RvPWUucGl4ZWxSYXRpbyx0aGlzLnBhdHRlcm5Gcm9tPXQudGxicix0aGlzLnBhdHRlcm5Ubz1lLnRsYnJ9c2V0Q29uc3RhbnREYXNoUG9zaXRpb25zKGUsdCl7dGhpcy5kYXNoVG89WzAsZS55LGUuaGVpZ2h0LGUud2lkdGhdLHRoaXMuZGFzaEZyb209WzAsdC55LHQuaGVpZ2h0LHQud2lkdGhdfXNldFVuaWZvcm0oZSx0LG4scil7bGV0IGk9bnVsbDtyPT09YHVfcGF0dGVybl90b2A/aT10aGlzLnBhdHRlcm5UbzpyPT09YHVfcGF0dGVybl9mcm9tYD9pPXRoaXMucGF0dGVybkZyb206cj09PWB1X2Rhc2hhcnJheV90b2A/aT10aGlzLmRhc2hUbzpyPT09YHVfZGFzaGFycmF5X2Zyb21gP2k9dGhpcy5kYXNoRnJvbTpyPT09YHVfcGl4ZWxfcmF0aW9fdG9gP2k9dGhpcy5waXhlbFJhdGlvVG86cj09PWB1X3BpeGVsX3JhdGlvX2Zyb21gJiYoaT10aGlzLnBpeGVsUmF0aW9Gcm9tKSxpIT09bnVsbCYmZS5zZXQoaSl9Z2V0QmluZGluZyhlLHQsbil7cmV0dXJuIG4uc3RhcnRzV2l0aChgdV9wYXR0ZXJuYCl8fG4uc3RhcnRzV2l0aChgdV9kYXNoYXJyYXlfYCk/bmV3IFZ1KGUsdCk6bmV3IFJ1KGUsdCl9fSxYdT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbixyKXt0aGlzLmV4cHJlc3Npb249ZSx0aGlzLnR5cGU9bix0aGlzLm1heFZhbHVlPTAsdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXM9dC5tYXAoZT0+KHtuYW1lOmBhXyR7ZX1gLHR5cGU6YEZsb2F0MzJgLGNvbXBvbmVudHM6bj09PWBjb2xvcmA/MjoxLG9mZnNldDowfSkpLHRoaXMucGFpbnRWZXJ0ZXhBcnJheT1uZXcgcn1wb3B1bGF0ZVBhaW50QXJyYXkoZSx0LG4pe2xldCByPXRoaXMucGFpbnRWZXJ0ZXhBcnJheS5sZW5ndGgsaT10aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IFUoMCxuKSx0LHt9LG4uY2Fub25pY2FsLFtdLG4uZm9ybWF0dGVkU2VjdGlvbik7dGhpcy5wYWludFZlcnRleEFycmF5LnJlc2l6ZShlKSx0aGlzLl9zZXRQYWludFZhbHVlKHIsZSxpKX11cGRhdGVQYWludEFycmF5KGUsdCxuLHIsaSl7bGV0IGE9dGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBVKDAsaSksbixyKTt0aGlzLl9zZXRQYWludFZhbHVlKGUsdCxhKX1fc2V0UGFpbnRWYWx1ZShlLHQsbil7aWYodGhpcy50eXBlPT09YGNvbG9yYCl7bGV0IHI9cXUobik7Zm9yKGxldCBuPWU7bjx0O24rKyl0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShuLHJbMF0sclsxXSl9ZWxzZXtmb3IobGV0IHI9ZTtyPHQ7cisrKXRoaXMucGFpbnRWZXJ0ZXhBcnJheS5lbXBsYWNlKHIsbik7dGhpcy5tYXhWYWx1ZT1NYXRoLm1heCh0aGlzLm1heFZhbHVlLE1hdGguYWJzKG4pKX19dXBsb2FkKGUpe3RoaXMucGFpbnRWZXJ0ZXhBcnJheT8uYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCYmKHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXI/LmJ1ZmZlcj90aGlzLnBhaW50VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEodGhpcy5wYWludFZlcnRleEFycmF5KTp0aGlzLnBhaW50VmVydGV4QnVmZmVyPWUuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSx0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyx0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCkpfWRlc3Ryb3koKXt0aGlzLnBhaW50VmVydGV4QnVmZmVyJiZ0aGlzLnBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKX19LFp1PWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLHIsaSxhKXt0aGlzLmV4cHJlc3Npb249ZSx0aGlzLnVuaWZvcm1OYW1lcz10Lm1hcChlPT5gdV8ke2V9X3RgKSx0aGlzLnR5cGU9bix0aGlzLnVzZUludGVnZXJab29tPXIsdGhpcy56b29tPWksdGhpcy5tYXhWYWx1ZT0wLHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzPXQubWFwKGU9Pih7bmFtZTpgYV8ke2V9YCx0eXBlOmBGbG9hdDMyYCxjb21wb25lbnRzOm49PT1gY29sb3JgPzQ6MixvZmZzZXQ6MH0pKSx0aGlzLnBhaW50VmVydGV4QXJyYXk9bmV3IGF9cG9wdWxhdGVQYWludEFycmF5KGUsdCxuKXtsZXQgcj10aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IFUodGhpcy56b29tLG4pLHQse30sbi5jYW5vbmljYWwsW10sbi5mb3JtYXR0ZWRTZWN0aW9uKSxpPXRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgVSh0aGlzLnpvb20rMSxuKSx0LHt9LG4uY2Fub25pY2FsLFtdLG4uZm9ybWF0dGVkU2VjdGlvbiksYT10aGlzLnBhaW50VmVydGV4QXJyYXkubGVuZ3RoO3RoaXMucGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUoZSksdGhpcy5fc2V0UGFpbnRWYWx1ZShhLGUscixpKX11cGRhdGVQYWludEFycmF5KGUsdCxuLHIsaSl7bGV0IGE9dGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBVKHRoaXMuem9vbSxpKSxuLHIpLG89dGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBVKHRoaXMuem9vbSsxLGkpLG4scik7dGhpcy5fc2V0UGFpbnRWYWx1ZShlLHQsYSxvKX1fc2V0UGFpbnRWYWx1ZShlLHQsbixyKXtpZih0aGlzLnR5cGU9PT1gY29sb3JgKXtsZXQgaT1xdShuKSxhPXF1KHIpO2ZvcihsZXQgbj1lO248dDtuKyspdGhpcy5wYWludFZlcnRleEFycmF5LmVtcGxhY2UobixpWzBdLGlbMV0sYVswXSxhWzFdKX1lbHNle2ZvcihsZXQgaT1lO2k8dDtpKyspdGhpcy5wYWludFZlcnRleEFycmF5LmVtcGxhY2UoaSxuLHIpO3RoaXMubWF4VmFsdWU9TWF0aC5tYXgodGhpcy5tYXhWYWx1ZSxNYXRoLmFicyhuKSxNYXRoLmFicyhyKSl9fXVwbG9hZChlKXt0aGlzLnBhaW50VmVydGV4QXJyYXk/LmFycmF5QnVmZmVyLmJ5dGVMZW5ndGgmJih0aGlzLnBhaW50VmVydGV4QnVmZmVyPy5idWZmZXI/dGhpcy5wYWludFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSk6dGhpcy5wYWludFZlcnRleEJ1ZmZlcj1lLmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnBhaW50VmVydGV4QXJyYXksdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXMsdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpKX1kZXN0cm95KCl7dGhpcy5wYWludFZlcnRleEJ1ZmZlciYmdGhpcy5wYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCl9c2V0VW5pZm9ybShlLHQpe2xldCBuPXRoaXMudXNlSW50ZWdlclpvb20/TWF0aC5mbG9vcih0Lnpvb20pOnQuem9vbSxyPWJ0KHRoaXMuZXhwcmVzc2lvbi5pbnRlcnBvbGF0aW9uRmFjdG9yKG4sdGhpcy56b29tLHRoaXMuem9vbSsxKSwwLDEpO2Uuc2V0KHIpfWdldEJpbmRpbmcoZSx0LG4pe3JldHVybiBuZXcgUnUoZSx0KX19LFF1PWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLHIsaSxhKXt0aGlzLmV4cHJlc3Npb249ZSx0aGlzLnR5cGU9dCx0aGlzLnVzZUludGVnZXJab29tPW4sdGhpcy56b29tPXIsdGhpcy5sYXllcklkPWEsdGhpcy56b29tSW5QYWludFZlcnRleEFycmF5PW5ldyBpLHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXk9bmV3IGl9cG9wdWxhdGVQYWludEFycmF5KGUsdCxuKXtsZXQgcj10aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkubGVuZ3RoO3RoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUoZSksdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUoZSksdGhpcy5fc2V0UGFpbnRWYWx1ZXMocixlLHRoaXMuZ2V0UG9zaXRpb25JZHModCksbil9dXBkYXRlUGFpbnRBcnJheShlLHQsbixyLGkpe3RoaXMuX3NldFBhaW50VmFsdWVzKGUsdCx0aGlzLmdldFBvc2l0aW9uSWRzKG4pLGkpfV9zZXRQYWludFZhbHVlcyhlLHQsbixyKXtsZXQgaT10aGlzLmdldFBvc2l0aW9ucyhyKTtpZighaXx8IW4pcmV0dXJuO2xldCBhPWlbbi5taW5dLG89aVtuLm1pZF0scz1pW24ubWF4XTtpZighKCFhfHwhb3x8IXMpKWZvcihsZXQgbj1lO248dDtuKyspdGhpcy5lbXBsYWNlKHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheSxuLGEsbyksdGhpcy5lbXBsYWNlKHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXksbixzLG8pfXVwbG9hZChlKXtpZih0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXk/LmFycmF5QnVmZmVyLmJ5dGVMZW5ndGgmJnRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXk/LmFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpe2xldCB0PXRoaXMuZ2V0VmVydGV4QXR0cmlidXRlcygpO3RoaXMuem9vbUluUGFpbnRWZXJ0ZXhCdWZmZXI9ZS5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy56b29tSW5QYWludFZlcnRleEFycmF5LHQsdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpLHRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyPWUuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXksdCx0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCl9fWRlc3Ryb3koKXt0aGlzLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlciYmdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpLHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhCdWZmZXImJnRoaXMuem9vbUluUGFpbnRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpfX0sJHU9Y2xhc3MgZXh0ZW5kcyBRdXtnZXRQb3NpdGlvbnMoZSl7cmV0dXJuIGUuaW1hZ2VQb3NpdGlvbnN9Z2V0UG9zaXRpb25JZHMoZSl7cmV0dXJuIGUucGF0dGVybnM/Llt0aGlzLmxheWVySWRdfWdldFZlcnRleEF0dHJpYnV0ZXMoKXtyZXR1cm4gRHUubWVtYmVyc31lbXBsYWNlKGUsdCxuLHIpe2UuZW1wbGFjZSh0LG4udGxiclswXSxuLnRsYnJbMV0sbi50bGJyWzJdLG4udGxiclszXSxyLnRsYnJbMF0sci50bGJyWzFdLHIudGxiclsyXSxyLnRsYnJbM10sbi5waXhlbFJhdGlvLHIucGl4ZWxSYXRpbyl9fSxlZD1jbGFzcyBleHRlbmRzIFF1e2dldFBvc2l0aW9ucyhlKXtyZXR1cm4gZS5kYXNoUG9zaXRpb25zfWdldFBvc2l0aW9uSWRzKGUpe3JldHVybiBlLmRhc2hlcz8uW3RoaXMubGF5ZXJJZF19Z2V0VmVydGV4QXR0cmlidXRlcygpe3JldHVybiBPdS5tZW1iZXJzfWVtcGxhY2UoZSx0LG4scil7ZS5lbXBsYWNlKHQsMCxuLnksbi5oZWlnaHQsbi53aWR0aCwwLHIueSxyLmhlaWdodCxyLndpZHRoKX19LHRkPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLmJpbmRlcnM9e30sdGhpcy5fYnVmZmVycz1bXTtsZXQgcj1bXTtmb3IobGV0IGkgaW4gZS5wYWludC5fdmFsdWVzKXtpZighbihpKSljb250aW51ZTtsZXQgYT1lLnBhaW50LmdldChpKTtpZighKGEgaW5zdGFuY2VvZiB0bCl8fCFmbyhhLnByb3BlcnR5LnNwZWNpZmljYXRpb24pKWNvbnRpbnVlO2xldCBvPXJkKGksZS50eXBlKSxzPWEudmFsdWUsYz1hLnByb3BlcnR5LnNwZWNpZmljYXRpb24udHlwZSxsPWEucHJvcGVydHkudXNlSW50ZWdlclpvb20sdT1hLnByb3BlcnR5LnNwZWNpZmljYXRpb25bYHByb3BlcnR5LXR5cGVgXSxkPXU9PT1gY3Jvc3MtZmFkZWRgfHx1PT09YGNyb3NzLWZhZGVkLWRhdGEtZHJpdmVuYDtpZihzLmtpbmQ9PT1gY29uc3RhbnRgKXRoaXMuYmluZGVyc1tpXT1kP25ldyBZdShzLnZhbHVlLG8pOm5ldyBKdShzLnZhbHVlLG8sYyksci5wdXNoKGAvdV8ke2l9YCk7ZWxzZSBpZihzLmtpbmQ9PT1gc291cmNlYHx8ZCl7bGV0IG49YWQoaSxjLGBzb3VyY2VgKTt0aGlzLmJpbmRlcnNbaV09ZD9pPT09YGxpbmUtZGFzaGFycmF5YD9uZXcgZWQocyxjLGwsdCxuLGUuaWQpOm5ldyAkdShzLGMsbCx0LG4sZS5pZCk6bmV3IFh1KHMsbyxjLG4pLHIucHVzaChgL2FfJHtpfWApfWVsc2V7bGV0IGU9YWQoaSxjLGBjb21wb3NpdGVgKTt0aGlzLmJpbmRlcnNbaV09bmV3IFp1KHMsbyxjLGwsdCxlKSxyLnB1c2goYC96XyR7aX1gKX19dGhpcy5jYWNoZUtleT1yLnNvcnQoKS5qb2luKGBgKX1nZXRNYXhWYWx1ZShlKXtsZXQgdD10aGlzLmJpbmRlcnNbZV07cmV0dXJuIHQgaW5zdGFuY2VvZiBYdXx8dCBpbnN0YW5jZW9mIFp1P3QubWF4VmFsdWU6MH1wb3B1bGF0ZVBhaW50QXJyYXlzKGUsdCxuKXtmb3IobGV0IHIgaW4gdGhpcy5iaW5kZXJzKXtsZXQgaT10aGlzLmJpbmRlcnNbcl07KGkgaW5zdGFuY2VvZiBYdXx8aSBpbnN0YW5jZW9mIFp1fHxpIGluc3RhbmNlb2YgUXUpJiZpLnBvcHVsYXRlUGFpbnRBcnJheShlLHQsbil9fXNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhlLHQpe2ZvcihsZXQgbiBpbiB0aGlzLmJpbmRlcnMpe2xldCByPXRoaXMuYmluZGVyc1tuXTtyIGluc3RhbmNlb2YgWXUmJnIuc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKGUsdCl9fXNldENvbnN0YW50RGFzaFBvc2l0aW9ucyhlLHQpe2ZvcihsZXQgbiBpbiB0aGlzLmJpbmRlcnMpe2xldCByPXRoaXMuYmluZGVyc1tuXTtyIGluc3RhbmNlb2YgWXUmJnIuc2V0Q29uc3RhbnREYXNoUG9zaXRpb25zKGUsdCl9fXVwZGF0ZVBhaW50QXJyYXlzKGUsdCxuLHIsaSl7bGV0IGE9ITE7Zm9yKGxldCBvIG9mIGUpe2xldCBlPXQuZ2V0UG9zaXRpb25zKG8uaWQpO2ZvcihsZXQgdCBvZiBlKXtsZXQgZT1uLmZlYXR1cmUodC5pbmRleCk7Zm9yKGxldCBuIGluIHRoaXMuYmluZGVycyl7bGV0IHM9dGhpcy5iaW5kZXJzW25dOyhzIGluc3RhbmNlb2YgWHV8fHMgaW5zdGFuY2VvZiBadXx8cyBpbnN0YW5jZW9mIFF1KSYmcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQ9PT0hMCYmKHMuZXhwcmVzc2lvbj1yLnBhaW50LmdldChuKS52YWx1ZSxzLnVwZGF0ZVBhaW50QXJyYXkodC5zdGFydCx0LmVuZCxlLG8uc3RhdGUsaSksYT0hMCl9fX1yZXR1cm4gYX1kZWZpbmVzKCl7bGV0IGU9W107Zm9yKGxldCB0IGluIHRoaXMuYmluZGVycyl7bGV0IG49dGhpcy5iaW5kZXJzW3RdOyhuIGluc3RhbmNlb2YgSnV8fG4gaW5zdGFuY2VvZiBZdSkmJmUucHVzaCguLi5uLnVuaWZvcm1OYW1lcy5tYXAoZT0+YCNkZWZpbmUgSEFTX1VOSUZPUk1fJHtlfWApKX1yZXR1cm4gZX1nZXRCaW5kZXJBdHRyaWJ1dGVzKCl7bGV0IGU9W107Zm9yKGxldCB0IGluIHRoaXMuYmluZGVycyl7bGV0IG49dGhpcy5iaW5kZXJzW3RdO2lmKG4gaW5zdGFuY2VvZiBYdXx8biBpbnN0YW5jZW9mIFp1KWZvcihsZXQgdCBvZiBuLnBhaW50VmVydGV4QXR0cmlidXRlcyllLnB1c2godC5uYW1lKTtlbHNlIGlmKG4gaW5zdGFuY2VvZiBRdSl7bGV0IHQ9bi5nZXRWZXJ0ZXhBdHRyaWJ1dGVzKCk7Zm9yKGxldCBuIG9mIHQpZS5wdXNoKG4ubmFtZSl9fXJldHVybiBlfWdldEJpbmRlclVuaWZvcm1zKCl7bGV0IGU9W107Zm9yKGxldCB0IGluIHRoaXMuYmluZGVycyl7bGV0IG49dGhpcy5iaW5kZXJzW3RdO2lmKG4gaW5zdGFuY2VvZiBKdXx8biBpbnN0YW5jZW9mIFl1fHxuIGluc3RhbmNlb2YgWnUpZm9yKGxldCB0IG9mIG4udW5pZm9ybU5hbWVzKWUucHVzaCh0KX1yZXR1cm4gZX1nZXRQYWludFZlcnRleEJ1ZmZlcnMoKXtyZXR1cm4gdGhpcy5fYnVmZmVyc31nZXRVbmlmb3JtcyhlLHQpe2xldCBuPVtdO2ZvcihsZXQgciBpbiB0aGlzLmJpbmRlcnMpe2xldCBpPXRoaXMuYmluZGVyc1tyXTtpZihpIGluc3RhbmNlb2YgSnV8fGkgaW5zdGFuY2VvZiBZdXx8aSBpbnN0YW5jZW9mIFp1KXtmb3IobGV0IGEgb2YgaS51bmlmb3JtTmFtZXMpaWYodFthXSl7bGV0IG89aS5nZXRCaW5kaW5nKGUsdFthXSxhKTtuLnB1c2goe25hbWU6YSxwcm9wZXJ0eTpyLGJpbmRpbmc6b30pfX19cmV0dXJuIG59c2V0VW5pZm9ybXMoZSx0LG4scil7Zm9yKGxldHtuYW1lOmUscHJvcGVydHk6aSxiaW5kaW5nOmF9b2YgdCl0aGlzLmJpbmRlcnNbaV0uc2V0VW5pZm9ybShhLHIsbi5nZXQoaSksZSl9dXBkYXRlUGFpbnRCdWZmZXJzKGUpe3RoaXMuX2J1ZmZlcnM9W107Zm9yKGxldCB0IGluIHRoaXMuYmluZGVycyl7bGV0IG49dGhpcy5iaW5kZXJzW3RdO2lmKGUmJm4gaW5zdGFuY2VvZiBRdSl7bGV0IHQ9ZS5mcm9tU2NhbGU9PT0yP24uem9vbUluUGFpbnRWZXJ0ZXhCdWZmZXI6bi56b29tT3V0UGFpbnRWZXJ0ZXhCdWZmZXI7dCYmdGhpcy5fYnVmZmVycy5wdXNoKHQpfWVsc2UobiBpbnN0YW5jZW9mIFh1fHxuIGluc3RhbmNlb2YgWnUpJiZuLnBhaW50VmVydGV4QnVmZmVyJiZ0aGlzLl9idWZmZXJzLnB1c2gobi5wYWludFZlcnRleEJ1ZmZlcil9fXVwbG9hZChlKXtmb3IobGV0IHQgaW4gdGhpcy5iaW5kZXJzKXtsZXQgbj10aGlzLmJpbmRlcnNbdF07KG4gaW5zdGFuY2VvZiBYdXx8biBpbnN0YW5jZW9mIFp1fHxuIGluc3RhbmNlb2YgUXUpJiZuLnVwbG9hZChlKX10aGlzLnVwZGF0ZVBhaW50QnVmZmVycygpfWRlc3Ryb3koKXtmb3IobGV0IGUgaW4gdGhpcy5iaW5kZXJzKXtsZXQgdD10aGlzLmJpbmRlcnNbZV07KHQgaW5zdGFuY2VvZiBYdXx8dCBpbnN0YW5jZW9mIFp1fHx0IGluc3RhbmNlb2YgUXUpJiZ0LmRlc3Ryb3koKX19fSxuZD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbj0oKT0+ITApe3RoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zPXt9O2ZvcihsZXQgciBvZiBlKXRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW3IuaWRdPW5ldyB0ZChyLHQsbik7dGhpcy5uZWVkc1VwbG9hZD0hMSx0aGlzLl9mZWF0dXJlTWFwPW5ldyBNdSx0aGlzLl9idWZmZXJPZmZzZXQ9MH1wb3B1bGF0ZVBhaW50QXJyYXlzKGUsdCxuLHIpe2ZvcihsZXQgbiBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyl0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tuXS5wb3B1bGF0ZVBhaW50QXJyYXlzKGUsdCxyKTt0LmlkIT09dm9pZCAwJiZ0aGlzLl9mZWF0dXJlTWFwLmFkZCh0LmlkLG4sdGhpcy5fYnVmZmVyT2Zmc2V0LGUpLHRoaXMuX2J1ZmZlck9mZnNldD1lLHRoaXMubmVlZHNVcGxvYWQ9ITB9dXBkYXRlUGFpbnRBcnJheXMoZSx0LG4scil7Zm9yKGxldCBpIG9mIG4pdGhpcy5uZWVkc1VwbG9hZD10aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tpLmlkXS51cGRhdGVQYWludEFycmF5cyhlLHRoaXMuX2ZlYXR1cmVNYXAsdCxpLHIpfHx0aGlzLm5lZWRzVXBsb2FkfWdldChlKXtyZXR1cm4gdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbZV19dXBsb2FkKGUpe2lmKHRoaXMubmVlZHNVcGxvYWQpe2ZvcihsZXQgdCBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyl0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1t0XS51cGxvYWQoZSk7dGhpcy5uZWVkc1VwbG9hZD0hMX19ZGVzdHJveSgpe2ZvcihsZXQgZSBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyl0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tlXS5kZXN0cm95KCl9fTtmdW5jdGlvbiByZChlLHQpe3JldHVybnsidGV4dC1vcGFjaXR5IjpbYG9wYWNpdHlgXSwiaWNvbi1vcGFjaXR5IjpbYG9wYWNpdHlgXSwidGV4dC1jb2xvciI6W2BmaWxsX2NvbG9yYF0sImljb24tY29sb3IiOltgZmlsbF9jb2xvcmBdLCJ0ZXh0LWhhbG8tY29sb3IiOltgaGFsb19jb2xvcmBdLCJpY29uLWhhbG8tY29sb3IiOltgaGFsb19jb2xvcmBdLCJ0ZXh0LWhhbG8tYmx1ciI6W2BoYWxvX2JsdXJgXSwiaWNvbi1oYWxvLWJsdXIiOltgaGFsb19ibHVyYF0sInRleHQtaGFsby13aWR0aCI6W2BoYWxvX3dpZHRoYF0sImljb24taGFsby13aWR0aCI6W2BoYWxvX3dpZHRoYF0sImxpbmUtZ2FwLXdpZHRoIjpbYGdhcHdpZHRoYF0sImxpbmUtZGFzaGFycmF5IjpbYGRhc2hhcnJheV90b2AsYGRhc2hhcnJheV9mcm9tYF0sImxpbmUtcGF0dGVybiI6W2BwYXR0ZXJuX3RvYCxgcGF0dGVybl9mcm9tYCxgcGl4ZWxfcmF0aW9fdG9gLGBwaXhlbF9yYXRpb19mcm9tYF0sImZpbGwtcGF0dGVybiI6W2BwYXR0ZXJuX3RvYCxgcGF0dGVybl9mcm9tYCxgcGl4ZWxfcmF0aW9fdG9gLGBwaXhlbF9yYXRpb19mcm9tYF0sImZpbGwtZXh0cnVzaW9uLXBhdHRlcm4iOltgcGF0dGVybl90b2AsYHBhdHRlcm5fZnJvbWAsYHBpeGVsX3JhdGlvX3RvYCxgcGl4ZWxfcmF0aW9fZnJvbWBdfVtlXXx8W2UucmVwbGFjZShgJHt0fS1gLGBgKS5yZXBsYWNlKC8tL2csYF9gKV19ZnVuY3Rpb24gaWQoZSl7cmV0dXJueyJsaW5lLXBhdHRlcm4iOntzb3VyY2U6ZHUsY29tcG9zaXRlOmR1fSwiZmlsbC1wYXR0ZXJuIjp7c291cmNlOmR1LGNvbXBvc2l0ZTpkdX0sImZpbGwtZXh0cnVzaW9uLXBhdHRlcm4iOntzb3VyY2U6ZHUsY29tcG9zaXRlOmR1fSwibGluZS1kYXNoYXJyYXkiOntzb3VyY2U6ZnUsY29tcG9zaXRlOmZ1fX1bZV19ZnVuY3Rpb24gYWQoZSx0LG4pe2xldCByPXtjb2xvcjp7c291cmNlOkVsLGNvbXBvc2l0ZTpXbH0sbnVtYmVyOntzb3VyY2U6emwsY29tcG9zaXRlOkVsfX07cmV0dXJuIGlkKGUpPy5bbl18fHJbdF1bbl19SChgQ29uc3RhbnRCaW5kZXJgLEp1KSxIKGBDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXJgLFl1KSxIKGBTb3VyY2VFeHByZXNzaW9uQmluZGVyYCxYdSksSChgQ3Jvc3NGYWRlZFBhdHRlcm5CaW5kZXJgLCR1KSxIKGBDcm9zc0ZhZGVkRGFzaGFycmF5QmluZGVyYCxlZCksSChgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlcmAsWnUpLEgoYFByb2dyYW1Db25maWd1cmF0aW9uYCx0ZCx7b21pdDpbYF9idWZmZXJzYF19KSxIKGBQcm9ncmFtQ29uZmlndXJhdGlvblNldGAsbmQpO2NvbnN0IG9kPTIqKjE0LTEsc2Q9LW9kLTE7ZnVuY3Rpb24gY2QoZSl7bGV0IHQ9ai9lLmV4dGVudCxuPWUubG9hZEdlb21ldHJ5KCk7Zm9yKGxldCBlIG9mIG4pZm9yKGxldCBuIG9mIGUpe2xldCBlPU1hdGgucm91bmQobi54KnQpLHI9TWF0aC5yb3VuZChuLnkqdCk7bi54PWJ0KGUsc2Qsb2QpLG4ueT1idChyLHNkLG9kKSwoZTxuLnh8fGU+bi54KzF8fHI8bi55fHxyPm4ueSsxKSYmSXQoYEdlb21ldHJ5IGV4Y2VlZHMgYWxsb3dlZCBleHRlbnQsIHJlZHVjZSB5b3VyIHZlY3RvciB0aWxlIGJ1ZmZlciBzaXplYCl9cmV0dXJuIG59ZnVuY3Rpb24gbGQoZSx0KXtyZXR1cm57dHlwZTplLnR5cGUsaWQ6ZS5pZCxwcm9wZXJ0aWVzOmUucHJvcGVydGllcyxnZW9tZXRyeTp0P2NkKGUpOltdfX1jb25zdCB1ZD0tMzI3Njg7ZnVuY3Rpb24gZGQoZSx0LG4scixpKXtlLmVtcGxhY2VCYWNrKHVkK3QqOCtyLHVkK24qOCtpKX12YXIgZmQ9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy56b29tPWUuem9vbSx0aGlzLm92ZXJzY2FsaW5nPWUub3ZlcnNjYWxpbmcsdGhpcy5sYXllcnM9ZS5sYXllcnMsdGhpcy5sYXllcklkcz10aGlzLmxheWVycy5tYXAoZT0+ZS5pZCksdGhpcy5pbmRleD1lLmluZGV4LHRoaXMuaGFzRGVwZW5kZW5jaWVzPSExLHRoaXMubGF5b3V0VmVydGV4QXJyYXk9bmV3IG91LHRoaXMuaW5kZXhBcnJheT1uZXcgYnUsdGhpcy5zZWdtZW50cz1uZXcgVHUsdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnM9bmV3IG5kKGUubGF5ZXJzLGUuem9vbSksdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzPXRoaXMubGF5ZXJzLmZpbHRlcihlPT5lLmlzU3RhdGVEZXBlbmRlbnQoKSkubWFwKGU9PmUuaWQpfXBvcHVsYXRlKGUsdCxuKXtsZXQgcj10aGlzLmxheWVyc1swXSxpPVtdLGE9bnVsbCxvPSExLHM9ci50eXBlPT09YGhlYXRtYXBgO2lmKHIudHlwZT09PWBjaXJjbGVgKXtsZXQgZT1yO2E9ZS5sYXlvdXQuZ2V0KGBjaXJjbGUtc29ydC1rZXlgKSxvPSFhLmlzQ29uc3RhbnQoKSxzfHw9ZS5wYWludC5nZXQoYGNpcmNsZS1waXRjaC1hbGlnbm1lbnRgKT09PWBtYXBgfWxldCBjPXM/dC5zdWJkaXZpc2lvbkdyYW51bGFyaXR5LmNpcmNsZToxLGw9bmV3IFUodGhpcy56b29tKSx1PXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeTtmb3IobGV0e2ZlYXR1cmU6dCxpZDpyLGluZGV4OnMsc291cmNlTGF5ZXJJbmRleDpjfW9mIGUpe2xldCBlPWxkKHQsdSk7aWYoIXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLmZpbHRlcihsLGUsbikpY29udGludWU7bGV0IGQ9bz9hLmV2YWx1YXRlKGUse30sbik6dm9pZCAwLGY9e2lkOnIscHJvcGVydGllczp0LnByb3BlcnRpZXMsdHlwZTp0LnR5cGUsc291cmNlTGF5ZXJJbmRleDpjLGluZGV4OnMsZ2VvbWV0cnk6dT9lLmdlb21ldHJ5OmNkKHQpLHBhdHRlcm5zOnt9LHNvcnRLZXk6ZH07aS5wdXNoKGYpfW8mJmkuc29ydCgoZSx0KT0+ZS5zb3J0S2V5LXQuc29ydEtleSk7Zm9yKGxldCByIG9mIGkpe2xldHtnZW9tZXRyeTppLGluZGV4OmEsc291cmNlTGF5ZXJJbmRleDpvfT1yLHM9ZVthXS5mZWF0dXJlO3RoaXMuYWRkRmVhdHVyZShyLGksYSxuLGMpLHQuZmVhdHVyZUluZGV4Lmluc2VydChzLGksYSxvLHRoaXMuaW5kZXgpfX11cGRhdGUoZSx0LG4pe3RoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoJiZ0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyhlLHQsdGhpcy5zdGF0ZURlcGVuZGVudExheWVycyx7aW1hZ2VQb3NpdGlvbnM6bn0pfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGg9PT0wfXVwbG9hZFBlbmRpbmcoKXtyZXR1cm4hdGhpcy51cGxvYWRlZHx8dGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWR9dXBsb2FkKGUpe3RoaXMudXBsb2FkZWR8fCh0aGlzLmxheW91dFZlcnRleEJ1ZmZlcj1lLmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LHd1KSx0aGlzLmluZGV4QnVmZmVyPWUuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KSksdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKGUpLHRoaXMudXBsb2FkZWQ9ITB9ZGVzdHJveSgpe3RoaXMubGF5b3V0VmVydGV4QnVmZmVyJiYodGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpLHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpLHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKSx0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKSl9YWRkRmVhdHVyZShlLHQsbixyLGk9MSl7bGV0IGE7c3dpdGNoKGkpe2Nhc2UgMTphPVswLDddO2JyZWFrO2Nhc2UgMzphPVswLDIsNSw3XTticmVhaztjYXNlIDU6YT1bMCwxLDMsNCw2LDddO2JyZWFrO2Nhc2UgNzphPVswLDEsMiwzLDQsNSw2LDddO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoYEludmFsaWQgY2lyY2xlIGJ1Y2tldCBncmFudWxhcml0eTogJHtpfTsgdmFsaWQgdmFsdWVzIGFyZSAxLCAzLCA1LCA3LmApfWxldCBvPWEubGVuZ3RoO2ZvcihsZXQgbiBvZiB0KWZvcihsZXQgdCBvZiBuKXtsZXQgbj10Lngscj10Lnk7aWYobjwwfHxuPj04MTkyfHxyPDB8fHI+PTgxOTIpY29udGludWU7bGV0IGk9dGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudChvKm8sdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSx0aGlzLmluZGV4QXJyYXksZS5zb3J0S2V5KSxzPWkudmVydGV4TGVuZ3RoO2ZvcihsZXQgZT0wO2U8bztlKyspZm9yKGxldCB0PTA7dDxvO3QrKylkZCh0aGlzLmxheW91dFZlcnRleEFycmF5LG4scixhW3RdLGFbZV0pO2ZvcihsZXQgZT0wO2U8by0xO2UrKylmb3IobGV0IHQ9MDt0PG8tMTt0Kyspe2xldCBuPXMrZSpvK3Qscj1zKyhlKzEpKm8rdDt0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2sobixyKzEsbisxKSx0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2sobixyLHIrMSl9aS52ZXJ0ZXhMZW5ndGgrPW8qbyxpLnByaW1pdGl2ZUxlbmd0aCs9KG8tMSkqKG8tMSkqMn10aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLGUsbix7aW1hZ2VQb3NpdGlvbnM6e30sY2Fub25pY2FsOnJ9KX19O0goYENpcmNsZUJ1Y2tldGAsZmQse29taXQ6W2BsYXllcnNgXX0pO2Z1bmN0aW9uIHBkKGUsdCl7Zm9yKGxldCBuIG9mIGUpaWYoQ2QodCxuKSlyZXR1cm4hMDtmb3IobGV0IG4gb2YgdClpZihDZChlLG4pKXJldHVybiEwO3JldHVybiB2ZChlLHQpfWZ1bmN0aW9uIG1kKGUsdCxuKXtyZXR1cm4gQ2QoZSx0KT8hMDpiZCh0LGUsbil9ZnVuY3Rpb24gaGQoZSx0KXtpZihlLmxlbmd0aD09PTEpcmV0dXJuIFNkKHQsZVswXSk7Zm9yKGxldCBuIG9mIHQpZm9yKGxldCB0IG9mIG4paWYoQ2QoZSx0KSlyZXR1cm4hMDtmb3IobGV0IG4gb2YgZSlpZihTZCh0LG4pKXJldHVybiEwO2ZvcihsZXQgbiBvZiB0KWlmKHZkKGUsbikpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZ2QoZSx0LG4pe2ZvcihsZXQgciBvZiB0KXtpZihlLmxlbmd0aD49Myl7Zm9yKGxldCB0IG9mIHIpaWYoQ2QoZSx0KSlyZXR1cm4hMH1pZihfZChlLHIsbikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gX2QoZSx0LG4pe2lmKGUubGVuZ3RoPjEpe2lmKHZkKGUsdCkpcmV0dXJuITA7Zm9yKGxldCByIG9mIHQpaWYoYmQocixlLG4pKXJldHVybiEwfWZvcihsZXQgciBvZiBlKWlmKGJkKHIsdCxuKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiB2ZChlLHQpe2lmKGUubGVuZ3RoPT09MHx8dC5sZW5ndGg9PT0wKXJldHVybiExO2ZvcihsZXQgbj0wO248ZS5sZW5ndGgtMTtuKyspe2xldCByPWVbbl0saT1lW24rMV07Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aC0xO2UrKyl7bGV0IG49dFtlXSxhPXRbZSsxXTtpZih5ZChyLGksbixhKSlyZXR1cm4hMH19cmV0dXJuITF9ZnVuY3Rpb24geWQoZSx0LG4scil7cmV0dXJuIEx0KGUsbixyKSE9PUx0KHQsbixyKSYmTHQoZSx0LG4pIT09THQoZSx0LHIpfWZ1bmN0aW9uIGJkKGUsdCxuKXtsZXQgcj1uKm47aWYodC5sZW5ndGg9PT0xKXJldHVybiBlLmRpc3RTcXIodFswXSk8cjtmb3IobGV0IG49MTtuPHQubGVuZ3RoO24rKyl7bGV0IGk9dFtuLTFdLGE9dFtuXTtpZih4ZChlLGksYSk8cilyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiB4ZChlLHQsbil7bGV0IHI9dC5kaXN0U3FyKG4pO2lmKHI9PT0wKXJldHVybiBlLmRpc3RTcXIodCk7bGV0IGk9KChlLngtdC54KSoobi54LXQueCkrKGUueS10LnkpKihuLnktdC55KSkvcjtyZXR1cm4gaTwwP2UuZGlzdFNxcih0KTppPjE/ZS5kaXN0U3FyKG4pOmUuZGlzdFNxcihuLnN1Yih0KS5fbXVsdChpKS5fYWRkKHQpKX1mdW5jdGlvbiBTZChlLHQpe2xldCBuPSExLHIsaSxhO2ZvcihsZXQgbyBvZiBlKXtyPW87Zm9yKGxldCBlPTAsbz1yLmxlbmd0aC0xO2U8ci5sZW5ndGg7bz1lKyspaT1yW2VdLGE9cltvXSxpLnk+dC55IT1hLnk+dC55JiZ0Lng8KGEueC1pLngpKih0LnktaS55KS8oYS55LWkueSkraS54JiYobj0hbil9cmV0dXJuIG59ZnVuY3Rpb24gQ2QoZSx0KXtsZXQgbj0hMTtmb3IobGV0IHI9MCxpPWUubGVuZ3RoLTE7cjxlLmxlbmd0aDtpPXIrKyl7bGV0IGE9ZVtyXSxvPWVbaV07YS55PnQueSE9by55PnQueSYmdC54PChvLngtYS54KSoodC55LWEueSkvKG8ueS1hLnkpK2EueCYmKG49IW4pfXJldHVybiBufWZ1bmN0aW9uIHdkKGUsdCxuLHIsaSl7Zm9yKGxldCBhIG9mIGUpaWYodDw9YS54JiZuPD1hLnkmJnI+PWEueCYmaT49YS55KXJldHVybiEwO2xldCBhPVtuZXcgbCh0LG4pLG5ldyBsKHQsaSksbmV3IGwocixpKSxuZXcgbChyLG4pXTtpZihlLmxlbmd0aD4yKXtmb3IobGV0IHQgb2YgYSlpZihDZChlLHQpKXJldHVybiEwfWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGgtMTt0Kyspe2xldCBuPWVbdF0scj1lW3QrMV07aWYoVGQobixyLGEpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFRkKGUsdCxuKXtsZXQgcj1uWzBdLGk9blsyXTtpZihlLng8ci54JiZ0Lng8ci54fHxlLng+aS54JiZ0Lng+aS54fHxlLnk8ci55JiZ0Lnk8ci55fHxlLnk+aS55JiZ0Lnk+aS55KXJldHVybiExO2xldCBhPUx0KGUsdCxuWzBdKTtyZXR1cm4gYSE9PUx0KGUsdCxuWzFdKXx8YSE9PUx0KGUsdCxuWzJdKXx8YSE9PUx0KGUsdCxuWzNdKX1mdW5jdGlvbiBFZChlLHQsbil7bGV0IHI9dC5wYWludC5nZXQoZSkudmFsdWU7cmV0dXJuIHIua2luZD09PWBjb25zdGFudGA/ci52YWx1ZTpuLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQodC5pZCkuZ2V0TWF4VmFsdWUoZSl9ZnVuY3Rpb24gRGQoZSl7cmV0dXJuIE1hdGguc3FydChlWzBdKmVbMF0rZVsxXSplWzFdKX1mdW5jdGlvbiBPZChlLHQsbixyLGkpe2lmKCF0WzBdJiYhdFsxXSlyZXR1cm4gZTtsZXQgYT1sLmNvbnZlcnQodCkuX211bHQoaSk7bj09PWB2aWV3cG9ydGAmJmEuX3JvdGF0ZSgtcik7bGV0IG89W107Zm9yKGxldCB0IG9mIGUpby5wdXNoKHQuc3ViKGEpKTtyZXR1cm4gb31mdW5jdGlvbiBrZChlKXtsZXQgdD1bXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXSxpPXQuYXQoLTEpOyhuPT09MHx8aSYmIXIuZXF1YWxzKGkpKSYmdC5wdXNoKHIpfXJldHVybiB0fWZ1bmN0aW9uIEFkKGUsdCl7bGV0IG49W107Zm9yKGxldCByIG9mIGUpe2xldCBlPWtkKHIpLGk9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl0sYT1lW24tMV0sbz1lW24rMV0scz1uPT09MD9uZXcgbCgwLDApOnIuc3ViKGEpLl91bml0KCkuX3BlcnAoKSxjPW49PT1lLmxlbmd0aC0xP25ldyBsKDAsMCk6by5zdWIocikuX3VuaXQoKS5fcGVycCgpLHU9cy5fYWRkKGMpLl91bml0KCksZD11LngqYy54K3UueSpjLnk7ZCE9PTAmJnUuX211bHQoMS9kKSxpLnB1c2godS5fbXVsdCh0KS5fYWRkKHIpKX1uLnB1c2goaSl9cmV0dXJuIG59ZnVuY3Rpb24gamQoe3F1ZXJ5R2VvbWV0cnk6ZSxzaXplOnR9LG4pe3JldHVybiBtZChlLG4sdCl9ZnVuY3Rpb24gTWQoe3F1ZXJ5R2VvbWV0cnk6ZSxzaXplOnQsdHJhbnNmb3JtOm4sdW53cmFwcGVkVGlsZUlEOnIsZ2V0RWxldmF0aW9uOml9LGEpe3JldHVybiBtZChlLGEsdCoobi5wcm9qZWN0VGlsZUNvb3JkaW5hdGVzKGEueCxhLnkscixpPy4oYS54LGEueSkpLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYS9uLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UpKX1mdW5jdGlvbiBOZCh7cXVlcnlHZW9tZXRyeTplLHNpemU6dCx0cmFuc2Zvcm06bix1bndyYXBwZWRUaWxlSUQ6cixnZXRFbGV2YXRpb246aX0sYSl7bGV0IG89bi5wcm9qZWN0VGlsZUNvb3JkaW5hdGVzKGEueCxhLnkscixpPy4oYS54LGEueSkpLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSxzPXQqKG4uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZS9vKTtyZXR1cm4gbWQoZSxJZChhLG4scixpKSxzKX1mdW5jdGlvbiBQZCh7cXVlcnlHZW9tZXRyeTplLHNpemU6dCx0cmFuc2Zvcm06bix1bndyYXBwZWRUaWxlSUQ6cixnZXRFbGV2YXRpb246aX0sYSl7cmV0dXJuIG1kKGUsSWQoYSxuLHIsaSksdCl9ZnVuY3Rpb24gRmQoe3F1ZXJ5R2VvbWV0cnk6ZSxzaXplOnQsdHJhbnNmb3JtOm4sdW53cmFwcGVkVGlsZUlEOnIsZ2V0RWxldmF0aW9uOmkscGl0Y2hBbGlnbm1lbnQ6YT1gbWFwYCxwaXRjaFNjYWxlOm89YG1hcGB9LHMpe2xldCBjPWE9PT1gbWFwYD9vPT09YG1hcGA/amQ6TWQ6bz09PWBtYXBgP05kOlBkLGw9e3F1ZXJ5R2VvbWV0cnk6ZSxzaXplOnQsdHJhbnNmb3JtOm4sdW53cmFwcGVkVGlsZUlEOnIsZ2V0RWxldmF0aW9uOml9O2ZvcihsZXQgZSBvZiBzKWZvcihsZXQgdCBvZiBlKWlmKGMobCx0KSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBJZChlLHQsbixyKXtsZXQgaT10LnByb2plY3RUaWxlQ29vcmRpbmF0ZXMoZS54LGUueSxuLHI/LihlLngsZS55KSkucG9pbnQ7cmV0dXJuIG5ldyBsKChpLngqLjUrLjUpKnQud2lkdGgsKC1pLnkqLjUrLjUpKnQuaGVpZ2h0KX1mdW5jdGlvbiBMZChlLHQsbixyKXtyZXR1cm4gZS5tYXAoZT0+SWQoZSx0LG4scikpfWxldCBSZDtjb25zdCB6ZD0oKT0+UmR8fD1uZXcgY2woeyJjaXJjbGUtc29ydC1rZXkiOm5ldyBHKE0ubGF5b3V0X2NpcmNsZVtgY2lyY2xlLXNvcnQta2V5YF0sYGNpcmNsZS1zb3J0LWtleWApfSk7bGV0IEJkO2NvbnN0IFZkPSgpPT5CZHx8PW5ldyBjbCh7ImNpcmNsZS1yYWRpdXMiOm5ldyBHKE0ucGFpbnRfY2lyY2xlW2BjaXJjbGUtcmFkaXVzYF0sYGNpcmNsZS1yYWRpdXNgKSwiY2lyY2xlLWNvbG9yIjpuZXcgRyhNLnBhaW50X2NpcmNsZVtgY2lyY2xlLWNvbG9yYF0sYGNpcmNsZS1jb2xvcmApLCJjaXJjbGUtYmx1ciI6bmV3IEcoTS5wYWludF9jaXJjbGVbYGNpcmNsZS1ibHVyYF0sYGNpcmNsZS1ibHVyYCksImNpcmNsZS1vcGFjaXR5IjpuZXcgRyhNLnBhaW50X2NpcmNsZVtgY2lyY2xlLW9wYWNpdHlgXSxgY2lyY2xlLW9wYWNpdHlgKSwiY2lyY2xlLXRyYW5zbGF0ZSI6bmV3IFcoTS5wYWludF9jaXJjbGVbYGNpcmNsZS10cmFuc2xhdGVgXSxgY2lyY2xlLXRyYW5zbGF0ZWApLCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvciI6bmV3IFcoTS5wYWludF9jaXJjbGVbYGNpcmNsZS10cmFuc2xhdGUtYW5jaG9yYF0sYGNpcmNsZS10cmFuc2xhdGUtYW5jaG9yYCksImNpcmNsZS1waXRjaC1zY2FsZSI6bmV3IFcoTS5wYWludF9jaXJjbGVbYGNpcmNsZS1waXRjaC1zY2FsZWBdLGBjaXJjbGUtcGl0Y2gtc2NhbGVgKSwiY2lyY2xlLXBpdGNoLWFsaWdubWVudCI6bmV3IFcoTS5wYWludF9jaXJjbGVbYGNpcmNsZS1waXRjaC1hbGlnbm1lbnRgXSxgY2lyY2xlLXBpdGNoLWFsaWdubWVudGApLCJjaXJjbGUtc3Ryb2tlLXdpZHRoIjpuZXcgRyhNLnBhaW50X2NpcmNsZVtgY2lyY2xlLXN0cm9rZS13aWR0aGBdLGBjaXJjbGUtc3Ryb2tlLXdpZHRoYCksImNpcmNsZS1zdHJva2UtY29sb3IiOm5ldyBHKE0ucGFpbnRfY2lyY2xlW2BjaXJjbGUtc3Ryb2tlLWNvbG9yYF0sYGNpcmNsZS1zdHJva2UtY29sb3JgKSwiY2lyY2xlLXN0cm9rZS1vcGFjaXR5IjpuZXcgRyhNLnBhaW50X2NpcmNsZVtgY2lyY2xlLXN0cm9rZS1vcGFjaXR5YF0sYGNpcmNsZS1zdHJva2Utb3BhY2l0eWApfSk7dmFyIEhkPXtnZXQgcGFpbnQoKXtyZXR1cm4gVmQoKX0sZ2V0IGxheW91dCgpe3JldHVybiB6ZCgpfX07Y29uc3QgVWQ9ZT0+ZS50eXBlPT09YGNpcmNsZWA7dmFyIFdkPWNsYXNzIGV4dGVuZHMgZGx7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLEhkLHQpfWNyZWF0ZUJ1Y2tldChlKXtyZXR1cm4gbmV3IGZkKGUpfXF1ZXJ5UmFkaXVzKGUpe2xldCB0PWU7cmV0dXJuIEVkKGBjaXJjbGUtcmFkaXVzYCx0aGlzLHQpK0VkKGBjaXJjbGUtc3Ryb2tlLXdpZHRoYCx0aGlzLHQpK0RkKHRoaXMucGFpbnQuZ2V0KGBjaXJjbGUtdHJhbnNsYXRlYCkpfXF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUoe3F1ZXJ5R2VvbWV0cnk6ZSxmZWF0dXJlOnQsZmVhdHVyZVN0YXRlOm4sZ2VvbWV0cnk6cix0cmFuc2Zvcm06aSxwaXhlbHNUb1RpbGVVbml0czphLHVud3JhcHBlZFRpbGVJRDpvLGdldEVsZXZhdGlvbjpzfSl7bGV0IGM9T2QoZSx0aGlzLnBhaW50LmdldChgY2lyY2xlLXRyYW5zbGF0ZWApLHRoaXMucGFpbnQuZ2V0KGBjaXJjbGUtdHJhbnNsYXRlLWFuY2hvcmApLC1pLmJlYXJpbmdJblJhZGlhbnMsYSksbD10aGlzLnBhaW50LmdldChgY2lyY2xlLXJhZGl1c2ApLmV2YWx1YXRlKHQsbikrdGhpcy5wYWludC5nZXQoYGNpcmNsZS1zdHJva2Utd2lkdGhgKS5ldmFsdWF0ZSh0LG4pLHU9dGhpcy5wYWludC5nZXQoYGNpcmNsZS1waXRjaC1zY2FsZWApLGQ9dGhpcy5wYWludC5nZXQoYGNpcmNsZS1waXRjaC1hbGlnbm1lbnRgKSxmLHA7cmV0dXJuIGQ9PT1gbWFwYD8oZj1jLHA9bCphKTooZj1MZChjLGksbyxzKSxwPWwpLEZkKHtxdWVyeUdlb21ldHJ5OmYsc2l6ZTpwLHRyYW5zZm9ybTppLHVud3JhcHBlZFRpbGVJRDpvLGdldEVsZXZhdGlvbjpzLHBpdGNoQWxpZ25tZW50OmQscGl0Y2hTY2FsZTp1fSxyKX19LEdkPWNsYXNzIGV4dGVuZHMgZmR7fTtIKGBIZWF0bWFwQnVja2V0YCxHZCx7b21pdDpbYGxheWVyc2BdfSk7bGV0IEtkO2NvbnN0IHFkPSgpPT5LZHx8PW5ldyBjbCh7ImhlYXRtYXAtcmFkaXVzIjpuZXcgRyhNLnBhaW50X2hlYXRtYXBbYGhlYXRtYXAtcmFkaXVzYF0sYGhlYXRtYXAtcmFkaXVzYCksImhlYXRtYXAtd2VpZ2h0IjpuZXcgRyhNLnBhaW50X2hlYXRtYXBbYGhlYXRtYXAtd2VpZ2h0YF0sYGhlYXRtYXAtd2VpZ2h0YCksImhlYXRtYXAtaW50ZW5zaXR5IjpuZXcgVyhNLnBhaW50X2hlYXRtYXBbYGhlYXRtYXAtaW50ZW5zaXR5YF0sYGhlYXRtYXAtaW50ZW5zaXR5YCksImhlYXRtYXAtY29sb3IiOm5ldyBzbChNLnBhaW50X2hlYXRtYXBbYGhlYXRtYXAtY29sb3JgXSxgaGVhdG1hcC1jb2xvcmApLCJoZWF0bWFwLW9wYWNpdHkiOm5ldyBXKE0ucGFpbnRfaGVhdG1hcFtgaGVhdG1hcC1vcGFjaXR5YF0sYGhlYXRtYXAtb3BhY2l0eWApfSk7dmFyIEpkPXtnZXQgcGFpbnQoKXtyZXR1cm4gcWQoKX19O2Z1bmN0aW9uIFlkKGUse3dpZHRoOnQsaGVpZ2h0Om59LHIsaSl7aWYoIWkpaT1uZXcgVWludDhBcnJheSh0Km4qcik7ZWxzZSBpZihpIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpaT1uZXcgVWludDhBcnJheShpLmJ1ZmZlcik7ZWxzZSBpZihpLmxlbmd0aCE9PXQqbipyKXRocm93IFJhbmdlRXJyb3IoYG1pc21hdGNoZWQgaW1hZ2Ugc2l6ZS4gZXhwZWN0ZWQ6ICR7aS5sZW5ndGh9IGJ1dCBnb3Q6ICR7dCpuKnJ9YCk7cmV0dXJuIGUud2lkdGg9dCxlLmhlaWdodD1uLGUuZGF0YT1pLGV9ZnVuY3Rpb24gWGQoZSx7d2lkdGg6dCxoZWlnaHQ6bn0scil7aWYodD09PWUud2lkdGgmJm49PT1lLmhlaWdodClyZXR1cm47bGV0IGk9WWQoe30se3dpZHRoOnQsaGVpZ2h0Om59LHIpO1pkKGUsaSx7eDowLHk6MH0se3g6MCx5OjB9LHt3aWR0aDpNYXRoLm1pbihlLndpZHRoLHQpLGhlaWdodDpNYXRoLm1pbihlLmhlaWdodCxuKX0sciksZS53aWR0aD10LGUuaGVpZ2h0PW4sZS5kYXRhPWkuZGF0YX1mdW5jdGlvbiBaZChlLHQsbixyLGksYSl7aWYoaS53aWR0aD09PTB8fGkuaGVpZ2h0PT09MClyZXR1cm4gdDtpZihpLndpZHRoPmUud2lkdGh8fGkuaGVpZ2h0PmUuaGVpZ2h0fHxuLng+ZS53aWR0aC1pLndpZHRofHxuLnk+ZS5oZWlnaHQtaS5oZWlnaHQpdGhyb3cgUmFuZ2VFcnJvcihgb3V0IG9mIHJhbmdlIHNvdXJjZSBjb29yZGluYXRlcyBmb3IgaW1hZ2UgY29weWApO2lmKGkud2lkdGg+dC53aWR0aHx8aS5oZWlnaHQ+dC5oZWlnaHR8fHIueD50LndpZHRoLWkud2lkdGh8fHIueT50LmhlaWdodC1pLmhlaWdodCl0aHJvdyBSYW5nZUVycm9yKGBvdXQgb2YgcmFuZ2UgZGVzdGluYXRpb24gY29vcmRpbmF0ZXMgZm9yIGltYWdlIGNvcHlgKTtsZXQgbz1lLmRhdGEscz10LmRhdGE7aWYobz09PXMpdGhyb3cgRXJyb3IoYHNyY0RhdGEgZXF1YWxzIGRzdERhdGEsIHNvIGltYWdlIGlzIGFscmVhZHkgY29waWVkYCk7Zm9yKGxldCBjPTA7YzxpLmhlaWdodDtjKyspe2xldCBsPSgobi55K2MpKmUud2lkdGgrbi54KSphLHU9KChyLnkrYykqdC53aWR0aCtyLngpKmE7Zm9yKGxldCBlPTA7ZTxpLndpZHRoKmE7ZSsrKXNbdStlXT1vW2wrZV19cmV0dXJuIHR9dmFyIFFkPWNsYXNzIGV7Y29uc3RydWN0b3IoZSx0KXtZZCh0aGlzLGUsMSx0KX1yZXNpemUoZSl7WGQodGhpcyxlLDEpfWNsb25lKCl7cmV0dXJuIG5ldyBlKHt3aWR0aDp0aGlzLndpZHRoLGhlaWdodDp0aGlzLmhlaWdodH0sbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhKSl9c3RhdGljIGNvcHkoZSx0LG4scixpKXtaZChlLHQsbixyLGksMSl9fSwkZD1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCl7WWQodGhpcyxlLDQsdCl9cmVzaXplKGUpe1hkKHRoaXMsZSw0KX1yZXBsYWNlKGUsdCl7dD90aGlzLmRhdGEuc2V0KGUpOnRoaXMuZGF0YT1lIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIpOmV9Y2xvbmUoKXtyZXR1cm4gbmV3IGUoe3dpZHRoOnRoaXMud2lkdGgsaGVpZ2h0OnRoaXMuaGVpZ2h0fSxuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKX1zdGF0aWMgY29weShlLHQsbixyLGkpe1pkKGUsdCxuLHIsaSw0KX1zZXRQaXhlbChlLHQsbil7bGV0IHI9KGUqdGhpcy53aWR0aCt0KSo0O3RoaXMuZGF0YVtyKzBdPU1hdGgucm91bmQobi5yKjI1NS9uLmEpLHRoaXMuZGF0YVtyKzFdPU1hdGgucm91bmQobi5nKjI1NS9uLmEpLHRoaXMuZGF0YVtyKzJdPU1hdGgucm91bmQobi5iKjI1NS9uLmEpLHRoaXMuZGF0YVtyKzNdPU1hdGgucm91bmQobi5hKjI1NSl9fTtmdW5jdGlvbiBlZihlKXtsZXQgdD1uZXcgVWludDhBcnJheShlLmxlbmd0aCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKz00KXtsZXQgcj1lW24rM107dFtuKzBdPU1hdGgucm91bmQoZVtuKzBdKnIvMjU1KSx0W24rMV09TWF0aC5yb3VuZChlW24rMV0qci8yNTUpLHRbbisyXT1NYXRoLnJvdW5kKGVbbisyXSpyLzI1NSksdFtuKzNdPXJ9cmV0dXJuIHR9SChgQWxwaGFJbWFnZWAsUWQpLEgoYFJHQkFJbWFnZWAsJGQpO2Z1bmN0aW9uIHRmKGUpe2xldCB0PXt9LG49ZS5yZXNvbHV0aW9ufHwyNTYscj1lLmNsaXBzP2UuY2xpcHMubGVuZ3RoOjEsaT1lLmltYWdlfHxuZXcgJGQoe3dpZHRoOm4saGVpZ2h0OnJ9KTtpZighRXQobikpdGhyb3cgRXJyb3IoYHdpZHRoIGlzIG5vdCBhIHBvd2VyIG9mIDIgLSAke259YCk7bGV0IGE9KHIsYSxvKT0+e3RbZS5ldmFsdWF0aW9uS2V5XT1vO2xldCBzPWUuZXhwcmVzc2lvbi5ldmFsdWF0ZSh0KTtpLnNldFBpeGVsKHIvNC9uLGEvNCxzKX07aWYoZS5jbGlwcylmb3IobGV0IHQ9MCxpPTA7dDxyOysrdCxpKz1uKjQpZm9yKGxldCByPTAsbz0wO3I8bjtyKyssbys9NCl7bGV0IHM9ci8obi0xKSx7c3RhcnQ6YyxlbmQ6bH09ZS5jbGlwc1t0XSx1PWMqKDEtcykrbCpzO2EoaSxvLHUpfWVsc2UgZm9yKGxldCBlPTAsdD0wO2U8bjtlKyssdCs9NCl7bGV0IHI9ZS8obi0xKTthKDAsdCxyKX1yZXR1cm4gaX1jb25zdCBuZj1gYmlnLWZiYCxyZj1lPT5lLnR5cGU9PT1gaGVhdG1hcGA7dmFyIGFmPWNsYXNzIGV4dGVuZHMgZGx7Y3JlYXRlQnVja2V0KGUpe3JldHVybiBuZXcgR2QoZSl9Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLEpkLHQpLHRoaXMuaGVhdG1hcEZib3M9bmV3IE1hcCx0aGlzLl91cGRhdGVDb2xvclJhbXAoKX1faGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUoZSl7ZT09PWBoZWF0bWFwLWNvbG9yYCYmdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCl9X3VwZGF0ZUNvbG9yUmFtcCgpe2xldCBlPXRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tgaGVhdG1hcC1jb2xvcmBdLnZhbHVlLmV4cHJlc3Npb247dGhpcy5jb2xvclJhbXA9dGYoe2V4cHJlc3Npb246ZSxldmFsdWF0aW9uS2V5OmBoZWF0bWFwRGVuc2l0eWAsaW1hZ2U6dGhpcy5jb2xvclJhbXB9KSx0aGlzLmNvbG9yUmFtcFRleHR1cmU9bnVsbH1yZXNpemUoKXt0aGlzLmhlYXRtYXBGYm9zLmhhcyhgYmlnLWZiYCkmJnRoaXMuaGVhdG1hcEZib3MuZGVsZXRlKG5mKX1xdWVyeVJhZGl1cyhlKXtyZXR1cm4gRWQoYGhlYXRtYXAtcmFkaXVzYCx0aGlzLGUpfXF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUoe3F1ZXJ5R2VvbWV0cnk6ZSxmZWF0dXJlOnQsZmVhdHVyZVN0YXRlOm4sZ2VvbWV0cnk6cix0cmFuc2Zvcm06aSxwaXhlbHNUb1RpbGVVbml0czphLHVud3JhcHBlZFRpbGVJRDpvLGdldEVsZXZhdGlvbjpzfSl7cmV0dXJuIEZkKHtxdWVyeUdlb21ldHJ5OmUsc2l6ZTp0aGlzLnBhaW50LmdldChgaGVhdG1hcC1yYWRpdXNgKS5ldmFsdWF0ZSh0LG4pKmEsdHJhbnNmb3JtOmksdW53cmFwcGVkVGlsZUlEOm8sZ2V0RWxldmF0aW9uOnN9LHIpfWhhc09mZnNjcmVlblBhc3MoKXtyZXR1cm4gdGhpcy5wYWludC5nZXQoYGhlYXRtYXAtb3BhY2l0eWApIT09MCYmIXRoaXMuaXNIaWRkZW4oKX19O2xldCBvZjtjb25zdCBzZj0oKT0+b2Z8fD1uZXcgY2woeyJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvbiI6bmV3IFcoTS5wYWludF9oaWxsc2hhZGVbYGhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uYF0sYGhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uYCksImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYWx0aXR1ZGUiOm5ldyBXKE0ucGFpbnRfaGlsbHNoYWRlW2BoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFsdGl0dWRlYF0sYGhpbGxzaGFkZS1pbGx1bWluYXRpb24tYWx0aXR1ZGVgKSwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3IiOm5ldyBXKE0ucGFpbnRfaGlsbHNoYWRlW2BoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvcmBdLGBoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvcmApLCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uIjpuZXcgVyhNLnBhaW50X2hpbGxzaGFkZVtgaGlsbHNoYWRlLWV4YWdnZXJhdGlvbmBdLGBoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uYCksImhpbGxzaGFkZS1zaGFkb3ctY29sb3IiOm5ldyBXKE0ucGFpbnRfaGlsbHNoYWRlW2BoaWxsc2hhZGUtc2hhZG93LWNvbG9yYF0sYGhpbGxzaGFkZS1zaGFkb3ctY29sb3JgKSwiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvciI6bmV3IFcoTS5wYWludF9oaWxsc2hhZGVbYGhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JgXSxgaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvcmApLCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yIjpuZXcgVyhNLnBhaW50X2hpbGxzaGFkZVtgaGlsbHNoYWRlLWFjY2VudC1jb2xvcmBdLGBoaWxsc2hhZGUtYWNjZW50LWNvbG9yYCksImhpbGxzaGFkZS1tZXRob2QiOm5ldyBXKE0ucGFpbnRfaGlsbHNoYWRlW2BoaWxsc2hhZGUtbWV0aG9kYF0sYGhpbGxzaGFkZS1tZXRob2RgKSxyZXNhbXBsaW5nOm5ldyBXKE0ucGFpbnRfaGlsbHNoYWRlLnJlc2FtcGxpbmcsYHJlc2FtcGxpbmdgKX0pO3ZhciBjZj17Z2V0IHBhaW50KCl7cmV0dXJuIHNmKCl9fTtjb25zdCBsZj1lPT5lLnR5cGU9PT1gaGlsbHNoYWRlYDt2YXIgdWY9Y2xhc3MgZXh0ZW5kcyBkbHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsY2YsdCksdGhpcy5yZWNhbGN1bGF0ZSh7em9vbTowLHpvb21IaXN0b3J5Ont9fSx2b2lkIDApfWdldElsbHVtaW5hdGlvblByb3BlcnRpZXMoKXtsZXQgZT10aGlzLnBhaW50LmdldChgaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1kaXJlY3Rpb25gKS52YWx1ZXMsdD10aGlzLnBhaW50LmdldChgaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbHRpdHVkZWApLnZhbHVlcyxuPXRoaXMucGFpbnQuZ2V0KGBoaWxsc2hhZGUtaGlnaGxpZ2h0LWNvbG9yYCkudmFsdWVzLHI9dGhpcy5wYWludC5nZXQoYGhpbGxzaGFkZS1zaGFkb3ctY29sb3JgKS52YWx1ZXMsaT1NYXRoLm1heChlLmxlbmd0aCx0Lmxlbmd0aCxuLmxlbmd0aCxyLmxlbmd0aCk7ZT1lLmNvbmNhdChBcnJheShpLWUubGVuZ3RoKS5maWxsKGUuYXQoLTEpKSksdD10LmNvbmNhdChBcnJheShpLXQubGVuZ3RoKS5maWxsKHQuYXQoLTEpKSksbj1uLmNvbmNhdChBcnJheShpLW4ubGVuZ3RoKS5maWxsKG4uYXQoLTEpKSkscj1yLmNvbmNhdChBcnJheShpLXIubGVuZ3RoKS5maWxsKHIuYXQoLTEpKSk7bGV0IGE9dC5tYXAodG4pO3JldHVybntkaXJlY3Rpb25SYWRpYW5zOmUubWFwKHRuKSxhbHRpdHVkZVJhZGlhbnM6YSxzaGFkb3dDb2xvcjpyLGhpZ2hsaWdodENvbG9yOm59fWhhc09mZnNjcmVlblBhc3MoKXtyZXR1cm4gdGhpcy5wYWludC5nZXQoYGhpbGxzaGFkZS1leGFnZ2VyYXRpb25gKSE9PTAmJiF0aGlzLmlzSGlkZGVuKCl9fTtsZXQgZGY7Y29uc3QgZmY9KCk9PmRmfHw9bmV3IGNsKHsiY29sb3ItcmVsaWVmLW9wYWNpdHkiOm5ldyBXKE1bYHBhaW50X2NvbG9yLXJlbGllZmBdW2Bjb2xvci1yZWxpZWYtb3BhY2l0eWBdLGBjb2xvci1yZWxpZWYtb3BhY2l0eWApLCJjb2xvci1yZWxpZWYtY29sb3IiOm5ldyBzbChNW2BwYWludF9jb2xvci1yZWxpZWZgXVtgY29sb3ItcmVsaWVmLWNvbG9yYF0sYGNvbG9yLXJlbGllZi1jb2xvcmApLHJlc2FtcGxpbmc6bmV3IFcoTVtgcGFpbnRfY29sb3ItcmVsaWVmYF0ucmVzYW1wbGluZyxgcmVzYW1wbGluZ2ApfSk7dmFyIHBmPXtnZXQgcGFpbnQoKXtyZXR1cm4gZmYoKX19O2Z1bmN0aW9uIG1mKGUpe3JldHVybmBkYXRhYGluIGV9dmFyIGhmPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLHIpe3RoaXMuY29udGV4dD1lLHRoaXMuZm9ybWF0PW4sdGhpcy50ZXh0dXJlPWUuZ2wuY3JlYXRlVGV4dHVyZSgpLHRoaXMuX293bmVkSGFuZGxlPXRoaXMudGV4dHVyZSx0aGlzLnVwZGF0ZSh0LHIpfXVwZGF0ZShlLHQsbil7bGV0e3dpZHRoOnIsaGVpZ2h0Oml9PWUsYT0odGhpcy5zaXplPy5bMF0hPT1yfHx0aGlzLnNpemVbMV0hPT1pKSYmIW4se2NvbnRleHQ6b309dGhpcyx7Z2w6c309bzt0aGlzLnVzZU1pcG1hcD0hIXQ/LnVzZU1pcG1hcCxhJiZ0aGlzLnNpemUmJnRoaXMuZm9ybWF0PT09cy5SR0JBJiYocy5kZWxldGVUZXh0dXJlKHRoaXMudGV4dHVyZSksdGhpcy50ZXh0dXJlPXMuY3JlYXRlVGV4dHVyZSgpLHRoaXMuX293bmVkSGFuZGxlPXRoaXMudGV4dHVyZSx0aGlzLmZpbHRlcj12b2lkIDAsdGhpcy53cmFwPXZvaWQgMCkscy5iaW5kVGV4dHVyZShzLlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSxvLnBpeGVsU3RvcmVVbnBhY2tGbGlwWS5zZXQoITEpLG8ucGl4ZWxTdG9yZVVucGFjay5zZXQoMSk7bGV0IGM9dGhpcy5mb3JtYXQ9PT1zLlJHQkEmJnQ/LnByZW11bHRpcGx5IT09ITE7aWYoYSl7aWYodGhpcy5zaXplPVtyLGldLHRoaXMuZm9ybWF0PT09cy5SR0JBJiZyPjAmJmk+MCl7bGV0IHQ9dGhpcy51c2VNaXBtYXA/TWF0aC5mbG9vcihNYXRoLmxvZzIoTWF0aC5tYXgocixpKSkpKzE6MTtpZihzLnRleFN0b3JhZ2UyRChzLlRFWFRVUkVfMkQsdCxzLlJHQkE4LHIsaSksbWYoZSkpe28ucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuc2V0KCExKTtsZXR7ZGF0YTp0fT1lO2MmJnQmJih0PWVmKHQpKSx0JiZzLnRleFN1YkltYWdlMkQocy5URVhUVVJFXzJELDAsMCwwLHIsaSxzLlJHQkEscy5VTlNJR05FRF9CWVRFLHQpfWVsc2Ugby5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXQoYykscy50ZXhTdWJJbWFnZTJEKHMuVEVYVFVSRV8yRCwwLDAsMCxzLlJHQkEscy5VTlNJR05FRF9CWVRFLGUpfWVsc2UgbWYoZSk/KG8ucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuc2V0KCExKSx0aGlzLl91cGxvYWRSYXdEYXRhKGUsYyxyLGkscykpOihvLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldChjKSx0aGlzLl91cGxvYWREb21JbWFnZShlLHMpKX1lbHNle2xldHt4OnQseTphfT1ufHx7eDowLHk6MH07bWYoZSk/KG8ucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuc2V0KCExKSx0aGlzLl91cGRhdGVSYXdEYXRhKGUsYyx0LGEscixpLHMpKTooby5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXQoYyksdGhpcy5fdXBkYXRlRG9tSW1hZ2UoZSx0LGEscykpfXRoaXMudXNlTWlwbWFwJiZzLmdlbmVyYXRlTWlwbWFwKHMuVEVYVFVSRV8yRCksby5waXhlbFN0b3JlVW5wYWNrRmxpcFkuc2V0RGVmYXVsdCgpLG8ucGl4ZWxTdG9yZVVucGFjay5zZXREZWZhdWx0KCksby5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXREZWZhdWx0KCl9X3VwbG9hZERvbUltYWdlKGUsdCl7dC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHRoaXMuZm9ybWF0LHRoaXMuZm9ybWF0LHQuVU5TSUdORURfQllURSxlKX1fdXBsb2FkUmF3RGF0YShlLHQsbixyLGkpe2xldHtkYXRhOmF9PWU7dCYmYSYmKGE9ZWYoYSkpLGkudGV4SW1hZ2UyRChpLlRFWFRVUkVfMkQsMCx0aGlzLmZvcm1hdCxuLHIsMCx0aGlzLmZvcm1hdCxpLlVOU0lHTkVEX0JZVEUsYSl9X3VwZGF0ZURvbUltYWdlKGUsdCxuLHIpe3IudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsMCx0LG4sci5SR0JBLHIuVU5TSUdORURfQllURSxlKX1fdXBkYXRlUmF3RGF0YShlLHQsbixyLGksYSxvKXtsZXR7ZGF0YTpzfT1lO3QmJnMmJihzPWVmKHMpKSxvLnRleFN1YkltYWdlMkQoby5URVhUVVJFXzJELDAsbixyLGksYSxvLlJHQkEsby5VTlNJR05FRF9CWVRFLHMpfWJpbmQoZSx0LG4pe2xldHtjb250ZXh0OnJ9PXRoaXMse2dsOml9PXI7dGhpcy50ZXh0dXJlIT09dGhpcy5fb3duZWRIYW5kbGUmJih0aGlzLnRleHR1cmU9dGhpcy5fb3duZWRIYW5kbGUpLGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELHRoaXMudGV4dHVyZSksbj09PWkuTElORUFSX01JUE1BUF9ORUFSRVNUJiYhdGhpcy51c2VNaXBtYXAmJihuPWkuTElORUFSKSxlIT09dGhpcy5maWx0ZXImJihpLnRleFBhcmFtZXRlcmkoaS5URVhUVVJFXzJELGkuVEVYVFVSRV9NQUdfRklMVEVSLGUpLGkudGV4UGFyYW1ldGVyaShpLlRFWFRVUkVfMkQsaS5URVhUVVJFX01JTl9GSUxURVIsbnx8ZSksdGhpcy5maWx0ZXI9ZSksdCE9PXRoaXMud3JhcCYmKGkudGV4UGFyYW1ldGVyaShpLlRFWFRVUkVfMkQsaS5URVhUVVJFX1dSQVBfUyx0KSxpLnRleFBhcmFtZXRlcmkoaS5URVhUVVJFXzJELGkuVEVYVFVSRV9XUkFQX1QsdCksdGhpcy53cmFwPXQpfWRlc3Ryb3koKXtsZXR7Z2w6ZX09dGhpcy5jb250ZXh0O2UuZGVsZXRlVGV4dHVyZSh0aGlzLnRleHR1cmUpLHRoaXMudGV4dHVyZT1udWxsLHRoaXMuX293bmVkSGFuZGxlPW51bGx9fSxnZj1jbGFzcyBle3N0YXRpY3t0aGlzLmJ5dGVWaWV3Q2FjaGU9bmV3IFdlYWtNYXB9Y29uc3RydWN0b3IodCxuLHIsaT0xLGE9MSxvPTEscz0wKXtpZih0aGlzLnVpZD10LG4uaGVpZ2h0IT09bi53aWR0aCl0aHJvdyBSYW5nZUVycm9yKGBERU0gdGlsZXMgbXVzdCBiZSBzcXVhcmVgKTtpZihyJiYhW2BtYXBib3hgLGB0ZXJyYXJpdW1gLGBjdXN0b21gXS5pbmNsdWRlcyhyKSl7SXQoYCIke3J9IiBpcyBub3QgYSB2YWxpZCBlbmNvZGluZyB0eXBlLiBWYWxpZCB0eXBlcyBpbmNsdWRlICJtYXBib3giLCAidGVycmFyaXVtIiBhbmQgImN1c3RvbSIuYCk7cmV0dXJufXRoaXMuc3RyaWRlPW4uaGVpZ2h0O2xldCBjPXRoaXMuZGltPW4uaGVpZ2h0LTI7c3dpdGNoKHRoaXMuZGF0YT1uZXcgVWludDMyQXJyYXkobi5kYXRhLmJ1ZmZlciksZS5ieXRlVmlld0NhY2hlLnNldCh0aGlzLG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YS5idWZmZXIpKSxyKXtjYXNlYHRlcnJhcml1bWA6dGhpcy5yZWRGYWN0b3I9MjU2LHRoaXMuZ3JlZW5GYWN0b3I9MSx0aGlzLmJsdWVGYWN0b3I9MS8yNTYsdGhpcy5iYXNlU2hpZnQ9MzI3Njg7YnJlYWs7Y2FzZWBjdXN0b21gOnRoaXMucmVkRmFjdG9yPWksdGhpcy5ncmVlbkZhY3Rvcj1hLHRoaXMuYmx1ZUZhY3Rvcj1vLHRoaXMuYmFzZVNoaWZ0PXM7YnJlYWs7ZGVmYXVsdDp0aGlzLnJlZEZhY3Rvcj02NTUzLjYsdGhpcy5ncmVlbkZhY3Rvcj0yNS42LHRoaXMuYmx1ZUZhY3Rvcj0uMSx0aGlzLmJhc2VTaGlmdD0xZTR9Zm9yKGxldCBlPTA7ZTxjO2UrKyl0aGlzLmRhdGFbdGhpcy5faWR4KC0xLGUpXT10aGlzLmRhdGFbdGhpcy5faWR4KDAsZSldLHRoaXMuZGF0YVt0aGlzLl9pZHgoYyxlKV09dGhpcy5kYXRhW3RoaXMuX2lkeChjLTEsZSldLHRoaXMuZGF0YVt0aGlzLl9pZHgoZSwtMSldPXRoaXMuZGF0YVt0aGlzLl9pZHgoZSwwKV0sdGhpcy5kYXRhW3RoaXMuX2lkeChlLGMpXT10aGlzLmRhdGFbdGhpcy5faWR4KGUsYy0xKV07dGhpcy5kYXRhW3RoaXMuX2lkeCgtMSwtMSldPXRoaXMuZGF0YVt0aGlzLl9pZHgoMCwwKV0sdGhpcy5kYXRhW3RoaXMuX2lkeChjLC0xKV09dGhpcy5kYXRhW3RoaXMuX2lkeChjLTEsMCldLHRoaXMuZGF0YVt0aGlzLl9pZHgoLTEsYyldPXRoaXMuZGF0YVt0aGlzLl9pZHgoMCxjLTEpXSx0aGlzLmRhdGFbdGhpcy5faWR4KGMsYyldPXRoaXMuZGF0YVt0aGlzLl9pZHgoYy0xLGMtMSldO2xldCBsPXRoaXMuX2dldEJ5dGVWaWV3KCk7dGhpcy5taW49MioqNTMtMSx0aGlzLm1heD0tKDIqKjUzLTEpO2ZvcihsZXQgZT0wO2U8YztlKyspZm9yKGxldCB0PTA7dDxjO3QrKyl7bGV0IG49dGhpcy5faWR4KGUsdCkqNCxyPXRoaXMuX3VucGFja0F0SW5kZXgobCxuKTtyPnRoaXMubWF4JiYodGhpcy5tYXg9cikscjx0aGlzLm1pbiYmKHRoaXMubWluPXIpfX1nZXQoZSx0KXtsZXQgbj10aGlzLl9nZXRCeXRlVmlldygpLHI9dGhpcy5faWR4KGUsdCkqNDtyZXR1cm4gdGhpcy5fdW5wYWNrQXRJbmRleChuLHIpfXNhbXBsZUJpbGluZWFyKGUsdCl7bGV0IG49TWF0aC5mbG9vcihlKSxyPU1hdGguZmxvb3IodCk7aWYobjwtMXx8bj49dGhpcy5kaW18fHI8LTF8fHI+PXRoaXMuZGltKXRocm93IFJhbmdlRXJyb3IoYE91dCBvZiByYW5nZSBzb3VyY2UgY29vcmRpbmF0ZXMgZm9yIERFTSBkYXRhLiB4OiAke2V9LCB5OiAke3R9LCBkaW06ICR7dGhpcy5kaW19YCk7bGV0IGk9dGhpcy5fZ2V0Qnl0ZVZpZXcoKSxhPSgocisxKSp0aGlzLnN0cmlkZStuKzEpKjQsbz10aGlzLnN0cmlkZSo0LHM9ZS1uLGM9dC1yLGw9dGhpcy5fdW5wYWNrQXRJbmRleChpLGEpLHU9dGhpcy5fdW5wYWNrQXRJbmRleChpLGErNCksZD10aGlzLl91bnBhY2tBdEluZGV4KGksYStvKSxmPXRoaXMuX3VucGFja0F0SW5kZXgoaSxhK28rNCk7cmV0dXJuIGwqKDEtcykqKDEtYykrdSpzKigxLWMpK2QqKDEtcykqYytmKnMqY31nZXRVbnBhY2tWZWN0b3IoKXtyZXR1cm5bdGhpcy5yZWRGYWN0b3IsdGhpcy5ncmVlbkZhY3Rvcix0aGlzLmJsdWVGYWN0b3IsdGhpcy5iYXNlU2hpZnRdfV9pZHgoZSx0KXtpZihlPC0xfHxlPj10aGlzLmRpbSsxfHx0PC0xfHx0Pj10aGlzLmRpbSsxKXRocm93IFJhbmdlRXJyb3IoYE91dCBvZiByYW5nZSBzb3VyY2UgY29vcmRpbmF0ZXMgZm9yIERFTSBkYXRhLiB4OiAke2V9LCB5OiAke3R9LCBkaW06ICR7dGhpcy5kaW19YCk7cmV0dXJuKHQrMSkqdGhpcy5zdHJpZGUrKGUrMSl9dW5wYWNrKGUsdCxuKXtyZXR1cm4gZSp0aGlzLnJlZEZhY3Rvcit0KnRoaXMuZ3JlZW5GYWN0b3Irbip0aGlzLmJsdWVGYWN0b3ItdGhpcy5iYXNlU2hpZnR9cGFjayhlKXtyZXR1cm4gX2YoZSx0aGlzLmdldFVucGFja1ZlY3RvcigpKX1nZXRQaXhlbHMoKXtyZXR1cm4gbmV3ICRkKHt3aWR0aDp0aGlzLnN0cmlkZSxoZWlnaHQ6dGhpcy5zdHJpZGV9LHRoaXMuX2dldEJ5dGVWaWV3KCkpfWJhY2tmaWxsQm9yZGVyKGUsdCxuKXtpZih0aGlzLmRpbSE9PWUuZGltKXRocm93IEVycm9yKGBkZW0gZGltZW5zaW9uIG1pc21hdGNoYCk7bGV0IHI9dCp0aGlzLmRpbSxpPXQqdGhpcy5kaW0rdGhpcy5kaW0sYT1uKnRoaXMuZGltLG89bip0aGlzLmRpbSt0aGlzLmRpbTtzd2l0Y2godCl7Y2FzZS0xOnI9aS0xO2JyZWFrO2Nhc2UgMTppPXIrMX1zd2l0Y2gobil7Y2FzZS0xOmE9by0xO2JyZWFrO2Nhc2UgMTpvPWErMX1sZXQgcz0tdCp0aGlzLmRpbSxjPS1uKnRoaXMuZGltO2ZvcihsZXQgdD1hO3Q8bzt0KyspZm9yKGxldCBuPXI7bjxpO24rKyl0aGlzLmRhdGFbdGhpcy5faWR4KG4sdCldPWUuZGF0YVt0aGlzLl9pZHgobitzLHQrYyldfV9nZXRCeXRlVmlldygpe2xldCB0PWUuYnl0ZVZpZXdDYWNoZS5nZXQodGhpcyk7cmV0dXJuIHQ/LmJ1ZmZlciE9PXRoaXMuZGF0YS5idWZmZXImJih0PW5ldyBVaW50OEFycmF5KHRoaXMuZGF0YS5idWZmZXIpLGUuYnl0ZVZpZXdDYWNoZS5zZXQodGhpcyx0KSksdH1fdW5wYWNrQXRJbmRleChlLHQpe3JldHVybiB0aGlzLnVucGFjayhlW3RdLGVbdCsxXSxlW3QrMl0pfX07ZnVuY3Rpb24gX2YoZSx0KXtsZXQgbj10WzBdLHI9dFsxXSxpPXRbMl0sYT10WzNdLG89TWF0aC5taW4obixyLGkpLHM9TWF0aC5yb3VuZCgoZSthKS9vKTtyZXR1cm57cjpNYXRoLmZsb29yKHMqby9uKSUyNTYsZzpNYXRoLmZsb29yKHMqby9yKSUyNTYsYjpNYXRoLmZsb29yKHMqby9pKSUyNTZ9fUgoYERFTURhdGFgLGdmKTtjb25zdCB2Zj1lPT5lLnR5cGU9PT1gY29sb3ItcmVsaWVmYDt2YXIgeWY9Y2xhc3MgZXh0ZW5kcyBkbHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUscGYsdCl9X2NyZWF0ZUNvbG9yUmFtcChlKXtsZXQgdD17ZWxldmF0aW9uU3RvcHM6W10sY29sb3JTdG9wczpbXX0sbj10aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbYGNvbG9yLXJlbGllZi1jb2xvcmBdLnZhbHVlLmV4cHJlc3Npb247aWYobiBpbnN0YW5jZW9mIFBvJiZuLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbiBpbnN0YW5jZW9mICRyKXt0aGlzLmNvbG9yUmFtcEV4cHJlc3Npb249bjtsZXQgZT1uLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbjt0LmVsZXZhdGlvblN0b3BzPWUubGFiZWxzLHQuY29sb3JTdG9wcz1bXTtmb3IobGV0IG4gb2YgdC5lbGV2YXRpb25TdG9wcyl0LmNvbG9yU3RvcHMucHVzaChlLmV2YWx1YXRlKHtnbG9iYWxzOntlbGV2YXRpb246bn19KSl9aWYodC5lbGV2YXRpb25TdG9wcy5sZW5ndGg8MSYmKHQuZWxldmF0aW9uU3RvcHM9WzBdLHQuY29sb3JTdG9wcz1bei50cmFuc3BhcmVudF0pLHQuZWxldmF0aW9uU3RvcHMubGVuZ3RoPDImJih0LmVsZXZhdGlvblN0b3BzLnB1c2godC5lbGV2YXRpb25TdG9wc1swXSsxKSx0LmNvbG9yU3RvcHMucHVzaCh0LmNvbG9yU3RvcHNbMF0pKSx0LmVsZXZhdGlvblN0b3BzLmxlbmd0aDw9ZSlyZXR1cm4gdDtsZXQgcj17ZWxldmF0aW9uU3RvcHM6W10sY29sb3JTdG9wczpbXX0saT0odC5lbGV2YXRpb25TdG9wcy5sZW5ndGgtMSkvKGUtMSk7Zm9yKGxldCBlPTA7ZTx0LmVsZXZhdGlvblN0b3BzLmxlbmd0aC0uNTtlKz1pKXIuZWxldmF0aW9uU3RvcHMucHVzaCh0LmVsZXZhdGlvblN0b3BzW01hdGgucm91bmQoZSldKSxyLmNvbG9yU3RvcHMucHVzaCh0LmNvbG9yU3RvcHNbTWF0aC5yb3VuZChlKV0pO3JldHVybiBJdChgVG9vIG1hbnkgY29sb3JzIGluIHNwZWNpZmljYXRpb24gb2YgJHt0aGlzLmlkfSBjb2xvci1yZWxpZWYgbGF5ZXIsIG1heSBub3QgcmVuZGVyIHByb3Blcmx5LiBNYXggcG9zc2libGUgY29sb3JzOiAke2V9LCBwcm92aWRlZDogJHt0LmVsZXZhdGlvblN0b3BzLmxlbmd0aH1gKSxyfV9jb2xvclJhbXBDaGFuZ2VkKCl7cmV0dXJuIHRoaXMuY29sb3JSYW1wRXhwcmVzc2lvbiE9dGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW2Bjb2xvci1yZWxpZWYtY29sb3JgXS52YWx1ZS5leHByZXNzaW9ufWdldENvbG9yUmFtcFRleHR1cmVzKGUsdCxuKXtpZih0aGlzLmNvbG9yUmFtcFRleHR1cmVzJiYhdGhpcy5fY29sb3JSYW1wQ2hhbmdlZCgpKXJldHVybiB0aGlzLmNvbG9yUmFtcFRleHR1cmVzO2xldCByPXRoaXMuX2NyZWF0ZUNvbG9yUmFtcCh0KSxpPW5ldyAkZCh7d2lkdGg6ci5jb2xvclN0b3BzLmxlbmd0aCxoZWlnaHQ6MX0pLGE9bmV3ICRkKHt3aWR0aDpyLmNvbG9yU3RvcHMubGVuZ3RoLGhlaWdodDoxfSk7Zm9yKGxldCBlPTA7ZTxyLmVsZXZhdGlvblN0b3BzLmxlbmd0aDtlKyspe2xldCB0PV9mKHIuZWxldmF0aW9uU3RvcHNbZV0sbik7YS5zZXRQaXhlbCgwLGUsbmV3IHoodC5yLzI1NSx0LmcvMjU1LHQuYi8yNTUsMSkpLGkuc2V0UGl4ZWwoMCxlLHIuY29sb3JTdG9wc1tlXSl9cmV0dXJuIHRoaXMuY29sb3JSYW1wVGV4dHVyZXM9e2VsZXZhdGlvblRleHR1cmU6bmV3IGhmKGUsYSxlLmdsLlJHQkEpLGNvbG9yVGV4dHVyZTpuZXcgaGYoZSxpLGUuZ2wuUkdCQSl9LHRoaXMuY29sb3JSYW1wVGV4dHVyZXN9aGFzT2Zmc2NyZWVuUGFzcygpe3JldHVybiF0aGlzLmlzSGlkZGVuKCkmJiEhdGhpcy5jb2xvclJhbXBUZXh0dXJlc319O2NvbnN0IGJmPXEoW3tuYW1lOmBhX3Bvc2AsY29tcG9uZW50czoyLHR5cGU6YEludDE2YH1dLDQpLHhmPWJmLm1lbWJlcnM7YmYuc2l6ZSxiZi5hbGlnbm1lbnQ7ZnVuY3Rpb24gU2YoZSx0LG4pe2xldCByPW4ucGF0dGVybkRlcGVuZGVuY2llcyxpPSExO2ZvcihsZXQgbiBvZiB0KXtsZXQgdD1uLnBhaW50LmdldChgJHtlfS1wYXR0ZXJuYCk7dC5pc0NvbnN0YW50KCl8fChpPSEwKTtsZXQgYT10LmNvbnN0YW50T3IobnVsbCk7YSYmKGk9ITAsclthLnRvXT0hMCxyW2EuZnJvbV09ITApfXJldHVybiBpfWZ1bmN0aW9uIENmKGUsdCxuLHIsaSl7bGV0e3pvb206YX09cixvPWkucGF0dGVybkRlcGVuZGVuY2llcztmb3IobGV0IHIgb2YgdCl7bGV0IHQ9ci5wYWludC5nZXQoYCR7ZX0tcGF0dGVybmApLnZhbHVlO2lmKHQua2luZCE9PWBjb25zdGFudGApe2xldCBlPXQuZXZhbHVhdGUoe3pvb206YS0xfSxuLHt9LGkuYXZhaWxhYmxlSW1hZ2VzKSxzPXQuZXZhbHVhdGUoe3pvb206YX0sbix7fSxpLmF2YWlsYWJsZUltYWdlcyksYz10LmV2YWx1YXRlKHt6b29tOmErMX0sbix7fSxpLmF2YWlsYWJsZUltYWdlcyk7ZT1lPy5uYW1lP2UubmFtZTplLHM9cz8ubmFtZT9zLm5hbWU6cyxjPWM/Lm5hbWU/Yy5uYW1lOmMsb1tlXT0hMCxvW3NdPSEwLG9bY109ITAsbi5wYXR0ZXJuc1tyLmlkXT17bWluOmUsbWlkOnMsbWF4OmN9fX1yZXR1cm4gbn1jb25zdCB3Zj1uZXcgU2V0O2xldCBUZj0hMTtmdW5jdGlvbiBFZihlLHQsbj0yKXtsZXQgcj10JiZ0Lmxlbmd0aCxpPXI/dFswXSpuOmUubGVuZ3RoO3dmLnNpemUmJndmLmNsZWFyKCk7bGV0IGE9RGYoZSwwLGksbiwhMCksbz1bXTtpZighYXx8YS5uZXh0PT09YS5wcmV2KXJldHVybiBvO2xldCBzPTAsYz0wLGw9MDtpZihyJiYoYT1GZihlLHQsYSxuKSksZS5sZW5ndGg+ODAqbil7cz1lWzBdLGM9ZVsxXTtsZXQgdD1zLHI9Yztmb3IobGV0IGE9bjthPGk7YSs9bil7bGV0IG49ZVthXSxpPWVbYSsxXTtuPHMmJihzPW4pLGk8YyYmKGM9aSksbj50JiYodD1uKSxpPnImJihyPWkpfWw9TWF0aC5tYXgodC1zLHItYyksbD1sPT09MD8wOjMyNzY3L2x9cmV0dXJuIGtmKGEsbyxzLGMsbCksb31mdW5jdGlvbiBEZihlLHQsbixyLGkpe2xldCBhPW51bGw7aWYoaT09PXZwKGUsdCxuLHIpPjApZm9yKGxldCBpPXQ7aTxuO2krPXIpYT1ocChpL3J8MCxlW2ldLGVbaSsxXSxhKTtlbHNlIGZvcihsZXQgaT1uLXI7aT49dDtpLT1yKWE9aHAoaS9yfDAsZVtpXSxlW2krMV0sYSk7cmV0dXJuIGEmJmNwKGEsYS5uZXh0KSYmKGdwKGEpLGE9YS5uZXh0KSxhfWZ1bmN0aW9uIE9mKGUsdD1lKXtsZXQgbj10PT09ZSxyPWUsaTtkbyBpPSExLHIhPT1yLm5leHQmJih3Zi5zaXplPT09MHx8IXdmLmhhcyhyKSkmJihjcChyLHIubmV4dCl8fHNwKHIucHJldixyLHIubmV4dCk9PT0wKT8oKG58fHI9PT10KSYmKHQ9ci5wcmV2KSxUZj0hMCxncChyKSxyPXIucHJldixpPSEwKToobnx8ciE9PXQpJiYocj1yLm5leHQsaT0hbik7d2hpbGUoaXx8ciE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIGtmKGUsdCxuLHIsaSl7aSYmZXAoZSxuLHIsaSk7bGV0IGE9ZSxvPSExO2Zvcig7ZS5wcmV2IT09ZS5uZXh0Oyl7bGV0IHM9ZS5wcmV2LGM9ZS5uZXh0O2lmKHNwKHMsZSxjKTwwJiYoaT9qZihlLG4scixpKTpBZihlKSkpe3QucHVzaChzLmksZS5pLGMuaSksZ3AoZSksZT1jLGE9Yztjb250aW51ZX1pZihlPWMsZT09PWEpe2lmKFRmPSExLGU9T2YoZSksVGYpe2E9ZTtjb250aW51ZX1pZighbyl7ZT1NZihlLHQpLGE9ZSxvPSEwO2NvbnRpbnVlfU5mKGUsdCxuLHIsaSk7YnJlYWt9fX1mdW5jdGlvbiBBZihlKXtsZXQgdD1lLnByZXYsbj1lLHI9ZS5uZXh0LGk9dC54LGE9bi54LG89ci54LHM9dC55LGM9bi55LGw9ci55LHU9TWF0aC5taW4oaSxhLG8pLGQ9TWF0aC5taW4ocyxjLGwpLGY9TWF0aC5tYXgoaSxhLG8pLHA9TWF0aC5tYXgocyxjLGwpLG09ci5uZXh0O2Zvcig7bSE9PXQ7KXtpZihtLng+PXUmJm0ueDw9ZiYmbS55Pj1kJiZtLnk8PXAmJihpIT09bS54fHxzIT09bS55KSYmYXAoaSxzLGEsYyxvLGwsbS54LG0ueSkmJnNwKG0ucHJldixtLG0ubmV4dCk+PTApcmV0dXJuITE7bT1tLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gamYoZSx0LG4scil7bGV0IGk9ZS5wcmV2LGE9ZSxvPWUubmV4dCxzPWkueCxjPWEueCxsPW8ueCx1PWkueSxkPWEueSxmPW8ueSxwPU1hdGgubWluKHMsYyxsKSxtPU1hdGgubWluKHUsZCxmKSxoPU1hdGgubWF4KHMsYyxsKSxnPU1hdGgubWF4KHUsZCxmKSxfPXJwKHAsbSx0LG4sciksdj1ycChoLGcsdCxuLHIpLHk9ZS5wcmV2Wjtmb3IoO3kmJnkuej49Xzspe2lmKHkueD49cCYmeS54PD1oJiZ5Lnk+PW0mJnkueTw9ZyYmeSE9PW8mJihzIT09eS54fHx1IT09eS55KSYmYXAocyx1LGMsZCxsLGYseS54LHkueSkmJnNwKHkucHJldix5LHkubmV4dCk+PTApcmV0dXJuITE7eT15LnByZXZafWxldCBiPWUubmV4dFo7Zm9yKDtiJiZiLno8PXY7KXtpZihiLng+PXAmJmIueDw9aCYmYi55Pj1tJiZiLnk8PWcmJmIhPT1vJiYocyE9PWIueHx8dSE9PWIueSkmJmFwKHMsdSxjLGQsbCxmLGIueCxiLnkpJiZzcChiLnByZXYsYixiLm5leHQpPj0wKXJldHVybiExO2I9Yi5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBNZihlLHQpe2xldCBuPWUscj0hMTtkb3tsZXQgaT1uLnByZXYsYT1uLm5leHQubmV4dDtscChpLG4sbi5uZXh0LGEsITEpJiZmcChpLGEpJiZmcChhLGkpJiYodC5wdXNoKGkuaSxuLmksYS5pKSxncChuKSxncChuLm5leHQpLG49ZT1hLHI9ITApLG49bi5uZXh0fXdoaWxlKG4hPT1lKTtyZXR1cm4gcj9PZihuKTpufWZ1bmN0aW9uIE5mKGUsdCxuLHIsaSl7bGV0IGE9ZTtkb3tsZXQgZT1hLm5leHQubmV4dDtmb3IoO2UhPT1hLnByZXY7KXtpZihhLmkhPT1lLmkmJm9wKGEsZSkpe2xldCBvPW1wKGEsZSk7YT1PZihhLGEubmV4dCksbz1PZihvLG8ubmV4dCksa2YoYSx0LG4scixpKSxrZihvLHQsbixyLGkpO3JldHVybn1lPWUubmV4dH1hPWEubmV4dH13aGlsZShhIT09ZSl9bGV0IFBmPSExO2Z1bmN0aW9uIEZmKGUsdCxuLHIpe2xldCBpPVtdO2ZvcihsZXQgbj0wLGE9dC5sZW5ndGg7bjxhO24rKyl7bGV0IG89RGYoZSx0W25dKnIsbjxhLTE/dFtuKzFdKnI6ZS5sZW5ndGgsciwhMSk7bz09PW8ubmV4dCYmd2YuYWRkKG8pLGkucHVzaChpcChvKSl9aS5zb3J0KElmKSxIZihlLmxlbmd0aC9yLHQubGVuZ3RoKSxVZihuLG4pLFBmPSEwO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKW49TGYoaVtlXSxuKTtyZXR1cm4gUGY9ITEsT2Yobil9ZnVuY3Rpb24gSWYoZSx0KXtyZXR1cm4gZS54LXQueHx8ZS55LXQueXx8KGUubmV4dC55LWUueSkvKGUubmV4dC54LWUueCktKHQubmV4dC55LXQueSkvKHQubmV4dC54LXQueCl9ZnVuY3Rpb24gTGYoZSx0KXtsZXQgbj1xZihlLHQpO2lmKCFuKXJldHVybiB0O2xldCByPW1wKG4sZSksaT1yLm5leHQ7cmV0dXJuIFVmKG4saS5uZXh0KSxPZihyLHIubmV4dCksT2YobixuLm5leHQpfWxldCBSZj1uZXcgRmxvYXQ2NEFycmF5LHpmPTA7Y29uc3QgQmY9W10sVmY9W107ZnVuY3Rpb24gSGYoZSx0KXtsZXQgbj1NYXRoLmNlaWwoKGUrMip0KS8xNikrdCsyO1JmLmxlbmd0aDxuKjQmJihSZj1uZXcgRmxvYXQ2NEFycmF5KG4qNCkpLHpmPTB9ZnVuY3Rpb24gVWYoZSx0KXtsZXQgbj1lO2Rve2xldCBlPXpmKys7QmZbZV09bjtsZXQgcj0xLzAsaT0xLzAsYT0tMS8wLG89LTEvMCxzPTA7ZG97bGV0IHQ9bi5uZXh0O24uej1lLG4ueDxyJiYocj1uLngpLG4ueD5hJiYoYT1uLngpLG4ueTxpJiYoaT1uLnkpLG4ueT5vJiYobz1uLnkpLHQueDxyJiYocj10LngpLHQueD5hJiYoYT10LngpLHQueTxpJiYoaT10LnkpLHQueT5vJiYobz10LnkpLG49dH13aGlsZSgrK3M8MTYmJm4hPT10KTtWZltlXT1uO2xldCBjPWUqNDtSZltjXT1yLFJmW2MrMV09aSxSZltjKzJdPWEsUmZbYyszXT1vfXdoaWxlKG4hPT10KX1mdW5jdGlvbiBXZihlLHQpe2xldCBuPWUueio0O3QueDxSZltuXSYmKFJmW25dPXQueCksdC55PFJmW24rMV0mJihSZltuKzFdPXQueSksdC54PlJmW24rMl0mJihSZltuKzJdPXQueCksdC55PlJmW24rM10mJihSZltuKzNdPXQueSl9ZnVuY3Rpb24gR2YoZSl7bGV0IHQ9VmZbZV07Zm9yKDt0LnByZXYubmV4dCE9PXQ7KXQ9dC5uZXh0O3JldHVybiBWZltlXT10LHR9ZnVuY3Rpb24gS2YoZSl7bGV0IHQ9QmZbZV07Zm9yKDt0LnByZXYubmV4dCE9PXQ7KXQ9dC5uZXh0O3JldHVybiBCZltlXT10LHR9ZnVuY3Rpb24gcWYoZSx0KXtsZXQgbj10LHI9ZS54LGk9ZS55LGE9LTEvMCxvO2lmKGNwKGUsbikpcmV0dXJuIG47Zm9yKGxldCB0PTAscz0wO3Q8emY7dCsrLHMrPTQpe2lmKGk8UmZbcysxXXx8aT5SZltzKzNdfHxSZltzXT5yfHxSZltzKzJdPD1hKWNvbnRpbnVlO2xldCBjPUdmKHQpO249S2YodCk7ZG97aWYobi5wcmV2Lm5leHQ9PT1uKXtpZihjcChlLG4ubmV4dCkpcmV0dXJuIG4ubmV4dDtpZihpPD1uLnkmJmk+PW4ubmV4dC55JiZuLm5leHQueSE9PW4ueSl7bGV0IGU9bi54KyhpLW4ueSkqKG4ubmV4dC54LW4ueCkvKG4ubmV4dC55LW4ueSk7aWYoZTw9ciYmZT5hJiYoYT1lLG89bi54PG4ubmV4dC54P246bi5uZXh0LGU9PT1yKSlyZXR1cm4gb319bj1uLm5leHR9d2hpbGUobiE9PWMpfWlmKCFvKXJldHVybiBudWxsO2xldCBzPW8ueCxjPW8ueSxsPU1hdGgubWluKGksYyksdT1NYXRoLm1heChpLGMpLGQ9MS8wO2ZvcihsZXQgdD0wLGY9MDt0PHpmO3QrKyxmKz00KXtpZihSZltmKzJdPHN8fFJmW2ZdPnJ8fFJmW2YrM108bHx8UmZbZisxXT51KWNvbnRpbnVlO2xldCBwPUdmKHQpO249S2YodCk7ZG97aWYobi5wcmV2Lm5leHQ9PT1uJiZyPj1uLngmJm4ueD49cyYmciE9PW4ueCYmYXAoaTxjP3I6YSxpLHMsYyxpPGM/YTpyLGksbi54LG4ueSkpe2xldCB0PU1hdGguYWJzKGktbi55KS8oci1uLngpOyhmcChuLGUpfHxuLnk9PT1pJiZuLm5leHQueT09PWkmJm4ubmV4dC54PnIpJiYodDxkfHx0PT09ZCYmKG4ueD5vLnh8fG4ueD09PW8ueCYmSmYobyxuKSkpJiYobz1uLGQ9dCl9bj1uLm5leHR9d2hpbGUobiE9PXApfXJldHVybiBvfWZ1bmN0aW9uIEpmKGUsdCl7cmV0dXJuIHNwKGUucHJldixlLHQucHJldik8MCYmc3AodC5uZXh0LGUsZS5uZXh0KTwwfWNvbnN0IFlmPVtdO2xldCBYZj1bXSxaZj1uZXcgVWludDMyQXJyYXksUWY9bmV3IFVpbnQzMkFycmF5O2NvbnN0ICRmPW5ldyBVaW50MzJBcnJheSgyNTYpO2Z1bmN0aW9uIGVwKGUsdCxuLHIpe2xldCBpPWUsYT0wO2RvIGkuej1ycChpLngsaS55LHQsbixyKSxZZlthKytdPWksaT1pLm5leHQ7d2hpbGUoaSE9PWUpO3RwKGEpO2xldCBvPW51bGw7Zm9yKGxldCBlPTA7ZTxhO2UrKyl7bGV0IHQ9WWZbZV07dC5wcmV2Wj1vLG8mJihvLm5leHRaPXQpLG89dH1vLm5leHRaPW51bGx9ZnVuY3Rpb24gdHAoZSl7aWYoZTw9MzIpe2ZvcihsZXQgdD0xO3Q8ZTt0Kyspe2xldCBlPVlmW3RdLG49ZS56LHI9dC0xO2Zvcig7cj49MCYmWWZbcl0uej5uOylZZltyKzFdPVlmW3JdLHItLTtZZltyKzFdPWV9cmV0dXJufVpmLmxlbmd0aDxlJiYoWmY9bmV3IFVpbnQzMkFycmF5KGUpLFFmPW5ldyBVaW50MzJBcnJheShlKSxYZj1BcnJheShlKSk7Zm9yKGxldCB0PTA7dDxlO3QrKylaZlt0XT1ZZlt0XS56O25wKGUsWWYsWmYsWGYsUWYsMCksbnAoZSxYZixRZixZZixaZiw4KSxucChlLFlmLFpmLFhmLFFmLDE2KSxucChlLFhmLFFmLFlmLFpmLDI0KX1mdW5jdGlvbiBucChlLHQsbixyLGksYSl7JGYuZmlsbCgwKTtmb3IobGV0IHQ9MDt0PGU7dCsrKSRmW25bdF0+Pj5hJjI1NV0rKztsZXQgbz0wO2ZvcihsZXQgZT0wO2U8MjU2O2UrKyl7bGV0IHQ9JGZbZV07JGZbZV09byxvKz10fWZvcihsZXQgbz0wO288ZTtvKyspe2xldCBlPW5bb10scz0kZltlPj4+YSYyNTVdKys7cltzXT10W29dLGlbc109ZX19ZnVuY3Rpb24gcnAoZSx0LG4scixpKXtyZXR1cm4gZT0oZS1uKSppfDAsdD0odC1yKSppfDAsZT0oZXxlPDw4KSYxNjcxMTkzNSxlPShlfGU8PDQpJjI1MjY0NTEzNSxlPShlfGU8PDIpJjg1ODk5MzQ1OSxlPShlfGU8PDEpJjE0MzE2NTU3NjUsdD0odHx0PDw4KSYxNjcxMTkzNSx0PSh0fHQ8PDQpJjI1MjY0NTEzNSx0PSh0fHQ8PDIpJjg1ODk5MzQ1OSx0PSh0fHQ8PDEpJjE0MzE2NTU3NjUsZXx0PDwxfWZ1bmN0aW9uIGlwKGUpe2xldCB0PWUsbj1lO2RvKHQueDxuLnh8fHQueD09PW4ueCYmdC55PG4ueSkmJihuPXQpLHQ9dC5uZXh0O3doaWxlKHQhPT1lKTtyZXR1cm4gbn1mdW5jdGlvbiBhcChlLHQsbixyLGksYSxvLHMpe3JldHVybihpLW8pKih0LXMpPj0oZS1vKSooYS1zKSYmKGUtbykqKHItcyk+PShuLW8pKih0LXMpJiYobi1vKSooYS1zKT49KGktbykqKHItcyl9ZnVuY3Rpb24gb3AoZSx0KXtsZXQgbj1jcChlLHQpJiZzcChlLnByZXYsZSxlLm5leHQpPjAmJnNwKHQucHJldix0LHQubmV4dCk+MDtyZXR1cm4gZS5uZXh0LmkhPT10LmkmJihufHxmcChlLHQpJiZmcCh0LGUpJiYoc3AoZS5wcmV2LGUsdC5wcmV2KSE9PTB8fHNwKGUsdC5wcmV2LHQpIT09MCkpJiYhZHAoZSx0KSYmKG58fHBwKGUsdCkpfWZ1bmN0aW9uIHNwKGUsdCxuKXtyZXR1cm4odC55LWUueSkqKG4ueC10LngpLSh0LngtZS54KSoobi55LXQueSl9ZnVuY3Rpb24gY3AoZSx0KXtyZXR1cm4gZS54PT09dC54JiZlLnk9PT10Lnl9ZnVuY3Rpb24gbHAoZSx0LG4scixpPSEwKXtsZXQgYT1zcChlLHQsbiksbz1zcChlLHQscikscz1zcChuLHIsZSksYz1zcChuLHIsdCk7cmV0dXJuKGE+MCYmbzwwfHxhPDAmJm8+MCkmJihzPjAmJmM8MHx8czwwJiZjPjApPyEwOmk/ISEoYT09PTAmJnVwKGUsbix0KXx8bz09PTAmJnVwKGUscix0KXx8cz09PTAmJnVwKG4sZSxyKXx8Yz09PTAmJnVwKG4sdCxyKSk6ITF9ZnVuY3Rpb24gdXAoZSx0LG4pe3JldHVybiB0Lng8PU1hdGgubWF4KGUueCxuLngpJiZ0Lng+PU1hdGgubWluKGUueCxuLngpJiZ0Lnk8PU1hdGgubWF4KGUueSxuLnkpJiZ0Lnk+PU1hdGgubWluKGUueSxuLnkpfWZ1bmN0aW9uIGRwKGUsdCl7bGV0IG49TWF0aC5taW4oZS54LHQueCkscj1NYXRoLm1heChlLngsdC54KSxpPU1hdGgubWluKGUueSx0LnkpLGE9TWF0aC5tYXgoZS55LHQueSksbz1lO2Rve2xldCBzPW8ubmV4dDtpZihvLng+ciYmcy54PnJ8fG8ueDxuJiZzLng8bnx8by55PmEmJnMueT5hfHxvLnk8aSYmcy55PGkpe289cztjb250aW51ZX1pZihvLmkhPT1lLmkmJnMuaSE9PWUuaSYmby5pIT09dC5pJiZzLmkhPT10LmkmJmxwKG8scyxlLHQpKXJldHVybiEwO289c313aGlsZShvIT09ZSk7cmV0dXJuITF9ZnVuY3Rpb24gZnAoZSx0KXtyZXR1cm4gc3AoZS5wcmV2LGUsZS5uZXh0KTwwP3NwKGUsdCxlLm5leHQpPj0wJiZzcChlLGUucHJldix0KT49MDpzcChlLHQsZS5wcmV2KTwwfHxzcChlLGUubmV4dCx0KTwwfWZ1bmN0aW9uIHBwKGUsdCl7bGV0IG49ZSxyPSExLGk9KGUueCt0LngpLzIsYT0oZS55K3QueSkvMjtkb3tsZXQgZT1uLm5leHQ7bi55PmEhPWUueT5hJiZpPChlLngtbi54KSooYS1uLnkpLyhlLnktbi55KStuLngmJihyPSFyKSxuPWV9d2hpbGUobiE9PWUpO3JldHVybiByfWZ1bmN0aW9uIG1wKGUsdCl7bGV0IG49X3AoZS5pLGUueCxlLnkpLHI9X3AodC5pLHQueCx0LnkpLGk9ZS5uZXh0LGE9dC5wcmV2O3JldHVybiBlLm5leHQ9dCx0LnByZXY9ZSxuLm5leHQ9aSxpLnByZXY9bixyLm5leHQ9bixuLnByZXY9cixhLm5leHQ9cixyLnByZXY9YSxyfWZ1bmN0aW9uIGhwKGUsdCxuLHIpe2xldCBpPV9wKGUsdCxuKTtyZXR1cm4gcj8oaS5uZXh0PXIubmV4dCxpLnByZXY9cixyLm5leHQucHJldj1pLHIubmV4dD1pKTooaS5wcmV2PWksaS5uZXh0PWkpLGl9ZnVuY3Rpb24gZ3AoZSl7ZS5uZXh0LnByZXY9ZS5wcmV2LGUucHJldi5uZXh0PWUubmV4dCxlLnByZXZaJiYoZS5wcmV2Wi5uZXh0Wj1lLm5leHRaKSxlLm5leHRaJiYoZS5uZXh0Wi5wcmV2Wj1lLnByZXZaKSxQZiYmV2YoZS5wcmV2LGUubmV4dCl9ZnVuY3Rpb24gX3AoZSx0LG4pe3JldHVybntpOmUseDp0LHk6bixwcmV2Om51bGwsbmV4dDpudWxsLHo6MCxwcmV2WjpudWxsLG5leHRaOm51bGx9fWZ1bmN0aW9uIHZwKGUsdCxuLHIpe2xldCBpPTA7Zm9yKGxldCBhPXQsbz1uLXI7YTxuO2ErPXIpaSs9KGVbb10tZVthXSkqKGVbYSsxXStlW28rMV0pLG89YTtyZXR1cm4gaX12YXIgeXA9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXtpZih0PmUpdGhyb3cgRXJyb3IoYE1pbiBncmFudWxhcml0eSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gYmFzZSBncmFudWxhcml0eS5gKTt0aGlzLl9iYXNlWm9vbUdyYW51bGFyaXR5PWUsdGhpcy5fbWluR3JhbnVsYXJpdHk9dH1nZXRHcmFudWxhcml0eUZvclpvb21MZXZlbChlKXtsZXQgdD0xPDxlO3JldHVybiBNYXRoLm1heChNYXRoLmZsb29yKHRoaXMuX2Jhc2Vab29tR3JhbnVsYXJpdHkvdCksdGhpcy5fbWluR3JhbnVsYXJpdHksMSl9fSxicD1jbGFzcyBle2NvbnN0cnVjdG9yKGUpe3RoaXMuZmlsbD1lLmZpbGwsdGhpcy5saW5lPWUubGluZSx0aGlzLnRpbGU9ZS50aWxlLHRoaXMuc3RlbmNpbD1lLnN0ZW5jaWwsdGhpcy5jaXJjbGU9ZS5jaXJjbGV9c3RhdGlje3RoaXMubm9TdWJkaXZpc2lvbj1uZXcgZSh7ZmlsbDpuZXcgeXAoMCwwKSxsaW5lOm5ldyB5cCgwLDApLHRpbGU6bmV3IHlwKDAsMCksc3RlbmNpbDpuZXcgeXAoMCwwKSxjaXJjbGU6MX0pfX07SChgU3ViZGl2aXNpb25HcmFudWxhcml0eUV4cHJlc3Npb25gLHlwKSxIKGBTdWJkaXZpc2lvbkdyYW51bGFyaXR5U2V0dGluZ2AsYnApO2NvbnN0IHhwPS0zMjc2OCxTcD0zMjc2Nzt2YXIgQ3A9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl92ZXJ0ZXhCdWZmZXI9W10sdGhpcy5fdmVydGV4RGljdGlvbmFyeT1uZXcgTWFwLHRoaXMuX3VzZWQ9ITEsdGhpcy5fZ3JhbnVsYXJpdHk9ZSx0aGlzLl9ncmFudWxhcml0eUNlbGxTaXplPWovZSx0aGlzLl9jYW5vbmljYWw9dH1fZ2V0S2V5KGUsdCl7cmV0dXJuIGUrPTMyNzY4LHQrPTMyNzY4LGU8PDE2fHQ8PDB9X3ZlcnRleFRvSW5kZXgoZSx0KXtpZihlPC0zMjc2OHx8dDwtMzI3Njh8fGU+MzI3Njd8fHQ+MzI3NjcpdGhyb3cgRXJyb3IoYFZlcnRleCBjb29yZGluYXRlcyBhcmUgb3V0IG9mIHNpZ25lZCAxNiBiaXQgaW50ZWdlciByYW5nZS5gKTtsZXQgbj1NYXRoLnJvdW5kKGUpfDAscj1NYXRoLnJvdW5kKHQpfDAsaT10aGlzLl9nZXRLZXkobixyKTtpZih0aGlzLl92ZXJ0ZXhEaWN0aW9uYXJ5LmhhcyhpKSlyZXR1cm4gdGhpcy5fdmVydGV4RGljdGlvbmFyeS5nZXQoaSk7bGV0IGE9dGhpcy5fdmVydGV4QnVmZmVyLmxlbmd0aC8yO3JldHVybiB0aGlzLl92ZXJ0ZXhEaWN0aW9uYXJ5LnNldChpLGEpLHRoaXMuX3ZlcnRleEJ1ZmZlci5wdXNoKG4sciksYX1fc3ViZGl2aWRlVHJpYW5nbGVzU2NhbmxpbmUoZSl7aWYodGhpcy5fZ3JhbnVsYXJpdHk8MilyZXR1cm4gRHAodGhpcy5fdmVydGV4QnVmZmVyLGUpO2xldCB0PVtdLG49ZS5sZW5ndGg7Zm9yKGxldCByPTA7cjxuO3IrPTMpe2xldCBuPVtlW3IrMF0sZVtyKzFdLGVbcisyXV0saT1bdGhpcy5fdmVydGV4QnVmZmVyW2VbciswXSoyKzBdLHRoaXMuX3ZlcnRleEJ1ZmZlcltlW3IrMF0qMisxXSx0aGlzLl92ZXJ0ZXhCdWZmZXJbZVtyKzFdKjIrMF0sdGhpcy5fdmVydGV4QnVmZmVyW2VbcisxXSoyKzFdLHRoaXMuX3ZlcnRleEJ1ZmZlcltlW3IrMl0qMiswXSx0aGlzLl92ZXJ0ZXhCdWZmZXJbZVtyKzJdKjIrMV1dLGE9MS8wLG89MS8wLHM9LTEvMCxjPS0xLzA7Zm9yKGxldCBlPTA7ZTwzO2UrKyl7bGV0IHQ9aVtlKjJdLG49aVtlKjIrMV07YT1NYXRoLm1pbihhLHQpLHM9TWF0aC5tYXgocyx0KSxvPU1hdGgubWluKG8sbiksYz1NYXRoLm1heChjLG4pfWlmKGE9PT1zfHxvPT09Yyljb250aW51ZTtsZXQgbD1NYXRoLmZsb29yKGEvdGhpcy5fZ3JhbnVsYXJpdHlDZWxsU2l6ZSksdT1NYXRoLmNlaWwocy90aGlzLl9ncmFudWxhcml0eUNlbGxTaXplKSxkPU1hdGguZmxvb3Ioby90aGlzLl9ncmFudWxhcml0eUNlbGxTaXplKSxmPU1hdGguY2VpbChjL3RoaXMuX2dyYW51bGFyaXR5Q2VsbFNpemUpO2lmKGw9PT11JiZkPT09Zil7dC5wdXNoKC4uLm4pO2NvbnRpbnVlfWZvcihsZXQgZT1kO2U8ZjtlKyspe2xldCByPXRoaXMuX3NjYW5saW5lR2VuZXJhdGVWZXJ0ZXhSaW5nRm9yQ2VsbFJvdyhlLGksbik7T3AodGhpcy5fdmVydGV4QnVmZmVyLHIsdCl9fXJldHVybiB0fV9zY2FubGluZUdlbmVyYXRlVmVydGV4UmluZ0ZvckNlbGxSb3coZSx0LG4pe2xldCByPWUqdGhpcy5fZ3JhbnVsYXJpdHlDZWxsU2l6ZSxpPXIrdGhpcy5fZ3JhbnVsYXJpdHlDZWxsU2l6ZSxhPVtdO2ZvcihsZXQgZT0wO2U8MztlKyspe2xldCBvPXRbZSoyXSxzPXRbZSoyKzFdLGM9dFsoZSsxKSoyJTZdLGw9dFsoKGUrMSkqMisxKSU2XSx1PXRbKGUrMikqMiU2XSxkPXRbKChlKzIpKjIrMSklNl0sZj1jLW8scD1sLXMsbT1mPT09MCxoPXA9PT0wLGc9KHItcykvcCxfPShpLXMpL3Asdj1NYXRoLm1pbihnLF8pLHk9TWF0aC5tYXgoZyxfKTtpZighaCYmKHY+PTF8fHk8PTApfHxoJiYoczxyfHxzPmkpKXtsPj1yJiZsPD1pJiZhLnB1c2goblsoZSsxKSUzXSk7Y29udGludWV9aWYoIWgmJnY+MCl7bGV0IGU9bytmKnYsdD1zK3AqdjthLnB1c2godGhpcy5fdmVydGV4VG9JbmRleChlLHQpKX1sZXQgYj1vK2YqTWF0aC5tYXgodiwwKSx4PW8rZipNYXRoLm1pbih5LDEpO2lmKG18fHRoaXMuX2dlbmVyYXRlSW50cmFFZGdlVmVydGljZXMoYSxvLHMsYyxsLGIseCksIWgmJnk8MSl7bGV0IGU9bytmKnksdD1zK3AqeTthLnB1c2godGhpcy5fdmVydGV4VG9JbmRleChlLHQpKX0oaHx8bD49ciYmbDw9aSkmJmEucHVzaChuWyhlKzEpJTNdKSwhaCYmKGw8PXJ8fGw+PWkpJiZ0aGlzLl9nZW5lcmF0ZUludGVyRWRnZVZlcnRpY2VzKGEsbyxzLGMsbCx1LGQseCxyLGkpfXJldHVybiBhfV9nZW5lcmF0ZUludHJhRWRnZVZlcnRpY2VzKGUsdCxuLHIsaSxhLG8pe2xldCBzPXItdCxjPWktbixsPWM9PT0wLHU9bD9NYXRoLm1pbih0LHIpOk1hdGgubWluKGEsbyksZD1sP01hdGgubWF4KHQscik6TWF0aC5tYXgoYSxvKSxmPU1hdGguZmxvb3IodS90aGlzLl9ncmFudWxhcml0eUNlbGxTaXplKSsxLHA9TWF0aC5jZWlsKGQvdGhpcy5fZ3JhbnVsYXJpdHlDZWxsU2l6ZSktMTtpZihsP3Q8cjphPG8pZm9yKGxldCByPWY7cjw9cDtyKyspe2xldCBpPXIqdGhpcy5fZ3JhbnVsYXJpdHlDZWxsU2l6ZSxhPW4rYyooaS10KS9zO2UucHVzaCh0aGlzLl92ZXJ0ZXhUb0luZGV4KGksYSkpfWVsc2UgZm9yKGxldCByPXA7cj49ZjtyLS0pe2xldCBpPXIqdGhpcy5fZ3JhbnVsYXJpdHlDZWxsU2l6ZSxhPW4rYyooaS10KS9zO2UucHVzaCh0aGlzLl92ZXJ0ZXhUb0luZGV4KGksYSkpfX1fZ2VuZXJhdGVJbnRlckVkZ2VWZXJ0aWNlcyhlLHQsbixyLGksYSxvLHMsYyxsKXtsZXQgdT1pLW4sZD1hLXIsZj1vLWkscD0oYy1pKS9mLG09KGwtaSkvZixoPU1hdGgubWluKHAsbSksZz1NYXRoLm1heChwLG0pLF89citkKmgsdj1NYXRoLmZsb29yKE1hdGgubWluKF8scykvdGhpcy5fZ3JhbnVsYXJpdHlDZWxsU2l6ZSkrMSx5PU1hdGguY2VpbChNYXRoLm1heChfLHMpL3RoaXMuX2dyYW51bGFyaXR5Q2VsbFNpemUpLTEsYj1zPF8seD1mPT09MDtpZih4JiYobz09PWN8fG89PT1sKSlyZXR1cm47aWYoeHx8aD49MXx8Zzw9MCl7bGV0IGU9dC1hLHI9bi1vLGk9KGMtbykvcix1PShsLW8pL3IsZD1hK2UqTWF0aC5taW4oaSx1KTt2PU1hdGguZmxvb3IoTWF0aC5taW4oZCxzKS90aGlzLl9ncmFudWxhcml0eUNlbGxTaXplKSsxLHk9TWF0aC5jZWlsKE1hdGgubWF4KGQscykvdGhpcy5fZ3JhbnVsYXJpdHlDZWxsU2l6ZSktMSxiPXM8ZH1sZXQgUz11PjA/bDpjO2lmKGIpZm9yKGxldCB0PXY7dDw9eTt0Kyspe2xldCBuPXQqdGhpcy5fZ3JhbnVsYXJpdHlDZWxsU2l6ZTtlLnB1c2godGhpcy5fdmVydGV4VG9JbmRleChuLFMpKX1lbHNlIGZvcihsZXQgdD15O3Q+PXY7dC0tKXtsZXQgbj10KnRoaXMuX2dyYW51bGFyaXR5Q2VsbFNpemU7ZS5wdXNoKHRoaXMuX3ZlcnRleFRvSW5kZXgobixTKSl9fV9nZW5lcmF0ZU91dGxpbmUoZSl7bGV0IHQ9W107Zm9yKGxldCBuIG9mIGUpe2xldCBlPVRwKG4sdGhpcy5fZ3JhbnVsYXJpdHksITApLHI9dGhpcy5fcG9pbnRBcnJheVRvSW5kaWNlcyhlKSxpPVtdO2ZvcihsZXQgZT0xO2U8ci5sZW5ndGg7ZSsrKWkucHVzaChyW2UtMV0pLGkucHVzaChyW2VdKTt0LnB1c2goaSl9cmV0dXJuIHR9X2hhbmRsZVBvbGVzKGUpe2xldCB0PSExLG49ITE7dGhpcy5fY2Fub25pY2FsJiYodGhpcy5fY2Fub25pY2FsLnk9PT0wJiYodD0hMCksdGhpcy5fY2Fub25pY2FsLnk9PT0oMTw8dGhpcy5fY2Fub25pY2FsLnopLTEmJihuPSEwKSksKHR8fG4pJiZ0aGlzLl9maWxsUG9sZXMoZSx0LG4pfV9lbnN1cmVOb1BvbGVWZXJ0aWNlcygpe2xldCBlPXRoaXMuX3ZlcnRleEJ1ZmZlcjtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTIpe2xldCBuPWVbdCsxXTtuPT09LTMyNzY4JiYoZVt0KzFdPS0zMjc2Nyksbj09PTMyNzY3JiYoZVt0KzFdPTMyNzY2KX19X2dlbmVyYXRlUG9sZVF1YWQoZSx0LG4scixpLGEpe3I+aT09KGE9PT0tMzI3NjgpPyhlLnB1c2gobiksZS5wdXNoKHQpLGUucHVzaCh0aGlzLl92ZXJ0ZXhUb0luZGV4KHIsYSkpLGUucHVzaCh0aGlzLl92ZXJ0ZXhUb0luZGV4KGksYSkpLGUucHVzaChuKSxlLnB1c2godGhpcy5fdmVydGV4VG9JbmRleChyLGEpKSk6KGUucHVzaCh0KSxlLnB1c2gobiksZS5wdXNoKHRoaXMuX3ZlcnRleFRvSW5kZXgocixhKSksZS5wdXNoKG4pLGUucHVzaCh0aGlzLl92ZXJ0ZXhUb0luZGV4KGksYSkpLGUucHVzaCh0aGlzLl92ZXJ0ZXhUb0luZGV4KHIsYSkpKX1fZmlsbFBvbGVzKGUsdCxuKXtsZXQgcj10aGlzLl92ZXJ0ZXhCdWZmZXIsaT1qLGE9ZS5sZW5ndGg7Zm9yKGxldCBvPTI7bzxhO28rPTMpe2xldCBhPWVbby0yXSxzPWVbby0xXSxjPWVbb10sbD1yW2EqMl0sdT1yW2EqMisxXSxkPXJbcyoyXSxmPXJbcyoyKzFdLHA9cltjKjJdLG09cltjKjIrMV07dCYmKHU9PT0wJiZmPT09MCYmdGhpcy5fZ2VuZXJhdGVQb2xlUXVhZChlLGEscyxsLGQseHApLGY9PT0wJiZtPT09MCYmdGhpcy5fZ2VuZXJhdGVQb2xlUXVhZChlLHMsYyxkLHAseHApLG09PT0wJiZ1PT09MCYmdGhpcy5fZ2VuZXJhdGVQb2xlUXVhZChlLGMsYSxwLGwseHApKSxuJiYodT09PWkmJmY9PT1pJiZ0aGlzLl9nZW5lcmF0ZVBvbGVRdWFkKGUsYSxzLGwsZCxTcCksZj09PWkmJm09PT1pJiZ0aGlzLl9nZW5lcmF0ZVBvbGVRdWFkKGUscyxjLGQscCxTcCksbT09PWkmJnU9PT1pJiZ0aGlzLl9nZW5lcmF0ZVBvbGVRdWFkKGUsYyxhLHAsbCxTcCkpfX1faW5pdGlhbGl6ZVZlcnRpY2VzKGUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9Mil0aGlzLl92ZXJ0ZXhUb0luZGV4KGVbdF0sZVt0KzFdKX1zdWJkaXZpZGVQb2x5Z29uSW50ZXJuYWwoZSx0KXtpZih0aGlzLl91c2VkKXRocm93IEVycm9yKGBTdWJkaXZpc2lvbjogbXVsdGlwbGUgdXNlIG5vdCBhbGxvd2VkLmApO3RoaXMuX3VzZWQ9ITA7bGV0e2ZsYXR0ZW5lZDpuLGhvbGVJbmRpY2VzOnJ9PUVwKGUpO3RoaXMuX2luaXRpYWxpemVWZXJ0aWNlcyhuKTtsZXQgaTt0cnl7bGV0IGU9RWYobixyKSx0PXRoaXMuX2NvbnZlcnRJbmRpY2VzKG4sZSk7aT10aGlzLl9zdWJkaXZpZGVUcmlhbmdsZXNTY2FubGluZSh0KX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfWxldCBhPVtdO3JldHVybiB0JiYoYT10aGlzLl9nZW5lcmF0ZU91dGxpbmUoZSkpLHRoaXMuX2Vuc3VyZU5vUG9sZVZlcnRpY2VzKCksdGhpcy5faGFuZGxlUG9sZXMoaSksdGhpcy5fZ3JhbnVsYXJpdHk+PTImJnRoaXMuX2Nhbm9uaWNhbD8uej09PTAmJihpPXRoaXMuX3JlbW92ZVRyaWFuZ2xlc091dHNpZGVUaWxlWChpKSxhPWEubWFwKGU9PnRoaXMuX3JlbW92ZUxpbmVzT3V0c2lkZVRpbGVYKGUpKSkse3ZlcnRpY2VzRmxhdHRlbmVkOnRoaXMuX3ZlcnRleEJ1ZmZlcixpbmRpY2VzVHJpYW5nbGVzOmksaW5kaWNlc0xpbmVMaXN0OmF9fV92ZXJ0ZXhPdXRzaWRlVGlsZVgoZSl7bGV0IHQ9dGhpcy5fdmVydGV4QnVmZmVyW2UqMl07cmV0dXJuIHQ8MHx8dD44MTkyfV9yZW1vdmVUcmlhbmdsZXNPdXRzaWRlVGlsZVgoZSl7bGV0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKz0zKXRoaXMuX3ZlcnRleE91dHNpZGVUaWxlWChlW25dKXx8dGhpcy5fdmVydGV4T3V0c2lkZVRpbGVYKGVbbisxXSl8fHRoaXMuX3ZlcnRleE91dHNpZGVUaWxlWChlW24rMl0pfHx0LnB1c2goZVtuXSxlW24rMV0sZVtuKzJdKTtyZXR1cm4gdH1fcmVtb3ZlTGluZXNPdXRzaWRlVGlsZVgoZSl7bGV0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKz0yKXRoaXMuX3ZlcnRleE91dHNpZGVUaWxlWChlW25dKXx8dGhpcy5fdmVydGV4T3V0c2lkZVRpbGVYKGVbbisxXSl8fHQucHVzaChlW25dLGVbbisxXSk7cmV0dXJuIHR9X2NvbnZlcnRJbmRpY2VzKGUsdCl7bGV0IG49W107Zm9yKGxldCByIG9mIHQpe2xldCB0PWVbcioyXSxpPWVbcioyKzFdO24ucHVzaCh0aGlzLl92ZXJ0ZXhUb0luZGV4KHQsaSkpfXJldHVybiBufV9wb2ludEFycmF5VG9JbmRpY2VzKGUpe2xldCB0PVtdO2ZvcihsZXQgbiBvZiBlKXQucHVzaCh0aGlzLl92ZXJ0ZXhUb0luZGV4KG4ueCxuLnkpKTtyZXR1cm4gdH19O2Z1bmN0aW9uIHdwKGUsdCxuLHI9ITApe3JldHVybiBuZXcgQ3Aobix0KS5zdWJkaXZpZGVQb2x5Z29uSW50ZXJuYWwoZSxyKX1mdW5jdGlvbiBUcChlLHQsbj0hMSl7aWYoIWV8fGUubGVuZ3RoPDF8fGUubGVuZ3RoPDIpcmV0dXJuW107bGV0IHI9ZVswXSxpPWVbZS5sZW5ndGgtMV0sYT1uJiYoci54IT09aS54fHxyLnkhPT1pLnkpO2lmKHQ8MilyZXR1cm4gYT9bLi4uZSxlWzBdXTpbLi4uZV07bGV0IG89TWF0aC5mbG9vcihqL3QpLHM9W107cy5wdXNoKG5ldyBsKGVbMF0ueCxlWzBdLnkpKTtsZXQgYz1lLmxlbmd0aCx1PWE/YzpjLTE7Zm9yKGxldCB0PTA7dDx1O3QrKyl7bGV0IG49ZVt0XSxyPXQ8Yy0xP2VbdCsxXTplWzBdLGk9bi54LGE9bi55LHU9ci54LGQ9ci55LGY9aSE9PXUscD1hIT09ZDtpZighZiYmIXApY29udGludWU7bGV0IG09dS1pLGg9ZC1hLGc9TWF0aC5hYnMobSksXz1NYXRoLmFicyhoKSx2PWkseT1hO2Zvcig7Oyl7bGV0IGU9bT4wPyhNYXRoLmZsb29yKHYvbykrMSkqbzooTWF0aC5jZWlsKHYvbyktMSkqbyx0PWg+MD8oTWF0aC5mbG9vcih5L28pKzEpKm86KE1hdGguY2VpbCh5L28pLTEpKm8sbj1NYXRoLmFicyh2LWUpLHI9TWF0aC5hYnMoeS10KSxpPU1hdGguYWJzKHYtdSksYT1NYXRoLmFicyh5LWQpLGM9Zj9uL2c6MS8wLGI9cD9yL186MS8wO2lmKChpPD1ufHwhZikmJihhPD1yfHwhcCkpYnJlYWs7aWYoYzxiJiZmfHwhcCl7dj1lLHkrPWgqYztsZXQgdD1uZXcgbCh2LE1hdGgucm91bmQoeSkpOyhzW3MubGVuZ3RoLTFdLnghPT10Lnh8fHNbcy5sZW5ndGgtMV0ueSE9PXQueSkmJnMucHVzaCh0KX1lbHNle3YrPW0qYix5PXQ7bGV0IGU9bmV3IGwoTWF0aC5yb3VuZCh2KSx5KTsoc1tzLmxlbmd0aC0xXS54IT09ZS54fHxzW3MubGVuZ3RoLTFdLnkhPT1lLnkpJiZzLnB1c2goZSl9fWxldCBiPW5ldyBsKHUsZCk7KHNbcy5sZW5ndGgtMV0ueCE9PWIueHx8c1tzLmxlbmd0aC0xXS55IT09Yi55KSYmcy5wdXNoKGIpfXJldHVybiBzfWZ1bmN0aW9uIEVwKGUpe2xldCB0PVtdLG49W107Zm9yKGxldCByIG9mIGUpaWYoci5sZW5ndGghPT0wKXtyIT09ZVswXSYmdC5wdXNoKG4ubGVuZ3RoLzIpO2ZvcihsZXQgZSBvZiByKW4ucHVzaChlLngpLG4ucHVzaChlLnkpfXJldHVybntmbGF0dGVuZWQ6bixob2xlSW5kaWNlczp0fX1mdW5jdGlvbiBEcChlLHQpe2xldCBuPVtdO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cis9Myl7bGV0IGk9dFtyXSxhPXRbcisxXSxvPXRbcisyXSxzPWVbaSoyXSxjPWVbaSoyKzFdLGw9ZVthKjJdLHU9ZVthKjIrMV0sZD1lW28qMl0sZj1lW28qMisxXSxwPWwtcyxtPXUtYyxoPWQtcztwKihmLWMpLW0qaD4wPyhuLnB1c2goaSksbi5wdXNoKG8pLG4ucHVzaChhKSk6KG4ucHVzaChpKSxuLnB1c2goYSksbi5wdXNoKG8pKX1yZXR1cm4gbn1mdW5jdGlvbiBPcChlLHQsbil7aWYodC5sZW5ndGg9PT0wKXRocm93IEVycm9yKGBTdWJkaXZpc2lvbiB2ZXJ0ZXggcmluZyBpcyBlbXB0eS5gKTtsZXQgcj0wLGk9ZVt0WzBdKjJdO2ZvcihsZXQgbj0xO248dC5sZW5ndGg7bisrKXtsZXQgYT1lW3Rbbl0qMl07YTxpJiYoaT1hLHI9bil9bGV0IGE9dC5sZW5ndGgsbz1yLHM9KG8rMSklYTtmb3IoOzspe2xldCByPW8tMT49MD9vLTE6YS0xLGk9KHMrMSklYSxjPWVbdFtyXSoyXSxsPWVbdFtyXSoyKzFdLHU9ZVt0W2ldKjJdLGQ9ZVt0W2ldKjIrMV0sZj1lW3Rbb10qMl0scD1lW3Rbb10qMisxXSxtPWVbdFtzXSoyXSxoPWVbdFtzXSoyKzFdLGc9ITE7aWYoYzx1KWc9ITA7ZWxzZSBpZihjPnUpZz0hMTtlbHNle2xldCBlPWgtcCx0PS0obS1mKSxuPXA8aD8xOi0xOygoYy1mKSplKyhsLXApKnQpKm4+KCh1LWYpKmUrKGQtcCkqdCkqbiYmKGc9ITApfWlmKGcpe2xldCBlPXRbcl0saT10W29dLGM9dFtzXTtlIT09aSYmZSE9PWMmJmkhPT1jJiZuLnB1c2goYyxpLGUpLG8tLSxvPDAmJihvPWEtMSl9ZWxzZXtsZXQgZT10W2ldLHI9dFtvXSxjPXRbc107ZSE9PXImJmUhPT1jJiZyIT09YyYmbi5wdXNoKGMscixlKSxzKysscz49YSYmKHM9MCl9aWYocj09PWkpYnJlYWt9fWZ1bmN0aW9uIGtwKGUsdCxuLHIsaSxhLG8scyxjKXtsZXQgbD1pLmxlbmd0aC8yLHU9byYmcyYmYztpZihsPFR1Lk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIKXtsZXQgZD10LnByZXBhcmVTZWdtZW50KGwsbixyKSxmPWQudmVydGV4TGVuZ3RoO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGg7ZSs9MylyLmVtcGxhY2VCYWNrKGYrYVtlXSxmK2FbZSsxXSxmK2FbZSsyXSk7ZC52ZXJ0ZXhMZW5ndGgrPWwsZC5wcmltaXRpdmVMZW5ndGgrPWEubGVuZ3RoLzM7bGV0IHAsbTt1JiYobT1vLnByZXBhcmVTZWdtZW50KGwsbixzKSxwPW0udmVydGV4TGVuZ3RoLG0udmVydGV4TGVuZ3RoKz1sKTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrPTIpZShpW3RdLGlbdCsxXSk7aWYodSlmb3IobGV0IGUgb2YgYyl7Zm9yKGxldCB0PTE7dDxlLmxlbmd0aDt0Kz0yKXMuZW1wbGFjZUJhY2socCtlW3QtMV0scCtlW3RdKTttLnByaW1pdGl2ZUxlbmd0aCs9ZS5sZW5ndGgvMn19ZWxzZSBqcCh0LG4scixpLGEsZSksdSYmTXAobyxuLHMsaSxjLGUpLHQuZm9yY2VOZXdTZWdtZW50T25OZXh0UHJlcGFyZSgpLG8/LmZvcmNlTmV3U2VnbWVudE9uTmV4dFByZXBhcmUoKX1mdW5jdGlvbiBBcChlLHQsbixyLGksYSxvKXtpZihhKXtsZXQgYT1yLmNvdW50O3JldHVybiBuKHRbaSoyXSx0W2kqMisxXSksZVtpXT1yLmNvdW50LHIuY291bnQrKyxvLnZlcnRleExlbmd0aCsrLGF9cmV0dXJuIGVbaV19ZnVuY3Rpb24ganAoZSx0LG4scixpLGEpe2xldCBvPVtdO2ZvcihsZXQgZT0wO2U8ci5sZW5ndGgvMjtlKyspby5wdXNoKC0xKTtsZXQgcz17Y291bnQ6MH0sYz0wLGw9ZS5nZXRPckNyZWF0ZUxhdGVzdFNlZ21lbnQodCxuKSx1PWwudmVydGV4TGVuZ3RoO2ZvcihsZXQgZD0yO2Q8aS5sZW5ndGg7ZCs9Myl7bGV0IGY9aVtkLTJdLHA9aVtkLTFdLG09aVtkXSxoPW9bZl08YyxnPW9bcF08YyxfPW9bbV08Yyx2PSshIWgrICshIWcrICshIV87bC52ZXJ0ZXhMZW5ndGgrdj5UdS5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCYmKGw9ZS5jcmVhdGVOZXdTZWdtZW50KHQsbiksYz1zLmNvdW50LGg9ITAsZz0hMCxfPSEwLHU9MCk7bGV0IHk9QXAobyxyLGEscyxmLGgsbCksYj1BcChvLHIsYSxzLHAsZyxsKSx4PUFwKG8scixhLHMsbSxfLGwpO24uZW1wbGFjZUJhY2sodSt5LWMsdStiLWMsdSt4LWMpLGwucHJpbWl0aXZlTGVuZ3RoKyt9fWZ1bmN0aW9uIE1wKGUsdCxuLHIsaSxhKXtsZXQgbz1bXTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoLzI7ZSsrKW8ucHVzaCgtMSk7bGV0IHM9e2NvdW50OjB9LGM9MCxsPWUuZ2V0T3JDcmVhdGVMYXRlc3RTZWdtZW50KHQsbiksdT1sLnZlcnRleExlbmd0aDtmb3IobGV0IGQgb2YgaSlmb3IobGV0IGk9MTtpPGQubGVuZ3RoO2krPTIpe2xldCBmPWRbaS0xXSxwPWRbaV0sbT1vW2ZdPGMsaD1vW3BdPGMsZz0rISFtKyArISFoO2wudmVydGV4TGVuZ3RoK2c+VHUuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEgmJihsPWUuY3JlYXRlTmV3U2VnbWVudCh0LG4pLGM9cy5jb3VudCxtPSEwLGg9ITAsdT0wKTtsZXQgXz1BcChvLHIsYSxzLGYsbSxsKSx2PUFwKG8scixhLHMscCxoLGwpO24uZW1wbGFjZUJhY2sodStfLWMsdSt2LWMpLGwucHJpbWl0aXZlTGVuZ3RoKyt9fXZhciBOcD1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnpvb209ZS56b29tLHRoaXMub3ZlcnNjYWxpbmc9ZS5vdmVyc2NhbGluZyx0aGlzLmxheWVycz1lLmxheWVycyx0aGlzLmxheWVySWRzPXRoaXMubGF5ZXJzLm1hcChlPT5lLmlkKSx0aGlzLmluZGV4PWUuaW5kZXgsdGhpcy5oYXNEZXBlbmRlbmNpZXM9ITEsdGhpcy5wYXR0ZXJuRmVhdHVyZXM9W10sdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheT1uZXcgc3UsdGhpcy5pbmRleEFycmF5PW5ldyBidSx0aGlzLmluZGV4QXJyYXkyPW5ldyB4dSx0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucz1uZXcgbmQoZS5sYXllcnMsZS56b29tKSx0aGlzLnNlZ21lbnRzPW5ldyBUdSx0aGlzLnNlZ21lbnRzMj1uZXcgVHUsdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzPXRoaXMubGF5ZXJzLmZpbHRlcihlPT5lLmlzU3RhdGVEZXBlbmRlbnQoKSkubWFwKGU9PmUuaWQpfXBvcHVsYXRlKGUsdCxuKXt0aGlzLmhhc0RlcGVuZGVuY2llcz1TZihgZmlsbGAsdGhpcy5sYXllcnMsdCk7bGV0IHI9dGhpcy5sYXllcnNbMF0ubGF5b3V0LmdldChgZmlsbC1zb3J0LWtleWApLGk9IXIuaXNDb25zdGFudCgpLGE9W10sbz1uZXcgVSh0aGlzLnpvb20pLHM9dGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5O2ZvcihsZXR7ZmVhdHVyZTpjLGlkOmwsaW5kZXg6dSxzb3VyY2VMYXllckluZGV4OmR9b2YgZSl7bGV0IGU9bGQoYyxzKTtpZighdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKG8sZSxuKSljb250aW51ZTtsZXQgZj1pP3IuZXZhbHVhdGUoZSx7fSxuLHQuYXZhaWxhYmxlSW1hZ2VzKTp2b2lkIDAscD17aWQ6bCxwcm9wZXJ0aWVzOmMucHJvcGVydGllcyx0eXBlOmMudHlwZSxzb3VyY2VMYXllckluZGV4OmQsaW5kZXg6dSxnZW9tZXRyeTpzP2UuZ2VvbWV0cnk6Y2QoYykscGF0dGVybnM6e30sc29ydEtleTpmfTthLnB1c2gocCl9aSYmYS5zb3J0KChlLHQpPT5lLnNvcnRLZXktdC5zb3J0S2V5KTtmb3IobGV0IHIgb2YgYSl7bGV0e2dlb21ldHJ5OmksaW5kZXg6YSxzb3VyY2VMYXllckluZGV4Om99PXI7aWYodGhpcy5oYXNEZXBlbmRlbmNpZXMpe2xldCBlPUNmKGBmaWxsYCx0aGlzLmxheWVycyxyLHt6b29tOnRoaXMuem9vbX0sdCk7dGhpcy5wYXR0ZXJuRmVhdHVyZXMucHVzaChlKX1lbHNlIHRoaXMuYWRkRmVhdHVyZShyLGksYSxuLHt9LHQuc3ViZGl2aXNpb25HcmFudWxhcml0eSk7bGV0IHM9ZVthXS5mZWF0dXJlO3QuZmVhdHVyZUluZGV4Lmluc2VydChzLGksYSxvLHRoaXMuaW5kZXgpfX11cGRhdGUoZSx0LG4pe3RoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoJiZ0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyhlLHQsdGhpcy5zdGF0ZURlcGVuZGVudExheWVycyx7aW1hZ2VQb3NpdGlvbnM6bn0pfWFkZEZlYXR1cmVzKGUsdCxuKXtmb3IobGV0IHIgb2YgdGhpcy5wYXR0ZXJuRmVhdHVyZXMpdGhpcy5hZGRGZWF0dXJlKHIsci5nZW9tZXRyeSxyLmluZGV4LHQsbixlLnN1YmRpdmlzaW9uR3JhbnVsYXJpdHkpfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGg9PT0wfXVwbG9hZFBlbmRpbmcoKXtyZXR1cm4hdGhpcy51cGxvYWRlZHx8dGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWR9dXBsb2FkKGUpe3RoaXMudXBsb2FkZWR8fCh0aGlzLmxheW91dFZlcnRleEJ1ZmZlcj1lLmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LHhmKSx0aGlzLmluZGV4QnVmZmVyPWUuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KSx0aGlzLmluZGV4QnVmZmVyMj1lLmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheTIpKSx0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoZSksdGhpcy51cGxvYWRlZD0hMH1kZXN0cm95KCl7dGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXImJih0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCksdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCksdGhpcy5pbmRleEJ1ZmZlcjIuZGVzdHJveSgpLHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKSx0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKSx0aGlzLnNlZ21lbnRzMi5kZXN0cm95KCkpfWFkZEZlYXR1cmUoZSx0LG4scixpLGEpe2ZvcihsZXQgZSBvZiBvaSh0LDUwMCkpe2xldCB0PXdwKGUscixhLmZpbGwuZ2V0R3JhbnVsYXJpdHlGb3Jab29tTGV2ZWwoci56KSksbj10aGlzLmxheW91dFZlcnRleEFycmF5O2twKChlLHQpPT57bi5lbXBsYWNlQmFjayhlLHQpfSx0aGlzLnNlZ21lbnRzLHRoaXMubGF5b3V0VmVydGV4QXJyYXksdGhpcy5pbmRleEFycmF5LHQudmVydGljZXNGbGF0dGVuZWQsdC5pbmRpY2VzVHJpYW5nbGVzLHRoaXMuc2VnbWVudHMyLHRoaXMuaW5kZXhBcnJheTIsdC5pbmRpY2VzTGluZUxpc3QpfXRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsZSxuLHtpbWFnZVBvc2l0aW9uczppLGNhbm9uaWNhbDpyfSl9fTtIKGBGaWxsQnVja2V0YCxOcCx7b21pdDpbYGxheWVyc2AsYHBhdHRlcm5GZWF0dXJlc2BdfSk7bGV0IFBwO2NvbnN0IEZwPSgpPT5QcHx8PW5ldyBjbCh7ImZpbGwtc29ydC1rZXkiOm5ldyBHKE0ubGF5b3V0X2ZpbGxbYGZpbGwtc29ydC1rZXlgXSxgZmlsbC1zb3J0LWtleWApfSk7bGV0IElwO2NvbnN0IExwPSgpPT5JcHx8PW5ldyBjbCh7ImZpbGwtYW50aWFsaWFzIjpuZXcgVyhNLnBhaW50X2ZpbGxbYGZpbGwtYW50aWFsaWFzYF0sYGZpbGwtYW50aWFsaWFzYCksImZpbGwtb3BhY2l0eSI6bmV3IEcoTS5wYWludF9maWxsW2BmaWxsLW9wYWNpdHlgXSxgZmlsbC1vcGFjaXR5YCksImZpbGwtbGF5ZXItb3BhY2l0eSI6bmV3IFcoTS5wYWludF9maWxsW2BmaWxsLWxheWVyLW9wYWNpdHlgXSxgZmlsbC1sYXllci1vcGFjaXR5YCksImZpbGwtY29sb3IiOm5ldyBHKE0ucGFpbnRfZmlsbFtgZmlsbC1jb2xvcmBdLGBmaWxsLWNvbG9yYCksImZpbGwtb3V0bGluZS1jb2xvciI6bmV3IEcoTS5wYWludF9maWxsW2BmaWxsLW91dGxpbmUtY29sb3JgXSxgZmlsbC1vdXRsaW5lLWNvbG9yYCksImZpbGwtdHJhbnNsYXRlIjpuZXcgVyhNLnBhaW50X2ZpbGxbYGZpbGwtdHJhbnNsYXRlYF0sYGZpbGwtdHJhbnNsYXRlYCksImZpbGwtdHJhbnNsYXRlLWFuY2hvciI6bmV3IFcoTS5wYWludF9maWxsW2BmaWxsLXRyYW5zbGF0ZS1hbmNob3JgXSxgZmlsbC10cmFuc2xhdGUtYW5jaG9yYCksImZpbGwtcGF0dGVybiI6bmV3IGFsKE0ucGFpbnRfZmlsbFtgZmlsbC1wYXR0ZXJuYF0sYGZpbGwtcGF0dGVybmApfSk7dmFyIFJwPXtnZXQgcGFpbnQoKXtyZXR1cm4gTHAoKX0sZ2V0IGxheW91dCgpe3JldHVybiBGcCgpfX07Y29uc3QgenA9ZT0+ZS50eXBlPT09YGZpbGxgO3ZhciBCcD1jbGFzcyBleHRlbmRzIGRse2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSxScCx0KX1yZWNhbGN1bGF0ZShlLHQpe3N1cGVyLnJlY2FsY3VsYXRlKGUsdCk7bGV0IG49dGhpcy5wYWludC5fdmFsdWVzW2BmaWxsLW91dGxpbmUtY29sb3JgXTtuLnZhbHVlLmtpbmQ9PT1gY29uc3RhbnRgJiZuLnZhbHVlLnZhbHVlPT09dm9pZCAwJiYodGhpcy5wYWludC5fdmFsdWVzW2BmaWxsLW91dGxpbmUtY29sb3JgXT10aGlzLnBhaW50Ll92YWx1ZXNbYGZpbGwtY29sb3JgXSl9Y3JlYXRlQnVja2V0KGUpe3JldHVybiBuZXcgTnAoZSl9cXVlcnlSYWRpdXMoKXtyZXR1cm4gRGQodGhpcy5wYWludC5nZXQoYGZpbGwtdHJhbnNsYXRlYCkpfXF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUoe3F1ZXJ5R2VvbWV0cnk6ZSxnZW9tZXRyeTp0LHRyYW5zZm9ybTpuLHBpeGVsc1RvVGlsZVVuaXRzOnJ9KXtyZXR1cm4gaGQoT2QoZSx0aGlzLnBhaW50LmdldChgZmlsbC10cmFuc2xhdGVgKSx0aGlzLnBhaW50LmdldChgZmlsbC10cmFuc2xhdGUtYW5jaG9yYCksLW4uYmVhcmluZ0luUmFkaWFucyxyKSx0KX1pc1RpbGVDbGlwcGVkKCl7cmV0dXJuITB9fTtjb25zdCBWcD1xKFt7bmFtZTpgYV9wb3NgLGNvbXBvbmVudHM6Mix0eXBlOmBJbnQxNmB9LHtuYW1lOmBhX25vcm1hbF9lZGAsY29tcG9uZW50czo0LHR5cGU6YEludDE2YH1dLDQpLEhwPXEoW3tuYW1lOmBhX2NlbnRyb2lkYCxjb21wb25lbnRzOjIsdHlwZTpgSW50MTZgfV0sNCksVXA9VnAubWVtYmVycztWcC5zaXplLFZwLmFsaWdubWVudDt2YXIgV3A9Y2xhc3MgZXtjb25zdHJ1Y3Rvcigpe3RoaXMubWluWD0xLzAsdGhpcy5tYXhYPS0xLzAsdGhpcy5taW5ZPTEvMCx0aGlzLm1heFk9LTEvMH1leHRlbmQoZSl7cmV0dXJuIHRoaXMubWluWD1NYXRoLm1pbih0aGlzLm1pblgsZS54KSx0aGlzLm1pblk9TWF0aC5taW4odGhpcy5taW5ZLGUueSksdGhpcy5tYXhYPU1hdGgubWF4KHRoaXMubWF4WCxlLngpLHRoaXMubWF4WT1NYXRoLm1heCh0aGlzLm1heFksZS55KSx0aGlzfWV4cGFuZEJ5KGUpe3JldHVybiB0aGlzLm1pblgtPWUsdGhpcy5taW5ZLT1lLHRoaXMubWF4WCs9ZSx0aGlzLm1heFkrPWUsKHRoaXMubWluWD50aGlzLm1heFh8fHRoaXMubWluWT50aGlzLm1heFkpJiYodGhpcy5taW5YPTEvMCx0aGlzLm1heFg9LTEvMCx0aGlzLm1pblk9MS8wLHRoaXMubWF4WT0tMS8wKSx0aGlzfXNocmlua0J5KGUpe3JldHVybiB0aGlzLmV4cGFuZEJ5KC1lKX1tYXAodCl7bGV0IG49bmV3IGU7cmV0dXJuIG4uZXh0ZW5kKHQobmV3IGwodGhpcy5taW5YLHRoaXMubWluWSkpKSxuLmV4dGVuZCh0KG5ldyBsKHRoaXMubWF4WCx0aGlzLm1pblkpKSksbi5leHRlbmQodChuZXcgbCh0aGlzLm1pblgsdGhpcy5tYXhZKSkpLG4uZXh0ZW5kKHQobmV3IGwodGhpcy5tYXhYLHRoaXMubWF4WSkpKSxufXN0YXRpYyBmcm9tUG9pbnRzKHQpe2xldCBuPW5ldyBlO2ZvcihsZXQgZSBvZiB0KW4uZXh0ZW5kKGUpO3JldHVybiBufWNvbnRhaW5zKGUpe3JldHVybiBlLng+PXRoaXMubWluWCYmZS54PD10aGlzLm1heFgmJmUueT49dGhpcy5taW5ZJiZlLnk8PXRoaXMubWF4WX1lbXB0eSgpe3JldHVybiB0aGlzLm1pblg+dGhpcy5tYXhYfXdpZHRoKCl7cmV0dXJuIHRoaXMubWF4WC10aGlzLm1pblh9aGVpZ2h0KCl7cmV0dXJuIHRoaXMubWF4WS10aGlzLm1pbll9Y292ZXJzKGUpe3JldHVybiF0aGlzLmVtcHR5KCkmJiFlLmVtcHR5KCkmJmUubWluWD49dGhpcy5taW5YJiZlLm1heFg8PXRoaXMubWF4WCYmZS5taW5ZPj10aGlzLm1pblkmJmUubWF4WTw9dGhpcy5tYXhZfWludGVyc2VjdHMoZSl7cmV0dXJuIXRoaXMuZW1wdHkoKSYmIWUuZW1wdHkoKSYmZS5taW5YPD10aGlzLm1heFgmJmUubWF4WD49dGhpcy5taW5YJiZlLm1pblk8PXRoaXMubWF4WSYmZS5tYXhZPj10aGlzLm1pbll9fTtjb25zdCBHcD1XcC5mcm9tUG9pbnRzKFtuZXcgbCgwLDApLG5ldyBsKGosaildKTtmdW5jdGlvbiBLcChlLHQpe3JldHVybiBlLng9PT10LngmJihlLng8MHx8ZS54PjgxOTIpfHxlLnk9PT10LnkmJihlLnk8MHx8ZS55PjgxOTIpfWZ1bmN0aW9uIHFwKGUpe3JldHVybiBlLmV2ZXJ5KGU9PmUueDwwKXx8ZS5ldmVyeShlPT5lLng+ODE5Mil8fGUuZXZlcnkoZT0+ZS55PDApfHxlLmV2ZXJ5KGU9PmUueT44MTkyKX12YXIgSnA9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scixpKXtmb3IodGhpcy5wcm9wZXJ0aWVzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5leHRlbnQ9bix0aGlzLnR5cGU9MCx0aGlzLmlkPXZvaWQgMCx0aGlzLl9wYmY9ZSx0aGlzLl9nZW9tZXRyeT0tMSx0aGlzLl9rZXlzPXIsdGhpcy5fdmFsdWVzPWk7ZS5wb3M8dDspe2xldCB0PWUucmVhZFZhcmludCgpO2lmKHQ9PT04KXRoaXMuaWQ9ZS5yZWFkVmFyaW50KCk7ZWxzZSBpZih0PT09MTgpe2xldCB0PWUucmVhZFZhcmludCgpK2UucG9zO2Zvcig7ZS5wb3M8dDspe2xldCB0PXJbZS5yZWFkVmFyaW50KCldLG49aVtlLnJlYWRWYXJpbnQoKV07dGhpcy5wcm9wZXJ0aWVzW3RdPW59fWVsc2UgdD09PTI0P3RoaXMudHlwZT1lLnJlYWRWYXJpbnQoKToodD09PTM0JiYodGhpcy5fZ2VvbWV0cnk9ZS5wb3MpLGUuc2tpcCh0KSl9fWxvYWRHZW9tZXRyeSgpe2lmKHRoaXMuX2dlb21ldHJ5PDApdGhyb3cgRXJyb3IoYGZlYXR1cmUgaGFzIG5vIGdlb21ldHJ5YCk7bGV0IGU9dGhpcy5fcGJmO2UucG9zPXRoaXMuX2dlb21ldHJ5O2xldCB0PWUucmVhZFZhcmludCgpK2UucG9zLG49W10scixpPTEsYT0wLG89MCxzPTA7Zm9yKDtlLnBvczx0Oyl7aWYoYTw9MCl7bGV0IHQ9ZS5yZWFkVmFyaW50KCk7aWYoaT10JjcsYT10Pj4zLGE9PT0wKWNvbnRpbnVlfWlmKGEtLSxpPT09MSlvKz1lLnJlYWRTVmFyaW50KCkscys9ZS5yZWFkU1ZhcmludCgpLHImJm4ucHVzaChyKSxyPVtuZXcgbChvLHMpXTtlbHNlIGlmKGk9PT0yKW8rPWUucmVhZFNWYXJpbnQoKSxzKz1lLnJlYWRTVmFyaW50KCksciYmci5wdXNoKG5ldyBsKG8scykpO2Vsc2UgaWYoaT09PTcpciYmci5wdXNoKHJbMF0uY2xvbmUoKSk7ZWxzZSB0aHJvdyBFcnJvcihgdW5rbm93biBjb21tYW5kICR7aX1gKX1yZXR1cm4gciYmbi5wdXNoKHIpLG59YmJveCgpe2lmKHRoaXMuX2dlb21ldHJ5PDApdGhyb3cgRXJyb3IoYGZlYXR1cmUgaGFzIG5vIGdlb21ldHJ5YCk7bGV0IGU9dGhpcy5fcGJmO2UucG9zPXRoaXMuX2dlb21ldHJ5O2xldCB0PWUucmVhZFZhcmludCgpK2UucG9zLG49MSxyPTAsaT0wLGE9MCxvPTEvMCxzPS0xLzAsYz0xLzAsbD0tMS8wO2Zvcig7ZS5wb3M8dDspe2lmKHI8PTApe2xldCB0PWUucmVhZFZhcmludCgpO2lmKG49dCY3LHI9dD4+MyxyPT09MCljb250aW51ZX1pZihyLS0sbj09PTF8fG49PT0yKWkrPWUucmVhZFNWYXJpbnQoKSxhKz1lLnJlYWRTVmFyaW50KCksaTxvJiYobz1pKSxpPnMmJihzPWkpLGE8YyYmKGM9YSksYT5sJiYobD1hKTtlbHNlIGlmKG4hPT03KXRocm93IEVycm9yKGB1bmtub3duIGNvbW1hbmQgJHtufWApfXJldHVybltvLGMscyxsXX10b0dlb0pTT04oZSx0LG4pe2xldCByPXRoaXMuZXh0ZW50KjIqKm4saT10aGlzLmV4dGVudCplLGE9dGhpcy5leHRlbnQqdCxvPXRoaXMubG9hZEdlb21ldHJ5KCk7ZnVuY3Rpb24gcyhlKXtyZXR1cm5bKGUueCtpKSozNjAvci0xODAsMzYwL01hdGguUEkqTWF0aC5hdGFuKE1hdGguZXhwKCgxLShlLnkrYSkqMi9yKSpNYXRoLlBJKSktOTBdfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGUubWFwKHMpfWxldCBsO2lmKHRoaXMudHlwZT09PTEpe2xldCBlPVtdO2ZvcihsZXQgdCBvZiBvKWUucHVzaCh0WzBdKTtsZXQgdD1jKGUpO2w9ZS5sZW5ndGg9PT0xP3t0eXBlOmBQb2ludGAsY29vcmRpbmF0ZXM6dFswXX06e3R5cGU6YE11bHRpUG9pbnRgLGNvb3JkaW5hdGVzOnR9fWVsc2UgaWYodGhpcy50eXBlPT09Mil7bGV0IGU9by5tYXAoYyk7bD1lLmxlbmd0aD09PTE/e3R5cGU6YExpbmVTdHJpbmdgLGNvb3JkaW5hdGVzOmVbMF19Ont0eXBlOmBNdWx0aUxpbmVTdHJpbmdgLGNvb3JkaW5hdGVzOmV9fWVsc2UgaWYodGhpcy50eXBlPT09Myl7bGV0IGU9WXAobyksdD1bXTtmb3IobGV0IG4gb2YgZSl0LnB1c2gobi5tYXAoYykpO2w9dC5sZW5ndGg9PT0xP3t0eXBlOmBQb2x5Z29uYCxjb29yZGluYXRlczp0WzBdfTp7dHlwZTpgTXVsdGlQb2x5Z29uYCxjb29yZGluYXRlczp0fX1lbHNlIHRocm93IEVycm9yKGB1bmtub3duIGZlYXR1cmUgdHlwZWApO2xldCB1PXt0eXBlOmBGZWF0dXJlYCxnZW9tZXRyeTpsLHByb3BlcnRpZXM6dGhpcy5wcm9wZXJ0aWVzfTtyZXR1cm4gdGhpcy5pZCE9bnVsbCYmKHUuaWQ9dGhpcy5pZCksdX19O0pwLnR5cGVzPVtgVW5rbm93bmAsYFBvaW50YCxgTGluZVN0cmluZ2AsYFBvbHlnb25gXTtmdW5jdGlvbiBZcChlKXtsZXQgdD1lLmxlbmd0aDtpZih0PD0xKXJldHVybltlXTtsZXQgbj1bXSxyLGk7Zm9yKGxldCBhPTA7YTx0O2ErKyl7bGV0IHQ9WHAoZVthXSk7dCE9PTAmJihpPT09dm9pZCAwJiYoaT10PDApLGk9PT10PDA/KHImJm4ucHVzaChyKSxyPVtlW2FdXSk6ciYmci5wdXNoKGVbYV0pKX1yZXR1cm4gciYmbi5wdXNoKHIpLG59ZnVuY3Rpb24gWHAoZSl7bGV0IHQ9MDtmb3IobGV0IG49MCxyPWUubGVuZ3RoLGk9ci0xLGEsbztuPHI7aT1uKyspYT1lW25dLG89ZVtpXSx0Kz0oby54LWEueCkqKGEueStvLnkpO3JldHVybiB0fXZhciBacD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe2Zvcih0aGlzLnZlcnNpb249MSx0aGlzLm5hbWU9YGAsdGhpcy5leHRlbnQ9NDA5Nix0aGlzLmxlbmd0aD0wLHRoaXMuX3BiZj1lLHRoaXMuX2tleXM9W10sdGhpcy5fdmFsdWVzPVtdLHRoaXMuX2ZlYXR1cmVzPVtdLHQ9PT12b2lkIDAmJih0PWUubGVuZ3RoKTtlLnBvczx0Oyl7bGV0IHQ9ZS5yZWFkVmFyaW50KCk7dD09PTEwP3RoaXMubmFtZT1lLnJlYWRTdHJpbmcoKTp0PT09MTg/KHRoaXMuX2ZlYXR1cmVzLnB1c2goZS5wb3MpLGUuc2tpcCh0KSk6dD09PTI2P3RoaXMuX2tleXMucHVzaChlLnJlYWRTdHJpbmcoKSk6dD09PTM0P3RoaXMuX3ZhbHVlcy5wdXNoKFFwKGUpKTp0PT09NDA/dGhpcy5leHRlbnQ9ZS5yZWFkVmFyaW50KCk6dD09PTEyMD90aGlzLnZlcnNpb249ZS5yZWFkVmFyaW50KCk6ZS5za2lwKHQpfXRoaXMubGVuZ3RoPXRoaXMuX2ZlYXR1cmVzLmxlbmd0aH1mZWF0dXJlKGUpe2lmKGU8MHx8ZT49dGhpcy5fZmVhdHVyZXMubGVuZ3RoKXRocm93IEVycm9yKGBmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHNgKTt0aGlzLl9wYmYucG9zPXRoaXMuX2ZlYXR1cmVzW2VdO2xldCB0PXRoaXMuX3BiZi5yZWFkVmFyaW50KCkrdGhpcy5fcGJmLnBvcztyZXR1cm4gbmV3IEpwKHRoaXMuX3BiZix0LHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX19O2Z1bmN0aW9uIFFwKGUpe2xldCB0PW51bGwsbj1lLnJlYWRWYXJpbnQoKStlLnBvcztmb3IoO2UucG9zPG47KXtsZXQgbj1lLnJlYWRWYXJpbnQoKTt0PW49PT0xMD9lLnJlYWRTdHJpbmcoKTpuPT09MjE/ZS5yZWFkRmxvYXQoKTpuPT09MjU/ZS5yZWFkRG91YmxlKCk6bj09PTMyP2UucmVhZFZhcmludCghMCk6bj09PTQwP2UucmVhZFZhcmludCgpOm49PT00OD9lLnJlYWRTVmFyaW50KCk6bj09PTU2P2UucmVhZEJvb2xlYW4oKTooZS5za2lwKG4pLG51bGwpfWlmKHQ9PW51bGwpdGhyb3cgRXJyb3IoYHVua25vd24gZmVhdHVyZSB2YWx1ZWApO3JldHVybiB0fXZhciAkcD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQ9ZS5sZW5ndGgpe2xldCBuPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKDtlLnBvczx0Oyl7bGV0IHQ9ZS5yZWFkVmFyaW50KCk7aWYodD09PTI2KXtsZXQgdD1uZXcgWnAoZSxlLnJlYWRWYXJpbnQoKStlLnBvcyk7dC5sZW5ndGgmJihuW3QubmFtZV09dCl9ZWxzZSBlLnNraXAodCl9dGhpcy5sYXllcnM9bn19O2NvbnN0IGVtPTYzNzEwMDguODt2YXIgdG09Y2xhc3MgZXtjb25zdHJ1Y3RvcihlLHQpe2lmKGlzTmFOKGUpfHxpc05hTih0KSl0aHJvdyBFcnJvcihgSW52YWxpZCBMbmdMYXQgb2JqZWN0OiAoJHtlfSwgJHt0fSlgKTtpZih0aGlzLmxuZz0rZSx0aGlzLmxhdD0rdCx0aGlzLmxhdD45MHx8dGhpcy5sYXQ8LTkwKXRocm93IEVycm9yKGBJbnZhbGlkIExuZ0xhdCBsYXRpdHVkZSB2YWx1ZTogbXVzdCBiZSBiZXR3ZWVuIC05MCBhbmQgOTBgKX13cmFwKCl7cmV0dXJuIG5ldyBlKHh0KHRoaXMubG5nLC0xODAsMTgwKSx0aGlzLmxhdCl9dG9BcnJheSgpe3JldHVyblt0aGlzLmxuZyx0aGlzLmxhdF19dG9TdHJpbmcoKXtyZXR1cm5gTG5nTGF0KCR7dGhpcy5sbmd9LCAke3RoaXMubGF0fSlgfWRpc3RhbmNlVG8oZSl7bGV0IHQ9TWF0aC5QSS8xODAsbj10aGlzLmxhdCp0LHI9ZS5sYXQqdCxpPU1hdGguc2luKG4pKk1hdGguc2luKHIpK01hdGguY29zKG4pKk1hdGguY29zKHIpKk1hdGguY29zKChlLmxuZy10aGlzLmxuZykqdCk7cmV0dXJuIGVtKk1hdGguYWNvcyhNYXRoLm1pbihpLDEpKX1zdGF0aWMgY29udmVydCh0KXtpZih0IGluc3RhbmNlb2YgZSlyZXR1cm4gdDtpZihBcnJheS5pc0FycmF5KHQpJiYodC5sZW5ndGg9PT0yfHx0Lmxlbmd0aD09PTMpKXJldHVybiBuZXcgZShOdW1iZXIodFswXSksTnVtYmVyKHRbMV0pKTtpZighQXJyYXkuaXNBcnJheSh0KSYmdHlwZW9mIHQ9PWBvYmplY3RgJiZ0KXJldHVybiBuZXcgZShOdW1iZXIoYGxuZ2BpbiB0P3QubG5nOnQubG9uKSxOdW1iZXIodC5sYXQpKTt0aHJvdyBFcnJvcigiYExuZ0xhdExpa2VgIGFyZ3VtZW50IG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgTG5nTGF0IGluc3RhbmNlLCBhbiBvYmplY3Qge2xuZzogPGxuZz4sIGxhdDogPGxhdD59LCBhbiBvYmplY3Qge2xvbjogPGxuZz4sIGxhdDogPGxhdD59LCBvciBhbiBhcnJheSBvZiBbPGxuZz4sIDxsYXQ+XSIpfX07Y29uc3Qgbm09MipNYXRoLlBJKmVtO2Z1bmN0aW9uIHJtKGUpe3JldHVybiBubSpNYXRoLmNvcyhlKk1hdGguUEkvMTgwKX1mdW5jdGlvbiBpbShlKXtyZXR1cm4oMTgwK2UpLzM2MH1mdW5jdGlvbiBhbShlKXtyZXR1cm4oMTgwLTE4MC9NYXRoLlBJKk1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkvNCtlKk1hdGguUEkvMzYwKSkpLzM2MH1mdW5jdGlvbiBvbShlLHQpe3JldHVybiBlL3JtKHQpfWZ1bmN0aW9uIHNtKGUpe3JldHVybiBlKjM2MC0xODB9ZnVuY3Rpb24gY20oZSl7bGV0IHQ9MTgwLWUqMzYwO3JldHVybiAzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAodCpNYXRoLlBJLzE4MCkpLTkwfWZ1bmN0aW9uIGxtKGUsdCl7cmV0dXJuIGUqcm0oY20odCkpfWZ1bmN0aW9uIHVtKGUpe3JldHVybiAxL01hdGguY29zKGUqTWF0aC5QSS8xODApfXZhciBkbT1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCxuPTApe3RoaXMueD0rZSx0aGlzLnk9K3QsdGhpcy56PStufXN0YXRpYyBmcm9tTG5nTGF0KHQsbj0wKXtsZXQgcj10bS5jb252ZXJ0KHQpO3JldHVybiBuZXcgZShpbShyLmxuZyksYW0oci5sYXQpLG9tKG4sci5sYXQpKX10b0xuZ0xhdCgpe3JldHVybiBuZXcgdG0oc20odGhpcy54KSxjbSh0aGlzLnkpKX10b0FsdGl0dWRlKCl7cmV0dXJuIGxtKHRoaXMueix0aGlzLnkpfW1ldGVySW5NZXJjYXRvckNvb3JkaW5hdGVVbml0cygpe3JldHVybiAxL25tKnVtKGNtKHRoaXMueSkpfX07Y29uc3QgZm09ODkuMjU7ZnVuY3Rpb24gcG0oZSx0LG4pe2xldCByPTEvKDE8PG4ueik7cmV0dXJuIG5ldyBkbShlL2oqcituLngqcix0L2oqcituLnkqcil9ZnVuY3Rpb24gbW0oZSx0LG4pe3JldHVybiBwbShlLHQsbikudG9MbmdMYXQoKX1mdW5jdGlvbiBobShlLHQpe2xldCBuPWJ0KHQubGF0LC04NS4wNTExMjksY24pO3JldHVybiBuZXcgbChpbSh0LmxuZykqZSxhbShuKSplKX1mdW5jdGlvbiBnbShlLHQpe3JldHVybiBuZXcgZG0odC54L2UsdC55L2UpLnRvTG5nTGF0KCl9ZnVuY3Rpb24gX20oZSl7cmV0dXJuIGUuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSpNYXRoLm1pbihNYXRoLnRhbih0big5MC1lLnBpdGNoKSkqLjg1LE1hdGgudGFuKHRuKGZtLWUucGl0Y2gpKSl9ZnVuY3Rpb24gdm0oZSx0KXtsZXQgbj1lLmNhbm9uaWNhbCxyPXQvT3Qobi56KSxpPW4ueCsyKipuLnoqZS53cmFwLGE9bmV3IEZsb2F0NjRBcnJheSgxNik7cmV0dXJuIEMoYSksRShhLGEsW2kqcixuLnkqciwwXSksRChhLGEsW3IvaixyL2osMV0pLGF9ZnVuY3Rpb24geW0oZSx0LG4scixpKXtsZXQgYT1kbS5mcm9tTG5nTGF0KGUsdCksbz1pKm9tKDEsZS5sYXQpLHt4OnMseTpjLHo6bH09eG0obixyKSx1PW8qLXMsZD1vKi1jLGY9bypsO3JldHVybiBuZXcgZG0oYS54K3UsYS55K2QsYS56K2YpfWZ1bmN0aW9uIGJtKGUpe2xldCB0PW9tKDEsZS5jZW50ZXIubGF0KSplLndvcmxkU2l6ZTtyZXR1cm4geW0oZS5jZW50ZXIsZS5lbGV2YXRpb24sZS5waXRjaCxlLmJlYXJpbmcsZS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlL3QpfWZ1bmN0aW9uIHhtKGUsdCl7bGV0IG49dG4oZSkscj10bih0KSxpPU1hdGguY29zKC1uKSxhPU1hdGguc2luKG4pO3JldHVybnt4OmEqTWF0aC5zaW4ocikseTotYSpNYXRoLmNvcyhyKSx6Oml9fWZ1bmN0aW9uIFNtKGUsdCxuKXtpZih0PD0wfHwhZXx8ZS5sZW5ndGg9PT0wKXJldHVybiBlO2xldCByPUNtKHQsbik7cmV0dXJuIGUubWFwKGU9PndtKGUscikpfWZ1bmN0aW9uIENtKGUsdCl7bGV0IG49bW0oai8yLGovMix0KSxyPWRtLmZyb21MbmdMYXQobikubWV0ZXJJbk1lcmNhdG9yQ29vcmRpbmF0ZVVuaXRzKCksaT0oMTw8dC56KSpqO3JldHVybiBlKnIqaX1mdW5jdGlvbiB3bShlLHQpe2lmKCFlfHxlLmxlbmd0aDwzKXJldHVybiBlO2xldCBuPWVbMF0ueD09PWVbZS5sZW5ndGgtMV0ueCYmZVswXS55PT09ZVtlLmxlbmd0aC0xXS55LHI9bj9lLmxlbmd0aC0xOmUubGVuZ3RoO2lmKHI8MylyZXR1cm4gZTtsZXQgaT1bXTtmb3IobGV0IG49MDtuPHI7bisrKXtsZXQgYT1lWyhuLTErciklcl0sbz1lW25dLHM9ZVsobisxKSVyXTtpZihLcChhLG8pfHxLcChvLHMpKXtpLnB1c2goby5jbG9uZSgpKTtjb250aW51ZX1FbShpLGEsbyxzLHQpfWxldCBhPVRtKGkpO3JldHVybiBhLmxlbmd0aDwzP2U6KG4mJmEucHVzaChhWzBdLmNsb25lKCkpLGEpfWZ1bmN0aW9uIFRtKGUpe2xldCB0PVtdO2ZvcihsZXQgbiBvZiBlKXtsZXQgZT1uLnJvdW5kKCkscj10W3QubGVuZ3RoLTFdOyhyPy54IT09ZS54fHxyPy55IT09ZS55KSYmdC5wdXNoKGUpfWZvcig7dC5sZW5ndGg+MSYmdFswXS54PT09dFt0Lmxlbmd0aC0xXS54JiZ0WzBdLnk9PT10W3QubGVuZ3RoLTFdLnk7KXQucG9wKCk7cmV0dXJuIHR9ZnVuY3Rpb24gRW0oZSx0LG4scixpKXtsZXQgYT10LnN1YihuKSxvPXIuc3ViKG4pLHM9YS5tYWcoKSxjPW8ubWFnKCk7aWYoczwxZS02fHxjPDFlLTYpe2UucHVzaChuLmNsb25lKCkpO3JldHVybn1hLl9kaXYocyksby5fZGl2KGMpO2xldCBsPWEueCpvLngrYS55Km8ueTtpZihNYXRoLmFicyhsKT5NYXRoLmNvcyg1Kk1hdGguUEkvMTgwKSl7ZS5wdXNoKG4uY2xvbmUoKSk7cmV0dXJufWxldCB1PS4yLGQ9TWF0aC5taW4oaSxzKnUsYyp1KSxmPW4uYWRkKGEubXVsdChkKSkscD1uLmFkZChvLm11bHQoZCkpLG09TWF0aC5zcXJ0KCgxK2wpLzIpLGg9bi5hZGQoYS5hZGQobykuX3VuaXQoKS5fbXVsdChkL20pKSxnPWYuc3ViKGgpLmFuZ2xlV2l0aChwLnN1YihoKSksXz1NYXRoLm1heCgyLE1hdGguY2VpbChNYXRoLmFicyhnKS8oTWF0aC5QSS82KS0xZS02KSk7Zm9yKGxldCB0PTA7dDw9Xzt0KyspZS5wdXNoKGYucm90YXRlQXJvdW5kKHQvXypnLGgpKX1jb25zdCBEbT04MTkyO2Z1bmN0aW9uIE9tKGUsdCxuLHIsaSxhLG8scyl7ZS5lbXBsYWNlQmFjayh0LG4sTWF0aC5mbG9vcihyKkRtKSoyK28saSpEbSoyLGEqRG0qMixNYXRoLnJvdW5kKHMpKX12YXIga209Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy56b29tPWUuem9vbSx0aGlzLm92ZXJzY2FsaW5nPWUub3ZlcnNjYWxpbmcsdGhpcy5sYXllcnM9ZS5sYXllcnMsdGhpcy5sYXllcklkcz10aGlzLmxheWVycy5tYXAoZT0+ZS5pZCksdGhpcy5pbmRleD1lLmluZGV4LHRoaXMuaGFzRGVwZW5kZW5jaWVzPSExLHRoaXMubGF5b3V0VmVydGV4QXJyYXk9bmV3IGN1LHRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheT1uZXcgcnUsdGhpcy5pbmRleEFycmF5PW5ldyBidSx0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucz1uZXcgbmQoZS5sYXllcnMsZS56b29tKSx0aGlzLnNlZ21lbnRzPW5ldyBUdSx0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHM9dGhpcy5sYXllcnMuZmlsdGVyKGU9PmUuaXNTdGF0ZURlcGVuZGVudCgpKS5tYXAoZT0+ZS5pZCl9cG9wdWxhdGUoZSx0LG4pe3RoaXMuZmVhdHVyZXM9W10sdGhpcy5oYXNEZXBlbmRlbmNpZXM9U2YoYGZpbGwtZXh0cnVzaW9uYCx0aGlzLmxheWVycyx0KTtsZXQgcj1uZXcgVSh0aGlzLnpvb20pLGk9dGhpcy5sYXllcnNbMF0sYT1pLmxheW91dC5nZXQoYGZpbGwtZXh0cnVzaW9uLXJvdW5kZWQtY29ybmVyLWRpc3RhbmNlYCksbz1pLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeTtmb3IobGV0e2ZlYXR1cmU6cyxpZDpjLGluZGV4Omwsc291cmNlTGF5ZXJJbmRleDp1fW9mIGUpe2xldCBlPWxkKHMsbyk7aWYoIWkuX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKHIsZSxuKSljb250aW51ZTtsZXQgZD1vP2UuZ2VvbWV0cnk6Y2QocyksZj17aWQ6Yyxzb3VyY2VMYXllckluZGV4OnUsaW5kZXg6bCxnZW9tZXRyeTphPjA/U20oZCxhLG4pOmQscHJvcGVydGllczpzLnByb3BlcnRpZXMsdHlwZTpzLnR5cGUscGF0dGVybnM6e319O3RoaXMuaGFzRGVwZW5kZW5jaWVzP3RoaXMuZmVhdHVyZXMucHVzaChDZihgZmlsbC1leHRydXNpb25gLHRoaXMubGF5ZXJzLGYse3pvb206dGhpcy56b29tfSx0KSk6dGhpcy5hZGRGZWF0dXJlKGYsZi5nZW9tZXRyeSxsLG4se30sdC5zdWJkaXZpc2lvbkdyYW51bGFyaXR5KSx0LmZlYXR1cmVJbmRleC5pbnNlcnQocyxmLmdlb21ldHJ5LGwsdSx0aGlzLmluZGV4LCEwKX19YWRkRmVhdHVyZXMoZSx0LG4pe2ZvcihsZXQgciBvZiB0aGlzLmZlYXR1cmVzKXtsZXR7Z2VvbWV0cnk6aX09cjt0aGlzLmFkZEZlYXR1cmUocixpLHIuaW5kZXgsdCxuLGUuc3ViZGl2aXNpb25HcmFudWxhcml0eSl9fXVwZGF0ZShlLHQsbil7dGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgmJnRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKGUsdCx0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLHtpbWFnZVBvc2l0aW9uczpufSl9aXNFbXB0eSgpe3JldHVybiB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aD09PTAmJnRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheS5sZW5ndGg9PT0wfXVwbG9hZFBlbmRpbmcoKXtyZXR1cm4hdGhpcy51cGxvYWRlZHx8dGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWR9dXBsb2FkKGUpe3RoaXMudXBsb2FkZWR8fCh0aGlzLmxheW91dFZlcnRleEJ1ZmZlcj1lLmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LFVwKSx0aGlzLmNlbnRyb2lkVmVydGV4QnVmZmVyPWUuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheSxIcC5tZW1iZXJzLCEwKSx0aGlzLmluZGV4QnVmZmVyPWUuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KSksdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKGUpLHRoaXMudXBsb2FkZWQ9ITB9ZGVzdHJveSgpe3RoaXMubGF5b3V0VmVydGV4QnVmZmVyJiYodGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpLHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpLHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKSx0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKSx0aGlzLmNlbnRyb2lkVmVydGV4QnVmZmVyLmRlc3Ryb3koKSl9YWRkRmVhdHVyZShlLHQsbixyLGksYSl7bGV0IG89dGhpcy5sYXllcnNbMF0scz1vLmxheW91dD9vLmxheW91dC5nZXQoYGZpbGwtZXh0cnVzaW9uLXJvdW5kZWQtY29ybmVyLWRpc3RhbmNlYCk6MCxjPXM+MD9TbSh0LHMscik6dDtmb3IobGV0IHQgb2Ygb2koYyw1MDApKXtsZXQgbj17eDowLHk6MCxzYW1wbGVDb3VudDowfSxpPXRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoO3RoaXMucHJvY2Vzc1BvbHlnb24obixyLGUsdCxhKTtsZXQgbz10aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aC1pLHM9TWF0aC5mbG9vcihuLngvbi5zYW1wbGVDb3VudCksYz1NYXRoLmZsb29yKG4ueS9uLnNhbXBsZUNvdW50KTtmb3IobGV0IGU9MDtlPG87ZSsrKXRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhzLGMpfXRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsZSxuLHtpbWFnZVBvc2l0aW9uczppLGNhbm9uaWNhbDpyfSl9cHJvY2Vzc1BvbHlnb24oZSx0LG4scixpKXtpZihyLmxlbmd0aDwxfHxxcChyWzBdKSlyZXR1cm47Zm9yKGxldCB0IG9mIHIpdC5sZW5ndGghPT0wJiZBbShlLHQpO2xldCBhPXtzZWdtZW50OnRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCx0aGlzLmxheW91dFZlcnRleEFycmF5LHRoaXMuaW5kZXhBcnJheSl9LG89aS5maWxsLmdldEdyYW51bGFyaXR5Rm9yWm9vbUxldmVsKHQueikscz1KcC50eXBlc1tuLnR5cGVdPT09YFBvbHlnb25gO2ZvcihsZXQgZSBvZiByKXtpZihlLmxlbmd0aD09PTB8fHFwKGUpKWNvbnRpbnVlO2xldCB0PVRwKGUsbyxzKTt0aGlzLl9nZW5lcmF0ZVNpZGVGYWNlcyh0LGEpfWlmKCFzKXJldHVybjtsZXQgYz13cChyLHQsbywhMSksbD10aGlzLmxheW91dFZlcnRleEFycmF5O2twKChlLHQpPT57T20obCxlLHQsMCwwLDEsMSwwKX0sdGhpcy5zZWdtZW50cyx0aGlzLmxheW91dFZlcnRleEFycmF5LHRoaXMuaW5kZXhBcnJheSxjLnZlcnRpY2VzRmxhdHRlbmVkLGMuaW5kaWNlc1RyaWFuZ2xlcyl9X2dlbmVyYXRlU2lkZUZhY2VzKGUsdCl7bGV0IG49MDtmb3IobGV0IHI9MTtyPGUubGVuZ3RoO3IrKyl7bGV0IGk9ZVtyXSxhPWVbci0xXTtpZihLcChpLGEpKWNvbnRpbnVlO3Quc2VnbWVudC52ZXJ0ZXhMZW5ndGgrND5UdS5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCYmKHQuc2VnbWVudD10aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSx0aGlzLmluZGV4QXJyYXkpKTtsZXQgbz1pLnN1YihhKS5fcGVycCgpLl91bml0KCkscz1hLmRpc3QoaSk7bitzPjMyNzY4JiYobj0wKSxPbSh0aGlzLmxheW91dFZlcnRleEFycmF5LGkueCxpLnksby54LG8ueSwwLDAsbiksT20odGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSxpLngsaS55LG8ueCxvLnksMCwxLG4pLG4rPXMsT20odGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSxhLngsYS55LG8ueCxvLnksMCwwLG4pLE9tKHRoaXMubGF5b3V0VmVydGV4QXJyYXksYS54LGEueSxvLngsby55LDAsMSxuKTtsZXQgYz10LnNlZ21lbnQudmVydGV4TGVuZ3RoO3RoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhjLGMrMixjKzEpLHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhjKzEsYysyLGMrMyksdC5zZWdtZW50LnZlcnRleExlbmd0aCs9NCx0LnNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoKz0yfX19O2Z1bmN0aW9uIEFtKGUsdCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCByPXRbbl07KG4hPT10Lmxlbmd0aC0xfHx0WzBdLnghPT1yLnh8fHRbMF0ueSE9PXIueSkmJihlLngrPXIueCxlLnkrPXIueSxlLnNhbXBsZUNvdW50KyspfX1IKGBGaWxsRXh0cnVzaW9uQnVja2V0YCxrbSx7b21pdDpbYGxheWVyc2AsYGZlYXR1cmVzYF19KTtsZXQgam07Y29uc3QgTW09KCk9PmptfHw9bmV3IGNsKHsiZmlsbC1leHRydXNpb24tcm91bmRlZC1jb3JuZXItZGlzdGFuY2UiOm5ldyBXKE1bYGxheW91dF9maWxsLWV4dHJ1c2lvbmBdW2BmaWxsLWV4dHJ1c2lvbi1yb3VuZGVkLWNvcm5lci1kaXN0YW5jZWBdLGBmaWxsLWV4dHJ1c2lvbi1yb3VuZGVkLWNvcm5lci1kaXN0YW5jZWApfSk7bGV0IE5tO2NvbnN0IFBtPSgpPT5ObXx8PW5ldyBjbCh7ImZpbGwtZXh0cnVzaW9uLW9wYWNpdHkiOm5ldyBXKE1bYHBhaW50X2ZpbGwtZXh0cnVzaW9uYF1bYGZpbGwtZXh0cnVzaW9uLW9wYWNpdHlgXSxgZmlsbC1leHRydXNpb24tb3BhY2l0eWApLCJmaWxsLWV4dHJ1c2lvbi1jb2xvciI6bmV3IEcoTVtgcGFpbnRfZmlsbC1leHRydXNpb25gXVtgZmlsbC1leHRydXNpb24tY29sb3JgXSxgZmlsbC1leHRydXNpb24tY29sb3JgKSwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlIjpuZXcgVyhNW2BwYWludF9maWxsLWV4dHJ1c2lvbmBdW2BmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVgXSxgZmlsbC1leHRydXNpb24tdHJhbnNsYXRlYCksImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3IiOm5ldyBXKE1bYHBhaW50X2ZpbGwtZXh0cnVzaW9uYF1bYGZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JgXSxgZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvcmApLCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuIjpuZXcgYWwoTVtgcGFpbnRfZmlsbC1leHRydXNpb25gXVtgZmlsbC1leHRydXNpb24tcGF0dGVybmBdLGBmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuYCksImZpbGwtZXh0cnVzaW9uLWhlaWdodCI6bmV3IEcoTVtgcGFpbnRfZmlsbC1leHRydXNpb25gXVtgZmlsbC1leHRydXNpb24taGVpZ2h0YF0sYGZpbGwtZXh0cnVzaW9uLWhlaWdodGApLCJmaWxsLWV4dHJ1c2lvbi1iYXNlIjpuZXcgRyhNW2BwYWludF9maWxsLWV4dHJ1c2lvbmBdW2BmaWxsLWV4dHJ1c2lvbi1iYXNlYF0sYGZpbGwtZXh0cnVzaW9uLWJhc2VgKSwiZmlsbC1leHRydXNpb24tdmVydGljYWwtZ3JhZGllbnQiOm5ldyBXKE1bYHBhaW50X2ZpbGwtZXh0cnVzaW9uYF1bYGZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50YF0sYGZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50YCl9KTt2YXIgRm09e2dldCBwYWludCgpe3JldHVybiBQbSgpfSxnZXQgbGF5b3V0KCl7cmV0dXJuIE1tKCl9fTtjb25zdCBJbT1lPT5lLnR5cGU9PT1gZmlsbC1leHRydXNpb25gO3ZhciBMbT1jbGFzcyBleHRlbmRzIGRse2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSxGbSx0KX1jcmVhdGVCdWNrZXQoZSl7cmV0dXJuIG5ldyBrbShlKX1xdWVyeVJhZGl1cygpe3JldHVybiBEZCh0aGlzLnBhaW50LmdldChgZmlsbC1leHRydXNpb24tdHJhbnNsYXRlYCkpfWlzM0QoKXtyZXR1cm4hMH1xdWVyeUludGVyc2VjdHNGZWF0dXJlKHtxdWVyeUdlb21ldHJ5OmUsZmVhdHVyZTp0LGZlYXR1cmVTdGF0ZTpuLGdlb21ldHJ5OnIsdHJhbnNmb3JtOmkscGl4ZWxzVG9UaWxlVW5pdHM6YSxwaXhlbFBvc01hdHJpeDpvfSl7bGV0IHM9T2QoZSx0aGlzLnBhaW50LmdldChgZmlsbC1leHRydXNpb24tdHJhbnNsYXRlYCksdGhpcy5wYWludC5nZXQoYGZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JgKSwtaS5iZWFyaW5nSW5SYWRpYW5zLGEpLGM9dGhpcy5wYWludC5nZXQoYGZpbGwtZXh0cnVzaW9uLWhlaWdodGApLmV2YWx1YXRlKHQsbiksbD10aGlzLnBhaW50LmdldChgZmlsbC1leHRydXNpb24tYmFzZWApLmV2YWx1YXRlKHQsbiksdT1IbShzLG8sMCksZD1WbShyLGwsYyxvKSxmPWRbMF0scD1kWzFdO3JldHVybiBCbShmLHAsdSl9fTtmdW5jdGlvbiBSbShlLHQpe3JldHVybiBlLngqdC54K2UueSp0Lnl9ZnVuY3Rpb24gem0oZSx0KXtpZihlLmxlbmd0aD09PTEpe2xldCBuPTAscj10W24rK10saTtmb3IoOyFpfHxyLmVxdWFscyhpKTspaWYoaT10W24rK10sIWkpcmV0dXJuIDEvMDtmb3IoO248dC5sZW5ndGg7bisrKXtsZXQgYT10W25dLG89ZVswXSxzPWkuc3ViKHIpLGM9YS5zdWIociksbD1vLnN1YihyKSx1PVJtKHMscyksZD1SbShzLGMpLGY9Um0oYyxjKSxwPVJtKGwscyksbT1SbShsLGMpLGg9dSpmLWQqZCxnPShmKnAtZCptKS9oLF89KHUqbS1kKnApL2gsdj0xLWctXyx5PXIueip2K2kueipnK2EueipfO2lmKGlzRmluaXRlKHkpKXJldHVybiB5fXJldHVybiAxLzB9e2xldCBlPTEvMDtmb3IobGV0IG4gb2YgdCllPU1hdGgubWluKGUsbi56KTtyZXR1cm4gZX19ZnVuY3Rpb24gQm0oZSx0LG4pe2xldCByPTEvMDtoZChuLHQpJiYocj16bShuLHRbMF0pKTtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krKyl7bGV0IGE9dFtpXSxvPWVbaV07Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aC0xO2UrKyl7bGV0IHQ9YVtlXSxpPWFbZSsxXSxzPW9bZV0sYz1bdCxpLG9bZSsxXSxzLHRdO3BkKG4sYykmJihyPU1hdGgubWluKHIsem0obixjKSkpfX1yZXR1cm4gciE9PTEvMCYmcn1mdW5jdGlvbiBWbShlLHQsbixyKXtsZXQgaT1bXSxhPVtdLG89cls4XSp0LHM9cls5XSp0LGM9clsxMF0qdCx1PXJbMTFdKnQsZD1yWzhdKm4sZj1yWzldKm4scD1yWzEwXSpuLG09clsxMV0qbjtmb3IobGV0IHQgb2YgZSl7bGV0IGU9W10sbj1bXTtmb3IobGV0IGkgb2YgdCl7bGV0IHQ9aS54LGE9aS55LGg9clswXSp0K3JbNF0qYStyWzEyXSxnPXJbMV0qdCtyWzVdKmErclsxM10sXz1yWzJdKnQrcls2XSphK3JbMTRdLHY9clszXSp0K3JbN10qYStyWzE1XSx5PWgrbyxiPWcrcyx4PV8rYyxTPXYrdSxDPWgrZCx3PWcrZixUPV8rcCxFPXYrbSxEPW5ldyBsKHkvUyxiL1MpO0Quej14L1MsZS5wdXNoKEQpO2xldCBPPW5ldyBsKEMvRSx3L0UpO08uej1UL0Usbi5wdXNoKE8pfWkucHVzaChlKSxhLnB1c2gobil9cmV0dXJuW2ksYV19ZnVuY3Rpb24gSG0oZSx0LG4pe2xldCByPVtdO2ZvcihsZXQgaSBvZiBlKXtsZXQgZT1baS54LGkueSxuLDFdO05lKGUsZSx0KSxyLnB1c2gobmV3IGwoZVswXS9lWzNdLGVbMV0vZVszXSkpfXJldHVybiByfWZ1bmN0aW9uIFVtKGUsdCxuLHIpe2xldCBpPXIsYT10KyhuLXQ+PjEpLG89bi10LHMsYz1lW3RdLGw9ZVt0KzFdLHU9ZVtuXSxkPWVbbisxXTtmb3IobGV0IHI9dCszO3I8bjtyKz0zKXtsZXQgdD1XbShlW3JdLGVbcisxXSxjLGwsdSxkKTtpZih0Pmkpe3M9cixpPXQ7Y29udGludWV9aWYodD09PWkpe2xldCBlPU1hdGguYWJzKHItYSk7ZTxvJiYocz1yLG89ZSl9fWk+ciYmKHMtdD4zJiZVbShlLHQscyxyKSxlW3MrMl09aSxuLXM+MyYmVW0oZSxzLG4scikpfWZ1bmN0aW9uIFdtKGUsdCxuLHIsaSxhKXtsZXQgbz1pLW4scz1hLXI7aWYobyE9PTB8fHMhPT0wKXtsZXQgYz0oKGUtbikqbysodC1yKSpzKS8obypvK3Mqcyk7Yz4xPyhuPWkscj1hKTpjPjAmJihuKz1vKmMscis9cypjKX1yZXR1cm4gbz1lLW4scz10LXIsbypvK3Mqc31mdW5jdGlvbiBHbShlLHQsbixyKXtsZXQgaT17dHlwZTp0LGdlb206bn0sYT17aWQ6ZT8/bnVsbCx0eXBlOmkudHlwZSxnZW9tZXRyeTppLmdlb20sdGFnczpyLG1pblg6MS8wLG1pblk6MS8wLG1heFg6LTEvMCxtYXhZOi0xLzB9O3N3aXRjaChpLnR5cGUpe2Nhc2VgUG9pbnRgOmNhc2VgTXVsdGlQb2ludGA6cW0oYSxpLmdlb20pO2JyZWFrO2Nhc2VgTGluZVN0cmluZ2A6cW0oYSxpLmdlb20ucG9pbnRzKTticmVhaztjYXNlYFBvbHlnb25gOnFtKGEsaS5nZW9tWzBdLnBvaW50cyk7YnJlYWs7Y2FzZWBNdWx0aUxpbmVTdHJpbmdgOmZvcihsZXQgZSBvZiBpLmdlb20pcW0oYSxlLnBvaW50cyk7YnJlYWs7Y2FzZWBNdWx0aVBvbHlnb25gOmZvcihsZXQgZSBvZiBpLmdlb20pcW0oYSxlWzBdLnBvaW50cyl9cmV0dXJuIGF9ZnVuY3Rpb24gS20oZSl7bGV0IHQ9ZTtlLnBvaW50cy5sZW5ndGg+NjQmJih0LnBvaW50cz1uZXcgRmxvYXQ2NEFycmF5KGUucG9pbnRzKSl9ZnVuY3Rpb24gcW0oZSx0KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rPTMpZS5taW5YPU1hdGgubWluKGUubWluWCx0W25dKSxlLm1pblk9TWF0aC5taW4oZS5taW5ZLHRbbisxXSksZS5tYXhYPU1hdGgubWF4KGUubWF4WCx0W25dKSxlLm1heFk9TWF0aC5tYXgoZS5tYXhZLHRbbisxXSl9ZnVuY3Rpb24gSm0oZSx0KXtsZXQgbj1bXTtzd2l0Y2goZS50eXBlKXtjYXNlYEZlYXR1cmVDb2xsZWN0aW9uYDpmb3IobGV0IHI9MDtyPGUuZmVhdHVyZXMubGVuZ3RoO3IrKylZbShuLGUuZmVhdHVyZXNbcl0sdCxyKTticmVhaztjYXNlYEZlYXR1cmVgOlltKG4sZSx0KTticmVhaztkZWZhdWx0OlltKG4se3R5cGU6YEZlYXR1cmVgLGdlb21ldHJ5OmUscHJvcGVydGllczp2b2lkIDB9LHQpfXJldHVybiBufWZ1bmN0aW9uIFltKGUsdCxuLHIsaT0wKXtpZighdC5nZW9tZXRyeSlyZXR1cm47aWYoaT4xMDI0KXRocm93IEVycm9yKGBHZW9tZXRyeUNvbGxlY3Rpb24gbmVzdGluZyBleGNlZWRzIHN1cHBvcnRlZCBkZXB0aDogMTAyNGApO2lmKHQuZ2VvbWV0cnkudHlwZT09PWBHZW9tZXRyeUNvbGxlY3Rpb25gKXtabShlLHQsdC5nZW9tZXRyeSxuLHIsaSsxKTtyZXR1cm59aWYoIXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXM/Lmxlbmd0aClyZXR1cm47bGV0IGE9WG0odCxuLHIpLG89KG4udG9sZXJhbmNlLygoMTw8bi5tYXhab29tKSpuLmV4dGVudCkpKioyO3N3aXRjaCh0Lmdlb21ldHJ5LnR5cGUpe2Nhc2VgUG9pbnRgOlFtKGUsYSx0Lmdlb21ldHJ5LHQucHJvcGVydGllcyk7cmV0dXJuO2Nhc2VgTXVsdGlQb2ludGA6JG0oZSxhLHQuZ2VvbWV0cnksdC5wcm9wZXJ0aWVzKTtyZXR1cm47Y2FzZWBMaW5lU3RyaW5nYDplaChlLGEsdC5nZW9tZXRyeSxvLHQucHJvcGVydGllcyk7cmV0dXJuO2Nhc2VgTXVsdGlMaW5lU3RyaW5nYDp0aChlLGEsdC5nZW9tZXRyeSxvLG4sdC5wcm9wZXJ0aWVzKTtyZXR1cm47Y2FzZWBQb2x5Z29uYDpuaChlLGEsdC5nZW9tZXRyeSxvLHQucHJvcGVydGllcyk7cmV0dXJuO2Nhc2VgTXVsdGlQb2x5Z29uYDpyaChlLGEsdC5nZW9tZXRyeSxvLHQucHJvcGVydGllcyk7cmV0dXJuO2RlZmF1bHQ6dGhyb3cgRXJyb3IoYElucHV0IGRhdGEgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuYCl9fWZ1bmN0aW9uIFhtKGUsdCxuKXtyZXR1cm4gdC5wcm9tb3RlSWQ/ZS5wcm9wZXJ0aWVzPy5bdC5wcm9tb3RlSWRdOnQuZ2VuZXJhdGVJZD9ufHwwOmUuaWR9ZnVuY3Rpb24gWm0oZSx0LG4scixpLGE9MCl7Zm9yKGxldCBvIG9mIG4uZ2VvbWV0cmllcylZbShlLHtpZDp0LmlkLHR5cGU6YEZlYXR1cmVgLGdlb21ldHJ5Om8scHJvcGVydGllczp0LnByb3BlcnRpZXN9LHIsaSxhKX1mdW5jdGlvbiBRbShlLHQsbixyKXtsZXQgaT1bXTtpLnB1c2gob2gobi5jb29yZGluYXRlc1swXSksc2gobi5jb29yZGluYXRlc1sxXSksMCksZS5wdXNoKEdtKHQsYFBvaW50YCxpLHIpKX1mdW5jdGlvbiAkbShlLHQsbixyKXtsZXQgaT1bXTtmb3IobGV0IGUgb2Ygbi5jb29yZGluYXRlcylpLnB1c2gob2goZVswXSksc2goZVsxXSksMCk7ZS5wdXNoKEdtKHQsYE11bHRpUG9pbnRgLGkscikpfWZ1bmN0aW9uIGVoKGUsdCxuLHIsaSl7bGV0IGE9e3BvaW50czpbXX07aWgobi5jb29yZGluYXRlcyxhLHIsITEpLGUucHVzaChHbSh0LGBMaW5lU3RyaW5nYCxhLGkpKX1mdW5jdGlvbiB0aChlLHQsbixyLGksYSl7aWYoaS5saW5lTWV0cmljcylmb3IobGV0IGkgb2Ygbi5jb29yZGluYXRlcyl7bGV0IG49e3BvaW50czpbXX07aWgoaSxuLHIsITEpLGUucHVzaChHbSh0LGBMaW5lU3RyaW5nYCxuLGEpKX1lbHNle2xldCBpPVtdO2FoKG4uY29vcmRpbmF0ZXMsaSxyLCExKSxlLnB1c2goR20odCxgTXVsdGlMaW5lU3RyaW5nYCxpLGEpKX19ZnVuY3Rpb24gbmgoZSx0LG4scixpKXtsZXQgYT1bXTthaChuLmNvb3JkaW5hdGVzLGEsciwhMCksZS5wdXNoKEdtKHQsYFBvbHlnb25gLGEsaSkpfWZ1bmN0aW9uIHJoKGUsdCxuLHIsaSl7bGV0IGE9W107Zm9yKGxldCBlIG9mIG4uY29vcmRpbmF0ZXMpe2xldCB0PVtdO2FoKGUsdCxyLCEwKSxhLnB1c2godCl9ZS5wdXNoKEdtKHQsYE11bHRpUG9seWdvbmAsYSxpKSl9ZnVuY3Rpb24gaWgoZSx0LG4scil7bGV0IGksYSxvPTA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBzPW9oKGVbbl1bMF0pLGM9c2goZVtuXVsxXSk7dC5wb2ludHMucHVzaChzLGMsMCksbj4wJiYobys9cj8oaSpjLXMqYSkvMjpNYXRoLnNxcnQoKHMtaSkqKjIrKGMtYSkqKjIpKSxpPXMsYT1jfWxldCBzPXQucG9pbnRzLmxlbmd0aC0zO3QucG9pbnRzWzJdPTEsbj4wJiZVbSh0LnBvaW50cywwLHMsbiksdC5wb2ludHNbcysyXT0xLEttKHQpLHQuc2l6ZT1NYXRoLmFicyhvKSx0LnN0YXJ0PTAsdC5lbmQ9dC5zaXplfWZ1bmN0aW9uIGFoKGUsdCxuLHIpe2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXQgYT17cG9pbnRzOltdfTtpaChlW2ldLGEsbixyKSx0LnB1c2goYSl9fWZ1bmN0aW9uIG9oKGUpe3JldHVybiBlLzM2MCsuNX1mdW5jdGlvbiBzaChlKXtsZXQgdD1NYXRoLnNpbihlKk1hdGguUEkvMTgwKSxuPS41LS4yNSpNYXRoLmxvZygoMSt0KS8oMS10KSkvTWF0aC5QSTtyZXR1cm4gbjwwPzA6bj4xPzE6bn1mdW5jdGlvbiBjaChlKXtyZXR1cm57dHlwZTpgRmVhdHVyZUNvbGxlY3Rpb25gLGZlYXR1cmVzOmUubWFwKGU9PmxoKGUpKX19ZnVuY3Rpb24gbGgoZSl7bGV0IHQ9e3R5cGU6YEZlYXR1cmVgLGdlb21ldHJ5OnVoKGUpLHByb3BlcnRpZXM6ZS50YWdzfTtyZXR1cm4gZS5pZCE9bnVsbCYmKHQuaWQ9ZS5pZCksdH1mdW5jdGlvbiB1aChlKXtsZXR7dHlwZTp0LGdlb21ldHJ5Om59PWU7c3dpdGNoKHQpe2Nhc2VgUG9pbnRgOnJldHVybnt0eXBlOnQsY29vcmRpbmF0ZXM6ZmgoblswXSxuWzFdKX07Y2FzZWBNdWx0aVBvaW50YDpyZXR1cm57dHlwZTp0LGNvb3JkaW5hdGVzOmRoKG4pfTtjYXNlYExpbmVTdHJpbmdgOnJldHVybnt0eXBlOnQsY29vcmRpbmF0ZXM6ZGgobi5wb2ludHMpfTtjYXNlYE11bHRpTGluZVN0cmluZ2A6Y2FzZWBQb2x5Z29uYDpyZXR1cm57dHlwZTp0LGNvb3JkaW5hdGVzOm4ubWFwKGU9PmRoKGUucG9pbnRzKSl9O2Nhc2VgTXVsdGlQb2x5Z29uYDpyZXR1cm57dHlwZTp0LGNvb3JkaW5hdGVzOm4ubWFwKGU9PmUubWFwKGU9PmRoKGUucG9pbnRzKSkpfX19ZnVuY3Rpb24gZGgoZSl7bGV0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKz0zKXQucHVzaChmaChlW25dLGVbbisxXSkpO3JldHVybiB0fWZ1bmN0aW9uIGZoKGUsdCl7cmV0dXJuW3BoKGUpLG1oKHQpXX1mdW5jdGlvbiBwaChlKXtyZXR1cm4oZS0uNSkqMzYwfWZ1bmN0aW9uIG1oKGUpe2xldCB0PSgxODAtZSozNjApKk1hdGguUEkvMTgwO3JldHVybiAzNjAqTWF0aC5hdGFuKE1hdGguZXhwKHQpKS9NYXRoLlBJLTkwfWZ1bmN0aW9uIGhoKGUsdCxuLHIsaSxhLG8scyl7aWYobi89dCxyLz10LGE+PW4mJm88cilyZXR1cm4gZTtpZihvPG58fGE+PXIpcmV0dXJuIG51bGw7bGV0IGM9W107Zm9yKGxldCB0IG9mIGUpe2xldCBlPWk9PT0wP3QubWluWDp0Lm1pblksYT1pPT09MD90Lm1heFg6dC5tYXhZO2lmKGU+PW4mJmE8cil7Yy5wdXNoKHQpO2NvbnRpbnVlfWlmKCEoYTxufHxlPj1yKSlzd2l0Y2godC50eXBlKXtjYXNlYFBvaW50YDpjYXNlYE11bHRpUG9pbnRgOmdoKHQsYyxuLHIsaSk7Y29udGludWU7Y2FzZWBMaW5lU3RyaW5nYDpfaCh0LGMsbixyLGkscyk7Y29udGludWU7Y2FzZWBNdWx0aUxpbmVTdHJpbmdgOnZoKHQsYyxuLHIsaSk7Y29udGludWU7Y2FzZWBQb2x5Z29uYDp5aCh0LGMsbixyLGkpO2NvbnRpbnVlO2Nhc2VgTXVsdGlQb2x5Z29uYDpiaCh0LGMsbixyLGkpO2NvbnRpbnVlfX1yZXR1cm4gYy5sZW5ndGg/YzpudWxsfWZ1bmN0aW9uIGdoKGUsdCxuLHIsaSl7bGV0IGE9W107aWYoeGgoZS5nZW9tZXRyeSxhLG4scixpKSwhYS5sZW5ndGgpcmV0dXJuO2xldCBvPWEubGVuZ3RoPT09Mz9gUG9pbnRgOmBNdWx0aVBvaW50YDt0LnB1c2goR20oZS5pZCxvLGEsZS50YWdzKSl9ZnVuY3Rpb24gX2goZSx0LG4scixpLGEpe2xldCBvPVtdO2lmKFNoKGUuZ2VvbWV0cnksbyxuLHIsaSwhMSxhLmxpbmVNZXRyaWNzKSxvLmxlbmd0aCl7aWYoYS5saW5lTWV0cmljcyl7Zm9yKGxldCBuIG9mIG8pdC5wdXNoKEdtKGUuaWQsYExpbmVTdHJpbmdgLG4sZS50YWdzKSk7cmV0dXJufWlmKG8ubGVuZ3RoPjEpe3QucHVzaChHbShlLmlkLGBNdWx0aUxpbmVTdHJpbmdgLG8sZS50YWdzKSk7cmV0dXJufXQucHVzaChHbShlLmlkLGBMaW5lU3RyaW5nYCxvWzBdLGUudGFncykpfX1mdW5jdGlvbiB2aChlLHQsbixyLGkpe2xldCBhPVtdO2lmKHdoKGUuZ2VvbWV0cnksYSxuLHIsaSwhMSksYS5sZW5ndGgpe2lmKGEubGVuZ3RoPT09MSl7dC5wdXNoKEdtKGUuaWQsYExpbmVTdHJpbmdgLGFbMF0sZS50YWdzKSk7cmV0dXJufXQucHVzaChHbShlLmlkLGBNdWx0aUxpbmVTdHJpbmdgLGEsZS50YWdzKSl9fWZ1bmN0aW9uIHloKGUsdCxuLHIsaSl7bGV0IGE9W107d2goZS5nZW9tZXRyeSxhLG4scixpLCEwKSxhLmxlbmd0aCYmdC5wdXNoKEdtKGUuaWQsYFBvbHlnb25gLGEsZS50YWdzKSl9ZnVuY3Rpb24gYmgoZSx0LG4scixpKXtsZXQgYT1bXTtmb3IobGV0IHQgb2YgZS5nZW9tZXRyeSl7bGV0IGU9W107d2godCxlLG4scixpLCEwKSxlLmxlbmd0aCYmYS5wdXNoKGUpfWEubGVuZ3RoJiZ0LnB1c2goR20oZS5pZCxgTXVsdGlQb2x5Z29uYCxhLGUudGFncykpfWZ1bmN0aW9uIHhoKGUsdCxuLHIsaSl7Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKz0zKXtsZXQgbz1lW2EraV07bz49biYmbzw9ciYmVGgodCxlW2FdLGVbYSsxXSxlW2ErMl0pfX1mdW5jdGlvbiBTaChlLHQsbixyLGksYSxvKXtsZXQgcz1DaChlKSxjPWk9PT0wP0VoOkRoLGw9ZS5zdGFydCx1LGQ7Zm9yKGxldCBmPTA7ZjxlLnBvaW50cy5sZW5ndGgtMztmKz0zKXtsZXQgcD1lLnBvaW50c1tmXSxtPWUucG9pbnRzW2YrMV0saD1lLnBvaW50c1tmKzJdLGc9ZS5wb2ludHNbZiszXSxfPWUucG9pbnRzW2YrNF0sdj1pPT09MD9wOm0seT1pPT09MD9nOl8sYj0hMTtvJiYodT1NYXRoLnNxcnQoKHAtZykqKjIrKG0tXykqKjIpKSx2PG4/eT5uJiYoZD1jKHMscCxtLGcsXyxuKSxvJiYocy5zdGFydD1sK3UqZCkpOnY+cj95PHImJihkPWMocyxwLG0sZyxfLHIpLG8mJihzLnN0YXJ0PWwrdSpkKSk6VGgocy5wb2ludHMscCxtLGgpLHk8biYmdj49biYmKGQ9YyhzLHAsbSxnLF8sbiksYj0hMCkseT5yJiZ2PD1yJiYoZD1jKHMscCxtLGcsXyxyKSxiPSEwKSwhYSYmYiYmKG8mJihzLmVuZD1sK3UqZCksdC5wdXNoKHMpLHM9Q2goZSkpLG8mJihsKz11KX1sZXQgZj1lLnBvaW50cy5sZW5ndGgtMyxwPWUucG9pbnRzW2ZdLG09ZS5wb2ludHNbZisxXSxoPWUucG9pbnRzW2YrMl0sZz1pPT09MD9wOm07Zz49biYmZzw9ciYmVGgocy5wb2ludHMscCxtLGgpLGY9cy5wb2ludHMubGVuZ3RoLTMsYSYmZj49MyYmKHMucG9pbnRzW2ZdIT09cy5wb2ludHNbMF18fHMucG9pbnRzW2YrMV0hPT1zLnBvaW50c1sxXSkmJlRoKHMucG9pbnRzLHMucG9pbnRzWzBdLHMucG9pbnRzWzFdLHMucG9pbnRzWzJdKSxzLnBvaW50cy5sZW5ndGgmJihLbShzKSx0LnB1c2gocykpfWZ1bmN0aW9uIENoKGUpe3JldHVybntwb2ludHM6W10sc2l6ZTplLnNpemUsc3RhcnQ6ZS5zdGFydCxlbmQ6ZS5lbmR9fWZ1bmN0aW9uIHdoKGUsdCxuLHIsaSxhKXtmb3IobGV0IG8gb2YgZSlTaChvLHQsbixyLGksYSwhMSl9ZnVuY3Rpb24gVGgoZSx0LG4scil7ZS5wdXNoKHQsbixyKX1mdW5jdGlvbiBFaChlLHQsbixyLGksYSl7bGV0IG89KGEtdCkvKHItdCk7cmV0dXJuIFRoKGUucG9pbnRzLGEsbisoaS1uKSpvLDEpLG99ZnVuY3Rpb24gRGgoZSx0LG4scixpLGEpe2xldCBvPShhLW4pLyhpLW4pO3JldHVybiBUaChlLnBvaW50cyx0KyhyLXQpKm8sYSwxKSxvfWZ1bmN0aW9uIE9oKGUsdCl7bGV0IG49dC5idWZmZXIvdC5leHRlbnQscj1lLGk9aGgoZSwxLC0xLW4sbiwwLC0xLDIsdCksYT1oaChlLDEsMS1uLDIrbiwwLC0xLDIsdCk7cmV0dXJuIWkmJiFhP3I6KHI9aGgoZSwxLC1uLDErbiwwLC0xLDIsdCl8fFtdLGkmJihyPWtoKGksMSkuY29uY2F0KHIpKSxhJiYocj1yLmNvbmNhdChraChhLC0xKSkpLHIpfWZ1bmN0aW9uIGtoKGUsdCl7bGV0IG49W107Zm9yKGxldCByIG9mIGUpc3dpdGNoKHIudHlwZSl7Y2FzZWBQb2ludGA6Y2FzZWBNdWx0aVBvaW50YDp7bGV0IGU9QWgoci5nZW9tZXRyeSx0KTtuLnB1c2goR20oci5pZCxyLnR5cGUsZSxyLnRhZ3MpKTtjb250aW51ZX1jYXNlYExpbmVTdHJpbmdgOntsZXQgZT1qaChyLmdlb21ldHJ5LHQpO24ucHVzaChHbShyLmlkLHIudHlwZSxlLHIudGFncykpO2NvbnRpbnVlfWNhc2VgTXVsdGlMaW5lU3RyaW5nYDpjYXNlYFBvbHlnb25gOntsZXQgZT1bXTtmb3IobGV0IG4gb2Ygci5nZW9tZXRyeSllLnB1c2goamgobix0KSk7bi5wdXNoKEdtKHIuaWQsci50eXBlLGUsci50YWdzKSk7Y29udGludWV9Y2FzZWBNdWx0aVBvbHlnb25gOntsZXQgZT1bXTtmb3IobGV0IG4gb2Ygci5nZW9tZXRyeSl7bGV0IHI9W107Zm9yKGxldCBlIG9mIG4pci5wdXNoKGpoKGUsdCkpO2UucHVzaChyKX1uLnB1c2goR20oci5pZCxyLnR5cGUsZSxyLnRhZ3MpKTtjb250aW51ZX19cmV0dXJuIG59ZnVuY3Rpb24gQWgoZSx0KXtsZXQgbj1bXTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrPTMpbi5wdXNoKGVbcl0rdCxlW3IrMV0sZVtyKzJdKTtyZXR1cm4gbn1mdW5jdGlvbiBqaChlLHQpe2xldCBuPXtwb2ludHM6W10sc2l6ZTplLnNpemV9O2Uuc3RhcnQhPT12b2lkIDAmJihuLnN0YXJ0PWUuc3RhcnQsbi5lbmQ9ZS5lbmQpO2ZvcihsZXQgcj0wO3I8ZS5wb2ludHMubGVuZ3RoO3IrPTMpbi5wb2ludHMucHVzaChlLnBvaW50c1tyXSt0LGUucG9pbnRzW3IrMV0sZS5wb2ludHNbcisyXSk7cmV0dXJuIEttKG4pLG59ZnVuY3Rpb24gTWgoZSx0LG4pe2xldCByPUZoKHQsbiksaT1bXTtpZihyLnJlbW92ZUFsbCYmKGk9ZSxlPVtdKSxyLnJlbW92ZS5zaXplfHxyLmFkZC5zaXplKXtsZXQgdD1bXTtmb3IobGV0IG4gb2YgZSkoci5yZW1vdmUuaGFzKG4uaWQpfHxyLmFkZC5oYXMobi5pZCkpJiZ0LnB1c2gobik7aWYodC5sZW5ndGgpe2k9aS5jb25jYXQodCk7bGV0IG49bmV3IFNldCh0Lm1hcChlPT5lLmlkKSk7ZT1lLmZpbHRlcihlPT4hbi5oYXMoZS5pZCkpfWlmKHIuYWRkLnNpemUpe2xldCB0PUptKHt0eXBlOmBGZWF0dXJlQ29sbGVjdGlvbmAsZmVhdHVyZXM6QXJyYXkuZnJvbShyLmFkZC52YWx1ZXMoKSl9LG4pO3Q9T2godCxuKSxpPWkuY29uY2F0KHQpLGU9ZS5jb25jYXQodCl9fWlmKHIudXBkYXRlLnNpemUpe2xldCB0PW5ldyBNYXAsYT1bXTtmb3IobGV0IG4gb2YgZSlyLnVwZGF0ZS5oYXMobi5pZCk/dC5zZXQobi5pZCxbLi4udC5nZXQobi5pZCl8fFtdLG5dKTphLnB1c2gobik7Zm9yKGxldFtlLG9db2Ygci51cGRhdGUpe2xldCByPXQuZ2V0KGUpO2lmKCFyfHxyLmxlbmd0aD09PTApY29udGludWU7bGV0IHM9TmgocixvLG4pO2k9aS5jb25jYXQocixzKSxhPWEuY29uY2F0KHMpfWU9YX1yZXR1cm57YWZmZWN0ZWQ6aSxzb3VyY2U6ZX19ZnVuY3Rpb24gTmgoZSx0LG4pe2xldCByPSEhdC5uZXdHZW9tZXRyeSxpPXQucmVtb3ZlQWxsUHJvcGVydGllc3x8dC5yZW1vdmVQcm9wZXJ0aWVzPy5sZW5ndGg+MHx8dC5hZGRPclVwZGF0ZVByb3BlcnRpZXM/Lmxlbmd0aD4wO2lmKHIpe2xldCByPWVbMF0sYT1KbSh7dHlwZTpgRmVhdHVyZUNvbGxlY3Rpb25gLGZlYXR1cmVzOlt7dHlwZTpgRmVhdHVyZWAsaWQ6ci5pZCxnZW9tZXRyeTp0Lm5ld0dlb21ldHJ5LHByb3BlcnRpZXM6aT9QaChyLnRhZ3MsdCk6ci50YWdzfV19LG4pO3JldHVybiBhPU9oKGEsbiksYX1pZihpKXtsZXQgbj1bXTtmb3IobGV0IHIgb2YgZSl7bGV0IGU9ey4uLnJ9O2UudGFncz1QaChlLnRhZ3MsdCksbi5wdXNoKGUpfXJldHVybiBufXJldHVybiBlfWZ1bmN0aW9uIFBoKGUsdCl7aWYodC5yZW1vdmVBbGxQcm9wZXJ0aWVzKXJldHVybnt9O2xldCBuPXsuLi5lfHx7fX07aWYodC5yZW1vdmVQcm9wZXJ0aWVzKWZvcihsZXQgZSBvZiB0LnJlbW92ZVByb3BlcnRpZXMpZGVsZXRlIG5bZV07aWYodC5hZGRPclVwZGF0ZVByb3BlcnRpZXMpZm9yKGxldHtrZXk6ZSx2YWx1ZTpyfW9mIHQuYWRkT3JVcGRhdGVQcm9wZXJ0aWVzKW5bZV09cjtyZXR1cm4gbn1mdW5jdGlvbiBGaChlLHQpe3JldHVybiBlP3tyZW1vdmVBbGw6ZS5yZW1vdmVBbGwscmVtb3ZlOm5ldyBTZXQoZS5yZW1vdmV8fFtdKSxhZGQ6bmV3IE1hcChlLmFkZD8ubWFwKGU9Plt0LnByb21vdGVJZD9lLnByb3BlcnRpZXNbdC5wcm9tb3RlSWRdOmUuaWQsZV0pKSx1cGRhdGU6bmV3IE1hcChlLnVwZGF0ZT8ubWFwKGU9PltlLmlkLGVdKSl9OntyZW1vdmU6bmV3IFNldCxhZGQ6bmV3IE1hcCx1cGRhdGU6bmV3IE1hcH19Y29uc3QgSWg9W0ludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XSxKPW5ldyBVaW50MzJBcnJheSg5Nik7dmFyIExoPWNsYXNzIGV7c3RhdGljIGZyb20odCl7aWYoIXR8fHQuYnl0ZUxlbmd0aD09PXZvaWQgMHx8dC5idWZmZXIpdGhyb3cgRXJyb3IoYERhdGEgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBBcnJheUJ1ZmZlciBvciBTaGFyZWRBcnJheUJ1ZmZlci5gKTtsZXRbbixyXT1uZXcgVWludDhBcnJheSh0LDAsMik7aWYobiE9PTIxOSl0aHJvdyBFcnJvcihgRGF0YSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgaW4gYSBLREJ1c2ggZm9ybWF0LmApO2xldCBpPXI+PjQ7aWYoaSE9PTEpdGhyb3cgRXJyb3IoYEdvdCB2JHtpfSBkYXRhIHdoZW4gZXhwZWN0ZWQgdjEuYCk7bGV0IGE9SWhbciYxNV07aWYoIWEpdGhyb3cgRXJyb3IoYFVucmVjb2duaXplZCBhcnJheSB0eXBlLmApO2xldFtvXT1uZXcgVWludDE2QXJyYXkodCwyLDEpLFtzXT1uZXcgVWludDMyQXJyYXkodCw0LDEpO3JldHVybiBuZXcgZShzLG8sYSx2b2lkIDAsdCl9Y29uc3RydWN0b3IoZSx0PTY0LG49RmxvYXQ2NEFycmF5LHI9QXJyYXlCdWZmZXIsaSl7aWYoaXNOYU4oZSl8fGU8MCl0aHJvdyBFcnJvcihgVW5leHBlY3RlZCBudW1JdGVtcyB2YWx1ZTogJHtlfS5gKTt0aGlzLm51bUl0ZW1zPStlLHRoaXMubm9kZVNpemU9TWF0aC5taW4oTWF0aC5tYXgoK3QsMiksNjU1MzUpLHRoaXMuQXJyYXlUeXBlPW4sdGhpcy5JbmRleEFycmF5VHlwZT1lPDY1NTM2P1VpbnQxNkFycmF5OlVpbnQzMkFycmF5O2xldCBhPUloLmluZGV4T2YodGhpcy5BcnJheVR5cGUpLG89ZSoyKnRoaXMuQXJyYXlUeXBlLkJZVEVTX1BFUl9FTEVNRU5ULHM9ZSp0aGlzLkluZGV4QXJyYXlUeXBlLkJZVEVTX1BFUl9FTEVNRU5ULGM9KDgtcyU4KSU4O2lmKGE8MCl0aHJvdyBFcnJvcihgVW5leHBlY3RlZCB0eXBlZCBhcnJheSBjbGFzczogJHtufS5gKTtpZihpKXRoaXMuZGF0YT1pLHRoaXMuaWRzPW5ldyB0aGlzLkluZGV4QXJyYXlUeXBlKGksOCxlKSx0aGlzLmNvb3Jkcz1uZXcgbihpLDgrcytjLGUqMiksdGhpcy5fcG9zPWUqMix0aGlzLl9maW5pc2hlZD0hMDtlbHNle2xldCBpPXRoaXMuZGF0YT1uZXcgcig4K28rcytjKTt0aGlzLmlkcz1uZXcgdGhpcy5JbmRleEFycmF5VHlwZShpLDgsZSksdGhpcy5jb29yZHM9bmV3IG4oaSw4K3MrYyxlKjIpLHRoaXMuX3Bvcz0wLHRoaXMuX2ZpbmlzaGVkPSExLG5ldyBVaW50OEFycmF5KGksMCwyKS5zZXQoWzIxOSwxNithXSksbmV3IFVpbnQxNkFycmF5KGksMiwxKVswXT10LG5ldyBVaW50MzJBcnJheShpLDQsMSlbMF09ZX19YWRkKGUsdCl7bGV0IG49dGhpcy5fcG9zPj4xO3JldHVybiB0aGlzLmlkc1tuXT1uLHRoaXMuY29vcmRzW3RoaXMuX3BvcysrXT1lLHRoaXMuY29vcmRzW3RoaXMuX3BvcysrXT10LG59ZmluaXNoKCl7bGV0IGU9dGhpcy5fcG9zPj4xO2lmKGUhPT10aGlzLm51bUl0ZW1zKXRocm93IEVycm9yKGBBZGRlZCAke2V9IGl0ZW1zIHdoZW4gZXhwZWN0ZWQgJHt0aGlzLm51bUl0ZW1zfS5gKTtyZXR1cm4gUmgodGhpcy5pZHMsdGhpcy5jb29yZHMsdGhpcy5ub2RlU2l6ZSwwLHRoaXMubnVtSXRlbXMtMSwwKSx0aGlzLl9maW5pc2hlZD0hMCx0aGlzfXJhbmdlKGUsdCxuLHIpe2lmKCF0aGlzLl9maW5pc2hlZCl0aHJvdyBFcnJvcihgRGF0YSBub3QgeWV0IGluZGV4ZWQgLSBjYWxsIGluZGV4LmZpbmlzaCgpLmApO2xldHtpZHM6aSxjb29yZHM6YSxub2RlU2l6ZTpvfT10aGlzO0pbMF09MCxKWzFdPWkubGVuZ3RoLTEsSlsyXT0wO2xldCBzPTMsYz1bXTtmb3IoO3M+MDspe2xldCBsPUpbLS1zXSx1PUpbLS1zXSxkPUpbLS1zXTtpZih1LWQ8PW8pe2ZvcihsZXQgbz1kO288PXU7bysrKXtsZXQgcz1hWzIqb10sbD1hWzIqbysxXTtzPj1lJiZzPD1uJiZsPj10JiZsPD1yJiZjLnB1c2goaVtvXSl9Y29udGludWV9bGV0IGY9ZCt1Pj4xLHA9YVsyKmZdLG09YVsyKmYrMV07cD49ZSYmcDw9biYmbT49dCYmbTw9ciYmYy5wdXNoKGlbZl0pLChsPT09MD9lPD1wOnQ8PW0pJiYoSltzKytdPWQsSltzKytdPWYtMSxKW3MrK109MS1sKSwobD09PTA/bj49cDpyPj1tKSYmKEpbcysrXT1mKzEsSltzKytdPXUsSltzKytdPTEtbCl9cmV0dXJuIGN9d2l0aGluKGUsdCxuKXtsZXQgcj1bXTtyZXR1cm4gdGhpcy53aXRoaW5JbnRvKGUsdCxuLHIpLHJ9d2l0aGluSW50byhlLHQsbixyKXtpZighdGhpcy5fZmluaXNoZWQpdGhyb3cgRXJyb3IoYERhdGEgbm90IHlldCBpbmRleGVkIC0gY2FsbCBpbmRleC5maW5pc2goKS5gKTtsZXR7aWRzOmksY29vcmRzOmEsbm9kZVNpemU6b309dGhpcztKWzBdPTAsSlsxXT1pLmxlbmd0aC0xLEpbMl09MDtsZXQgcz0zLGM9MCxsPW4qbjtmb3IoO3M+MDspe2xldCB1PUpbLS1zXSxkPUpbLS1zXSxmPUpbLS1zXTtpZihkLWY8PW8pe2ZvcihsZXQgbj1mO248PWQ7bisrKUhoKGFbMipuXSxhWzIqbisxXSxlLHQpPD1sJiYocltjKytdPWlbbl0pO2NvbnRpbnVlfWxldCBwPWYrZD4+MSxtPWFbMipwXSxoPWFbMipwKzFdO0hoKG0saCxlLHQpPD1sJiYocltjKytdPWlbcF0pLCh1PT09MD9lLW48PW06dC1uPD1oKSYmKEpbcysrXT1mLEpbcysrXT1wLTEsSltzKytdPTEtdSksKHU9PT0wP2Urbj49bTp0K24+PWgpJiYoSltzKytdPXArMSxKW3MrK109ZCxKW3MrK109MS11KX1yZXR1cm4gY319O2Z1bmN0aW9uIFJoKGUsdCxuLHIsaSxhKXtpZihpLXI8PW4pcmV0dXJuO2xldCBvPXIraT4+MTt6aChlLHQsbyxyLGksYSksUmgoZSx0LG4scixvLTEsMS1hKSxSaChlLHQsbixvKzEsaSwxLWEpfWZ1bmN0aW9uIHpoKGUsdCxuLHIsaSxhKXtmb3IoO2k+cjspe2lmKGktcj42MDApe2xldCBvPWktcisxLHM9bi1yKzEsYz1NYXRoLmxvZyhvKSxsPS41Kk1hdGguZXhwKDIqYy8zKSx1PS41Kk1hdGguc3FydChjKmwqKG8tbCkvbykqKHMtby8yPDA/LTE6MSk7emgoZSx0LG4sTWF0aC5tYXgocixNYXRoLmZsb29yKG4tcypsL28rdSkpLE1hdGgubWluKGksTWF0aC5mbG9vcihuKyhvLXMpKmwvbyt1KSksYSl9bGV0IG89dFsyKm4rYV0scz1yLGM9aTtmb3IoQmgoZSx0LHIsbiksdFsyKmkrYV0+byYmQmgoZSx0LHIsaSk7czxjOyl7Zm9yKEJoKGUsdCxzLGMpLHMrKyxjLS07dFsyKnMrYV08bzspcysrO2Zvcig7dFsyKmMrYV0+bzspYy0tfXRbMipyK2FdPT09bz9CaChlLHQscixjKTooYysrLEJoKGUsdCxjLGkpKSxjPD1uJiYocj1jKzEpLG48PWMmJihpPWMtMSl9fWZ1bmN0aW9uIEJoKGUsdCxuLHIpe1ZoKGUsbixyKSxWaCh0LDIqbiwyKnIpLFZoKHQsMipuKzEsMipyKzEpfWZ1bmN0aW9uIFZoKGUsdCxuKXtsZXQgcj1lW3RdO2VbdF09ZVtuXSxlW25dPXJ9ZnVuY3Rpb24gSGgoZSx0LG4scil7bGV0IGk9ZS1uLGE9dC1yO3JldHVybiBpKmkrYSphfWNvbnN0IFVoPXttaW5ab29tOjAsbWF4Wm9vbToxNixtaW5Qb2ludHM6MixyYWRpdXM6NDAsZXh0ZW50OjUxMixub2RlU2l6ZTo2NCxsb2c6ITEsZ2VuZXJhdGVJZDohMSxyZWR1Y2U6bnVsbCxtYXA6ZT0+ZX07dmFyIFdoPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVWgpLGUpLHRoaXMudHJlZXM9QXJyYXkodGhpcy5vcHRpb25zLm1heFpvb20rMSksdGhpcy5zdHJpZGU9dGhpcy5vcHRpb25zLnJlZHVjZT83OjYsdGhpcy5jbHVzdGVyUHJvcHM9W10sdGhpcy5wb2ludHM9W119bG9hZChlKXtsZXQgdD1bXTtmb3IobGV0IG4gb2YgZSl7aWYoIW4uZ2VvbWV0cnkpY29udGludWU7bGV0W2Uscl09bi5nZW9tZXRyeS5jb29yZGluYXRlcyxbaSxhXT1bb2goZSksc2gocildLG89e2lkOm4uaWQsdHlwZTpgUG9pbnRgLGdlb21ldHJ5OltpLGFdLHRhZ3M6bi5wcm9wZXJ0aWVzfTt0LnB1c2gobyl9dGhpcy5jcmVhdGVJbmRleCh0KX1pbml0aWFsaXplKGUpe2xldCB0PVtdO2ZvcihsZXQgbiBvZiBlKW4udHlwZT09PWBQb2ludGAmJnQucHVzaChuKTt0aGlzLmNyZWF0ZUluZGV4KHQpfXVwZGF0ZUluZGV4KGUsdCxuKXt0aGlzLm9wdGlvbnM9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFVoKSxuLmNsdXN0ZXJPcHRpb25zKSx0aGlzLmluaXRpYWxpemUoZSl9Y3JlYXRlSW5kZXgoZSl7bGV0e2xvZzp0LG1pblpvb206bixtYXhab29tOnJ9PXRoaXMub3B0aW9uczt0JiZjb25zb2xlLnRpbWUoYHRvdGFsIHRpbWVgKTtsZXQgaT1gcHJlcGFyZSAke2UubGVuZ3RofSBwb2ludHNgO3QmJmNvbnNvbGUudGltZShpKSx0aGlzLnBvaW50cz1lO2xldCBhPVtdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgbj1lW3RdO2lmKCFuPy5nZW9tZXRyeSljb250aW51ZTtsZXRbcixpXT1uLmdlb21ldHJ5O3I9TWF0aC5mcm91bmQociksaT1NYXRoLmZyb3VuZChpKSxhLnB1c2gocixpLDEvMCx0LC0xLDEpLHRoaXMub3B0aW9ucy5yZWR1Y2UmJmEucHVzaCgwKX1sZXQgbz10aGlzLnRyZWVzW3IrMV09dGhpcy5jcmVhdGVUcmVlKGEpO3QmJmNvbnNvbGUudGltZUVuZChpKTtmb3IobGV0IGU9cjtlPj1uO2UtLSl7bGV0IG49RGF0ZS5ub3coKTtvPXRoaXMudHJlZXNbZV09dGhpcy5jcmVhdGVUcmVlKHRoaXMuY2x1c3RlcihvLGUpKSx0JiZjb25zb2xlLmxvZyhgeiVkOiAlZCBjbHVzdGVycyBpbiAlZG1zYCxlLG8ubnVtSXRlbXMsRGF0ZS5ub3coKS1uKX10JiZjb25zb2xlLnRpbWVFbmQoYHRvdGFsIHRpbWVgKX1nZXRDbHVzdGVycyhlLHQpe3JldHVybiB0aGlzLmdldENsdXN0ZXJzSW50ZXJuYWwoZSx0KS5tYXAoZT0+bGgoZSkpfWdldENsdXN0ZXJzSW50ZXJuYWwoZSx0KXtsZXQgbj0oKGVbMF0rMTgwKSUzNjArMzYwKSUzNjAtMTgwLHI9TWF0aC5tYXgoLTkwLE1hdGgubWluKDkwLGVbMV0pKSxpPWVbMl09PT0xODA/MTgwOigoZVsyXSsxODApJTM2MCszNjApJTM2MC0xODAsYT1NYXRoLm1heCgtOTAsTWF0aC5taW4oOTAsZVszXSkpO2lmKGVbMl0tZVswXT49MzYwKW49LTE4MCxpPTE4MDtlbHNlIGlmKG4+aSl7bGV0IGU9dGhpcy5nZXRDbHVzdGVyc0ludGVybmFsKFtuLHIsMTgwLGFdLHQpLG89dGhpcy5nZXRDbHVzdGVyc0ludGVybmFsKFstMTgwLHIsaSxhXSx0KTtyZXR1cm4gZS5jb25jYXQobyl9bGV0IG89dGhpcy50cmVlc1t0aGlzLmxpbWl0Wm9vbSh0KV0scz1vLnJhbmdlKG9oKG4pLHNoKGEpLG9oKGkpLHNoKHIpKSxjPW8uZmxhdERhdGEsbD1bXTtmb3IobGV0IGUgb2Ygcyl7bGV0IHQ9dGhpcy5zdHJpZGUqZTtsLnB1c2goY1t0KzVdPjE/R2goYyx0LHRoaXMuY2x1c3RlclByb3BzKTp0aGlzLnBvaW50c1tjW3QrM11dKX1yZXR1cm4gbH1nZXRDaGlsZHJlbihlKXtsZXQgdD10aGlzLmdldE9yaWdpbklkKGUpLG49dGhpcy5nZXRPcmlnaW5ab29tKGUpLHI9RXJyb3IoYE5vIGNsdXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkOiBgK2UpLGk9dGhpcy50cmVlc1tuXTtpZighaSl0aHJvdyByO2xldCBhPWkuZmxhdERhdGE7aWYodCp0aGlzLnN0cmlkZT49YS5sZW5ndGgpdGhyb3cgcjtsZXQgbz10aGlzLm9wdGlvbnMucmFkaXVzLyh0aGlzLm9wdGlvbnMuZXh0ZW50KjIqKihuLTEpKSxzPWFbdCp0aGlzLnN0cmlkZV0sYz1hW3QqdGhpcy5zdHJpZGUrMV0sbD1pLndpdGhpbihzLGMsbyksdT1bXTtmb3IobGV0IHQgb2YgbCl7bGV0IG49dCp0aGlzLnN0cmlkZTthW24rNF09PT1lJiZ1LnB1c2goYVtuKzVdPjE/S2goYSxuLHRoaXMuY2x1c3RlclByb3BzKTpsaCh0aGlzLnBvaW50c1thW24rM11dKSl9aWYodS5sZW5ndGg9PT0wKXRocm93IHI7cmV0dXJuIHV9Z2V0TGVhdmVzKGUsdCxuKXt0fHw9MTAsbnx8PTA7bGV0IHI9W107cmV0dXJuIHRoaXMuYXBwZW5kTGVhdmVzKHIsZSx0LG4sMCkscn1nZXRUaWxlKGUsdCxuKXtsZXQgcj10aGlzLnRyZWVzW3RoaXMubGltaXRab29tKGUpXTtpZighcilyZXR1cm4gbnVsbDtsZXQgaT0yKiplLHtleHRlbnQ6YSxyYWRpdXM6b309dGhpcy5vcHRpb25zLHM9by9hLGM9KG4tcykvaSxsPShuKzErcykvaSx1PXt0cmFuc2Zvcm1lZDohMCxmZWF0dXJlczpbXSxzb3VyY2U6bnVsbCx4OnQseTpuLHo6ZX07cmV0dXJuIHRoaXMuYWRkVGlsZUZlYXR1cmVzKHIucmFuZ2UoKHQtcykvaSxjLCh0KzErcykvaSxsKSxyLmZsYXREYXRhLHQsbixpLHUpLHQ9PT0wJiZ0aGlzLmFkZFRpbGVGZWF0dXJlcyhyLnJhbmdlKDEtcy9pLGMsMSxsKSxyLmZsYXREYXRhLGksbixpLHUpLHQ9PT1pLTEmJnRoaXMuYWRkVGlsZUZlYXR1cmVzKHIucmFuZ2UoMCxjLHMvaSxsKSxyLmZsYXREYXRhLC0xLG4saSx1KSx1fWdldENsdXN0ZXJFeHBhbnNpb25ab29tKGUpe3JldHVybiB0aGlzLmdldE9yaWdpblpvb20oZSl9YXBwZW5kTGVhdmVzKGUsdCxuLHIsaSl7bGV0IGE9dGhpcy5nZXRDaGlsZHJlbih0KTtmb3IobGV0IHQgb2YgYSl7bGV0IGE9dC5wcm9wZXJ0aWVzO2lmKGE/LmNsdXN0ZXI/aSthLnBvaW50X2NvdW50PD1yP2krPWEucG9pbnRfY291bnQ6aT10aGlzLmFwcGVuZExlYXZlcyhlLGEuY2x1c3Rlcl9pZCxuLHIsaSk6aTxyP2krKzplLnB1c2godCksZS5sZW5ndGg9PT1uKWJyZWFrfXJldHVybiBpfWNyZWF0ZVRyZWUoZSl7bGV0IHQ9bmV3IExoKGUubGVuZ3RoL3RoaXMuc3RyaWRlfDAsdGhpcy5vcHRpb25zLm5vZGVTaXplLEZsb2F0MzJBcnJheSk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKz10aGlzLnN0cmlkZSl0LmFkZChlW25dLGVbbisxXSk7cmV0dXJuIHQuZmluaXNoKCksdC5mbGF0RGF0YT1lLHQuZGF0YT1udWxsLHR9YWRkVGlsZUZlYXR1cmVzKGUsdCxuLHIsaSxhKXtmb3IobGV0IG8gb2YgZSl7bGV0IGU9byp0aGlzLnN0cmlkZSxzPXRbZSs1XT4xLGMsbCx1O2lmKHMpYz1xaCh0LGUsdGhpcy5jbHVzdGVyUHJvcHMpLGw9dFtlXSx1PXRbZSsxXTtlbHNle2xldCBuPXRoaXMucG9pbnRzW3RbZSszXV07Yz1uLnRhZ3MsW2wsdV09bi5nZW9tZXRyeX1sZXQgZD17dHlwZToxLGdlb21ldHJ5OltbTWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMuZXh0ZW50KihsKmktbikpLE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCoodSppLXIpKV1dLHRhZ3M6Y30sZjtmPXN8fHRoaXMub3B0aW9ucy5nZW5lcmF0ZUlkP3RbZSszXTp0aGlzLnBvaW50c1t0W2UrM11dLmlkLGYhPT12b2lkIDAmJihkLmlkPWYpLGEuZmVhdHVyZXMucHVzaChkKX19bGltaXRab29tKGUpe3JldHVybiBNYXRoLm1heCh0aGlzLm9wdGlvbnMubWluWm9vbSxNYXRoLm1pbihNYXRoLmZsb29yKCtlKSx0aGlzLm9wdGlvbnMubWF4Wm9vbSsxKSl9Y2x1c3RlcihlLHQpe2xldHtyYWRpdXM6bixleHRlbnQ6cixyZWR1Y2U6aSxtaW5Qb2ludHM6YX09dGhpcy5vcHRpb25zLG89bi8ocioyKip0KSxzPWUuZmxhdERhdGEsYz1bXSxsPXRoaXMuc3RyaWRlO2ZvcihsZXQgbj0wO248cy5sZW5ndGg7bis9bCl7aWYoc1tuKzJdPD10KWNvbnRpbnVlO3NbbisyXT10O2xldCByPXNbbl0sdT1zW24rMV0sZD1lLndpdGhpbihzW25dLHNbbisxXSxvKSxmPXNbbis1XSxwPWY7Zm9yKGxldCBlIG9mIGQpe2xldCBuPWUqbDtzW24rMl0+dCYmKHArPXNbbis1XSl9aWYocD5mJiZwPj1hKXtsZXQgZT1yKmYsYT11KmYsbyxtPS0xLGg9KChuL2x8MCk8PDUpKyh0KzEpK3RoaXMucG9pbnRzLmxlbmd0aDtmb3IobGV0IHIgb2YgZCl7bGV0IGM9cipsO2lmKHNbYysyXTw9dCljb250aW51ZTtzW2MrMl09dDtsZXQgdT1zW2MrNV07ZSs9c1tjXSp1LGErPXNbYysxXSp1LHNbYys0XT1oLGkmJihvfHwobz10aGlzLm1hcChzLG4sITApLG09dGhpcy5jbHVzdGVyUHJvcHMubGVuZ3RoLHRoaXMuY2x1c3RlclByb3BzLnB1c2gobykpLGkobyx0aGlzLm1hcChzLGMpKSl9c1tuKzRdPWgsYy5wdXNoKGUvcCxhL3AsMS8wLGgsLTEscCksaSYmYy5wdXNoKG0pfWVsc2V7Zm9yKGxldCBlPTA7ZTxsO2UrKyljLnB1c2goc1tuK2VdKTtpZihwPjEpZm9yKGxldCBlIG9mIGQpe2xldCBuPWUqbDtpZighKHNbbisyXTw9dCkpe3NbbisyXT10O2ZvcihsZXQgZT0wO2U8bDtlKyspYy5wdXNoKHNbbitlXSl9fX19cmV0dXJuIGN9Z2V0T3JpZ2luSWQoZSl7cmV0dXJuIGUtdGhpcy5wb2ludHMubGVuZ3RoPj41fWdldE9yaWdpblpvb20oZSl7cmV0dXJuKGUtdGhpcy5wb2ludHMubGVuZ3RoKSUzMn1tYXAoZSx0LG4pe2lmKGVbdCs1XT4xKXtsZXQgcj10aGlzLmNsdXN0ZXJQcm9wc1tlW3QrNl1dO3JldHVybiBuP09iamVjdC5hc3NpZ24oe30scik6cn1sZXQgcj10aGlzLnBvaW50c1tlW3QrM11dLnRhZ3MsaT10aGlzLm9wdGlvbnMubWFwKHIpO3JldHVybiBuJiZpPT09cj9PYmplY3QuYXNzaWduKHt9LGkpOml9fTtmdW5jdGlvbiBHaChlLHQsbil7cmV0dXJue2lkOmVbdCszXSx0eXBlOmBQb2ludGAsdGFnczpxaChlLHQsbiksZ2VvbWV0cnk6W2VbdF0sZVt0KzFdXX19ZnVuY3Rpb24gS2goZSx0LG4pe3JldHVybnt0eXBlOmBGZWF0dXJlYCxpZDplW3QrM10scHJvcGVydGllczpxaChlLHQsbiksZ2VvbWV0cnk6e3R5cGU6YFBvaW50YCxjb29yZGluYXRlczpbcGgoZVt0XSksbWgoZVt0KzFdKV19fX1mdW5jdGlvbiBxaChlLHQsbil7bGV0IHI9ZVt0KzVdLGk9cj49MWU0P2Ake01hdGgucm91bmQoci8xZTMpfWtgOnI+PTFlMz9gJHtNYXRoLnJvdW5kKHIvMTAwKS8xMH1rYDpyLGE9ZVt0KzZdLG89YT09PS0xP3t9Ok9iamVjdC5hc3NpZ24oe30sblthXSk7cmV0dXJuIE9iamVjdC5hc3NpZ24obyx7Y2x1c3RlcjohMCxjbHVzdGVyX2lkOmVbdCszXSxwb2ludF9jb3VudDpyLHBvaW50X2NvdW50X2FiYnJldmlhdGVkOml9KX1jb25zdCBKaD1gZ2VvanNvbnZ0X2NsaXBfc3RhcnRgLFloPWBnZW9qc29udnRfY2xpcF9lbmRgO2Z1bmN0aW9uIFhoKGUsdCxuLHIsaSl7bGV0IGE9dD09PWkubWF4Wm9vbT8wOmkudG9sZXJhbmNlLygoMTw8dCkqaS5leHRlbnQpLG89e3RyYW5zZm9ybWVkOiExLGZlYXR1cmVzOltdLHNvdXJjZTpudWxsLHg6bix5OnIsejp0LG1pblg6MixtaW5ZOjEsbWF4WDotMSxtYXhZOjAsbnVtUG9pbnRzOjAsbnVtU2ltcGxpZmllZDowLG51bUZlYXR1cmVzOmUubGVuZ3RofTtmb3IobGV0IHQgb2YgZSlaaChvLHQsYSxpKTtyZXR1cm4gb31mdW5jdGlvbiBaaChlLHQsbixyKXtzd2l0Y2goZS5taW5YPU1hdGgubWluKGUubWluWCx0Lm1pblgpLGUubWluWT1NYXRoLm1pbihlLm1pblksdC5taW5ZKSxlLm1heFg9TWF0aC5tYXgoZS5tYXhYLHQubWF4WCksZS5tYXhZPU1hdGgubWF4KGUubWF4WSx0Lm1heFkpLHQudHlwZSl7Y2FzZWBQb2ludGA6Y2FzZWBNdWx0aVBvaW50YDpRaChlLHQpO3JldHVybjtjYXNlYExpbmVTdHJpbmdgOiRoKGUsdCxuLHIpO3JldHVybjtjYXNlYE11bHRpTGluZVN0cmluZ2A6Y2FzZWBQb2x5Z29uYDplZyhlLHQsbik7cmV0dXJuO2Nhc2VgTXVsdGlQb2x5Z29uYDp0ZyhlLHQsbik7cmV0dXJufX1mdW5jdGlvbiBRaChlLHQpe2xldCBuPVtdO2ZvcihsZXQgcj0wO3I8dC5nZW9tZXRyeS5sZW5ndGg7cis9MyluLnB1c2godC5nZW9tZXRyeVtyXSx0Lmdlb21ldHJ5W3IrMV0pLGUubnVtUG9pbnRzKyssZS5udW1TaW1wbGlmaWVkKys7aWYoIW4ubGVuZ3RoKXJldHVybjtsZXQgcj17dHlwZToxLHRhZ3M6dC50YWdzfHxudWxsLGdlb21ldHJ5Om59O3QuaWQhPT1udWxsJiYoci5pZD10LmlkKSxlLmZlYXR1cmVzLnB1c2gocil9ZnVuY3Rpb24gJGgoZSx0LG4scil7bGV0IGk9W107aWYobmcoaSx0Lmdlb21ldHJ5LGUsbiwhMSwhMSksIWkubGVuZ3RoKXJldHVybjtsZXQgYT10LnRhZ3N8fG51bGw7aWYoci5saW5lTWV0cmljcyl7YT17fTtmb3IobGV0IGUgaW4gdC50YWdzKWFbZV09dC50YWdzW2VdO2FbSmhdPXQuZ2VvbWV0cnkuc3RhcnQvdC5nZW9tZXRyeS5zaXplLGFbWWhdPXQuZ2VvbWV0cnkuZW5kL3QuZ2VvbWV0cnkuc2l6ZX1sZXQgbz17dHlwZToyLHRhZ3M6YSxnZW9tZXRyeTppfTt0LmlkIT09bnVsbCYmKG8uaWQ9dC5pZCksZS5mZWF0dXJlcy5wdXNoKG8pfWZ1bmN0aW9uIGVnKGUsdCxuKXtsZXQgcj1bXTtmb3IobGV0IGk9MDtpPHQuZ2VvbWV0cnkubGVuZ3RoO2krKyluZyhyLHQuZ2VvbWV0cnlbaV0sZSxuLHQudHlwZT09PWBQb2x5Z29uYCxpPT09MCk7aWYoIXIubGVuZ3RoKXJldHVybjtsZXQgaT17dHlwZTp0LnR5cGU9PT1gUG9seWdvbmA/MzoyLHRhZ3M6dC50YWdzfHxudWxsLGdlb21ldHJ5OnJ9O3QuaWQhPT1udWxsJiYoaS5pZD10LmlkKSxlLmZlYXR1cmVzLnB1c2goaSl9ZnVuY3Rpb24gdGcoZSx0LG4pe2xldCByPVtdO2ZvcihsZXQgaT0wO2k8dC5nZW9tZXRyeS5sZW5ndGg7aSsrKXtsZXQgYT10Lmdlb21ldHJ5W2ldO2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCsrKW5nKHIsYVt0XSxlLG4sITAsdD09PTApfWlmKCFyLmxlbmd0aClyZXR1cm47bGV0IGk9e3R5cGU6Myx0YWdzOnQudGFnc3x8bnVsbCxnZW9tZXRyeTpyfTt0LmlkIT09bnVsbCYmKGkuaWQ9dC5pZCksZS5mZWF0dXJlcy5wdXNoKGkpfWZ1bmN0aW9uIG5nKGUsdCxuLHIsaSxhKXtsZXQgbz1yKnI7aWYocj4wJiZ0LnNpemU8KGk/bzpyKSl7bi5udW1Qb2ludHMrPXQucG9pbnRzLmxlbmd0aC8zO3JldHVybn1sZXQgcz1bXTtmb3IobGV0IGU9MDtlPHQucG9pbnRzLmxlbmd0aDtlKz0zKShyPT09MHx8dC5wb2ludHNbZSsyXT5vKSYmKG4ubnVtU2ltcGxpZmllZCsrLHMucHVzaCh0LnBvaW50c1tlXSx0LnBvaW50c1tlKzFdKSksbi5udW1Qb2ludHMrKztpJiZyZyhzLGEpLGUucHVzaChzKX1mdW5jdGlvbiByZyhlLHQpe2xldCBuPTA7Zm9yKGxldCB0PTAscj1lLmxlbmd0aCxpPXItMjt0PHI7aT10LHQrPTIpbis9KGVbdF0tZVtpXSkqKGVbdCsxXStlW2krMV0pO2lmKG4+MD09PXQpZm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG4vMjt0Kz0yKXtsZXQgcj1lW3RdLGk9ZVt0KzFdO2VbdF09ZVtuLTItdF0sZVt0KzFdPWVbbi0xLXRdLGVbbi0yLXRdPXIsZVtuLTEtdF09aX19ZnVuY3Rpb24gaWcoZSx0KXtpZihlLnRyYW5zZm9ybWVkKXJldHVybiBlO2xldCBuPTE8PGUueixyPWUueCxpPWUueTtmb3IobGV0IGEgb2YgZS5mZWF0dXJlcylhLnR5cGU9PT0xP2FnKGEsdCxuLHIsaSk6b2coYSx0LG4scixpKTtyZXR1cm4gZS50cmFuc2Zvcm1lZD0hMCxlfWZ1bmN0aW9uIGFnKGUsdCxuLHIsaSl7bGV0IGE9ZSxvPWUuZ2VvbWV0cnkscz1bXTtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrPTIpcy5wdXNoKHNnKG9bZV0sb1tlKzFdLHQsbixyLGkpKTtyZXR1cm4gYS5nZW9tZXRyeT1zLGF9ZnVuY3Rpb24gb2coZSx0LG4scixpKXtsZXQgYT1lLG89ZS5nZW9tZXRyeSxzPVtdO2ZvcihsZXQgZSBvZiBvKXtsZXQgYT1bXTtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rPTIpYS5wdXNoKHNnKGVbb10sZVtvKzFdLHQsbixyLGkpKTtzLnB1c2goYSl9cmV0dXJuIGEuZ2VvbWV0cnk9cyxhfWZ1bmN0aW9uIHNnKGUsdCxuLHIsaSxhKXtyZXR1cm5bTWF0aC5yb3VuZChuKihlKnItaSkpLE1hdGgucm91bmQobioodCpyLWEpKV19dmFyIGNnPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1lLHRoaXMudG90YWw9MCx0aGlzLnN0YXRzPXt9LHRoaXMudGlsZXM9e30sdGhpcy50aWxlQ29vcmRzPVtdLHRoaXMuc3RhdHM9e30sdGhpcy50b3RhbD0wfWluaXRpYWxpemUoZSl7dGhpcy5zcGxpdFRpbGUoZSwwLDAsMCksdGhpcy5vcHRpb25zLmRlYnVnJiYoZS5sZW5ndGgmJmNvbnNvbGUubG9nKGBmZWF0dXJlczogJWQsIHBvaW50czogJWRgLHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsdGhpcy50aWxlc1swXS5udW1Qb2ludHMpLGNvbnNvbGUudGltZUVuZChgZ2VuZXJhdGUgdGlsZXNgKSxjb25zb2xlLmxvZyhgdGlsZXMgZ2VuZXJhdGVkOmAsdGhpcy50b3RhbCxKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSkpfXVwZGF0ZUluZGV4KGUsdCxuKXtuLmRlYnVnPjEmJihjb25zb2xlLmxvZyhgaW52YWxpZGF0aW5nIHRpbGVzYCksY29uc29sZS50aW1lKGBpbnZhbGlkYXRpbmdgKSksdGhpcy5pbnZhbGlkYXRlVGlsZXModCksbi5kZWJ1Zz4xJiZjb25zb2xlLnRpbWVFbmQoYGludmFsaWRhdGluZ2ApO2xldFtyLGksYV09WzAsMCwwXSxvPVhoKGUscixpLGEsbik7by5zb3VyY2U9ZTtsZXQgcz1sZyhyLGksYSk7aWYodGhpcy50aWxlc1tzXT1vLHRoaXMudGlsZUNvb3Jkcy5wdXNoKHt6OnIseDppLHk6YSxpZDpzfSksbi5kZWJ1Zyl7bGV0IGU9YHoke3J9YDt0aGlzLnN0YXRzW2VdPSh0aGlzLnN0YXRzW2VdfHwwKSsxLHRoaXMudG90YWwrK319Z2V0Q2x1c3RlckV4cGFuc2lvblpvb20oZSl7cmV0dXJuIG51bGx9Z2V0Q2hpbGRyZW4oZSl7cmV0dXJuIG51bGx9Z2V0TGVhdmVzKGUsdCxuKXtyZXR1cm4gbnVsbH1nZXRUaWxlKGUsdCxuKXtsZXR7ZXh0ZW50OnIsZGVidWc6aX09dGhpcy5vcHRpb25zLGE9MTw8ZTt0PXQrYSZhLTE7bGV0IG89bGcoZSx0LG4pO2lmKHRoaXMudGlsZXNbb10pcmV0dXJuIGlnKHRoaXMudGlsZXNbb10scik7aT4xJiZjb25zb2xlLmxvZyhgZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWRgLGUsdCxuKTtsZXQgcz1lLGM9dCxsPW4sdTtmb3IoOyF1JiZzPjA7KXMtLSxjPj49MSxsPj49MSx1PXRoaXMudGlsZXNbbGcocyxjLGwpXTtyZXR1cm4hdT8uc291cmNlfHwoaT4xJiYoY29uc29sZS5sb2coYGZvdW5kIHBhcmVudCB0aWxlIHolZC0lZC0lZGAscyxjLGwpLGNvbnNvbGUudGltZShgZHJpbGxpbmcgZG93bmApKSx0aGlzLnNwbGl0VGlsZSh1LnNvdXJjZSxzLGMsbCxlLHQsbiksaT4xJiZjb25zb2xlLnRpbWVFbmQoYGRyaWxsaW5nIGRvd25gKSwhdGhpcy50aWxlc1tvXSk/bnVsbDppZyh0aGlzLnRpbGVzW29dLHIpfXNwbGl0VGlsZShlLHQsbixyLGksYSxvKXtsZXQgcz1bZSx0LG4scl0sYz10aGlzLm9wdGlvbnMsbD1jLmRlYnVnO2Zvcig7cy5sZW5ndGg7KXtyPXMucG9wKCksbj1zLnBvcCgpLHQ9cy5wb3AoKSxlPXMucG9wKCk7bGV0IHU9MTw8dCxkPWxnKHQsbixyKSxmPXRoaXMudGlsZXNbZF07aWYoIWYmJihsPjEmJmNvbnNvbGUudGltZShgY3JlYXRpb25gKSxmPXRoaXMudGlsZXNbZF09WGgoZSx0LG4scixjKSx0aGlzLnRpbGVDb29yZHMucHVzaCh7ejp0LHg6bix5OnIsaWQ6ZH0pLGwpKXtsPjEmJihjb25zb2xlLmxvZyhgdGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpYCx0LG4scixmLm51bUZlYXR1cmVzLGYubnVtUG9pbnRzLGYubnVtU2ltcGxpZmllZCksY29uc29sZS50aW1lRW5kKGBjcmVhdGlvbmApKTtsZXQgZT1geiR7dH1gO3RoaXMuc3RhdHNbZV09KHRoaXMuc3RhdHNbZV18fDApKzEsdGhpcy50b3RhbCsrfWlmKGYuc291cmNlPWUsaT09bnVsbCl7aWYodD09PWMuaW5kZXhNYXhab29tfHxmLm51bVBvaW50czw9Yy5pbmRleE1heFBvaW50cyljb250aW51ZX1lbHNlIGlmKHQ9PT1jLm1heFpvb218fHQ9PT1pKWNvbnRpbnVlO2Vsc2UgaWYoaSE9bnVsbCl7bGV0IGU9aS10O2lmKG4hPT1hPj5lfHxyIT09bz4+ZSljb250aW51ZX1pZihmLnNvdXJjZT1udWxsLCFlLmxlbmd0aCljb250aW51ZTtsPjEmJmNvbnNvbGUudGltZShgY2xpcHBpbmdgKTtsZXQgcD0uNSpjLmJ1ZmZlci9jLmV4dGVudCxtPS41LXAsaD0uNStwLGc9MStwLF89bnVsbCx2PW51bGwseT1udWxsLGI9bnVsbCx4PWhoKGUsdSxuLXAsbitoLDAsZi5taW5YLGYubWF4WCxjKSxTPWhoKGUsdSxuK20sbitnLDAsZi5taW5YLGYubWF4WCxjKTt4JiYoXz1oaCh4LHUsci1wLHIraCwxLGYubWluWSxmLm1heFksYyksdj1oaCh4LHUscittLHIrZywxLGYubWluWSxmLm1heFksYykpLFMmJih5PWhoKFMsdSxyLXAscitoLDEsZi5taW5ZLGYubWF4WSxjKSxiPWhoKFMsdSxyK20scitnLDEsZi5taW5ZLGYubWF4WSxjKSksbD4xJiZjb25zb2xlLnRpbWVFbmQoYGNsaXBwaW5nYCkscy5wdXNoKF98fFtdLHQrMSxuKjIscioyKSxzLnB1c2godnx8W10sdCsxLG4qMixyKjIrMSkscy5wdXNoKHl8fFtdLHQrMSxuKjIrMSxyKjIpLHMucHVzaChifHxbXSx0KzEsbioyKzEscioyKzEpfX1pbnZhbGlkYXRlVGlsZXMoZSl7aWYoIWUubGVuZ3RoKXJldHVybjtsZXQgdD10aGlzLm9wdGlvbnMse2RlYnVnOm59PXQscj0xLzAsaT0tMS8wLGE9MS8wLG89LTEvMDtmb3IobGV0IHQgb2YgZSlyPU1hdGgubWluKHIsdC5taW5YKSxpPU1hdGgubWF4KGksdC5tYXhYKSxhPU1hdGgubWluKGEsdC5taW5ZKSxvPU1hdGgubWF4KG8sdC5tYXhZKTtsZXQgcz10LmJ1ZmZlci90LmV4dGVudCxjPW5ldyBTZXQ7Zm9yKGxldCB0IGluIHRoaXMudGlsZXMpe2xldCBsPXRoaXMudGlsZXNbdF0sdT0xPDxsLnosZD0obC54LXMpL3UsZj0obC54KzErcykvdSxwPShsLnktcykvdSxtPShsLnkrMStzKS91O2lmKGk8ZHx8cj49Znx8bzxwfHxhPj1tKWNvbnRpbnVlO2xldCBoPSExO2ZvcihsZXQgdCBvZiBlKWlmKHQubWF4WD49ZCYmdC5taW5YPGYmJnQubWF4WT49cCYmdC5taW5ZPG0pe2g9ITA7YnJlYWt9aWYoaCl7aWYobil7bj4xJiZjb25zb2xlLmxvZyhgaW52YWxpZGF0ZSB0aWxlIHolZC0lZC0lZCAoZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkLCBzaW1wbGlmaWVkOiAlZClgLGwueixsLngsbC55LGwubnVtRmVhdHVyZXMsbC5udW1Qb2ludHMsbC5udW1TaW1wbGlmaWVkKTtsZXQgZT1geiR7bC56fWA7dGhpcy5zdGF0c1tlXT0odGhpcy5zdGF0c1tlXXx8MCktMSx0aGlzLnRvdGFsLS19ZGVsZXRlIHRoaXMudGlsZXNbdF0sYy5hZGQodCl9fWMuc2l6ZSYmKHRoaXMudGlsZUNvb3Jkcz10aGlzLnRpbGVDb29yZHMuZmlsdGVyKGU9PiFjLmhhcyhlLmlkKSkpfX07ZnVuY3Rpb24gbGcoZSx0LG4pe3JldHVybigoMTw8ZSkqbit0KSozMitlfWNvbnN0IHVnPXttYXhab29tOjE0LGluZGV4TWF4Wm9vbTo1LGluZGV4TWF4UG9pbnRzOjFlNSx0b2xlcmFuY2U6MyxleHRlbnQ6NDA5NixidWZmZXI6NjQsbGluZU1ldHJpY3M6ITEscHJvbW90ZUlkOm51bGwsZ2VuZXJhdGVJZDohMSx1cGRhdGVhYmxlOiExLGNsdXN0ZXI6ITEsY2x1c3Rlck9wdGlvbnM6VWgsZGVidWc6MH07dmFyIGRnPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dD10aGlzLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSx1Zyx0KTtsZXQgbj10LmRlYnVnO2lmKG4mJmNvbnNvbGUudGltZShgcHJlcHJvY2VzcyBkYXRhYCksdC5tYXhab29tPDB8fHQubWF4Wm9vbT4yNCl0aHJvdyBFcnJvcihgbWF4Wm9vbSBzaG91bGQgYmUgaW4gdGhlIDAtMjQgcmFuZ2VgKTtpZih0LnByb21vdGVJZCYmdC5nZW5lcmF0ZUlkKXRocm93IEVycm9yKGBwcm9tb3RlSWQgYW5kIGdlbmVyYXRlSWQgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuYCk7bGV0IHI9Sm0oZSx0KTtuJiYoY29uc29sZS50aW1lRW5kKGBwcmVwcm9jZXNzIGRhdGFgKSxjb25zb2xlLmxvZyhgaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkYCx0LmluZGV4TWF4Wm9vbSx0LmluZGV4TWF4UG9pbnRzKSxjb25zb2xlLnRpbWUoYGdlbmVyYXRlIHRpbGVzYCkpLHI9T2gocix0KSx0LnVwZGF0ZWFibGUmJih0aGlzLnNvdXJjZT1yKSx0aGlzLmluaXRpYWxpemVJbmRleChyLHQpfWluaXRpYWxpemVJbmRleChlLHQpe3RoaXMudGlsZUluZGV4PXQuY2x1c3Rlcj9uZXcgV2godC5jbHVzdGVyT3B0aW9ucyk6bmV3IGNnKHQpLGUubGVuZ3RoJiZ0aGlzLnRpbGVJbmRleC5pbml0aWFsaXplKGUpfWdldFRpbGUoZSx0LG4pe3JldHVybiBlPStlLHQ9K3Qsbj0rbixlPDB8fGU+MjQ/bnVsbDp0aGlzLnRpbGVJbmRleC5nZXRUaWxlKGUsdCxuKX11cGRhdGVEYXRhKGUsdCl7bGV0IG49dGhpcy5vcHRpb25zO2lmKCFuLnVwZGF0ZWFibGUpdGhyb3cgRXJyb3IoInRvIHVwZGF0ZSB0aWxlIGdlb2pzb24gYHVwZGF0ZWFibGVgIG9wdGlvbiBtdXN0IGJlIHNldCB0byB0cnVlIik7bGV0e2FmZmVjdGVkOnIsc291cmNlOml9PU1oKHRoaXMuc291cmNlLGUsbik7dCYmKHthZmZlY3RlZDpyLHNvdXJjZTppfT10aGlzLmZpbHRlclVwZGF0ZShpLHIsdCkpLHIubGVuZ3RoJiYodGhpcy5zb3VyY2U9aSx0aGlzLnRpbGVJbmRleC51cGRhdGVJbmRleChpLHIsbikpfWZpbHRlclVwZGF0ZShlLHQsbil7bGV0IHI9bmV3IFNldDtmb3IobGV0IGkgb2YgZSlpLmlkIT1udWxsJiYobihsaChpKSl8fCh0LnB1c2goaSksci5hZGQoaS5pZCkpKTtyZXR1cm4gZT1lLmZpbHRlcihlPT4hci5oYXMoZS5pZCkpLHthZmZlY3RlZDp0LHNvdXJjZTplfX1nZXREYXRhKCl7aWYoIXRoaXMub3B0aW9ucy51cGRhdGVhYmxlKXRocm93IEVycm9yKCJ0byByZXRyaWV2ZSBkYXRhIHRoZSBgdXBkYXRlYWJsZWAgb3B0aW9uIG11c3QgYmUgc2V0IHRvIHRydWUiKTtyZXR1cm4gY2godGhpcy5zb3VyY2UpfXVwZGF0ZUNsdXN0ZXJPcHRpb25zKGUsdCl7bGV0IG49dGhpcy5vcHRpb25zLmNsdXN0ZXI7aWYodGhpcy5vcHRpb25zLmNsdXN0ZXI9ZSx0aGlzLm9wdGlvbnMuY2x1c3Rlck9wdGlvbnM9dCxuPT1lKXt0aGlzLnRpbGVJbmRleC51cGRhdGVJbmRleCh0aGlzLnNvdXJjZSxbXSx0aGlzLm9wdGlvbnMpO3JldHVybn10aGlzLmluaXRpYWxpemVJbmRleCh0aGlzLnNvdXJjZSx0aGlzLm9wdGlvbnMpfWdldENsdXN0ZXJFeHBhbnNpb25ab29tKGUpe3JldHVybiB0aGlzLnRpbGVJbmRleC5nZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShlKX1nZXRDbHVzdGVyQ2hpbGRyZW4oZSl7cmV0dXJuIHRoaXMudGlsZUluZGV4LmdldENoaWxkcmVuKGUpfWdldENsdXN0ZXJMZWF2ZXMoZSx0LG4pe3JldHVybiB0aGlzLnRpbGVJbmRleC5nZXRMZWF2ZXMoZSx0LG4pfX07Y29uc3QgZmc9cShbe25hbWU6YGFfcG9zX25vcm1hbGAsY29tcG9uZW50czoyLHR5cGU6YEludDE2YH0se25hbWU6YGFfZGF0YWAsY29tcG9uZW50czo0LHR5cGU6YFVpbnQ4YH1dLDQpLHBnPWZnLm1lbWJlcnM7Zmcuc2l6ZSxmZy5hbGlnbm1lbnQ7Y29uc3QgbWc9cShbe25hbWU6YGFfdXZfeGAsY29tcG9uZW50czoxLHR5cGU6YEZsb2F0MzJgfSx7bmFtZTpgYV9zcGxpdF9pbmRleGAsY29tcG9uZW50czoxLHR5cGU6YEZsb2F0MzJgfV0pLGhnPW1nLm1lbWJlcnM7bWcuc2l6ZSxtZy5hbGlnbm1lbnQ7Y29uc3QgZ2c9TWF0aC5jb3MoNzUvMiooTWF0aC5QSS8xODApKSxfZz0xLzIsdmc9MioqMTQvX2c7dmFyIHlnPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuem9vbT1lLnpvb20sdGhpcy5vdmVyc2NhbGluZz1lLm92ZXJzY2FsaW5nLHRoaXMubGF5ZXJzPWUubGF5ZXJzLHRoaXMubGF5ZXJJZHM9dGhpcy5sYXllcnMubWFwKGU9PmUuaWQpLHRoaXMuaW5kZXg9ZS5pbmRleCx0aGlzLmhhc0RlcGVuZGVuY2llcz0hMSx0aGlzLnBhdHRlcm5GZWF0dXJlcz1bXSx0aGlzLmxpbmVDbGlwc0FycmF5PVtdLHRoaXMuZ3JhZGllbnRzPXt9O2ZvcihsZXQgZSBvZiB0aGlzLmxheWVycyl0aGlzLmdyYWRpZW50c1tlLmlkXT17fTt0aGlzLmxheW91dFZlcnRleEFycmF5PW5ldyBsdSx0aGlzLmxheW91dFZlcnRleEFycmF5Mj1uZXcgdXUsdGhpcy5pbmRleEFycmF5PW5ldyBidSx0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucz1uZXcgbmQoZS5sYXllcnMsZS56b29tKSx0aGlzLnNlZ21lbnRzPW5ldyBUdSx0aGlzLm1heExpbmVMZW5ndGg9MCx0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHM9dGhpcy5sYXllcnMuZmlsdGVyKGU9PmUuaXNTdGF0ZURlcGVuZGVudCgpKS5tYXAoZT0+ZS5pZCl9cG9wdWxhdGUoZSx0LG4pe3RoaXMuaGFzRGVwZW5kZW5jaWVzPVNmKGBsaW5lYCx0aGlzLmxheWVycyx0KXx8dGhpcy5oYXNMaW5lRGFzaGFycmF5KHRoaXMubGF5ZXJzKTtsZXQgcj10aGlzLmxheWVyc1swXS5sYXlvdXQuZ2V0KGBsaW5lLXNvcnQta2V5YCksaT0hci5pc0NvbnN0YW50KCksYT1bXSxvPW5ldyBVKHRoaXMuem9vbSkscz10aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5uZWVkR2VvbWV0cnk7Zm9yKGxldHtmZWF0dXJlOnQsaWQ6YyxpbmRleDpsLHNvdXJjZUxheWVySW5kZXg6dX1vZiBlKXtsZXQgZT1sZCh0LHMpO2lmKCF0aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5maWx0ZXIobyxlLG4pKWNvbnRpbnVlO2xldCBkPWk/ci5ldmFsdWF0ZShlLHt9LG4pOnZvaWQgMCxmPXtpZDpjLHByb3BlcnRpZXM6dC5wcm9wZXJ0aWVzLHR5cGU6dC50eXBlLHNvdXJjZUxheWVySW5kZXg6dSxpbmRleDpsLGdlb21ldHJ5OnM/ZS5nZW9tZXRyeTpjZCh0KSxwYXR0ZXJuczp7fSxkYXNoZXM6e30sc29ydEtleTpkfTthLnB1c2goZil9aSYmYS5zb3J0KChlLHQpPT5lLnNvcnRLZXktdC5zb3J0S2V5KTtmb3IobGV0IHIgb2YgYSl7bGV0e2dlb21ldHJ5OmksaW5kZXg6YSxzb3VyY2VMYXllckluZGV4Om99PXI7dGhpcy5oYXNEZXBlbmRlbmNpZXM/KFNmKGBsaW5lYCx0aGlzLmxheWVycyx0KT9DZihgbGluZWAsdGhpcy5sYXllcnMscix7em9vbTp0aGlzLnpvb219LHQpOnRoaXMuaGFzTGluZURhc2hhcnJheSh0aGlzLmxheWVycykmJnRoaXMuYWRkTGluZURhc2hEZXBlbmRlbmNpZXModGhpcy5sYXllcnMscix0aGlzLnpvb20sdCksdGhpcy5wYXR0ZXJuRmVhdHVyZXMucHVzaChyKSk6dGhpcy5hZGRGZWF0dXJlKHIsaSxhLG4se30se30sdC5zdWJkaXZpc2lvbkdyYW51bGFyaXR5KTtsZXQgcz1lW2FdLmZlYXR1cmU7dC5mZWF0dXJlSW5kZXguaW5zZXJ0KHMsaSxhLG8sdGhpcy5pbmRleCl9fXVwZGF0ZShlLHQsbixyKXt0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLmxlbmd0aCYmdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXMoZSx0LHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMse2ltYWdlUG9zaXRpb25zOm4sZGFzaFBvc2l0aW9uczpyfSl9YWRkRmVhdHVyZXMoZSx0LG4scil7Zm9yKGxldCBpIG9mIHRoaXMucGF0dGVybkZlYXR1cmVzKXRoaXMuYWRkRmVhdHVyZShpLGkuZ2VvbWV0cnksaS5pbmRleCx0LG4scixlLnN1YmRpdmlzaW9uR3JhbnVsYXJpdHkpfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGg9PT0wfXVwbG9hZFBlbmRpbmcoKXtyZXR1cm4hdGhpcy51cGxvYWRlZHx8dGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWR9dXBsb2FkKGUpe3RoaXMudXBsb2FkZWR8fCh0aGlzLmxheW91dFZlcnRleEFycmF5Mi5sZW5ndGghPT0wJiYodGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIyPWUuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXkyLGhnKSksdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXI9ZS5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSxwZyksdGhpcy5pbmRleEJ1ZmZlcj1lLmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSkpLHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChlKSx0aGlzLnVwbG9hZGVkPSEwfWRlc3Ryb3koKXt0aGlzLmxheW91dFZlcnRleEJ1ZmZlciYmKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCksdGhpcy5zZWdtZW50cy5kZXN0cm95KCkpfWxpbmVGZWF0dXJlQ2xpcHMoZSl7aWYoZS5wcm9wZXJ0aWVzJiZPYmplY3QuaGFzT3duKGUucHJvcGVydGllcyxgZ2VvanNvbnZ0X2NsaXBfc3RhcnRgKSYmT2JqZWN0Lmhhc093bihlLnByb3BlcnRpZXMsYGdlb2pzb252dF9jbGlwX2VuZGApKXJldHVybntzdGFydDorZS5wcm9wZXJ0aWVzW0poXSxlbmQ6K2UucHJvcGVydGllc1tZaF19fWFkZEZlYXR1cmUoZSx0LG4scixpLGEsbyl7bGV0IHM9dGhpcy5sYXllcnNbMF0ubGF5b3V0LGM9cy5nZXQoYGxpbmUtam9pbmApLmV2YWx1YXRlKGUse30pLGw9cy5nZXQoYGxpbmUtY2FwYCkuZXZhbHVhdGUoZSx7fSksdT1zLmdldChgbGluZS1taXRlci1saW1pdGApLmV2YWx1YXRlKGUse30pLGQ9cy5nZXQoYGxpbmUtcm91bmQtbGltaXRgKS5ldmFsdWF0ZShlLHt9KTt0aGlzLmxpbmVDbGlwcz10aGlzLmxpbmVGZWF0dXJlQ2xpcHMoZSk7Zm9yKGxldCBuIG9mIHQpdGhpcy5hZGRMaW5lKG4sZSxjLGwsdSxkLHIsbyk7dGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCxlLG4se2ltYWdlUG9zaXRpb25zOmksZGFzaFBvc2l0aW9uczphLGNhbm9uaWNhbDpyfSl9YWRkTGluZShlLHQsbixyLGksYSxvLHMpe3RoaXMuZGlzdGFuY2U9MCx0aGlzLnNjYWxlZERpc3RhbmNlPTAsdGhpcy50b3RhbERpc3RhbmNlPTA7bGV0IGM9bz9zLmxpbmUuZ2V0R3JhbnVsYXJpdHlGb3Jab29tTGV2ZWwoby56KToxO2lmKGU9VHAoZSxjKSx0aGlzLmxpbmVDbGlwcyl7dGhpcy5saW5lQ2xpcHNBcnJheS5wdXNoKHRoaXMubGluZUNsaXBzKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoLTE7dCsrKXRoaXMudG90YWxEaXN0YW5jZSs9ZVt0XS5kaXN0KGVbdCsxXSk7dGhpcy51cGRhdGVTY2FsZWREaXN0YW5jZSgpLHRoaXMubWF4TGluZUxlbmd0aD1NYXRoLm1heCh0aGlzLm1heExpbmVMZW5ndGgsdGhpcy50b3RhbERpc3RhbmNlKX1sZXQgbD1KcC50eXBlc1t0LnR5cGVdPT09YFBvbHlnb25gLHU9ZS5sZW5ndGg7Zm9yKDt1Pj0yJiZlW3UtMV0uZXF1YWxzKGVbdS0yXSk7KXUtLTtsZXQgZD0wO2Zvcig7ZDx1LTEmJmVbZF0uZXF1YWxzKGVbZCsxXSk7KWQrKztpZih1LWQ8KGw/MzoyKSlyZXR1cm47bj09PWBiZXZlbGAmJihpPTEuMDUpO2xldCBmPXRoaXMub3ZlcnNjYWxpbmc8PTE2PzE1KmovKDUxMip0aGlzLm92ZXJzY2FsaW5nKTowLHA9dGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCh1KjEwLHRoaXMubGF5b3V0VmVydGV4QXJyYXksdGhpcy5pbmRleEFycmF5KSxtLGgsZyxfLHY7dGhpcy5lMT10aGlzLmUyPS0xLGwmJihtPWVbdS0yXSx2PWVbZF0uc3ViKG0pLl91bml0KCkuX3BlcnAoKSk7Zm9yKGxldCB0PWQ7dDx1O3QrKyl7aWYoZz10PT09dS0xP2w/ZVtkKzFdOnZvaWQgMDplW3QrMV0sZyYmZVt0XS5lcXVhbHMoZykpY29udGludWU7diYmKF89diksbSYmKGg9bSksbT1lW3RdLHY9Zz9nLnN1YihtKS5fdW5pdCgpLl9wZXJwKCk6XyxffHw9djtsZXQgbz1fLmFkZCh2KTsoby54IT09MHx8by55IT09MCkmJm8uX3VuaXQoKTtsZXQgcz1fLngqdi54K18ueSp2LnksYz1vLngqdi54K28ueSp2LnkseT1jPT09MD8xLzA6MS9jLGI9MipNYXRoLnNxcnQoMi0yKmMpLHg9YzxnZyYmaCYmZyxTPV8ueCp2LnktXy55KnYueD4wO2lmKHgmJnQ+ZCl7bGV0IGU9bS5kaXN0KGgpO2lmKGU+MipmKXtsZXQgdD1tLnN1YihtLnN1YihoKS5fbXVsdChmL2UpLl9yb3VuZCgpKTt0aGlzLnVwZGF0ZURpc3RhbmNlKGgsdCksdGhpcy5hZGRDdXJyZW50VmVydGV4KHQsXywwLDAscCksaD10fX1sZXQgQz1oJiZnLHc9Qz9uOmw/YGJ1dHRgOnI7aWYoQyYmdz09PWByb3VuZGAmJih5PGE/dz1gbWl0ZXJgOnk8PTImJih3PWBmYWtlcm91bmRgKSksdz09PWBtaXRlcmAmJnk+aSYmKHc9YGJldmVsYCksdz09PWBiZXZlbGAmJih5PjImJih3PWBmbGlwYmV2ZWxgKSx5PGkmJih3PWBtaXRlcmApKSxoJiZ0aGlzLnVwZGF0ZURpc3RhbmNlKGgsbSksdz09PWBtaXRlcmApby5fbXVsdCh5KSx0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgobSxvLDAsMCxwKTtlbHNlIGlmKHc9PT1gZmxpcGJldmVsYCl7aWYoeT4xMDApbz12Lm11bHQoLTEpO2Vsc2V7bGV0IGU9eSpfLmFkZCh2KS5tYWcoKS9fLnN1Yih2KS5tYWcoKTtvLl9wZXJwKCkuX211bHQoZSooUz8tMToxKSl9dGhpcy5hZGRDdXJyZW50VmVydGV4KG0sbywwLDAscCksdGhpcy5hZGRDdXJyZW50VmVydGV4KG0sby5tdWx0KC0xKSwwLDAscCl9ZWxzZSBpZih3PT09YGJldmVsYHx8dz09PWBmYWtlcm91bmRgKXtsZXQgZT0tTWF0aC5zcXJ0KHkqeS0xKSx0PVM/ZTowLG49Uz8wOmU7aWYoaCYmdGhpcy5hZGRDdXJyZW50VmVydGV4KG0sXyx0LG4scCksdz09PWBmYWtlcm91bmRgKXtsZXQgZT1NYXRoLnJvdW5kKGIqMTgwL01hdGguUEkvMjApO2ZvcihsZXQgdD0xO3Q8ZTt0Kyspe2xldCBuPXQvZTtpZihuIT09LjUpe2xldCBlPW4tLjUsdD0xLjA5MDQrcyooLTMuMjQ1MitzKigzLjU1NjQ1LXMqMS40MzUxOSkpLHI9Ljg0ODAxMytzKigtMS4wNjAyMStzKi4yMTU2MzgpO24rPW4qZSoobi0xKSoodCplKmUrcil9bGV0IHI9di5zdWIoXykuX211bHQobikuX2FkZChfKS5fdW5pdCgpLl9tdWx0KFM/LTE6MSk7dGhpcy5hZGRIYWxmVmVydGV4KG0sci54LHIueSwhMSxTLDAscCl9fWcmJnRoaXMuYWRkQ3VycmVudFZlcnRleChtLHYsLXQsLW4scCl9ZWxzZSBpZih3PT09YGJ1dHRgKXRoaXMuYWRkQ3VycmVudFZlcnRleChtLG8sMCwwLHApO2Vsc2UgaWYodz09PWBzcXVhcmVgKXtsZXQgZT1oPzE6LTE7dGhpcy5hZGRDdXJyZW50VmVydGV4KG0sbyxlLGUscCl9ZWxzZSB3PT09YHJvdW5kYCYmKGgmJih0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgobSxfLDAsMCxwKSx0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgobSxfLDEsMSxwLCEwKSksZyYmKHRoaXMuYWRkQ3VycmVudFZlcnRleChtLHYsLTEsLTEscCwhMCksdGhpcy5hZGRDdXJyZW50VmVydGV4KG0sdiwwLDAscCkpKTtpZih4JiZ0PHUtMSl7bGV0IGU9bS5kaXN0KGcpO2lmKGU+MipmKXtsZXQgdD1tLmFkZChnLnN1YihtKS5fbXVsdChmL2UpLl9yb3VuZCgpKTt0aGlzLnVwZGF0ZURpc3RhbmNlKG0sdCksdGhpcy5hZGRDdXJyZW50VmVydGV4KHQsdiwwLDAscCksbT10fX19fWFkZEN1cnJlbnRWZXJ0ZXgoZSx0LG4scixpLGE9ITEpe2xldCBvPXQueCt0LnkqbixzPXQueS10LngqbixjPS10LngrdC55KnIsbD0tdC55LXQueCpyO3RoaXMuYWRkSGFsZlZlcnRleChlLG8scyxhLCExLG4saSksdGhpcy5hZGRIYWxmVmVydGV4KGUsYyxsLGEsITAsLXIsaSksdGhpcy5kaXN0YW5jZT52Zy8yJiZ0aGlzLnRvdGFsRGlzdGFuY2U9PT0wJiYodGhpcy5kaXN0YW5jZT0wLHRoaXMudXBkYXRlU2NhbGVkRGlzdGFuY2UoKSx0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoZSx0LG4scixpLGEpKX1hZGRIYWxmVmVydGV4KHt4OmUseTp0fSxuLHIsaSxhLG8scyl7bGV0IGM9KHRoaXMubGluZUNsaXBzP3RoaXMuc2NhbGVkRGlzdGFuY2UqKHZnLTEpOnRoaXMuc2NhbGVkRGlzdGFuY2UpKl9nO2lmKHRoaXMubGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2soKGU8PDEpKyArISFpLCh0PDwxKSsgKyEhYSxNYXRoLnJvdW5kKDYzKm4pKzEyOCxNYXRoLnJvdW5kKDYzKnIpKzEyOCwobz09PTA/MDpvPDA/LTE6MSkrMXwoYyY2Myk8PDIsYz4+NiksdGhpcy5saW5lQ2xpcHMpe2xldCBlPSh0aGlzLnNjYWxlZERpc3RhbmNlLXRoaXMubGluZUNsaXBzLnN0YXJ0KS8odGhpcy5saW5lQ2xpcHMuZW5kLXRoaXMubGluZUNsaXBzLnN0YXJ0KTt0aGlzLmxheW91dFZlcnRleEFycmF5Mi5lbXBsYWNlQmFjayhlLHRoaXMubGluZUNsaXBzQXJyYXkubGVuZ3RoKX1sZXQgbD1zLnZlcnRleExlbmd0aCsrO3RoaXMuZTE+PTAmJnRoaXMuZTI+PTAmJih0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodGhpcy5lMSxsLHRoaXMuZTIpLHMucHJpbWl0aXZlTGVuZ3RoKyspLGE/dGhpcy5lMj1sOnRoaXMuZTE9bH11cGRhdGVTY2FsZWREaXN0YW5jZSgpe3RoaXMuc2NhbGVkRGlzdGFuY2U9dGhpcy5saW5lQ2xpcHM/dGhpcy5saW5lQ2xpcHMuc3RhcnQrKHRoaXMubGluZUNsaXBzLmVuZC10aGlzLmxpbmVDbGlwcy5zdGFydCkqdGhpcy5kaXN0YW5jZS90aGlzLnRvdGFsRGlzdGFuY2U6dGhpcy5kaXN0YW5jZX11cGRhdGVEaXN0YW5jZShlLHQpe3RoaXMuZGlzdGFuY2UrPWUuZGlzdCh0KSx0aGlzLnVwZGF0ZVNjYWxlZERpc3RhbmNlKCl9aGFzTGluZURhc2hhcnJheShlKXtmb3IobGV0IHQgb2YgZSl7bGV0IGU9dC5wYWludC5nZXQoYGxpbmUtZGFzaGFycmF5YCk7aWYoZSYmIWUuaXNDb25zdGFudCgpKXJldHVybiEwfXJldHVybiExfWFkZExpbmVEYXNoRGVwZW5kZW5jaWVzKGUsdCxuLHIpe2ZvcihsZXQgaSBvZiBlKXtsZXQgZT1pLnBhaW50LmdldChgbGluZS1kYXNoYXJyYXlgKTtpZighZXx8ZS52YWx1ZS5raW5kPT09YGNvbnN0YW50YCljb250aW51ZTtsZXQgYT1pLmxheW91dC5nZXQoYGxpbmUtY2FwYCkuZXZhbHVhdGUodCx7fSk9PT1gcm91bmRgLG89e2Rhc2hhcnJheTplLnZhbHVlLmV2YWx1YXRlKHt6b29tOm4tMX0sdCx7fSkscm91bmQ6YX0scz17ZGFzaGFycmF5OmUudmFsdWUuZXZhbHVhdGUoe3pvb206bn0sdCx7fSkscm91bmQ6YX0sYz17ZGFzaGFycmF5OmUudmFsdWUuZXZhbHVhdGUoe3pvb206bisxfSx0LHt9KSxyb3VuZDphfSxsPWAke28uZGFzaGFycmF5LmpvaW4oYCxgKX0sJHtvLnJvdW5kfWAsdT1gJHtzLmRhc2hhcnJheS5qb2luKGAsYCl9LCR7cy5yb3VuZH1gLGQ9YCR7Yy5kYXNoYXJyYXkuam9pbihgLGApfSwke2Mucm91bmR9YDtyLmRhc2hEZXBlbmRlbmNpZXNbbF09byxyLmRhc2hEZXBlbmRlbmNpZXNbdV09cyxyLmRhc2hEZXBlbmRlbmNpZXNbZF09Yyx0LmRhc2hlc1tpLmlkXT17bWluOmwsbWlkOnUsbWF4OmR9fX19O0goYExpbmVCdWNrZXRgLHlnLHtvbWl0OltgbGF5ZXJzYCxgcGF0dGVybkZlYXR1cmVzYF19KTtsZXQgYmc7Y29uc3QgeGc9KCk9PmJnfHw9bmV3IGNsKHsibGluZS1jYXAiOm5ldyBHKE0ubGF5b3V0X2xpbmVbYGxpbmUtY2FwYF0sYGxpbmUtY2FwYCksImxpbmUtam9pbiI6bmV3IEcoTS5sYXlvdXRfbGluZVtgbGluZS1qb2luYF0sYGxpbmUtam9pbmApLCJsaW5lLW1pdGVyLWxpbWl0IjpuZXcgRyhNLmxheW91dF9saW5lW2BsaW5lLW1pdGVyLWxpbWl0YF0sYGxpbmUtbWl0ZXItbGltaXRgKSwibGluZS1yb3VuZC1saW1pdCI6bmV3IEcoTS5sYXlvdXRfbGluZVtgbGluZS1yb3VuZC1saW1pdGBdLGBsaW5lLXJvdW5kLWxpbWl0YCksImxpbmUtc29ydC1rZXkiOm5ldyBHKE0ubGF5b3V0X2xpbmVbYGxpbmUtc29ydC1rZXlgXSxgbGluZS1zb3J0LWtleWApfSk7bGV0IFNnO2NvbnN0IENnPSgpPT5TZ3x8PW5ldyBjbCh7ImxpbmUtb3BhY2l0eSI6bmV3IEcoTS5wYWludF9saW5lW2BsaW5lLW9wYWNpdHlgXSxgbGluZS1vcGFjaXR5YCksImxpbmUtbGF5ZXItb3BhY2l0eSI6bmV3IFcoTS5wYWludF9saW5lW2BsaW5lLWxheWVyLW9wYWNpdHlgXSxgbGluZS1sYXllci1vcGFjaXR5YCksImxpbmUtY29sb3IiOm5ldyBHKE0ucGFpbnRfbGluZVtgbGluZS1jb2xvcmBdLGBsaW5lLWNvbG9yYCksImxpbmUtdHJhbnNsYXRlIjpuZXcgVyhNLnBhaW50X2xpbmVbYGxpbmUtdHJhbnNsYXRlYF0sYGxpbmUtdHJhbnNsYXRlYCksImxpbmUtdHJhbnNsYXRlLWFuY2hvciI6bmV3IFcoTS5wYWludF9saW5lW2BsaW5lLXRyYW5zbGF0ZS1hbmNob3JgXSxgbGluZS10cmFuc2xhdGUtYW5jaG9yYCksImxpbmUtd2lkdGgiOm5ldyBHKE0ucGFpbnRfbGluZVtgbGluZS13aWR0aGBdLGBsaW5lLXdpZHRoYCksImxpbmUtZ2FwLXdpZHRoIjpuZXcgRyhNLnBhaW50X2xpbmVbYGxpbmUtZ2FwLXdpZHRoYF0sYGxpbmUtZ2FwLXdpZHRoYCksImxpbmUtb2Zmc2V0IjpuZXcgRyhNLnBhaW50X2xpbmVbYGxpbmUtb2Zmc2V0YF0sYGxpbmUtb2Zmc2V0YCksImxpbmUtYmx1ciI6bmV3IEcoTS5wYWludF9saW5lW2BsaW5lLWJsdXJgXSxgbGluZS1ibHVyYCksImxpbmUtZGFzaGFycmF5IjpuZXcgYWwoTS5wYWludF9saW5lW2BsaW5lLWRhc2hhcnJheWBdLGBsaW5lLWRhc2hhcnJheWApLCJsaW5lLXBhdHRlcm4iOm5ldyBhbChNLnBhaW50X2xpbmVbYGxpbmUtcGF0dGVybmBdLGBsaW5lLXBhdHRlcm5gKSwibGluZS1ncmFkaWVudCI6bmV3IHNsKE0ucGFpbnRfbGluZVtgbGluZS1ncmFkaWVudGBdLGBsaW5lLWdyYWRpZW50YCl9KTt2YXIgd2c9e2dldCBwYWludCgpe3JldHVybiBDZygpfSxnZXQgbGF5b3V0KCl7cmV0dXJuIHhnKCl9fSxUZz1jbGFzcyBleHRlbmRzIEd7cG9zc2libHlFdmFsdWF0ZShlLHQpe3JldHVybiB0PW5ldyBVKE1hdGguZmxvb3IodC56b29tKSx7bm93OnQubm93LGZhZGVEdXJhdGlvbjp0LmZhZGVEdXJhdGlvbix6b29tSGlzdG9yeTp0Lnpvb21IaXN0b3J5LHRyYW5zaXRpb246dC50cmFuc2l0aW9ufSksc3VwZXIucG9zc2libHlFdmFsdWF0ZShlLHQpfWV2YWx1YXRlKGUsdCxuLHIpe3JldHVybiB0PVN0KHt9LHQse3pvb206TWF0aC5mbG9vcih0Lnpvb20pfSksc3VwZXIuZXZhbHVhdGUoZSx0LG4scil9fTtsZXQgRWc7Y29uc3QgRGc9ZT0+ZS50eXBlPT09YGxpbmVgO3ZhciBPZz1jbGFzcyBleHRlbmRzIGRse2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx3Zyx0KSx0aGlzLmdyYWRpZW50VmVyc2lvbj0wLEVnfHwoRWc9bmV3IFRnKHdnLnBhaW50LnByb3BlcnRpZXNbYGxpbmUtd2lkdGhgXS5zcGVjaWZpY2F0aW9uLGBsaW5lLWZsb29yd2lkdGhgKSxFZy51c2VJbnRlZ2VyWm9vbT0hMCl9X2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKGUpe2lmKGU9PT1gbGluZS1ncmFkaWVudGApe2xldCBlPXRoaXMuZ3JhZGllbnRFeHByZXNzaW9uKCk7dGhpcy5zdGVwSW50ZXJwb2xhbnQ9SW8oZSk/ZS5fc3R5bGVFeHByZXNzaW9uLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBacjohMSx0aGlzLmdyYWRpZW50VmVyc2lvbj0odGhpcy5ncmFkaWVudFZlcnNpb24rMSklKDIqKjUzLTEpfX1ncmFkaWVudEV4cHJlc3Npb24oKXtyZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW2BsaW5lLWdyYWRpZW50YF0udmFsdWUuZXhwcmVzc2lvbn1yZWNhbGN1bGF0ZShlLHQpe3N1cGVyLnJlY2FsY3VsYXRlKGUsdCksdGhpcy5wYWludC5fdmFsdWVzW2BsaW5lLWZsb29yd2lkdGhgXT1FZy5wb3NzaWJseUV2YWx1YXRlKHRoaXMuX3RyYW5zaXRpb25pbmdQYWludC5fdmFsdWVzW2BsaW5lLXdpZHRoYF0udmFsdWUsZSl9Y3JlYXRlQnVja2V0KGUpe3JldHVybiBuZXcgeWcoZSl9cXVlcnlSYWRpdXMoZSl7bGV0IHQ9ZSxuPWtnKEVkKGBsaW5lLXdpZHRoYCx0aGlzLHQpLEVkKGBsaW5lLWdhcC13aWR0aGAsdGhpcyx0KSkscj1FZChgbGluZS1vZmZzZXRgLHRoaXMsdCk7cmV0dXJuIG4vMitNYXRoLmFicyhyKStEZCh0aGlzLnBhaW50LmdldChgbGluZS10cmFuc2xhdGVgKSl9cXVlcnlJbnRlcnNlY3RzRmVhdHVyZSh7cXVlcnlHZW9tZXRyeTplLGZlYXR1cmU6dCxmZWF0dXJlU3RhdGU6bixnZW9tZXRyeTpyLHRyYW5zZm9ybTppLHBpeGVsc1RvVGlsZVVuaXRzOmF9KXtsZXQgbz1PZChlLHRoaXMucGFpbnQuZ2V0KGBsaW5lLXRyYW5zbGF0ZWApLHRoaXMucGFpbnQuZ2V0KGBsaW5lLXRyYW5zbGF0ZS1hbmNob3JgKSwtaS5iZWFyaW5nSW5SYWRpYW5zLGEpLHM9YS8yKmtnKHRoaXMucGFpbnQuZ2V0KGBsaW5lLXdpZHRoYCkuZXZhbHVhdGUodCxuKSx0aGlzLnBhaW50LmdldChgbGluZS1nYXAtd2lkdGhgKS5ldmFsdWF0ZSh0LG4pKSxjPXRoaXMucGFpbnQuZ2V0KGBsaW5lLW9mZnNldGApLmV2YWx1YXRlKHQsbik7cmV0dXJuIGMmJihyPUFkKHIsYyphKSksZ2QobyxyLHMpfWlzVGlsZUNsaXBwZWQoKXtyZXR1cm4hMH19O2Z1bmN0aW9uIGtnKGUsdCl7cmV0dXJuIHQ+MD90KzIqZTplfWNvbnN0IEFnPXEoW3tuYW1lOmBhX3Bvc19vZmZzZXRgLGNvbXBvbmVudHM6NCx0eXBlOmBJbnQxNmB9LHtuYW1lOmBhX2RhdGFgLGNvbXBvbmVudHM6NCx0eXBlOmBVaW50MTZgfSx7bmFtZTpgYV9waXhlbG9mZnNldGAsY29tcG9uZW50czo0LHR5cGU6YEludDE2YH0se25hbWU6YGFfaGVpZ2h0X29mZnNldGAsY29tcG9uZW50czoxLHR5cGU6YEZsb2F0MzJgfV0sNCksamc9cShbe25hbWU6YGFfcHJvamVjdGVkX3Bvc2AsY29tcG9uZW50czozLHR5cGU6YEZsb2F0MzJgfV0sNCk7cShbe25hbWU6YGFfZmFkZV9vcGFjaXR5YCxjb21wb25lbnRzOjEsdHlwZTpgVWludDMyYH1dLDQpO2NvbnN0IE1nPXEoW3tuYW1lOmBhX3BsYWNlZGAsY29tcG9uZW50czoyLHR5cGU6YFVpbnQ4YH0se25hbWU6YGFfc2hpZnRgLGNvbXBvbmVudHM6Mix0eXBlOmBGbG9hdDMyYH0se25hbWU6YGFfYm94X3JlYWxgLGNvbXBvbmVudHM6Mix0eXBlOmBJbnQxNmB9XSk7cShbe3R5cGU6YEludDE2YCxuYW1lOmBhbmNob3JQb2ludFhgfSx7dHlwZTpgSW50MTZgLG5hbWU6YGFuY2hvclBvaW50WWB9LHt0eXBlOmBJbnQxNmAsbmFtZTpgeDFgfSx7dHlwZTpgSW50MTZgLG5hbWU6YHkxYH0se3R5cGU6YEludDE2YCxuYW1lOmB4MmB9LHt0eXBlOmBJbnQxNmAsbmFtZTpgeTJgfSx7dHlwZTpgVWludDMyYCxuYW1lOmBmZWF0dXJlSW5kZXhgfSx7dHlwZTpgVWludDE2YCxuYW1lOmBzb3VyY2VMYXllckluZGV4YH0se3R5cGU6YFVpbnQxNmAsbmFtZTpgYnVja2V0SW5kZXhgfV0pO2NvbnN0IE5nPXEoW3tuYW1lOmBhX3Bvc2AsY29tcG9uZW50czoyLHR5cGU6YEludDE2YH0se25hbWU6YGFfYW5jaG9yX3Bvc2AsY29tcG9uZW50czoyLHR5cGU6YEludDE2YH0se25hbWU6YGFfZXh0cnVkZWAsY29tcG9uZW50czoyLHR5cGU6YEludDE2YH1dLDQpLFBnPXEoW3tuYW1lOmBhX3Bvc2AsY29tcG9uZW50czoyLHR5cGU6YEZsb2F0MzJgfSx7bmFtZTpgYV9yYWRpdXNgLGNvbXBvbmVudHM6MSx0eXBlOmBGbG9hdDMyYH0se25hbWU6YGFfZmxhZ3NgLGNvbXBvbmVudHM6Mix0eXBlOmBJbnQxNmB9XSw0KTtxKFt7bmFtZTpgdHJpYW5nbGVgLGNvbXBvbmVudHM6Myx0eXBlOmBVaW50MTZgfV0pLHEoW3t0eXBlOmBJbnQxNmAsbmFtZTpgYW5jaG9yWGB9LHt0eXBlOmBJbnQxNmAsbmFtZTpgYW5jaG9yWWB9LHt0eXBlOmBVaW50MTZgLG5hbWU6YGdseXBoU3RhcnRJbmRleGB9LHt0eXBlOmBVaW50MTZgLG5hbWU6YG51bUdseXBoc2B9LHt0eXBlOmBVaW50MzJgLG5hbWU6YHZlcnRleFN0YXJ0SW5kZXhgfSx7dHlwZTpgVWludDMyYCxuYW1lOmBsaW5lU3RhcnRJbmRleGB9LHt0eXBlOmBVaW50MzJgLG5hbWU6YGxpbmVMZW5ndGhgfSx7dHlwZTpgVWludDE2YCxuYW1lOmBzZWdtZW50YH0se3R5cGU6YFVpbnQxNmAsbmFtZTpgbG93ZXJTaXplYH0se3R5cGU6YFVpbnQxNmAsbmFtZTpgdXBwZXJTaXplYH0se3R5cGU6YEZsb2F0MzJgLG5hbWU6YGxpbmVPZmZzZXRYYH0se3R5cGU6YEZsb2F0MzJgLG5hbWU6YGxpbmVPZmZzZXRZYH0se3R5cGU6YFVpbnQ4YCxuYW1lOmB3cml0aW5nTW9kZWB9LHt0eXBlOmBVaW50OGAsbmFtZTpgcGxhY2VkT3JpZW50YXRpb25gfSx7dHlwZTpgVWludDhgLG5hbWU6YGhpZGRlbmB9LHt0eXBlOmBVaW50MzJgLG5hbWU6YGNyb3NzVGlsZUlEYH0se3R5cGU6YEludDE2YCxuYW1lOmBhc3NvY2lhdGVkSWNvbkluZGV4YH0se3R5cGU6YEZsb2F0MzJgLG5hbWU6YGhlaWdodE9mZnNldGB9XSkscShbe3R5cGU6YEludDE2YCxuYW1lOmBhbmNob3JYYH0se3R5cGU6YEludDE2YCxuYW1lOmBhbmNob3JZYH0se3R5cGU6YEludDE2YCxuYW1lOmByaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleGB9LHt0eXBlOmBJbnQxNmAsbmFtZTpgY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4YH0se3R5cGU6YEludDE2YCxuYW1lOmBsZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4YH0se3R5cGU6YEludDE2YCxuYW1lOmB2ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleGB9LHt0eXBlOmBJbnQxNmAsbmFtZTpgcGxhY2VkSWNvblN5bWJvbEluZGV4YH0se3R5cGU6YEludDE2YCxuYW1lOmB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleGB9LHt0eXBlOmBVaW50MTZgLG5hbWU6YGtleWB9LHt0eXBlOmBVaW50MTZgLG5hbWU6YHRleHRCb3hTdGFydEluZGV4YH0se3R5cGU6YFVpbnQxNmAsbmFtZTpgdGV4dEJveEVuZEluZGV4YH0se3R5cGU6YFVpbnQxNmAsbmFtZTpgdmVydGljYWxUZXh0Qm94U3RhcnRJbmRleGB9LHt0eXBlOmBVaW50MTZgLG5hbWU6YHZlcnRpY2FsVGV4dEJveEVuZEluZGV4YH0se3R5cGU6YFVpbnQxNmAsbmFtZTpgaWNvbkJveFN0YXJ0SW5kZXhgfSx7dHlwZTpgVWludDE2YCxuYW1lOmBpY29uQm94RW5kSW5kZXhgfSx7dHlwZTpgVWludDE2YCxuYW1lOmB2ZXJ0aWNhbEljb25Cb3hTdGFydEluZGV4YH0se3R5cGU6YFVpbnQxNmAsbmFtZTpgdmVydGljYWxJY29uQm94RW5kSW5kZXhgfSx7dHlwZTpgVWludDE2YCxuYW1lOmBmZWF0dXJlSW5kZXhgfSx7dHlwZTpgVWludDE2YCxuYW1lOmBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlc2B9LHt0eXBlOmBVaW50MTZgLG5hbWU6YG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlc2B9LHt0eXBlOmBVaW50MTZgLG5hbWU6YG51bUljb25WZXJ0aWNlc2B9LHt0eXBlOmBVaW50MTZgLG5hbWU6YG51bVZlcnRpY2FsSWNvblZlcnRpY2VzYH0se3R5cGU6YFVpbnQxNmAsbmFtZTpgdXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXNgfSx7dHlwZTpgVWludDMyYCxuYW1lOmBjcm9zc1RpbGVJRGB9LHt0eXBlOmBGbG9hdDMyYCxuYW1lOmB0ZXh0Qm94U2NhbGVgfSx7dHlwZTpgRmxvYXQzMmAsbmFtZTpgY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXJgfSx7dHlwZTpgVWludDE2YCxuYW1lOmB0ZXh0QW5jaG9yT2Zmc2V0U3RhcnRJbmRleGB9LHt0eXBlOmBVaW50MTZgLG5hbWU6YHRleHRBbmNob3JPZmZzZXRFbmRJbmRleGB9LHt0eXBlOmBGbG9hdDMyYCxuYW1lOmBoZWlnaHRPZmZzZXRgfV0pLHEoW3t0eXBlOmBGbG9hdDMyYCxuYW1lOmBvZmZzZXRYYH1dKSxxKFt7dHlwZTpgSW50MTZgLG5hbWU6YHhgfSx7dHlwZTpgSW50MTZgLG5hbWU6YHlgfSx7dHlwZTpgSW50MTZgLG5hbWU6YHRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yYH1dKSxxKFt7dHlwZTpgVWludDE2YCxuYW1lOmB0ZXh0QW5jaG9yYH0se3R5cGU6YEZsb2F0MzJgLGNvbXBvbmVudHM6MixuYW1lOmB0ZXh0T2Zmc2V0YH1dKTtmdW5jdGlvbiBGZyhlLHQsbil7bGV0IHI9dC5sYXlvdXQuZ2V0KGB0ZXh0LXRyYW5zZm9ybWApLmV2YWx1YXRlKG4se30pO3JldHVybiByPT09YHVwcGVyY2FzZWA/ZT1lLnRvTG9jYWxlVXBwZXJDYXNlKCk6cj09PWBsb3dlcmNhc2VgJiYoZT1lLnRvTG9jYWxlTG93ZXJDYXNlKCkpLEtjLmFwcGx5QXJhYmljU2hhcGluZyYmKGU9S2MuYXBwbHlBcmFiaWNTaGFwaW5nKGUpKSxlfWZ1bmN0aW9uIElnKGUsdCxuKXtmb3IobGV0IHIgb2YgZS5zZWN0aW9ucylyLnRleHQ9Rmcoci50ZXh0LHQsbik7cmV0dXJuIGV9ZnVuY3Rpb24gTGcoZSl7bGV0IHQ9e30sbj17fSxyPVtdLGk9MDtmdW5jdGlvbiBhKHQpe3IucHVzaChlW3RdKSxpKyt9ZnVuY3Rpb24gbyhlLHQsaSl7bGV0IGE9bltlXTtyZXR1cm4gZGVsZXRlIG5bZV0sblt0XT1hLHJbYV0uZ2VvbWV0cnlbMF0ucG9wKCksclthXS5nZW9tZXRyeVswXT1yW2FdLmdlb21ldHJ5WzBdLmNvbmNhdChpWzBdKSxhfWZ1bmN0aW9uIHMoZSxuLGkpe2xldCBhPXRbbl07cmV0dXJuIGRlbGV0ZSB0W25dLHRbZV09YSxyW2FdLmdlb21ldHJ5WzBdLnNoaWZ0KCksclthXS5nZW9tZXRyeVswXT1pWzBdLmNvbmNhdChyW2FdLmdlb21ldHJ5WzBdKSxhfWZ1bmN0aW9uIGMoZSx0LG4pe2xldCByPW4/dFswXVt0WzBdLmxlbmd0aC0xXTp0WzBdWzBdO3JldHVybmAke2V9OiR7ci54fToke3IueX1gfWZvcihsZXQgbD0wO2w8ZS5sZW5ndGg7bCsrKXtsZXQgdT1lW2xdLGQ9dS5nZW9tZXRyeSxmPXUudGV4dD91LnRleHQudG9TdHJpbmcoKTpudWxsO2lmKCFmKXthKGwpO2NvbnRpbnVlfWxldCBwPWMoZixkKSxtPWMoZixkLCEwKTtpZihwIGluIG4mJm0gaW4gdCYmbltwXSE9PXRbbV0pe2xldCBlPXMocCxtLGQpLGk9byhwLG0scltlXS5nZW9tZXRyeSk7ZGVsZXRlIHRbcF0sZGVsZXRlIG5bbV0sbltjKGYscltpXS5nZW9tZXRyeSwhMCldPWkscltlXS5nZW9tZXRyeT1udWxsfWVsc2UgcCBpbiBuP28ocCxtLGQpOm0gaW4gdD9zKHAsbSxkKTooYShsKSx0W3BdPWktMSxuW21dPWktMSl9cmV0dXJuIHIuZmlsdGVyKGU9PmUuZ2VvbWV0cnkpfWNvbnN0IFJnPXR5cGVvZiBJbnRsPGB1YCYmYFNlZ21lbnRlcmBpbiBJbnRsLHpnPVJnP25ldyBJbnRsLlNlZ21lbnRlcih2b2lkIDAse2dyYW51bGFyaXR5OmBncmFwaGVtZWB9KTpudWxsLEJnPVJnP25ldyBJbnRsLlNlZ21lbnRlcih2b2lkIDAse2dyYW51bGFyaXR5OmB3b3JkYH0pOm51bGw7ZnVuY3Rpb24gVmcoZSl7aWYoIXpnfHwhQWMoZSkpcmV0dXJuWy4uLmVdO2xldCB0PVtdO2ZvcihsZXR7c2VnbWVudDpufW9mIHpnLnNlZ21lbnQoZSkpe2xldCBlPXQubGVuZ3RoLTE7ZT49MCYmTWModFtlXSxuKT90W2VdKz1uOnQucHVzaChuKX1yZXR1cm4gdH1mdW5jdGlvbiBIZyhlKXtsZXQgdD1uZXcgU2V0O2lmKEJnKXtmb3IobGV0e2luZGV4Om59b2YgQmcuc2VnbWVudChlKSl0LmFkZChuKTtyZXR1cm4gdH1sZXQgbj0wO2ZvcihsZXQgciBvZiBlLnNwbGl0KC9cYnwoPz1ccHtJZGVvfSkvdSkpdC5hZGQobiksbis9ci5sZW5ndGg7cmV0dXJuIHR9ZnVuY3Rpb24gVWcoZSl7bGV0IHQ9ZS5jb2RlUG9pbnRBdCgwKTtyZXR1cm4gZS5sZW5ndGg+KHQ+NjU1MzU/MjoxKX1jb25zdCBXZz17IiEiOmDvuJVgLCIjIjpg77yDYCwkOmDvvIRgLCIlIjpg77yFYCwiJiI6YO+8hmAsIigiOmDvuLVgLCIpIjpg77i2YCwiKiI6YO+8imAsIisiOmDvvItgLCIsIjpg77iQYCwiLSI6YO+4smAsIi4iOmDjg7tgLCIvIjpg77yPYCwiOiI6YO+4k2AsIjsiOmDvuJRgLCI8Ijpg77i/YCwiPSI6YO+8nWAsIj4iOmDvuYBgLCI/Ijpg77iWYCwiQCI6YO+8oGAsIlsiOmDvuYdgLCJcXCI6YO+8vGAsIl0iOmDvuYhgLCJeIjpg77y+YCxfOmDvuLNgLCJgIjpg772AYCwieyI6YO+4t2AsInwiOmDigJVgLCJ9Ijpg77i4YCwifiI6YO+9nmAsIsKiIjpg77+gYCwiwqMiOmDvv6FgLCLCpSI6YO+/pWAsIsKmIjpg77+kYCwiwqwiOmDvv6JgLCLCryI6YO+/o2AsIuKAkyI6YO+4smAsIuKAlCI6YO+4sWAsIuKAmCI6YO+5g2AsIuKAmSI6YO+5hGAsIuKAnCI6YO+5gWAsIuKAnSI6YO+5gmAsIuKApiI6YO+4mWAsIuKLryI6YO+4mWAsIuKApyI6YOODu2AsIuKCqSI6YO+/pmAsIuOAgSI6YO+4kWAsIuOAgiI6YO+4kmAsIuOAiCI6YO+4v2AsIuOAiSI6YO+5gGAsIuOAiiI6YO+4vWAsIuOAiyI6YO+4vmAsIuOAjCI6YO+5gWAsIuOAjSI6YO+5gmAsIuOAjiI6YO+5g2AsIuOAjyI6YO+5hGAsIuOAkCI6YO+4u2AsIuOAkSI6YO+4vGAsIuOAlCI6YO+4uWAsIuOAlSI6YO+4umAsIuOAliI6YO+4l2AsIuOAlyI6YO+4mGAsIu+8gSI6YO+4lWAsIu+8iCI6YO+4tWAsIu+8iSI6YO+4tmAsIu+8jCI6YO+4kGAsIu+8jSI6YO+4smAsIu+8jiI6YOODu2AsIu+8miI6YO+4k2AsIu+8myI6YO+4lGAsIu+8nCI6YO+4v2AsIu+8niI6YO+5gGAsIu+8nyI6YO+4lmAsIu+8uyI6YO+5h2AsIu+8vSI6YO+5iGAsIu+8vyI6YO+4s2AsIu+9myI6YO+4t2AsIu+9nCI6YOKAlWAsIu+9nSI6YO+4uGAsIu+9nyI6YO+4tWAsIu+9oCI6YO+4tmAsIu+9oSI6YO+4kmAsIu+9oiI6YO+5gWAsIu+9oyI6YO+5gmB9O2Z1bmN0aW9uIEdnKGUpe2xldCB0PWBgLG49e3ByZW1hdHVyZTohMCx2YWx1ZTp2b2lkIDB9LHI9ZVtTeW1ib2wuaXRlcmF0b3JdKCksaT1yLm5leHQoKSxhPWVbU3ltYm9sLml0ZXJhdG9yXSgpO2EubmV4dCgpO2xldCBvPWEubmV4dCgpO2Zvcig7IWkuZG9uZTspKG8uZG9uZXx8IXpjKG8udmFsdWUuY29kZVBvaW50QXQoMCkpfHxXZ1tvLnZhbHVlXSkmJihuLnByZW1hdHVyZXx8IXpjKG4udmFsdWUuY29kZVBvaW50QXQoMCkpfHxXZ1tuLnZhbHVlXSkmJldnW2kudmFsdWVdP3QrPVdnW2kudmFsdWVdOnQrPWkudmFsdWUsbj17dmFsdWU6aS52YWx1ZSxwcmVtYXR1cmU6ITF9LGk9ci5uZXh0KCksbz1hLm5leHQoKTtyZXR1cm4gdH1jb25zdCBLZz17MTA6ITAsMTM6ITAsMzI6ITAsMzg6ITAsNDE6ITAsNDM6ITAsNDU6ITAsNDc6ITAsMTczOiEwLDE4MzohMCw4MjAzOiEwLDgyMDg6ITAsODIxMTohMCw4MjMxOiEwfSxxZz17NDA6ITB9O2Z1bmN0aW9uIEpnKGUsdCxuLHIsaSxhKXtpZihgZm9udFN0YWNrYGluIHQpe2xldCByPW5bdC5mb250U3RhY2tdLGE9cj8uW2VdO2lmKGEpcmV0dXJuIGEubWV0cmljcy5hZHZhbmNlKnQuc2NhbGUraTtsZXQgbz0wO2ZvcihsZXQgbiBvZiBlKXtsZXQgZT1yPy5bbl07ZSYmKG8rPWUubWV0cmljcy5hZHZhbmNlKnQuc2NhbGUraSl9cmV0dXJuIG99e2xldCBlPXJbdC5pbWFnZU5hbWVdO3JldHVybiBlP2UuZGlzcGxheVNpemVbMF0qdC5zY2FsZSoyNC9hK2k6MH19ZnVuY3Rpb24gWWcoZSx0LG4scil7bGV0IGk9KGUtdCkqKjI7cmV0dXJuIHI/ZTx0P2kvMjppKjI6aStNYXRoLmFicyhuKSpufWZ1bmN0aW9uIFhnKGUpe3JldHVybi9eXHMrJC91LnRlc3QoZSl9ZnVuY3Rpb24gWmcoZSx0LG4pe2xldCByPTA7cmV0dXJuKGU9PT0xMHx8ZT09PTEzKSYmKHItPTFlNCksbiYmKHIrPTE1MCksKGU9PT00MHx8ZT09PTY1Mjg4KSYmKHIrPTUwKSwodD09PTQxfHx0PT09NjUyODkpJiYocis9NTApLHJ9ZnVuY3Rpb24gUWcoZSx0LG4scixpLGEpe2xldCBvPW51bGwscz1ZZyh0LG4saSxhKTtmb3IobGV0IGUgb2Ygcil7bGV0IHI9WWcodC1lLngsbixpLGEpK2UuYmFkbmVzcztyPD1zJiYobz1lLHM9cil9cmV0dXJue2luZGV4OmUseDp0LHByaW9yQnJlYWs6byxiYWRuZXNzOnN9fWZ1bmN0aW9uICRnKGUpe3JldHVybiBlPyRnKGUucHJpb3JCcmVhaykuY29uY2F0KGUuaW5kZXgpOltdfXZhciBlXz1jbGFzcyBle2NvbnN0cnVjdG9yKGU9YGAsdD1bXSxuPVtdKXt0aGlzLnRleHQ9ZSx0aGlzLnNlY3Rpb25zPXQsdGhpcy5zZWN0aW9uSW5kZXg9bix0aGlzLmltYWdlU2VjdGlvbklEPW51bGwsdGhpcy5fZ3JhcGhlbWVzPW51bGx9Z3JhcGhlbWVzKCl7cmV0dXJuIHRoaXMuX2dyYXBoZW1lcz8/PVZnKHRoaXMudGV4dCksdGhpcy5fZ3JhcGhlbWVzfXN0YXRpYyBmcm9tRmVhdHVyZSh0LG4pe2xldCByPW5ldyBlO2ZvcihsZXQgZSBvZiB0LnNlY3Rpb25zKWUuaW1hZ2U/ci5hZGRJbWFnZVNlY3Rpb24oZSk6ci5hZGRUZXh0U2VjdGlvbihlLG4pO3JldHVybiByfWxlbmd0aCgpe3JldHVybiB0aGlzLmdyYXBoZW1lcygpLmxlbmd0aH1nZXRTZWN0aW9uKGUpe3JldHVybiB0aGlzLnNlY3Rpb25zW3RoaXMuc2VjdGlvbkluZGV4W2VdXX1nZXRTZWN0aW9uSW5kZXgoZSl7cmV0dXJuIHRoaXMuc2VjdGlvbkluZGV4W2VdfXZlcnRpY2FsaXplUHVuY3R1YXRpb24oKXt0aGlzLnRleHQ9R2codGhpcy50ZXh0KSx0aGlzLl9ncmFwaGVtZXM9bnVsbH1oYXNaZXJvV2lkdGhTcGFjZXMoKXtyZXR1cm4gdGhpcy50ZXh0LmluY2x1ZGVzKGDigItgKX10cmltKCl7bGV0IGU9dGhpcy5ncmFwaGVtZXMoKSx0PTA7Zm9yKDt0PGUubGVuZ3RoJiZYZyhlW3RdKTspdCsrO2xldCBuPWUubGVuZ3RoO2Zvcig7bj50JiZYZyhlW24tMV0pOyluLS07dGhpcy50ZXh0PWUuc2xpY2UodCxuKS5qb2luKGBgKSx0aGlzLnNlY3Rpb25JbmRleD10aGlzLnNlY3Rpb25JbmRleC5zbGljZSh0LG4pLHRoaXMuX2dyYXBoZW1lcz1udWxsfXN1YnN0cmluZyh0LG4pe2xldCByPXRoaXMuZ3JhcGhlbWVzKCkuc2xpY2UodCxuKS5qb2luKGBgKSxpPXRoaXMuc2VjdGlvbkluZGV4LnNsaWNlKHQsbik7cmV0dXJuIG5ldyBlKHIsdGhpcy5zZWN0aW9ucyxpKX10b0NvZGVVbml0SW5kZXgoZSl7cmV0dXJuIHRoaXMuZ3JhcGhlbWVzKCkuc2xpY2UoMCxlKS5qb2luKGBgKS5sZW5ndGh9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy50ZXh0fWdldE1heFNjYWxlKCl7cmV0dXJuIHRoaXMuc2VjdGlvbkluZGV4LnJlZHVjZSgoZSx0KT0+TWF0aC5tYXgoZSx0aGlzLnNlY3Rpb25zW3RdLnNjYWxlKSwwKX1nZXRNYXhJbWFnZVNpemUoZSl7bGV0IHQ9MCxuPTA7Zm9yKGxldCByPTA7cjx0aGlzLmxlbmd0aCgpO3IrKyl7bGV0IGk9dGhpcy5nZXRTZWN0aW9uKHIpO2lmKGBpbWFnZU5hbWVgaW4gaSl7bGV0IHI9ZVtpLmltYWdlTmFtZV07aWYoIXIpY29udGludWU7bGV0IGE9ci5kaXNwbGF5U2l6ZTt0PU1hdGgubWF4KHQsYVswXSksbj1NYXRoLm1heChuLGFbMV0pfX1yZXR1cm57bWF4SW1hZ2VXaWR0aDp0LG1heEltYWdlSGVpZ2h0Om59fV9hcHBlbmRTZWN0aW9uKGUsdCl7bGV0IG49dGhpcy5ncmFwaGVtZXMoKSxyPW4ubGVuZ3RoPjA/bltuLmxlbmd0aC0xXTpgYCxpPVZnKHIrZSk7dGhpcy50ZXh0Kz1lLHRoaXMuX2dyYXBoZW1lcz1uLnNsaWNlKDAscj8tMTp2b2lkIDApLmNvbmNhdChpKTtsZXQgYT1pLmxlbmd0aC0rISFyO2ZvcihsZXQgZT0wO2U8YTtlKyspdGhpcy5zZWN0aW9uSW5kZXgucHVzaCh0KX1hZGRUZXh0U2VjdGlvbihlLHQpe3RoaXMuc2VjdGlvbnMucHVzaCh7c2NhbGU6ZS5zY2FsZXx8MSx2ZXJ0aWNhbEFsaWduOmUudmVydGljYWxBbGlnbnx8YGJvdHRvbWAsZm9udFN0YWNrOmUuZm9udFN0YWNrfHx0fSksdGhpcy5fYXBwZW5kU2VjdGlvbihlLnRleHQsdGhpcy5zZWN0aW9ucy5sZW5ndGgtMSl9YWRkSW1hZ2VTZWN0aW9uKGUpe2xldCB0PWUuaW1hZ2U/ZS5pbWFnZS5uYW1lOmBgO2lmKHQubGVuZ3RoPT09MCl7SXQoYENhbid0IGFkZCBGb3JtYXR0ZWRTZWN0aW9uIHdpdGggYW4gZW1wdHkgaW1hZ2UuYCk7cmV0dXJufWxldCBuPXRoaXMuZ2V0TmV4dEltYWdlU2VjdGlvbkNoYXJDb2RlKCk7aWYoIW4pe0l0KGBSZWFjaGVkIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyA2NDAxYCk7cmV0dXJufXRoaXMuc2VjdGlvbnMucHVzaCh7c2NhbGU6MSx2ZXJ0aWNhbEFsaWduOmUudmVydGljYWxBbGlnbnx8YGJvdHRvbWAsaW1hZ2VOYW1lOnR9KSx0aGlzLl9hcHBlbmRTZWN0aW9uKFN0cmluZy5mcm9tQ2hhckNvZGUobiksdGhpcy5zZWN0aW9ucy5sZW5ndGgtMSl9Z2V0TmV4dEltYWdlU2VjdGlvbkNoYXJDb2RlKCl7cmV0dXJuIHRoaXMuaW1hZ2VTZWN0aW9uSUQ/dGhpcy5pbWFnZVNlY3Rpb25JRD49NjM3NDM/bnVsbDorK3RoaXMuaW1hZ2VTZWN0aW9uSUQ6KHRoaXMuaW1hZ2VTZWN0aW9uSUQ9NTczNDQsdGhpcy5pbWFnZVNlY3Rpb25JRCl9ZGV0ZXJtaW5lTGluZUJyZWFrcyhlLHQsbixyLGkpe2xldCBhPVtdLG89dGhpcy5kZXRlcm1pbmVBdmVyYWdlTGluZVdpZHRoKGUsdCxuLHIsaSkscz10aGlzLmhhc1plcm9XaWR0aFNwYWNlcygpLGM9dGhpcy5ncmFwaGVtZXMoKSxsPW51bGwsdT0wLGQ9MDtmb3IobGV0IHQ9MDt0PGMubGVuZ3RoO3QrKyl7bGV0IGY9Y1t0XTtpZih0PjApe2xldCBlPWNbdC0xXS5jb2RlUG9pbnRBdCgwKSxuPWYuY29kZVBvaW50QXQoMCkscj1FYyhlKSxpPWpjKGUpJiZqYyhuKTsoS2dbZV18fHJ8fGBpbWFnZU5hbWVgaW4gdGhpcy5nZXRTZWN0aW9uKHQtMSl8fGNbdCsxXSE9PXZvaWQgMCYmcWdbbl18fGkmJihsPz89SGcodGhpcy50ZXh0KSkuaGFzKGQpKSYmYS5wdXNoKFFnKHQsdSxvLGEsWmcoZSxuLHImJnMpLCExKSl9TmMoZi5jb2RlUG9pbnRBdCgwKSl8fCh1Kz1KZyhmLHRoaXMuZ2V0U2VjdGlvbih0KSxuLHIsZSxpKSksZCs9Zi5sZW5ndGh9cmV0dXJuICRnKFFnKHRoaXMubGVuZ3RoKCksdSxvLGEsMCwhMCkpfWRldGVybWluZUF2ZXJhZ2VMaW5lV2lkdGgoZSx0LG4scixpKXtsZXQgYT0wLG89MDtmb3IobGV0IHQgb2YgdGhpcy5ncmFwaGVtZXMoKSl7bGV0IHM9dGhpcy5nZXRTZWN0aW9uKG8pO2ErPUpnKHQscyxuLHIsZSxpKSxvKyt9bGV0IHM9TWF0aC5tYXgoMSxNYXRoLmNlaWwoYS90KSk7cmV0dXJuIGEvc319O2NvbnN0IHRfPTQyOTQ5NjcyOTYsbl89MS90XyxyXz10eXBlb2YgVGV4dERlY29kZXI+YHVgP251bGw6bmV3IFRleHREZWNvZGVyKGB1dGYtOGApO3ZhciBpXz1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmJ1Zj1BcnJheUJ1ZmZlci5pc1ZpZXcoZSk/ZTpuZXcgVWludDhBcnJheShlKSx0aGlzLmRhdGFWaWV3PW5ldyBEYXRhVmlldyh0aGlzLmJ1Zi5idWZmZXIsdGhpcy5idWYuYnl0ZU9mZnNldCx0aGlzLmJ1Zi5ieXRlTGVuZ3RoKSx0aGlzLnBvcz0wLHRoaXMudHlwZT0wLHRoaXMuX3ZhbHVlU3RhcnQ9LTEsdGhpcy5sZW5ndGg9dGhpcy5idWYubGVuZ3RofXJlYWRGaWVsZHMoZSx0LG49dGhpcy5sZW5ndGgpe2xldCByO2Zvcig7cj10aGlzLm5leHRGaWVsZChuKTspZShyLHQsdGhpcyk7cmV0dXJuIHR9cmVhZE1lc3NhZ2UoZSx0KXtyZXR1cm4gdGhpcy5yZWFkRmllbGRzKGUsdCx0aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyl9cmVhZEZpeGVkMzIoKXtsZXQgZT10aGlzLmRhdGFWaWV3LmdldFVpbnQzMih0aGlzLnBvcywhMCk7cmV0dXJuIHRoaXMucG9zKz00LGV9cmVhZFNGaXhlZDMyKCl7bGV0IGU9dGhpcy5kYXRhVmlldy5nZXRJbnQzMih0aGlzLnBvcywhMCk7cmV0dXJuIHRoaXMucG9zKz00LGV9cmVhZEZpeGVkNjQoKXtsZXQgZT10aGlzLmRhdGFWaWV3LmdldFVpbnQzMih0aGlzLnBvcywhMCkrdGhpcy5kYXRhVmlldy5nZXRVaW50MzIodGhpcy5wb3MrNCwhMCkqdF87cmV0dXJuIHRoaXMucG9zKz04LGV9cmVhZFNGaXhlZDY0KCl7bGV0IGU9dGhpcy5kYXRhVmlldy5nZXRVaW50MzIodGhpcy5wb3MsITApK3RoaXMuZGF0YVZpZXcuZ2V0SW50MzIodGhpcy5wb3MrNCwhMCkqdF87cmV0dXJuIHRoaXMucG9zKz04LGV9cmVhZEZsb2F0KCl7bGV0IGU9dGhpcy5kYXRhVmlldy5nZXRGbG9hdDMyKHRoaXMucG9zLCEwKTtyZXR1cm4gdGhpcy5wb3MrPTQsZX1yZWFkRG91YmxlKCl7bGV0IGU9dGhpcy5kYXRhVmlldy5nZXRGbG9hdDY0KHRoaXMucG9zLCEwKTtyZXR1cm4gdGhpcy5wb3MrPTgsZX1yZWFkVmFyaW50KGUpe2xldCB0PXRoaXMuYnVmLG49dFt0aGlzLnBvcysrXTtpZihuPDEyOClyZXR1cm4gbjtsZXQgcj1uJjEyNyxpO3JldHVybiBpPXRbdGhpcy5wb3MrK10scnw9KGkmMTI3KTw8NyxpPDEyOHx8KGk9dFt0aGlzLnBvcysrXSxyfD0oaSYxMjcpPDwxNCxpPDEyOCl8fChpPXRbdGhpcy5wb3MrK10scnw9KGkmMTI3KTw8MjEsaTwxMjgpP3I6KGk9dFt0aGlzLnBvc10scnw9KGkmMTUpPDwyOCxvXyhyLGUsdGhpcykpfXJlYWRTVmFyaW50KCl7bGV0IGU9dGhpcy5yZWFkVmFyaW50KCk7cmV0dXJuIGUlMj09MT8oZSsxKS8tMjplLzJ9cmVhZEJvb2xlYW4oKXtyZXR1cm4hIXRoaXMucmVhZFZhcmludCgpfXJlYWRTdHJpbmcoKXtsZXQgZT10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyx0PXRoaXMucG9zO3JldHVybiB0aGlzLnBvcz1lLGUtdD49MTImJnJfP3JfLmRlY29kZSh0aGlzLmJ1Zi5zdWJhcnJheSh0LGUpKTp4Xyh0aGlzLmJ1Zix0LGUpfXJlYWRCeXRlcygpe2xldCBlPXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLHQ9dGhpcy5idWYuc3ViYXJyYXkodGhpcy5wb3MsZSk7cmV0dXJuIHRoaXMucG9zPWUsdH1yZWFkUGFja2VkVmFyaW50KGU9W10sdCl7bGV0IG49dGhpcy5yZWFkUGFja2VkRW5kKCk7Zm9yKDt0aGlzLnBvczxuOyllLnB1c2godGhpcy5yZWFkVmFyaW50KHQpKTtyZXR1cm4gZX1yZWFkUGFja2VkU1ZhcmludChlPVtdKXtsZXQgdD10aGlzLnJlYWRQYWNrZWRFbmQoKTtmb3IoO3RoaXMucG9zPHQ7KWUucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO3JldHVybiBlfXJlYWRQYWNrZWRCb29sZWFuKGU9W10pe2xldCB0PXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8dDspZS5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7cmV0dXJuIGV9cmVhZFBhY2tlZEZsb2F0KGU9W10pe2xldCB0PXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8dDspZS5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO3JldHVybiBlfXJlYWRQYWNrZWREb3VibGUoZT1bXSl7bGV0IHQ9dGhpcy5yZWFkUGFja2VkRW5kKCk7Zm9yKDt0aGlzLnBvczx0OyllLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO3JldHVybiBlfXJlYWRQYWNrZWRGaXhlZDMyKGU9W10pe2xldCB0PXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8dDspZS5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7cmV0dXJuIGV9cmVhZFBhY2tlZFNGaXhlZDMyKGU9W10pe2xldCB0PXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8dDspZS5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO3JldHVybiBlfXJlYWRQYWNrZWRGaXhlZDY0KGU9W10pe2xldCB0PXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8dDspZS5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7cmV0dXJuIGV9cmVhZFBhY2tlZFNGaXhlZDY0KGU9W10pe2xldCB0PXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8dDspZS5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiBlfXJlYWRQYWNrZWRFbmQoKXtyZXR1cm4gdGhpcy50eXBlPT09Mj90aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvczp0aGlzLnBvcysxfW5leHRGaWVsZChlPXRoaXMubGVuZ3RoKXtpZih0aGlzLnBvcz09PXRoaXMuX3ZhbHVlU3RhcnQmJnRoaXMuc2tpcCh0aGlzLnR5cGUpLHRoaXMucG9zPj1lKXJldHVybiAwO2xldCB0PXRoaXMucmVhZFZhcmludCgpO3JldHVybiB0aGlzLnR5cGU9dCY3LHRoaXMuX3ZhbHVlU3RhcnQ9dGhpcy5wb3MsdD4+PjN9c2tpcChlKXtsZXQgdD1lJjc7aWYodD09PTApZm9yKDt0aGlzLmJ1Zlt0aGlzLnBvcysrXT4xMjc7KTtlbHNlIGlmKHQ9PT0yKXRoaXMucG9zPXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zO2Vsc2UgaWYodD09PTUpdGhpcy5wb3MrPTQ7ZWxzZSBpZih0PT09MSl0aGlzLnBvcys9ODtlbHNlIHRocm93IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGU6ICR7dH1gKX19LGFfPWNsYXNze2NvbnN0cnVjdG9yKGU9bmV3IFVpbnQ4QXJyYXkoMTYpKXt0aGlzLmJ1Zj1BcnJheUJ1ZmZlci5pc1ZpZXcoZSk/ZTpuZXcgVWludDhBcnJheShlKSx0aGlzLmRhdGFWaWV3PW5ldyBEYXRhVmlldyh0aGlzLmJ1Zi5idWZmZXIsdGhpcy5idWYuYnl0ZU9mZnNldCx0aGlzLmJ1Zi5ieXRlTGVuZ3RoKSx0aGlzLnBvcz0wLHRoaXMubGVuZ3RoPXRoaXMuYnVmLmxlbmd0aH13cml0ZVRhZyhlLHQpe3RoaXMud3JpdGVWYXJpbnQoZTw8M3x0KX1yZWFsbG9jKGUpe2xldCB0PXRoaXMubGVuZ3RofHwxNjtmb3IoO3Q8dGhpcy5wb3MrZTspdCo9MjtpZih0IT09dGhpcy5sZW5ndGgpe2xldCBlPW5ldyBVaW50OEFycmF5KHQpO2Uuc2V0KHRoaXMuYnVmKSx0aGlzLmJ1Zj1lLHRoaXMuZGF0YVZpZXc9bmV3IERhdGFWaWV3KGUuYnVmZmVyKSx0aGlzLmxlbmd0aD10fX1maW5pc2goKXtyZXR1cm4gdGhpcy5sZW5ndGg9dGhpcy5wb3MsdGhpcy5wb3M9MCx0aGlzLmJ1Zi5zdWJhcnJheSgwLHRoaXMubGVuZ3RoKX13cml0ZUZpeGVkMzIoZSl7dGhpcy5yZWFsbG9jKDQpLHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5wb3MsZSwhMCksdGhpcy5wb3MrPTR9d3JpdGVTRml4ZWQzMihlKXt0aGlzLnJlYWxsb2MoNCksdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLnBvcyxlLCEwKSx0aGlzLnBvcys9NH13cml0ZUZpeGVkNjQoZSl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5wb3MsZSYtMSwhMCksdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLnBvcys0LE1hdGguZmxvb3IoZSpuXyksITApLHRoaXMucG9zKz04fXdyaXRlU0ZpeGVkNjQoZSl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5wb3MsZSYtMSwhMCksdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLnBvcys0LE1hdGguZmxvb3IoZSpuXyksITApLHRoaXMucG9zKz04fXdyaXRlVmFyaW50KGUpe2lmKGU9K2V8fDAsZT49MCYmZTwxMjgpe3RoaXMucG9zPj10aGlzLmxlbmd0aCYmdGhpcy5yZWFsbG9jKDEpLHRoaXMuYnVmW3RoaXMucG9zKytdPWU7cmV0dXJufWlmKGU+MjY4NDM1NDU1fHxlPDApe2NfKGUsdGhpcyk7cmV0dXJufXRoaXMucmVhbGxvYyg0KSx0aGlzLmJ1Zlt0aGlzLnBvcysrXT1lJjEyN3woZT4xMjc/MTI4OjApLCEoZTw9MTI3KSYmKHRoaXMuYnVmW3RoaXMucG9zKytdPShlPj4+PTcpJjEyN3woZT4xMjc/MTI4OjApLCEoZTw9MTI3KSYmKHRoaXMuYnVmW3RoaXMucG9zKytdPShlPj4+PTcpJjEyN3woZT4xMjc/MTI4OjApLCEoZTw9MTI3KSYmKHRoaXMuYnVmW3RoaXMucG9zKytdPWU+Pj43JjEyNykpKX13cml0ZVNWYXJpbnQoZSl7dGhpcy53cml0ZVZhcmludChlPDA/LWUqMi0xOmUqMil9d3JpdGVCb29sZWFuKGUpe3RoaXMud3JpdGVWYXJpbnQoK2UpfXdyaXRlU3RyaW5nKGUpe2U9U3RyaW5nKGUpLHRoaXMucmVhbGxvYyhlLmxlbmd0aCo0KSx0aGlzLnBvcysrO2xldCB0PXRoaXMucG9zO3RoaXMucG9zPVNfKHRoaXMuYnVmLGUsdGhpcy5wb3MpO2xldCBuPXRoaXMucG9zLXQ7bj49MTI4JiZkXyh0LG4sdGhpcyksdGhpcy5wb3M9dC0xLHRoaXMud3JpdGVWYXJpbnQobiksdGhpcy5wb3MrPW59d3JpdGVGbG9hdChlKXt0aGlzLnJlYWxsb2MoNCksdGhpcy5kYXRhVmlldy5zZXRGbG9hdDMyKHRoaXMucG9zLGUsITApLHRoaXMucG9zKz00fXdyaXRlRG91YmxlKGUpe3RoaXMucmVhbGxvYyg4KSx0aGlzLmRhdGFWaWV3LnNldEZsb2F0NjQodGhpcy5wb3MsZSwhMCksdGhpcy5wb3MrPTh9d3JpdGVCeXRlcyhlKXtsZXQgdD1lLmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KHQpLHRoaXMucmVhbGxvYyh0KSx0aGlzLmJ1Zi5zZXQoZSx0aGlzLnBvcyksdGhpcy5wb3MrPXR9d3JpdGVSYXdNZXNzYWdlKGUsdCl7dGhpcy5wb3MrKztsZXQgbj10aGlzLnBvcztlKHQsdGhpcyk7bGV0IHI9dGhpcy5wb3MtbjtyPj0xMjgmJmRfKG4scix0aGlzKSx0aGlzLnBvcz1uLTEsdGhpcy53cml0ZVZhcmludChyKSx0aGlzLnBvcys9cn13cml0ZU1lc3NhZ2UoZSx0LG4pe3RoaXMud3JpdGVUYWcoZSwyKSx0aGlzLndyaXRlUmF3TWVzc2FnZSh0LG4pfXdyaXRlUGFja2VkVmFyaW50KGUsdCl7dC5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKGUsZl8sdCl9d3JpdGVQYWNrZWRTVmFyaW50KGUsdCl7dC5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKGUscF8sdCl9d3JpdGVQYWNrZWRCb29sZWFuKGUsdCl7dC5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKGUsZ18sdCl9d3JpdGVQYWNrZWRGbG9hdChlLHQpe3QubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZShlLG1fLHQpfXdyaXRlUGFja2VkRG91YmxlKGUsdCl7dC5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKGUsaF8sdCl9d3JpdGVQYWNrZWRGaXhlZDMyKGUsdCl7dC5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKGUsX18sdCl9d3JpdGVQYWNrZWRTRml4ZWQzMihlLHQpe3QubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZShlLHZfLHQpfXdyaXRlUGFja2VkRml4ZWQ2NChlLHQpe3QubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZShlLHlfLHQpfXdyaXRlUGFja2VkU0ZpeGVkNjQoZSx0KXt0Lmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UoZSxiXyx0KX13cml0ZUJ5dGVzRmllbGQoZSx0KXt0aGlzLndyaXRlVGFnKGUsMiksdGhpcy53cml0ZUJ5dGVzKHQpfXdyaXRlRml4ZWQzMkZpZWxkKGUsdCl7dGhpcy53cml0ZVRhZyhlLDUpLHRoaXMud3JpdGVGaXhlZDMyKHQpfXdyaXRlU0ZpeGVkMzJGaWVsZChlLHQpe3RoaXMud3JpdGVUYWcoZSw1KSx0aGlzLndyaXRlU0ZpeGVkMzIodCl9d3JpdGVGaXhlZDY0RmllbGQoZSx0KXt0aGlzLndyaXRlVGFnKGUsMSksdGhpcy53cml0ZUZpeGVkNjQodCl9d3JpdGVTRml4ZWQ2NEZpZWxkKGUsdCl7dGhpcy53cml0ZVRhZyhlLDEpLHRoaXMud3JpdGVTRml4ZWQ2NCh0KX13cml0ZVZhcmludEZpZWxkKGUsdCl7dGhpcy53cml0ZVRhZyhlLDApLHRoaXMud3JpdGVWYXJpbnQodCl9d3JpdGVTVmFyaW50RmllbGQoZSx0KXt0aGlzLndyaXRlVGFnKGUsMCksdGhpcy53cml0ZVNWYXJpbnQodCl9d3JpdGVTdHJpbmdGaWVsZChlLHQpe3RoaXMud3JpdGVUYWcoZSwyKSx0aGlzLndyaXRlU3RyaW5nKHQpfXdyaXRlRmxvYXRGaWVsZChlLHQpe3RoaXMud3JpdGVUYWcoZSw1KSx0aGlzLndyaXRlRmxvYXQodCl9d3JpdGVEb3VibGVGaWVsZChlLHQpe3RoaXMud3JpdGVUYWcoZSwxKSx0aGlzLndyaXRlRG91YmxlKHQpfXdyaXRlQm9vbGVhbkZpZWxkKGUsdCl7dGhpcy53cml0ZVZhcmludEZpZWxkKGUsK3QpfX07ZnVuY3Rpb24gb18oZSx0LG4pe2xldCByPW4uYnVmLGksYTtpZihhPXJbbi5wb3MrK10saT0oYSYxMTIpPj40LGE8MTI4fHwoYT1yW24ucG9zKytdLGl8PShhJjEyNyk8PDMsYTwxMjgpfHwoYT1yW24ucG9zKytdLGl8PShhJjEyNyk8PDEwLGE8MTI4KXx8KGE9cltuLnBvcysrXSxpfD0oYSYxMjcpPDwxNyxhPDEyOCl8fChhPXJbbi5wb3MrK10saXw9KGEmMTI3KTw8MjQsYTwxMjgpfHwoYT1yW24ucG9zKytdLGl8PShhJjEpPDwzMSxhPDEyOCkpcmV0dXJuIHNfKGUsaSx0KTt0aHJvdyBFcnJvcihgRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXNgKX1mdW5jdGlvbiBzXyhlLHQsbil7cmV0dXJuIG4/dCo0Mjk0OTY3Mjk2KyhlPj4+MCk6KHQ+Pj4wKSo0Mjk0OTY3Mjk2KyhlPj4+MCl9ZnVuY3Rpb24gY18oZSx0KXtsZXQgbixyO2lmKGU+PTA/KG49ZSU0Mjk0OTY3Mjk2fDAscj1lLzQyOTQ5NjcyOTZ8MCk6KG49figtZSU0Mjk0OTY3Mjk2KSxyPX4oLWUvNDI5NDk2NzI5Niksbl40Mjk0OTY3Mjk1P249bisxfDA6KG49MCxyPXIrMXwwKSksZT49MHgxMDAwMDAwMDAwMDAwMDAwMHx8ZTwtMHgxMDAwMDAwMDAwMDAwMDAwMCl0aHJvdyBFcnJvcihgR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXNgKTt0LnJlYWxsb2MoMTApLGxfKG4scix0KSx1XyhyLHQpfWZ1bmN0aW9uIGxfKGUsdCxuKXtuLmJ1ZltuLnBvcysrXT1lJjEyN3wxMjgsZT4+Pj03LG4uYnVmW24ucG9zKytdPWUmMTI3fDEyOCxlPj4+PTcsbi5idWZbbi5wb3MrK109ZSYxMjd8MTI4LGU+Pj49NyxuLmJ1ZltuLnBvcysrXT1lJjEyN3wxMjgsZT4+Pj03LG4uYnVmW24ucG9zXT1lJjEyN31mdW5jdGlvbiB1XyhlLHQpe2xldCBuPShlJjcpPDw0O3QuYnVmW3QucG9zKytdfD1ufCgoZT4+Pj0zKT8xMjg6MCksZSYmKHQuYnVmW3QucG9zKytdPWUmMTI3fCgoZT4+Pj03KT8xMjg6MCksZSYmKHQuYnVmW3QucG9zKytdPWUmMTI3fCgoZT4+Pj03KT8xMjg6MCksZSYmKHQuYnVmW3QucG9zKytdPWUmMTI3fCgoZT4+Pj03KT8xMjg6MCksZSYmKHQuYnVmW3QucG9zKytdPWUmMTI3fCgoZT4+Pj03KT8xMjg6MCksZSYmKHQuYnVmW3QucG9zKytdPWUmMTI3KSkpKSl9ZnVuY3Rpb24gZF8oZSx0LG4pe2xldCByPXQ8PTE2MzgzPzE6dDw9MjA5NzE1MT8yOnQ8PTI2ODQzNTQ1NT8zOk1hdGguZmxvb3IoTWF0aC5sb2codCkvKE1hdGguTE4yKjcpKTtuLnJlYWxsb2Mociksbi5idWYuY29weVdpdGhpbihlK3IsZSxuLnBvcyl9ZnVuY3Rpb24gZl8oZSx0KXtsZXQgbj1lLmxlbmd0aCxyPXQuYnVmLGk9dC5wb3MsYT10Lmxlbmd0aDtmb3IobGV0IG89MDtvPG47bysrKXtsZXQgbj1lW29dO2lmKG48MHx8aSsxMD5hKXt0LnBvcz1pLHQud3JpdGVWYXJpbnQobikscj10LmJ1ZixpPXQucG9zLGE9dC5sZW5ndGg7Y29udGludWV9Zm9yKDtuPjEyNzspcltpKytdPW4lMTI4fDEyOCxuPU1hdGguZmxvb3Iobi8xMjgpO3JbaSsrXT1ufXQucG9zPWl9ZnVuY3Rpb24gcF8oZSx0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0LndyaXRlU1ZhcmludChlW25dKX1mdW5jdGlvbiBtXyhlLHQpe2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQud3JpdGVGbG9hdChlW25dKX1mdW5jdGlvbiBoXyhlLHQpe2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQud3JpdGVEb3VibGUoZVtuXSl9ZnVuY3Rpb24gZ18oZSx0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0LndyaXRlQm9vbGVhbihlW25dKX1mdW5jdGlvbiBfXyhlLHQpe2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQud3JpdGVGaXhlZDMyKGVbbl0pfWZ1bmN0aW9uIHZfKGUsdCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC53cml0ZVNGaXhlZDMyKGVbbl0pfWZ1bmN0aW9uIHlfKGUsdCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC53cml0ZUZpeGVkNjQoZVtuXSl9ZnVuY3Rpb24gYl8oZSx0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0LndyaXRlU0ZpeGVkNjQoZVtuXSl9ZnVuY3Rpb24geF8oZSx0LG4pe2xldCByPWBgLGk9dDtmb3IoO2k8bjspe2xldCB0PWVbaV0sYT1udWxsLG89dD4yMzk/NDp0PjIyMz8zOnQ+MTkxPzI6MTtpZihpK28+bilicmVhaztsZXQgcyxjLGw7bz09PTE/dDwxMjgmJihhPXQpOm89PT0yPyhzPWVbaSsxXSwocyYxOTIpPT0xMjgmJihhPSh0JjMxKTw8NnxzJjYzLGE8PTEyNyYmKGE9bnVsbCkpKTpvPT09Mz8ocz1lW2krMV0sYz1lW2krMl0sKHMmMTkyKT09MTI4JiYoYyYxOTIpPT0xMjgmJihhPSh0JjE1KTw8MTJ8KHMmNjMpPDw2fGMmNjMsKGE8PTIwNDd8fGE+PTU1Mjk2JiZhPD01NzM0MykmJihhPW51bGwpKSk6bz09PTQmJihzPWVbaSsxXSxjPWVbaSsyXSxsPWVbaSszXSwocyYxOTIpPT0xMjgmJihjJjE5Mik9PTEyOCYmKGwmMTkyKT09MTI4JiYoYT0odCYxNSk8PDE4fChzJjYzKTw8MTJ8KGMmNjMpPDw2fGwmNjMsKGE8PTY1NTM1fHxhPj0xMTE0MTEyKSYmKGE9bnVsbCkpKSxhPT09bnVsbD8oYT02NTUzMyxvPTEpOmE+NjU1MzUmJihhLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGE+Pj4xMCYxMDIzfDU1Mjk2KSxhPTU2MzIwfGEmMTAyMykscis9U3RyaW5nLmZyb21DaGFyQ29kZShhKSxpKz1vfXJldHVybiByfWZ1bmN0aW9uIFNfKGUsdCxuKXtmb3IobGV0IHI9MCxpLGE7cjx0Lmxlbmd0aDtyKyspe2lmKGk9dC5jaGFyQ29kZUF0KHIpLGk+NTUyOTUmJmk8NTczNDQpe2lmKGEpe2lmKGk8NTYzMjApe2VbbisrXT0yMzksZVtuKytdPTE5MSxlW24rK109MTg5LGE9aTtjb250aW51ZX1pPWEtNTUyOTY8PDEwfGktNTYzMjB8NjU1MzYsYT1udWxsfWVsc2V7aT41NjMxOXx8cisxPT09dC5sZW5ndGg/KGVbbisrXT0yMzksZVtuKytdPTE5MSxlW24rK109MTg5KTphPWk7Y29udGludWV9fWVsc2UgYSYmPShlW24rK109MjM5LGVbbisrXT0xOTEsZVtuKytdPTE4OSxudWxsKTtpPDEyOD9lW24rK109aTooaTwyMDQ4P2VbbisrXT1pPj42fDE5MjooaTw2NTUzNj9lW24rK109aT4+MTJ8MjI0OihlW24rK109aT4+MTh8MjQwLGVbbisrXT1pPj4xMiY2M3wxMjgpLGVbbisrXT1pPj42JjYzfDEyOCksZVtuKytdPWkmNjN8MTI4KX1yZXR1cm4gbn1mdW5jdGlvbiBDXyhlLHQsbil7ZT09PTEmJm4ucmVhZE1lc3NhZ2Uod18sdCl9ZnVuY3Rpb24gd18oZSx0LG4pe2lmKGU9PT0zKXtsZXR7aWQ6ZSxiaXRtYXA6cix3aWR0aDppLGhlaWdodDphLGxlZnQ6byx0b3A6cyxhZHZhbmNlOmN9PW4ucmVhZE1lc3NhZ2UoVF8se30pO3QucHVzaCh7aWQ6ZSxiaXRtYXA6bmV3IFFkKHt3aWR0aDppKzYsaGVpZ2h0OmErNn0sciksbWV0cmljczp7d2lkdGg6aSxoZWlnaHQ6YSxsZWZ0Om8sdG9wOnMsYWR2YW5jZTpjfX0pfX1mdW5jdGlvbiBUXyhlLHQsbil7ZT09PTE/dC5pZD1uLnJlYWRWYXJpbnQoKTplPT09Mj90LmJpdG1hcD1uLnJlYWRCeXRlcygpOmU9PT0zP3Qud2lkdGg9bi5yZWFkVmFyaW50KCk6ZT09PTQ/dC5oZWlnaHQ9bi5yZWFkVmFyaW50KCk6ZT09PTU/dC5sZWZ0PW4ucmVhZFNWYXJpbnQoKTplPT09Nj90LnRvcD1uLnJlYWRTVmFyaW50KCk6ZT09PTcmJih0LmFkdmFuY2U9bi5yZWFkVmFyaW50KCkpfWZ1bmN0aW9uIEVfKGUpe3JldHVybiBuZXcgaV8oZSkucmVhZEZpZWxkcyhDXyxbXSl9ZnVuY3Rpb24gRF8oZSl7cmV0dXJuIHR5cGVvZiBlPy5yZW5kZXJXaXRoV2ViR0w9PWBmdW5jdGlvbmB9ZnVuY3Rpb24gT18oZSl7bGV0e3VzZXJJbWFnZTp0fT1lO3JldHVybiF0Py5yZW5kZXJ8fCF0LnJlbmRlcigpPyExOihEXyh0LmRhdGEpfHxlLmRhdGEucmVwbGFjZShuZXcgVWludDhBcnJheSh0LmRhdGEuYnVmZmVyKSksITApfWZ1bmN0aW9uIGtfKGUpe2xldCB0PTAsbj0wO2ZvcihsZXQgciBvZiBlKXQrPXIudypyLmgsbj1NYXRoLm1heChuLHIudyk7ZS5zb3J0KChlLHQpPT50LmgtZS5oKTtsZXQgcj1be3g6MCx5OjAsdzpNYXRoLm1heChNYXRoLmNlaWwoTWF0aC5zcXJ0KHQvLjk1KSksbiksaDoxLzB9XSxpPTAsYT0wO2ZvcihsZXQgdCBvZiBlKWZvcihsZXQgZT1yLmxlbmd0aC0xO2U+PTA7ZS0tKXtsZXQgbj1yW2VdO2lmKCEodC53Pm4ud3x8dC5oPm4uaCkpe2lmKHQueD1uLngsdC55PW4ueSxhPU1hdGgubWF4KGEsdC55K3QuaCksaT1NYXRoLm1heChpLHQueCt0LncpLHQudz09PW4udyYmdC5oPT09bi5oKXtsZXQgdD1yLnBvcCgpO3QmJmU8ci5sZW5ndGgmJihyW2VdPXQpfWVsc2UgdC5oPT09bi5oPyhuLngrPXQudyxuLnctPXQudyk6dC53PT09bi53PyhuLnkrPXQuaCxuLmgtPXQuaCk6KHIucHVzaCh7eDpuLngrdC53LHk6bi55LHc6bi53LXQudyxoOnQuaH0pLG4ueSs9dC5oLG4uaC09dC5oKTticmVha319cmV0dXJue3c6aSxoOmEsZmlsbDp0LyhpKmEpfHwwfX12YXIgQV89Y2xhc3N7Y29uc3RydWN0b3IoZSx7cGl4ZWxSYXRpbzp0LHZlcnNpb246bixpc1dlYkdMSW1hZ2U6cj0hMSxzdHJldGNoWDppLHN0cmV0Y2hZOmEsY29udGVudDpvLHRleHRGaXRXaWR0aDpzLHRleHRGaXRIZWlnaHQ6Y30pe3RoaXMucGFkZGVkUmVjdD1lLHRoaXMucGl4ZWxSYXRpbz10LHRoaXMuc3RyZXRjaFg9aSx0aGlzLnN0cmV0Y2hZPWEsdGhpcy5jb250ZW50PW8sdGhpcy52ZXJzaW9uPW4sdGhpcy5uZWVkc0ZpcnN0V2ViR0xSZW5kZXI9cix0aGlzLnRleHRGaXRXaWR0aD1zLHRoaXMudGV4dEZpdEhlaWdodD1jfWdldCB0bCgpe3JldHVyblt0aGlzLnBhZGRlZFJlY3QueCsxLHRoaXMucGFkZGVkUmVjdC55KzFdfWdldCBicigpe3JldHVyblt0aGlzLnBhZGRlZFJlY3QueCt0aGlzLnBhZGRlZFJlY3Qudy0xLHRoaXMucGFkZGVkUmVjdC55K3RoaXMucGFkZGVkUmVjdC5oLTFdfWdldCB0bGJyKCl7cmV0dXJuIHRoaXMudGwuY29uY2F0KHRoaXMuYnIpfWdldCBkaXNwbGF5U2l6ZSgpe3JldHVyblsodGhpcy5wYWRkZWRSZWN0LnctMikvdGhpcy5waXhlbFJhdGlvLCh0aGlzLnBhZGRlZFJlY3QuaC0yKS90aGlzLnBpeGVsUmF0aW9dfX0sal89Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXtsZXQgbj17fSxyPXt9O3RoaXMuaGF2ZVJlbmRlckNhbGxiYWNrcz1bXSx0aGlzLnBhdGNoZWRVcGRhdGVWZXJzaW9uPS0xO2xldCBpPVtdO3RoaXMuYWRkSW1hZ2VzKGUsbixpKSx0aGlzLmFkZEltYWdlcyh0LHIsaSk7bGV0e3c6YSxoOm99PWtfKGkpLHM9bmV3ICRkKHt3aWR0aDphfHwxLGhlaWdodDpvfHwxfSk7Zm9yKGxldCB0IGluIGUpe2xldCByPWVbdF07aWYoci5pc1dlYkdMSW1hZ2UpY29udGludWU7bGV0IGk9blt0XS5wYWRkZWRSZWN0OyRkLmNvcHkoci5kYXRhLHMse3g6MCx5OjB9LHt4OmkueCsxLHk6aS55KzF9LHIuZGF0YSl9Zm9yKGxldCBlIGluIHQpe2xldCBuPXRbZV0saT1yW2VdLnBhZGRlZFJlY3QsYT1pLngrMSxvPWkueSsxLGM9bi5kYXRhLndpZHRoLGw9bi5kYXRhLmhlaWdodDskZC5jb3B5KG4uZGF0YSxzLHt4OjAseTowfSx7eDphLHk6b30sbi5kYXRhKSwkZC5jb3B5KG4uZGF0YSxzLHt4OjAseTpsLTF9LHt4OmEseTpvLTF9LHt3aWR0aDpjLGhlaWdodDoxfSksJGQuY29weShuLmRhdGEscyx7eDowLHk6MH0se3g6YSx5Om8rbH0se3dpZHRoOmMsaGVpZ2h0OjF9KSwkZC5jb3B5KG4uZGF0YSxzLHt4OmMtMSx5OjB9LHt4OmEtMSx5Om99LHt3aWR0aDoxLGhlaWdodDpsfSksJGQuY29weShuLmRhdGEscyx7eDowLHk6MH0se3g6YStjLHk6b30se3dpZHRoOjEsaGVpZ2h0Omx9KX10aGlzLmltYWdlPXMsdGhpcy5pY29uUG9zaXRpb25zPW4sdGhpcy5wYXR0ZXJuUG9zaXRpb25zPXJ9YWRkSW1hZ2VzKGUsdCxuKXtmb3IobGV0IHIgaW4gZSl7bGV0IGk9ZVtyXSxhPXt4OjAseTowLHc6aS5kYXRhLndpZHRoKzIsaDppLmRhdGEuaGVpZ2h0KzJ9O24ucHVzaChhKSx0W3JdPW5ldyBBXyhhLGkpLGkuaGFzUmVuZGVyQ2FsbGJhY2smJnRoaXMuaGF2ZVJlbmRlckNhbGxiYWNrcy5wdXNoKHIpfX1wYXRjaFVwZGF0ZWRJbWFnZXMoZSx0KXtpZihlLmRpc3BhdGNoUmVuZGVyQ2FsbGJhY2tzKHRoaXMuaGF2ZVJlbmRlckNhbGxiYWNrcyksdGhpcy5wYXRjaGVkVXBkYXRlVmVyc2lvbiE9PWUudXBkYXRlVmVyc2lvbil7dGhpcy5wYXRjaGVkVXBkYXRlVmVyc2lvbj1lLnVwZGF0ZVZlcnNpb247Zm9yKGxldCBuIGluIHRoaXMuaWNvblBvc2l0aW9ucyl0aGlzLnBhdGNoVXBkYXRlZEltYWdlKHRoaXMuaWNvblBvc2l0aW9uc1tuXSxlLmdldEltYWdlKG4pLHQpO2ZvcihsZXQgbiBpbiB0aGlzLnBhdHRlcm5Qb3NpdGlvbnMpdGhpcy5wYXRjaFVwZGF0ZWRJbWFnZSh0aGlzLnBhdHRlcm5Qb3NpdGlvbnNbbl0sZS5nZXRJbWFnZShuKSx0KX19cGF0Y2hVcGRhdGVkSW1hZ2UoZSx0LG4pe2lmKCFlfHwhdHx8IWUubmVlZHNGaXJzdFdlYkdMUmVuZGVyJiZlLnZlcnNpb249PT10LnZlcnNpb24pcmV0dXJuO2UubmVlZHNGaXJzdFdlYkdMUmVuZGVyPSExLGUudmVyc2lvbj10LnZlcnNpb247bGV0W3IsaV09ZS50bCxhPXQudXNlckltYWdlPy5kYXRhO2lmKCFEXyhhKSl7bi51cGRhdGUodC5kYXRhLHZvaWQgMCx7eDpyLHk6aX0pO3JldHVybn1sZXR7d2lkdGg6byxoZWlnaHQ6c309dC5kYXRhO24uY29udGV4dC5zZXRDdXN0b21MYXllckRlZmF1bHRzKCksYS5yZW5kZXJXaXRoV2ViR0woe2dsOm4uY29udGV4dC5nbCx0ZXh0dXJlOm4udGV4dHVyZSx4OnIseTppLHdpZHRoOm8saGVpZ2h0OnN9KSxuLmNvbnRleHQuc2V0RGlydHkoKX19O0goYEltYWdlUG9zaXRpb25gLEFfKSxIKGBJbWFnZUF0bGFzYCxqXyk7dmFyIE1fPWZ1bmN0aW9uKGUpe3JldHVybiBlW2Uubm9uZT0wXT1gbm9uZWAsZVtlLmhvcml6b250YWw9MV09YGhvcml6b250YWxgLGVbZS52ZXJ0aWNhbD0yXT1gdmVydGljYWxgLGVbZS5ob3Jpem9udGFsT25seT0zXT1gaG9yaXpvbnRhbE9ubHlgLGV9KE1ffHx7fSk7ZnVuY3Rpb24gTl8oZSl7Zm9yKGxldCB0IG9mIGUpaWYodC5wb3NpdGlvbmVkR2x5cGhzLmxlbmd0aCE9PTApcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gUF8oZSx0KXtsZXQgbj1bXSxyPTA7Zm9yKGxldCBpIG9mIHQpbi5wdXNoKGUuc3Vic3RyaW5nKHIsaSkpLHI9aTtyZXR1cm4gcjxlLmxlbmd0aCgpJiZuLnB1c2goZS5zdWJzdHJpbmcocixlLmxlbmd0aCgpKSksbn1jb25zdCBGXz0vXlxwe2djPU19JC91O2Z1bmN0aW9uIElfKGUpe2xldCB0PVtdLG49MDtmb3IoO248ZS5sZW5ndGg7KXtpZighRl8udGVzdChlW25dKSl7dC5wdXNoKG4pLG4rKztjb250aW51ZX1sZXQgcj1uO2Zvcig7cjxlLmxlbmd0aCYmRl8udGVzdChlW3JdKTspcisrO2xldCBpPWVbcl07aWYoaSE9PXZvaWQgMCYmSGMoaS5jb2RlUG9pbnRBdCgwKSkpe3QucHVzaChyKTtmb3IobGV0IGU9ci0xO2U+PW47ZS0tKXQucHVzaChlKTtuPXIrMX1lbHNle2ZvcihsZXQgZT1uO2U8cjtlKyspdC5wdXNoKGUpO249cn19cmV0dXJuIHR9ZnVuY3Rpb24gTF8oZSl7bGV0IHQ9W10sbj0wO2ZvcihsZXQgciBvZiBlLmdyYXBoZW1lcygpKXQucHVzaCguLi5BcnJheShyLmxlbmd0aCkuZmlsbChlLnNlY3Rpb25JbmRleFtuXSkpLG4rKztyZXR1cm4gdH1mdW5jdGlvbiBSXyhlLHQsbil7bGV0IHI9Wy4uLmVdLGk9W10sYT0wO2ZvcihsZXQgZSBvZiByKWkucHVzaChhKSxhKz1lLmxlbmd0aDtsZXQgbz1JXyhyKSxzPW5ldyBlXyhvLm1hcChlPT5yW2VdKS5qb2luKGBgKSx0LFtdKSxjPW8ubWFwKGU9Pm5baVtlXV0/PzApLGw9MDtmb3IobGV0IGUgb2Ygcy5ncmFwaGVtZXMoKSlzLnNlY3Rpb25JbmRleC5wdXNoKGNbbF0/PzApLGwrPVsuLi5lXS5sZW5ndGg7cmV0dXJuIHN9ZnVuY3Rpb24gel8oZSx0LG4scixpLGEsbyxzLGMsbCx1LGQsZixwLG0pe2xldCBoPWVfLmZyb21GZWF0dXJlKGUsaSk7ZD09PTImJmgudmVydGljYWxpemVQdW5jdHVhdGlvbigpO2xldCBnLF89aC5kZXRlcm1pbmVMaW5lQnJlYWtzKGwsYSx0LHIscCkse3Byb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dDp2LHByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dDp5fT1LYztpZih2JiZoLnNlY3Rpb25zLmxlbmd0aD09PTEpe2c9W10sXz1fLm1hcChlPT5oLnRvQ29kZVVuaXRJbmRleChlKSk7bGV0IGU9dihoLnRvU3RyaW5nKCksXyk7Zm9yKGxldCB0IG9mIGUpZy5wdXNoKFJfKHQsaC5zZWN0aW9ucyxbLi4udF0ubWFwKCgpPT4wKSkpfWVsc2UgaWYoeSl7Zz1bXSxfPV8ubWFwKGU9PmgudG9Db2RlVW5pdEluZGV4KGUpKTtsZXQgZT1MXyhoKSx0PXkoaC50ZXh0LGUsXyk7Zm9yKGxldCBlIG9mIHQpZy5wdXNoKFJfKGVbMF0saC5zZWN0aW9ucyxlWzFdKSl9ZWxzZSBnPVBfKGgsXyk7bGV0IGI9W10seD17cG9zaXRpb25lZExpbmVzOmIsdGV4dDpoLnRvU3RyaW5nKCksdG9wOnVbMV0sYm90dG9tOnVbMV0sbGVmdDp1WzBdLHJpZ2h0OnVbMF0sd3JpdGluZ01vZGU6ZCxpY29uc0luVGV4dDohMSx2ZXJ0aWNhbGl6YWJsZTohMX07cmV0dXJuIFFfKHgsdCxuLHIsZyxvLHMsYyxkLGwsZixtKSwhTl8oYikmJnh9ZnVuY3Rpb24gQl8oZSl7bGV0IHQ9LjUsbj0uNTtzd2l0Y2goZSl7Y2FzZWByaWdodGA6Y2FzZWB0b3AtcmlnaHRgOmNhc2VgYm90dG9tLXJpZ2h0YDp0PTE7YnJlYWs7Y2FzZWBsZWZ0YDpjYXNlYHRvcC1sZWZ0YDpjYXNlYGJvdHRvbS1sZWZ0YDp0PTB9c3dpdGNoKGUpe2Nhc2VgYm90dG9tYDpjYXNlYGJvdHRvbS1yaWdodGA6Y2FzZWBib3R0b20tbGVmdGA6bj0xO2JyZWFrO2Nhc2VgdG9wYDpjYXNlYHRvcC1yaWdodGA6Y2FzZWB0b3AtbGVmdGA6bj0wfXJldHVybntob3Jpem9udGFsQWxpZ246dCx2ZXJ0aWNhbEFsaWduOm59fWZ1bmN0aW9uIFZfKGUsdCxuKXtsZXQgcj10LmdldE1heFNjYWxlKCkqMjQse21heEltYWdlV2lkdGg6aSxtYXhJbWFnZUhlaWdodDphfT10LmdldE1heEltYWdlU2l6ZShlKSxvPU1hdGgubWF4KHIsYSpuKTtyZXR1cm57dmVydGljYWxMaW5lQ29udGVudFdpZHRoOk1hdGgubWF4KHIsaSpuKSxob3Jpem9udGFsTGluZUNvbnRlbnRIZWlnaHQ6b319ZnVuY3Rpb24gSF8oZSl7c3dpdGNoKGUpe2Nhc2VgdG9wYDpyZXR1cm4gMDtjYXNlYGNlbnRlcmA6cmV0dXJuIC41O2RlZmF1bHQ6cmV0dXJuIDF9fWZ1bmN0aW9uIFVfKGUsdCxuLHIpe2lmKGU/LnJlY3QpcmV0dXJuIGU7bGV0IGk9dFtuLmZvbnRTdGFja10/LltyXTtyZXR1cm4gaT97cmVjdDpudWxsLG1ldHJpY3M6aS5tZXRyaWNzfTpudWxsfWZ1bmN0aW9uIFdfKGUsdCxuKXtyZXR1cm4hKGU9PT0xfHwhdCYmIURjKG4pfHx0JiYoTmMobil8fEJjKG4pKSl9ZnVuY3Rpb24gR18oZSl7cmV0dXJuL1xwe05kfS91LnRlc3QoU3RyaW5nLmZyb21Db2RlUG9pbnQoZSkpfWZ1bmN0aW9uIEtfKGUpe3JldHVybi9ccHtMdX0vdS50ZXN0KFN0cmluZy5mcm9tQ29kZVBvaW50KGUpKX1mdW5jdGlvbiBxXyhlKXtyZXR1cm4vW1xwe1B9XHB7U31dL3UudGVzdChTdHJpbmcuZnJvbUNvZGVQb2ludChlKSl9ZnVuY3Rpb24gSl8oZSl7bGV0IHQ9ZS5zb21lKEdfKSYmZS5ldmVyeShlPT5HXyhlKXx8cV8oZSkpLG49ZS5sZW5ndGg8PTMmJmUuZXZlcnkoZT0+S18oZSl8fEdfKGUpKTtyZXR1cm4gdHx8bn1mdW5jdGlvbiBZXyhlKXtyZXR1cm4oR18oZSl8fEtfKGUpKSYmIUJjKGUpfWZ1bmN0aW9uIFhfKGUsdCl7bGV0IG49ITE7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2lmKHRbcl0pY29udGludWU7bGV0IGk9V2dbZVtyXV07aSYmKHI9PT0wfHx0W3ItMV0pJiYocj09PWUubGVuZ3RoLTF8fHRbcisxXSkmJihlW3JdPWksdFtyXT0hMCxuPSEwKX1yZXR1cm4gbn1mdW5jdGlvbiBaXyhlKXtsZXQgdD1lLmdyYXBoZW1lcygpLnNsaWNlKCksbj10Lm1hcChlPT5lLmNvZGVQb2ludEF0KDApKSxyPW4ubWFwKERjKSxpPXQ9PiFyW3RdJiYhTmMoblt0XSkmJiEoYGltYWdlTmFtZWBpbiBlLmdldFNlY3Rpb24odCkpO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKXtpZighaShlKSljb250aW51ZTtsZXQgdD1lO2Zvcig7dCsxPG4ubGVuZ3RoJiZpKHQrMSk7KXQrKztpZihKXyhuLnNsaWNlKGUsdCsxKSkpZm9yKGxldCBpPWU7aTw9dDtpKyspcltpXT1ZXyhuW2ldKTtlPXR9cmV0dXJuIFhfKHQscikmJihlLnRleHQ9dC5qb2luKGBgKSxlLl9ncmFwaGVtZXM9bnVsbCkscn1mdW5jdGlvbiBRXyhlLHQsbixyLGksYSxvLHMsYyxsLHUsZCl7bGV0IGY9MCxwPTAsbT0wLGg9MCxnPXM9PT1gcmlnaHRgPzE6cz09PWBsZWZ0YD8wOi41LF89MjQvZCx2PTA7Zm9yKGxldCBvIG9mIGkpe28udHJpbSgpO2xldCBpPW8uZ2V0TWF4U2NhbGUoKSxzPXtwb3NpdGlvbmVkR2x5cGhzOltdLGxpbmVPZmZzZXQ6MH07ZS5wb3NpdGlvbmVkTGluZXNbdl09cztsZXQgZD1zLnBvc2l0aW9uZWRHbHlwaHMseT0wO2lmKCFvLmxlbmd0aCgpKXtwKz1hLCsrdjtjb250aW51ZX1sZXQgYj1WXyhyLG8sXykseD1jPT09MiYmIXU/Wl8obyk6bnVsbCxTPW8uZ3JhcGhlbWVzKCk7Zm9yKGxldCBhPTA7YTxTLmxlbmd0aDthKyspe2xldCBzPW8uZ2V0U2VjdGlvbihhKSxtPVNbYV0saD1tLmNvZGVQb2ludEF0KDApLGc9eD94W2FdOldfKGMsdSxoKSx2PWBmb250U3RhY2tgaW4gcyYmVWcobSkmJiF0W3MuZm9udFN0YWNrXT8uW21dP1suLi5tXTpbbV07Zm9yKGxldCBjIG9mIHYpe2xldCB1PXtnbHlwaDpjLmNvZGVQb2ludEF0KDApLGdyYXBoZW1lOmMsaW1hZ2VOYW1lOm51bGwseDpmLHk6cCstMTcsdmVydGljYWw6ZyxzY2FsZToxLGZvbnRTdGFjazpgYCxzZWN0aW9uSW5kZXg6by5nZXRTZWN0aW9uSW5kZXgoYSksbWV0cmljczpudWxsLHJlY3Q6bnVsbH0sbTtpZihgZm9udFN0YWNrYGluIHMpe2lmKG09JF8ocyxjLGcsYix0LG4pLCFtKWNvbnRpbnVlO3UuZm9udFN0YWNrPXMuZm9udFN0YWNrfWVsc2V7aWYoZS5pY29uc0luVGV4dD0hMCxzLnNjYWxlKj1fLG09ZXYocyxnLGksYixyKSwhbSljb250aW51ZTt5PU1hdGgubWF4KHksbS5pbWFnZU9mZnNldCksdS5pbWFnZU5hbWU9cy5pbWFnZU5hbWV9bGV0e3JlY3Q6aCxtZXRyaWNzOnYsYmFzZWxpbmVPZmZzZXQ6eH09bTtpZih1LnkrPXgsdS5zY2FsZT1zLnNjYWxlLHUubWV0cmljcz12LHUucmVjdD1oLGQucHVzaCh1KSwhZylmKz12LmFkdmFuY2Uqcy5zY2FsZStsO2Vsc2V7ZS52ZXJ0aWNhbGl6YWJsZT0hMDtsZXQgdD1gaW1hZ2VOYW1lYGluIHM/di5hZHZhbmNlOjI0O2YrPXQqcy5zY2FsZStsfX19aWYoZC5sZW5ndGghPT0wKXtsZXQgZT1mLWw7bT1NYXRoLm1heChlLG0pLHR2KGQsMCxkLmxlbmd0aC0xLGcpfWY9MDtsZXQgQz0oaS0xKSoyNDtzLmxpbmVPZmZzZXQ9TWF0aC5tYXgoeSxDKTtsZXQgdz1hKmkreTtwKz13LGg9TWF0aC5tYXgodyxoKSwrK3Z9bGV0e2hvcml6b250YWxBbGlnbjp5LHZlcnRpY2FsQWxpZ246Yn09Ql8obyk7bnYoZS5wb3NpdGlvbmVkTGluZXMsZyx5LGIsbSxoLGEscCxpLmxlbmd0aCksZS50b3ArPS1iKnAsZS5ib3R0b209ZS50b3ArcCxlLmxlZnQrPS15Km0sZS5yaWdodD1lLmxlZnQrbX1mdW5jdGlvbiAkXyhlLHQsbixyLGksYSl7bGV0IG89YVtlLmZvbnRTdGFja10/Llt0XSxzPVVfKG8saSxlLHQpO2lmKHM9PT1udWxsKXJldHVybiBudWxsO2xldCBjO2lmKG4pYz1yLnZlcnRpY2FsTGluZUNvbnRlbnRXaWR0aC1lLnNjYWxlKjI0O2Vsc2V7bGV0IHQ9SF8oZS52ZXJ0aWNhbEFsaWduKTtjPShyLmhvcml6b250YWxMaW5lQ29udGVudEhlaWdodC1lLnNjYWxlKjI0KSp0fXJldHVybntyZWN0OnMucmVjdCxtZXRyaWNzOnMubWV0cmljcyxiYXNlbGluZU9mZnNldDpjfX1mdW5jdGlvbiBldihlLHQsbixyLGkpe2xldCBhPWlbZS5pbWFnZU5hbWVdO2lmKCFhKXJldHVybiBudWxsO2xldCBvPWEucGFkZGVkUmVjdCxzPWEuZGlzcGxheVNpemUsYz17d2lkdGg6c1swXSxoZWlnaHQ6c1sxXSxsZWZ0OjEsdG9wOi0zLGFkdmFuY2U6dD9zWzFdOnNbMF19LGw7aWYodClsPXIudmVydGljYWxMaW5lQ29udGVudFdpZHRoLXNbMV0qZS5zY2FsZTtlbHNle2xldCB0PUhfKGUudmVydGljYWxBbGlnbik7bD0oci5ob3Jpem9udGFsTGluZUNvbnRlbnRIZWlnaHQtc1sxXSplLnNjYWxlKSp0fWxldCB1PSh0P3NbMF06c1sxXSkqZS5zY2FsZS0yNCpuO3JldHVybntyZWN0Om8sbWV0cmljczpjLGJhc2VsaW5lT2Zmc2V0OmwsaW1hZ2VPZmZzZXQ6dX19ZnVuY3Rpb24gdHYoZSx0LG4scil7aWYocj09PTApcmV0dXJuO2xldCBpPWVbbl0sYT1pLm1ldHJpY3MuYWR2YW5jZSppLnNjYWxlLG89KGVbbl0ueCthKSpyO2ZvcihsZXQgcj10O3I8PW47cisrKWVbcl0ueC09b31mdW5jdGlvbiBudihlLHQsbixyLGksYSxvLHMsYyl7bGV0IGw9KHQtbikqaSx1PTA7dT1hPT09bz8tcipjKm8rLjUqbzotcypyLSAtMTc7Zm9yKGxldCB0IG9mIGUpZm9yKGxldCBlIG9mIHQucG9zaXRpb25lZEdseXBocyllLngrPWwsZS55Kz11fWZ1bmN0aW9uIHJ2KGUsdCxuKXtsZXR7aG9yaXpvbnRhbEFsaWduOnIsdmVydGljYWxBbGlnbjppfT1CXyhuKSxhPXRbMF0sbz10WzFdLHM9YS1lLmRpc3BsYXlTaXplWzBdKnIsYz1zK2UuZGlzcGxheVNpemVbMF0sbD1vLWUuZGlzcGxheVNpemVbMV0qaTtyZXR1cm57aW1hZ2U6ZSx0b3A6bCxib3R0b206bCtlLmRpc3BsYXlTaXplWzFdLGxlZnQ6cyxyaWdodDpjfX1mdW5jdGlvbiBpdihlKXtsZXQgdD1lLmxlZnQsbj1lLnRvcCxyPWUucmlnaHQtdCxpPWUuYm90dG9tLW4sYT1lLmltYWdlLmNvbnRlbnRbMl0tZS5pbWFnZS5jb250ZW50WzBdLG89ZS5pbWFnZS5jb250ZW50WzNdLWUuaW1hZ2UuY29udGVudFsxXSxzPWUuaW1hZ2UudGV4dEZpdFdpZHRoPz9gc3RyZXRjaE9yU2hyaW5rYCxjPWUuaW1hZ2UudGV4dEZpdEhlaWdodD8/YHN0cmV0Y2hPclNocmlua2AsbD1hL287aWYoYz09PWBwcm9wb3J0aW9uYWxgKXtpZihzPT09YHN0cmV0Y2hPbmx5YCYmci9pPGx8fHM9PT1gcHJvcG9ydGlvbmFsYCl7bGV0IGU9TWF0aC5jZWlsKGkqbCk7dCo9ZS9yLHI9ZX19ZWxzZSBpZihzPT09YHByb3BvcnRpb25hbGAmJmM9PT1gc3RyZXRjaE9ubHlgJiZsIT09MCYmci9pPmwpe2xldCBlPU1hdGguY2VpbChyL2wpO24qPWUvaSxpPWV9cmV0dXJue3gxOnQseTE6bix4Mjp0K3IseTI6bitpfX1mdW5jdGlvbiBhdihlLHQsbixyLGksYSl7bGV0IG89ZS5pbWFnZSxzO2lmKG8uY29udGVudCl7bGV0IGU9by5jb250ZW50LHQ9by5waXhlbFJhdGlvfHwxO3M9W2VbMF0vdCxlWzFdL3Qsby5kaXNwbGF5U2l6ZVswXS1lWzJdL3Qsby5kaXNwbGF5U2l6ZVsxXS1lWzNdL3RdfWxldCBjPXQubGVmdCphLGw9dC5yaWdodCphLHUsZCxmLHA7bj09PWB3aWR0aGB8fG49PT1gYm90aGA/KHA9aVswXStjLXJbM10sZD1pWzBdK2wrclsxXSk6KHA9aVswXSsoYytsLW8uZGlzcGxheVNpemVbMF0pLzIsZD1wK28uZGlzcGxheVNpemVbMF0pO2xldCBtPXQudG9wKmEsaD10LmJvdHRvbSphO3JldHVybiBuPT09YGhlaWdodGB8fG49PT1gYm90aGA/KHU9aVsxXSttLXJbMF0sZj1pWzFdK2grclsyXSk6KHU9aVsxXSsobStoLW8uZGlzcGxheVNpemVbMV0pLzIsZj11K28uZGlzcGxheVNpemVbMV0pLHtpbWFnZTpvLHRvcDp1LHJpZ2h0OmQsYm90dG9tOmYsbGVmdDpwLGNvbGxpc2lvblBhZGRpbmc6c319Y29uc3Qgb3Y9MzI2NDA7ZnVuY3Rpb24gc3YoZSx0KXtsZXR7ZXhwcmVzc2lvbjpufT10O2lmKG4ua2luZD09PWBjb25zdGFudGApcmV0dXJue2tpbmQ6YGNvbnN0YW50YCxsYXlvdXRTaXplOm4uZXZhbHVhdGUobmV3IFUoZSsxKSl9O2lmKG4ua2luZD09PWBzb3VyY2VgKXJldHVybntraW5kOmBzb3VyY2VgfTtpZihuLmtpbmQ9PT1gY29tcG9zaXRlYCl7bGV0e21pblpvb206dCxtYXhab29tOnJ9PWN2KG4uem9vbVN0b3BzLGUpO3JldHVybntraW5kOmBjb21wb3NpdGVgLG1pblpvb206dCxtYXhab29tOnIsaW50ZXJwb2xhdGlvblR5cGU6bi5pbnRlcnBvbGF0aW9uVHlwZX19e2xldCB0PWx2KG4pLHI9bi5ldmFsdWF0ZShuZXcgVShlKzEpKTtyZXR1cm57a2luZDpgY2FtZXJhYCx6b29tU3RvcHM6bi56b29tU3RvcHMsc2l6ZXM6dCxsYXlvdXRTaXplOnIsaW50ZXJwb2xhdGlvblR5cGU6bi5pbnRlcnBvbGF0aW9uVHlwZX19fWZ1bmN0aW9uIGN2KGUsdCl7bGV0IG49MDtmb3IoO248ZS5sZW5ndGgmJmVbbl08PXQ7KW4rKztuPU1hdGgubWF4KDAsbi0xKTtsZXQgcj1uO2Zvcig7cjxlLmxlbmd0aCYmZVtyXTx0KzE7KXIrKztyZXR1cm4gcj1NYXRoLm1pbihlLmxlbmd0aC0xLHIpLHttaW5ab29tOmVbbl0sbWF4Wm9vbTplW3JdfX1mdW5jdGlvbiBsdihlKXtyZXR1cm4gZS56b29tU3RvcHMubWFwKHQ9PmUuZXZhbHVhdGUobmV3IFUodD09PS0xLzA/ZS56b29tU3RvcHNbMV0tMTp0KSkpfWZ1bmN0aW9uIHV2KGUse3VTaXplOnQsdVNpemVUOm59LHtsb3dlclNpemU6cix1cHBlclNpemU6aX0pe3JldHVybiBlLmtpbmQ9PT1gc291cmNlYD9yLzEyODplLmtpbmQ9PT1gY29tcG9zaXRlYD90aS5udW1iZXIoci8xMjgsaS8xMjgsbik6dH1mdW5jdGlvbiBkdihlLHQpe2xldCBuPTAscj0wO3JldHVybiBlLmtpbmQ9PT1gY29uc3RhbnRgP3I9ZS5sYXlvdXRTaXplOmUua2luZD09PWBjYW1lcmFgP3I9ZnYoZSx0KTplLmtpbmQ9PT1gY29tcG9zaXRlYCYmKG49cHYoZSx0KSkse3VTaXplVDpuLHVTaXplOnJ9fWZ1bmN0aW9uIGZ2KHt6b29tU3RvcHM6ZSxzaXplczp0LGxheW91dFNpemU6bixpbnRlcnBvbGF0aW9uVHlwZTpyfSxpKXtsZXQgYT1lLmxlbmd0aC0xO2Zvcig7YT4wJiZlW2FdPmk7KWEtLTtsZXQgbz1NYXRoLm1pbihhKzEsZS5sZW5ndGgtMSkscz1yP2J0KCRyLmludGVycG9sYXRpb25GYWN0b3IocixpLGVbYV0sZVtvXSksMCwxKTowO3JldHVybiBNYXRoLm1pbih0aS5udW1iZXIodFthXSx0W29dLHMpLG4pfWZ1bmN0aW9uIHB2KHtpbnRlcnBvbGF0aW9uVHlwZTplLG1pblpvb206dCxtYXhab29tOm59LHIpe3JldHVybiBlP2J0KCRyLmludGVycG9sYXRpb25GYWN0b3IoZSxyLHQsbiksMCwxKTowfWZ1bmN0aW9uIG12KGUsdCxuKXtsZXQgcj1gbmV2ZXJgLGk9ZS5nZXQodCk7cmV0dXJuIGk/cj1pOmUuZ2V0KG4pJiYocj1gYWx3YXlzYCkscn1jb25zdCBodj1be25hbWU6YGFfZmFkZV9vcGFjaXR5YCxjb21wb25lbnRzOjEsdHlwZTpgVWludDhgLG9mZnNldDowfV07ZnVuY3Rpb24gZ3YoZSx0LG4scixpLGEsbyxzLGMsbCx1LGQsZixwKXtsZXQgbT1zP01hdGgubWluKG92LE1hdGgucm91bmQoc1swXSkpOjAsaD1zP01hdGgubWluKG92LE1hdGgucm91bmQoc1sxXSkpOjA7ZS5lbXBsYWNlQmFjayh0LG4sTWF0aC5yb3VuZChyKjMyKSxNYXRoLnJvdW5kKGkqMzIpLGEsbywobTw8MSkrICshIWMsaCxsKjE2LHUqMTYsZCoyNTYsZioyNTYscCl9ZnVuY3Rpb24gX3YoZSx0LG4pe2UuZW1wbGFjZUJhY2sodC54LHQueSxuKSxlLmVtcGxhY2VCYWNrKHQueCx0LnksbiksZS5lbXBsYWNlQmFjayh0LngsdC55LG4pLGUuZW1wbGFjZUJhY2sodC54LHQueSxuKX1mdW5jdGlvbiB2dihlKXtmb3IobGV0IHQgb2YgZS5zZWN0aW9ucylpZihXYyh0LnRleHQpKXJldHVybiEwO3JldHVybiExfXZhciB5dj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmxheW91dFZlcnRleEFycmF5PW5ldyBwdSx0aGlzLmluZGV4QXJyYXk9bmV3IGJ1LHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zPWUsdGhpcy5zZWdtZW50cz1uZXcgVHUsdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXk9bmV3IG11LHRoaXMub3BhY2l0eVZlcnRleEFycmF5PW5ldyBodSx0aGlzLmhhc1Zpc2libGVWZXJ0aWNlcz0hMSx0aGlzLnBsYWNlZFN5bWJvbEFycmF5PW5ldyBKbH1pc0VtcHR5KCl7cmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoPT09MCYmdGhpcy5pbmRleEFycmF5Lmxlbmd0aD09PTAmJnRoaXMuZHluYW1pY0xheW91dFZlcnRleEFycmF5Lmxlbmd0aD09PTAmJnRoaXMub3BhY2l0eVZlcnRleEFycmF5Lmxlbmd0aD09PTB9dXBsb2FkKGUsdCxuLHIpe3RoaXMuaXNFbXB0eSgpfHwobiYmKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyPWUuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksQWcubWVtYmVycyksdGhpcy5pbmRleEJ1ZmZlcj1lLmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSx0KSx0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXI9ZS5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXksamcubWVtYmVycywhMCksdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyPWUuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMub3BhY2l0eVZlcnRleEFycmF5LGh2LCEwKSx0aGlzLm9wYWNpdHlWZXJ0ZXhCdWZmZXIuaXRlbVNpemU9MSksKG58fHIpJiZ0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoZSkpfWRlc3Ryb3koKXt0aGlzLmxheW91dFZlcnRleEJ1ZmZlciYmKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCksdGhpcy5zZWdtZW50cy5kZXN0cm95KCksdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSx0aGlzLm9wYWNpdHlWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpKX19O0goYFN5bWJvbEJ1ZmZlcnNgLHl2KTt2YXIgYnY9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMubGF5b3V0VmVydGV4QXJyYXk9bmV3IGUsdGhpcy5sYXlvdXRBdHRyaWJ1dGVzPXQsdGhpcy5pbmRleEFycmF5PW5ldyBuLHRoaXMuc2VnbWVudHM9bmV3IFR1LHRoaXMuY29sbGlzaW9uVmVydGV4QXJyYXk9bmV3IHZ1fXVwbG9hZChlKXt0aGlzLmxheW91dFZlcnRleEJ1ZmZlcj1lLmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LHRoaXMubGF5b3V0QXR0cmlidXRlcyksdGhpcy5pbmRleEJ1ZmZlcj1lLmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSksdGhpcy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXI9ZS5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5jb2xsaXNpb25WZXJ0ZXhBcnJheSxNZy5tZW1iZXJzLCEwKX1kZXN0cm95KCl7dGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXImJih0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCksdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCksdGhpcy5zZWdtZW50cy5kZXN0cm95KCksdGhpcy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIuZGVzdHJveSgpKX19O0goYENvbGxpc2lvbkJ1ZmZlcnNgLGJ2KTt2YXIgeHY9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5jb2xsaXNpb25Cb3hBcnJheT1lLmNvbGxpc2lvbkJveEFycmF5LHRoaXMuem9vbT1lLnpvb20sdGhpcy5vdmVyc2NhbGluZz1lLm92ZXJzY2FsaW5nLHRoaXMubGF5ZXJzPWUubGF5ZXJzLHRoaXMubGF5ZXJJZHM9dGhpcy5sYXllcnMubWFwKGU9PmUuaWQpLHRoaXMuaW5kZXg9ZS5pbmRleCx0aGlzLnBpeGVsUmF0aW89ZS5waXhlbFJhdGlvLHRoaXMuc291cmNlTGF5ZXJJbmRleD1lLnNvdXJjZUxheWVySW5kZXgsdGhpcy5oYXNEZXBlbmRlbmNpZXM9ITEsdGhpcy5oYXNSVExUZXh0PSExLHRoaXMuc29ydEtleVJhbmdlcz1bXSx0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5PVtdO2xldCB0PXRoaXMubGF5ZXJzWzBdLl91bmV2YWx1YXRlZExheW91dC5fdmFsdWVzO3RoaXMudGV4dFNpemVEYXRhPXN2KHRoaXMuem9vbSx0W2B0ZXh0LXNpemVgXSksdGhpcy5pY29uU2l6ZURhdGE9c3YodGhpcy56b29tLHRbYGljb24tc2l6ZWBdKTtsZXQgbj10aGlzLmxheWVyc1swXS5sYXlvdXQscj1uLmdldChgc3ltYm9sLXNvcnQta2V5YCksaT1uLmdldChgc3ltYm9sLXotb3JkZXJgKTt0aGlzLmNhbk92ZXJsYXA9bXYobixgdGV4dC1vdmVybGFwYCxgdGV4dC1hbGxvdy1vdmVybGFwYCkhPT1gbmV2ZXJgfHxtdihuLGBpY29uLW92ZXJsYXBgLGBpY29uLWFsbG93LW92ZXJsYXBgKSE9PWBuZXZlcmB8fG4uZ2V0KGB0ZXh0LWlnbm9yZS1wbGFjZW1lbnRgKXx8bi5nZXQoYGljb24taWdub3JlLXBsYWNlbWVudGApLHRoaXMuc29ydEZlYXR1cmVzQnlLZXk9aSE9PWB2aWV3cG9ydC15YCYmIXIuaXNDb25zdGFudCgpO2xldCBhPWk9PT1gdmlld3BvcnQteWB8fGk9PT1gYXV0b2AmJiF0aGlzLnNvcnRGZWF0dXJlc0J5S2V5O3RoaXMuc29ydEZlYXR1cmVzQnlZPWEmJnRoaXMuY2FuT3ZlcmxhcCxuLmdldChgc3ltYm9sLXBsYWNlbWVudGApPT09YHBvaW50YCYmKHRoaXMud3JpdGluZ01vZGVzPW4uZ2V0KGB0ZXh0LXdyaXRpbmctbW9kZWApLm1hcChlPT5NX1tlXSkpLHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcz10aGlzLmxheWVycy5maWx0ZXIoZT0+ZS5pc1N0YXRlRGVwZW5kZW50KCkpLm1hcChlPT5lLmlkKSx0aGlzLnNvdXJjZUlEPWUuc291cmNlSUR9Y3JlYXRlQXJyYXlzKCl7dGhpcy50ZXh0PW5ldyB5dihuZXcgbmQodGhpcy5sYXllcnMsdGhpcy56b29tLGU9PmUuc3RhcnRzV2l0aChgdGV4dGApKSksdGhpcy5pY29uPW5ldyB5dihuZXcgbmQodGhpcy5sYXllcnMsdGhpcy56b29tLGU9PmUuc3RhcnRzV2l0aChgaWNvbmApKSksdGhpcy5nbHlwaE9mZnNldEFycmF5PW5ldyBabCx0aGlzLmxpbmVWZXJ0ZXhBcnJheT1uZXcgUWwsdGhpcy5zeW1ib2xJbnN0YW5jZXM9bmV3IFhsLHRoaXMudGV4dEFuY2hvck9mZnNldHM9bmV3IGV1fWNhbGN1bGF0ZUdseXBoRGVwZW5kZW5jaWVzKGUsdCxuLHIsaSl7bGV0IGE9KHJ8fHRoaXMuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCkmJmksbz1lXy5mcm9tRmVhdHVyZShlLG4pLHM9by5ncmFwaGVtZXMoKTtmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl7bGV0IG49by5nZXRTZWN0aW9uKGUpO2lmKGBpbWFnZU5hbWVgaW4gbiljb250aW51ZTtsZXQgcj10W24uZm9udFN0YWNrXXx8PXt9LGk9c1tlXTtVZyhpKSYmKHJbaV09ITApO2ZvcihsZXQgZSBvZiBpKXtpZihyW2VdPSEwLCFhKWNvbnRpbnVlO2xldCB0PVdnW2VdO3QmJihyW3RdPSEwKX19fXBvcHVsYXRlKGUsdCxuKXtsZXQgcj10aGlzLmxheWVyc1swXSxpPXIubGF5b3V0LGE9aS5nZXQoYHRleHQtZm9udGApLG89aS5nZXQoYHRleHQtZmllbGRgKSxzPWkuZ2V0KGBpY29uLWltYWdlYCksYz0oby52YWx1ZS5raW5kIT09YGNvbnN0YW50YHx8by52YWx1ZS52YWx1ZSBpbnN0YW5jZW9mIFByJiYhby52YWx1ZS52YWx1ZS5pc0VtcHR5KCl8fG8udmFsdWUudmFsdWUudG9TdHJpbmcoKS5sZW5ndGg+MCkmJihhLnZhbHVlLmtpbmQhPT1gY29uc3RhbnRgfHxhLnZhbHVlLnZhbHVlLmxlbmd0aD4wKSxsPXMudmFsdWUua2luZCE9PWBjb25zdGFudGB8fCEhcy52YWx1ZS52YWx1ZXx8T2JqZWN0LmtleXMocy5wYXJhbWV0ZXJzKS5sZW5ndGg+MCx1PWkuZ2V0KGBzeW1ib2wtc29ydC1rZXlgKTtpZih0aGlzLmZlYXR1cmVzPVtdLCFjJiYhbClyZXR1cm47bGV0IGQ9dC5pY29uRGVwZW5kZW5jaWVzLGY9dC5nbHlwaERlcGVuZGVuY2llcyxwPXQuYXZhaWxhYmxlSW1hZ2VzLG09bmV3IFUodGhpcy56b29tKTtmb3IobGV0e2ZlYXR1cmU6dCxpZDpvLGluZGV4OnMsc291cmNlTGF5ZXJJbmRleDpofW9mIGUpe2xldCBlPXIuX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5LGc9bGQodCxlKTtpZighci5fZmVhdHVyZUZpbHRlci5maWx0ZXIobSxnLG4pKWNvbnRpbnVlO2V8fChnLmdlb21ldHJ5PWNkKHQpKTtsZXQgXztpZihjKXtsZXQgZT1yLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucyhgdGV4dC1maWVsZGAsZyxuLHApLHQ9UHIuZmFjdG9yeShlKTt0aGlzLmhhc1JUTFRleHR8fD12dih0KSwoIXRoaXMuaGFzUlRMVGV4dHx8S2MuZ2V0UlRMVGV4dFBsdWdpblN0YXR1cygpPT09YHVuYXZhaWxhYmxlYHx8dGhpcy5oYXNSVExUZXh0JiZLYy5pc1BhcnNlZCgpKSYmKF89SWcodCxyLGcpKX1sZXQgdjtpZihsKXtsZXQgZT1yLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucyhgaWNvbi1pbWFnZWAsZyxuLHApO3Y9ZSBpbnN0YW5jZW9mIEJyP2U6QnIuZnJvbVN0cmluZyhlKX1pZighXyYmIXYpY29udGludWU7bGV0IHk9dGhpcy5zb3J0RmVhdHVyZXNCeUtleT91LmV2YWx1YXRlKGcse30sbik6dm9pZCAwLGI9e2lkOm8sdGV4dDpfLGljb246dixpbmRleDpzLHNvdXJjZUxheWVySW5kZXg6aCxnZW9tZXRyeTpnLmdlb21ldHJ5LHByb3BlcnRpZXM6dC5wcm9wZXJ0aWVzLHR5cGU6SnAudHlwZXNbdC50eXBlXSxzb3J0S2V5Onl9O2lmKHRoaXMuZmVhdHVyZXMucHVzaChiKSx2JiYoZFt2Lm5hbWVdPSEwKSxfKXtsZXQgZT1hLmV2YWx1YXRlKGcse30sbikuam9pbihgLGApLHQ9aS5nZXQoYHRleHQtcm90YXRpb24tYWxpZ25tZW50YCkhPT1gdmlld3BvcnRgJiZpLmdldChgc3ltYm9sLXBsYWNlbWVudGApIT09YHBvaW50YDt0aGlzLmFsbG93VmVydGljYWxQbGFjZW1lbnQ9dGhpcy53cml0aW5nTW9kZXM/LmluY2x1ZGVzKDIpO2xldCByPVBjKF8udG9TdHJpbmcoKSk7dGhpcy5jYWxjdWxhdGVHbHlwaERlcGVuZGVuY2llcyhfLGYsZSx0LHIpO2ZvcihsZXQgZSBvZiBfLnNlY3Rpb25zKWUuaW1hZ2UmJihkW2UuaW1hZ2UubmFtZV09ITApfX1pLmdldChgc3ltYm9sLXBsYWNlbWVudGApPT09YGxpbmVgJiYodGhpcy5mZWF0dXJlcz1MZyh0aGlzLmZlYXR1cmVzKSksdGhpcy5zb3J0RmVhdHVyZXNCeUtleSYmdGhpcy5mZWF0dXJlcy5zb3J0KChlLHQpPT5lLnNvcnRLZXktdC5zb3J0S2V5KX11cGRhdGUoZSx0LG4pe3RoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoJiYodGhpcy50ZXh0LnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyhlLHQsdGhpcy5sYXllcnMse2ltYWdlUG9zaXRpb25zOm59KSx0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKGUsdCx0aGlzLmxheWVycyx7aW1hZ2VQb3NpdGlvbnM6bn0pKX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aD09PTAmJiF0aGlzLmhhc1JUTFRleHR9dXBsb2FkUGVuZGluZygpe3JldHVybiF0aGlzLnVwbG9hZGVkfHx0aGlzLnRleHQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkfHx0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkfXVwbG9hZChlKXshdGhpcy51cGxvYWRlZCYmdGhpcy5oYXNEZWJ1Z0RhdGEoKSYmKHRoaXMudGV4dENvbGxpc2lvbkJveC51cGxvYWQoZSksdGhpcy5pY29uQ29sbGlzaW9uQm94LnVwbG9hZChlKSksdGhpcy50ZXh0LnVwbG9hZChlLHRoaXMuc29ydEZlYXR1cmVzQnlZLCF0aGlzLnVwbG9hZGVkLHRoaXMudGV4dC5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQpLHRoaXMuaWNvbi51cGxvYWQoZSx0aGlzLnNvcnRGZWF0dXJlc0J5WSwhdGhpcy51cGxvYWRlZCx0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkKSx0aGlzLnVwbG9hZGVkPSEwfWRlc3Ryb3lEZWJ1Z0RhdGEoKXt0aGlzLnRleHRDb2xsaXNpb25Cb3guZGVzdHJveSgpLHRoaXMuaWNvbkNvbGxpc2lvbkJveC5kZXN0cm95KCl9ZGVzdHJveSgpe3RoaXMudGV4dC5kZXN0cm95KCksdGhpcy5pY29uLmRlc3Ryb3koKSx0aGlzLmhhc0RlYnVnRGF0YSgpJiZ0aGlzLmRlc3Ryb3lEZWJ1Z0RhdGEoKX1hZGRUb0xpbmVWZXJ0ZXhBcnJheShlLHQpe2xldCBuPXRoaXMubGluZVZlcnRleEFycmF5Lmxlbmd0aDtpZihlLnNlZ21lbnQhPT12b2lkIDApe2xldCBuPWUuZGlzdCh0W2Uuc2VnbWVudCsxXSkscj1lLmRpc3QodFtlLnNlZ21lbnRdKSxpPXt9O2ZvcihsZXQgcj1lLnNlZ21lbnQrMTtyPHQubGVuZ3RoO3IrKylpW3JdPXt4OnRbcl0ueCx5OnRbcl0ueSx0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcjpufSxyPHQubGVuZ3RoLTEmJihuKz10W3IrMV0uZGlzdCh0W3JdKSk7Zm9yKGxldCBuPWUuc2VnbWVudHx8MDtuPj0wO24tLSlpW25dPXt4OnRbbl0ueCx5OnRbbl0ueSx0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcjpyfSxuPjAmJihyKz10W24tMV0uZGlzdCh0W25dKSk7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2xldCB0PWlbZV07dGhpcy5saW5lVmVydGV4QXJyYXkuZW1wbGFjZUJhY2sodC54LHQueSx0LnRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yKX19cmV0dXJue2xpbmVTdGFydEluZGV4Om4sbGluZUxlbmd0aDp0aGlzLmxpbmVWZXJ0ZXhBcnJheS5sZW5ndGgtbn19YWRkU3ltYm9scyhlLHQsbixyLGksYSxvLHMsYyxsLHUsZCxmKXtsZXQgcD1lLmluZGV4QXJyYXksbT1lLmxheW91dFZlcnRleEFycmF5LGg9ZS5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0KnQubGVuZ3RoLG0scCx0aGlzLmNhbk92ZXJsYXA/YS5zb3J0S2V5OnZvaWQgMCksZz10aGlzLmdseXBoT2Zmc2V0QXJyYXkubGVuZ3RoLF89aC52ZXJ0ZXhMZW5ndGgsdj10aGlzLmFsbG93VmVydGljYWxQbGFjZW1lbnQmJm89PT0yP01hdGguUEkvMjowLHk9YS50ZXh0JiZhLnRleHQuc2VjdGlvbnM7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2xldHt0bDppLHRyOm8sYmw6YyxicjpsLHRleDp1LHBpeGVsT2Zmc2V0VEw6ZyxwaXhlbE9mZnNldEJSOl8sbWluRm9udFNjYWxlWDpiLG1pbkZvbnRTY2FsZVk6eCxnbHlwaE9mZnNldDpTLGlzU0RGOkMsc2VjdGlvbkluZGV4Ond9PXRbcl0sVD1oLnZlcnRleExlbmd0aCxFPVNbMV07Z3YobSxzLngscy55LGkueCxFK2kueSx1LngsdS55LG4sQyxnLngsZy55LGIseCxmKSxndihtLHMueCxzLnksby54LEUrby55LHUueCt1LncsdS55LG4sQyxfLngsZy55LGIseCxmKSxndihtLHMueCxzLnksYy54LEUrYy55LHUueCx1LnkrdS5oLG4sQyxnLngsXy55LGIseCxmKSxndihtLHMueCxzLnksbC54LEUrbC55LHUueCt1LncsdS55K3UuaCxuLEMsXy54LF8ueSxiLHgsZiksX3YoZS5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkscyx2KSxwLmVtcGxhY2VCYWNrKFQsVCsyLFQrMSkscC5lbXBsYWNlQmFjayhUKzEsVCsyLFQrMyksaC52ZXJ0ZXhMZW5ndGgrPTQsaC5wcmltaXRpdmVMZW5ndGgrPTIsdGhpcy5nbHlwaE9mZnNldEFycmF5LmVtcGxhY2VCYWNrKFNbMF0pLChyPT09dC5sZW5ndGgtMXx8dyE9PXRbcisxXS5zZWN0aW9uSW5kZXgpJiZlLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKG0ubGVuZ3RoLGEsYS5pbmRleCx7aW1hZ2VQb3NpdGlvbnM6e30sY2Fub25pY2FsOmQsZm9ybWF0dGVkU2VjdGlvbjp5Py5bd119KX1lLnBsYWNlZFN5bWJvbEFycmF5LmVtcGxhY2VCYWNrKHMueCxzLnksZyx0aGlzLmdseXBoT2Zmc2V0QXJyYXkubGVuZ3RoLWcsXyxjLGwscy5zZWdtZW50LG4/blswXTowLG4/blsxXTowLHJbMF0sclsxXSxvLDAsITEsMCx1LGYpfV9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleChlLHQsbixyLGksYSl7cmV0dXJuIHQuZW1wbGFjZUJhY2soMCwwKSxlLmVtcGxhY2VCYWNrKG4ueCxuLnkscixpLE1hdGgucm91bmQoYS54KSxNYXRoLnJvdW5kKGEueSkpfWFkZENvbGxpc2lvbkRlYnVnVmVydGljZXMoZSx0LG4scixpLGEsbyl7bGV0IHM9aS5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LGkubGF5b3V0VmVydGV4QXJyYXksaS5pbmRleEFycmF5KSxjPXMudmVydGV4TGVuZ3RoLHU9aS5sYXlvdXRWZXJ0ZXhBcnJheSxkPWkuY29sbGlzaW9uVmVydGV4QXJyYXksZj1vLmFuY2hvclgscD1vLmFuY2hvclk7dGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgodSxkLGEsZixwLG5ldyBsKGUsdCkpLHRoaXMuX2FkZENvbGxpc2lvbkRlYnVnVmVydGV4KHUsZCxhLGYscCxuZXcgbChuLHQpKSx0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleCh1LGQsYSxmLHAsbmV3IGwobixyKSksdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgodSxkLGEsZixwLG5ldyBsKGUscikpLHMudmVydGV4TGVuZ3RoKz00O2xldCBtPWkuaW5kZXhBcnJheTttLmVtcGxhY2VCYWNrKGMsYysxKSxtLmVtcGxhY2VCYWNrKGMrMSxjKzIpLG0uZW1wbGFjZUJhY2soYysyLGMrMyksbS5lbXBsYWNlQmFjayhjKzMsYykscy5wcmltaXRpdmVMZW5ndGgrPTR9YWRkRGVidWdDb2xsaXNpb25Cb3hlcyhlLHQsbixyKXtmb3IobGV0IGk9ZTtpPHQ7aSsrKXtsZXQgZT10aGlzLmNvbGxpc2lvbkJveEFycmF5LmdldChpKSx0PWUueDEsYT1lLnkxLG89ZS54MixzPWUueTI7dGhpcy5hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRpY2VzKHQsYSxvLHMscj90aGlzLnRleHRDb2xsaXNpb25Cb3g6dGhpcy5pY29uQ29sbGlzaW9uQm94LGUuYW5jaG9yUG9pbnQsbil9fWdlbmVyYXRlQ29sbGlzaW9uRGVidWdCdWZmZXJzKCl7dGhpcy5oYXNEZWJ1Z0RhdGEoKSYmdGhpcy5kZXN0cm95RGVidWdEYXRhKCksdGhpcy50ZXh0Q29sbGlzaW9uQm94PW5ldyBidihndSxOZy5tZW1iZXJzLHh1KSx0aGlzLmljb25Db2xsaXNpb25Cb3g9bmV3IGJ2KGd1LE5nLm1lbWJlcnMseHUpO2ZvcihsZXQgZT0wO2U8dGhpcy5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoO2UrKyl7bGV0IHQ9dGhpcy5zeW1ib2xJbnN0YW5jZXMuZ2V0KGUpO3RoaXMuYWRkRGVidWdDb2xsaXNpb25Cb3hlcyh0LnRleHRCb3hTdGFydEluZGV4LHQudGV4dEJveEVuZEluZGV4LHQsITApLHRoaXMuYWRkRGVidWdDb2xsaXNpb25Cb3hlcyh0LnZlcnRpY2FsVGV4dEJveFN0YXJ0SW5kZXgsdC52ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCx0LCEwKSx0aGlzLmFkZERlYnVnQ29sbGlzaW9uQm94ZXModC5pY29uQm94U3RhcnRJbmRleCx0Lmljb25Cb3hFbmRJbmRleCx0LCExKSx0aGlzLmFkZERlYnVnQ29sbGlzaW9uQm94ZXModC52ZXJ0aWNhbEljb25Cb3hTdGFydEluZGV4LHQudmVydGljYWxJY29uQm94RW5kSW5kZXgsdCwhMSl9fV9kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzRm9yU3ltYm9sKGUsdCxuLHIsaSxhLG8scyxjKXtsZXQgbD17fTtmb3IobGV0IHI9dDtyPG47cisrKXtsZXQgdD1lLmdldChyKTtsLnRleHRCb3g9e3gxOnQueDEseTE6dC55MSx4Mjp0LngyLHkyOnQueTIsYW5jaG9yUG9pbnRYOnQuYW5jaG9yUG9pbnRYLGFuY2hvclBvaW50WTp0LmFuY2hvclBvaW50WX0sbC50ZXh0RmVhdHVyZUluZGV4PXQuZmVhdHVyZUluZGV4O2JyZWFrfWZvcihsZXQgdD1yO3Q8aTt0Kyspe2xldCBuPWUuZ2V0KHQpO2wudmVydGljYWxUZXh0Qm94PXt4MTpuLngxLHkxOm4ueTEseDI6bi54Mix5MjpuLnkyLGFuY2hvclBvaW50WDpuLmFuY2hvclBvaW50WCxhbmNob3JQb2ludFk6bi5hbmNob3JQb2ludFl9LGwudmVydGljYWxUZXh0RmVhdHVyZUluZGV4PW4uZmVhdHVyZUluZGV4O2JyZWFrfWZvcihsZXQgdD1hO3Q8bzt0Kyspe2xldCBuPWUuZ2V0KHQpO2wuaWNvbkJveD17eDE6bi54MSx5MTpuLnkxLHgyOm4ueDIseTI6bi55MixhbmNob3JQb2ludFg6bi5hbmNob3JQb2ludFgsYW5jaG9yUG9pbnRZOm4uYW5jaG9yUG9pbnRZfSxsLmljb25GZWF0dXJlSW5kZXg9bi5mZWF0dXJlSW5kZXg7YnJlYWt9Zm9yKGxldCB0PXM7dDxjO3QrKyl7bGV0IG49ZS5nZXQodCk7bC52ZXJ0aWNhbEljb25Cb3g9e3gxOm4ueDEseTE6bi55MSx4MjpuLngyLHkyOm4ueTIsYW5jaG9yUG9pbnRYOm4uYW5jaG9yUG9pbnRYLGFuY2hvclBvaW50WTpuLmFuY2hvclBvaW50WX0sbC52ZXJ0aWNhbEljb25GZWF0dXJlSW5kZXg9bi5mZWF0dXJlSW5kZXg7YnJlYWt9cmV0dXJuIGx9ZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlcyhlKXt0aGlzLmNvbGxpc2lvbkFycmF5cz1bXTtmb3IobGV0IHQ9MDt0PHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDt0Kyspe2xldCBuPXRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldCh0KTt0aGlzLmNvbGxpc2lvbkFycmF5cy5wdXNoKHRoaXMuX2Rlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXNGb3JTeW1ib2woZSxuLnRleHRCb3hTdGFydEluZGV4LG4udGV4dEJveEVuZEluZGV4LG4udmVydGljYWxUZXh0Qm94U3RhcnRJbmRleCxuLnZlcnRpY2FsVGV4dEJveEVuZEluZGV4LG4uaWNvbkJveFN0YXJ0SW5kZXgsbi5pY29uQm94RW5kSW5kZXgsbi52ZXJ0aWNhbEljb25Cb3hTdGFydEluZGV4LG4udmVydGljYWxJY29uQm94RW5kSW5kZXgpKX19aGFzVGV4dERhdGEoKXtyZXR1cm4gdGhpcy50ZXh0LnNlZ21lbnRzLmdldCgpLmxlbmd0aD4wfWhhc0ljb25EYXRhKCl7cmV0dXJuIHRoaXMuaWNvbi5zZWdtZW50cy5nZXQoKS5sZW5ndGg+MH1oYXNEZWJ1Z0RhdGEoKXtyZXR1cm4gdGhpcy50ZXh0Q29sbGlzaW9uQm94JiZ0aGlzLmljb25Db2xsaXNpb25Cb3h9aGFzVGV4dENvbGxpc2lvbkJveERhdGEoKXtyZXR1cm4gdGhpcy5oYXNEZWJ1Z0RhdGEoKSYmdGhpcy50ZXh0Q29sbGlzaW9uQm94LnNlZ21lbnRzLmdldCgpLmxlbmd0aD4wfWhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCl7cmV0dXJuIHRoaXMuaGFzRGVidWdEYXRhKCkmJnRoaXMuaWNvbkNvbGxpc2lvbkJveC5zZWdtZW50cy5nZXQoKS5sZW5ndGg+MH1hZGRJbmRpY2VzRm9yUGxhY2VkU3ltYm9sKGUsdCl7bGV0IG49ZS5wbGFjZWRTeW1ib2xBcnJheS5nZXQodCkscj1uLnZlcnRleFN0YXJ0SW5kZXgrbi5udW1HbHlwaHMqNDtmb3IobGV0IHQ9bi52ZXJ0ZXhTdGFydEluZGV4O3Q8cjt0Kz00KWUuaW5kZXhBcnJheS5lbXBsYWNlQmFjayh0LHQrMix0KzEpLGUuaW5kZXhBcnJheS5lbXBsYWNlQmFjayh0KzEsdCsyLHQrMyl9Z2V0U29ydGVkU3ltYm9sSW5kZXhlcyhlKXtpZih0aGlzLnNvcnRlZEFuZ2xlPT09ZSYmdGhpcy5zeW1ib2xJbnN0YW5jZUluZGV4ZXMhPT12b2lkIDApcmV0dXJuIHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzO2xldCB0PU1hdGguc2luKGUpLG49TWF0aC5jb3MoZSkscj1bXSxpPVtdLGE9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7KytlKXthLnB1c2goZSk7bGV0IG89dGhpcy5zeW1ib2xJbnN0YW5jZXMuZ2V0KGUpO3IucHVzaChNYXRoLnJvdW5kKHQqby5hbmNob3JYK24qby5hbmNob3JZKXwwKSxpLnB1c2goby5mZWF0dXJlSW5kZXgpfXJldHVybiBhLnNvcnQoKGUsdCk9PnJbZV0tclt0XXx8aVt0XS1pW2VdKSxhfWFkZFRvU29ydEtleVJhbmdlcyhlLHQpe2xldCBuPXRoaXMuc29ydEtleVJhbmdlc1t0aGlzLnNvcnRLZXlSYW5nZXMubGVuZ3RoLTFdO24/LnNvcnRLZXk9PT10P24uc3ltYm9sSW5zdGFuY2VFbmQ9ZSsxOnRoaXMuc29ydEtleVJhbmdlcy5wdXNoKHtzb3J0S2V5OnQsc3ltYm9sSW5zdGFuY2VTdGFydDplLHN5bWJvbEluc3RhbmNlRW5kOmUrMX0pfXNvcnRGZWF0dXJlcyhlKXtpZih0aGlzLnNvcnRGZWF0dXJlc0J5WSYmdGhpcy5zb3J0ZWRBbmdsZSE9PWUmJiEodGhpcy50ZXh0LnNlZ21lbnRzLmdldCgpLmxlbmd0aD4xfHx0aGlzLmljb24uc2VnbWVudHMuZ2V0KCkubGVuZ3RoPjEpKXt0aGlzLnN5bWJvbEluc3RhbmNlSW5kZXhlcz10aGlzLmdldFNvcnRlZFN5bWJvbEluZGV4ZXMoZSksdGhpcy5zb3J0ZWRBbmdsZT1lLHRoaXMudGV4dC5pbmRleEFycmF5LmNsZWFyKCksdGhpcy5pY29uLmluZGV4QXJyYXkuY2xlYXIoKSx0aGlzLmZlYXR1cmVTb3J0T3JkZXI9W107Zm9yKGxldCBlIG9mIHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzKXtsZXQgdD10aGlzLnN5bWJvbEluc3RhbmNlcy5nZXQoZSk7dGhpcy5mZWF0dXJlU29ydE9yZGVyLnB1c2godC5mZWF0dXJlSW5kZXgpO2xldCBuPVt0LnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LHQuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LHQubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleF07Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspe2xldCB0PW5bZV07dD49MCYmbi5pbmRleE9mKHQpPT09ZSYmdGhpcy5hZGRJbmRpY2VzRm9yUGxhY2VkU3ltYm9sKHRoaXMudGV4dCx0KX10LnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4Pj0wJiZ0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy50ZXh0LHQudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpLHQucGxhY2VkSWNvblN5bWJvbEluZGV4Pj0wJiZ0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy5pY29uLHQucGxhY2VkSWNvblN5bWJvbEluZGV4KSx0LnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4Pj0wJiZ0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy5pY29uLHQudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXgpfXRoaXMudGV4dC5pbmRleEJ1ZmZlciYmdGhpcy50ZXh0LmluZGV4QnVmZmVyLnVwZGF0ZURhdGEodGhpcy50ZXh0LmluZGV4QXJyYXkpLHRoaXMuaWNvbi5pbmRleEJ1ZmZlciYmdGhpcy5pY29uLmluZGV4QnVmZmVyLnVwZGF0ZURhdGEodGhpcy5pY29uLmluZGV4QXJyYXkpfX19O0goYFN5bWJvbEJ1Y2tldGAseHYse29taXQ6W2BsYXllcnNgLGBjb2xsaXNpb25Cb3hBcnJheWAsYGZlYXR1cmVzYCxgY29tcGFyZVRleHRgXX0pLHh2Lk1BWF9HTFlQSFM9NjU1MzUseHYuYWRkRHluYW1pY0F0dHJpYnV0ZXM9X3Y7ZnVuY3Rpb24gU3YoZSx0KXtyZXR1cm4gdC5yZXBsYWNlKC97KFtee31dKyl9L2csKHQsbik9PmUmJm4gaW4gZT9TdHJpbmcoZVtuXSk6YGApfWxldCBDdjtjb25zdCB3dj0oKT0+Q3Z8fD1uZXcgY2woeyJzeW1ib2wtcGxhY2VtZW50IjpuZXcgVyhNLmxheW91dF9zeW1ib2xbYHN5bWJvbC1wbGFjZW1lbnRgXSxgc3ltYm9sLXBsYWNlbWVudGApLCJzeW1ib2wtc3BhY2luZyI6bmV3IFcoTS5sYXlvdXRfc3ltYm9sW2BzeW1ib2wtc3BhY2luZ2BdLGBzeW1ib2wtc3BhY2luZ2ApLCJzeW1ib2wtYXZvaWQtZWRnZXMiOm5ldyBXKE0ubGF5b3V0X3N5bWJvbFtgc3ltYm9sLWF2b2lkLWVkZ2VzYF0sYHN5bWJvbC1hdm9pZC1lZGdlc2ApLCJzeW1ib2wtc29ydC1rZXkiOm5ldyBHKE0ubGF5b3V0X3N5bWJvbFtgc3ltYm9sLXNvcnQta2V5YF0sYHN5bWJvbC1zb3J0LWtleWApLCJzeW1ib2wtei1vcmRlciI6bmV3IFcoTS5sYXlvdXRfc3ltYm9sW2BzeW1ib2wtei1vcmRlcmBdLGBzeW1ib2wtei1vcmRlcmApLCJpY29uLWFsbG93LW92ZXJsYXAiOm5ldyBXKE0ubGF5b3V0X3N5bWJvbFtgaWNvbi1hbGxvdy1vdmVybGFwYF0sYGljb24tYWxsb3ctb3ZlcmxhcGApLCJpY29uLW92ZXJsYXAiOm5ldyBXKE0ubGF5b3V0X3N5bWJvbFtgaWNvbi1vdmVybGFwYF0sYGljb24tb3ZlcmxhcGApLCJpY29uLWlnbm9yZS1wbGFjZW1lbnQiOm5ldyBXKE0ubGF5b3V0X3N5bWJvbFtgaWNvbi1pZ25vcmUtcGxhY2VtZW50YF0sYGljb24taWdub3JlLXBsYWNlbWVudGApLCJpY29uLW9wdGlvbmFsIjpuZXcgVyhNLmxheW91dF9zeW1ib2xbYGljb24tb3B0aW9uYWxgXSxgaWNvbi1vcHRpb25hbGApLCJpY29uLXJvdGF0aW9uLWFsaWdubWVudCI6bmV3IEcoTS5sYXlvdXRfc3ltYm9sW2BpY29uLXJvdGF0aW9uLWFsaWdubWVudGBdLGBpY29uLXJvdGF0aW9uLWFsaWdubWVudGApLCJpY29uLXNpemUiOm5ldyBHKE0ubGF5b3V0X3N5bWJvbFtgaWNvbi1zaXplYF0sYGljb24tc2l6ZWApLCJpY29uLXRleHQtZml0IjpuZXcgVyhNLmxheW91dF9zeW1ib2xbYGljb24tdGV4dC1maXRgXSxgaWNvbi10ZXh0LWZpdGApLCJpY29uLXRleHQtZml0LXBhZGRpbmciOm5ldyBXKE0ubGF5b3V0X3N5bWJvbFtgaWNvbi10ZXh0LWZpdC1wYWRkaW5nYF0sYGljb24tdGV4dC1maXQtcGFkZGluZ2ApLCJpY29uLWltYWdlIjpuZXcgRyhNLmxheW91dF9zeW1ib2xbYGljb24taW1hZ2VgXSxgaWNvbi1pbWFnZWApLCJpY29uLXJvdGF0ZSI6bmV3IEcoTS5sYXlvdXRfc3ltYm9sW2BpY29uLXJvdGF0ZWBdLGBpY29uLXJvdGF0ZWApLCJpY29uLXBhZGRpbmciOm5ldyBHKE0ubGF5b3V0X3N5bWJvbFtgaWNvbi1wYWRkaW5nYF0sYGljb24tcGFkZGluZ2ApLCJpY29uLWtlZXAtdXByaWdodCI6bmV3IFcoTS5sYXlvdXRfc3ltYm9sW2BpY29uLWtlZXAtdXByaWdodGBdLGBpY29uLWtlZXAtdXByaWdodGApLCJpY29uLW9mZnNldCI6bmV3IEcoTS5sYXlvdXRfc3ltYm9sW2BpY29uLW9mZnNldGBdLGBpY29uLW9mZnNldGApLCJpY29uLWFuY2hvciI6bmV3IEcoTS5sYXlvdXRfc3ltYm9sW2BpY29uLWFuY2hvcmBdLGBpY29uLWFuY2hvcmApLCJpY29uLXBpdGNoLWFsaWdubWVudCI6bmV3IFcoTS5sYXlvdXRfc3ltYm9sW2BpY29uLXBpdGNoLWFsaWdubWVudGBdLGBpY29uLXBpdGNoLWFsaWdubWVudGApLCJ0ZXh0LXBpdGNoLWFsaWdubWVudCI6bmV3IFcoTS5sYXlvdXRfc3ltYm9sW2B0ZXh0LXBpdGNoLWFsaWdubWVudGBdLGB0ZXh0LXBpdGNoLWFsaWdubWVudGApLCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCI6bmV3IFcoTS5sYXlvdXRfc3ltYm9sW2B0ZXh0LXJvdGF0aW9uLWFsaWdubWVudGBdLGB0ZXh0LXJvdGF0aW9uLWFsaWdubWVudGApLCJ0ZXh0LWZpZWxkIjpuZXcgRyhNLmxheW91dF9zeW1ib2xbYHRleHQtZmllbGRgXSxgdGV4dC1maWVsZGApLCJ0ZXh0LWZvbnQiOm5ldyBHKE0ubGF5b3V0X3N5bWJvbFtgdGV4dC1mb250YF0sYHRleHQtZm9udGApLCJ0ZXh0LXNpemUiOm5ldyBHKE0ubGF5b3V0X3N5bWJvbFtgdGV4dC1zaXplYF0sYHRleHQtc2l6ZWApLCJ0ZXh0LW1heC13aWR0aCI6bmV3IEcoTS5sYXlvdXRfc3ltYm9sW2B0ZXh0LW1heC13aWR0aGBdLGB0ZXh0LW1heC13aWR0aGApLCJ0ZXh0LWxpbmUtaGVpZ2h0IjpuZXcgVyhNLmxheW91dF9zeW1ib2xbYHRleHQtbGluZS1oZWlnaHRgXSxgdGV4dC1saW5lLWhlaWdodGApLCJ0ZXh0LWxldHRlci1zcGFjaW5nIjpuZXcgRyhNLmxheW91dF9zeW1ib2xbYHRleHQtbGV0dGVyLXNwYWNpbmdgXSxgdGV4dC1sZXR0ZXItc3BhY2luZ2ApLCJ0ZXh0LWp1c3RpZnkiOm5ldyBHKE0ubGF5b3V0X3N5bWJvbFtgdGV4dC1qdXN0aWZ5YF0sYHRleHQtanVzdGlmeWApLCJ0ZXh0LXJhZGlhbC1vZmZzZXQiOm5ldyBHKE0ubGF5b3V0X3N5bWJvbFtgdGV4dC1yYWRpYWwtb2Zmc2V0YF0sYHRleHQtcmFkaWFsLW9mZnNldGApLCJ0ZXh0LXZhcmlhYmxlLWFuY2hvciI6bmV3IFcoTS5sYXlvdXRfc3ltYm9sW2B0ZXh0LXZhcmlhYmxlLWFuY2hvcmBdLGB0ZXh0LXZhcmlhYmxlLWFuY2hvcmApLCJ0ZXh0LXZhcmlhYmxlLWFuY2hvci1vZmZzZXQiOm5ldyBHKE0ubGF5b3V0X3N5bWJvbFtgdGV4dC12YXJpYWJsZS1hbmNob3Itb2Zmc2V0YF0sYHRleHQtdmFyaWFibGUtYW5jaG9yLW9mZnNldGApLCJ0ZXh0LWFuY2hvciI6bmV3IEcoTS5sYXlvdXRfc3ltYm9sW2B0ZXh0LWFuY2hvcmBdLGB0ZXh0LWFuY2hvcmApLCJ0ZXh0LW1heC1hbmdsZSI6bmV3IFcoTS5sYXlvdXRfc3ltYm9sW2B0ZXh0LW1heC1hbmdsZWBdLGB0ZXh0LW1heC1hbmdsZWApLCJ0ZXh0LXdyaXRpbmctbW9kZSI6bmV3IFcoTS5sYXlvdXRfc3ltYm9sW2B0ZXh0LXdyaXRpbmctbW9kZWBdLGB0ZXh0LXdyaXRpbmctbW9kZWApLCJ0ZXh0LXJvdGF0ZSI6bmV3IEcoTS5sYXlvdXRfc3ltYm9sW2B0ZXh0LXJvdGF0ZWBdLGB0ZXh0LXJvdGF0ZWApLCJ0ZXh0LXBhZGRpbmciOm5ldyBXKE0ubGF5b3V0X3N5bWJvbFtgdGV4dC1wYWRkaW5nYF0sYHRleHQtcGFkZGluZ2ApLCJ0ZXh0LWtlZXAtdXByaWdodCI6bmV3IFcoTS5sYXlvdXRfc3ltYm9sW2B0ZXh0LWtlZXAtdXByaWdodGBdLGB0ZXh0LWtlZXAtdXByaWdodGApLCJ0ZXh0LXRyYW5zZm9ybSI6bmV3IEcoTS5sYXlvdXRfc3ltYm9sW2B0ZXh0LXRyYW5zZm9ybWBdLGB0ZXh0LXRyYW5zZm9ybWApLCJ0ZXh0LW9mZnNldCI6bmV3IEcoTS5sYXlvdXRfc3ltYm9sW2B0ZXh0LW9mZnNldGBdLGB0ZXh0LW9mZnNldGApLCJ0ZXh0LWFsbG93LW92ZXJsYXAiOm5ldyBXKE0ubGF5b3V0X3N5bWJvbFtgdGV4dC1hbGxvdy1vdmVybGFwYF0sYHRleHQtYWxsb3ctb3ZlcmxhcGApLCJ0ZXh0LW92ZXJsYXAiOm5ldyBXKE0ubGF5b3V0X3N5bWJvbFtgdGV4dC1vdmVybGFwYF0sYHRleHQtb3ZlcmxhcGApLCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnQiOm5ldyBXKE0ubGF5b3V0X3N5bWJvbFtgdGV4dC1pZ25vcmUtcGxhY2VtZW50YF0sYHRleHQtaWdub3JlLXBsYWNlbWVudGApLCJ0ZXh0LW9wdGlvbmFsIjpuZXcgVyhNLmxheW91dF9zeW1ib2xbYHRleHQtb3B0aW9uYWxgXSxgdGV4dC1vcHRpb25hbGApLCJzeW1ib2wtaGVpZ2h0LW9mZnNldCI6bmV3IEcoTS5sYXlvdXRfc3ltYm9sW2BzeW1ib2wtaGVpZ2h0LW9mZnNldGBdLGBzeW1ib2wtaGVpZ2h0LW9mZnNldGApLCJzeW1ib2wtaGVpZ2h0LWFuY2hvciI6bmV3IFcoTS5sYXlvdXRfc3ltYm9sW2BzeW1ib2wtaGVpZ2h0LWFuY2hvcmBdLGBzeW1ib2wtaGVpZ2h0LWFuY2hvcmApfSk7bGV0IFR2O2NvbnN0IEV2PSgpPT5Udnx8PW5ldyBjbCh7Imljb24tb3BhY2l0eSI6bmV3IEcoTS5wYWludF9zeW1ib2xbYGljb24tb3BhY2l0eWBdLGBpY29uLW9wYWNpdHlgKSwiaWNvbi1jb2xvciI6bmV3IEcoTS5wYWludF9zeW1ib2xbYGljb24tY29sb3JgXSxgaWNvbi1jb2xvcmApLCJpY29uLWhhbG8tY29sb3IiOm5ldyBHKE0ucGFpbnRfc3ltYm9sW2BpY29uLWhhbG8tY29sb3JgXSxgaWNvbi1oYWxvLWNvbG9yYCksImljb24taGFsby13aWR0aCI6bmV3IEcoTS5wYWludF9zeW1ib2xbYGljb24taGFsby13aWR0aGBdLGBpY29uLWhhbG8td2lkdGhgKSwiaWNvbi1oYWxvLWJsdXIiOm5ldyBHKE0ucGFpbnRfc3ltYm9sW2BpY29uLWhhbG8tYmx1cmBdLGBpY29uLWhhbG8tYmx1cmApLCJpY29uLXRyYW5zbGF0ZSI6bmV3IFcoTS5wYWludF9zeW1ib2xbYGljb24tdHJhbnNsYXRlYF0sYGljb24tdHJhbnNsYXRlYCksImljb24tdHJhbnNsYXRlLWFuY2hvciI6bmV3IFcoTS5wYWludF9zeW1ib2xbYGljb24tdHJhbnNsYXRlLWFuY2hvcmBdLGBpY29uLXRyYW5zbGF0ZS1hbmNob3JgKSwidGV4dC1vcGFjaXR5IjpuZXcgRyhNLnBhaW50X3N5bWJvbFtgdGV4dC1vcGFjaXR5YF0sYHRleHQtb3BhY2l0eWApLCJ0ZXh0LWNvbG9yIjpuZXcgRyhNLnBhaW50X3N5bWJvbFtgdGV4dC1jb2xvcmBdLGB0ZXh0LWNvbG9yYCx7cnVudGltZVR5cGU6Vm4sZ2V0T3ZlcnJpZGU6ZT0+ZS50ZXh0Q29sb3IsaGFzT3ZlcnJpZGU6ZT0+ISFlLnRleHRDb2xvcn0pLCJ0ZXh0LWhhbG8tY29sb3IiOm5ldyBHKE0ucGFpbnRfc3ltYm9sW2B0ZXh0LWhhbG8tY29sb3JgXSxgdGV4dC1oYWxvLWNvbG9yYCksInRleHQtaGFsby13aWR0aCI6bmV3IEcoTS5wYWludF9zeW1ib2xbYHRleHQtaGFsby13aWR0aGBdLGB0ZXh0LWhhbG8td2lkdGhgKSwidGV4dC1oYWxvLWJsdXIiOm5ldyBHKE0ucGFpbnRfc3ltYm9sW2B0ZXh0LWhhbG8tYmx1cmBdLGB0ZXh0LWhhbG8tYmx1cmApLCJ0ZXh0LXRyYW5zbGF0ZSI6bmV3IFcoTS5wYWludF9zeW1ib2xbYHRleHQtdHJhbnNsYXRlYF0sYHRleHQtdHJhbnNsYXRlYCksInRleHQtdHJhbnNsYXRlLWFuY2hvciI6bmV3IFcoTS5wYWludF9zeW1ib2xbYHRleHQtdHJhbnNsYXRlLWFuY2hvcmBdLGB0ZXh0LXRyYW5zbGF0ZS1hbmNob3JgKX0pO3ZhciBEdj17Z2V0IHBhaW50KCl7cmV0dXJuIEV2KCl9LGdldCBsYXlvdXQoKXtyZXR1cm4gd3YoKX19LE92PWNsYXNze2NvbnN0cnVjdG9yKGUpe2lmKGUucHJvcGVydHkub3ZlcnJpZGVzPT09dm9pZCAwKXRocm93IEVycm9yKGBvdmVycmlkZXMgbXVzdCBiZSBwcm92aWRlZCB0byBpbnN0YW50aWF0ZSBGb3JtYXRTZWN0aW9uT3ZlcnJpZGUgY2xhc3NgKTt0aGlzLnR5cGU9ZS5wcm9wZXJ0eS5vdmVycmlkZXM/ZS5wcm9wZXJ0eS5vdmVycmlkZXMucnVudGltZVR5cGU6Qm4sdGhpcy5kZWZhdWx0VmFsdWU9ZX1ldmFsdWF0ZShlKXtpZihlLmZvcm1hdHRlZFNlY3Rpb24pe2xldCB0PXRoaXMuZGVmYXVsdFZhbHVlLnByb3BlcnR5Lm92ZXJyaWRlcztpZih0Py5oYXNPdmVycmlkZShlLmZvcm1hdHRlZFNlY3Rpb24pKXJldHVybiB0LmdldE92ZXJyaWRlKGUuZm9ybWF0dGVkU2VjdGlvbil9cmV0dXJuIGUuZmVhdHVyZSYmZS5mZWF0dXJlU3RhdGU/dGhpcy5kZWZhdWx0VmFsdWUuZXZhbHVhdGUoZS5mZWF0dXJlLGUuZmVhdHVyZVN0YXRlKTp0aGlzLmRlZmF1bHRWYWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLmRlZmF1bHR9ZWFjaENoaWxkKGUpe2lmKCF0aGlzLmRlZmF1bHRWYWx1ZS5pc0NvbnN0YW50KCkpe2xldCB0PXRoaXMuZGVmYXVsdFZhbHVlLnZhbHVlO2UodC5fc3R5bGVFeHByZXNzaW9uLmV4cHJlc3Npb24pfX1vdXRwdXREZWZpbmVkKCl7cmV0dXJuITF9c2VyaWFsaXplKCl7cmV0dXJuIG51bGx9fTtIKGBGb3JtYXRTZWN0aW9uT3ZlcnJpZGVgLE92LHtvbWl0OltgZGVmYXVsdFZhbHVlYF19KTtjb25zdCBrdj1lPT5lLnR5cGU9PT1gc3ltYm9sYDt2YXIgQXY9Y2xhc3MgZSBleHRlbmRzIGRse2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSxEdix0KX1yZWNhbGN1bGF0ZShlLHQpe3N1cGVyLnJlY2FsY3VsYXRlKGUsdCk7bGV0IG49dGhpcy5sYXlvdXQuZ2V0KGBpY29uLXJvdGF0aW9uLWFsaWdubWVudGApO2lmKChuLnZhbHVlLmtpbmQhPT1gY29uc3RhbnRgfHxuLnZhbHVlLnZhbHVlPT09YGF1dG9gKSYmKHRoaXMubGF5b3V0Ll92YWx1ZXNbYGljb24tcm90YXRpb24tYWxpZ25tZW50YF09bmV3IHRsKG4ucHJvcGVydHkse2tpbmQ6YGNvbnN0YW50YCx2YWx1ZTp0aGlzLmxheW91dC5nZXQoYHN5bWJvbC1wbGFjZW1lbnRgKT09PWBwb2ludGA/YHZpZXdwb3J0YDpgbWFwYH0sbi5wYXJhbWV0ZXJzKSksdGhpcy5sYXlvdXQuZ2V0KGB0ZXh0LXJvdGF0aW9uLWFsaWdubWVudGApPT09YGF1dG9gJiYodGhpcy5sYXlvdXQuZ2V0KGBzeW1ib2wtcGxhY2VtZW50YCk9PT1gcG9pbnRgP3RoaXMubGF5b3V0Ll92YWx1ZXNbYHRleHQtcm90YXRpb24tYWxpZ25tZW50YF09YHZpZXdwb3J0YDp0aGlzLmxheW91dC5fdmFsdWVzW2B0ZXh0LXJvdGF0aW9uLWFsaWdubWVudGBdPWBtYXBgKSx0aGlzLmxheW91dC5nZXQoYHRleHQtcGl0Y2gtYWxpZ25tZW50YCk9PT1gYXV0b2AmJih0aGlzLmxheW91dC5fdmFsdWVzW2B0ZXh0LXBpdGNoLWFsaWdubWVudGBdPXRoaXMubGF5b3V0LmdldChgdGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRgKT09PWBtYXBgP2BtYXBgOmB2aWV3cG9ydGApLHRoaXMubGF5b3V0LmdldChgaWNvbi1waXRjaC1hbGlnbm1lbnRgKT09PWBhdXRvYCYmKHRoaXMubGF5b3V0Ll92YWx1ZXNbYGljb24tcGl0Y2gtYWxpZ25tZW50YF09dGhpcy5sYXlvdXQuZ2V0KGBpY29uLXJvdGF0aW9uLWFsaWdubWVudGApLmNvbnN0YW50T3IoYHZpZXdwb3J0YCkpLHRoaXMubGF5b3V0LmdldChgc3ltYm9sLXBsYWNlbWVudGApPT09YHBvaW50YCl7bGV0IGU9dGhpcy5sYXlvdXQuZ2V0KGB0ZXh0LXdyaXRpbmctbW9kZWApO2lmKGUpe2xldCB0PVtdO2ZvcihsZXQgbiBvZiBlKXQuaW5jbHVkZXMobil8fHQucHVzaChuKTt0aGlzLmxheW91dC5fdmFsdWVzW2B0ZXh0LXdyaXRpbmctbW9kZWBdPXR9ZWxzZSB0aGlzLmxheW91dC5fdmFsdWVzW2B0ZXh0LXdyaXRpbmctbW9kZWBdPVtgaG9yaXpvbnRhbGBdfXRoaXMuX3NldFBhaW50T3ZlcnJpZGVzKCl9Z2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zKGUsdCxuLHIpe2xldCBpPXRoaXMubGF5b3V0LmdldChlKS5ldmFsdWF0ZSh0LHt9LG4sciksYT10aGlzLl91bmV2YWx1YXRlZExheW91dC5fdmFsdWVzW2VdO3JldHVybiFhLmlzRGF0YURyaXZlbigpJiYhTW8oYS52YWx1ZSkmJmk/U3YodC5wcm9wZXJ0aWVzLGkpOml9Y3JlYXRlQnVja2V0KGUpe3JldHVybiBuZXcgeHYoZSl9cXVlcnlSYWRpdXMoKXtyZXR1cm4gMH1xdWVyeUludGVyc2VjdHNGZWF0dXJlKCl7dGhyb3cgRXJyb3IoYFNob3VsZCB0YWtlIGEgZGlmZmVyZW50IHBhdGggaW4gRmVhdHVyZUluZGV4YCl9X3NldFBhaW50T3ZlcnJpZGVzKCl7Zm9yKGxldCB0IG9mIER2LnBhaW50Lm92ZXJyaWRhYmxlUHJvcGVydGllcyl7aWYoIWUuaGFzUGFpbnRPdmVycmlkZSh0aGlzLmxheW91dCx0KSljb250aW51ZTtsZXQgbj10aGlzLnBhaW50LmdldCh0KSxyPW5ldyBrbyhuZXcgT3YobiksYGxheWVyc1ske3RoaXMuaWR9XS5wYWludC4ke24ucHJvcGVydHkubmFtZX1gLG4ucHJvcGVydHkuc3BlY2lmaWNhdGlvbiksaT1udWxsO2k9bi52YWx1ZS5raW5kPT09YGNvbnN0YW50YHx8bi52YWx1ZS5raW5kPT09YHNvdXJjZWA/bmV3IFBvKGBzb3VyY2VgLHIpOm5ldyBGbyhgY29tcG9zaXRlYCxyLG4udmFsdWUuem9vbVN0b3BzKSx0aGlzLnBhaW50Ll92YWx1ZXNbdF09bmV3IHRsKG4ucHJvcGVydHksaSxuLnBhcmFtZXRlcnMpfX1faGFuZGxlT3ZlcnJpZGFibGVQYWludFByb3BlcnR5VXBkYXRlKHQsbixyKXtyZXR1cm4hdGhpcy5sYXlvdXR8fG4uaXNEYXRhRHJpdmVuKCl8fHIuaXNEYXRhRHJpdmVuKCk/ITE6ZS5oYXNQYWludE92ZXJyaWRlKHRoaXMubGF5b3V0LHQpfXN0YXRpYyBoYXNQYWludE92ZXJyaWRlKGUsdCl7bGV0IG49ZS5nZXQoYHRleHQtZmllbGRgKSxyPUR2LnBhaW50LnByb3BlcnRpZXNbdF0saT0hMSxhPWU9Pntmb3IobGV0IHQgb2YgZSlpZihyLm92ZXJyaWRlcz8uaGFzT3ZlcnJpZGUodCkpe2k9ITA7cmV0dXJufX07aWYobi52YWx1ZS5raW5kPT09YGNvbnN0YW50YCYmbi52YWx1ZS52YWx1ZSBpbnN0YW5jZW9mIFByKWEobi52YWx1ZS52YWx1ZS5zZWN0aW9ucyk7ZWxzZSBpZihuLnZhbHVlLmtpbmQ9PT1gc291cmNlYHx8bi52YWx1ZS5raW5kPT09YGNvbXBvc2l0ZWApe2xldCBlPXQ9PntpZighaSl7aWYodCBpbnN0YW5jZW9mIHFyJiZHcih0LnZhbHVlKT09PUtuKXtsZXQgZT10LnZhbHVlO2EoZS5zZWN0aW9ucyl9ZWxzZSB0IGluc3RhbmNlb2Ygbmk/YSh0LnNlY3Rpb25zKTp0LmVhY2hDaGlsZChlKX19LHQ9bi52YWx1ZTt0Ll9zdHlsZUV4cHJlc3Npb24mJmUodC5fc3R5bGVFeHByZXNzaW9uLmV4cHJlc3Npb24pfXJldHVybiBpfX07ZnVuY3Rpb24ganYoZSx0LG4scj0xKXtsZXQgaT1lLmdldChgaWNvbi1wYWRkaW5nYCkuZXZhbHVhdGUodCx7fSxuKT8udmFsdWVzO3JldHVybltpWzBdKnIsaVsxXSpyLGlbMl0qcixpWzNdKnJdfWxldCBNdjtjb25zdCBOdj0oKT0+TXZ8fD1uZXcgY2woeyJiYWNrZ3JvdW5kLWNvbG9yIjpuZXcgVyhNLnBhaW50X2JhY2tncm91bmRbYGJhY2tncm91bmQtY29sb3JgXSxgYmFja2dyb3VuZC1jb2xvcmApLCJiYWNrZ3JvdW5kLXBhdHRlcm4iOm5ldyBvbChNLnBhaW50X2JhY2tncm91bmRbYGJhY2tncm91bmQtcGF0dGVybmBdLGBiYWNrZ3JvdW5kLXBhdHRlcm5gKSwiYmFja2dyb3VuZC1vcGFjaXR5IjpuZXcgVyhNLnBhaW50X2JhY2tncm91bmRbYGJhY2tncm91bmQtb3BhY2l0eWBdLGBiYWNrZ3JvdW5kLW9wYWNpdHlgKX0pO3ZhciBQdj17Z2V0IHBhaW50KCl7cmV0dXJuIE52KCl9fTtjb25zdCBGdj1lPT5lLnR5cGU9PT1gYmFja2dyb3VuZGA7dmFyIEl2PWNsYXNzIGV4dGVuZHMgZGx7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLFB2LHQpfX07ZnVuY3Rpb24gTHYoZSl7bGV0IHQ9W10sbj1lLmlkO3JldHVybiBuPT09dm9pZCAwJiZ0LnB1c2gobmV3IE4oYGxheWVycy4ke259YCxudWxsLGBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5ICJpZCJgKSksZS5yZW5kZXI9PT12b2lkIDAmJnQucHVzaChuZXcgTihgbGF5ZXJzLiR7bn1gLG51bGwsYG1pc3NpbmcgcmVxdWlyZWQgbWV0aG9kICJyZW5kZXIiYCkpLGUucmVuZGVyaW5nTW9kZSYmZS5yZW5kZXJpbmdNb2RlIT09YDJkYCYmZS5yZW5kZXJpbmdNb2RlIT09YDNkYCYmdC5wdXNoKG5ldyBOKGBsYXllcnMuJHtufWAsbnVsbCxgcHJvcGVydHkgInJlbmRlcmluZ01vZGUiIG11c3QgYmUgZWl0aGVyICIyZCIgb3IgIjNkImApKSx0fWNvbnN0IFJ2PWU9PmUudHlwZT09PWBjdXN0b21gO3ZhciB6dj1jbGFzcyBleHRlbmRzIGRse2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx7fSx0KSx0aGlzLm9uQWRkPWU9Pnt0aGlzLmltcGxlbWVudGF0aW9uLm9uQWRkJiZ0aGlzLmltcGxlbWVudGF0aW9uLm9uQWRkKGUsZS5wYWludGVyLmNvbnRleHQuZ2wpfSx0aGlzLm9uUmVtb3ZlPWU9Pnt0aGlzLmltcGxlbWVudGF0aW9uLm9uUmVtb3ZlJiZ0aGlzLmltcGxlbWVudGF0aW9uLm9uUmVtb3ZlKGUsZS5wYWludGVyLmNvbnRleHQuZ2wpfSx0aGlzLmltcGxlbWVudGF0aW9uPWV9aXMzRCgpe3JldHVybiB0aGlzLmltcGxlbWVudGF0aW9uLnJlbmRlcmluZ01vZGU9PT1gM2RgfWhhc09mZnNjcmVlblBhc3MoKXtyZXR1cm4gdGhpcy5pbXBsZW1lbnRhdGlvbi5wcmVyZW5kZXIhPT12b2lkIDB9cmVjYWxjdWxhdGUoKXt9dXBkYXRlVHJhbnNpdGlvbnMoKXt9aGFzVHJhbnNpdGlvbigpe3JldHVybiExfXNlcmlhbGl6ZSgpe3Rocm93IEVycm9yKGBDdXN0b20gbGF5ZXJzIGNhbm5vdCBiZSBzZXJpYWxpemVkYCl9fTtmdW5jdGlvbiBCdihlLHQpe2lmKGUudHlwZT09PWBjdXN0b21gKXJldHVybiBuZXcgenYoZSx0KTtzd2l0Y2goZS50eXBlKXtjYXNlYGJhY2tncm91bmRgOnJldHVybiBuZXcgSXYoZSx0KTtjYXNlYGNpcmNsZWA6cmV0dXJuIG5ldyBXZChlLHQpO2Nhc2VgY29sb3ItcmVsaWVmYDpyZXR1cm4gbmV3IHlmKGUsdCk7Y2FzZWBmaWxsYDpyZXR1cm4gbmV3IEJwKGUsdCk7Y2FzZWBmaWxsLWV4dHJ1c2lvbmA6cmV0dXJuIG5ldyBMbShlLHQpO2Nhc2VgaGVhdG1hcGA6cmV0dXJuIG5ldyBhZihlLHQpO2Nhc2VgaGlsbHNoYWRlYDpyZXR1cm4gbmV3IHVmKGUsdCk7Y2FzZWBsaW5lYDpyZXR1cm4gbmV3IE9nKGUsdCk7Y2FzZWByYXN0ZXJgOnJldHVybiBuZXcgZ2woZSx0KTtjYXNlYHN5bWJvbGA6cmV0dXJuIG5ldyBBdihlLHQpfX12YXIgVnY9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fbWV0aG9kVG9UaHJvdHRsZT1lLHRoaXMuX3RyaWdnZXJlZD0hMSx0aGlzLl9jaGFubmVsPW5ldyBNZXNzYWdlQ2hhbm5lbCx0aGlzLl9jaGFubmVsLnBvcnQyLm9ubWVzc2FnZT0oKT0+e3RoaXMuX3RyaWdnZXJlZD0hMSx0aGlzLl9tZXRob2RUb1Rocm90dGxlKCl9fXRyaWdnZXIoKXt0aGlzLl90cmlnZ2VyZWR8fCh0aGlzLl90cmlnZ2VyZWQ9ITAsdGhpcy5fY2hhbm5lbD8ucG9ydDEucG9zdE1lc3NhZ2UoITApKX1yZW1vdmUoKXtkZWxldGUgdGhpcy5fY2hhbm5lbCx0aGlzLl9tZXRob2RUb1Rocm90dGxlPSgpPT57fX19O2NvbnN0IEh2PXtvbmNlOiEwfTt2YXIgVXY9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnRhcmdldD1lLHRoaXMubWFwSWQ9dCx0aGlzLnJlc29sdmVSZWplY3RzPXt9LHRoaXMudGFza3M9e30sdGhpcy50YXNrUXVldWU9W10sdGhpcy5hYm9ydENvbnRyb2xsZXJzPXt9LHRoaXMubWVzc2FnZUhhbmRsZXJzPXt9LHRoaXMuaW52b2tlcj1uZXcgVnYoKCk9PnRoaXMucHJvY2VzcygpKSx0aGlzLnN1YnNjcmlwdGlvbj1lbih0aGlzLnRhcmdldCxgbWVzc2FnZWAsZT0+dGhpcy5yZWNlaXZlKGUpLCExKSx0aGlzLmdsb2JhbFNjb3BlPUJ0KHNlbGYpP2U6d2luZG93fXJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoZSx0KXt0aGlzLm1lc3NhZ2VIYW5kbGVyc1tlXT10fXVucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihlKXtkZWxldGUgdGhpcy5tZXNzYWdlSGFuZGxlcnNbZV19c2VuZEFzeW5jKGUsdCl7cmV0dXJuIG5ldyBQcm9taXNlKChuLHIpPT57bGV0IGk9TWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKjB4ZGUwYjZiM2E3NjQwMDAwKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDAsMTApLGE9dD9lbih0LnNpZ25hbCxgYWJvcnRgLCgpPT57YT8udW5zdWJzY3JpYmUoKSxkZWxldGUgdGhpcy5yZXNvbHZlUmVqZWN0c1tpXTtsZXQgbj17aWQ6aSx0eXBlOmA8Y2FuY2VsPmAsb3JpZ2luOmxvY2F0aW9uLm9yaWdpbix0YXJnZXRNYXBJZDplLnRhcmdldE1hcElkLHNvdXJjZU1hcElkOnRoaXMubWFwSWR9O3RoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKG4pLHIobmV3IGhuKHQuc2lnbmFsLnJlYXNvbikpfSxIdik6bnVsbDt0aGlzLnJlc29sdmVSZWplY3RzW2ldPXtyZXNvbHZlOmU9PnthPy51bnN1YnNjcmliZSgpLG4oZSl9LHJlamVjdDplPT57YT8udW5zdWJzY3JpYmUoKSxyKGUpfX07bGV0IG89W10scz17Li4uZSxpZDppLHNvdXJjZU1hcElkOnRoaXMubWFwSWQsb3JpZ2luOmxvY2F0aW9uLm9yaWdpbixkYXRhOlNjKGUuZGF0YSxvKX07dGhpcy50YXJnZXQucG9zdE1lc3NhZ2Uocyx7dHJhbnNmZXI6b30pfSl9cmVjZWl2ZShlKXtsZXQgdD1lLmRhdGEsbj10LmlkLHI9W2BmaWxlOi8vYCxgcmVzb3VyY2U6Ly9hbmRyb2lkYCxgbnVsbGBdLGk9W3Qub3JpZ2luLGxvY2F0aW9uLm9yaWdpbl0sYT10Lm9yaWdpbj09PWxvY2F0aW9uLm9yaWdpbixvPWkuc29tZShlPT5yLmluY2x1ZGVzKGUpKTtpZighKCFhJiYhbykmJiEodC50YXJnZXRNYXBJZCYmdGhpcy5tYXBJZCE9PXQudGFyZ2V0TWFwSWQpKXtpZih0LnR5cGU9PT1gPGNhbmNlbD5gKXtkZWxldGUgdGhpcy50YXNrc1tuXTtsZXQgZT10aGlzLmFib3J0Q29udHJvbGxlcnNbbl07ZGVsZXRlIHRoaXMuYWJvcnRDb250cm9sbGVyc1tuXSxlJiZlLmFib3J0KCk7cmV0dXJufWlmKEJ0KHNlbGYpfHx0Lm11c3RRdWV1ZSl7dGhpcy50YXNrc1tuXT10LHRoaXMudGFza1F1ZXVlLnB1c2gobiksdGhpcy5pbnZva2VyLnRyaWdnZXIoKTtyZXR1cm59dGhpcy5wcm9jZXNzVGFzayhuLHQpfX1wcm9jZXNzKCl7aWYodGhpcy50YXNrUXVldWUubGVuZ3RoPT09MClyZXR1cm47bGV0IGU9dGhpcy50YXNrUXVldWUuc2hpZnQoKSx0PXRoaXMudGFza3NbZV07ZGVsZXRlIHRoaXMudGFza3NbZV0sdGhpcy50YXNrUXVldWUubGVuZ3RoPjAmJnRoaXMuaW52b2tlci50cmlnZ2VyKCksdCYmdGhpcy5wcm9jZXNzVGFzayhlLHQpfWFzeW5jIHByb2Nlc3NUYXNrKGUsdCl7aWYodC50eXBlPT09YDxyZXNwb25zZT5gKXtsZXQgbj10aGlzLnJlc29sdmVSZWplY3RzW2VdO2lmKGRlbGV0ZSB0aGlzLnJlc29sdmVSZWplY3RzW2VdLCFuKXJldHVybjt0LmVycm9yP24ucmVqZWN0KCRlKENjKHQuZXJyb3IpKSk6bi5yZXNvbHZlKENjKHQuZGF0YSkpO3JldHVybn1pZighdGhpcy5tZXNzYWdlSGFuZGxlcnNbdC50eXBlXSl7dGhpcy5jb21wbGV0ZVRhc2soZSxudWxsLG51bGwpO3JldHVybn1sZXQgbj1DYyh0LmRhdGEpLHI9bmV3IEFib3J0Q29udHJvbGxlcjt0aGlzLmFib3J0Q29udHJvbGxlcnNbZV09cjt0cnl7bGV0IGk9YXdhaXQgdGhpcy5tZXNzYWdlSGFuZGxlcnNbdC50eXBlXSh0LnNvdXJjZU1hcElkLG4scik7dGhpcy5jb21wbGV0ZVRhc2soZSxudWxsLGkpfWNhdGNoKHQpe3RoaXMuY29tcGxldGVUYXNrKGUsJGUodCkpfX1jb21wbGV0ZVRhc2soZSx0LG4pe2xldCByPVtdO2RlbGV0ZSB0aGlzLmFib3J0Q29udHJvbGxlcnNbZV07bGV0IGk9e2lkOmUsdHlwZTpgPHJlc3BvbnNlPmAsc291cmNlTWFwSWQ6dGhpcy5tYXBJZCxvcmlnaW46bG9jYXRpb24ub3JpZ2luLGVycm9yOnQ/U2ModCk6bnVsbCxkYXRhOlNjKG4scil9O3RoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKGkse3RyYW5zZmVyOnJ9KX1yZW1vdmUoKXt0aGlzLmludm9rZXIucmVtb3ZlKCksdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKX19O2Z1bmN0aW9uIFd2KGUsdCxuKXtyZXR1cm4hKGU8MHx8ZT4yNXx8bjwwfHxuPj0yKiplfHx0PDB8fHQ+PTIqKmUpfWZ1bmN0aW9uIEd2KGUsdCl7bGV0e3g6bix5OnJ9PWRtLmZyb21MbmdMYXQodCk7cmV0dXJuIShlPDB8fGU+MjV8fHI8MHx8cj49MXx8bjwwfHxuPj0xKX12YXIgS3Y9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe2lmKCFXdihlLHQsbikpdGhyb3cgRXJyb3IoYHg9JHt0fSwgeT0ke259LCB6PSR7ZX0gb3V0c2lkZSBvZiBib3VuZHMuIDA8PXg8JHsyKiplfSwgMDw9eTwkezIqKmV9IDA8PXo8PTI1IGApO3RoaXMuej1lLHRoaXMueD10LHRoaXMueT1uLHRoaXMua2V5PVl2KDAsZSxlLHQsbil9ZXF1YWxzKGUpe3JldHVybiB0aGlzLno9PT1lLnomJnRoaXMueD09PWUueCYmdGhpcy55PT09ZS55fXVybChlLHQsbil7bGV0IHI9WnYodGhpcy54LHRoaXMueSx0aGlzLnopLGk9JHYodGhpcy56LHRoaXMueCx0aGlzLnkpO3JldHVybiBlWyh0aGlzLngrdGhpcy55KSVlLmxlbmd0aF0ucmVwbGFjZSgve3ByZWZpeH0vZywodGhpcy54JTE2KS50b1N0cmluZygxNikrKHRoaXMueSUxNikudG9TdHJpbmcoMTYpKS5yZXBsYWNlKC97en0vZyxTdHJpbmcodGhpcy56KSkucmVwbGFjZSgve3h9L2csU3RyaW5nKHRoaXMueCkpLnJlcGxhY2UoL3t5fS9nLFN0cmluZyhuPT09YHRtc2A/MioqdGhpcy56LXRoaXMueS0xOnRoaXMueSkpLnJlcGxhY2UoL3tyYXRpb30vZyx0PjE/YEAyeGA6YGApLnJlcGxhY2UoL3txdWFka2V5fS9nLGkpLnJlcGxhY2UoL3tiYm94LWVwc2ctMzg1N30vZyxyKX1pc0NoaWxkT2YoZSl7bGV0IHQ9dGhpcy56LWUuejtyZXR1cm4gdD4wJiZlLng9PT10aGlzLng+PnQmJmUueT09PXRoaXMueT4+dH1nZXRUaWxlUG9pbnQoZSl7bGV0IHQ9MioqdGhpcy56O3JldHVybiBuZXcgbCgoZS54KnQtdGhpcy54KSpqLChlLnkqdC10aGlzLnkpKmopfXRvU3RyaW5nKCl7cmV0dXJuYCR7dGhpcy56fS8ke3RoaXMueH0vJHt0aGlzLnl9YH19LHF2PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy53cmFwPWUsdGhpcy5jYW5vbmljYWw9dCx0aGlzLmtleT1ZdihlLHQueix0LnosdC54LHQueSl9fSxKdj1jbGFzcyBle2NvbnN0cnVjdG9yKGUsdCxuLHIsaSl7aWYodGhpcy50ZXJyYWluUnR0UG9zTWF0cml4MzJmPW51bGwsZTxuKXRocm93IEVycm9yKGBvdmVyc2NhbGVkWiBzaG91bGQgYmUgPj0gejsgb3ZlcnNjYWxlZFogPSAke2V9OyB6ID0gJHtufWApO3RoaXMub3ZlcnNjYWxlZFo9ZSx0aGlzLndyYXA9dCx0aGlzLmNhbm9uaWNhbD1uZXcgS3YobiwrciwraSksdGhpcy5rZXk9WXYodCxlLG4scixpKX1jbG9uZSgpe3JldHVybiBuZXcgZSh0aGlzLm92ZXJzY2FsZWRaLHRoaXMud3JhcCx0aGlzLmNhbm9uaWNhbC56LHRoaXMuY2Fub25pY2FsLngsdGhpcy5jYW5vbmljYWwueSl9ZXF1YWxzKGUpe3JldHVybiB0aGlzLm92ZXJzY2FsZWRaPT09ZS5vdmVyc2NhbGVkWiYmdGhpcy53cmFwPT09ZS53cmFwJiZ0aGlzLmNhbm9uaWNhbC5lcXVhbHMoZS5jYW5vbmljYWwpfXNjYWxlZFRvKHQpe2lmKHQ+dGhpcy5vdmVyc2NhbGVkWil0aHJvdyBFcnJvcihgdGFyZ2V0WiA+IHRoaXMub3ZlcnNjYWxlZFo7IHRhcmdldFogPSAke3R9OyBvdmVyc2NhbGVkWiA9ICR7dGhpcy5vdmVyc2NhbGVkWn1gKTtsZXQgbj10aGlzLmNhbm9uaWNhbC56LXQ7cmV0dXJuIHQ+dGhpcy5jYW5vbmljYWwuej9uZXcgZSh0LHRoaXMud3JhcCx0aGlzLmNhbm9uaWNhbC56LHRoaXMuY2Fub25pY2FsLngsdGhpcy5jYW5vbmljYWwueSk6bmV3IGUodCx0aGlzLndyYXAsdCx0aGlzLmNhbm9uaWNhbC54Pj5uLHRoaXMuY2Fub25pY2FsLnk+Pm4pfWlzT3ZlcnNjYWxlZCgpe3JldHVybiB0aGlzLm92ZXJzY2FsZWRaPnRoaXMuY2Fub25pY2FsLnp9Y2FsY3VsYXRlU2NhbGVkS2V5KGUsdCl7aWYoZT50aGlzLm92ZXJzY2FsZWRaKXRocm93IEVycm9yKGB0YXJnZXRaID4gdGhpcy5vdmVyc2NhbGVkWjsgdGFyZ2V0WiA9ICR7ZX07IG92ZXJzY2FsZWRaID0gJHt0aGlzLm92ZXJzY2FsZWRafWApO2xldCBuPXRoaXMuY2Fub25pY2FsLnotZTtyZXR1cm4gZT50aGlzLmNhbm9uaWNhbC56P1l2KHRoaXMud3JhcCordCxlLHRoaXMuY2Fub25pY2FsLnosdGhpcy5jYW5vbmljYWwueCx0aGlzLmNhbm9uaWNhbC55KTpZdih0aGlzLndyYXAqK3QsZSxlLHRoaXMuY2Fub25pY2FsLng+Pm4sdGhpcy5jYW5vbmljYWwueT4+bil9aXNDaGlsZE9mKGUpe2lmKGUud3JhcCE9PXRoaXMud3JhcHx8dGhpcy5vdmVyc2NhbGVkWi1lLm92ZXJzY2FsZWRaPD0wKXJldHVybiExO2lmKGUub3ZlcnNjYWxlZFo9PT0wKXJldHVybiB0aGlzLm92ZXJzY2FsZWRaPjA7bGV0IHQ9dGhpcy5jYW5vbmljYWwuei1lLmNhbm9uaWNhbC56O3JldHVybiB0PDA/ITE6ZS5jYW5vbmljYWwueD09PXRoaXMuY2Fub25pY2FsLng+PnQmJmUuY2Fub25pY2FsLnk9PT10aGlzLmNhbm9uaWNhbC55Pj50fWNoaWxkcmVuKHQpe2lmKHRoaXMub3ZlcnNjYWxlZFo+PXQpcmV0dXJuW25ldyBlKHRoaXMub3ZlcnNjYWxlZForMSx0aGlzLndyYXAsdGhpcy5jYW5vbmljYWwueix0aGlzLmNhbm9uaWNhbC54LHRoaXMuY2Fub25pY2FsLnkpXTtsZXQgbj10aGlzLmNhbm9uaWNhbC56KzEscj10aGlzLmNhbm9uaWNhbC54KjIsaT10aGlzLmNhbm9uaWNhbC55KjI7cmV0dXJuW25ldyBlKG4sdGhpcy53cmFwLG4scixpKSxuZXcgZShuLHRoaXMud3JhcCxuLHIrMSxpKSxuZXcgZShuLHRoaXMud3JhcCxuLHIsaSsxKSxuZXcgZShuLHRoaXMud3JhcCxuLHIrMSxpKzEpXX1pc0xlc3NUaGFuKGUpe3JldHVybiB0aGlzLndyYXA8ZS53cmFwPyEwOnRoaXMud3JhcD5lLndyYXA/ITE6dGhpcy5vdmVyc2NhbGVkWjxlLm92ZXJzY2FsZWRaPyEwOnRoaXMub3ZlcnNjYWxlZFo+ZS5vdmVyc2NhbGVkWj8hMTp0aGlzLmNhbm9uaWNhbC54PGUuY2Fub25pY2FsLng/ITA6dGhpcy5jYW5vbmljYWwueD5lLmNhbm9uaWNhbC54PyExOnRoaXMuY2Fub25pY2FsLnk8ZS5jYW5vbmljYWwueX13cmFwcGVkKCl7cmV0dXJuIG5ldyBlKHRoaXMub3ZlcnNjYWxlZFosMCx0aGlzLmNhbm9uaWNhbC56LHRoaXMuY2Fub25pY2FsLngsdGhpcy5jYW5vbmljYWwueSl9dW53cmFwVG8odCl7cmV0dXJuIG5ldyBlKHRoaXMub3ZlcnNjYWxlZFosdCx0aGlzLmNhbm9uaWNhbC56LHRoaXMuY2Fub25pY2FsLngsdGhpcy5jYW5vbmljYWwueSl9b3ZlcnNjYWxlRmFjdG9yKCl7cmV0dXJuIDIqKih0aGlzLm92ZXJzY2FsZWRaLXRoaXMuY2Fub25pY2FsLnopfXRvVW53cmFwcGVkKCl7cmV0dXJuIG5ldyBxdih0aGlzLndyYXAsdGhpcy5jYW5vbmljYWwpfXRvU3RyaW5nKCl7cmV0dXJuYCR7dGhpcy5vdmVyc2NhbGVkWn0vJHt0aGlzLmNhbm9uaWNhbC54fS8ke3RoaXMuY2Fub25pY2FsLnl9YH1nZXRUaWxlUG9pbnQoZSl7cmV0dXJuIHRoaXMuY2Fub25pY2FsLmdldFRpbGVQb2ludChuZXcgZG0oZS54LXRoaXMud3JhcCxlLnkpKX1ub3JtYWxpemVDb29yZGluYXRlcyh0LG4scj1qKXtpZih0Pj0wJiZ0PHImJm4+PTAmJm48cilyZXR1cm57dGlsZUlEOnRoaXMseDp0LHk6bn07bGV0IGk9TWF0aC5mbG9vcih0L3IpLGE9TWF0aC5mbG9vcihuL3IpLG89dC1pKnIscz1uLWEqcixjPXRoaXMuY2Fub25pY2FsLnosbD0xPDxjLHU9dGhpcy5jYW5vbmljYWwueSthO2lmKHU8MHx8dT49bClyZXR1cm4gbnVsbDtsZXQgZD10aGlzLmNhbm9uaWNhbC54K2ksZj10aGlzLndyYXA7cmV0dXJuIGQ8MD8oZi09TWF0aC5jZWlsKC1kL2wpLGQ9KGQlbCtsKSVsKTpkPj1sJiYoZis9TWF0aC5mbG9vcihkL2wpLGQlPWwpLHt0aWxlSUQ6bmV3IGUodGhpcy5vdmVyc2NhbGVkWixmLGMsZCx1KSx4Om8seTpzfX19O2Z1bmN0aW9uIFl2KGUsdCxuLHIsaSl7ZSo9MixlPDAmJihlPWUqLTEtMSk7bGV0IGE9MTw8bjtyZXR1cm4oYSphKmUrYSppK3IpLnRvU3RyaW5nKDM2KStuLnRvU3RyaW5nKDM2KSt0LnRvU3RyaW5nKDM2KX1jb25zdCBYdj1NYXRoLlBJKjYzNzgxMzc7ZnVuY3Rpb24gWnYoZSx0LG4pe3Q9Mioqbi10LTE7bGV0IHI9UXYoZSoyNTYsdCoyNTYsbiksaT1RdigoZSsxKSoyNTYsKHQrMSkqMjU2LG4pO3JldHVybmAke3JbMF19LCR7clsxXX0sJHtpWzBdfSwke2lbMV19YH1mdW5jdGlvbiBRdihlLHQsbil7bGV0IHI9MipYdi8yNTYvMioqbjtyZXR1cm5bZSpyLVh2LHQqci1Ydl19ZnVuY3Rpb24gJHYoZSx0LG4pe2xldCByPWBgO2ZvcihsZXQgaT1lO2k+MDtpLS0pe2xldCBlPTE8PGktMTtyKz0odCZlPzE6MCkrKG4mZT8yOjApfXJldHVybiByfWZ1bmN0aW9uIGV5KGUsdCl7bGV0IG49TWF0aC5hYnMoZS53cmFwKjIpLSsoZS53cmFwPDApLHI9TWF0aC5hYnModC53cmFwKjIpLSsodC53cmFwPDApO3JldHVybiBlLm92ZXJzY2FsZWRaLXQub3ZlcnNjYWxlZFp8fHItbnx8dC5jYW5vbmljYWwueS1lLmNhbm9uaWNhbC55fHx0LmNhbm9uaWNhbC54LWUuY2Fub25pY2FsLnh9SChgQ2Fub25pY2FsVGlsZUlEYCxLdiksSChgT3ZlcnNjYWxlZFRpbGVJRGAsSnYse29taXQ6W2B0ZXJyYWluUnR0UG9zTWF0cml4MzJmYF19KTt2YXIgdHk9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmZlYXR1cmU9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMucHJvcGVydGllcz1lLnRhZ3M/ZS50YWdzOnt9LHRoaXMuZXh0ZW50PXQsYGlkYGluIGUmJih0eXBlb2YgZS5pZD09YHN0cmluZ2A/dGhpcy5pZD1wYXJzZUludChlLmlkLDEwKTp0eXBlb2YgZS5pZD09YG51bWJlcmAmJiFpc05hTihlLmlkKSYmKHRoaXMuaWQ9ZS5pZCkpfWxvYWRHZW9tZXRyeSgpe2xldCBlPVtdLHQ9dGhpcy5mZWF0dXJlLnR5cGU9PT0xP1t0aGlzLmZlYXR1cmUuZ2VvbWV0cnldOnRoaXMuZmVhdHVyZS5nZW9tZXRyeTtmb3IobGV0IG4gb2YgdCl7bGV0IHQ9W107Zm9yKGxldCBlIG9mIG4pdC5wdXNoKG5ldyBsKGVbMF0sZVsxXSkpO2UucHVzaCh0KX1yZXR1cm4gZX19O2NvbnN0IG55PWBfZ2VvanNvblRpbGVMYXllcmA7dmFyIHJ5PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5sYXllcnM9e1tueV06dGhpc30sdGhpcy5uYW1lPW55LHRoaXMudmVyc2lvbj10P3QudmVyc2lvbjoxLHRoaXMuZXh0ZW50PXQ/dC5leHRlbnQ6NDA5Nix0aGlzLmxlbmd0aD1lLmxlbmd0aCx0aGlzLmZlYXR1cmVzPWV9ZmVhdHVyZShlKXtyZXR1cm4gbmV3IHR5KHRoaXMuZmVhdHVyZXNbZV0sdGhpcy5leHRlbnQpfX07ZnVuY3Rpb24gaXkoZSx0PWBgKXtsZXQgbj1uZXcgYV87cmV0dXJuIGF5KGUsbix0KSxuLmZpbmlzaCgpfWZ1bmN0aW9uIGF5KGUsdCxuPWBgKXtmb3IobGV0IHIgaW4gZS5sYXllcnMpdC53cml0ZU1lc3NhZ2UoMywoZSx0KT0+b3koZSx0LG4pLGUubGF5ZXJzW3JdKX1mdW5jdGlvbiBveShlLHQsbj1gYCl7dC53cml0ZVZhcmludEZpZWxkKDE1LGUudmVyc2lvbnx8MSksdC53cml0ZVN0cmluZ0ZpZWxkKDEsZS5uYW1lfHxgYCksdC53cml0ZVZhcmludEZpZWxkKDUsZS5leHRlbnR8fDQwOTYpO2xldCByPXtqc29uUHJlZml4Om4sa2V5czpbXSx2YWx1ZXM6W10sa2V5Y2FjaGU6e30sdmFsdWVjYWNoZTp7fX07Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspci5mZWF0dXJlPWUuZmVhdHVyZShuKSx0LndyaXRlTWVzc2FnZSgyLHN5LHIpO2xldCBpPXIua2V5cztmb3IobGV0IGUgb2YgaSl0LndyaXRlU3RyaW5nRmllbGQoMyxlKTtsZXQgYT1yLnZhbHVlcztmb3IobGV0IGUgb2YgYSl0LndyaXRlTWVzc2FnZSg0LGZ5LGUpfWZ1bmN0aW9uIHN5KGUsdCl7aWYoIWUuZmVhdHVyZSlyZXR1cm47bGV0IG49ZS5mZWF0dXJlO24uaWQhPT12b2lkIDAmJnQud3JpdGVWYXJpbnRGaWVsZCgxLG4uaWQpLHQud3JpdGVNZXNzYWdlKDIsY3ksZSksdC53cml0ZVZhcmludEZpZWxkKDMsbi50eXBlKSx0LndyaXRlTWVzc2FnZSg0LGR5LG4pfWZ1bmN0aW9uIGN5KGUsdCl7Zm9yKGxldCBuIGluIGUuZmVhdHVyZT8ucHJvcGVydGllcyl7bGV0IHI9ZS5mZWF0dXJlLnByb3BlcnRpZXNbbl0saT1lLmtleWNhY2hlW25dO2lmKHI9PW51bGwpY29udGludWU7aT09PXZvaWQgMCYmKGUua2V5cy5wdXNoKG4pLGk9ZS5rZXlzLmxlbmd0aC0xLGUua2V5Y2FjaGVbbl09aSksdC53cml0ZVZhcmludChpKSx0eXBlb2YgciE9YHN0cmluZ2AmJnR5cGVvZiByIT1gYm9vbGVhbmAmJnR5cGVvZiByIT1gbnVtYmVyYCYmKHI9ZS5qc29uUHJlZml4K0pTT04uc3RyaW5naWZ5KHIpKTtsZXQgYT10eXBlb2YgcitgOmArcixvPWUudmFsdWVjYWNoZVthXTtvPT09dm9pZCAwJiYoZS52YWx1ZXMucHVzaChyKSxvPWUudmFsdWVzLmxlbmd0aC0xLGUudmFsdWVjYWNoZVthXT1vKSx0LndyaXRlVmFyaW50KG8pfX1mdW5jdGlvbiBseShlLHQpe3JldHVybih0PDwzKSsoZSY3KX1mdW5jdGlvbiB1eShlKXtyZXR1cm4gZTw8MV5lPj4zMX1mdW5jdGlvbiBkeShlLHQpe2xldCBuPWUubG9hZEdlb21ldHJ5KCkscj1lLnR5cGUsaT0wLGE9MDtmb3IobGV0IG8gb2Ygbil7bGV0IG49MTtyPT09MSYmKG49by5sZW5ndGgpLHQud3JpdGVWYXJpbnQobHkoMSxuKSk7bGV0IHM9cj09PTM/by5sZW5ndGgtMTpvLmxlbmd0aDtmb3IobGV0IGU9MDtlPHM7ZSsrKXtlPT09MSYmciE9PTEmJnQud3JpdGVWYXJpbnQobHkoMixzLTEpKTtsZXQgbj1vW2VdLngtaSxjPW9bZV0ueS1hO3Qud3JpdGVWYXJpbnQodXkobikpLHQud3JpdGVWYXJpbnQodXkoYykpLGkrPW4sYSs9Y31lLnR5cGU9PT0zJiZ0LndyaXRlVmFyaW50KGx5KDcsMSkpfX1mdW5jdGlvbiBmeShlLHQpe2xldCBuPXR5cGVvZiBlO249PT1gc3RyaW5nYD90LndyaXRlU3RyaW5nRmllbGQoMSxlKTpuPT09YGJvb2xlYW5gP3Qud3JpdGVCb29sZWFuRmllbGQoNyxlKTpuPT09YG51bWJlcmAmJihlJTE9PTA/ZTwwP3Qud3JpdGVTVmFyaW50RmllbGQoNixlKTp0LndyaXRlVmFyaW50RmllbGQoNSxlKTp0LndyaXRlRG91YmxlRmllbGQoMyxlKSl9dmFyIHB5PWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX3N0cmluZ1RvTnVtYmVyPXt9LHRoaXMuX251bWJlclRvU3RyaW5nPVtdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgbj1lW3RdO3RoaXMuX3N0cmluZ1RvTnVtYmVyW25dPXQsdGhpcy5fbnVtYmVyVG9TdHJpbmdbdF09bn19ZW5jb2RlKGUpe3JldHVybiB0aGlzLl9zdHJpbmdUb051bWJlcltlXX1kZWNvZGUoZSl7aWYoZT49dGhpcy5fbnVtYmVyVG9TdHJpbmcubGVuZ3RoKXRocm93IEVycm9yKGBPdXQgb2YgYm91bmRzLiBJbmRleCByZXF1ZXN0ZWQgbj0ke2V9IGNhbid0IGJlID49IHRoaXMuX251bWJlclRvU3RyaW5nLmxlbmd0aCAke3RoaXMuX251bWJlclRvU3RyaW5nLmxlbmd0aH1gKTtyZXR1cm4gdGhpcy5fbnVtYmVyVG9TdHJpbmdbZV19fSxteT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbixyLGkpe3RoaXMudHlwZT1gRmVhdHVyZWAsdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmU9ZSx0aGlzLl94PW4sdGhpcy5feT1yLHRoaXMuX3o9dDtmb3IobGV0IHQgaW4gZS5wcm9wZXJ0aWVzKXR5cGVvZiBlLnByb3BlcnRpZXNbdF0hPWBzdHJpbmdgfHwhZS5wcm9wZXJ0aWVzW3RdLnN0YXJ0c1dpdGgoYF9fJGpzb25fXzpgKXx8KGUucHJvcGVydGllc1t0XT1KU09OLnBhcnNlKGUucHJvcGVydGllc1t0XS5zbGljZSgxMCkpKTt0aGlzLnByb3BlcnRpZXM9ZS5wcm9wZXJ0aWVzLHRoaXMuaWQ9aX1wcm9qZWN0UG9pbnQoZSx0LG4scil7cmV0dXJuWyhlLngrdCkqMzYwL3ItMTgwLDM2MC9NYXRoLlBJKk1hdGguYXRhbihNYXRoLmV4cCgoMS0oZS55K24pKjIvcikqTWF0aC5QSSkpLTkwXX1wcm9qZWN0TGluZShlLHQsbixyKXtyZXR1cm4gZS5tYXAoZT0+dGhpcy5wcm9qZWN0UG9pbnQoZSx0LG4scikpfWdldCBnZW9tZXRyeSgpe2lmKHRoaXMuX2dlb21ldHJ5KXJldHVybiB0aGlzLl9nZW9tZXRyeTtsZXQgZT10aGlzLl92ZWN0b3JUaWxlRmVhdHVyZSx0PWUuZXh0ZW50KjIqKnRoaXMuX3osbj1lLmV4dGVudCp0aGlzLl94LHI9ZS5leHRlbnQqdGhpcy5feSxpPWUubG9hZEdlb21ldHJ5KCk7c3dpdGNoKGUudHlwZSl7Y2FzZSAxOntsZXQgZT1bXTtmb3IobGV0IHQgb2YgaSllLnB1c2godFswXSk7bGV0IGE9dGhpcy5wcm9qZWN0TGluZShlLG4scix0KTt0aGlzLl9nZW9tZXRyeT1lLmxlbmd0aD09PTE/e3R5cGU6YFBvaW50YCxjb29yZGluYXRlczphWzBdfTp7dHlwZTpgTXVsdGlQb2ludGAsY29vcmRpbmF0ZXM6YX07YnJlYWt9Y2FzZSAyOntsZXQgZT1pLm1hcChlPT50aGlzLnByb2plY3RMaW5lKGUsbixyLHQpKTt0aGlzLl9nZW9tZXRyeT1lLmxlbmd0aD09PTE/e3R5cGU6YExpbmVTdHJpbmdgLGNvb3JkaW5hdGVzOmVbMF19Ont0eXBlOmBNdWx0aUxpbmVTdHJpbmdgLGNvb3JkaW5hdGVzOmV9O2JyZWFrfWNhc2UgMzp7bGV0IGU9WXAoaSksYT1bXTtmb3IobGV0IGkgb2YgZSlhLnB1c2goaS5tYXAoZT0+dGhpcy5wcm9qZWN0TGluZShlLG4scix0KSkpO3RoaXMuX2dlb21ldHJ5PWEubGVuZ3RoPT09MT97dHlwZTpgUG9seWdvbmAsY29vcmRpbmF0ZXM6YVswXX06e3R5cGU6YE11bHRpUG9seWdvbmAsY29vcmRpbmF0ZXM6YX07YnJlYWt9ZGVmYXVsdDp0aHJvdyBFcnJvcihgdW5rbm93biBmZWF0dXJlIHR5cGU6ICR7ZS50eXBlfWApfXJldHVybiB0aGlzLl9nZW9tZXRyeX1zZXQgZ2VvbWV0cnkoZSl7dGhpcy5fZ2VvbWV0cnk9ZX10b0pTT04oKXtsZXQgZT17Z2VvbWV0cnk6dGhpcy5nZW9tZXRyeX07Zm9yKGxldCB0IGluIHRoaXMpdCE9PWBfZ2VvbWV0cnlgJiZ0IT09YF92ZWN0b3JUaWxlRmVhdHVyZWAmJnQhPT1gX3hgJiZ0IT09YF95YCYmdCE9PWBfemAmJihlW3RdPXRoaXNbdF0pO3JldHVybiBlfX0saHk9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuX25hbWU9ZSx0aGlzLmRhdGFCdWZmZXI9dCx0eXBlb2Ygbj09YG51bWJlcmA/dGhpcy5fc2l6ZT1uOih0aGlzLm51bGxhYmlsaXR5QnVmZmVyPW4sdGhpcy5fc2l6ZT1uLnNpemUoKSl9Z2V0VmFsdWUoZSl7cmV0dXJuIHRoaXMubnVsbGFiaWxpdHlCdWZmZXImJiF0aGlzLm51bGxhYmlsaXR5QnVmZmVyLmdldChlKT9udWxsOnRoaXMuZ2V0VmFsdWVGcm9tQnVmZmVyKGUpfWhhcyhlKXtyZXR1cm4gdGhpcy5udWxsYWJpbGl0eUJ1ZmZlcj8uZ2V0KGUpfHwhdGhpcy5udWxsYWJpbGl0eUJ1ZmZlcn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLl9uYW1lfWdldCBzaXplKCl7cmV0dXJuIHRoaXMuX3NpemV9fSxneT1jbGFzcyBleHRlbmRzIGh5e30sX3k9Y2xhc3MgZXh0ZW5kcyBneXtnZXRWYWx1ZUZyb21CdWZmZXIoZSl7cmV0dXJuIHRoaXMuZGF0YUJ1ZmZlcltlXX19LHZ5PWNsYXNzIGV4dGVuZHMgZ3l7Z2V0VmFsdWVGcm9tQnVmZmVyKGUpe3JldHVybiB0aGlzLmRhdGFCdWZmZXJbZV19fSx5eT1jbGFzcyBleHRlbmRzIGh5e2NvbnN0cnVjdG9yKGUsdCxuLHIpe3N1cGVyKGUsdCxyKSx0aGlzLmRlbHRhPW59fSxieT1jbGFzcyBleHRlbmRzIHl5e2NvbnN0cnVjdG9yKGUsdCxuLHIsaSl7c3VwZXIoZSxpP0ludDMyQXJyYXkub2YodCk6VWludDMyQXJyYXkub2YodCksbixyKX1nZXRWYWx1ZUZyb21CdWZmZXIoZSl7cmV0dXJuIHRoaXMuZGF0YUJ1ZmZlclswXStlKnRoaXMuZGVsdGF9fSx4eT1jbGFzcyBleHRlbmRzIGh5e2NvbnN0cnVjdG9yKGUsdCxuLHIpe3N1cGVyKGUscj9JbnQzMkFycmF5Lm9mKHQpOlVpbnQzMkFycmF5Lm9mKHQpLG4pfWdldFZhbHVlRnJvbUJ1ZmZlcihlKXtyZXR1cm4gdGhpcy5kYXRhQnVmZmVyWzBdfX0sU3k9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scixpPTQwOTYpe2lmKHRoaXMuX25hbWU9ZSx0aGlzLl9nZW9tZXRyeVZlY3Rvcj10LHRoaXMuX2lkVmVjdG9yPW4sdGhpcy5fcHJvcGVydHlWZWN0b3JzPXIsdGhpcy5fZXh0ZW50PWksZS5sZW5ndGg9PT0wKXRocm93IEVycm9yKGBNaXNzaW5nIGxheWVyIG5hbWVgKX1nZXQgbmFtZSgpe3JldHVybiB0aGlzLl9uYW1lfWdldCBpZFZlY3Rvcigpe3JldHVybiB0aGlzLl9pZFZlY3Rvcn1nZXQgZ2VvbWV0cnlWZWN0b3IoKXtyZXR1cm4gdGhpcy5fZ2VvbWV0cnlWZWN0b3J9Z2V0IHByb3BlcnR5VmVjdG9ycygpe3JldHVybiB0aGlzLl9wcm9wZXJ0eVZlY3RvcnM/P1tdfWdldFByb3BlcnR5VmVjdG9yKGUpe3JldHVybiB0aGlzLnByb3BlcnR5VmVjdG9yc01hcHx8PW5ldyBNYXAodGhpcy5wcm9wZXJ0eVZlY3RvcnMubWFwKGU9PltlLm5hbWUsZV0pKSx0aGlzLnByb3BlcnR5VmVjdG9yc01hcC5nZXQoZSl9Z2V0IG51bUZlYXR1cmVzKCl7cmV0dXJuIHRoaXMuZ2VvbWV0cnlWZWN0b3IubnVtR2VvbWV0cmllc31nZXQgZXh0ZW50KCl7cmV0dXJuIHRoaXMuX2V4dGVudH1nZXRGZWF0dXJlcygpe2xldCBlPVtdLHQ9dGhpcy5nZW9tZXRyeVZlY3Rvci5nZXRHZW9tZXRyaWVzKCk7Zm9yKGxldCBuPTA7bjx0aGlzLm51bUZlYXR1cmVzO24rKyl7bGV0IHI7aWYodGhpcy5pZFZlY3Rvcil7bGV0IGU9dGhpcy5pZFZlY3Rvci5nZXRWYWx1ZShuKTtlIT09bnVsbCYmKHI9dGhpcy5jb250YWluc01heFNhZmVJbnRlZ2VyVmFsdWVzKHRoaXMuaWRWZWN0b3IpP051bWJlcihlKTplKX1sZXQgaT17Y29vcmRpbmF0ZXM6dFtuXSx0eXBlOnRoaXMuZ2VvbWV0cnlWZWN0b3IuZ2VvbWV0cnlUeXBlKG4pfSxhPXt9O2ZvcihsZXQgZSBvZiB0aGlzLnByb3BlcnR5VmVjdG9ycyl7aWYoIWUpY29udGludWU7bGV0IHQ9ZS5uYW1lLHI9ZS5nZXRWYWx1ZShuKTtyIT09bnVsbCYmKGFbdF09cil9ZS5wdXNoKHtpZDpyLGdlb21ldHJ5OmkscHJvcGVydGllczphfSl9cmV0dXJuIGV9Y29udGFpbnNNYXhTYWZlSW50ZWdlclZhbHVlcyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIF95fHxlIGluc3RhbmNlb2YgeHl8fGUgaW5zdGFuY2VvZiBieXx8ZSBpbnN0YW5jZW9mIHZ5fX07Y29uc3QgQ3k9e0ZFQVRVUkU6MCxWRVJURVg6MX0sWT17Qk9PTEVBTjowLElOVF84OjEsVUlOVF84OjIsSU5UXzMyOjMsVUlOVF8zMjo0LElOVF82NDo1LFVJTlRfNjQ6NixGTE9BVDo3LERPVUJMRTo4LFNUUklORzo5fSx3eT17R0VPTUVUUlk6MCxTVFJVQ1Q6MSxNQVA6Mn0sVHk9e0lEOjB9O3ZhciBFeT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnZhbHVlPWV9Z2V0KCl7cmV0dXJuIHRoaXMudmFsdWV9c2V0KGUpe3RoaXMudmFsdWU9ZX1pbmNyZW1lbnQoKXtyZXR1cm4gdGhpcy52YWx1ZSsrfWFkZChlKXt0aGlzLnZhbHVlKz1lfX0sWDsoZnVuY3Rpb24oZSl7ZS5OT05FPWBOT05FYCxlLkRFTFRBPWBERUxUQWAsZS5DT01QT05FTlRXSVNFX0RFTFRBPWBDT01QT05FTlRXSVNFX0RFTFRBYCxlLlJMRT1gUkxFYCxlLk1PUlRPTj1gTU9SVE9OYCxlLlBERT1gUERFYH0pKFh8fD17fSk7dmFyIER5OyhmdW5jdGlvbihlKXtlLk5PTkU9YE5PTkVgLGUuRkFTVF9QRk9SPWBGQVNUX1BGT1JgLGUuVkFSSU5UPWBWQVJJTlRgfSkoRHl8fD17fSk7Y29uc3QgT3k9bmV3IFVpbnQzMkFycmF5KDMzKTtPeVswXT0wO2ZvcihsZXQgZT0xO2U8PTMyO2UrKylPeVtlXT1lPT09MzI/NDI5NDk2NzI5NTo0Mjk0OTY3Mjk1Pj4+MzItZTtjb25zdCBreT1PeSxBeT02NTUzNjtmdW5jdGlvbiBqeShlLHQpe3JldHVybiBlLWUldH1mdW5jdGlvbiBNeShlKXtyZXR1cm4gankoZSszMSwzMil9ZnVuY3Rpb24gTnkoZSl7aWYoIU51bWJlci5pc0Zpbml0ZShlKXx8ZTw9MClyZXR1cm4gQXk7bGV0IHQ9ankoTWF0aC5mbG9vcihlKSwyNTYpO3JldHVybiB0PT09MD8yNTY6dH1mdW5jdGlvbiBQeShlKXtsZXQgdD1lPj4+MDtyZXR1cm4oKHQmMjU1KTw8MjR8KHQmNjUyODApPDw4fHQ+Pj44JjY1MjgwfHQ+Pj4yNCYyNTUpPj4+MH1mdW5jdGlvbiBGeShlLHQsbixyKXtsZXQgaT1yLGE9ZVt0XT4+PjAsbz1lW3QrMV0+Pj4wO25baSsrXT1hPj4+MCYzLG5baSsrXT1hPj4+MiYzLG5baSsrXT1hPj4+NCYzLG5baSsrXT1hPj4+NiYzLG5baSsrXT1hPj4+OCYzLG5baSsrXT1hPj4+MTAmMyxuW2krK109YT4+PjEyJjMsbltpKytdPWE+Pj4xNCYzLG5baSsrXT1hPj4+MTYmMyxuW2krK109YT4+PjE4JjMsbltpKytdPWE+Pj4yMCYzLG5baSsrXT1hPj4+MjImMyxuW2krK109YT4+PjI0JjMsbltpKytdPWE+Pj4yNiYzLG5baSsrXT1hPj4+MjgmMyxuW2krK109YT4+PjMwJjMsbltpKytdPW8+Pj4wJjMsbltpKytdPW8+Pj4yJjMsbltpKytdPW8+Pj40JjMsbltpKytdPW8+Pj42JjMsbltpKytdPW8+Pj44JjMsbltpKytdPW8+Pj4xMCYzLG5baSsrXT1vPj4+MTImMyxuW2krK109bz4+PjE0JjMsbltpKytdPW8+Pj4xNiYzLG5baSsrXT1vPj4+MTgmMyxuW2krK109bz4+PjIwJjMsbltpKytdPW8+Pj4yMiYzLG5baSsrXT1vPj4+MjQmMyxuW2krK109bz4+PjI2JjMsbltpKytdPW8+Pj4yOCYzLG5baV09bz4+PjMwJjN9ZnVuY3Rpb24gSXkoZSx0LG4scil7bGV0IGk9cixhPWVbdF0+Pj4wLG89ZVt0KzFdPj4+MCxzPWVbdCsyXT4+PjA7bltpKytdPWE+Pj4wJjcsbltpKytdPWE+Pj4zJjcsbltpKytdPWE+Pj42JjcsbltpKytdPWE+Pj45JjcsbltpKytdPWE+Pj4xMiY3LG5baSsrXT1hPj4+MTUmNyxuW2krK109YT4+PjE4JjcsbltpKytdPWE+Pj4yMSY3LG5baSsrXT1hPj4+MjQmNyxuW2krK109YT4+PjI3JjcsbltpKytdPShhPj4+MzB8KG8mMSk8PDIpJjcsbltpKytdPW8+Pj4xJjcsbltpKytdPW8+Pj40JjcsbltpKytdPW8+Pj43JjcsbltpKytdPW8+Pj4xMCY3LG5baSsrXT1vPj4+MTMmNyxuW2krK109bz4+PjE2JjcsbltpKytdPW8+Pj4xOSY3LG5baSsrXT1vPj4+MjImNyxuW2krK109bz4+PjI1JjcsbltpKytdPW8+Pj4yOCY3LG5baSsrXT0obz4+PjMxfChzJjMpPDwxKSY3LG5baSsrXT1zPj4+MiY3LG5baSsrXT1zPj4+NSY3LG5baSsrXT1zPj4+OCY3LG5baSsrXT1zPj4+MTEmNyxuW2krK109cz4+PjE0JjcsbltpKytdPXM+Pj4xNyY3LG5baSsrXT1zPj4+MjAmNyxuW2krK109cz4+PjIzJjcsbltpKytdPXM+Pj4yNiY3LG5baV09cz4+PjI5Jjd9ZnVuY3Rpb24gTHkoZSx0LG4scil7bGV0IGk9cixhPWVbdF0+Pj4wLG89ZVt0KzFdPj4+MCxzPWVbdCsyXT4+PjAsYz1lW3QrM10+Pj4wO25baSsrXT1hPj4+MCYxNSxuW2krK109YT4+PjQmMTUsbltpKytdPWE+Pj44JjE1LG5baSsrXT1hPj4+MTImMTUsbltpKytdPWE+Pj4xNiYxNSxuW2krK109YT4+PjIwJjE1LG5baSsrXT1hPj4+MjQmMTUsbltpKytdPWE+Pj4yOCYxNSxuW2krK109bz4+PjAmMTUsbltpKytdPW8+Pj40JjE1LG5baSsrXT1vPj4+OCYxNSxuW2krK109bz4+PjEyJjE1LG5baSsrXT1vPj4+MTYmMTUsbltpKytdPW8+Pj4yMCYxNSxuW2krK109bz4+PjI0JjE1LG5baSsrXT1vPj4+MjgmMTUsbltpKytdPXM+Pj4wJjE1LG5baSsrXT1zPj4+NCYxNSxuW2krK109cz4+PjgmMTUsbltpKytdPXM+Pj4xMiYxNSxuW2krK109cz4+PjE2JjE1LG5baSsrXT1zPj4+MjAmMTUsbltpKytdPXM+Pj4yNCYxNSxuW2krK109cz4+PjI4JjE1LG5baSsrXT1jPj4+MCYxNSxuW2krK109Yz4+PjQmMTUsbltpKytdPWM+Pj44JjE1LG5baSsrXT1jPj4+MTImMTUsbltpKytdPWM+Pj4xNiYxNSxuW2krK109Yz4+PjIwJjE1LG5baSsrXT1jPj4+MjQmMTUsbltpXT1jPj4+MjgmMTV9ZnVuY3Rpb24gUnkoZSx0LG4scil7bGV0IGk9cixhPWVbdF0+Pj4wLG89ZVt0KzFdPj4+MCxzPWVbdCsyXT4+PjAsYz1lW3QrM10+Pj4wLGw9ZVt0KzRdPj4+MDtuW2krK109YT4+PjAmMzEsbltpKytdPWE+Pj41JjMxLG5baSsrXT1hPj4+MTAmMzEsbltpKytdPWE+Pj4xNSYzMSxuW2krK109YT4+PjIwJjMxLG5baSsrXT1hPj4+MjUmMzEsbltpKytdPShhPj4+MzB8KG8mNyk8PDIpJjMxLG5baSsrXT1vPj4+MyYzMSxuW2krK109bz4+PjgmMzEsbltpKytdPW8+Pj4xMyYzMSxuW2krK109bz4+PjE4JjMxLG5baSsrXT1vPj4+MjMmMzEsbltpKytdPShvPj4+Mjh8KHMmMSk8PDQpJjMxLG5baSsrXT1zPj4+MSYzMSxuW2krK109cz4+PjYmMzEsbltpKytdPXM+Pj4xMSYzMSxuW2krK109cz4+PjE2JjMxLG5baSsrXT1zPj4+MjEmMzEsbltpKytdPXM+Pj4yNiYzMSxuW2krK109KHM+Pj4zMXwoYyYxNSk8PDEpJjMxLG5baSsrXT1jPj4+NCYzMSxuW2krK109Yz4+PjkmMzEsbltpKytdPWM+Pj4xNCYzMSxuW2krK109Yz4+PjE5JjMxLG5baSsrXT1jPj4+MjQmMzEsbltpKytdPShjPj4+Mjl8KGwmMyk8PDMpJjMxLG5baSsrXT1sPj4+MiYzMSxuW2krK109bD4+PjcmMzEsbltpKytdPWw+Pj4xMiYzMSxuW2krK109bD4+PjE3JjMxLG5baSsrXT1sPj4+MjImMzEsbltpXT1sPj4+MjcmMzF9ZnVuY3Rpb24genkoZSx0LG4scil7bGV0IGk9cixhPWVbdF0+Pj4wLG89ZVt0KzFdPj4+MCxzPWVbdCsyXT4+PjAsYz1lW3QrM10+Pj4wLGw9ZVt0KzRdPj4+MCx1PWVbdCs1XT4+PjA7bltpKytdPWE+Pj4wJjYzLG5baSsrXT1hPj4+NiY2MyxuW2krK109YT4+PjEyJjYzLG5baSsrXT1hPj4+MTgmNjMsbltpKytdPWE+Pj4yNCY2MyxuW2krK109KGE+Pj4zMHwobyYxNSk8PDIpJjYzLG5baSsrXT1vPj4+NCY2MyxuW2krK109bz4+PjEwJjYzLG5baSsrXT1vPj4+MTYmNjMsbltpKytdPW8+Pj4yMiY2MyxuW2krK109KG8+Pj4yOHwocyYzKTw8NCkmNjMsbltpKytdPXM+Pj4yJjYzLG5baSsrXT1zPj4+OCY2MyxuW2krK109cz4+PjE0JjYzLG5baSsrXT1zPj4+MjAmNjMsbltpKytdPXM+Pj4yNiY2MyxuW2krK109Yz4+PjAmNjMsbltpKytdPWM+Pj42JjYzLG5baSsrXT1jPj4+MTImNjMsbltpKytdPWM+Pj4xOCY2MyxuW2krK109Yz4+PjI0JjYzLG5baSsrXT0oYz4+PjMwfChsJjE1KTw8MikmNjMsbltpKytdPWw+Pj40JjYzLG5baSsrXT1sPj4+MTAmNjMsbltpKytdPWw+Pj4xNiY2MyxuW2krK109bD4+PjIyJjYzLG5baSsrXT0obD4+PjI4fCh1JjMpPDw0KSY2MyxuW2krK109dT4+PjImNjMsbltpKytdPXU+Pj44JjYzLG5baSsrXT11Pj4+MTQmNjMsbltpKytdPXU+Pj4yMCY2MyxuW2ldPXU+Pj4yNiY2M31mdW5jdGlvbiBCeShlLHQsbixyKXtsZXQgaT1yLGE9ZVt0XT4+PjAsbz1lW3QrMV0+Pj4wLHM9ZVt0KzJdPj4+MCxjPWVbdCszXT4+PjAsbD1lW3QrNF0+Pj4wLHU9ZVt0KzVdPj4+MCxkPWVbdCs2XT4+PjA7bltpKytdPWE+Pj4wJjEyNyxuW2krK109YT4+PjcmMTI3LG5baSsrXT1hPj4+MTQmMTI3LG5baSsrXT1hPj4+MjEmMTI3LG5baSsrXT0oYT4+PjI4fChvJjcpPDw0KSYxMjcsbltpKytdPW8+Pj4zJjEyNyxuW2krK109bz4+PjEwJjEyNyxuW2krK109bz4+PjE3JjEyNyxuW2krK109bz4+PjI0JjEyNyxuW2krK109KG8+Pj4zMXwocyY2Myk8PDEpJjEyNyxuW2krK109cz4+PjYmMTI3LG5baSsrXT1zPj4+MTMmMTI3LG5baSsrXT1zPj4+MjAmMTI3LG5baSsrXT0ocz4+PjI3fChjJjMpPDw1KSYxMjcsbltpKytdPWM+Pj4yJjEyNyxuW2krK109Yz4+PjkmMTI3LG5baSsrXT1jPj4+MTYmMTI3LG5baSsrXT1jPj4+MjMmMTI3LG5baSsrXT0oYz4+PjMwfChsJjMxKTw8MikmMTI3LG5baSsrXT1sPj4+NSYxMjcsbltpKytdPWw+Pj4xMiYxMjcsbltpKytdPWw+Pj4xOSYxMjcsbltpKytdPShsPj4+MjZ8KHUmMSk8PDYpJjEyNyxuW2krK109dT4+PjEmMTI3LG5baSsrXT11Pj4+OCYxMjcsbltpKytdPXU+Pj4xNSYxMjcsbltpKytdPXU+Pj4yMiYxMjcsbltpKytdPSh1Pj4+Mjl8KGQmMTUpPDwzKSYxMjcsbltpKytdPWQ+Pj40JjEyNyxuW2krK109ZD4+PjExJjEyNyxuW2krK109ZD4+PjE4JjEyNyxuW2ldPWQ+Pj4yNSYxMjd9ZnVuY3Rpb24gVnkoZSx0LG4scil7bGV0IGk9cixhPWVbdF0+Pj4wLG89ZVt0KzFdPj4+MCxzPWVbdCsyXT4+PjAsYz1lW3QrM10+Pj4wLGw9ZVt0KzRdPj4+MCx1PWVbdCs1XT4+PjAsZD1lW3QrNl0+Pj4wLGY9ZVt0KzddPj4+MDtuW2krK109YT4+PjAmMjU1LG5baSsrXT1hPj4+OCYyNTUsbltpKytdPWE+Pj4xNiYyNTUsbltpKytdPWE+Pj4yNCYyNTUsbltpKytdPW8+Pj4wJjI1NSxuW2krK109bz4+PjgmMjU1LG5baSsrXT1vPj4+MTYmMjU1LG5baSsrXT1vPj4+MjQmMjU1LG5baSsrXT1zPj4+MCYyNTUsbltpKytdPXM+Pj44JjI1NSxuW2krK109cz4+PjE2JjI1NSxuW2krK109cz4+PjI0JjI1NSxuW2krK109Yz4+PjAmMjU1LG5baSsrXT1jPj4+OCYyNTUsbltpKytdPWM+Pj4xNiYyNTUsbltpKytdPWM+Pj4yNCYyNTUsbltpKytdPWw+Pj4wJjI1NSxuW2krK109bD4+PjgmMjU1LG5baSsrXT1sPj4+MTYmMjU1LG5baSsrXT1sPj4+MjQmMjU1LG5baSsrXT11Pj4+MCYyNTUsbltpKytdPXU+Pj44JjI1NSxuW2krK109dT4+PjE2JjI1NSxuW2krK109dT4+PjI0JjI1NSxuW2krK109ZD4+PjAmMjU1LG5baSsrXT1kPj4+OCYyNTUsbltpKytdPWQ+Pj4xNiYyNTUsbltpKytdPWQ+Pj4yNCYyNTUsbltpKytdPWY+Pj4wJjI1NSxuW2krK109Zj4+PjgmMjU1LG5baSsrXT1mPj4+MTYmMjU1LG5baV09Zj4+PjI0JjI1NX1mdW5jdGlvbiBIeShlLHQsbixyKXtsZXQgaT1yLGE9ZVt0XT4+PjAsbz1lW3QrMV0+Pj4wLHM9ZVt0KzJdPj4+MCxjPWVbdCszXT4+PjAsbD1lW3QrNF0+Pj4wLHU9ZVt0KzVdPj4+MCxkPWVbdCs2XT4+PjAsZj1lW3QrN10+Pj4wLHA9ZVt0KzhdPj4+MDtuW2krK109YT4+PjAmNTExLG5baSsrXT1hPj4+OSY1MTEsbltpKytdPWE+Pj4xOCY1MTEsbltpKytdPShhPj4+Mjd8KG8mMTUpPDw1KSY1MTEsbltpKytdPW8+Pj40JjUxMSxuW2krK109bz4+PjEzJjUxMSxuW2krK109bz4+PjIyJjUxMSxuW2krK109KG8+Pj4zMXwocyYyNTUpPDwxKSY1MTEsbltpKytdPXM+Pj44JjUxMSxuW2krK109cz4+PjE3JjUxMSxuW2krK109KHM+Pj4yNnwoYyY3KTw8NikmNTExLG5baSsrXT1jPj4+MyY1MTEsbltpKytdPWM+Pj4xMiY1MTEsbltpKytdPWM+Pj4yMSY1MTEsbltpKytdPShjPj4+MzB8KGwmMTI3KTw8MikmNTExLG5baSsrXT1sPj4+NyY1MTEsbltpKytdPWw+Pj4xNiY1MTEsbltpKytdPShsPj4+MjV8KHUmMyk8PDcpJjUxMSxuW2krK109dT4+PjImNTExLG5baSsrXT11Pj4+MTEmNTExLG5baSsrXT11Pj4+MjAmNTExLG5baSsrXT0odT4+PjI5fChkJjYzKTw8MykmNTExLG5baSsrXT1kPj4+NiY1MTEsbltpKytdPWQ+Pj4xNSY1MTEsbltpKytdPShkPj4+MjR8KGYmMSk8PDgpJjUxMSxuW2krK109Zj4+PjEmNTExLG5baSsrXT1mPj4+MTAmNTExLG5baSsrXT1mPj4+MTkmNTExLG5baSsrXT0oZj4+PjI4fChwJjMxKTw8NCkmNTExLG5baSsrXT1wPj4+NSY1MTEsbltpKytdPXA+Pj4xNCY1MTEsbltpXT1wPj4+MjMmNTExfWZ1bmN0aW9uIFV5KGUsdCxuLHIpe2xldCBpPXIsYT1lW3RdPj4+MCxvPWVbdCsxXT4+PjAscz1lW3QrMl0+Pj4wLGM9ZVt0KzNdPj4+MCxsPWVbdCs0XT4+PjAsdT1lW3QrNV0+Pj4wLGQ9ZVt0KzZdPj4+MCxmPWVbdCs3XT4+PjAscD1lW3QrOF0+Pj4wLG09ZVt0KzldPj4+MDtuW2krK109YT4+PjAmMTAyMyxuW2krK109YT4+PjEwJjEwMjMsbltpKytdPWE+Pj4yMCYxMDIzLG5baSsrXT0oYT4+PjMwfChvJjI1NSk8PDIpJjEwMjMsbltpKytdPW8+Pj44JjEwMjMsbltpKytdPW8+Pj4xOCYxMDIzLG5baSsrXT0obz4+PjI4fChzJjYzKTw8NCkmMTAyMyxuW2krK109cz4+PjYmMTAyMyxuW2krK109cz4+PjE2JjEwMjMsbltpKytdPShzPj4+MjZ8KGMmMTUpPDw2KSYxMDIzLG5baSsrXT1jPj4+NCYxMDIzLG5baSsrXT1jPj4+MTQmMTAyMyxuW2krK109KGM+Pj4yNHwobCYzKTw8OCkmMTAyMyxuW2krK109bD4+PjImMTAyMyxuW2krK109bD4+PjEyJjEwMjMsbltpKytdPWw+Pj4yMiYxMDIzLG5baSsrXT11Pj4+MCYxMDIzLG5baSsrXT11Pj4+MTAmMTAyMyxuW2krK109dT4+PjIwJjEwMjMsbltpKytdPSh1Pj4+MzB8KGQmMjU1KTw8MikmMTAyMyxuW2krK109ZD4+PjgmMTAyMyxuW2krK109ZD4+PjE4JjEwMjMsbltpKytdPShkPj4+Mjh8KGYmNjMpPDw0KSYxMDIzLG5baSsrXT1mPj4+NiYxMDIzLG5baSsrXT1mPj4+MTYmMTAyMyxuW2krK109KGY+Pj4yNnwocCYxNSk8PDYpJjEwMjMsbltpKytdPXA+Pj40JjEwMjMsbltpKytdPXA+Pj4xNCYxMDIzLG5baSsrXT0ocD4+PjI0fChtJjMpPDw4KSYxMDIzLG5baSsrXT1tPj4+MiYxMDIzLG5baSsrXT1tPj4+MTImMTAyMyxuW2ldPW0+Pj4yMiYxMDIzfWZ1bmN0aW9uIFd5KGUsdCxuLHIpe2xldCBpPXIsYT1lW3RdPj4+MCxvPWVbdCsxXT4+PjAscz1lW3QrMl0+Pj4wLGM9ZVt0KzNdPj4+MCxsPWVbdCs0XT4+PjAsdT1lW3QrNV0+Pj4wLGQ9ZVt0KzZdPj4+MCxmPWVbdCs3XT4+PjAscD1lW3QrOF0+Pj4wLG09ZVt0KzldPj4+MCxoPWVbdCsxMF0+Pj4wO25baSsrXT1hPj4+MCYyMDQ3LG5baSsrXT1hPj4+MTEmMjA0NyxuW2krK109KGE+Pj4yMnwobyYxKTw8MTApJjIwNDcsbltpKytdPW8+Pj4xJjIwNDcsbltpKytdPW8+Pj4xMiYyMDQ3LG5baSsrXT0obz4+PjIzfChzJjMpPDw5KSYyMDQ3LG5baSsrXT1zPj4+MiYyMDQ3LG5baSsrXT1zPj4+MTMmMjA0NyxuW2krK109KHM+Pj4yNHwoYyY3KTw8OCkmMjA0NyxuW2krK109Yz4+PjMmMjA0NyxuW2krK109Yz4+PjE0JjIwNDcsbltpKytdPShjPj4+MjV8KGwmMTUpPDw3KSYyMDQ3LG5baSsrXT1sPj4+NCYyMDQ3LG5baSsrXT1sPj4+MTUmMjA0NyxuW2krK109KGw+Pj4yNnwodSYzMSk8PDYpJjIwNDcsbltpKytdPXU+Pj41JjIwNDcsbltpKytdPXU+Pj4xNiYyMDQ3LG5baSsrXT0odT4+PjI3fChkJjYzKTw8NSkmMjA0NyxuW2krK109ZD4+PjYmMjA0NyxuW2krK109ZD4+PjE3JjIwNDcsbltpKytdPShkPj4+Mjh8KGYmMTI3KTw8NCkmMjA0NyxuW2krK109Zj4+PjcmMjA0NyxuW2krK109Zj4+PjE4JjIwNDcsbltpKytdPShmPj4+Mjl8KHAmMjU1KTw8MykmMjA0NyxuW2krK109cD4+PjgmMjA0NyxuW2krK109cD4+PjE5JjIwNDcsbltpKytdPShwPj4+MzB8KG0mNTExKTw8MikmMjA0NyxuW2krK109bT4+PjkmMjA0NyxuW2krK109bT4+PjIwJjIwNDcsbltpKytdPShtPj4+MzF8KGgmMTAyMyk8PDEpJjIwNDcsbltpKytdPWg+Pj4xMCYyMDQ3LG5baV09aD4+PjIxJjIwNDd9ZnVuY3Rpb24gR3koZSx0LG4scil7bGV0IGk9cixhPWVbdF0+Pj4wLG89ZVt0KzFdPj4+MCxzPWVbdCsyXT4+PjAsYz1lW3QrM10+Pj4wLGw9ZVt0KzRdPj4+MCx1PWVbdCs1XT4+PjAsZD1lW3QrNl0+Pj4wLGY9ZVt0KzddPj4+MCxwPWVbdCs4XT4+PjAsbT1lW3QrOV0+Pj4wLGg9ZVt0KzEwXT4+PjAsZz1lW3QrMTFdPj4+MDtuW2krK109YT4+PjAmNDA5NSxuW2krK109YT4+PjEyJjQwOTUsbltpKytdPShhPj4+MjR8KG8mMTUpPDw4KSY0MDk1LG5baSsrXT1vPj4+NCY0MDk1LG5baSsrXT1vPj4+MTYmNDA5NSxuW2krK109KG8+Pj4yOHwocyYyNTUpPDw0KSY0MDk1LG5baSsrXT1zPj4+OCY0MDk1LG5baSsrXT1zPj4+MjAmNDA5NSxuW2krK109Yz4+PjAmNDA5NSxuW2krK109Yz4+PjEyJjQwOTUsbltpKytdPShjPj4+MjR8KGwmMTUpPDw4KSY0MDk1LG5baSsrXT1sPj4+NCY0MDk1LG5baSsrXT1sPj4+MTYmNDA5NSxuW2krK109KGw+Pj4yOHwodSYyNTUpPDw0KSY0MDk1LG5baSsrXT11Pj4+OCY0MDk1LG5baSsrXT11Pj4+MjAmNDA5NSxuW2krK109ZD4+PjAmNDA5NSxuW2krK109ZD4+PjEyJjQwOTUsbltpKytdPShkPj4+MjR8KGYmMTUpPDw4KSY0MDk1LG5baSsrXT1mPj4+NCY0MDk1LG5baSsrXT1mPj4+MTYmNDA5NSxuW2krK109KGY+Pj4yOHwocCYyNTUpPDw0KSY0MDk1LG5baSsrXT1wPj4+OCY0MDk1LG5baSsrXT1wPj4+MjAmNDA5NSxuW2krK109bT4+PjAmNDA5NSxuW2krK109bT4+PjEyJjQwOTUsbltpKytdPShtPj4+MjR8KGgmMTUpPDw4KSY0MDk1LG5baSsrXT1oPj4+NCY0MDk1LG5baSsrXT1oPj4+MTYmNDA5NSxuW2krK109KGg+Pj4yOHwoZyYyNTUpPDw0KSY0MDk1LG5baSsrXT1nPj4+OCY0MDk1LG5baV09Zz4+PjIwJjQwOTV9ZnVuY3Rpb24gS3koZSx0LG4scil7bGV0IGk9cixhPWVbdF0+Pj4wLG89ZVt0KzFdPj4+MCxzPWVbdCsyXT4+PjAsYz1lW3QrM10+Pj4wLGw9ZVt0KzRdPj4+MCx1PWVbdCs1XT4+PjAsZD1lW3QrNl0+Pj4wLGY9ZVt0KzddPj4+MCxwPWVbdCs4XT4+PjAsbT1lW3QrOV0+Pj4wLGg9ZVt0KzEwXT4+PjAsZz1lW3QrMTFdPj4+MCxfPWVbdCsxMl0+Pj4wLHY9ZVt0KzEzXT4+PjAseT1lW3QrMTRdPj4+MCxiPWVbdCsxNV0+Pj4wO25baSsrXT1hPj4+MCY2NTUzNSxuW2krK109YT4+PjE2JjY1NTM1LG5baSsrXT1vPj4+MCY2NTUzNSxuW2krK109bz4+PjE2JjY1NTM1LG5baSsrXT1zPj4+MCY2NTUzNSxuW2krK109cz4+PjE2JjY1NTM1LG5baSsrXT1jPj4+MCY2NTUzNSxuW2krK109Yz4+PjE2JjY1NTM1LG5baSsrXT1sPj4+MCY2NTUzNSxuW2krK109bD4+PjE2JjY1NTM1LG5baSsrXT11Pj4+MCY2NTUzNSxuW2krK109dT4+PjE2JjY1NTM1LG5baSsrXT1kPj4+MCY2NTUzNSxuW2krK109ZD4+PjE2JjY1NTM1LG5baSsrXT1mPj4+MCY2NTUzNSxuW2krK109Zj4+PjE2JjY1NTM1LG5baSsrXT1wPj4+MCY2NTUzNSxuW2krK109cD4+PjE2JjY1NTM1LG5baSsrXT1tPj4+MCY2NTUzNSxuW2krK109bT4+PjE2JjY1NTM1LG5baSsrXT1oPj4+MCY2NTUzNSxuW2krK109aD4+PjE2JjY1NTM1LG5baSsrXT1nPj4+MCY2NTUzNSxuW2krK109Zz4+PjE2JjY1NTM1LG5baSsrXT1fPj4+MCY2NTUzNSxuW2krK109Xz4+PjE2JjY1NTM1LG5baSsrXT12Pj4+MCY2NTUzNSxuW2krK109dj4+PjE2JjY1NTM1LG5baSsrXT15Pj4+MCY2NTUzNSxuW2krK109eT4+PjE2JjY1NTM1LG5baSsrXT1iPj4+MCY2NTUzNSxuW2ldPWI+Pj4xNiY2NTUzNX1mdW5jdGlvbiBxeShlLHQsbixyKXtsZXQgaT1yLGE9dDtmb3IobGV0IHQ9MDt0PDg7dCsrKXtsZXQgdD1lW2ErK10+Pj4wO25baSsrXT10Pj4+MCYxLG5baSsrXT10Pj4+MSYxLG5baSsrXT10Pj4+MiYxLG5baSsrXT10Pj4+MyYxLG5baSsrXT10Pj4+NCYxLG5baSsrXT10Pj4+NSYxLG5baSsrXT10Pj4+NiYxLG5baSsrXT10Pj4+NyYxLG5baSsrXT10Pj4+OCYxLG5baSsrXT10Pj4+OSYxLG5baSsrXT10Pj4+MTAmMSxuW2krK109dD4+PjExJjEsbltpKytdPXQ+Pj4xMiYxLG5baSsrXT10Pj4+MTMmMSxuW2krK109dD4+PjE0JjEsbltpKytdPXQ+Pj4xNSYxLG5baSsrXT10Pj4+MTYmMSxuW2krK109dD4+PjE3JjEsbltpKytdPXQ+Pj4xOCYxLG5baSsrXT10Pj4+MTkmMSxuW2krK109dD4+PjIwJjEsbltpKytdPXQ+Pj4yMSYxLG5baSsrXT10Pj4+MjImMSxuW2krK109dD4+PjIzJjEsbltpKytdPXQ+Pj4yNCYxLG5baSsrXT10Pj4+MjUmMSxuW2krK109dD4+PjI2JjEsbltpKytdPXQ+Pj4yNyYxLG5baSsrXT10Pj4+MjgmMSxuW2krK109dD4+PjI5JjEsbltpKytdPXQ+Pj4zMCYxLG5baSsrXT10Pj4+MzEmMX19ZnVuY3Rpb24gSnkoZSx0LG4scil7bGV0IGk9cixhPXQ7Zm9yKGxldCB0PTA7dDw4O3QrKyl7bGV0IHQ9ZVthKytdPj4+MCxyPWVbYSsrXT4+PjA7bltpKytdPXQ+Pj4wJjMsbltpKytdPXQ+Pj4yJjMsbltpKytdPXQ+Pj40JjMsbltpKytdPXQ+Pj42JjMsbltpKytdPXQ+Pj44JjMsbltpKytdPXQ+Pj4xMCYzLG5baSsrXT10Pj4+MTImMyxuW2krK109dD4+PjE0JjMsbltpKytdPXQ+Pj4xNiYzLG5baSsrXT10Pj4+MTgmMyxuW2krK109dD4+PjIwJjMsbltpKytdPXQ+Pj4yMiYzLG5baSsrXT10Pj4+MjQmMyxuW2krK109dD4+PjI2JjMsbltpKytdPXQ+Pj4yOCYzLG5baSsrXT10Pj4+MzAmMyxuW2krK109cj4+PjAmMyxuW2krK109cj4+PjImMyxuW2krK109cj4+PjQmMyxuW2krK109cj4+PjYmMyxuW2krK109cj4+PjgmMyxuW2krK109cj4+PjEwJjMsbltpKytdPXI+Pj4xMiYzLG5baSsrXT1yPj4+MTQmMyxuW2krK109cj4+PjE2JjMsbltpKytdPXI+Pj4xOCYzLG5baSsrXT1yPj4+MjAmMyxuW2krK109cj4+PjIyJjMsbltpKytdPXI+Pj4yNCYzLG5baSsrXT1yPj4+MjYmMyxuW2krK109cj4+PjI4JjMsbltpKytdPXI+Pj4zMCYzfX1mdW5jdGlvbiBZeShlLHQsbixyKXtsZXQgaT1yLGE9dDtmb3IobGV0IHQ9MDt0PDg7dCsrKXtsZXQgdD1lW2ErK10+Pj4wLHI9ZVthKytdPj4+MCxvPWVbYSsrXT4+PjA7bltpKytdPXQ+Pj4wJjcsbltpKytdPXQ+Pj4zJjcsbltpKytdPXQ+Pj42JjcsbltpKytdPXQ+Pj45JjcsbltpKytdPXQ+Pj4xMiY3LG5baSsrXT10Pj4+MTUmNyxuW2krK109dD4+PjE4JjcsbltpKytdPXQ+Pj4yMSY3LG5baSsrXT10Pj4+MjQmNyxuW2krK109dD4+PjI3JjcsbltpKytdPSh0Pj4+MzB8KHImMSk8PDIpJjcsbltpKytdPXI+Pj4xJjcsbltpKytdPXI+Pj40JjcsbltpKytdPXI+Pj43JjcsbltpKytdPXI+Pj4xMCY3LG5baSsrXT1yPj4+MTMmNyxuW2krK109cj4+PjE2JjcsbltpKytdPXI+Pj4xOSY3LG5baSsrXT1yPj4+MjImNyxuW2krK109cj4+PjI1JjcsbltpKytdPXI+Pj4yOCY3LG5baSsrXT0ocj4+PjMxfChvJjMpPDwxKSY3LG5baSsrXT1vPj4+MiY3LG5baSsrXT1vPj4+NSY3LG5baSsrXT1vPj4+OCY3LG5baSsrXT1vPj4+MTEmNyxuW2krK109bz4+PjE0JjcsbltpKytdPW8+Pj4xNyY3LG5baSsrXT1vPj4+MjAmNyxuW2krK109bz4+PjIzJjcsbltpKytdPW8+Pj4yNiY3LG5baSsrXT1vPj4+MjkmN319ZnVuY3Rpb24gWHkoZSx0LG4scil7bGV0IGk9cixhPXQ7Zm9yKGxldCB0PTA7dDw4O3QrKyl7bGV0IHQ9ZVthKytdPj4+MCxyPWVbYSsrXT4+PjAsbz1lW2ErK10+Pj4wLHM9ZVthKytdPj4+MDtuW2krK109dD4+PjAmMTUsbltpKytdPXQ+Pj40JjE1LG5baSsrXT10Pj4+OCYxNSxuW2krK109dD4+PjEyJjE1LG5baSsrXT10Pj4+MTYmMTUsbltpKytdPXQ+Pj4yMCYxNSxuW2krK109dD4+PjI0JjE1LG5baSsrXT10Pj4+MjgmMTUsbltpKytdPXI+Pj4wJjE1LG5baSsrXT1yPj4+NCYxNSxuW2krK109cj4+PjgmMTUsbltpKytdPXI+Pj4xMiYxNSxuW2krK109cj4+PjE2JjE1LG5baSsrXT1yPj4+MjAmMTUsbltpKytdPXI+Pj4yNCYxNSxuW2krK109cj4+PjI4JjE1LG5baSsrXT1vPj4+MCYxNSxuW2krK109bz4+PjQmMTUsbltpKytdPW8+Pj44JjE1LG5baSsrXT1vPj4+MTImMTUsbltpKytdPW8+Pj4xNiYxNSxuW2krK109bz4+PjIwJjE1LG5baSsrXT1vPj4+MjQmMTUsbltpKytdPW8+Pj4yOCYxNSxuW2krK109cz4+PjAmMTUsbltpKytdPXM+Pj40JjE1LG5baSsrXT1zPj4+OCYxNSxuW2krK109cz4+PjEyJjE1LG5baSsrXT1zPj4+MTYmMTUsbltpKytdPXM+Pj4yMCYxNSxuW2krK109cz4+PjI0JjE1LG5baSsrXT1zPj4+MjgmMTV9fWZ1bmN0aW9uIFp5KGUsdCxuLHIpe2xldCBpPXIsYT10O2ZvcihsZXQgdD0wO3Q8ODt0Kyspe2xldCB0PWVbYSsrXT4+PjAscj1lW2ErK10+Pj4wLG89ZVthKytdPj4+MCxzPWVbYSsrXT4+PjAsYz1lW2ErK10+Pj4wO25baSsrXT10Pj4+MCYzMSxuW2krK109dD4+PjUmMzEsbltpKytdPXQ+Pj4xMCYzMSxuW2krK109dD4+PjE1JjMxLG5baSsrXT10Pj4+MjAmMzEsbltpKytdPXQ+Pj4yNSYzMSxuW2krK109KHQ+Pj4zMHwociY3KTw8MikmMzEsbltpKytdPXI+Pj4zJjMxLG5baSsrXT1yPj4+OCYzMSxuW2krK109cj4+PjEzJjMxLG5baSsrXT1yPj4+MTgmMzEsbltpKytdPXI+Pj4yMyYzMSxuW2krK109KHI+Pj4yOHwobyYxKTw8NCkmMzEsbltpKytdPW8+Pj4xJjMxLG5baSsrXT1vPj4+NiYzMSxuW2krK109bz4+PjExJjMxLG5baSsrXT1vPj4+MTYmMzEsbltpKytdPW8+Pj4yMSYzMSxuW2krK109bz4+PjI2JjMxLG5baSsrXT0obz4+PjMxfChzJjE1KTw8MSkmMzEsbltpKytdPXM+Pj40JjMxLG5baSsrXT1zPj4+OSYzMSxuW2krK109cz4+PjE0JjMxLG5baSsrXT1zPj4+MTkmMzEsbltpKytdPXM+Pj4yNCYzMSxuW2krK109KHM+Pj4yOXwoYyYzKTw8MykmMzEsbltpKytdPWM+Pj4yJjMxLG5baSsrXT1jPj4+NyYzMSxuW2krK109Yz4+PjEyJjMxLG5baSsrXT1jPj4+MTcmMzEsbltpKytdPWM+Pj4yMiYzMSxuW2krK109Yz4+PjI3JjMxfX1mdW5jdGlvbiBReShlLHQsbixyKXtsZXQgaT1yLGE9dDtmb3IobGV0IHQ9MDt0PDg7dCsrKXtsZXQgdD1lW2ErK10+Pj4wLHI9ZVthKytdPj4+MCxvPWVbYSsrXT4+PjAscz1lW2ErK10+Pj4wLGM9ZVthKytdPj4+MCxsPWVbYSsrXT4+PjA7bltpKytdPXQ+Pj4wJjYzLG5baSsrXT10Pj4+NiY2MyxuW2krK109dD4+PjEyJjYzLG5baSsrXT10Pj4+MTgmNjMsbltpKytdPXQ+Pj4yNCY2MyxuW2krK109KHQ+Pj4zMHwociYxNSk8PDIpJjYzLG5baSsrXT1yPj4+NCY2MyxuW2krK109cj4+PjEwJjYzLG5baSsrXT1yPj4+MTYmNjMsbltpKytdPXI+Pj4yMiY2MyxuW2krK109KHI+Pj4yOHwobyYzKTw8NCkmNjMsbltpKytdPW8+Pj4yJjYzLG5baSsrXT1vPj4+OCY2MyxuW2krK109bz4+PjE0JjYzLG5baSsrXT1vPj4+MjAmNjMsbltpKytdPW8+Pj4yNiY2MyxuW2krK109cz4+PjAmNjMsbltpKytdPXM+Pj42JjYzLG5baSsrXT1zPj4+MTImNjMsbltpKytdPXM+Pj4xOCY2MyxuW2krK109cz4+PjI0JjYzLG5baSsrXT0ocz4+PjMwfChjJjE1KTw8MikmNjMsbltpKytdPWM+Pj40JjYzLG5baSsrXT1jPj4+MTAmNjMsbltpKytdPWM+Pj4xNiY2MyxuW2krK109Yz4+PjIyJjYzLG5baSsrXT0oYz4+PjI4fChsJjMpPDw0KSY2MyxuW2krK109bD4+PjImNjMsbltpKytdPWw+Pj44JjYzLG5baSsrXT1sPj4+MTQmNjMsbltpKytdPWw+Pj4yMCY2MyxuW2krK109bD4+PjI2JjYzfX1mdW5jdGlvbiAkeShlLHQsbixyKXtsZXQgaT1yLGE9dDtmb3IobGV0IHQ9MDt0PDg7dCsrKXtsZXQgdD1lW2ErK10+Pj4wLHI9ZVthKytdPj4+MCxvPWVbYSsrXT4+PjAscz1lW2ErK10+Pj4wLGM9ZVthKytdPj4+MCxsPWVbYSsrXT4+PjAsdT1lW2ErK10+Pj4wO25baSsrXT10Pj4+MCYxMjcsbltpKytdPXQ+Pj43JjEyNyxuW2krK109dD4+PjE0JjEyNyxuW2krK109dD4+PjIxJjEyNyxuW2krK109KHQ+Pj4yOHwociY3KTw8NCkmMTI3LG5baSsrXT1yPj4+MyYxMjcsbltpKytdPXI+Pj4xMCYxMjcsbltpKytdPXI+Pj4xNyYxMjcsbltpKytdPXI+Pj4yNCYxMjcsbltpKytdPShyPj4+MzF8KG8mNjMpPDwxKSYxMjcsbltpKytdPW8+Pj42JjEyNyxuW2krK109bz4+PjEzJjEyNyxuW2krK109bz4+PjIwJjEyNyxuW2krK109KG8+Pj4yN3wocyYzKTw8NSkmMTI3LG5baSsrXT1zPj4+MiYxMjcsbltpKytdPXM+Pj45JjEyNyxuW2krK109cz4+PjE2JjEyNyxuW2krK109cz4+PjIzJjEyNyxuW2krK109KHM+Pj4zMHwoYyYzMSk8PDIpJjEyNyxuW2krK109Yz4+PjUmMTI3LG5baSsrXT1jPj4+MTImMTI3LG5baSsrXT1jPj4+MTkmMTI3LG5baSsrXT0oYz4+PjI2fChsJjEpPDw2KSYxMjcsbltpKytdPWw+Pj4xJjEyNyxuW2krK109bD4+PjgmMTI3LG5baSsrXT1sPj4+MTUmMTI3LG5baSsrXT1sPj4+MjImMTI3LG5baSsrXT0obD4+PjI5fCh1JjE1KTw8MykmMTI3LG5baSsrXT11Pj4+NCYxMjcsbltpKytdPXU+Pj4xMSYxMjcsbltpKytdPXU+Pj4xOCYxMjcsbltpKytdPXU+Pj4yNSYxMjd9fWZ1bmN0aW9uIGViKGUsdCxuLHIpe2xldCBpPXIsYT10O2ZvcihsZXQgdD0wO3Q8ODt0Kyspe2xldCB0PWVbYSsrXT4+PjAscj1lW2ErK10+Pj4wLG89ZVthKytdPj4+MCxzPWVbYSsrXT4+PjAsYz1lW2ErK10+Pj4wLGw9ZVthKytdPj4+MCx1PWVbYSsrXT4+PjAsZD1lW2ErK10+Pj4wO25baSsrXT10Pj4+MCYyNTUsbltpKytdPXQ+Pj44JjI1NSxuW2krK109dD4+PjE2JjI1NSxuW2krK109dD4+PjI0JjI1NSxuW2krK109cj4+PjAmMjU1LG5baSsrXT1yPj4+OCYyNTUsbltpKytdPXI+Pj4xNiYyNTUsbltpKytdPXI+Pj4yNCYyNTUsbltpKytdPW8+Pj4wJjI1NSxuW2krK109bz4+PjgmMjU1LG5baSsrXT1vPj4+MTYmMjU1LG5baSsrXT1vPj4+MjQmMjU1LG5baSsrXT1zPj4+MCYyNTUsbltpKytdPXM+Pj44JjI1NSxuW2krK109cz4+PjE2JjI1NSxuW2krK109cz4+PjI0JjI1NSxuW2krK109Yz4+PjAmMjU1LG5baSsrXT1jPj4+OCYyNTUsbltpKytdPWM+Pj4xNiYyNTUsbltpKytdPWM+Pj4yNCYyNTUsbltpKytdPWw+Pj4wJjI1NSxuW2krK109bD4+PjgmMjU1LG5baSsrXT1sPj4+MTYmMjU1LG5baSsrXT1sPj4+MjQmMjU1LG5baSsrXT11Pj4+MCYyNTUsbltpKytdPXU+Pj44JjI1NSxuW2krK109dT4+PjE2JjI1NSxuW2krK109dT4+PjI0JjI1NSxuW2krK109ZD4+PjAmMjU1LG5baSsrXT1kPj4+OCYyNTUsbltpKytdPWQ+Pj4xNiYyNTUsbltpKytdPWQ+Pj4yNCYyNTV9fWZ1bmN0aW9uIHRiKGUsdCxuLHIpe2xldCBpPXIsYT10O2ZvcihsZXQgdD0wO3Q8MTI4O3QrKyl7bGV0IHQ9ZVthKytdPj4+MDtuW2krK109dCY2NTUzNSxuW2krK109dD4+PjE2JjY1NTM1fX1mdW5jdGlvbiBuYihlLHQsbixyLGkpe2xldCBhPWt5W2ldPj4+MCxvPXQscz0wLGM9ZVtvXT4+PjAsbD1yO2ZvcihsZXQgdD0wO3Q8ODt0Kyspe2ZvcihsZXQgdD0wO3Q8MzI7dCsrKWlmKHMraTw9MzIpe2xldCByPWM+Pj5zJmE7bltsK3RdPXJ8MCxzKz1pLHM9PT0zMiYmKHM9MCxvKyssdCE9PTMxJiYoYz1lW29dPj4+MCkpfWVsc2V7bGV0IHI9MzItcyx1PWM+Pj5zO28rKyxjPWVbb10+Pj4wO2xldCBkPWktcixmPS0xPj4+MzItZD4+PjAscD0odXwoYyZmKTw8cikmYTtuW2wrdF09cHwwLHM9ZH1sKz0zMixzPTAsdDw3JiYoYz1lW29dPj4+MCl9fWNvbnN0IHJiPU55KEF5KSxpYj0zKnJiLzI1NityYnwwO2Z1bmN0aW9uIGFiKCl7bGV0IGU9bmV3IFVpbnQ4QXJyYXkoaWIpO3JldHVybntkYXRhVG9CZVBhY2tlZDpBcnJheSgzMyksZGF0YVBvaW50ZXJzOm5ldyBJbnQzMkFycmF5KDMzKSxieXRlQ29udGFpbmVyOmUsYnl0ZUNvbnRhaW5lckkzMjpuZXcgSW50MzJBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoPj4+MiksZXhjZXB0aW9uU2l6ZXM6bmV3IEludDMyQXJyYXkoMzMpfX1mdW5jdGlvbiBvYihlPTE2KXtpZihlPDApdGhyb3cgUmFuZ2VFcnJvcihgaW5pdGlhbEVuY29kZWRXb3JkQ2FwYWNpdHkgbXVzdCBiZSA+PSAwLCBnb3QgJHtlfWApO2xldCB0PU1hdGgubWF4KDE2LGV8MCk7cmV0dXJue2VuY29kZWRXb3JkczpuZXcgVWludDMyQXJyYXkodCksZGVjb2RlcldvcmtzcGFjZTphYigpfX1mdW5jdGlvbiBzYihlLHQpe2lmKHQ8PWUuZW5jb2RlZFdvcmRzLmxlbmd0aClyZXR1cm4gZS5lbmNvZGVkV29yZHM7bGV0IG49bmV3IFVpbnQzMkFycmF5KE1hdGgubWF4KDE2LHQqMikpO3JldHVybiBlLmVuY29kZWRXb3Jkcz1uLG59ZnVuY3Rpb24gY2IoZSx0LG4scil7ci5ieXRlQ29udGFpbmVyLmxlbmd0aDxuJiYoci5ieXRlQ29udGFpbmVyPW5ldyBVaW50OEFycmF5KG4qMiksci5ieXRlQ29udGFpbmVySTMyPXZvaWQgMCk7bGV0IGk9ci5ieXRlQ29udGFpbmVyLGE9bj4+PjI7aWYoaS5ieXRlT2Zmc2V0JjMpZm9yKGxldCBuPTA7bjxhO249bisxfDApe2xldCByPWVbdCtufDBdfDAsYT1uPDwyO2lbYV09ciYyNTUsaVthKzF8MF09cj4+PjgmMjU1LGlbYSsyfDBdPXI+Pj4xNiYyNTUsaVthKzN8MF09cj4+PjI0JjI1NX1lbHNle2xldCBuPXIuYnl0ZUNvbnRhaW5lckkzMjsoIW58fG4uYnVmZmVyIT09aS5idWZmZXJ8fG4uYnl0ZU9mZnNldCE9PWkuYnl0ZU9mZnNldHx8bi5sZW5ndGg8YSkmJihuPXIuYnl0ZUNvbnRhaW5lckkzMj1uZXcgSW50MzJBcnJheShpLmJ1ZmZlcixpLmJ5dGVPZmZzZXQsaS5ieXRlTGVuZ3RoPj4+MikpLG4uc2V0KGUuc3ViYXJyYXkodCx0K2EpKX1sZXQgbz1uJjM7aWYobz4wKXtsZXQgbj1lW3QrYXwwXXwwLHI9YTw8Mjtmb3IobGV0IGU9MDtlPG87ZT1lKzF8MClpW3IrZXwwXT1uPj4+KGU8PDMpJjI1NX1yZXR1cm4gaX1mdW5jdGlvbiBsYihlLHQsbil7bGV0IHI9ZVt0KytdfDAsaT1uLmRhdGFUb0JlUGFja2VkO2ZvcihsZXQgYT0yO2E8PTMyO2E9YSsxfDApe2lmKCEocj4+PmEtMSYxKSljb250aW51ZTtpZih0Pj1lLmxlbmd0aCl0aHJvdyBFcnJvcihgRmFzdFBGT1IgZGVjb2RlOiB0cnVuY2F0ZWQgZXhjZXB0aW9uIHN0cmVhbSBoZWFkZXIgKGJpdFdpZHRoPSR7YX0sIHN0cmVhbVdvcmRJbmRleD0ke3R9LCBuZWVkV29yZHM9MSwgYXZhaWxhYmxlV29yZHM9JHtlLmxlbmd0aC10fSwgZW5jb2RlZFdvcmRzPSR7ZS5sZW5ndGh9KWApO2xldCBvPWVbdCsrXT4+PjAscz1NeShvKSxjPW8qYSszMT4+PjU7aWYodCtjPmUubGVuZ3RoKXRocm93IEVycm9yKGBGYXN0UEZPUiBkZWNvZGU6IHRydW5jYXRlZCBleGNlcHRpb24gc3RyZWFtIChiaXRXaWR0aD0ke2F9LCBzaXplPSR7b30sIHN0cmVhbVdvcmRJbmRleD0ke3R9LCBuZWVkV29yZHM9JHtjfSwgYXZhaWxhYmxlV29yZHM9JHtlLmxlbmd0aC10fSwgZW5jb2RlZFdvcmRzPSR7ZS5sZW5ndGh9KWApO2xldCBsPWlbYV07KCFsfHxsLmxlbmd0aDxzKSYmKGw9aVthXT1uZXcgVWludDMyQXJyYXkocykpO2xldCB1PTA7Zm9yKDt1PG87dT11KzMyfDApeWIoZSx0LGwsdSxhKSx0PXQrYXwwO2xldCBkPXUtb3wwO3Q9dC0oZCphPj4+NSl8MCxuLmV4Y2VwdGlvblNpemVzW2FdPW99cmV0dXJuIHR9ZnVuY3Rpb24gdWIoZSx0LG4scixpKXtzd2l0Y2goaSl7Y2FzZSAxOnF5KGUsdCxuLHIpO2JyZWFrO2Nhc2UgMjpKeShlLHQsbixyKTticmVhaztjYXNlIDM6WXkoZSx0LG4scik7YnJlYWs7Y2FzZSA0Olh5KGUsdCxuLHIpO2JyZWFrO2Nhc2UgNTpaeShlLHQsbixyKTticmVhaztjYXNlIDY6UXkoZSx0LG4scik7YnJlYWs7Y2FzZSA3OiR5KGUsdCxuLHIpO2JyZWFrO2Nhc2UgODplYihlLHQsbixyKTticmVhaztjYXNlIDE2OnRiKGUsdCxuLHIpO2JyZWFrO2RlZmF1bHQ6bmIoZSx0LG4scixpKX1yZXR1cm4gdCsoaTw8Myl8MH1mdW5jdGlvbiBkYihlLHQsbixyKXtpZihuKzI+dCl0aHJvdyBFcnJvcihgRmFzdFBGT1IgZGVjb2RlOiBieXRlQ29udGFpbmVyIHVuZGVyZmxvdyBhdCBibG9jaz0ke3J9IChuZWVkIDIgYnl0ZXMgZm9yIFtiaXRXaWR0aCwgZXhjZXB0aW9uQ291bnRdLCBieXRlUG9zPSR7bn0sIGJ5dGVTaXplPSR7dH0pYCk7bGV0IGk9ZVtuKytdLGE9ZVtuKytdO2lmKGk+MzIpdGhyb3cgRXJyb3IoYEZhc3RQRk9SIGRlY29kZTogaW52YWxpZCBiaXRXaWR0aD0ke2l9IGF0IGJsb2NrPSR7cn0gKGV4cGVjdGVkIDAuLjMyKS4gVGhpcyBsaWtlbHkgaW5kaWNhdGVzIGNvcnJ1cHRlZCBvciB0cnVuY2F0ZWQgaW5wdXQuYCk7cmV0dXJue2JpdFdpZHRoOmksZXhjZXB0aW9uQ291bnQ6YSxieXRlUG9zSW46bn19ZnVuY3Rpb24gZmIoZSx0LG4scixpLGEpe2lmKG4rMT50KXRocm93IEVycm9yKGBGYXN0UEZPUiBkZWNvZGU6IGV4Y2VwdGlvbiBoZWFkZXIgdW5kZXJmbG93IGF0IGJsb2NrPSR7YX0gKG5lZWQgMSBieXRlIGZvciBtYXhCaXRzLCBieXRlUG9zPSR7bn0sIGJ5dGVTaXplPSR7dH0pYCk7bGV0IG89ZVtuKytdO2lmKG88cnx8bz4zMil0aHJvdyBFcnJvcihgRmFzdFBGT1IgZGVjb2RlOiBpbnZhbGlkIG1heEJpdHM9JHtvfSBhdCBibG9jaz0ke2F9IChiaXRXaWR0aD0ke3J9LCBleHBlY3RlZCAke3J9Li4zMilgKTtsZXQgcz1vLXJ8MDtpZihzPDF8fHM+MzIpdGhyb3cgRXJyb3IoYEZhc3RQRk9SIGRlY29kZTogaW52YWxpZCBleGNlcHRpb25CaXRXaWR0aD0ke3N9IGF0IGJsb2NrPSR7YX0gKGJpdFdpZHRoPSR7cn0sIG1heEJpdHM9JHtvfSlgKTtpZihuK2k+dCl0aHJvdyBFcnJvcihgRmFzdFBGT1IgZGVjb2RlOiBleGNlcHRpb24gcG9zaXRpb25zIHVuZGVyZmxvdyBhdCBibG9jaz0ke2F9IChuZWVkPSR7aX0sIGhhdmU9JHt0LW59KWApO3JldHVybnttYXhCaXRzOm8sZXhjZXB0aW9uQml0V2lkdGg6cyxieXRlUG9zSW46bn19ZnVuY3Rpb24gcGIoZSx0LG4scixpLGEsbyxzLGMpe2xldHttYXhCaXRzOmwsZXhjZXB0aW9uQml0V2lkdGg6dSxieXRlUG9zSW46ZH09ZmIoaSxhLG8sbixyLGMpO2lmKG89ZCx1PT09MSl7bGV0IGE9MTw8bjtmb3IobGV0IG49MDtuPHI7bj1uKzF8MCl7bGV0IG49aVtvKytdO2Vbbit0fDBdfD1hfXJldHVybiBvfWxldCBmPXMuZGF0YVRvQmVQYWNrZWRbdV07aWYoIWYpdGhyb3cgRXJyb3IoYEZhc3RQRk9SIGRlY29kZTogbWlzc2luZyBleGNlcHRpb24gc3RyZWFtIGZvciBleGNlcHRpb25CaXRXaWR0aD0ke3V9IChiaXRXaWR0aD0ke259LCBtYXhCaXRzPSR7bH0pIGF0IGJsb2NrICR7Y31gKTtsZXQgcD1zLmRhdGFQb2ludGVycyxtPXBbdV18MCxoPXMuZXhjZXB0aW9uU2l6ZXNbdV18MDtpZihtK3I+aCl0aHJvdyBFcnJvcihgRmFzdFBGT1IgZGVjb2RlOiBleGNlcHRpb24gc3RyZWFtIG92ZXJmbG93IGZvciBleGNlcHRpb25CaXRXaWR0aD0ke3V9IChwdHI9JHttfSwgbmVlZCAke3J9LCBzaXplPSR7aH0pIGF0IGJsb2NrICR7Y31gKTtmb3IobGV0IGE9MDthPHI7YT1hKzF8MCl7bGV0IHI9aVtvKytdLGE9ZlttKytdfDA7ZVtyK3R8MF18PWE8PG59cmV0dXJuIHBbdV09bSxvfWZ1bmN0aW9uIG1iKGUsdCxuLHIsaSxhLG8scyxjLGwpe2xldCB1PW58MCxkPTA7Zm9yKGxldCB0PTA7dDxvO3Q9dCsxfDApe2xldCBuPWRiKHMsYyxkLHQpO2Q9bi5ieXRlUG9zSW47bGV0IHI9bi5iaXRXaWR0aCxvPW4uZXhjZXB0aW9uQ291bnQsZj1hK3QqMjU2fDA7c3dpdGNoKHIpe2Nhc2UgMDppLmZpbGwoMCxmLGYrMjU2KTticmVhaztjYXNlIDMyOmZvcihsZXQgdD0wO3Q8MjU2O3Q9dCsxfDApaVtmK3R8MF09ZVt1K3R8MF18MDt1PXUrMjU2fDA7YnJlYWs7ZGVmYXVsdDp1PXViKGUsdSxpLGYscil9bz4wJiYoZD1wYihpLGYscixvLHMsYyxkLGwsdCkpfWlmKHUhPT1yKXRocm93IEVycm9yKGBGYXN0UEZPUiBkZWNvZGU6IHBhY2tlZCByZWdpb24gbWlzbWF0Y2ggKHBhZ2VTdGFydD0ke3R9LCBwYWNrZWRTdGFydD0ke259LCBjb25zdW1lZFBhY2tlZEVuZD0ke3V9LCBleHBlY3RlZFBhY2tlZEVuZD0ke3J9LCBwYWNrZWRXb3Jkcz0ke3Itbn0sIGVuY29kZWQubGVuZ3RoPSR7ZS5sZW5ndGh9KWApfWZ1bmN0aW9uIGhiKGUsdCxuLHIsaSxhKXtsZXQgbz1ufDAscz1lW29dfDA7aWYoczw9MHx8bytzPmUubGVuZ3RoLTEpdGhyb3cgRXJyb3IoYEZhc3RQRk9SIGRlY29kZTogaW52YWxpZCB3aGVyZU1ldGE9JHtzfSBhdCBwYWdlU3RhcnQ9JHtvfSAoZXhwZWN0ZWQgPiAwIGFuZCBwYWdlU3RhcnQrd2hlcmVNZXRhIDwgZW5jb2RlZC5sZW5ndGg9JHtlLmxlbmd0aH0pYCk7bGV0IGM9bysxfDAsbD1vK3N8MCx1PWVbbF0+Pj4wLGQ9dSszPj4+MixmPWwrMSxwPWYrZDtpZihwPj1lLmxlbmd0aCl0aHJvdyBFcnJvcihgRmFzdFBGT1IgZGVjb2RlOiBpbnZhbGlkIGJ5dGVTaXplPSR7dX0gKG1ldGFJbnRzPSR7ZH0sIHBhZ2VTdGFydD0ke299LCBwYWNrZWRFbmQ9JHtsfSwgYnl0ZUNvbnRhaW5lclN0YXJ0PSR7Zn0pIGNhdXNlcyBiaXRtYXBQb3M9JHtwfSBvdXQgb2YgYm91bmRzIChlbmNvZGVkLmxlbmd0aD0ke2UubGVuZ3RofSlgKTtsZXQgbT1jYihlLGYsdSxhKSxoPXUsZz1sYihlLHAsYSk7cmV0dXJuIGEuZGF0YVBvaW50ZXJzLmZpbGwoMCksbWIoZSxvLGMsbCx0LHJ8MCxpLzI1NnwwLG0saCxhKSxnfWZ1bmN0aW9uIGdiKGUsdCxuLHIsaSxhKXtsZXQgbz1yK2p5KGksMjU2KSxzPXIsYz1uO2Zvcig7cyE9PW87KXtsZXQgbj1NYXRoLm1pbihyYixvLXMpO2M9aGIoZSx0LGMscyxuLGEpLHM9cytufDB9cmV0dXJuIGN9ZnVuY3Rpb24gX2IoZSx0LG4scixpLGEpe2lmKGE9PT0wKXJldHVybiB0O2xldCBvPTAscz10LGM9dCtuLGw9aSx1PWksZD1pK2EsZj0wLHA9MDtmb3IoO3M8YyYmdTxkOyl7bGV0IHQ9ZVtzXT4+Pm8mMjU1O2lmKG8rPTgscys9bz4+PjUsbyY9MzEsZnw9KHQmMTI3KTw8cCx0JjEyOClyW3UrK109ZnwwLGY9MCxwPTA7ZWxzZSBpZihwKz03LHA+MjgpdGhyb3cgRXJyb3IoYEZhc3RQRk9SIFZCeXRlOiB1bnRlcm1pbmF0ZWQgdmFsdWUgKGV4cGVjdGVkIE1TQj0xIHRlcm1pbmF0b3Igd2l0aGluIDUgYnl0ZXM7IHNoaWZ0PSR7cH0sIHBhcnRpYWw9JHtmfSwgZGVjb2RlZD0ke3UtbH0vJHthfSwgaW5Qb3M9JHtzfSwgaW5FbmQ9JHtjfSlgKX1pZih1IT09ZCl0aHJvdyBFcnJvcihgRmFzdFBGT1IgVkJ5dGU6IHRydW5jYXRlZCBzdHJlYW0gKGRlY29kZWQ9JHt1LWx9LCBleHBlY3RlZD0ke2F9LCBjb25zdW1lZFdvcmRzPSR7cy10fS8ke259LCB2Ynl0ZVN0YXJ0PSR7dH0sIHZieXRlRW5kPSR7Y30pYCk7cmV0dXJuIHN9ZnVuY3Rpb24gdmIoZSx0LG4pe2xldCByPTAsaT0wLGE9bmV3IFVpbnQzMkFycmF5KHQpLG89bj8/YWIoKTtpZihlLmxlbmd0aD4wKXtsZXQgdD1lW3JdfDA7aWYocj1yKzF8MCx0JjI1NSl0aHJvdyBFcnJvcihgRmFzdFBGT1IgZGVjb2RlOiBpbnZhbGlkIGFsaWduZWRMZW5ndGg9JHt0fSAoZXhwZWN0ZWQgbXVsdGlwbGUgb2YgMjU2KWApO2lmKGkrdD5hLmxlbmd0aCl0aHJvdyBFcnJvcihgRmFzdFBGT1IgZGVjb2RlOiBvdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCAob3V0UG9zPSR7aX0sIGFsaWduZWRMZW5ndGg9JHt0fSwgb3V0Lmxlbmd0aD0ke2EubGVuZ3RofSlgKTtyPWdiKGUsYSxyLGksdCxvKSxpPWkrdHwwfWxldCBzPWUubGVuZ3RoLXJ8MCxjPXQtaXwwO3JldHVybiBfYihlLHIscyxhLGksYyksYX1mdW5jdGlvbiB5YihlLHQsbixyLGkpe3N3aXRjaChpKXtjYXNlIDI6RnkoZSx0LG4scik7cmV0dXJuO2Nhc2UgMzpJeShlLHQsbixyKTtyZXR1cm47Y2FzZSA0Okx5KGUsdCxuLHIpO3JldHVybjtjYXNlIDU6UnkoZSx0LG4scik7cmV0dXJuO2Nhc2UgNjp6eShlLHQsbixyKTtyZXR1cm47Y2FzZSA3OkJ5KGUsdCxuLHIpO3JldHVybjtjYXNlIDg6VnkoZSx0LG4scik7cmV0dXJuO2Nhc2UgOTpIeShlLHQsbixyKTtyZXR1cm47Y2FzZSAxMDpVeShlLHQsbixyKTtyZXR1cm47Y2FzZSAxMTpXeShlLHQsbixyKTtyZXR1cm47Y2FzZSAxMjpHeShlLHQsbixyKTtyZXR1cm47Y2FzZSAxNjpLeShlLHQsbixyKTtyZXR1cm47Y2FzZSAzMjpmb3IobGV0IGk9MDtpPDMyO2k9aSsxfDApbltyK2l8MF09ZVt0K2l8MF18MDtyZXR1cm59bGV0IGE9a3lbaV0+Pj4wLG89dCxzPTAsYz1lW29dPj4+MDtmb3IobGV0IHQ9MDt0PDMyO3QrKylpZihzK2k8PTMyKXtsZXQgbD1jPj4+cyZhO25bcit0XT1sfDAscys9aSxzPT09MzImJihzPTAsbysrLHQhPT0zMSYmKGM9ZVtvXT4+PjApKX1lbHNle2xldCBsPTMyLXMsdT1jPj4+cztvKyssYz1lW29dPj4+MDtsZXQgZD1reVtpLWxdPj4+MCxmPSh1fChjJmQpPDxsKSZhO25bcit0XT1mfDAscz1pLWx9fWZ1bmN0aW9uIGJiKGUsdCxuLHIpe2lmKHQ8MHx8bjwwfHx0K24+ZS5sZW5ndGgpdGhyb3cgUmFuZ2VFcnJvcihgZGVjb2RlQmlnRW5kaWFuSW50MzJzSW50bzogb3V0IG9mIGJvdW5kcyAob2Zmc2V0PSR7dH0sIGJ5dGVMZW5ndGg9JHtufSwgYnl0ZXMubGVuZ3RoPSR7ZS5sZW5ndGh9KWApO2xldCBpPU1hdGguZmxvb3Iobi80KSxhPW4lNCE9MCxvPWE/aSsxOmk7aWYoci5sZW5ndGg8byl0aHJvdyBSYW5nZUVycm9yKGBkZWNvZGVCaWdFbmRpYW5JbnQzMnNJbnRvOiBvdXQubGVuZ3RoPSR7ci5sZW5ndGh9IDwgJHtvfWApO2lmKGk+MCl7bGV0IG49ZS5ieXRlT2Zmc2V0K3Q7aWYobiYzKWZvcihsZXQgbj0wO248aTtuKyspe2xldCBpPXQrbio0O3Jbbl09ZVtpXTw8MjR8ZVtpKzFdPDwxNnxlW2krMl08PDh8ZVtpKzNdfDB9ZWxzZXtsZXQgdD1uZXcgVWludDMyQXJyYXkoZS5idWZmZXIsbixpKTtmb3IobGV0IGU9MDtlPGk7ZSsrKXJbZV09UHkodFtlXSl8MH19aWYoYSl7bGV0IGE9dCtpKjQsbz1uLWkqNCxzPTA7Zm9yKGxldCB0PTA7dDxvO3QrKylzfD1lW2ErdF08PDI0LXQqODtyW2ldPXN8MH1yZXR1cm4gb31mdW5jdGlvbiB4YihlLHQsbil7bGV0IHI9bmV3IFVpbnQzMkFycmF5KG4pLGk9MCxhPXQuZ2V0KCk7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspe2xldCB0PWVbYSsrXSxuPXQmMTI3O2lmKHQ8MTI4KXtyW2krK109bjtjb250aW51ZX1pZih0PWVbYSsrXSxufD0odCYxMjcpPDw3LHQ8MTI4KXtyW2krK109bjtjb250aW51ZX1pZih0PWVbYSsrXSxufD0odCYxMjcpPDwxNCx0PDEyOCl7cltpKytdPW47Y29udGludWV9aWYodD1lW2ErK10sbnw9KHQmMTI3KTw8MjEsdDwxMjgpe3JbaSsrXT1uO2NvbnRpbnVlfXQ9ZVthKytdLG58PSh0JjE1KTw8MjgscltpKytdPW59cmV0dXJuIHQuc2V0KGEpLHJ9ZnVuY3Rpb24gU2IoZSx0LG4pe2xldCByPW5ldyBCaWdVaW50NjRBcnJheShuKTtmb3IobGV0IG49MDtuPHIubGVuZ3RoO24rKylyW25dPUNiKGUsdCk7cmV0dXJuIHJ9ZnVuY3Rpb24gQ2IoZSx0KXtsZXQgbj0wbixyPTAsaT10LmdldCgpO2Zvcig7aTxlLmxlbmd0aDspe2xldCB0PWVbaSsrXTtpZihufD1CaWdJbnQodCYxMjcpPDxCaWdJbnQociksISh0JjEyOCkpYnJlYWs7aWYocis9NyxyPj02NCl0aHJvdyBFcnJvcihgVmFyaW50IHRvbyBsb25nYCl9cmV0dXJuIHQuc2V0KGkpLG59ZnVuY3Rpb24gd2IoZSx0LG4pe2xldCByPW5ldyBGbG9hdDY0QXJyYXkobik7Zm9yKGxldCBpPTA7aTxuO2krKylyW2ldPVRiKGUsdCk7cmV0dXJuIHJ9ZnVuY3Rpb24gVGIoZSx0KXtsZXQgbixyO3JldHVybiByPWVbdC5nZXQoKV0sdC5pbmNyZW1lbnQoKSxuPXImMTI3LHI8MTI4fHwocj1lW3QuZ2V0KCldLHQuaW5jcmVtZW50KCksbnw9KHImMTI3KTw8NyxyPDEyOCl8fChyPWVbdC5nZXQoKV0sdC5pbmNyZW1lbnQoKSxufD0ociYxMjcpPDwxNCxyPDEyOCl8fChyPWVbdC5nZXQoKV0sdC5pbmNyZW1lbnQoKSxufD0ociYxMjcpPDwyMSxyPDEyOCk/bjoocj1lW3QuZ2V0KCldLG58PShyJjE1KTw8MjgsRWIobixlLHQpKX1mdW5jdGlvbiBFYihlLHQsbil7bGV0IHIsaTtpZihpPXRbbi5nZXQoKV0sbi5pbmNyZW1lbnQoKSxyPShpJjExMik+PjQsaTwxMjh8fChpPXRbbi5nZXQoKV0sbi5pbmNyZW1lbnQoKSxyfD0oaSYxMjcpPDwzLGk8MTI4KXx8KGk9dFtuLmdldCgpXSxuLmluY3JlbWVudCgpLHJ8PShpJjEyNyk8PDEwLGk8MTI4KXx8KGk9dFtuLmdldCgpXSxuLmluY3JlbWVudCgpLHJ8PShpJjEyNyk8PDE3LGk8MTI4KXx8KGk9dFtuLmdldCgpXSxuLmluY3JlbWVudCgpLHJ8PShpJjEyNyk8PDI0LGk8MTI4KXx8KGk9dFtuLmdldCgpXSxuLmluY3JlbWVudCgpLHJ8PShpJjEpPDwzMSxpPDEyOCkpcmV0dXJuIHIqNDI5NDk2NzI5NisoZT4+PjApO3Rocm93IEVycm9yKGBFeHBlY3RlZCB2YXJpbnQgbm90IG1vcmUgdGhhbiAxMCBieXRlc2ApfWZ1bmN0aW9uIERiKGUsdCxuLHIpe3JldHVybiBPYihlLHQsbixyLG9iKG4+Pj4yKSl9ZnVuY3Rpb24gT2IoZSx0LG4scixpKXtsZXQgYT1yLmdldCgpO2lmKG4mMyl0aHJvdyBFcnJvcihgRmFzdFBGT1I6IGludmFsaWQgZW5jb2RlZEJ5dGVMZW5ndGg9JHtufSBhdCBvZmZzZXQ9JHthfSAoZW5jb2RlZEJ5dGVzLmxlbmd0aD0ke2UubGVuZ3RofTsgZXhwZWN0ZWQgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzIGZvciBhbiBpbnQzMiBiaWctZW5kaWFuIHdvcmQgc3RyZWFtKWApO2xldCBvPW4+Pj4yLHM9c2IoaSxvKTtiYihlLGEsbixzKTtsZXQgYz12YihzLnN1YmFycmF5KDAsbyksdCxpLmRlY29kZXJXb3Jrc3BhY2UpO3JldHVybiByLmFkZChuKSxjfWZ1bmN0aW9uIFooZSl7cmV0dXJuIGU+Pj4xXi0oZSYxKX1mdW5jdGlvbiBrYihlKXtyZXR1cm4gZT4+MW5eLShlJjFuKX1mdW5jdGlvbiBBYihlKXtyZXR1cm4gZSUyPT0xPyhlKzEpLy0yOmUvMn1mdW5jdGlvbiBqYihlKXtsZXQgdD1uZXcgSW50MzJBcnJheShlLmxlbmd0aCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdFtuXT1aKGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIE1iKGUpe2xldCB0PW5ldyBCaWdJbnQ2NEFycmF5KGUubGVuZ3RoKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0W25dPWtiKGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIE5iKGUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF09QWIoZVt0XSl9ZnVuY3Rpb24gUGIoZSx0LG4pe2lmKG49PT12b2lkIDApe249MDtmb3IobGV0IHI9MDtyPHQ7cisrKW4rPWVbcl19bGV0IHI9bmV3IFVpbnQzMkFycmF5KG4pLGk9MDtmb3IobGV0IG49MDtuPHQ7bisrKXtsZXQgYT1lW25dLG89ZVtuK3RdO3IuZmlsbChvLGksaSthKSxpKz1hfXJldHVybiByfWZ1bmN0aW9uIEZiKGUsdCxuKXtpZihuPT09dm9pZCAwKXtuPTA7Zm9yKGxldCByPTA7cjx0O3IrKyluKz1OdW1iZXIoZVtyXSl9bGV0IHI9bmV3IEJpZ1VpbnQ2NEFycmF5KG4pLGk9MDtmb3IobGV0IG49MDtuPHQ7bisrKXtsZXQgYT1OdW1iZXIoZVtuXSksbz1lW24rdF07ci5maWxsKG8saSxpK2EpLGkrPWF9cmV0dXJuIHJ9ZnVuY3Rpb24gSWIoZSx0LG4pe2xldCByPW5ldyBGbG9hdDY0QXJyYXkobiksaT0wO2ZvcihsZXQgbj0wO248dDtuKyspe2xldCBhPWVbbl0sbz1lW24rdF07ci5maWxsKG8saSxpK2EpLGkrPWF9cmV0dXJuIHJ9ZnVuY3Rpb24gTGIoZSl7bGV0IHQ9bmV3IEludDMyQXJyYXkoZS5sZW5ndGgpO3RbMF09WihlWzBdKTtsZXQgbj1lLmxlbmd0aC80KjQscj0xO2lmKG4+PTQpZm9yKDtyPG4tNDtyKz00KXtsZXQgbj1lW3JdLGk9ZVtyKzFdLGE9ZVtyKzJdLG89ZVtyKzNdO3Rbcl09WihuKSt0W3ItMV0sdFtyKzFdPVooaSkrdFtyXSx0W3IrMl09WihhKSt0W3IrMV0sdFtyKzNdPVoobykrdFtyKzJdfWZvcig7ciE9PWUubGVuZ3RoOysrcil0W3JdPVooZVtyXSkrdFtyLTFdO3JldHVybiB0fWZ1bmN0aW9uIFJiKGUpe2xldCB0PW5ldyBCaWdJbnQ2NEFycmF5KGUubGVuZ3RoKTt0WzBdPWtiKGVbMF0pO2xldCBuPWUubGVuZ3RoLzQqNCxyPTE7aWYobj49NClmb3IoO3I8bi00O3IrPTQpe2xldCBuPWVbcl0saT1lW3IrMV0sYT1lW3IrMl0sbz1lW3IrM107dFtyXT1rYihuKSt0W3ItMV0sdFtyKzFdPWtiKGkpK3Rbcl0sdFtyKzJdPWtiKGEpK3RbcisxXSx0W3IrM109a2IobykrdFtyKzJdfWZvcig7ciE9PXQubGVuZ3RoOysrcil0W3JdPWtiKGVbcl0pK3Rbci0xXTtyZXR1cm4gdH1mdW5jdGlvbiB6YihlKXtlWzBdPUFiKGVbMF0pO2xldCB0PWUubGVuZ3RoLzQqNCxuPTE7aWYodD49NClmb3IoO248dC00O24rPTQpe2xldCB0PWVbbl0scj1lW24rMV0saT1lW24rMl0sYT1lW24rM107ZVtuXT1BYih0KStlW24tMV0sZVtuKzFdPUFiKHIpK2Vbbl0sZVtuKzJdPUFiKGkpK2VbbisxXSxlW24rM109QWIoYSkrZVtuKzJdfWZvcig7biE9PWUubGVuZ3RoOysrbillW25dPUFiKGVbbl0pK2Vbbi0xXX1mdW5jdGlvbiBCYihlLHQsbil7aWYobj09PXZvaWQgMCl7bj0wO2ZvcihsZXQgcj0wO3I8dDtyKyspbis9ZVtyXX1sZXQgcj1uZXcgSW50MzJBcnJheShuKSxpPTA7Zm9yKGxldCBuPTA7bjx0O24rKyl7bGV0IGE9ZVtuXSxvPWVbbit0XTtvPVoobyksci5maWxsKG8saSxpK2EpLGkrPWF9cmV0dXJuIHJ9ZnVuY3Rpb24gVmIoZSx0LG4pe2lmKG49PT12b2lkIDApe249MDtmb3IobGV0IHI9MDtyPHQ7cisrKW4rPU51bWJlcihlW3JdKX1sZXQgcj1uZXcgQmlnSW50NjRBcnJheShuKSxpPTA7Zm9yKGxldCBuPTA7bjx0O24rKyl7bGV0IGE9TnVtYmVyKGVbbl0pLG89ZVtuK3RdO289a2Iobyksci5maWxsKG8saSxpK2EpLGkrPWF9cmV0dXJuIHJ9ZnVuY3Rpb24gSGIoZSx0LG4pe2xldCByPW5ldyBGbG9hdDY0QXJyYXkobiksaT0wO2ZvcihsZXQgbj0wO248dDtuKyspe2xldCBhPWVbbl0sbz1lW24rdF07bz1BYihvKSxyLmZpbGwobyxpLGkrYSksaSs9YX1yZXR1cm4gcn1mdW5jdGlvbiBVYihlKXtsZXQgdD1lLmxlbmd0aC80KjQsbj0xO2lmKHQ+PTQpZm9yKGxldCByPWVbMF07bjx0LTQ7bis9NClyPWVbbl0rPXIscj1lW24rMV0rPXIscj1lW24rMl0rPXIscj1lW24rM10rPXI7Zm9yKDtuIT09ZS5sZW5ndGg7KWVbbl0rPWVbbi0xXSwrK259ZnVuY3Rpb24gV2IoZSl7bGV0IHQ9MDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyllW25dKz10LHQ9ZVtuXX1mdW5jdGlvbiBHYihlKXtpZihlLmxlbmd0aDwyKXJldHVybiBuZXcgSW50MzJBcnJheShlKTtsZXQgdD1uZXcgSW50MzJBcnJheShlLmxlbmd0aCk7dFswXT1aKGVbMF0pLHRbMV09WihlWzFdKTtsZXQgbj1lLmxlbmd0aC80KjQscj0yO2lmKG4+PTQpZm9yKDtyPG4tNDtyKz00KXtsZXQgbj1lW3JdLGk9ZVtyKzFdLGE9ZVtyKzJdLG89ZVtyKzNdO3Rbcl09WihuKSt0W3ItMl0sdFtyKzFdPVooaSkrdFtyLTFdLHRbcisyXT1aKGEpK3Rbcl0sdFtyKzNdPVoobykrdFtyKzFdfWZvcig7ciE9PWUubGVuZ3RoO3IrPTIpdFtyXT1aKGVbcl0pK3Rbci0yXSx0W3IrMV09WihlW3IrMV0pK3Rbci0xXTtyZXR1cm4gdH1mdW5jdGlvbiBLYihlLHQsbixyKXtpZihlLmxlbmd0aDwyKXJldHVybiBuZXcgSW50MzJBcnJheShlKTtsZXQgaT1uZXcgSW50MzJBcnJheShlLmxlbmd0aCksYT1aKGVbMF0pLG89WihlWzFdKTtpWzBdPXFiKE1hdGgucm91bmQoYSp0KSxuLHIpLGlbMV09cWIoTWF0aC5yb3VuZChvKnQpLG4scik7bGV0IHM9ZS5sZW5ndGgvMTYsYz0yO2lmKHM+PTQpZm9yKDtjPHMtNDtjKz00KXtsZXQgcz1lW2NdLGw9ZVtjKzFdLHU9WihzKSthLGQ9WihsKStvO2lbY109cWIoTWF0aC5yb3VuZCh1KnQpLG4sciksaVtjKzFdPXFiKE1hdGgucm91bmQoZCp0KSxuLHIpO2xldCBmPWVbYysyXSxwPWVbYyszXTthPVooZikrdSxvPVoocCkrZCxpW2MrMl09cWIoTWF0aC5yb3VuZChhKnQpLG4sciksaVtjKzNdPXFiKE1hdGgucm91bmQobyp0KSxuLHIpfWZvcig7YyE9PWUubGVuZ3RoO2MrPTIpYSs9WihlW2NdKSxvKz1aKGVbYysxXSksaVtjXT1xYihNYXRoLnJvdW5kKGEqdCksbixyKSxpW2MrMV09cWIoTWF0aC5yb3VuZChvKnQpLG4scik7cmV0dXJuIGl9ZnVuY3Rpb24gcWIoZSx0LG4pe3JldHVybiBNYXRoLm1pbihuLE1hdGgubWF4KHQsZSkpfWZ1bmN0aW9uIEpiKGUpe2xldCB0PW5ldyBJbnQzMkFycmF5KGUubGVuZ3RoKzEpO3RbMF09MCx0WzFdPVooZVswXSk7bGV0IG49dFsxXTtmb3IobGV0IHI9MjtyIT09dC5sZW5ndGg7KytyKXtsZXQgaT1lW3ItMV0sYT1aKGkpO24rPWEsdFtyXT10W3ItMV0rbn1yZXR1cm4gbmV3IFVpbnQzMkFycmF5KHQpfWZ1bmN0aW9uIFliKGUsdCxuKXtsZXQgcj1uZXcgSW50MzJBcnJheShuKzEpO3JbMF09MDtsZXQgaT0xLGE9clswXTtmb3IobGV0IG49MDtuPHQ7bisrKXtsZXQgbz1lW25dLHM9ZVtuK3RdO3M9WihzKTtmb3IobGV0IGU9aTtlPGkrbztlKyspcltlXT1zK2EsYT1yW2VdO2krPW99cmV0dXJuIHJ9ZnVuY3Rpb24gWGIoZSx0LG4pe2xldCByPW5ldyBVaW50MzJBcnJheShuKzEpO3JbMF09MDtsZXQgaT0xLGE9clswXTtmb3IobGV0IG49MDtuPHQ7bisrKXtsZXQgbz1lW25dLHM9ZVtuK3RdO2ZvcihsZXQgZT1pO2U8aStvO2UrKylyW2VdPXMrYSxhPXJbZV07aSs9b31yZXR1cm4gcn1mdW5jdGlvbiBaYihlLHQsbil7bGV0IHI9bmV3IEludDMyQXJyYXkobiksaT0wLGE9MDtmb3IobGV0IG49MDtuPHQ7bisrKXtsZXQgbz1lW25dLHM9ZVtuK3RdLGM9WihzKTtmb3IobGV0IGU9MDtlPG87ZSsrKWErPWMscltpKytdPWF9cmV0dXJuIHJ9ZnVuY3Rpb24gUWIoZSx0LG4pe2xldCByPW5ldyBCaWdJbnQ2NEFycmF5KG4pLGk9MCxhPTBuO2ZvcihsZXQgbj0wO248dDtuKyspe2xldCBvPU51bWJlcihlW25dKSxzPWVbbit0XSxjPWtiKHMpO2ZvcihsZXQgZT0wO2U8bztlKyspYSs9YyxyW2krK109YX1yZXR1cm4gcn1mdW5jdGlvbiAkYihlKXtsZXQgdD1uZXcgVWludDMyQXJyYXkoZS5sZW5ndGgpO3RbMF09WihlWzBdKT4+PjA7Zm9yKGxldCBuPTE7bjxlLmxlbmd0aDtuKyspdFtuXT10W24tMV0rWihlW25dKT4+PjA7cmV0dXJuIHR9ZnVuY3Rpb24gZXgoZSl7bGV0IHQ9bmV3IEJpZ1VpbnQ2NEFycmF5KGUubGVuZ3RoKTt0WzBdPUJpZ0ludC5hc1VpbnROKDY0LGtiKGVbMF0pKTtmb3IobGV0IG49MTtuPGUubGVuZ3RoO24rKyl0W25dPUJpZ0ludC5hc1VpbnROKDY0LHRbbi0xXStrYihlW25dKSk7cmV0dXJuIHR9ZnVuY3Rpb24gdHgoZSl7aWYoZS5sZW5ndGg8MilyZXR1cm4gbmV3IFVpbnQzMkFycmF5KGUpO2xldCB0PW5ldyBVaW50MzJBcnJheShlLmxlbmd0aCk7dFswXT1aKGVbMF0pPj4+MCx0WzFdPVooZVsxXSk+Pj4wO2ZvcihsZXQgbj0yO248ZS5sZW5ndGg7bis9Mil0W25dPXRbbi0yXStaKGVbbl0pPj4+MCx0W24rMV09dFtuLTFdK1ooZVtuKzFdKT4+PjA7cmV0dXJuIHR9ZnVuY3Rpb24gbngoZSx0LG4scil7bGV0IGk9S2IoZSx0LG4scik7cmV0dXJuIG5ldyBVaW50MzJBcnJheShpKX1mdW5jdGlvbiByeChlKXtyZXR1cm4gZVsxXX1mdW5jdGlvbiBpeChlKXtyZXR1cm4gWihlWzFdKX1mdW5jdGlvbiBheChlKXtpZihlLmxlbmd0aD09PTIpe2xldCB0PVooZVsxXSk7cmV0dXJuW3QsdF19cmV0dXJuW1ooZVsyXSksWihlWzNdKV19ZnVuY3Rpb24gb3goZSl7cmV0dXJuIGVbMV19ZnVuY3Rpb24gc3goZSl7cmV0dXJuIGtiKGVbMV0pfWZ1bmN0aW9uIGN4KGUpe2lmKGUubGVuZ3RoPT09Mil7bGV0IHQ9a2IoZVsxXSk7cmV0dXJuW3QsdF19cmV0dXJuW2tiKGVbMl0pLGtiKGVbM10pXX12YXIgbHg7KGZ1bmN0aW9uKGUpe2UuUFJFU0VOVD1gUFJFU0VOVGAsZS5EQVRBPWBEQVRBYCxlLk9GRlNFVD1gT0ZGU0VUYCxlLkxFTkdUSD1gTEVOR1RIYH0pKGx4fHw9e30pO3ZhciB1eDsoZnVuY3Rpb24oZSl7ZS5OT05FPWBOT05FYCxlLlNJTkdMRT1gU0lOR0xFYCxlLlNIQVJFRD1gU0hBUkVEYCxlLlZFUlRFWD1gVkVSVEVYYCxlLk1PUlRPTj1gTU9SVE9OYCxlLkZTU1Q9YEZTU1RgfSkodXh8fD17fSk7dmFyIGR4OyhmdW5jdGlvbihlKXtlLlZFUlRFWD1gVkVSVEVYYCxlLklOREVYPWBJTkRFWGAsZS5TVFJJTkc9YFNUUklOR2AsZS5LRVk9YEtFWWB9KShkeHx8PXt9KTt2YXIgZng7KGZ1bmN0aW9uKGUpe2UuVkFSX0JJTkFSWT1gVkFSX0JJTkFSWWAsZS5HRU9NRVRSSUVTPWBHRU9NRVRSSUVTYCxlLlBBUlRTPWBQQVJUU2AsZS5SSU5HUz1gUklOR1NgLGUuVFJJQU5HTEVTPWBUUklBTkdMRVNgLGUuU1lNQk9MPWBTWU1CT0xgLGUuRElDVElPTkFSWT1gRElDVElPTkFSWWB9KShmeHx8PXt9KTtjb25zdCBweD1bbHguUFJFU0VOVCxseC5EQVRBLGx4Lk9GRlNFVCxseC5MRU5HVEhdLG14PVtYLk5PTkUsWC5ERUxUQSxYLkNPTVBPTkVOVFdJU0VfREVMVEEsWC5STEUsWC5NT1JUT04sWC5QREVdLGh4PVtEeS5OT05FLER5LkZBU1RfUEZPUixEeS5WQVJJTlRdLGd4PVt1eC5OT05FLHV4LlNJTkdMRSx1eC5TSEFSRUQsdXguVkVSVEVYLHV4Lk1PUlRPTix1eC5GU1NUXSxfeD1bZHguVkVSVEVYLGR4LklOREVYLGR4LlNUUklORyxkeC5LRVldLHZ4PVtmeC5WQVJfQklOQVJZLGZ4LkdFT01FVFJJRVMsZnguUEFSVFMsZnguUklOR1MsZnguVFJJQU5HTEVTLGZ4LlNZTUJPTCxmeC5ESUNUSU9OQVJZXTtmdW5jdGlvbiBRKGUsdCl7bGV0IG49eHgoZSx0KTtyZXR1cm4gbi5sb2dpY2FsTGV2ZWxUZWNobmlxdWUxPT09WC5NT1JUT04/eXgobixlLHQpOihYLlJMRT09PW4ubG9naWNhbExldmVsVGVjaG5pcXVlMXx8WC5STEU9PT1uLmxvZ2ljYWxMZXZlbFRlY2huaXF1ZTIpJiZEeS5OT05FIT09bi5waHlzaWNhbExldmVsVGVjaG5pcXVlP2J4KG4sZSx0KTpufWZ1bmN0aW9uIHl4KGUsdCxuKXtsZXQgcj14Yih0LG4sMik7cmV0dXJue3BoeXNpY2FsU3RyZWFtVHlwZTplLnBoeXNpY2FsU3RyZWFtVHlwZSxsb2dpY2FsU3RyZWFtVHlwZTplLmxvZ2ljYWxTdHJlYW1UeXBlLGxvZ2ljYWxMZXZlbFRlY2huaXF1ZTE6ZS5sb2dpY2FsTGV2ZWxUZWNobmlxdWUxLGxvZ2ljYWxMZXZlbFRlY2huaXF1ZTI6ZS5sb2dpY2FsTGV2ZWxUZWNobmlxdWUyLHBoeXNpY2FsTGV2ZWxUZWNobmlxdWU6ZS5waHlzaWNhbExldmVsVGVjaG5pcXVlLG51bVZhbHVlczplLm51bVZhbHVlcyxieXRlTGVuZ3RoOmUuYnl0ZUxlbmd0aCxkZWNvbXByZXNzZWRDb3VudDplLmRlY29tcHJlc3NlZENvdW50LG51bUJpdHM6clswXSxjb29yZGluYXRlU2hpZnQ6clsxXX19ZnVuY3Rpb24gYngoZSx0LG4pe2xldCByPXhiKHQsbiwyKTtyZXR1cm57cGh5c2ljYWxTdHJlYW1UeXBlOmUucGh5c2ljYWxTdHJlYW1UeXBlLGxvZ2ljYWxTdHJlYW1UeXBlOmUubG9naWNhbFN0cmVhbVR5cGUsbG9naWNhbExldmVsVGVjaG5pcXVlMTplLmxvZ2ljYWxMZXZlbFRlY2huaXF1ZTEsbG9naWNhbExldmVsVGVjaG5pcXVlMjplLmxvZ2ljYWxMZXZlbFRlY2huaXF1ZTIscGh5c2ljYWxMZXZlbFRlY2huaXF1ZTplLnBoeXNpY2FsTGV2ZWxUZWNobmlxdWUsbnVtVmFsdWVzOmUubnVtVmFsdWVzLGJ5dGVMZW5ndGg6ZS5ieXRlTGVuZ3RoLGRlY29tcHJlc3NlZENvdW50OnJbMV0scnVuczpyWzBdLG51bVJsZVZhbHVlczpyWzFdfX1mdW5jdGlvbiB4eChlLHQpe2xldCBuPWVbdC5nZXQoKV0scj1weFtuPj40XSxpPXt9O3N3aXRjaChyKXtjYXNlIGx4LkRBVEE6aT17ZGljdGlvbmFyeVR5cGU6Z3hbbiYxNV19O2JyZWFrO2Nhc2UgbHguT0ZGU0VUOmk9e29mZnNldFR5cGU6X3hbbiYxNV19O2JyZWFrO2Nhc2UgbHguTEVOR1RIOmk9e2xlbmd0aFR5cGU6dnhbbiYxNV19fXQuaW5jcmVtZW50KCk7bGV0IGE9ZVt0LmdldCgpXSxvPW14W2E+PjVdLHM9bXhbYT4+MiY3XSxjPWh4W2EmM107dC5pbmNyZW1lbnQoKTtsZXQgbD14YihlLHQsMiksdT1sWzBdLGQ9bFsxXTtyZXR1cm57cGh5c2ljYWxTdHJlYW1UeXBlOnIsbG9naWNhbFN0cmVhbVR5cGU6aSxsb2dpY2FsTGV2ZWxUZWNobmlxdWUxOm8sbG9naWNhbExldmVsVGVjaG5pcXVlMjpzLHBoeXNpY2FsTGV2ZWxUZWNobmlxdWU6YyxudW1WYWx1ZXM6dSxieXRlTGVuZ3RoOmQsZGVjb21wcmVzc2VkQ291bnQ6dX19dmFyICQ7KGZ1bmN0aW9uKGUpe2VbZS5GTEFUPTBdPWBGTEFUYCxlW2UuQ09OU1Q9MV09YENPTlNUYCxlW2UuU0VRVUVOQ0U9Ml09YFNFUVVFTkNFYCxlW2UuRElDVElPTkFSWT0zXT1gRElDVElPTkFSWWAsZVtlLkZTU1RfRElDVElPTkFSWT00XT1gRlNTVF9ESUNUSU9OQVJZYH0pKCR8fD17fSk7dmFyIFN4PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy52YWx1ZXM9ZSx0aGlzLl9zaXplPXR9Z2V0KGUpe2xldCB0PU1hdGguZmxvb3IoZS84KSxuPWUlODtyZXR1cm4odGhpcy52YWx1ZXNbdF0+Pm4mMSk9PTF9c2V0KGUsdCl7bGV0IG49TWF0aC5mbG9vcihlLzgpLHI9ZSU4O3RoaXMudmFsdWVzW25dPXRoaXMudmFsdWVzW25dfCshIXQ8PHJ9Z2V0SW50KGUpe2xldCB0PU1hdGguZmxvb3IoZS84KSxuPWUlODtyZXR1cm4gdGhpcy52YWx1ZXNbdF0+Pm4mMX1zaXplKCl7cmV0dXJuIHRoaXMuX3NpemV9Z2V0QnVmZmVyKCl7cmV0dXJuIHRoaXMudmFsdWVzfX07ZnVuY3Rpb24gQ3goZSx0LG4pe2lmKCF0KXJldHVybiBlO2xldCByPXQuc2l6ZSgpLGk9ZS5jb25zdHJ1Y3RvcixhPW5ldyBpKHIpLG89MDtmb3IobGV0IGk9MDtpPHI7aSsrKWFbaV09dC5nZXQoaSk/ZVtvKytdOm47cmV0dXJuIGF9ZnVuY3Rpb24gd3goZSx0LG4pe2lmKCFuKXJldHVybiBlO2xldCByPW4uc2l6ZSgpLGk9bmV3IFN4KGUsdCksYT1uZXcgU3gobmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKHIvOCkpLHIpLG89MDtmb3IobGV0IGU9MDtlPHI7ZSsrKXtsZXQgdD1uLmdldChlKT9pLmdldChvKyspOiExO2Euc2V0KGUsdCl9cmV0dXJuIGEuZ2V0QnVmZmVyKCl9ZnVuY3Rpb24gVHgoZSx0LG4pe2ZvcihsZXQgcj0wO3I8ZTtyKyspe2xldCBlPVEodCxuKTtuLmFkZChlLmJ5dGVMZW5ndGgpfX1mdW5jdGlvbiBFeChlLHQsbixyLGkpe2xldCBhPUR4KGUsTWF0aC5jZWlsKHQvOCksbixyKTtyZXR1cm4gaT93eChhLHQsaSk6YX1mdW5jdGlvbiBEeChlLHQsbixyKXtsZXQgaT1uZXcgVWludDhBcnJheSh0KSxhPTAsbz1yLmdldCgpK247Zm9yKDthPHQmJiEoci5nZXQoKT49byk7KXtsZXQgbj1lW3IuaW5jcmVtZW50KCldO2lmKG48PTEyNyl7bGV0IG89biszLHM9ZVtyLmluY3JlbWVudCgpXSxjPU1hdGgubWluKGErbyx0KTtpLmZpbGwocyxhLGMpLGE9Y31lbHNle2xldCBvPTI1Ni1uO2ZvcihsZXQgbj0wO248byYmYTx0O24rKylpW2ErK109ZVtyLmluY3JlbWVudCgpXX19cmV0dXJuIHIuc2V0KG8pLGl9ZnVuY3Rpb24gT3goZSx0LG4scil7bGV0IGk9dC5nZXQoKSxhPWkrbipGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsbz1uZXcgVWludDhBcnJheShlLnN1YmFycmF5KGksYSkpLmJ1ZmZlcixzPW5ldyBGbG9hdDMyQXJyYXkobyk7cmV0dXJuIHQuc2V0KGEpLHI/Q3gocyxyLDApOnN9ZnVuY3Rpb24ga3goZSx0LG4scil7bGV0IGk9dC5nZXQoKSxhPWkrbipGbG9hdDY0QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsbz1uZXcgVWludDhBcnJheShlLnN1YmFycmF5KGksYSkpLmJ1ZmZlcixzPW5ldyBGbG9hdDY0QXJyYXkobyk7cmV0dXJuIHQuc2V0KGEpLHI/Q3gocyxyLDApOnN9ZnVuY3Rpb24gQXgoZSx0LG4pe2xldCByPXQuZ2V0KCksaT1uKlVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULGE9bmV3IERhdGFWaWV3KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpLG89bmV3IFVpbnQzMkFycmF5KG4pO2ZvcihsZXQgZT0wO2U8bjtlKyspb1tlXT1hLmdldFVpbnQzMihyK2UqVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsITApO3JldHVybiB0LmFkZChpKSxvfWZ1bmN0aW9uIGp4KGUsdCxuKXtsZXQgcj10LmdldCgpLGk9bipCaWdVaW50NjRBcnJheS5CWVRFU19QRVJfRUxFTUVOVCxhPW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKSxvPW5ldyBCaWdVaW50NjRBcnJheShuKTtmb3IobGV0IGU9MDtlPG47ZSsrKW9bZV09YS5nZXRCaWdVaW50NjQocitlKkJpZ1VpbnQ2NEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCEwKTtyZXR1cm4gdC5hZGQoaSksb31jb25zdCBNeD1uZXcgVGV4dERlY29kZXI7ZnVuY3Rpb24gTngoZSx0LG4pe3JldHVybiBuLXQ+PTEyP014LmRlY29kZShlLnN1YmFycmF5KHQsbikpOlB4KGUsdCxuKX1mdW5jdGlvbiBQeChlLHQsbil7bGV0IHI9YGAsaT10O2Zvcig7aTxuOyl7bGV0IHQ9ZVtpXSxhPW51bGwsbz10PjIzOT80OnQ+MjIzPzM6dD4xOTE/MjoxO2lmKGkrbz5uKWJyZWFrO2xldCBzLGMsbDtvPT09MT90PDEyOCYmKGE9dCk6bz09PTI/KHM9ZVtpKzFdLChzJjE5Mik9PTEyOCYmKGE9KHQmMzEpPDw2fHMmNjMsYTw9MTI3JiYoYT1udWxsKSkpOm89PT0zPyhzPWVbaSsxXSxjPWVbaSsyXSwocyYxOTIpPT0xMjgmJihjJjE5Mik9PTEyOCYmKGE9KHQmMTUpPDwxMnwocyY2Myk8PDZ8YyY2MywoYTw9MjA0N3x8YT49NTUyOTYmJmE8PTU3MzQzKSYmKGE9bnVsbCkpKTpvPT09NCYmKHM9ZVtpKzFdLGM9ZVtpKzJdLGw9ZVtpKzNdLChzJjE5Mik9PTEyOCYmKGMmMTkyKT09MTI4JiYobCYxOTIpPT0xMjgmJihhPSh0JjE1KTw8MTh8KHMmNjMpPDwxMnwoYyY2Myk8PDZ8bCY2MywoYTw9NjU1MzV8fGE+PTExMTQxMTIpJiYoYT1udWxsKSkpLGE9PT1udWxsPyhhPTY1NTMzLG89MSk6YT42NTUzNSYmKGEtPTY1NTM2LHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoYT4+PjEwJjEwMjN8NTUyOTYpLGE9NTYzMjB8YSYxMDIzKSxyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpLGkrPW99cmV0dXJuIHJ9ZnVuY3Rpb24gRngoZSx0LG4scixpKXtyZXR1cm4gWHgoUngoZSx0LG4pLG4scixpKX1mdW5jdGlvbiBJeChlLHQsbixyLGkpe3JldHVybiBaeChSeChlLHQsbiksbixyLGkpfWZ1bmN0aW9uIEx4KGUsdCxuKXtyZXR1cm4gdFMoUngoZSx0LG4pLG4pfWZ1bmN0aW9uIFJ4KGUsdCxuKXtsZXQgcj1uLnBoeXNpY2FsTGV2ZWxUZWNobmlxdWU7c3dpdGNoKHIpe2Nhc2UgRHkuRkFTVF9QRk9SOnJldHVybiBEYihlLG4ubnVtVmFsdWVzLG4uYnl0ZUxlbmd0aCx0KTtjYXNlIER5LlZBUklOVDpyZXR1cm4geGIoZSx0LG4ubnVtVmFsdWVzKTtjYXNlIER5Lk5PTkU6cmV0dXJuIEF4KGUsdCxuLm51bVZhbHVlcyk7ZGVmYXVsdDp0aHJvdyBFcnJvcihgU3BlY2lmaWVkIHBoeXNpY2FsTGV2ZWxUZWNobmlxdWUgJHtyfSBpcyBub3Qgc3VwcG9ydGVkICh5ZXQpLmApfX1mdW5jdGlvbiB6eChlLHQsbil7bGV0IHI9bi5waHlzaWNhbExldmVsVGVjaG5pcXVlO3N3aXRjaChyKXtjYXNlIER5LlZBUklOVDpyZXR1cm4gU2IoZSx0LG4ubnVtVmFsdWVzKTtjYXNlIER5Lk5PTkU6cmV0dXJuIGp4KGUsdCxuLm51bVZhbHVlcyk7ZGVmYXVsdDp0aHJvdyBFcnJvcihgU3BlY2lmaWVkIHBoeXNpY2FsTGV2ZWxUZWNobmlxdWUgJHtyfSBpcyBub3Qgc3VwcG9ydGVkICh5ZXQpLmApfX1mdW5jdGlvbiBCeChlLHQsbil7bGV0IHI9UngoZSx0LG4pO3JldHVybiByLmxlbmd0aD09PTE/WihyWzBdKTppeChyKX1mdW5jdGlvbiBWeChlLHQsbil7bGV0IHI9UngoZSx0LG4pO3JldHVybiByLmxlbmd0aD09PTE/bi5sb2dpY2FsTGV2ZWxUZWNobmlxdWUxPT09WC5ERUxUQT9aKHJbMF0pOnJbMF06cngocil9ZnVuY3Rpb24gSHgoZSx0LG4pe3JldHVybiBheChSeChlLHQsbikpfWZ1bmN0aW9uIFV4KGUsdCxuKXtyZXR1cm4gY3goU2IoZSx0LG4ubnVtVmFsdWVzKSl9ZnVuY3Rpb24gV3goZSx0LG4scil7cmV0dXJuIFF4KHp4KGUsdCxuKSxuLHIpfWZ1bmN0aW9uIEd4KGUsdCxuLHIpe3JldHVybiAkeCh6eChlLHQsbiksbixyKX1mdW5jdGlvbiBLeChlLHQsbixyKXtsZXQgaT1xeChlLHQsbiwhMSk7cmV0dXJuIHI/Q3goaSxyLDApOml9ZnVuY3Rpb24gcXgoZSx0LG4scil7aWYobi5waHlzaWNhbExldmVsVGVjaG5pcXVlPT09RHkuVkFSSU5UKXJldHVybiBlUyh3YihlLHQsbi5udW1WYWx1ZXMpLG4scik7bGV0IGk9engoZSx0LG4pLGE9cj9ReChpLG4pOiR4KGksbik7cmV0dXJuIEZsb2F0NjRBcnJheS5mcm9tKGEsTnVtYmVyKX1mdW5jdGlvbiBKeChlLHQsbil7bGV0IHI9engoZSx0LG4pO3JldHVybiByLmxlbmd0aD09PTE/a2IoclswXSk6c3gocil9ZnVuY3Rpb24gWXgoZSx0LG4pe2xldCByPXp4KGUsdCxuKTtyZXR1cm4gci5sZW5ndGg9PT0xP24ubG9naWNhbExldmVsVGVjaG5pcXVlMT09PVguREVMVEE/a2IoclswXSk6clswXTpveChyKX1mdW5jdGlvbiBYeChlLHQsbixyKXtsZXQgaTtzd2l0Y2godC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUxKXtjYXNlIFguREVMVEE6aWYodC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUyPT09WC5STEUpe2xldCBuPXQ7aWYoIXIpcmV0dXJuIFpiKGUsbi5ydW5zLG4ubnVtUmxlVmFsdWVzKTtlPVBiKGUsbi5ydW5zLG4ubnVtUmxlVmFsdWVzKSxpPUxiKGUpfWVsc2UgaT1MYihlKTticmVhaztjYXNlIFguUkxFOmk9QmIoZSx0LnJ1bnMsdC5udW1SbGVWYWx1ZXMpO2JyZWFrO2Nhc2UgWC5NT1JUT046VWIoZSksaT1uZXcgSW50MzJBcnJheShlKTticmVhaztjYXNlIFguQ09NUE9ORU5UV0lTRV9ERUxUQTppZihuJiYhcilyZXR1cm4gS2IoZSxuLnNjYWxlLG4ubWluLG4ubWF4KTtpPUdiKGUpO2JyZWFrO2Nhc2UgWC5OT05FOmk9amIoZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVGhlIHNwZWNpZmllZCBMb2dpY2FsIGxldmVsIHRlY2huaXF1ZSBpcyBub3Qgc3VwcG9ydGVkOiAke3QubG9naWNhbExldmVsVGVjaG5pcXVlMX1gKX1yZXR1cm4gcj9DeChpLHIsMCk6aX1mdW5jdGlvbiBaeChlLHQsbixyKXtsZXQgaTtzd2l0Y2godC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUxKXtjYXNlIFguREVMVEE6aWYodC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUyPT09WC5STEUpe2xldCBuPXQ7aT0kYihQYihlLG4ucnVucyxuLm51bVJsZVZhbHVlcykpfWVsc2UgaT0kYihlKTticmVhaztjYXNlIFguUkxFOmk9UGIoZSx0LnJ1bnMsdC5udW1SbGVWYWx1ZXMpO2JyZWFrO2Nhc2UgWC5NT1JUT046VWIoZSksaT1lO2JyZWFrO2Nhc2UgWC5DT01QT05FTlRXSVNFX0RFTFRBOmk9biYmIXI/bngoZSxuLnNjYWxlLG4ubWluLG4ubWF4KTp0eChlKTticmVhaztjYXNlIFguTk9ORTppPWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVGhlIHNwZWNpZmllZCBMb2dpY2FsIGxldmVsIHRlY2huaXF1ZSBpcyBub3Qgc3VwcG9ydGVkOiAke3QubG9naWNhbExldmVsVGVjaG5pcXVlMX1gKX1yZXR1cm4gcj9DeChpLHIsMCk6aX1mdW5jdGlvbiBReChlLHQsbil7bGV0IHI7c3dpdGNoKHQubG9naWNhbExldmVsVGVjaG5pcXVlMSl7Y2FzZSBYLkRFTFRBOmlmKHQubG9naWNhbExldmVsVGVjaG5pcXVlMj09PVguUkxFKXtsZXQgaT10O2lmKCFuKXJldHVybiBRYihlLGkucnVucyxpLm51bVJsZVZhbHVlcyk7ZT1GYihlLGkucnVucyxpLm51bVJsZVZhbHVlcykscj1SYihlKX1lbHNlIHI9UmIoZSk7YnJlYWs7Y2FzZSBYLlJMRTpyPVZiKGUsdC5ydW5zLHQubnVtUmxlVmFsdWVzKTticmVhaztjYXNlIFguTk9ORTpyPU1iKGUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoYFRoZSBzcGVjaWZpZWQgTG9naWNhbCBsZXZlbCB0ZWNobmlxdWUgaXMgbm90IHN1cHBvcnRlZDogJHt0LmxvZ2ljYWxMZXZlbFRlY2huaXF1ZTF9YCl9cmV0dXJuIG4/Q3gocixuLDBuKTpyfWZ1bmN0aW9uICR4KGUsdCxuKXtsZXQgcjtzd2l0Y2godC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUxKXtjYXNlIFguREVMVEE6aWYodC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUyPT09WC5STEUpe2xldCBuPXQ7cj1leChGYihlLG4ucnVucyxuLm51bVJsZVZhbHVlcykpfWVsc2Ugcj1leChlKTticmVhaztjYXNlIFguUkxFOnI9RmIoZSx0LnJ1bnMsdC5udW1SbGVWYWx1ZXMpO2JyZWFrO2Nhc2UgWC5OT05FOnI9ZTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKGBUaGUgc3BlY2lmaWVkIExvZ2ljYWwgbGV2ZWwgdGVjaG5pcXVlIGlzIG5vdCBzdXBwb3J0ZWQ6ICR7dC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUxfWApfXJldHVybiBuP0N4KHIsbiwwbik6cn1mdW5jdGlvbiBlUyhlLHQsbil7c3dpdGNoKHQubG9naWNhbExldmVsVGVjaG5pcXVlMSl7Y2FzZSBYLkRFTFRBOmlmKHQubG9naWNhbExldmVsVGVjaG5pcXVlMj09PVguUkxFKXtsZXQgbj10O2U9SWIoZSxuLnJ1bnMsbi5udW1SbGVWYWx1ZXMpfXJldHVybiB6YihlKSxlO2Nhc2UgWC5STEU6cmV0dXJuIGlTKGUsdCxuKTtjYXNlIFguTk9ORTpyZXR1cm4gbiYmTmIoZSksZTtkZWZhdWx0OnRocm93IEVycm9yKGBUaGUgc3BlY2lmaWVkIExvZ2ljYWwgbGV2ZWwgdGVjaG5pcXVlIGlzIG5vdCBzdXBwb3J0ZWQ6ICR7dC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUxfWApfX1mdW5jdGlvbiB0UyhlLHQpe2lmKHQubG9naWNhbExldmVsVGVjaG5pcXVlMT09PVguREVMVEEmJnQubG9naWNhbExldmVsVGVjaG5pcXVlMj09PVguTk9ORSlyZXR1cm4gSmIoZSk7aWYodC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUxPT09WC5STEUmJnQubG9naWNhbExldmVsVGVjaG5pcXVlMj09PVguTk9ORSl7bGV0IG49dDtyZXR1cm4gWGIoZSxuLnJ1bnMsbi5udW1SbGVWYWx1ZXMpfWlmKHQubG9naWNhbExldmVsVGVjaG5pcXVlMT09PVguTk9ORSYmdC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUyPT09WC5OT05FKXtXYihlKTtsZXQgbj1uZXcgVWludDMyQXJyYXkodC5udW1WYWx1ZXMrMSk7cmV0dXJuIG5bMF09MCxuLnNldChlLDEpLG59aWYodC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUxPT09WC5ERUxUQSYmdC5sb2dpY2FsTGV2ZWxUZWNobmlxdWUyPT09WC5STEUpe2xldCBuPXQscj1ZYihlLG4ucnVucyxuLm51bVJsZVZhbHVlcyk7cmV0dXJuIFViKHIpLG5ldyBVaW50MzJBcnJheShyKX10aHJvdyBFcnJvcihgT25seSBkZWx0YSBlbmNvZGluZyBpcyBzdXBwb3J0ZWQgZm9yIHRyYW5zZm9ybWluZyBsZW5ndGggdG8gb2Zmc2V0IHN0cmVhbXMgeWV0LmApfWZ1bmN0aW9uIG5TKGUsdCxuLHIsaT1gaW50MzJgKXtsZXQgYT1lLmxvZ2ljYWxMZXZlbFRlY2huaXF1ZTE7aWYoYT09PVguUkxFKXJldHVybiBlLnJ1bnM9PT0xPyQuQ09OU1Q6JC5GTEFUO2lmKGEhPT1YLkRFTFRBfHxlLmxvZ2ljYWxMZXZlbFRlY2huaXF1ZTIhPT1YLlJMRSlyZXR1cm4gZS5udW1WYWx1ZXM9PT0xPyQuQ09OU1Q6JC5GTEFUO2xldCBvPXQgaW5zdGFuY2VvZiBTeD90LnNpemUoKTp0LHM9ZTtpZihzLm51bVJsZVZhbHVlcyE9PW8pcmV0dXJuICQuRkxBVDtpZihzLnJ1bnM9PT0xKXJldHVybiAkLlNFUVVFTkNFO2lmKHMucnVucyE9PTIpcmV0dXJuIGUubnVtVmFsdWVzPT09MT8kLkNPTlNUOiQuRkxBVDtsZXQgYz1yLmdldCgpO2lmKGUucGh5c2ljYWxMZXZlbFRlY2huaXF1ZT09PUR5LlZBUklOVClyZXR1cm4gclMobixyLGkpPyQuU0VRVUVOQ0U6ZS5udW1WYWx1ZXM9PT0xPyQuQ09OU1Q6JC5GTEFUO2xldCBsPXIuZ2V0KCksdT1uZXcgSW50MzJBcnJheShuLmJ1ZmZlcixuLmJ5dGVPZmZzZXQrbCw0KTtyZXR1cm4gci5zZXQoYyksdVsyXT09PTImJnVbM109PT0yPyQuU0VRVUVOQ0U6ZS5udW1WYWx1ZXM9PT0xPyQuQ09OU1Q6JC5GTEFUfWZ1bmN0aW9uIHJTKGUsdCxuKXtsZXQgcj1uZXcgRXkodC5nZXQoKSk7aWYobj09PWBpbnQ2NGApe2xldCB0PVNiKGUsciw0KTtyZXR1cm4gdFsyXT09PTJuJiZ0WzNdPT09Mm59bGV0IGk9eGIoZSxyLDQpO3JldHVybiBpWzJdPT09MiYmaVszXT09PTJ9ZnVuY3Rpb24gaVMoZSx0LG4pe3JldHVybiBuP0hiKGUsdC5ydW5zLHQubnVtUmxlVmFsdWVzKTpJYihlLHQucnVucyx0Lm51bVJsZVZhbHVlcyl9dmFyIGFTPWNsYXNzIGV4dGVuZHMgZ3l7Z2V0VmFsdWVGcm9tQnVmZmVyKGUpe3JldHVybiB0aGlzLmRhdGFCdWZmZXJbZV19fSxvUz1jbGFzcyBleHRlbmRzIHl5e2NvbnN0cnVjdG9yKGUsdCxuLHIsaSl7c3VwZXIoZSxpP0JpZ0ludDY0QXJyYXkub2YodCk6QmlnVWludDY0QXJyYXkub2YodCksbixyKX1nZXRWYWx1ZUZyb21CdWZmZXIoZSl7cmV0dXJuIHRoaXMuZGF0YUJ1ZmZlclswXStCaWdJbnQoZSkqdGhpcy5kZWx0YX19O2Z1bmN0aW9uIHNTKGUsdCxuKXtyZXR1cm57eDpjUyhlLHQpLW4seTpjUyhlPj4xLHQpLW59fWZ1bmN0aW9uIGNTKGUsdCl7bGV0IG49MDtmb3IobGV0IHI9MDtyPHQ7cisrKW58PShlJjE8PDIqcik+PnI7cmV0dXJuIG59dmFyIGxTOyhmdW5jdGlvbihlKXtlW2UuUE9JTlQ9MF09YFBPSU5UYCxlW2UuTElORVNUUklORz0xXT1gTElORVNUUklOR2AsZVtlLlBPTFlHT049Ml09YFBPTFlHT05gLGVbZS5NVUxUSVBPSU5UPTNdPWBNVUxUSVBPSU5UYCxlW2UuTVVMVElMSU5FU1RSSU5HPTRdPWBNVUxUSUxJTkVTVFJJTkdgLGVbZS5NVUxUSVBPTFlHT049NV09YE1VTFRJUE9MWUdPTmB9KShsU3x8PXt9KTt2YXIgdVM7KGZ1bmN0aW9uKGUpe2VbZS5QT0lOVD0wXT1gUE9JTlRgLGVbZS5MSU5FU1RSSU5HPTFdPWBMSU5FU1RSSU5HYCxlW2UuUE9MWUdPTj0yXT1gUE9MWUdPTmB9KSh1U3x8PXt9KTt2YXIgZFM7KGZ1bmN0aW9uKGUpe2VbZS5NT1JUT049MF09YE1PUlRPTmAsZVtlLlZFQ18yPTFdPWBWRUNfMmAsZVtlLlZFQ18zPTJdPWBWRUNfM2B9KShkU3x8PXt9KTtmdW5jdGlvbiBmUyhlKXtsZXQgdD1BcnJheShlLm51bUdlb21ldHJpZXMpLG49MSxyPTEsaT0xLGE9MCxvPTAscz0wLGM9ZS5tb3J0b25TZXR0aW5ncyx1PWUudG9wb2xvZ3lWZWN0b3IsZD11Lmdlb21ldHJ5T2Zmc2V0cyxmPXUucGFydE9mZnNldHMscD11LnJpbmdPZmZzZXRzLG09ZS52ZXJ0ZXhPZmZzZXRzLGg9IW18fG0ubGVuZ3RoPT09MCxnPWUuY29udGFpbnNQb2x5Z29uR2VvbWV0cnkoKSxfPWUudmVydGV4QnVmZmVyO2ZvcihsZXQgdT0wO3U8ZS5udW1HZW9tZXRyaWVzO3UrKyl7bGV0IHY9ZS5nZW9tZXRyeVR5cGUodSk7c3dpdGNoKHYpe2Nhc2UgbFMuUE9JTlQ6e2xldCB1LGc7aWYoaCl1PV9bbysrXSxnPV9bbysrXTtlbHNlIGlmKGUudmVydGV4QnVmZmVyVHlwZT09PWRTLk1PUlRPTil7bGV0IGU9X1ttW3MrK11dLHQ9c1MoZSxjLm51bUJpdHMsYy5jb29yZGluYXRlU2hpZnQpO3U9dC54LGc9dC55fWVsc2V7bGV0IGU9bVtzKytdKjI7dT1fW2VdLGc9X1tlKzFdfXRbYSsrXT1bW25ldyBsKHUsZyldXSxkJiZpKyssZiYmbisrLHAmJnIrK31icmVhaztjYXNlIGxTLk1VTFRJUE9JTlQ6e2xldCB1PWRbaV0tZFtpLTFdO2krKztsZXQgZjtpZihoKXtmPUFycmF5KHUpO2ZvcihsZXQgZT0wO2U8dTtlKyspe2xldCB0PV9bbysrXSxuPV9bbysrXTtmW2VdPW5ldyBsKHQsbil9fWVsc2UgZj1wUyhlLnZlcnRleEJ1ZmZlclR5cGUsXyxtLHMsdSwhMSxjKSxzKz11O3RbYSsrXT1mLm1hcChlPT5bZV0pLG4rPXUscis9dX1icmVhaztjYXNlIGxTLkxJTkVTVFJJTkc6e2xldCBsO2c/KGw9cFtyXS1wW3ItMV0scisrKTpsPWZbbl0tZltuLTFdLG4rKztsZXQgdTtoPyh1PW1TKF8sbyxsLCExKSxvKz1sKjIpOih1PXBTKGUudmVydGV4QnVmZmVyVHlwZSxfLG0scyxsLCExLGMpLHMrPWwpLHRbYSsrXT1bdV0sZCYmaSsrfWJyZWFrO2Nhc2UgbFMuUE9MWUdPTjp7bGV0IGw9ZltuXS1mW24tMV07bisrO2xldCB1PUFycmF5KGwtMSksZyx2PXBbcl0tcFtyLTFdO2lmKHIrKyxoKXtnPW1TKF8sbyx2LCEwKSxvKz12KjI7Zm9yKGxldCBlPTA7ZTx1Lmxlbmd0aDtlKyspdj1wW3JdLXBbci0xXSxyKyssdVtlXT1tUyhfLG8sdiwhMCksbys9dioyfWVsc2V7Zz1wUyhlLnZlcnRleEJ1ZmZlclR5cGUsXyxtLHMsdiwhMCxjKSxzKz12O2ZvcihsZXQgdD0wO3Q8dS5sZW5ndGg7dCsrKXY9cFtyXS1wW3ItMV0scisrLHVbdF09cFMoZS52ZXJ0ZXhCdWZmZXJUeXBlLF8sbSxzLHYsITAsYykscys9dn10W2ErK109W2ddLmNvbmNhdCh1KSxkJiZpKyt9YnJlYWs7Y2FzZSBsUy5NVUxUSUxJTkVTVFJJTkc6e2xldCBsPWRbaV0tZFtpLTFdO2krKztsZXQgdT1BcnJheShsKTtmb3IobGV0IHQ9MDt0PGw7dCsrKXtsZXQgaTtpZihnPyhpPXBbcl0tcFtyLTFdLHIrKyk6aT1mW25dLWZbbi0xXSxuKyssaCl1W3RdPW1TKF8sbyxpLCExKSxvKz1pKjI7ZWxzZXtsZXQgbj1wUyhlLnZlcnRleEJ1ZmZlclR5cGUsXyxtLHMsaSwhMSxjKTt1W3RdPW4scys9aX19dFthKytdPXV9YnJlYWs7Y2FzZSBsUy5NVUxUSVBPTFlHT046e2xldCBsPWRbaV0tZFtpLTFdO2krKztsZXQgdT1BcnJheShsKTtmb3IobGV0IHQ9MDt0PGw7dCsrKXtsZXQgaT1mW25dLWZbbi0xXTtuKys7bGV0IGEsbD1BcnJheShpLTEpLGQ9cFtyXS1wW3ItMV07cisrLGg/KGE9bVMoXyxvLGQsITApLG8rPWQqMik6KGE9cFMoZS52ZXJ0ZXhCdWZmZXJUeXBlLF8sbSxzLGQsITAsYykscys9ZCk7Zm9yKGxldCB0PTA7dDxsLmxlbmd0aDt0Kyspe2xldCBuPXBbcl0tcFtyLTFdO3IrKyxoPyhsW3RdPW1TKF8sbyxuLCEwKSxvKz1uKjIpOihsW3RdPXBTKGUudmVydGV4QnVmZmVyVHlwZSxfLG0scyxuLCEwLGMpLHMrPW4pfXVbdF09W2FdLmNvbmNhdChsKX10W2ErK109dS5mbGF0KCl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVGhlIHNwZWNpZmllZCBnZW9tZXRyeSB0eXBlICgke3Z9KSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5gKX19cmV0dXJuIHR9ZnVuY3Rpb24gcFMoZSx0LG4scixpLGEsbyl7cmV0dXJuIGU9PT1kUy5NT1JUT04/Z1ModCxuLHIsaSxhLG8pOmhTKHQsbixyLGksYSl9ZnVuY3Rpb24gbVMoZSx0LG4scil7bGV0IGk9QXJyYXkocj9uKzE6bik7Zm9yKGxldCByPTA7cjxuKjI7cis9Mil7bGV0IG49ZVt0K3JdLGE9ZVt0K3IrMV07aVtyLzJdPW5ldyBsKG4sYSl9cmV0dXJuIHImJihpW2kubGVuZ3RoLTFdPWlbMF0pLGl9ZnVuY3Rpb24gaFMoZSx0LG4scixpKXtsZXQgYT1BcnJheShpP3IrMTpyKTtmb3IobGV0IGk9MDtpPHIqMjtpKz0yKXtsZXQgcj10W24raS8yXSoyLG89ZVtyXSxzPWVbcisxXTthW2kvMl09bmV3IGwobyxzKX1yZXR1cm4gaSYmKGFbYS5sZW5ndGgtMV09YVswXSksYX1mdW5jdGlvbiBnUyhlLHQsbixyLGksYSl7bGV0IG89QXJyYXkoaT9yKzE6cik7Zm9yKGxldCBpPTA7aTxyO2krKyl7bGV0IHI9ZVt0W24raV1dLHM9c1MocixhLm51bUJpdHMsYS5jb29yZGluYXRlU2hpZnQpO29baV09bmV3IGwocy54LHMueSl9cmV0dXJuIGkmJihvW28ubGVuZ3RoLTFdPW9bMF0pLG99dmFyIF9TPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLHIsaSl7dGhpcy5fdmVydGV4QnVmZmVyVHlwZT1lLHRoaXMuX3RvcG9sb2d5VmVjdG9yPXQsdGhpcy5fdmVydGV4T2Zmc2V0cz1uLHRoaXMuX3ZlcnRleEJ1ZmZlcj1yLHRoaXMuX21vcnRvblNldHRpbmdzPWl9Z2V0IHZlcnRleEJ1ZmZlclR5cGUoKXtyZXR1cm4gdGhpcy5fdmVydGV4QnVmZmVyVHlwZX1nZXQgdG9wb2xvZ3lWZWN0b3IoKXtyZXR1cm4gdGhpcy5fdG9wb2xvZ3lWZWN0b3J9Z2V0IHZlcnRleE9mZnNldHMoKXtyZXR1cm4gdGhpcy5fdmVydGV4T2Zmc2V0c31nZXQgdmVydGV4QnVmZmVyKCl7cmV0dXJuIHRoaXMuX3ZlcnRleEJ1ZmZlcn1nZXRTaW1wbGVFbmNvZGVkVmVydGV4KGUpe2xldCB0PXRoaXMudmVydGV4T2Zmc2V0cz90aGlzLnZlcnRleE9mZnNldHNbZV0qMjplKjI7cmV0dXJuW3RoaXMudmVydGV4QnVmZmVyW3RdLHRoaXMudmVydGV4QnVmZmVyW3QrMV1dfWdldFZlcnRleChlKXtpZih0aGlzLnZlcnRleE9mZnNldHMmJnRoaXMubW9ydG9uU2V0dGluZ3Mpe2xldCB0PXRoaXMudmVydGV4T2Zmc2V0c1tlXSxuPXRoaXMudmVydGV4QnVmZmVyW3RdLHI9c1Mobix0aGlzLm1vcnRvblNldHRpbmdzLm51bUJpdHMsdGhpcy5tb3J0b25TZXR0aW5ncy5jb29yZGluYXRlU2hpZnQpO3JldHVybltyLngsci55XX1sZXQgdD10aGlzLnZlcnRleE9mZnNldHM/dGhpcy52ZXJ0ZXhPZmZzZXRzW2VdKjI6ZSoyO3JldHVyblt0aGlzLnZlcnRleEJ1ZmZlclt0XSx0aGlzLnZlcnRleEJ1ZmZlclt0KzFdXX1nZXRHZW9tZXRyaWVzKCl7cmV0dXJuIGZTKHRoaXMpfWdldCBtb3J0b25TZXR0aW5ncygpe3JldHVybiB0aGlzLl9tb3J0b25TZXR0aW5nc319O2Z1bmN0aW9uIHZTKGUsdCxuLHIsaSl7cmV0dXJuIG5ldyBiUyhlLHQsZFMuVkVDXzIsbixyLGkpfWZ1bmN0aW9uIHlTKGUsdCxuLHIsaSxhKXtyZXR1cm4gbmV3IGJTKGUsdCxkUy5NT1JUT04sbixyLGksYSl9dmFyIGJTPWNsYXNzIGV4dGVuZHMgX1N7Y29uc3RydWN0b3IoZSx0LG4scixpLGEsbyl7c3VwZXIobixyLGksYSxvKSx0aGlzLl9udW1HZW9tZXRyaWVzPWUsdGhpcy5fZ2VvbWV0cnlUeXBlPXR9Z2VvbWV0cnlUeXBlKGUpe3JldHVybiB0aGlzLl9nZW9tZXRyeVR5cGV9Z2V0IG51bUdlb21ldHJpZXMoKXtyZXR1cm4gdGhpcy5fbnVtR2VvbWV0cmllc31jb250YWluc1BvbHlnb25HZW9tZXRyeSgpe3JldHVybiB0aGlzLl9nZW9tZXRyeVR5cGU9PT1sUy5QT0xZR09OfHx0aGlzLl9nZW9tZXRyeVR5cGU9PT1sUy5NVUxUSVBPTFlHT059Y29udGFpbnNTaW5nbGVHZW9tZXRyeVR5cGUoKXtyZXR1cm4hMH19O2Z1bmN0aW9uIHhTKGUsdCxuLHIpe3JldHVybiBuZXcgQ1MoZFMuVkVDXzIsZSx0LG4scil9ZnVuY3Rpb24gU1MoZSx0LG4scixpKXtyZXR1cm4gbmV3IENTKGRTLk1PUlRPTixlLHQsbixyLGkpfXZhciBDUz1jbGFzcyBleHRlbmRzIF9Te2NvbnN0cnVjdG9yKGUsdCxuLHIsaSxhKXtzdXBlcihlLG4scixpLGEpLHRoaXMuX2dlb21ldHJ5VHlwZXM9dH1nZW9tZXRyeVR5cGUoZSl7cmV0dXJuIHRoaXMuX2dlb21ldHJ5VHlwZXNbZV19Z2V0IG51bUdlb21ldHJpZXMoKXtyZXR1cm4gdGhpcy5fZ2VvbWV0cnlUeXBlcy5sZW5ndGh9Y29udGFpbnNQb2x5Z29uR2VvbWV0cnkoKXtmb3IobGV0IGU9MDtlPHRoaXMubnVtR2VvbWV0cmllcztlKyspaWYodGhpcy5nZW9tZXRyeVR5cGUoZSk9PT1sUy5QT0xZR09OfHx0aGlzLmdlb21ldHJ5VHlwZShlKT09PWxTLk1VTFRJUE9MWUdPTilyZXR1cm4hMDtyZXR1cm4hMX1jb250YWluc1NpbmdsZUdlb21ldHJ5VHlwZSgpe3JldHVybiExfX0sd1M9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5fdHJpYW5nbGVPZmZzZXRzPWUsdGhpcy5faW5kZXhCdWZmZXI9dCx0aGlzLl92ZXJ0ZXhCdWZmZXI9bix0aGlzLl90b3BvbG9neVZlY3Rvcj1yfWdldCB0cmlhbmdsZU9mZnNldHMoKXtyZXR1cm4gdGhpcy5fdHJpYW5nbGVPZmZzZXRzfWdldCBpbmRleEJ1ZmZlcigpe3JldHVybiB0aGlzLl9pbmRleEJ1ZmZlcn1nZXQgdmVydGV4QnVmZmVyKCl7cmV0dXJuIHRoaXMuX3ZlcnRleEJ1ZmZlcn1nZXQgdG9wb2xvZ3lWZWN0b3IoKXtyZXR1cm4gdGhpcy5fdG9wb2xvZ3lWZWN0b3J9Z2V0R2VvbWV0cmllcygpe2lmKCF0aGlzLl90b3BvbG9neVZlY3Rvcil0aHJvdyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgR3B1VmVjdG9yIHRvIGNvb3JkaW5hdGVzIHdpdGhvdXQgdG9wb2xvZ3kgaW5mb3JtYXRpb25gKTtsZXQgZT1uZXcgVWludDMyQXJyYXkodGhpcy5udW1HZW9tZXRyaWVzKTtmb3IobGV0IHQ9MDt0PHRoaXMubnVtR2VvbWV0cmllczt0KyspZVt0XT10aGlzLmdlb21ldHJ5VHlwZSh0KTtyZXR1cm4geFMoZSx0aGlzLl90b3BvbG9neVZlY3Rvcix2b2lkIDAsdGhpcy5fdmVydGV4QnVmZmVyKS5nZXRHZW9tZXRyaWVzKCl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gbnVsbH19O2Z1bmN0aW9uIFRTKGUsdCxuLHIsaSxhKXtyZXR1cm4gbmV3IEVTKGUsdCxuLHIsaSxhKX12YXIgRVM9Y2xhc3MgZXh0ZW5kcyB3U3tjb25zdHJ1Y3RvcihlLHQsbixyLGksYSl7c3VwZXIobixyLGksYSksdGhpcy5fbnVtR2VvbWV0cmllcz1lLHRoaXMuX2dlb21ldHJ5VHlwZT10fWdlb21ldHJ5VHlwZShlKXtyZXR1cm4gdGhpcy5fZ2VvbWV0cnlUeXBlfWdldCBudW1HZW9tZXRyaWVzKCl7cmV0dXJuIHRoaXMuX251bUdlb21ldHJpZXN9Y29udGFpbnNTaW5nbGVHZW9tZXRyeVR5cGUoKXtyZXR1cm4hMH19O2Z1bmN0aW9uIERTKGUsdCxuLHIsaSl7cmV0dXJuIG5ldyBPUyhlLHQsbixyLGkpfXZhciBPUz1jbGFzcyBleHRlbmRzIHdTe2NvbnN0cnVjdG9yKGUsdCxuLHIsaSl7c3VwZXIodCxuLHIsaSksdGhpcy5fZ2VvbWV0cnlUeXBlcz1lfWdlb21ldHJ5VHlwZShlKXtyZXR1cm4gdGhpcy5fZ2VvbWV0cnlUeXBlc1tlXX1nZXQgbnVtR2VvbWV0cmllcygpe3JldHVybiB0aGlzLl9nZW9tZXRyeVR5cGVzLmxlbmd0aH1jb250YWluc1NpbmdsZUdlb21ldHJ5VHlwZSgpe3JldHVybiExfX07ZnVuY3Rpb24ga1MoZSx0LG4scixpKXtsZXQgYT1RKGUsbiksbz1uUyhhLHIsZSxuKSxzLGMsbCx1O2lmKG89PT0kLkNPTlNUKXtsZXQgbz1WeChlLG4sYSksZCxmLHAsbTtmb3IobGV0IHI9MDtyPHQtMTtyKyspe2xldCB0PVEoZSxuKTtzd2l0Y2godC5waHlzaWNhbFN0cmVhbVR5cGUpe2Nhc2UgbHguTEVOR1RIOnN3aXRjaCh0LmxvZ2ljYWxTdHJlYW1UeXBlLmxlbmd0aFR5cGUpe2Nhc2UgZnguR0VPTUVUUklFUzpkPUx4KGUsbix0KTticmVhaztjYXNlIGZ4LlBBUlRTOmY9THgoZSxuLHQpO2JyZWFrO2Nhc2UgZnguUklOR1M6cD1MeChlLG4sdCk7YnJlYWs7Y2FzZSBmeC5UUklBTkdMRVM6bT1MeChlLG4sdCl9YnJlYWs7Y2FzZSBseC5PRkZTRVQ6c3dpdGNoKHQubG9naWNhbFN0cmVhbVR5cGUub2Zmc2V0VHlwZSl7Y2FzZSBkeC5WRVJURVg6cz1JeChlLG4sdCk7YnJlYWs7Y2FzZSBkeC5JTkRFWDp1PUl4KGUsbix0KX1icmVhaztjYXNlIGx4LkRBVEE6aWYodXguVkVSVEVYPT09dC5sb2dpY2FsU3RyZWFtVHlwZS5kaWN0aW9uYXJ5VHlwZSljPUZ4KGUsbix0LGkpO2Vsc2V7bGV0IHI9dDtsPXtudW1CaXRzOnIubnVtQml0cyxjb29yZGluYXRlU2hpZnQ6ci5jb29yZGluYXRlU2hpZnR9LGM9SXgoZSxuLHQsaSl9fX1yZXR1cm4gdT9kIT09dm9pZCAwfHxmIT09dm9pZCAwP1RTKHIsbyxtLHUsYyx7Z2VvbWV0cnlPZmZzZXRzOmQscGFydE9mZnNldHM6ZixyaW5nT2Zmc2V0czpwfSk6VFMocixvLG0sdSxjKTpsPT09dm9pZCAwP3ZTKHIsbyx7Z2VvbWV0cnlPZmZzZXRzOmQscGFydE9mZnNldHM6ZixyaW5nT2Zmc2V0czpwfSxzLGMpOnlTKHIsbyx7Z2VvbWV0cnlPZmZzZXRzOmQscGFydE9mZnNldHM6ZixyaW5nT2Zmc2V0czpwfSxzLGMsbCl9bGV0IGQ9SXgoZSxuLGEpLGYscCxtLGg7Zm9yKGxldCByPTA7cjx0LTE7cisrKXtsZXQgdD1RKGUsbik7c3dpdGNoKHQucGh5c2ljYWxTdHJlYW1UeXBlKXtjYXNlIGx4LkxFTkdUSDpzd2l0Y2godC5sb2dpY2FsU3RyZWFtVHlwZS5sZW5ndGhUeXBlKXtjYXNlIGZ4LkdFT01FVFJJRVM6Zj1JeChlLG4sdCk7YnJlYWs7Y2FzZSBmeC5QQVJUUzpwPUl4KGUsbix0KTticmVhaztjYXNlIGZ4LlJJTkdTOm09SXgoZSxuLHQpO2JyZWFrO2Nhc2UgZnguVFJJQU5HTEVTOmg9THgoZSxuLHQpfWJyZWFrO2Nhc2UgbHguT0ZGU0VUOnN3aXRjaCh0LmxvZ2ljYWxTdHJlYW1UeXBlLm9mZnNldFR5cGUpe2Nhc2UgZHguVkVSVEVYOnM9SXgoZSxuLHQpO2JyZWFrO2Nhc2UgZHguSU5ERVg6dT1JeChlLG4sdCl9YnJlYWs7Y2FzZSBseC5EQVRBOmlmKHV4LlZFUlRFWD09PXQubG9naWNhbFN0cmVhbVR5cGUuZGljdGlvbmFyeVR5cGUpYz1GeChlLG4sdCxpKTtlbHNle2xldCByPXQ7bD17bnVtQml0czpyLm51bUJpdHMsY29vcmRpbmF0ZVNoaWZ0OnIuY29vcmRpbmF0ZVNoaWZ0fSxjPUl4KGUsbix0LGkpfX19bGV0IGcsXyx2O3JldHVybiBmPyhnPUFTKGQsZiwyKSxwJiZtPyhfPWpTKGQsZyxwLCExKSx2PU5TKGQsZyxfLG0pKTpwJiYoXz1NUyhkLGcscCkpKTpwJiZtPyhfPUFTKGQscCwxKSx2PWpTKGQsXyxtLCEwKSk6cCYmKF89QVMoZCxwLDApKSx1JiYhXz9EUyhkLGgsdSxjKTp1P0RTKGQsaCx1LGMse2dlb21ldHJ5T2Zmc2V0czpnLHBhcnRPZmZzZXRzOl8scmluZ09mZnNldHM6dn0pOmw9PT12b2lkIDA/eFMoZCx7Z2VvbWV0cnlPZmZzZXRzOmcscGFydE9mZnNldHM6XyxyaW5nT2Zmc2V0czp2fSxzLGMpOlNTKGQse2dlb21ldHJ5T2Zmc2V0czpnLHBhcnRPZmZzZXRzOl8scmluZ09mZnNldHM6dn0scyxjLGwpfWZ1bmN0aW9uIEFTKGUsdCxuKXtsZXQgcj1uZXcgVWludDMyQXJyYXkoZS5sZW5ndGgrMSksaT0wO3JbMF09aTtsZXQgYT0wO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKWk9cltvKzFdPWkrKGVbb10+bj90W2ErK106MSk7cmV0dXJuIHJ9ZnVuY3Rpb24galMoZSx0LG4scil7bGV0IGk9bmV3IFVpbnQzMkFycmF5KHRbdC5sZW5ndGgtMV0rMSksYT0wO2lbMF09YTtsZXQgbz0xLHM9MDtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKyl7bGV0IGw9ZVtjXSx1PXRbYysxXS10W2NdO2lmKGw9PT01fHxsPT09Mnx8ciYmKGw9PT00fHxsPT09MSkpZm9yKGxldCBlPTA7ZTx1O2UrKylhPWlbbysrXT1hK25bcysrXTtlbHNlIGZvcihsZXQgZT0wO2U8dTtlKyspaVtvKytdPSsrYX1yZXR1cm4gaX1mdW5jdGlvbiBNUyhlLHQsbil7bGV0IHI9bmV3IFVpbnQzMkFycmF5KHRbdC5sZW5ndGgtMV0rMSksaT0wO3JbMF09aTtsZXQgYT0xLG89MDtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKyl7bGV0IGM9ZVtzXSxsPXRbcysxXS10W3NdO2lmKGM9PT00fHxjPT09MSlmb3IobGV0IGU9MDtlPGw7ZSsrKWk9clthKytdPWkrbltvKytdO2Vsc2UgZm9yKGxldCBlPTA7ZTxsO2UrKylyW2ErK109KytpfXJldHVybiByfWZ1bmN0aW9uIE5TKGUsdCxuLHIpe2xldCBpPW5ldyBVaW50MzJBcnJheShuW24ubGVuZ3RoLTFdKzEpLGE9MDtpWzBdPWE7bGV0IG89MSxzPTEsYz0wO2ZvcihsZXQgbD0wO2w8ZS5sZW5ndGg7bCsrKXtsZXQgdT1lW2xdLGQ9dFtsKzFdLXRbbF07aWYodSE9PTAmJnUhPT0zKWZvcihsZXQgZT0wO2U8ZDtlKyspe2xldCBlPW5bb10tbltvLTFdO28rKztmb3IobGV0IHQ9MDt0PGU7dCsrKWE9aVtzKytdPWErcltjKytdfWVsc2UgZm9yKGxldCBlPTA7ZTxkO2UrKylpW3MrK109KythLG8rK31yZXR1cm4gaX12YXIgUFM9Y2xhc3MgZXh0ZW5kcyBoeXtjb25zdHJ1Y3RvcihlLHQsbil7c3VwZXIoZSx0LmdldEJ1ZmZlcigpLG4pLHRoaXMuZGF0YVZlY3Rvcj10fWdldFZhbHVlRnJvbUJ1ZmZlcihlKXtyZXR1cm4gdGhpcy5kYXRhVmVjdG9yLmdldChlKX19LEZTPWNsYXNzIGV4dGVuZHMgZ3l7Z2V0VmFsdWVGcm9tQnVmZmVyKGUpe3JldHVybiB0aGlzLmRhdGFCdWZmZXJbZV19fSxJUz1jbGFzcyBleHRlbmRzIGh5e2NvbnN0cnVjdG9yKGUsdCxuLHIpe3N1cGVyKGUscj9CaWdJbnQ2NEFycmF5Lm9mKHQpOkJpZ1VpbnQ2NEFycmF5Lm9mKHQpLG4pfWdldFZhbHVlRnJvbUJ1ZmZlcihlKXtyZXR1cm4gdGhpcy5kYXRhQnVmZmVyWzBdfX0sTFM9Y2xhc3MgZXh0ZW5kcyBoeXtjb25zdHJ1Y3RvcihlLHQsbixyKXtzdXBlcihlLG4sciksdGhpcy5vZmZzZXRCdWZmZXI9dH19LFJTPWNsYXNzIGV4dGVuZHMgTFN7Y29uc3RydWN0b3IoZSx0LG4scil7c3VwZXIoZSx0LG4scj8/dC5sZW5ndGgtMSl9Z2V0VmFsdWVGcm9tQnVmZmVyKGUpe2xldCB0PXRoaXMub2Zmc2V0QnVmZmVyW2VdLG49dGhpcy5vZmZzZXRCdWZmZXJbZSsxXTtyZXR1cm4gTngodGhpcy5kYXRhQnVmZmVyLHQsbil9fSx6Uz1jbGFzcyBleHRlbmRzIExTe2NvbnN0cnVjdG9yKGUsdCxuLHIsaSl7c3VwZXIoZSxuLHIsaT8/dC5sZW5ndGgpLHRoaXMuaW5kZXhCdWZmZXI9dCx0aGlzLmluZGV4QnVmZmVyPXR9Z2V0VmFsdWVGcm9tQnVmZmVyKGUpe2xldCB0PXRoaXMuaW5kZXhCdWZmZXJbZV0sbj10aGlzLm9mZnNldEJ1ZmZlclt0XSxyPXRoaXMub2Zmc2V0QnVmZmVyW3QrMV07cmV0dXJuIE54KHRoaXMuZGF0YUJ1ZmZlcixuLHIpfX07ZnVuY3Rpb24gQlMoZSx0KXtsZXQgbj0wO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXtsZXQgaT10W3JdO2k9PT0yNTU/KG4rKyxyKyspOm4rPWVbaV19cmV0dXJuIG59ZnVuY3Rpb24gVlMoZSx0LG4pe2xldCByPW5ldyBVaW50MzJBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aDtlKyspcltlXT1yW2UtMV0rdFtlLTFdO2xldCBpPW5ldyBVaW50OEFycmF5KEJTKHQsbikpLGE9MDtmb3IobGV0IG89MDtvPG4ubGVuZ3RoO28rKyl7bGV0IHM9bltvXTtpZihzPT09MjU1KW8rKyxpW2ErK109bltvXTtlbHNle2xldCBuPXRbc10sbz1yW3NdO2Zvcig7bi0tPjA7KWlbYSsrXT1lW28rK119fXJldHVybiBpfXZhciBIUz1jbGFzcyBleHRlbmRzIExTe2NvbnN0cnVjdG9yKGUsdCxuLHIsaSxhLG8scyl7c3VwZXIoZSxuLHIsbz8/dC5sZW5ndGgpLHRoaXMuaW5kZXhCdWZmZXI9dCx0aGlzLnN5bWJvbE9mZnNldEJ1ZmZlcj1pLHRoaXMuc3ltYm9sVGFibGVCdWZmZXI9YSx0aGlzLnNoYXJlZERpY3Rpb25hcnlDYWNoZT1zfWdldFZhbHVlRnJvbUJ1ZmZlcihlKXt0aGlzLmRlY29kZWREaWN0aW9uYXJ5Pz8odGhpcy5kZWNvZGVkRGljdGlvbmFyeT10aGlzLnNoYXJlZERpY3Rpb25hcnlDYWNoZT8uZGVjb2RlZERpY3Rpb25hcnksdGhpcy5kZWNvZGVkRGljdGlvbmFyeT8/KHRoaXMuZGVjb2RlZERpY3Rpb25hcnk9dGhpcy5kZWNvZGVEaWN0aW9uYXJ5KCksdGhpcy5zaGFyZWREaWN0aW9uYXJ5Q2FjaGUmJih0aGlzLnNoYXJlZERpY3Rpb25hcnlDYWNoZS5kZWNvZGVkRGljdGlvbmFyeT10aGlzLmRlY29kZWREaWN0aW9uYXJ5KSkpO2xldCB0PXRoaXMuaW5kZXhCdWZmZXJbZV0sbj10aGlzLm9mZnNldEJ1ZmZlclt0XSxyPXRoaXMub2Zmc2V0QnVmZmVyW3QrMV07cmV0dXJuIE54KHRoaXMuZGVjb2RlZERpY3Rpb25hcnksbixyKX1kZWNvZGVEaWN0aW9uYXJ5KCl7cmV0dXJuIHRoaXMuc3ltYm9sTGVuZ3RoQnVmZmVyPz89dGhpcy5vZmZzZXRUb0xlbmd0aEJ1ZmZlcih0aGlzLnN5bWJvbE9mZnNldEJ1ZmZlciksVlModGhpcy5zeW1ib2xUYWJsZUJ1ZmZlcix0aGlzLnN5bWJvbExlbmd0aEJ1ZmZlcix0aGlzLmRhdGFCdWZmZXIpfW9mZnNldFRvTGVuZ3RoQnVmZmVyKGUpe2xldCB0PW5ldyBVaW50MzJBcnJheShlLmxlbmd0aC0xKSxuPWVbMF07Zm9yKGxldCByPTE7cjxlLmxlbmd0aDtyKyspe2xldCBpPWVbcl07dFtyLTFdPWktbixuPWl9cmV0dXJuIHR9fTtmdW5jdGlvbiBVUyhlLHQsbixyLGkpe2xldCBhLG8scyxjLGwsdT1pLGQsZjtmb3IobGV0IGU9MDtlPHI7ZSsrKXtsZXQgZT1RKHQsbik7c3dpdGNoKGUucGh5c2ljYWxTdHJlYW1UeXBlKXtjYXNlIGx4LlBSRVNFTlQ6e2xldCByPW5ldyBTeChFeCh0LGUubnVtVmFsdWVzLGUuYnl0ZUxlbmd0aCxuKSxlLm51bVZhbHVlcyk7dT1pPz9yO2JyZWFrfWNhc2UgbHguT0ZGU0VUOm89SXgodCxuLGUsdm9pZCAwLHUpO2JyZWFrO2Nhc2UgbHguTEVOR1RIOntsZXQgcj1MeCh0LG4sZSk7ZnguRElDVElPTkFSWT09PWUubG9naWNhbFN0cmVhbVR5cGUubGVuZ3RoVHlwZT9hPXI6ZnguU1lNQk9MPT09ZS5sb2dpY2FsU3RyZWFtVHlwZS5sZW5ndGhUeXBlP2M9cjpkPXI7YnJlYWt9Y2FzZSBseC5EQVRBOntsZXQgcj10LnN1YmFycmF5KG4uZ2V0KCksbi5nZXQoKStlLmJ5dGVMZW5ndGgpO24uYWRkKGUuYnl0ZUxlbmd0aCk7bGV0IGk9ZS5sb2dpY2FsU3RyZWFtVHlwZS5kaWN0aW9uYXJ5VHlwZTt1eC5GU1NUPT09aT9sPXI6dXguU0lOR0xFPT09aXx8dXguU0hBUkVEPT09aT9zPXI6dXguTk9ORT09PWkmJihmPXIpO2JyZWFrfX19cmV0dXJuIFdTKGUsbCxvLGEscyxjLHUpPz9HUyhlLHMsbyxhLHUpPz9LUyhlLGQsZixvLHUpfWZ1bmN0aW9uIFdTKGUsdCxuLHIsaSxhLG8pe2lmKHQpe2lmKCFufHwhcnx8IWl8fCFhKXRocm93IEVycm9yKGBJbmNvbXBsZXRlIEZTU1QgZGljdGlvbmFyeSBzdHJpbmcgY29sdW1uICIke2V9ImApO3JldHVybiBuZXcgSFMoZSxuLHIsaSxhLHQsbyl9fWZ1bmN0aW9uIEdTKGUsdCxuLHIsaSl7aWYodCl7aWYoIW58fCFyKXRocm93IEVycm9yKGBJbmNvbXBsZXRlIGRpY3Rpb25hcnkgc3RyaW5nIGNvbHVtbiAiJHtlfSJgKTtyZXR1cm4gaT9uZXcgelMoZSxuLHIsdCxpKTpuZXcgelMoZSxuLHIsdCl9fWZ1bmN0aW9uIEtTKGUsdCxuLHIsaSl7aWYoISghdHx8IW4pKXtpZihyKXJldHVybiBpP25ldyB6UyhlLHIsdCxuLGkpOm5ldyB6UyhlLHIsdCxuKTtpZihpJiZpLnNpemUoKSE9PXQubGVuZ3RoLTEpe2xldCByPW5ldyBVaW50MzJBcnJheShpLnNpemUoKSksYT0wO2ZvcihsZXQgZT0wO2U8aS5zaXplKCk7ZSsrKWkuZ2V0KGUpP3JbZV09YSsrOnJbZV09MDtyZXR1cm4gbmV3IHpTKGUscix0LG4saSl9cmV0dXJuIGk/bmV3IFJTKGUsdCxuLGkpOm5ldyBSUyhlLHQsbil9fWZ1bmN0aW9uIHFTKGUsdCxuLHIpe2xldCBpLGEsbyxzLGM9ITE7Zm9yKDshYzspe2xldCBuPVEoZSx0KTtzd2l0Y2gobi5waHlzaWNhbFN0cmVhbVR5cGUpe2Nhc2UgbHguTEVOR1RIOmZ4LkRJQ1RJT05BUlk9PT1uLmxvZ2ljYWxTdHJlYW1UeXBlLmxlbmd0aFR5cGU/aT1MeChlLHQsbik6bz1MeChlLHQsbik7YnJlYWs7Y2FzZSBseC5EQVRBOnV4LlNJTkdMRT09PW4ubG9naWNhbFN0cmVhbVR5cGUuZGljdGlvbmFyeVR5cGV8fHV4LlNIQVJFRD09PW4ubG9naWNhbFN0cmVhbVR5cGUuZGljdGlvbmFyeVR5cGU/KGE9ZS5zdWJhcnJheSh0LmdldCgpLHQuZ2V0KCkrbi5ieXRlTGVuZ3RoKSxjPSEwKTpzPWUuc3ViYXJyYXkodC5nZXQoKSx0LmdldCgpK24uYnl0ZUxlbmd0aCksdC5hZGQobi5ieXRlTGVuZ3RoKX19aWYobi50eXBlIT09YGNvbXBsZXhUeXBlYCl0aHJvdyBFcnJvcihgU2hhcmVkIGRpY3Rpb25hcnkgY29sdW1uICR7bi5uYW1lfSBtdXN0IGJlIGEgY29tcGxleCAoc3RydWN0KSBjb2x1bW4uYCk7aWYoIWl8fCFhKXRocm93IEVycm9yKGBJbmNvbXBsZXRlIHNoYXJlZCBkaWN0aW9uYXJ5IGZvciBjb2x1bW4gIiR7bi5uYW1lfSJgKTtsZXQgbD1uLmNvbXBsZXhUeXBlLmNoaWxkcmVuLHU9W10sZD1zP3t9OnZvaWQgMCxmPTA7Zm9yKGxldCBjIG9mIGwpe2xldCBsPXhiKGUsdCwxKVswXTtpZihsPT09MCljb250aW51ZTtsZXQgcD1jLm5hbWU/YCR7bi5uYW1lfSR7Yy5uYW1lfWA6bi5uYW1lO2lmKHImJiFyLmhhcyhwKSl7VHgobCxlLHQpO2NvbnRpbnVlfWlmKGMudHlwZSE9PWBzY2FsYXJGaWVsZGB8fGMuc2NhbGFyRmllbGQucGh5c2ljYWxUeXBlIT09WS5TVFJJTkcpdGhyb3cgRXJyb3IoYEN1cnJlbnRseSBvbmx5IHNjYWxhciBzdHJpbmcgZmllbGRzIGFyZSBpbXBsZW1lbnRlZCBmb3IgYSBzdHJ1Y3QuYCk7aWYobD4xJiYhYy5udWxsYWJsZXx8bD09PTEmJmMubnVsbGFibGUpdGhyb3cgRXJyb3IoYFRoZSBudW1iZXIgb2Ygc3RyZWFtcyBmb3IgdGhlIGNoaWxkIGZpZWxkICR7Yy5uYW1lfSBkb2VzIG5vdCBtYXRjaCBpdHMgbnVsbGFiaWxpdHkuIG51bGxpYmlsdHk6ICR7Yy5udWxsYWJsZX0sIG51bVN0cmVhbXM6ICR7bH1gKTtsZXQgbTtpZihjLm51bGxhYmxlKXtsZXQgbj1RKGUsdCk7bT1uZXcgU3goRXgoZSxuLm51bVZhbHVlcyxuLmJ5dGVMZW5ndGgsdCksbi5udW1WYWx1ZXMpfWxldCBoPUl4KGUsdCxRKGUsdCksdm9pZCAwLG0pO2lmKHMpe2lmKCFvKXRocm93IEVycm9yKGBJbmNvbXBsZXRlIHNoYXJlZCBGU1NUIGRpY3Rpb25hcnkgZm9yIGNvbHVtbiAiJHtwfSJgKTt1W2YrK109bmV3IEhTKHAsaCxpLGEsbyxzLG0sZCl9ZWxzZSB1W2YrK109bmV3IHpTKHAsaCxpLGEsbSl9cmV0dXJuIHV9dmFyIEpTPWNsYXNzIGV4dGVuZHMgaHl7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGUsbmV3IFVpbnQ4QXJyYXksbj8/dC5sZW5ndGgpLHRoaXMudmFsdWVzPXR9Z2V0VmFsdWVGcm9tQnVmZmVyKGUpe3JldHVybiB0aGlzLnZhbHVlc1tlXX19LFlTOyhmdW5jdGlvbihlKXtlW2UuU1RSSU5HPTFdPWBTVFJJTkdgLGVbZS5JTlQzMj0yXT1gSU5UMzJgLGVbZS5VSU5UMzI9NF09YFVJTlQzMmAsZVtlLklOVDY0PThdPWBJTlQ2NGAsZVtlLlVJTlQ2ND0xNl09YFVJTlQ2NGAsZVtlLkZMT0FUPTMyXT1gRkxPQVRgLGVbZS5ET1VCTEU9NjRdPWBET1VCTEVgLGVbZS5QUkVTRU5DRT0xMjhdPWBQUkVTRU5DRWB9KShZU3x8PXt9KTt2YXIgWFM7KGZ1bmN0aW9uKGUpe2VbZS5GQUxTRT0wXT1gRkFMU0VgLGVbZS5UUlVFPTFdPWBUUlVFYCxlW2UuU1RBUlRfTUFQPTJdPWBTVEFSVF9NQVBgLGVbZS5TVEFSVF9MSVNUPTNdPWBTVEFSVF9MSVNUYCxlW2UuQ09VTlQ9NF09YENPVU5UYH0pKFhTfHw9e30pO2Z1bmN0aW9uIFpTKGUsdCxuLHIpe2xldCBpPVFTKG4pO2lmKHI9PT0wKXJldHVybiBpLm1hcChlPT5uZXcgSlMoZSxbXSkpO2xldCBhPSRTKGUsdCxyKSxvPShhLnByZXNlbnRTdHJlYW0/YS5wcmVzZW50Q291bnQ6YS5sZW5ndGhTdHJlYW0ubGVuZ3RoKS9pLmxlbmd0aCxzPVtdLGM9MCxsPTA7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspe2xldCB0PWlDKGEsZSxvLGMsbCk7cy5wdXNoKG5ldyBKUyhpW2VdLHQudmFsdWUsdC5udWxsYWJpbGl0eUJ1ZmZlcikpLGM9dC5jb3VudHNFbmQsbD10LnZhbHVlc0VuZH1yZXR1cm4gc31mdW5jdGlvbiBRUyhlKXtsZXQgdD1lLnR5cGU9PT1gY29tcGxleFR5cGVgP2UuY29tcGxleFR5cGUuY2hpbGRyZW46dm9pZCAwO3JldHVybiF0fHx0Lmxlbmd0aD09PTA/W2UubmFtZV06dC5tYXAodD0+ZS5uYW1lKyh0Lm5hbWU/P2BgKSl9ZnVuY3Rpb24gJFMoZSx0LG4pe2xldCByPWVbdC5nZXQoKV07dC5hZGQoMSk7bGV0IGk9SXgoZSx0LFEoZSx0KSksYT1uLTEsbz1bXTtyJllTLlNUUklORyYmKGEtPWVDKGUsdCxvKSksYS09dEMoZSx0LHIsbyksYS09bkMoZSx0LHIsbyk7bGV0IHMsYz0wO2lmKHImWVMuUFJFU0VOQ0Upe2xldCBuPXJDKGUsdCk7cz1uLnZhbHVlLGM9bi5jb3VudCxhLS19bGV0IGw9bmV3IFVpbnQzMkFycmF5O2lmKGE+MCYmKGw9SXgoZSx0LFEoZSx0KSksYS0tKSxhIT09MCl0aHJvdyBFcnJvcihgVW5leHBlY3RlZCBudW1iZXIgb2YgcmVtYWluaW5nIHN0cmVhbXMgd2hpbGUgZGVjb2RpbmcgbWFwIGNvbHVtbjogJHthfWApO3JldHVybntsZW5ndGhTdHJlYW06aSxkaWN0aW9uYXJ5Om8scHJlc2VudFN0cmVhbTpzLHByZXNlbnRDb3VudDpjLGZsYXR0ZW5lZFZhbHVlczpsfX1mdW5jdGlvbiBlQyhlLHQsbil7bGV0IHI9ZVt0LmdldCgpXTt0LmFkZCgxKTtsZXQgaT1VUyhgYCxlLHQscik7aWYoaSlmb3IobGV0IGU9MDtlPGkuc2l6ZTtlKyspbi5wdXNoKGkuZ2V0VmFsdWUoZSkpO3JldHVybiByfWZ1bmN0aW9uIHRDKGUsdCxuLHIpe2xldCBpPTA7cmV0dXJuIG4mWVMuSU5UMzI/KHVDKHIsRngoZSx0LFEoZSx0KSkpLGkrKyk6biZZUy5JTlQ2NCYmKHVDKHIsV3goZSx0LFEoZSx0KSkpLGkrKyksbiZZUy5VSU5UMzI/KHVDKHIsSXgoZSx0LFEoZSx0KSkpLGkrKyk6biZZUy5VSU5UNjQmJih1QyhyLEd4KGUsdCxRKGUsdCkpKSxpKyspLGl9ZnVuY3Rpb24gbkMoZSx0LG4scil7bGV0IGk9MDtyZXR1cm4gbiZZUy5GTE9BVCYmKHVDKHIsT3goZSx0LFEoZSx0KS5udW1WYWx1ZXMpKSxpKyspLG4mWVMuRE9VQkxFJiYodUMocixreChlLHQsUShlLHQpLm51bVZhbHVlcykpLGkrKyksaX1mdW5jdGlvbiByQyhlLHQpe2xldCBuPVEoZSx0KTtpZihuLnBoeXNpY2FsU3RyZWFtVHlwZSE9PWx4LlBSRVNFTlQpdGhyb3cgRXJyb3IoYEV4cGVjdGVkIFBSRVNFTlQgc3RyZWFtIGZvciBtYXAgY29sdW1uIGJ1dCBmb3VuZDogJHtuLnBoeXNpY2FsU3RyZWFtVHlwZX1gKTtsZXQgcj1uLm51bVZhbHVlcyxpPXQuZ2V0KCksYT1uZXcgU3goRXgoZSxyLG4uYnl0ZUxlbmd0aCx0KSxyKTtyZXR1cm4gdC5zZXQoaStuLmJ5dGVMZW5ndGgpLHt2YWx1ZTphLGNvdW50OnJ9fWZ1bmN0aW9uIGlDKGUsdCxuLHIsaSl7bGV0e2xlbmd0aFN0cmVhbTphLGZsYXR0ZW5lZFZhbHVlczpvLHByZXNlbnRTdHJlYW06cyxkaWN0aW9uYXJ5OmN9PWUsbD10Km4sdT1uLGQ7aWYocyl7ZD1uZXcgU3gobmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKG4vOCkpLG4pLHU9MDtmb3IobGV0IGU9MDtlPG47ZSsrKXMuZ2V0KGwrZSkmJihkLnNldChlLCEwKSx1KyspfWxldCBmPXIrdTtpZihmPmEubGVuZ3RoKXRocm93IEVycm9yKGBNZXJnZWQgbWFwIGNvdW50cyB1bmRlcmZsb3cgd2hpbGUgZGVjb2RpbmcgY2hpbGQgc3RyZWFtc2ApO2xldCBwPUFycmF5KG4pLG09cixoPWk7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7aWYocyYmIXMuZ2V0KGwrZSkpe3BbZV09bnVsbDtjb250aW51ZX1sZXQgdD1oK2FbbSsrXTtpZih0Pm8ubGVuZ3RoKXRocm93IEVycm9yKGBNYXAgdmFsdWUgc3RyZWFtIHVuZGVyZmxvdyB3aGlsZSBkZWNvZGluZyBmZWF0dXJlIHBheWxvYWRgKTtsZXQgbj1hQyhvLGgsdCxjKTtwW2VdPW4udmFsdWUsaD1uLm5leHRJbmRleH1sZXQgZz0wO2ZvcihsZXQgZT1yO2U8ZjtlKyspZys9YVtlXTtsZXQgXz1pK2c7aWYoaCE9PV8pdGhyb3cgRXJyb3IoYFVudXNlZCBmbGF0dGVuZWQgbWFwIHZhbHVlcyByZW1haW4gYWZ0ZXIgZGVjb2RlYCk7cmV0dXJue3ZhbHVlOnAsbnVsbGFiaWxpdHlCdWZmZXI6ZCxjb3VudHNFbmQ6Zix2YWx1ZXNFbmQ6X319ZnVuY3Rpb24gYUMoZSx0LG4scil7cmV0dXJuIG4tdD09PTF8fGVbdF09PT1YUy5TVEFSVF9MSVNUP3NDKGUsdCxuLHIpOm9DKGUsdCxuLHIpfWZ1bmN0aW9uIG9DKGUsdCxuLHIpe2xldCBpPU9iamVjdC5jcmVhdGUobnVsbCksYT10O2Zvcig7YTxuOyl7bGV0IHQ9bEMoZVthKytdLHIpO2lmKHR5cGVvZiB0IT1gc3RyaW5nYCl0aHJvdyBFcnJvcihgTWFwIGtleSBkaWN0aW9uYXJ5IGluZGV4IGRvZXMgbm90IHJlc29sdmUgdG8gYSBzdHJpbmc6ICR7dH1gKTtsZXQgbz1zQyhlLGEsbixyKTtpW3RdPW8udmFsdWUsYT1vLm5leHRJbmRleH1yZXR1cm57dmFsdWU6aSxuZXh0SW5kZXg6YX19ZnVuY3Rpb24gc0MoZSx0LG4scil7aWYodD49bil0aHJvdyBFcnJvcihgVW5leHBlY3RlZCBlbmQgb2YgbWFwIHZhbHVlIHN0cmVhbWApO2xldCBpPWVbdF07aWYoaT09PVhTLkZBTFNFKXJldHVybnt2YWx1ZTohMSxuZXh0SW5kZXg6dCsxfTtpZihpPT09WFMuVFJVRSlyZXR1cm57dmFsdWU6ITAsbmV4dEluZGV4OnQrMX07aWYoaT09PVhTLlNUQVJUX01BUCl7bGV0IGk9Y0MoZSx0LG4pO3JldHVybnt2YWx1ZTpvQyhlLHQrMixpLHIpLnZhbHVlLG5leHRJbmRleDppfX1pZihpPT09WFMuU1RBUlRfTElTVCl7bGV0IGk9Y0MoZSx0LG4pLGE9W10sbz10KzI7Zm9yKDtvPGk7KXtsZXQgdD1zQyhlLG8saSxyKTthLnB1c2godC52YWx1ZSksbz10Lm5leHRJbmRleH1yZXR1cm57dmFsdWU6YSxuZXh0SW5kZXg6aX19cmV0dXJue3ZhbHVlOmxDKGksciksbmV4dEluZGV4OnQrMX19ZnVuY3Rpb24gY0MoZSx0LG4pe2lmKHQrMT49bil0aHJvdyBFcnJvcihgTWlzc2luZyBsZW5ndGggZm9yIG5lc3RlZCBtYXAvbGlzdCBwYXlsb2FkYCk7bGV0IHI9ZVt0KzFdO2lmKHI8Mil0aHJvdyBFcnJvcihgSW52YWxpZCBuZXN0ZWQgcGF5bG9hZCBsZW5ndGg6ICR7cn1gKTtsZXQgaT10K3I7aWYoaT5uKXRocm93IEVycm9yKGBOZXN0ZWQgcGF5bG9hZCBleGNlZWRzIGNvbnRhaW5pbmcgcGF5bG9hZCBib3VuZHNgKTtyZXR1cm4gaX1mdW5jdGlvbiBsQyhlLHQpe2xldCBuPWUtWFMuQ09VTlQ7aWYobjwwfHxuPj10Lmxlbmd0aCl0aHJvdyBFcnJvcihgU2NhbGFyIGRpY3Rpb25hcnkgaW5kZXggb3V0IG9mIHJhbmdlOiAke2V9YCk7cmV0dXJuIHRbbl19ZnVuY3Rpb24gdUMoZSx0KXtmb3IobGV0IG4gb2YgdCllLnB1c2gobil9ZnVuY3Rpb24gZEMoZSx0LG4scixpLGEpe3JldHVybiBuLnR5cGU9PT1gc2NhbGFyVHlwZWA/YSYmIWEuaGFzKG4ubmFtZSk/KFR4KHIsZSx0KSxudWxsKTpmQyhyLGUsdCxpLG4uc2NhbGFyVHlwZSxuKTpuLmNvbXBsZXhUeXBlPy5waHlzaWNhbFR5cGU9PT13eS5NQVA/WlMoZSx0LG4scik6cj09PTA/bnVsbDpxUyhlLHQsbixhKX1mdW5jdGlvbiBmQyhlLHQsbixyLGksYSl7bGV0IG87aWYoZT09PTApcmV0dXJuIG51bGw7aWYoYS5udWxsYWJsZSl7bGV0IGU9USh0LG4pLHI9ZS5udW1WYWx1ZXMsaT1uLmdldCgpLGE9RXgodCxyLGUuYnl0ZUxlbmd0aCxuKTtuLnNldChpK2UuYnl0ZUxlbmd0aCksbz1uZXcgU3goYSxlLm51bVZhbHVlcyl9bGV0IHM9bz8/cjtzd2l0Y2goaS5waHlzaWNhbFR5cGUpe2Nhc2UgWS5VSU5UXzMyOmNhc2UgWS5JTlRfMzI6cmV0dXJuIF9DKHQsbixhLGkscyk7Y2FzZSBZLlNUUklORzp7bGV0IHI9YS5udWxsYWJsZT9lLTE6ZTtyZXR1cm4gVVMoYS5uYW1lLHQsbixyLG8pPz9udWxsfWNhc2UgWS5CT09MRUFOOnJldHVybiBwQyh0LG4sYSxyLHMpO2Nhc2UgWS5VSU5UXzY0OmNhc2UgWS5JTlRfNjQ6cmV0dXJuIGdDKHQsbixhLHMsaSk7Y2FzZSBZLkZMT0FUOnJldHVybiBtQyh0LG4sYSxzKTtjYXNlIFkuRE9VQkxFOnJldHVybiBoQyh0LG4sYSxzKTtkZWZhdWx0OnRocm93IEVycm9yKGBUaGUgc3BlY2lmaWVkIGRhdGEgdHlwZSBmb3IgdGhlIGZpZWxkIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkOiAke2l9YCl9fWZ1bmN0aW9uIHBDKGUsdCxuLHIsaSl7bGV0IGE9UShlLHQpLG89YS5udW1WYWx1ZXMscz10LmdldCgpLGM9dkMoaSk/aTp2b2lkIDAsbD1FeChlLG8sYS5ieXRlTGVuZ3RoLHQsYyk7dC5zZXQocythLmJ5dGVMZW5ndGgpO2xldCB1PW5ldyBTeChsLG8pO3JldHVybiBuZXcgUFMobi5uYW1lLHUsaSl9ZnVuY3Rpb24gbUMoZSx0LG4scil7bGV0IGk9UShlLHQpLGE9dkMocik/cjp2b2lkIDAsbz1PeChlLHQsaS5udW1WYWx1ZXMsYSk7cmV0dXJuIG5ldyBGUyhuLm5hbWUsbyxyKX1mdW5jdGlvbiBoQyhlLHQsbixyKXtsZXQgaT1RKGUsdCksYT12QyhyKT9yOnZvaWQgMCxvPWt4KGUsdCxpLm51bVZhbHVlcyxhKTtyZXR1cm4gbmV3IHZ5KG4ubmFtZSxvLHIpfWZ1bmN0aW9uIGdDKGUsdCxuLHIsaSl7bGV0IGE9UShlLHQpLG89blMoYSxyLGUsdCxgaW50NjRgKSxzPWkucGh5c2ljYWxUeXBlPT09WS5JTlRfNjQ7aWYobz09PSQuRkxBVCl7bGV0IGk9dkMocik/cjp2b2lkIDAsbz1zP1d4KGUsdCxhLGkpOkd4KGUsdCxhLGkpO3JldHVybiBuZXcgYVMobi5uYW1lLG8scil9aWYobz09PSQuU0VRVUVOQ0Upe2xldCByPVV4KGUsdCxhKTtyZXR1cm4gbmV3IG9TKG4ubmFtZSxyWzBdLHJbMV0sYS5udW1SbGVWYWx1ZXMscyl9bGV0IGM9cz9KeChlLHQsYSk6WXgoZSx0LGEpO3JldHVybiBuZXcgSVMobi5uYW1lLGMscixzKX1mdW5jdGlvbiBfQyhlLHQsbixyLGkpe2xldCBhPVEoZSx0KSxvPW5TKGEsaSxlLHQpLHM9ci5waHlzaWNhbFR5cGU9PT1ZLklOVF8zMjtpZihvPT09JC5GTEFUKXtsZXQgcj12QyhpKT9pOnZvaWQgMCxvPXM/RngoZSx0LGEsdm9pZCAwLHIpOkl4KGUsdCxhLHZvaWQgMCxyKTtyZXR1cm4gbmV3IF95KG4ubmFtZSxvLGkpfWlmKG89PT0kLlNFUVVFTkNFKXtsZXQgcj1IeChlLHQsYSk7cmV0dXJuIG5ldyBieShuLm5hbWUsclswXSxyWzFdLGEubnVtUmxlVmFsdWVzLHMpfWxldCBjPXM/QngoZSx0LGEpOlZ4KGUsdCxhKTtyZXR1cm4gbmV3IHh5KG4ubmFtZSxjLGkscyl9ZnVuY3Rpb24gdkMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBTeH1jb25zdCB5Qz17SUQ6MCxJRF9OVUxMQUJMRToxLElEX0xPTkc6MixHRU9NRVRSWTo0LFNDQUxBUl9CQVNFOjEwLFNUUlVDVDozMCxNQVA6MzF9O2Z1bmN0aW9uIGJDKGUpe3N3aXRjaChlKXtjYXNlIHlDLklEOmNhc2UgeUMuSUR8eUMuSURfTlVMTEFCTEU6Y2FzZSB5Qy5JRHx5Qy5JRF9MT05HOmNhc2UgeUMuSUR8eUMuSURfTE9OR3x5Qy5JRF9OVUxMQUJMRTpyZXR1cm57bnVsbGFibGU6KGUmeUMuSURfTlVMTEFCTEUpIT09MCxjb2x1bW5TY29wZTpDeS5GRUFUVVJFLHR5cGU6YHNjYWxhclR5cGVgLHNjYWxhclR5cGU6e2xvbmdJRDooZSZ5Qy5JRF9MT05HKSE9PTAsdHlwZTpgbG9naWNhbFR5cGVgLGxvZ2ljYWxUeXBlOlR5LklEfX07Y2FzZSB5Qy5HRU9NRVRSWTpyZXR1cm57bnVsbGFibGU6ITEsY29sdW1uU2NvcGU6Q3kuRkVBVFVSRSx0eXBlOmBjb21wbGV4VHlwZWAsY29tcGxleFR5cGU6e3R5cGU6YHBoeXNpY2FsVHlwZWAscGh5c2ljYWxUeXBlOnd5LkdFT01FVFJZLGNoaWxkcmVuOltdfX07Y2FzZSB5Qy5TVFJVQ1Q6cmV0dXJue251bGxhYmxlOiExLGNvbHVtblNjb3BlOkN5LkZFQVRVUkUsdHlwZTpgY29tcGxleFR5cGVgLGNvbXBsZXhUeXBlOnt0eXBlOmBwaHlzaWNhbFR5cGVgLHBoeXNpY2FsVHlwZTp3eS5TVFJVQ1QsY2hpbGRyZW46W119fTtjYXNlIHlDLk1BUDpyZXR1cm57bnVsbGFibGU6ITAsY29sdW1uU2NvcGU6Q3kuRkVBVFVSRSx0eXBlOmBjb21wbGV4VHlwZWAsY29tcGxleFR5cGU6e3R5cGU6YHBoeXNpY2FsVHlwZWAscGh5c2ljYWxUeXBlOnd5Lk1BUCxjaGlsZHJlbjpbXX19O2RlZmF1bHQ6cmV0dXJuIEVDKGUpfX1mdW5jdGlvbiB4QyhlKXtyZXR1cm4gZT49eUMuU0NBTEFSX0JBU0V9ZnVuY3Rpb24gU0MoZSl7cmV0dXJuIGU9PT15Qy5TVFJVQ1R8fGU9PT15Qy5NQVB9ZnVuY3Rpb24gQ0MoZSl7aWYoZS50eXBlPT09YHNjYWxhclR5cGVgKXtsZXQgdD1lLnNjYWxhclR5cGU7aWYodC50eXBlPT09YHBoeXNpY2FsVHlwZWApc3dpdGNoKHQucGh5c2ljYWxUeXBlKXtjYXNlIFkuQk9PTEVBTjpjYXNlIFkuSU5UXzg6Y2FzZSBZLlVJTlRfODpjYXNlIFkuSU5UXzMyOmNhc2UgWS5VSU5UXzMyOmNhc2UgWS5JTlRfNjQ6Y2FzZSBZLlVJTlRfNjQ6Y2FzZSBZLkZMT0FUOmNhc2UgWS5ET1VCTEU6cmV0dXJuITE7Y2FzZSBZLlNUUklORzpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfWlmKHQudHlwZT09PWBsb2dpY2FsVHlwZWApcmV0dXJuITF9ZWxzZSBpZihlLnR5cGU9PT1gY29tcGxleFR5cGVgKXtsZXQgdD1lLmNvbXBsZXhUeXBlO2lmKHQudHlwZT09PWBwaHlzaWNhbFR5cGVgKXN3aXRjaCh0LnBoeXNpY2FsVHlwZSl7Y2FzZSB3eS5HRU9NRVRSWTpjYXNlIHd5LlNUUlVDVDpjYXNlIHd5Lk1BUDpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1yZXR1cm4gY29uc29sZS53YXJuKGBVbmV4cGVjdGVkIGNvbHVtbiB0eXBlIGluIGhhc1N0cmVhbUNvdW50YCxlKSwhMX1mdW5jdGlvbiB3QyhlKXtyZXR1cm4gZS50eXBlPT09YHNjYWxhclR5cGVgJiZlLnNjYWxhclR5cGU/LnR5cGU9PT1gbG9naWNhbFR5cGVgJiZlLnNjYWxhclR5cGUubG9naWNhbFR5cGU9PT1UeS5JRH1mdW5jdGlvbiBUQyhlKXtyZXR1cm4gZS50eXBlPT09YGNvbXBsZXhUeXBlYCYmZS5jb21wbGV4VHlwZT8udHlwZT09PWBwaHlzaWNhbFR5cGVgJiZlLmNvbXBsZXhUeXBlLnBoeXNpY2FsVHlwZT09PXd5LkdFT01FVFJZfWZ1bmN0aW9uIEVDKGUpe2xldCB0O3N3aXRjaChlKXtjYXNlIDEwOmNhc2UgMTE6dD1ZLkJPT0xFQU47YnJlYWs7Y2FzZSAxMjpjYXNlIDEzOnQ9WS5JTlRfODticmVhaztjYXNlIDE0OmNhc2UgMTU6dD1ZLlVJTlRfODticmVhaztjYXNlIDE2OmNhc2UgMTc6dD1ZLklOVF8zMjticmVhaztjYXNlIDE4OmNhc2UgMTk6dD1ZLlVJTlRfMzI7YnJlYWs7Y2FzZSAyMDpjYXNlIDIxOnQ9WS5JTlRfNjQ7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOnQ9WS5VSU5UXzY0O2JyZWFrO2Nhc2UgMjQ6Y2FzZSAyNTp0PVkuRkxPQVQ7YnJlYWs7Y2FzZSAyNjpjYXNlIDI3OnQ9WS5ET1VCTEU7YnJlYWs7Y2FzZSAyODpjYXNlIDI5OnQ9WS5TVFJJTkc7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gbnVsbH1yZXR1cm57bnVsbGFibGU6ISEoZSYxKSxjb2x1bW5TY29wZTpDeS5GRUFUVVJFLHR5cGU6YHNjYWxhclR5cGVgLHNjYWxhclR5cGU6e2xvbmdJRDohMSx0eXBlOmBwaHlzaWNhbFR5cGVgLHBoeXNpY2FsVHlwZTp0fX19Y29uc3QgREM9bmV3IFRleHREZWNvZGVyLE9DPWAwLTMoSUQpLCA0KEdFT01FVFJZKSwgMTAtMjkoc2NhbGFycyksIDMwKFNUUlVDVCksIDMxKE1BUClgO2Z1bmN0aW9uIGtDKGUsdCl7bGV0IG49eGIoZSx0LDEpWzBdO2lmKG49PT0wKXJldHVybmBgO2xldCByPXQuZ2V0KCksaT1yK24sYT1lLnN1YmFycmF5KHIsaSk7cmV0dXJuIHQuYWRkKG4pLERDLmRlY29kZShhKX1mdW5jdGlvbiBBQyhlKXtsZXQgdD1lLm5hbWUsbj1lLm51bGxhYmxlO3JldHVybiBlLnR5cGU9PT1gc2NhbGFyVHlwZWA/e3R5cGU6YHNjYWxhckZpZWxkYCxzY2FsYXJGaWVsZDplLnNjYWxhclR5cGUsbmFtZTp0LG51bGxhYmxlOm59Ont0eXBlOmBjb21wbGV4RmllbGRgLGNvbXBsZXhGaWVsZDplLmNvbXBsZXhUeXBlLG5hbWU6dCxudWxsYWJsZTpufX1mdW5jdGlvbiBqQyhlLHQpe2xldCBuPXhiKGUsdCwxKVswXT4+PjAscj1uPj15Qy5TQ0FMQVJfQkFTRT9iQyhuKTpudWxsO2lmKCFyKXRocm93IEVycm9yKGBVbnN1cHBvcnRlZCBmaWVsZCB0eXBlIGNvZGUgJHtufS4gU3VwcG9ydGVkOiAxMC0yOShzY2FsYXJzKSwgMzAoU1RSVUNUKSwgMzEoTUFQKWApO2xldCBpPXsuLi5yLG5hbWU6a0MoZSx0KX07aWYoaS50eXBlPT09YGNvbXBsZXhUeXBlYCYmU0Mobikpe2xldCBuPWkuY29tcGxleFR5cGUscj14YihlLHQsMSlbMF0+Pj4wO24uY2hpbGRyZW49QXJyYXkocik7Zm9yKGxldCBpPTA7aTxyO2krKyluLmNoaWxkcmVuW2ldPWpDKGUsdCl9cmV0dXJuIEFDKGkpfWZ1bmN0aW9uIE1DKGUsdCl7bGV0IG49eGIoZSx0LDEpWzBdPj4+MCxyPWJDKG4pO2lmKCFyKXRocm93IEVycm9yKGBVbnN1cHBvcnRlZCBjb2x1bW4gdHlwZSBjb2RlICR7bn0uIFN1cHBvcnRlZDogJHtPQ31gKTtsZXQgaTtpZih4QyhuKSlpPWtDKGUsdCk7ZWxzZSBpZihuPHlDLkdFT01FVFJZKWk9YGlkYDtlbHNlIGlmKG49PT15Qy5HRU9NRVRSWSlpPWBnZW9tZXRyeWA7ZWxzZSB0aHJvdyBFcnJvcihgVW5zdXBwb3J0ZWQgY29sdW1uIHR5cGUgY29kZSAke259LiBTdXBwb3J0ZWQ6ICR7T0N9YCk7bGV0IGE9ey4uLnIsbmFtZTppfTtpZihhLnR5cGU9PT1gY29tcGxleFR5cGVgJiZTQyhuKSl7bGV0IG49eGIoZSx0LDEpWzBdPj4+MCxyPWEuY29tcGxleFR5cGU7ci5jaGlsZHJlbj1BcnJheShuKTtmb3IobGV0IGk9MDtpPG47aSsrKXIuY2hpbGRyZW5baV09akMoZSx0KX1yZXR1cm4gYX1mdW5jdGlvbiBOQyhlLHQpe2xldCBuPXt9O24uZmVhdHVyZVRhYmxlcz1bXTtsZXQgcj17fTtpZihyLm5hbWU9a0MoZSx0KSxyLm5hbWUubGVuZ3RoPT09MCl0aHJvdyBFcnJvcihgTWlzc2luZyBsYXllciBuYW1lYCk7bGV0IGk9eGIoZSx0LDEpWzBdPj4+MCxhPXhiKGUsdCwxKVswXT4+PjA7ci5jb2x1bW5zPUFycmF5KGEpO2ZvcihsZXQgbj0wO248YTtuKyspci5jb2x1bW5zW25dPU1DKGUsdCk7cmV0dXJuIG4uZmVhdHVyZVRhYmxlcy5wdXNoKHIpLFtuLGldfWZ1bmN0aW9uIFBDKGUsdCxuPSEwKXtsZXQgcj1uZXcgRXkoMCksaT1bXTtmb3IoO3IuZ2V0KCk8ZS5sZW5ndGg7KXtsZXQgYT14YihlLHIsMSlbMF0+Pj4wLG89ci5nZXQoKSthO2lmKG8+ZS5sZW5ndGgpdGhyb3cgRXJyb3IoYEJsb2NrIG92ZXJydW5zIHRpbGU6ICR7b30gPiAke2UubGVuZ3RofWApO2xldCBzPXhiKGUsciwxKVswXT4+PjA7aWYocyE9PTEmJnMhPT0yKXtyLnNldChvKTtjb250aW51ZX1sZXRbYyxsXT1OQyhlLHIpLHU9Yy5mZWF0dXJlVGFibGVzWzBdLGQ9bnVsbCxmPW51bGwscD1bXSxtPTA7Zm9yKGxldCBpIG9mIHUuY29sdW1ucyl7bGV0IGE9aS5uYW1lO2lmKHdDKGkpKXtsZXQgdD1udWxsO2lmKGkubnVsbGFibGUpe2xldCBuPVEoZSxyKSxpPXIuZ2V0KCksYT1FeChlLG4ubnVtVmFsdWVzLG4uYnl0ZUxlbmd0aCxyKTtyLnNldChpK24uYnl0ZUxlbmd0aCksdD1uZXcgU3goYSxuLm51bVZhbHVlcyl9bGV0IG89UShlLHIpO209dD90LnNpemUoKTpvLmRlY29tcHJlc3NlZENvdW50LGQ9RkMoZSxpLHIsYSxvLHQ/P20sbil9ZWxzZSBpZihUQyhpKSl7bGV0IG49eGIoZSxyLDEpWzBdO2lmKG09PT0wKXtsZXQgdD1yLmdldCgpO209UShlLHIpLmRlY29tcHJlc3NlZENvdW50LHIuc2V0KHQpfXQmJih0LnNjYWxlPXQuZXh0ZW50L2wpLGY9a1MoZSxuLHIsbSx0KX1lbHNle2xldCB0PUNDKGkpP3hiKGUsciwxKVswXToxO2lmKHQ9PT0wKWNvbnRpbnVlO2xldCBuPWRDKGUscixpLHQsbSx2b2lkIDApO2lmKG4pe2lmKEFycmF5LmlzQXJyYXkobikpZm9yKGxldCBlIG9mIG4pcC5wdXNoKGUpO2Vsc2UgcC5wdXNoKG4pfX19bGV0IGg9bmV3IFN5KHUubmFtZSxmLGQscCxsKTtpLnB1c2goaCksci5zZXQobyl9cmV0dXJuIGl9ZnVuY3Rpb24gRkMoZSx0LG4scixpLGEsbz0hMSl7bGV0IHM9dC5zY2FsYXJUeXBlPy5sb25nSUQ/WS5VSU5UXzY0OlkuVUlOVF8zMixjPXR5cGVvZiBhPT1gbnVtYmVyYD92b2lkIDA6YSxsPW5TKGksYSxlLG4scz09PVkuVUlOVF82ND9gaW50NjRgOmBpbnQzMmApO2lmKHM9PT1ZLlVJTlRfMzIpc3dpdGNoKGwpe2Nhc2UgJC5GTEFUOnJldHVybiBuZXcgX3kocixJeChlLG4saSx2b2lkIDAsYyksYSk7Y2FzZSAkLlNFUVVFTkNFOntsZXQgdD1IeChlLG4saSk7cmV0dXJuIG5ldyBieShyLHRbMF0sdFsxXSxpLm51bVJsZVZhbHVlcywhMSl9Y2FzZSAkLkNPTlNUOnJldHVybiBuZXcgeHkocixWeChlLG4saSksYSwhMSl9c3dpdGNoKGwpe2Nhc2UgJC5GTEFUOnJldHVybiBvP25ldyB2eShyLEt4KGUsbixpLGMpLGEpOm5ldyBhUyhyLEd4KGUsbixpLGMpLGEpO2Nhc2UgJC5TRVFVRU5DRTp7bGV0IHQ9VXgoZSxuLGkpO3JldHVybiBuZXcgb1Mocix0WzBdLHRbMV0saS5udW1SbGVWYWx1ZXMsITEpfWNhc2UgJC5DT05TVDpyZXR1cm4gbmV3IElTKHIsWXgoZSxuLGkpLGEsITEpfXRocm93IEVycm9yKGBWZWN0b3IgdHlwZSBub3Qgc3VwcG9ydGVkIGZvciBpZCBjb2x1bW4uYCl9dmFyIElDPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7c3dpdGNoKHRoaXMuX2ZlYXR1cmVEYXRhPWUsdGhpcy5wcm9wZXJ0aWVzPXRoaXMuX2ZlYXR1cmVEYXRhLnByb3BlcnRpZXN8fHt9LHRoaXMuX2ZlYXR1cmVEYXRhLmdlb21ldHJ5Py50eXBlKXtjYXNlIGxTLlBPSU5UOmNhc2UgbFMuTVVMVElQT0lOVDp0aGlzLnR5cGU9MTticmVhaztjYXNlIGxTLkxJTkVTVFJJTkc6Y2FzZSBsUy5NVUxUSUxJTkVTVFJJTkc6dGhpcy50eXBlPTI7YnJlYWs7Y2FzZSBsUy5QT0xZR09OOmNhc2UgbFMuTVVMVElQT0xZR09OOnRoaXMudHlwZT0zO2JyZWFrO2RlZmF1bHQ6dGhpcy50eXBlPTB9dGhpcy5leHRlbnQ9dCx0aGlzLmlkPU51bWJlcih0aGlzLl9mZWF0dXJlRGF0YS5pZCl9bG9hZEdlb21ldHJ5KCl7bGV0IGU9W107Zm9yKGxldCB0IG9mIHRoaXMuX2ZlYXR1cmVEYXRhLmdlb21ldHJ5LmNvb3JkaW5hdGVzKXtsZXQgbj1bXTtmb3IobGV0IGUgb2YgdCluLnB1c2gobmV3IGwoZS54LGUueSkpO2UucHVzaChuKX1yZXR1cm4gZX19LExDPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuZmVhdHVyZXM9W10sdGhpcy5mZWF0dXJlVGFibGU9ZSx0aGlzLm5hbWU9ZS5uYW1lLHRoaXMuZXh0ZW50PWUuZXh0ZW50LHRoaXMudmVyc2lvbj0yLHRoaXMuZmVhdHVyZXM9ZS5nZXRGZWF0dXJlcygpLHRoaXMubGVuZ3RoPXRoaXMuZmVhdHVyZXMubGVuZ3RofWZlYXR1cmUoZSl7cmV0dXJuIG5ldyBJQyh0aGlzLmZlYXR1cmVzW2VdLHRoaXMuZXh0ZW50KX19LFJDPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMubGF5ZXJzPXt9O2xldCB0PVBDKG5ldyBVaW50OEFycmF5KGUpKTt0aGlzLmxheWVycz10LnJlZHVjZSgoZSx0KT0+KHsuLi5lLFt0Lm5hbWVdOm5ldyBMQyh0KX0pLHt9KX19LHpDPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50aWxlSUQ9ZSx0aGlzLng9ZS5jYW5vbmljYWwueCx0aGlzLnk9ZS5jYW5vbmljYWwueSx0aGlzLno9ZS5jYW5vbmljYWwueix0aGlzLmdyaWQ9bmV3IGdjKGosMTYsMCksdGhpcy5ncmlkM0Q9bmV3IGdjKGosMTYsMCksdGhpcy5mZWF0dXJlSW5kZXhBcnJheT1uZXcgbnUsdGhpcy5wcm9tb3RlSWQ9dH1pbnNlcnQoZSx0LG4scixpLGEpe2xldCBvPXRoaXMuZmVhdHVyZUluZGV4QXJyYXkubGVuZ3RoO3RoaXMuZmVhdHVyZUluZGV4QXJyYXkuZW1wbGFjZUJhY2sobixyLGkpO2xldCBzPWE/dGhpcy5ncmlkM0Q6dGhpcy5ncmlkO2ZvcihsZXQgZSBvZiB0KXtsZXQgdD1bMS8wLDEvMCwtMS8wLC0xLzBdO2ZvcihsZXQgbiBvZiBlKXRbMF09TWF0aC5taW4odFswXSxuLngpLHRbMV09TWF0aC5taW4odFsxXSxuLnkpLHRbMl09TWF0aC5tYXgodFsyXSxuLngpLHRbM109TWF0aC5tYXgodFszXSxuLnkpO3RbMF08ODE5MiYmdFsxXTw4MTkyJiZ0WzJdPj0wJiZ0WzNdPj0wJiZzLmluc2VydChvLHRbMF0sdFsxXSx0WzJdLHRbM10pfX1sb2FkVlRMYXllcnMoKXtpZighdGhpcy52dExheWVycyl7c3dpdGNoKHRoaXMuZW5jb2Rpbmcpe2Nhc2VgbWx0YDp0aGlzLnZ0TGF5ZXJzPW5ldyBSQyh0aGlzLnJhd1RpbGVEYXRhKS5sYXllcnM7YnJlYWs7ZGVmYXVsdDp0aGlzLnZ0TGF5ZXJzPW5ldyAkcChuZXcgaV8odGhpcy5yYXdUaWxlRGF0YSkpLmxheWVyc310aGlzLnNvdXJjZUxheWVyQ29kZXI9bmV3IHB5KHRoaXMudnRMYXllcnM/T2JqZWN0LmtleXModGhpcy52dExheWVycykuc29ydCgpOltueV0pfXJldHVybiB0aGlzLnZ0TGF5ZXJzfXF1ZXJ5KGUsdCxuLHIpe3RoaXMubG9hZFZUTGF5ZXJzKCk7bGV0IGk9ZS5wYXJhbXMsYT1qL2UudGlsZVNpemUvZS5zY2FsZSxvPXRzKGkuZmlsdGVyLGBxdWVyeVJlbmRlcmVkRmVhdHVyZXMgZmlsdGVyYCxpLmdsb2JhbFN0YXRlKSxzPWUucXVlcnlHZW9tZXRyeSxjPWUucXVlcnlQYWRkaW5nKmEsbD1XcC5mcm9tUG9pbnRzKHMpLHU9dGhpcy5ncmlkLnF1ZXJ5KGwubWluWC1jLGwubWluWS1jLGwubWF4WCtjLGwubWF4WStjKSxkPVdwLmZyb21Qb2ludHMoZS5jYW1lcmFRdWVyeUdlb21ldHJ5KS5leHBhbmRCeShjKSxmPXRoaXMuZ3JpZDNELnF1ZXJ5KGQubWluWCxkLm1pblksZC5tYXhYLGQubWF4WSwodCxuLHIsaSk9PndkKGUuY2FtZXJhUXVlcnlHZW9tZXRyeSx0LWMsbi1jLHIrYyxpK2MpKTtmb3IobGV0IGUgb2YgZil1LnB1c2goZSk7dS5zb3J0KEhDKTtsZXQgcD17fSxtO2ZvcihsZXQgYyBvZiB1KXtpZihjPT09bSljb250aW51ZTttPWM7bGV0IGw9dGhpcy5mZWF0dXJlSW5kZXhBcnJheS5nZXQoYyksdT1udWxsO3RoaXMubG9hZE1hdGNoaW5nRmVhdHVyZShwLGwuYnVja2V0SW5kZXgsbC5zb3VyY2VMYXllckluZGV4LGwuZmVhdHVyZUluZGV4LG8saS5sYXllcnMsaS5hdmFpbGFibGVJbWFnZXMsdCxuLHIsKHQsbixyKT0+KHV8fD1jZCh0KSxuLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUoe3F1ZXJ5R2VvbWV0cnk6cyxmZWF0dXJlOnQsZmVhdHVyZVN0YXRlOnIsZ2VvbWV0cnk6dSx6b29tOnRoaXMueix0cmFuc2Zvcm06ZS50cmFuc2Zvcm0scGl4ZWxzVG9UaWxlVW5pdHM6YSxwaXhlbFBvc01hdHJpeDplLnBpeGVsUG9zTWF0cml4LHVud3JhcHBlZFRpbGVJRDp0aGlzLnRpbGVJRC50b1Vud3JhcHBlZCgpLGdldEVsZXZhdGlvbjplLmdldEVsZXZhdGlvbn0pKSl9cmV0dXJuIHB9bG9hZE1hdGNoaW5nRmVhdHVyZShlLHQsbixyLGksYSxvLHMsYyxsLHUpe2xldCBkPXRoaXMuYnVja2V0TGF5ZXJJRHNbdF07aWYoYSYmIWQuc29tZShlPT5hLmhhcyhlKSkpcmV0dXJuO2xldCBmPXRoaXMuc291cmNlTGF5ZXJDb2Rlci5kZWNvZGUobikscD10aGlzLnZ0TGF5ZXJzW2ZdLmZlYXR1cmUocik7aWYoaS5uZWVkR2VvbWV0cnkpe2xldCBlPWxkKHAsITApO2lmKCFpLmZpbHRlcihuZXcgVSh0aGlzLnRpbGVJRC5vdmVyc2NhbGVkWiksZSx0aGlzLnRpbGVJRC5jYW5vbmljYWwpKXJldHVybn1lbHNlIGlmKCFpLmZpbHRlcihuZXcgVSh0aGlzLnRpbGVJRC5vdmVyc2NhbGVkWikscCkpcmV0dXJuO2xldCBtPXRoaXMuZ2V0SWQocCxmKTtmb3IobGV0IHQgb2YgZCl7aWYoYSYmIWEuaGFzKHQpKWNvbnRpbnVlO2xldCBuPXNbdF07aWYoIW4pY29udGludWU7bGV0IGk9e307bSYmbCYmKGk9bC5nZXRTdGF0ZShuLnNvdXJjZUxheWVyfHxgX2dlb2pzb25UaWxlTGF5ZXJgLG0pKTtsZXQgZD1TdCh7fSxjW3RdKTtkLnBhaW50PVZDKGQucGFpbnQsbi5wYWludCxwLGksbyksZC5sYXlvdXQ9VkMoZC5sYXlvdXQsbi5sYXlvdXQscCxpLG8pO2xldCBmPSF1fHx1KHAsbixpKTtpZighZiljb250aW51ZTtsZXQgaD1uZXcgbXkocCx0aGlzLnosdGhpcy54LHRoaXMueSxtKTtoLmxheWVyPWQ7bGV0IGc9ZVt0XTtnPT09dm9pZCAwJiYoZz1lW3RdPVtdKSxnLnB1c2goe2ZlYXR1cmVJbmRleDpyLGZlYXR1cmU6aCxpbnRlcnNlY3Rpb25aOmZ9KX19bG9va3VwU3ltYm9sRmVhdHVyZXMoZSx0LG4scixpLGEsbyxzKXtsZXQgYz17fTt0aGlzLmxvYWRWVExheWVycygpO2xldCBsPXRzKGkuZmlsdGVyU3BlYyxgcXVlcnlSZW5kZXJlZEZlYXR1cmVzIHN5bWJvbCBmaWx0ZXJgLGkuZ2xvYmFsU3RhdGUpO2ZvcihsZXQgaSBvZiBlKXRoaXMubG9hZE1hdGNoaW5nRmVhdHVyZShjLG4scixpLGwsYSxvLHMsdCk7cmV0dXJuIGN9aGFzTGF5ZXIoZSl7Zm9yKGxldCB0IG9mIHRoaXMuYnVja2V0TGF5ZXJJRHMpZm9yKGxldCBuIG9mIHQpaWYoZT09PW4pcmV0dXJuITA7cmV0dXJuITF9Z2V0SWQoZSx0KXtsZXQgbj1lLmlkO2lmKHRoaXMucHJvbW90ZUlkKXtsZXQgcj10eXBlb2YgdGhpcy5wcm9tb3RlSWQ9PWBzdHJpbmdgP3RoaXMucHJvbW90ZUlkOnRoaXMucHJvbW90ZUlkW3RdO249ZS5wcm9wZXJ0aWVzW3JdLHR5cGVvZiBuPT1gYm9vbGVhbmAmJihuPU51bWJlcihuKSksbj09PXZvaWQgMCYmZS5wcm9wZXJ0aWVzPy5jbHVzdGVyJiZ0aGlzLnByb21vdGVJZCYmKG49TnVtYmVyKGUucHJvcGVydGllcy5jbHVzdGVyX2lkKSl9cmV0dXJuIG59fTtIKGBGZWF0dXJlSW5kZXhgLHpDLHtvbWl0OltgcmF3VGlsZURhdGFgLGBzb3VyY2VMYXllckNvZGVyYF19KTtmdW5jdGlvbiBCQyhlKXtyZXR1cm4gdHlwZW9mIGU9PWBvYmplY3RgJiYhIWUmJmBldmFsdWF0ZWBpbiBlfWZ1bmN0aW9uIFZDKGUsdCxuLHIsaSl7cmV0dXJuIGp0KGUsKGUsYSk9PntsZXQgbz10IGluc3RhbmNlb2Ygbmw/dC5nZXQoYSk6bnVsbDtyZXR1cm4gQkMobyk/by5ldmFsdWF0ZShuLHIsdm9pZCAwLGkpOm99KX1mdW5jdGlvbiBIQyhlLHQpe3JldHVybiB0LWV9dmFyIFVDPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5tYXg9ZSx0aGlzLm9uUmVtb3ZlPXQsdGhpcy5yZXNldCgpfXJlc2V0KCl7Zm9yKGxldCBlIGluIHRoaXMuZGF0YSlmb3IobGV0IHQgb2YgdGhpcy5kYXRhW2VdKXQudGltZW91dCYmY2xlYXJUaW1lb3V0KHQudGltZW91dCksdGhpcy5vblJlbW92ZSh0LnZhbHVlKTtyZXR1cm4gdGhpcy5kYXRhPXt9LHRoaXMub3JkZXI9W10sdGhpc31hZGQoZSx0LG4pe2xldCByPWUud3JhcHBlZCgpLmtleTt0aGlzLmRhdGFbcl09PT12b2lkIDAmJih0aGlzLmRhdGFbcl09W10pO2xldCBpPXt2YWx1ZTp0LHRpbWVvdXQ6dm9pZCAwfTtpZihuIT09dm9pZCAwJiYoaS50aW1lb3V0PXNldFRpbWVvdXQoKCk9Pnt0aGlzLnJlbW92ZShlLGkpfSxuKSksdGhpcy5kYXRhW3JdLnB1c2goaSksdGhpcy5vcmRlci5wdXNoKHIpLHRoaXMub3JkZXIubGVuZ3RoPnRoaXMubWF4KXtsZXQgZT10aGlzLl9nZXRBbmRSZW1vdmVCeUtleSh0aGlzLm9yZGVyWzBdKTtlJiZ0aGlzLm9uUmVtb3ZlKGUpfXJldHVybiB0aGlzfWhhcyhlKXtyZXR1cm4gZS53cmFwcGVkKCkua2V5IGluIHRoaXMuZGF0YX1nZXRBbmRSZW1vdmUoZSl7cmV0dXJuIHRoaXMuaGFzKGUpP3RoaXMuX2dldEFuZFJlbW92ZUJ5S2V5KGUud3JhcHBlZCgpLmtleSk6bnVsbH1fZ2V0QW5kUmVtb3ZlQnlLZXkoZSl7bGV0IHQ9dGhpcy5kYXRhW2VdLnNoaWZ0KCk7cmV0dXJuIHQudGltZW91dCYmY2xlYXJUaW1lb3V0KHQudGltZW91dCksdGhpcy5kYXRhW2VdLmxlbmd0aD09PTAmJmRlbGV0ZSB0aGlzLmRhdGFbZV0sdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKGUpLDEpLHQudmFsdWV9Z2V0QnlLZXkoZSl7bGV0IHQ9dGhpcy5kYXRhW2VdO3JldHVybiB0P3RbMF0udmFsdWU6bnVsbH1nZXQoZSl7cmV0dXJuIHRoaXMuaGFzKGUpP3RoaXMuZGF0YVtlLndyYXBwZWQoKS5rZXldWzBdLnZhbHVlOm51bGx9cmVtb3ZlKGUsdCl7aWYoIXRoaXMuaGFzKGUpKXJldHVybiB0aGlzO2xldCBuPWUud3JhcHBlZCgpLmtleSxyPXQ9PT12b2lkIDA/MDp0aGlzLmRhdGFbbl0uaW5kZXhPZih0KSxpPXRoaXMuZGF0YVtuXVtyXTtyZXR1cm4gdGhpcy5kYXRhW25dLnNwbGljZShyLDEpLGkudGltZW91dCYmY2xlYXJUaW1lb3V0KGkudGltZW91dCksdGhpcy5kYXRhW25dLmxlbmd0aD09PTAmJmRlbGV0ZSB0aGlzLmRhdGFbbl0sdGhpcy5vblJlbW92ZShpLnZhbHVlKSx0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2YobiksMSksdGhpc31zZXRNYXhTaXplKGUpe2Zvcih0aGlzLm1heD1lO3RoaXMub3JkZXIubGVuZ3RoPnRoaXMubWF4Oyl7bGV0IGU9dGhpcy5fZ2V0QW5kUmVtb3ZlQnlLZXkodGhpcy5vcmRlclswXSk7ZSYmdGhpcy5vblJlbW92ZShlKX1yZXR1cm4gdGhpc31maWx0ZXIoZSl7bGV0IHQ9W107Zm9yKGxldCBuIGluIHRoaXMuZGF0YSlmb3IobGV0IHIgb2YgdGhpcy5kYXRhW25dKWUoci52YWx1ZSl8fHQucHVzaChyKTtmb3IobGV0IGUgb2YgdCl0aGlzLnJlbW92ZShlLnZhbHVlLnRpbGVJRCxlKX19LFdDPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMubWF4RW50cmllcz1lLHRoaXMubWFwPW5ldyBNYXB9Z2V0KGUpe2xldCB0PXRoaXMubWFwLmdldChlKTtyZXR1cm4gdCE9PXZvaWQgMCYmKHRoaXMubWFwLmRlbGV0ZShlKSx0aGlzLm1hcC5zZXQoZSx0KSksdH1zZXQoZSx0KXtpZih0aGlzLm1hcC5oYXMoZSkpdGhpcy5tYXAuZGVsZXRlKGUpO2Vsc2UgaWYodGhpcy5tYXAuc2l6ZT49dGhpcy5tYXhFbnRyaWVzKXtsZXQgZT10aGlzLm1hcC5rZXlzKCkubmV4dCgpLnZhbHVlO3RoaXMubWFwLmRlbGV0ZShlKX10aGlzLm1hcC5zZXQoZSx0KX1jbGVhcigpe3RoaXMubWFwLmNsZWFyKCl9fTtmdW5jdGlvbiBHQyhlLHQsbixyLGkpe2xldCBhPVtdO2ZvcihsZXQgbyBvZiBlKXtsZXQgZTtmb3IobGV0IHM9MDtzPG8ubGVuZ3RoLTE7cysrKXtsZXQgYz1vW3NdLHU9b1tzKzFdO2MueDx0JiZ1Lng8dHx8KGMueDx0P2M9bmV3IGwodCxjLnkrKHUueS1jLnkpKigodC1jLngpLyh1LngtYy54KSkpLl9yb3VuZCgpOnUueDx0JiYodT1uZXcgbCh0LGMueSsodS55LWMueSkqKCh0LWMueCkvKHUueC1jLngpKSkuX3JvdW5kKCkpLCEoYy55PG4mJnUueTxuKSYmKGMueTxuP2M9bmV3IGwoYy54Kyh1LngtYy54KSooKG4tYy55KS8odS55LWMueSkpLG4pLl9yb3VuZCgpOnUueTxuJiYodT1uZXcgbChjLngrKHUueC1jLngpKigobi1jLnkpLyh1LnktYy55KSksbikuX3JvdW5kKCkpLCEoYy54Pj1yJiZ1Lng+PXIpJiYoYy54Pj1yP2M9bmV3IGwocixjLnkrKHUueS1jLnkpKigoci1jLngpLyh1LngtYy54KSkpLl9yb3VuZCgpOnUueD49ciYmKHU9bmV3IGwocixjLnkrKHUueS1jLnkpKigoci1jLngpLyh1LngtYy54KSkpLl9yb3VuZCgpKSwhKGMueT49aSYmdS55Pj1pKSYmKGMueT49aT9jPW5ldyBsKGMueCsodS54LWMueCkqKChpLWMueSkvKHUueS1jLnkpKSxpKS5fcm91bmQoKTp1Lnk+PWkmJih1PW5ldyBsKGMueCsodS54LWMueCkqKChpLWMueSkvKHUueS1jLnkpKSxpKS5fcm91bmQoKSksKCFlfHwhYy5lcXVhbHMoZVtlLmxlbmd0aC0xXSkpJiYoZT1bY10sYS5wdXNoKGUpKSxlLnB1c2godSkpKSkpfX1yZXR1cm4gYX1mdW5jdGlvbiBLQyhlLHQsbixyLGksYSl7bGV0IG89cUMoZSx0LG4saSwwKTtyZXR1cm4gbz1xQyhvLHQscixhLDEpLG99ZnVuY3Rpb24gcUMoZSx0LG4scixpKXtzd2l0Y2godCl7Y2FzZSAxOnJldHVybiBKQyhlLG4scixpKTtjYXNlIDI6cmV0dXJuIFhDKGUsbixyLGksITEpO2Nhc2UgMzpyZXR1cm4gWEMoZSxuLHIsaSwhMCl9cmV0dXJuW119ZnVuY3Rpb24gSkMoZSx0LG4scil7bGV0IGk9W107Zm9yKGxldCBhIG9mIGUpZm9yKGxldCBlIG9mIGEpe2xldCBhPXI9PT0wP2UueDplLnk7YT49dCYmYTw9biYmaS5wdXNoKFtlXSl9cmV0dXJuIGl9ZnVuY3Rpb24gWUMoZSx0LG4scixpKXtsZXQgYT1yPT09MD9aQzpRQyxvPVtdLHM9W107Zm9yKGxldCBjPTA7YzxlLmxlbmd0aC0xO2MrKyl7bGV0IGw9ZVtjXSx1PWVbYysxXSxkPXI9PT0wP2wueDpsLnksZj1yPT09MD91Lng6dS55LHA9ITE7ZDx0P2Y+dCYmby5wdXNoKGEobCx1LHQpKTpkPm4/ZjxuJiZvLnB1c2goYShsLHUsbikpOm8ucHVzaChsKSxmPHQmJmQ+PXQmJihvLnB1c2goYShsLHUsdCkpLHA9ITApLGY+biYmZDw9biYmKG8ucHVzaChhKGwsdSxuKSkscD0hMCksIWkmJnAmJihzLnB1c2gobyksbz1bXSl9bGV0IGM9ZS5sZW5ndGgtMSx1PXI9PT0wP2VbY10ueDplW2NdLnk7cmV0dXJuIHU+PXQmJnU8PW4mJm8ucHVzaChlW2NdKSxpJiZvLmxlbmd0aD4wJiYhb1swXS5lcXVhbHMob1tvLmxlbmd0aC0xXSkmJm8ucHVzaChuZXcgbChvWzBdLngsb1swXS55KSksby5sZW5ndGg+MCYmcy5wdXNoKG8pLHN9ZnVuY3Rpb24gWEMoZSx0LG4scixpKXtsZXQgYT1bXTtmb3IobGV0IG8gb2YgZSl7bGV0IGU9WUMobyx0LG4scixpKTtlLmxlbmd0aD4wJiZhLnB1c2goLi4uZSl9cmV0dXJuIGF9ZnVuY3Rpb24gWkMoZSx0LG4pe2xldCByPShuLWUueCkvKHQueC1lLngpO3JldHVybiBuZXcgbChuLGUueSsodC55LWUueSkqcil9ZnVuY3Rpb24gUUMoZSx0LG4pe2xldCByPShuLWUueSkvKHQueS1lLnkpO3JldHVybiBuZXcgbChlLngrKHQueC1lLngpKnIsbil9dmFyICRDPWNsYXNzIGUgZXh0ZW5kcyBse2NvbnN0cnVjdG9yKGUsdCxuLHIpe3N1cGVyKGUsdCksdGhpcy5hbmdsZT1uLHIhPT12b2lkIDAmJih0aGlzLnNlZ21lbnQ9cil9Y2xvbmUoKXtyZXR1cm4gbmV3IGUodGhpcy54LHRoaXMueSx0aGlzLmFuZ2xlLHRoaXMuc2VnbWVudCl9fTtIKGBBbmNob3JgLCRDKTtmdW5jdGlvbiBldyhlLHQsbixyLGkpe2lmKHQuc2VnbWVudD09PXZvaWQgMHx8bj09PTApcmV0dXJuITA7bGV0IGE9dCxvPXQuc2VnbWVudCsxLHM9MDtmb3IoO3M+LW4vMjspe2lmKG8tLSxvPDApcmV0dXJuITE7cy09ZVtvXS5kaXN0KGEpLGE9ZVtvXX1zKz1lW29dLmRpc3QoZVtvKzFdKSxvKys7bGV0IGM9W10sbD0wO2Zvcig7czxuLzI7KXtsZXQgdD1lW28tMV0sbj1lW29dLGE9ZVtvKzFdO2lmKCFhKXJldHVybiExO2xldCB1PXQuYW5nbGVUbyhuKS1uLmFuZ2xlVG8oYSk7Zm9yKHU9TWF0aC5hYnMoKHUrMypNYXRoLlBJKSUoTWF0aC5QSSoyKS1NYXRoLlBJKSxjLnB1c2goe2Rpc3RhbmNlOnMsYW5nbGVEZWx0YTp1fSksbCs9dTtzLWNbMF0uZGlzdGFuY2U+cjspbC09Yy5zaGlmdCgpLmFuZ2xlRGVsdGE7aWYobD5pKXJldHVybiExO28rKyxzKz1uLmRpc3QoYSl9cmV0dXJuITB9ZnVuY3Rpb24gdHcoZSl7bGV0IHQ9MDtmb3IobGV0IG49MDtuPGUubGVuZ3RoLTE7bisrKXQrPWVbbl0uZGlzdChlW24rMV0pO3JldHVybiB0fWZ1bmN0aW9uIG53KGUsdCxuKXtyZXR1cm4gZT8zLzUqdCpuOjB9ZnVuY3Rpb24gcncoZSx0KXtyZXR1cm4gTWF0aC5tYXgoZT9lLnJpZ2h0LWUubGVmdDowLHQ/dC5yaWdodC10LmxlZnQ6MCl9ZnVuY3Rpb24gaXcoZSx0LG4scixpLGEpe2xldCBvPW53KG4saSxhKSxzPXJ3KG4scikqYSxjPTAsbD10dyhlKS8yO2ZvcihsZXQgbj0wO248ZS5sZW5ndGgtMTtuKyspe2xldCByPWVbbl0saT1lW24rMV0sYT1yLmRpc3QoaSk7aWYoYythPmwpe2xldCB1PShsLWMpL2EsZD1uZXcgJEModGkubnVtYmVyKHIueCxpLngsdSksdGkubnVtYmVyKHIueSxpLnksdSksaS5hbmdsZVRvKHIpLG4pO3JldHVybiBkLl9yb3VuZCgpLCFvfHxldyhlLGQscyxvLHQpP2Q6dm9pZCAwfWMrPWF9fWZ1bmN0aW9uIGF3KGUsdCxuLHIsaSxhLG8scyxjKXtsZXQgbD1udyhyLGEsbyksdT1ydyhyLGkpLGQ9dSpvLGY9ZVswXS54PT09MHx8ZVswXS54PT09Y3x8ZVswXS55PT09MHx8ZVswXS55PT09Yzt0LWQ8dC80JiYodD1kK3QvNCk7bGV0IHA9YSoyO3JldHVybiBvdyhlLGY/dC8yKnMldDoodS8yK3ApKm8qcyV0LHQsbCxuLGQsZiwhMSxjKX1mdW5jdGlvbiBvdyhlLHQsbixyLGksYSxvLHMsYyl7bGV0IGw9YS8yLHU9dHcoZSksZD0wLGY9dC1uLHA9W107Zm9yKGxldCB0PTA7dDxlLmxlbmd0aC0xO3QrKyl7bGV0IG89ZVt0XSxzPWVbdCsxXSxtPW8uZGlzdChzKSxoPXMuYW5nbGVUbyhvKTtmb3IoO2YrbjxkK207KXtmKz1uO2xldCBnPShmLWQpL20sXz10aS5udW1iZXIoby54LHMueCxnKSx2PXRpLm51bWJlcihvLnkscy55LGcpO2lmKF8+PTAmJl88YyYmdj49MCYmdjxjJiZmLWw+PTAmJmYrbDw9dSl7bGV0IG49bmV3ICRDKF8sdixoLHQpO24uX3JvdW5kKCksKCFyfHxldyhlLG4sYSxyLGkpKSYmcC5wdXNoKG4pfX1kKz1tfXJldHVybiFzJiYhcC5sZW5ndGgmJiFvJiYocD1vdyhlLGQvMixuLHIsaSxhLG8sITAsYykpLHB9ZnVuY3Rpb24gc3coZSx0LG4scil7bGV0IGk9W10sYT1lLmltYWdlLG89YS5waXhlbFJhdGlvLHM9YS5wYWRkZWRSZWN0LnctMixjPWEucGFkZGVkUmVjdC5oLTIsdT17eDE6ZS5sZWZ0LHkxOmUudG9wLHgyOmUucmlnaHQseTI6ZS5ib3R0b219LGQ9YS5zdHJldGNoWHx8W1swLHNdXSxmPWEuc3RyZXRjaFl8fFtbMCxjXV0scD0oZSx0KT0+ZSt0WzFdLXRbMF0sbT1kLnJlZHVjZShwLDApLGg9Zi5yZWR1Y2UocCwwKSxnPXMtbSxfPWMtaCx2PTAseT1tLGI9MCx4PWgsUz0wLEM9Zyx3PTAsVD1fO2lmKGEuY29udGVudCYmcil7bGV0IHQ9YS5jb250ZW50LG49dFsyXS10WzBdLHI9dFszXS10WzFdOyhhLnRleHRGaXRXaWR0aHx8YS50ZXh0Rml0SGVpZ2h0KSYmKHU9aXYoZSkpLHY9Y3coZCwwLHRbMF0pLGI9Y3coZiwwLHRbMV0pLHk9Y3coZCx0WzBdLHRbMl0pLHg9Y3coZix0WzFdLHRbM10pLFM9dFswXS12LHc9dFsxXS1iLEM9bi15LFQ9ci14fWxldCBFPXUueDEsRD11LnkxLE89dS54Mi1FLGs9dS55Mi1ELEE9KGUscixpLHMpPT57bGV0IGM9dXcoZS5zdHJldGNoLXYseSxPLEUpLHU9ZHcoZS5maXhlZC1TLEMsZS5zdHJldGNoLG0pLGQ9dXcoci5zdHJldGNoLWIseCxrLEQpLGY9ZHcoci5maXhlZC13LFQsci5zdHJldGNoLGgpLHA9dXcoaS5zdHJldGNoLXYseSxPLEUpLGc9ZHcoaS5maXhlZC1TLEMsaS5zdHJldGNoLG0pLF89dXcocy5zdHJldGNoLWIseCxrLEQpLEE9ZHcocy5maXhlZC13LFQscy5zdHJldGNoLGgpLGVlPW5ldyBsKGMsZCksdGU9bmV3IGwocCxkKSxuZT1uZXcgbChwLF8pLHJlPW5ldyBsKGMsXyksaWU9bmV3IGwodS9vLGYvbyksYWU9bmV3IGwoZy9vLEEvbyksb2U9dCpNYXRoLlBJLzE4MDtpZihvZSl7bGV0IGU9TWF0aC5zaW4ob2UpLHQ9TWF0aC5jb3Mob2UpLG49W3QsLWUsZSx0XTtlZS5fbWF0TXVsdChuKSx0ZS5fbWF0TXVsdChuKSxyZS5fbWF0TXVsdChuKSxuZS5fbWF0TXVsdChuKX1sZXQgc2U9ZS5zdHJldGNoK2UuZml4ZWQsY2U9aS5zdHJldGNoK2kuZml4ZWQsbGU9ci5zdHJldGNoK3IuZml4ZWQsdWU9cy5zdHJldGNoK3MuZml4ZWQ7cmV0dXJue3RsOmVlLHRyOnRlLGJsOnJlLGJyOm5lLHRleDp7eDphLnBhZGRlZFJlY3QueCsxK3NlLHk6YS5wYWRkZWRSZWN0LnkrMStsZSx3OmNlLXNlLGg6dWUtbGV9LHdyaXRpbmdNb2RlOnZvaWQgMCxnbHlwaE9mZnNldDpbMCwwXSxzZWN0aW9uSW5kZXg6MCxwaXhlbE9mZnNldFRMOmllLHBpeGVsT2Zmc2V0QlI6YWUsbWluRm9udFNjYWxlWDpDL28vTyxtaW5Gb250U2NhbGVZOlQvby9rLGlzU0RGOm59fTtpZighcnx8IWEuc3RyZXRjaFgmJiFhLnN0cmV0Y2hZKWkucHVzaChBKHtmaXhlZDowLHN0cmV0Y2g6LTF9LHtmaXhlZDowLHN0cmV0Y2g6LTF9LHtmaXhlZDowLHN0cmV0Y2g6cysxfSx7Zml4ZWQ6MCxzdHJldGNoOmMrMX0pKTtlbHNle2xldCBlPWx3KGQsZyxtKSx0PWx3KGYsXyxoKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoLTE7bisrKXtsZXQgcj1lW25dLGE9ZVtuKzFdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGgtMTtlKyspe2xldCBuPXRbZV0sbz10W2UrMV07aS5wdXNoKEEocixuLGEsbykpfX19cmV0dXJuIGl9ZnVuY3Rpb24gY3coZSx0LG4pe2xldCByPTA7Zm9yKGxldCBpIG9mIGUpcis9TWF0aC5tYXgodCxNYXRoLm1pbihuLGlbMV0pKS1NYXRoLm1heCh0LE1hdGgubWluKG4saVswXSkpO3JldHVybiByfWZ1bmN0aW9uIGx3KGUsdCxuKXtsZXQgcj1be2ZpeGVkOi0xLHN0cmV0Y2g6MH1dO2ZvcihsZXRbdCxuXW9mIGUpe2xldCBlPXJbci5sZW5ndGgtMV07ci5wdXNoKHtmaXhlZDp0LWUuc3RyZXRjaCxzdHJldGNoOmUuc3RyZXRjaH0pLHIucHVzaCh7Zml4ZWQ6dC1lLnN0cmV0Y2gsc3RyZXRjaDplLnN0cmV0Y2grKG4tdCl9KX1yZXR1cm4gci5wdXNoKHtmaXhlZDp0KzEsc3RyZXRjaDpufSkscn1mdW5jdGlvbiB1dyhlLHQsbixyKXtyZXR1cm4gZS90Km4rcn1mdW5jdGlvbiBkdyhlLHQsbixyKXtyZXR1cm4gZS10Km4vcn1mdW5jdGlvbiBmdyhlLHQsbixyLGksYSxvLHMpe2xldCBjPXIubGF5b3V0LmdldChgdGV4dC1yb3RhdGVgKS5ldmFsdWF0ZShhLHt9KSpNYXRoLlBJLzE4MCx1PVtdO2ZvcihsZXQgZSBvZiB0LnBvc2l0aW9uZWRMaW5lcylmb3IobGV0IHIgb2YgZS5wb3NpdGlvbmVkR2x5cGhzKXtpZighci5yZWN0KWNvbnRpbnVlO2xldCBhPXIucmVjdHx8e30sZD00LGY9ITAscD0xLG09MCxoPShpfHxzKSYmci52ZXJ0aWNhbCxnPXIubWV0cmljcy5hZHZhbmNlKnIuc2NhbGUvMjtpZihzJiZ0LnZlcnRpY2FsaXphYmxlKXtsZXQgdD0oci5zY2FsZS0xKSoyNCxuPSgyNC1yLm1ldHJpY3Mud2lkdGgqci5zY2FsZSkvMjttPWUubGluZU9mZnNldC8yLShyLmltYWdlTmFtZT8tbjp0KX1pZihyLmltYWdlTmFtZSl7bGV0IGU9b1tyLmltYWdlTmFtZV07Zj1lLnNkZixwPWUucGl4ZWxSYXRpbyxkPTEvcH1sZXQgXz1pP1tyLngrZyxyLnldOlswLDBdLHY9aT9bMCwwXTpbci54K2crblswXSxyLnkrblsxXS1tXSx5PVswLDBdO2gmJih5PXYsdj1bMCwwXSk7bGV0IGI9ci5tZXRyaWNzLmlzRG91YmxlUmVzb2x1dGlvbj8yOjEseD0oci5tZXRyaWNzLmxlZnQtZCkqci5zY2FsZS1nK3ZbMF0sUz0oLXIubWV0cmljcy50b3AtZCkqci5zY2FsZSt2WzFdLEM9eCthLncvYipyLnNjYWxlL3Asdz1TK2EuaC9iKnIuc2NhbGUvcCxUPW5ldyBsKHgsUyksRT1uZXcgbChDLFMpLEQ9bmV3IGwoeCx3KSxPPW5ldyBsKEMsdyk7aWYoaCl7bGV0IGU9bmV3IGwoLWcsZy0gLTE3KSx0PS1NYXRoLlBJLzIsbj0xMi1nLGk9ci5pbWFnZU5hbWU/bjowLGE9bmV3IGwoMjItbiwtaSksbz1uZXcgbCguLi55KTtULl9yb3RhdGVBcm91bmQodCxlKS5fYWRkKGEpLl9hZGQobyksRS5fcm90YXRlQXJvdW5kKHQsZSkuX2FkZChhKS5fYWRkKG8pLEQuX3JvdGF0ZUFyb3VuZCh0LGUpLl9hZGQoYSkuX2FkZChvKSxPLl9yb3RhdGVBcm91bmQodCxlKS5fYWRkKGEpLl9hZGQobyl9aWYoYyl7bGV0IGU9TWF0aC5zaW4oYyksdD1NYXRoLmNvcyhjKSxuPVt0LC1lLGUsdF07VC5fbWF0TXVsdChuKSxFLl9tYXRNdWx0KG4pLEQuX21hdE11bHQobiksTy5fbWF0TXVsdChuKX1sZXQgaz1uZXcgbCgwLDApLEE9bmV3IGwoMCwwKTt1LnB1c2goe3RsOlQsdHI6RSxibDpELGJyOk8sdGV4OmEsd3JpdGluZ01vZGU6dC53cml0aW5nTW9kZSxnbHlwaE9mZnNldDpfLHNlY3Rpb25JbmRleDpyLnNlY3Rpb25JbmRleCxpc1NERjpmLHBpeGVsT2Zmc2V0VEw6ayxwaXhlbE9mZnNldEJSOkEsbWluRm9udFNjYWxlWDowLG1pbkZvbnRTY2FsZVk6MH0pfXJldHVybiB1fXZhciBwdz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbixyLGksYSxvLHMsYyx1KXtpZih0aGlzLmJveFN0YXJ0SW5kZXg9ZS5sZW5ndGgsYyl7bGV0IGU9YS50b3AsdD1hLmJvdHRvbSxuPWEuY29sbGlzaW9uUGFkZGluZztuJiYoZS09blsxXSx0Kz1uWzNdKTtsZXQgcj10LWU7cj4wJiYocj1NYXRoLm1heCgxMCxyKSx0aGlzLmNpcmNsZURpYW1ldGVyPXIpfWVsc2V7bGV0IGM9YS5pbWFnZT8uY29udGVudCYmKGEuaW1hZ2UudGV4dEZpdFdpZHRofHxhLmltYWdlLnRleHRGaXRIZWlnaHQpP2l2KGEpOnt4MTphLmxlZnQseTE6YS50b3AseDI6YS5yaWdodCx5MjphLmJvdHRvbX07Yy55MT1jLnkxKm8tc1swXSxjLnkyPWMueTIqbytzWzJdLGMueDE9Yy54MSpvLXNbM10sYy54Mj1jLngyKm8rc1sxXTtsZXQgZD1hLmNvbGxpc2lvblBhZGRpbmc7aWYoZCYmKGMueDEtPWRbMF0qbyxjLnkxLT1kWzFdKm8sYy54Mis9ZFsyXSpvLGMueTIrPWRbM10qbyksdSl7bGV0IGU9bmV3IGwoYy54MSxjLnkxKSx0PW5ldyBsKGMueDIsYy55MSksbj1uZXcgbChjLngxLGMueTIpLHI9bmV3IGwoYy54MixjLnkyKSxpPXUqTWF0aC5QSS8xODA7ZS5fcm90YXRlKGkpLHQuX3JvdGF0ZShpKSxuLl9yb3RhdGUoaSksci5fcm90YXRlKGkpLGMueDE9TWF0aC5taW4oZS54LHQueCxuLngsci54KSxjLngyPU1hdGgubWF4KGUueCx0Lngsbi54LHIueCksYy55MT1NYXRoLm1pbihlLnksdC55LG4ueSxyLnkpLGMueTI9TWF0aC5tYXgoZS55LHQueSxuLnksci55KX1lLmVtcGxhY2VCYWNrKHQueCx0LnksYy54MSxjLnkxLGMueDIsYy55MixuLHIsaSl9dGhpcy5ib3hFbmRJbmRleD1lLmxlbmd0aH19LG13PWNsYXNze2NvbnN0cnVjdG9yKGU9W10sdD0oZSx0KT0+ZTx0Py0xOisoZT50KSl7aWYodGhpcy5kYXRhPWUsdGhpcy5sZW5ndGg9dGhpcy5kYXRhLmxlbmd0aCx0aGlzLmNvbXBhcmU9dCx0aGlzLmxlbmd0aD4wKWZvcihsZXQgZT0odGhpcy5sZW5ndGg+PjEpLTE7ZT49MDtlLS0pdGhpcy5fZG93bihlKX1wdXNoKGUpe3RoaXMuZGF0YS5wdXNoKGUpLHRoaXMuX3VwKHRoaXMubGVuZ3RoKyspfXBvcCgpe2lmKHRoaXMubGVuZ3RoPT09MClyZXR1cm47bGV0IGU9dGhpcy5kYXRhWzBdLHQ9dGhpcy5kYXRhLnBvcCgpO3JldHVybi0tdGhpcy5sZW5ndGg+MCYmKHRoaXMuZGF0YVswXT10LHRoaXMuX2Rvd24oMCkpLGV9cGVlaygpe3JldHVybiB0aGlzLmRhdGFbMF19X3VwKGUpe2xldHtkYXRhOnQsY29tcGFyZTpufT10aGlzLHI9dFtlXTtmb3IoO2U+MDspe2xldCBpPWUtMT4+MSxhPXRbaV07aWYobihyLGEpPj0wKWJyZWFrO3RbZV09YSxlPWl9dFtlXT1yfV9kb3duKGUpe2xldHtkYXRhOnQsY29tcGFyZTpufT10aGlzLHI9dGhpcy5sZW5ndGg+PjEsaT10W2VdO2Zvcig7ZTxyOyl7bGV0IHI9KGU8PDEpKzEsYT1yKzE7aWYoYTx0aGlzLmxlbmd0aCYmbih0W2FdLHRbcl0pPDAmJihyPWEpLG4odFtyXSxpKT49MClicmVhazt0W2VdPXRbcl0sZT1yfXRbZV09aX19O2Z1bmN0aW9uIGh3KGUsdD0xKXtsZXQgbj1XcC5mcm9tUG9pbnRzKGVbMF0pLHI9TWF0aC5taW4obi53aWR0aCgpLG4uaGVpZ2h0KCkpLGk9ci8yLGE9bmV3IG13KFtdLGd3KSx7bWluWDpvLG1pblk6cyxtYXhYOmMsbWF4WTp1fT1uO2lmKHI9PT0wKXJldHVybiBuZXcgbChvLHMpO2ZvcihsZXQgdD1vO3Q8Yzt0Kz1yKWZvcihsZXQgbj1zO248dTtuKz1yKWEucHVzaChuZXcgX3codCtpLG4raSxpLGUpKTtsZXQgZD15dyhlKSxmPWQ7Zm9yKDthLmxlbmd0aDspe2xldCBuPWEucG9wKCk7KG4uZD5mLmR8fCFmLmQpJiYoZj1uKSwhKG4ubWF4LWYuZDw9dCkmJihpPW4uaC8yLGEucHVzaChuZXcgX3cobi5wLngtaSxuLnAueS1pLGksZSkpLGEucHVzaChuZXcgX3cobi5wLngraSxuLnAueS1pLGksZSkpLGEucHVzaChuZXcgX3cobi5wLngtaSxuLnAueStpLGksZSkpLGEucHVzaChuZXcgX3cobi5wLngraSxuLnAueStpLGksZSkpKX1yZXR1cm4gZC5kPjAmJmYuZC1kLmQ8PXQ/ZC5wOmYucH1mdW5jdGlvbiBndyhlLHQpe3JldHVybiB0Lm1heC1lLm1heH12YXIgX3c9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5wPW5ldyBsKGUsdCksdGhpcy5oPW4sdGhpcy5kPXZ3KHRoaXMucCxyKSx0aGlzLm1heD10aGlzLmQrdGhpcy5oKk1hdGguU1FSVDJ9fTtmdW5jdGlvbiB2dyhlLHQpe2xldCBuPSExLHI9MS8wO2ZvcihsZXQgaSBvZiB0KWZvcihsZXQgdD0wLGE9aS5sZW5ndGgsbz1hLTE7dDxhO289dCsrKXtsZXQgYT1pW3RdLHM9aVtvXTthLnk+ZS55IT1zLnk+ZS55JiZlLng8KHMueC1hLngpKihlLnktYS55KS8ocy55LWEueSkrYS54JiYobj0hbikscj1NYXRoLm1pbihyLHhkKGUsYSxzKSl9cmV0dXJuKG4/MTotMSkqTWF0aC5zcXJ0KHIpfWZ1bmN0aW9uIHl3KGUpe2xldCB0PTAsbj0wLHI9MCxpPWVbMF07Zm9yKGxldCBlPTAsYT1pLmxlbmd0aCxvPWEtMTtlPGE7bz1lKyspe2xldCBhPWlbZV0scz1pW29dLGM9YS54KnMueS1zLngqYS55O24rPShhLngrcy54KSpjLHIrPShhLnkrcy55KSpjLHQrPWMqM31yZXR1cm4gbmV3IF93KG4vdCxyL3QsMCxlKX1sZXQgYnc9ZnVuY3Rpb24oZSl7cmV0dXJuIGVbZS5jZW50ZXI9MV09YGNlbnRlcmAsZVtlLmxlZnQ9Ml09YGxlZnRgLGVbZS5yaWdodD0zXT1gcmlnaHRgLGVbZS50b3A9NF09YHRvcGAsZVtlLmJvdHRvbT01XT1gYm90dG9tYCxlW2VbYHRvcC1sZWZ0YF09Nl09YHRvcC1sZWZ0YCxlW2VbYHRvcC1yaWdodGBdPTddPWB0b3AtcmlnaHRgLGVbZVtgYm90dG9tLWxlZnRgXT04XT1gYm90dG9tLWxlZnRgLGVbZVtgYm90dG9tLXJpZ2h0YF09OV09YGJvdHRvbS1yaWdodGAsZX0oe30pO2NvbnN0IHh3PTEvMDtmdW5jdGlvbiBTdyhlLHQpe2Z1bmN0aW9uIG4oZSx0KXtsZXQgbj0wLHI9MDt0PDAmJih0PTApO2xldCBpPXQvTWF0aC5TUVJUMjtzd2l0Y2goZSl7Y2FzZWB0b3AtcmlnaHRgOmNhc2VgdG9wLWxlZnRgOnI9aS03O2JyZWFrO2Nhc2VgYm90dG9tLXJpZ2h0YDpjYXNlYGJvdHRvbS1sZWZ0YDpyPS1pKzc7YnJlYWs7Y2FzZWBib3R0b21gOnI9LXQrNzticmVhaztjYXNlYHRvcGA6cj10LTd9c3dpdGNoKGUpe2Nhc2VgdG9wLXJpZ2h0YDpjYXNlYGJvdHRvbS1yaWdodGA6bj0taTticmVhaztjYXNlYHRvcC1sZWZ0YDpjYXNlYGJvdHRvbS1sZWZ0YDpuPWk7YnJlYWs7Y2FzZWBsZWZ0YDpuPXQ7YnJlYWs7Y2FzZWByaWdodGA6bj0tdH1yZXR1cm5bbixyXX1mdW5jdGlvbiByKGUsdCxuKXtsZXQgcj0wLGk9MDtzd2l0Y2godD1NYXRoLmFicyh0KSxuPU1hdGguYWJzKG4pLGUpe2Nhc2VgdG9wLXJpZ2h0YDpjYXNlYHRvcC1sZWZ0YDpjYXNlYHRvcGA6aT1uLTc7YnJlYWs7Y2FzZWBib3R0b20tcmlnaHRgOmNhc2VgYm90dG9tLWxlZnRgOmNhc2VgYm90dG9tYDppPS1uKzd9c3dpdGNoKGUpe2Nhc2VgdG9wLXJpZ2h0YDpjYXNlYGJvdHRvbS1yaWdodGA6Y2FzZWByaWdodGA6cj0tdDticmVhaztjYXNlYHRvcC1sZWZ0YDpjYXNlYGJvdHRvbS1sZWZ0YDpjYXNlYGxlZnRgOnI9dH1yZXR1cm5bcixpXX1yZXR1cm4gdFsxXT09PXh3P24oZSx0WzBdKTpyKGUsdFswXSx0WzFdKX1mdW5jdGlvbiBDdyhlLHQsbil7bGV0IHI9ZS5sYXlvdXQsaT1yLmdldChgdGV4dC12YXJpYWJsZS1hbmNob3Itb2Zmc2V0YCk/LmV2YWx1YXRlKHQse30sbik7aWYoaSl7bGV0IGU9aS52YWx1ZXMsdD1bXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTIpe2xldCByPXRbbl09ZVtuXSxpPWVbbisxXS5tYXAoZT0+ZSoyNCk7ci5zdGFydHNXaXRoKGB0b3BgKT9pWzFdLT03OnIuc3RhcnRzV2l0aChgYm90dG9tYCkmJihpWzFdKz03KSx0W24rMV09aX1yZXR1cm4gbmV3IHpyKHQpfWxldCBhPXIuZ2V0KGB0ZXh0LXZhcmlhYmxlLWFuY2hvcmApO2lmKGEpe2xldCBpO2k9ZS5fdW5ldmFsdWF0ZWRMYXlvdXQuZ2V0VmFsdWUoYHRleHQtcmFkaWFsLW9mZnNldGApPT09dm9pZCAwP3IuZ2V0KGB0ZXh0LW9mZnNldGApLmV2YWx1YXRlKHQse30sbikubWFwKGU9PmUqMjQpOltyLmdldChgdGV4dC1yYWRpYWwtb2Zmc2V0YCkuZXZhbHVhdGUodCx7fSxuKSoyNCx4d107bGV0IG89W107Zm9yKGxldCBlIG9mIGEpby5wdXNoKGUsU3coZSxpKSk7cmV0dXJuIG5ldyB6cihvKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB3dyhlKXtlLmJ1Y2tldC5jcmVhdGVBcnJheXMoKTtsZXQgdD01MTIqZS5idWNrZXQub3ZlcnNjYWxpbmc7ZS5idWNrZXQudGlsZVBpeGVsUmF0aW89ai90LGUuYnVja2V0LmNvbXBhcmVUZXh0PXt9LGUuYnVja2V0Lmljb25zTmVlZExpbmVhcj0hMTtsZXQgbj1lLmJ1Y2tldC5sYXllcnNbMF0scj1uLmxheW91dCxpPW4uX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXMsYT17bGF5b3V0SWNvblNpemU6aVtgaWNvbi1zaXplYF0ucG9zc2libHlFdmFsdWF0ZShuZXcgVShlLmJ1Y2tldC56b29tKzEpLGUuY2Fub25pY2FsKSxsYXlvdXRUZXh0U2l6ZTppW2B0ZXh0LXNpemVgXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBVKGUuYnVja2V0Lnpvb20rMSksZS5jYW5vbmljYWwpLHRleHRNYXhTaXplOmlbYHRleHQtc2l6ZWBdLnBvc3NpYmx5RXZhbHVhdGUobmV3IFUoMTgpKX07aWYoZS5idWNrZXQudGV4dFNpemVEYXRhLmtpbmQ9PT1gY29tcG9zaXRlYCl7bGV0e21pblpvb206dCxtYXhab29tOm59PWUuYnVja2V0LnRleHRTaXplRGF0YTthLmNvbXBvc2l0ZVRleHRTaXplcz1baVtgdGV4dC1zaXplYF0ucG9zc2libHlFdmFsdWF0ZShuZXcgVSh0KSxlLmNhbm9uaWNhbCksaVtgdGV4dC1zaXplYF0ucG9zc2libHlFdmFsdWF0ZShuZXcgVShuKSxlLmNhbm9uaWNhbCldfWlmKGUuYnVja2V0Lmljb25TaXplRGF0YS5raW5kPT09YGNvbXBvc2l0ZWApe2xldHttaW5ab29tOnQsbWF4Wm9vbTpufT1lLmJ1Y2tldC5pY29uU2l6ZURhdGE7YS5jb21wb3NpdGVJY29uU2l6ZXM9W2lbYGljb24tc2l6ZWBdLnBvc3NpYmx5RXZhbHVhdGUobmV3IFUodCksZS5jYW5vbmljYWwpLGlbYGljb24tc2l6ZWBdLnBvc3NpYmx5RXZhbHVhdGUobmV3IFUobiksZS5jYW5vbmljYWwpXX1sZXQgbz1yLmdldChgdGV4dC1saW5lLWhlaWdodGApKjI0LHM9ci5nZXQoYHRleHQtcm90YXRpb24tYWxpZ25tZW50YCkhPT1gdmlld3BvcnRgJiZyLmdldChgc3ltYm9sLXBsYWNlbWVudGApIT09YHBvaW50YCxjPXIuZ2V0KGB0ZXh0LWtlZXAtdXByaWdodGApLGw9ci5nZXQoYHRleHQtc2l6ZWApO2ZvcihsZXQgdCBvZiBlLmJ1Y2tldC5mZWF0dXJlcyl7bGV0IGk9ci5nZXQoYHRleHQtZm9udGApLmV2YWx1YXRlKHQse30sZS5jYW5vbmljYWwpLmpvaW4oYCxgKSx1PWwuZXZhbHVhdGUodCx7fSxlLmNhbm9uaWNhbCksZD1hLmxheW91dFRleHRTaXplLmV2YWx1YXRlKHQse30sZS5jYW5vbmljYWwpLGY9YS5sYXlvdXRJY29uU2l6ZS5ldmFsdWF0ZSh0LHt9LGUuY2Fub25pY2FsKSxwPXtob3Jpem9udGFsOnt9LHZlcnRpY2FsOnZvaWQgMH0sbT10LnRleHQsaD1bMCwwXTtpZihtKXtsZXQgYT1tLnRvU3RyaW5nKCksbD1yLmdldChgdGV4dC1sZXR0ZXItc3BhY2luZ2ApLmV2YWx1YXRlKHQse30sZS5jYW5vbmljYWwpKjI0LGY9RmMoYSk/bDowLGc9ci5nZXQoYHRleHQtYW5jaG9yYCkuZXZhbHVhdGUodCx7fSxlLmNhbm9uaWNhbCksXz1DdyhuLHQsZS5jYW5vbmljYWwpO2lmKCFfKXtsZXQgbj1yLmdldChgdGV4dC1yYWRpYWwtb2Zmc2V0YCkuZXZhbHVhdGUodCx7fSxlLmNhbm9uaWNhbCk7aD1uP1N3KGcsW24qMjQseHddKTpyLmdldChgdGV4dC1vZmZzZXRgKS5ldmFsdWF0ZSh0LHt9LGUuY2Fub25pY2FsKS5tYXAoZT0+ZSoyNCl9bGV0IHY9cz9gY2VudGVyYDpyLmdldChgdGV4dC1qdXN0aWZ5YCkuZXZhbHVhdGUodCx7fSxlLmNhbm9uaWNhbCkseT1yLmdldChgc3ltYm9sLXBsYWNlbWVudGApPT09YHBvaW50YD9yLmdldChgdGV4dC1tYXgtd2lkdGhgKS5ldmFsdWF0ZSh0LHt9LGUuY2Fub25pY2FsKSoyNDoxLzAsYj0oKT0+e2UuYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQmJlBjKGEpJiYocC52ZXJ0aWNhbD16XyhtLGUuZ2x5cGhNYXAsZS5nbHlwaFBvc2l0aW9ucyxlLmltYWdlUG9zaXRpb25zLGkseSxvLGcsYGxlZnRgLGYsaCwyLCEwLGQsdSkpfTtpZighcyYmXyl7bGV0IHQ9bmV3IFNldDtpZih2PT09YGF1dG9gKWZvcihsZXQgZT0wO2U8Xy52YWx1ZXMubGVuZ3RoO2UrPTIpdC5hZGQoVHcoXy52YWx1ZXNbZV0pKTtlbHNlIHQuYWRkKHYpO2xldCBuPSExO2ZvcihsZXQgciBvZiB0KWlmKCFwLmhvcml6b250YWxbcl0pe2lmKG4pcC5ob3Jpem9udGFsW3JdPXAuaG9yaXpvbnRhbFswXTtlbHNle2xldCB0PXpfKG0sZS5nbHlwaE1hcCxlLmdseXBoUG9zaXRpb25zLGUuaW1hZ2VQb3NpdGlvbnMsaSx5LG8sYGNlbnRlcmAscixmLGgsMSwhMSxkLHUpO3QmJihwLmhvcml6b250YWxbcl09dCxuPXQucG9zaXRpb25lZExpbmVzLmxlbmd0aD09PTEpfX1iKCl9ZWxzZXt2PT09YGF1dG9gJiYodj1UdyhnKSk7bGV0IHQ9el8obSxlLmdseXBoTWFwLGUuZ2x5cGhQb3NpdGlvbnMsZS5pbWFnZVBvc2l0aW9ucyxpLHksbyxnLHYsZixoLDEsITEsZCx1KTt0JiYocC5ob3Jpem9udGFsW3ZdPXQpLGIoKSxQYyhhKSYmcyYmYyYmKHAudmVydGljYWw9el8obSxlLmdseXBoTWFwLGUuZ2x5cGhQb3NpdGlvbnMsZS5pbWFnZVBvc2l0aW9ucyxpLHksbyxnLHYsZixoLDIsITEsZCx1KSl9fWxldCBnLF89ITE7aWYodC5pY29uPy5uYW1lKXtsZXQgbj1lLmltYWdlTWFwW3QuaWNvbi5uYW1lXTtuJiYoZz1ydihlLmltYWdlUG9zaXRpb25zW3QuaWNvbi5uYW1lXSxyLmdldChgaWNvbi1vZmZzZXRgKS5ldmFsdWF0ZSh0LHt9LGUuY2Fub25pY2FsKSxyLmdldChgaWNvbi1hbmNob3JgKS5ldmFsdWF0ZSh0LHt9LGUuY2Fub25pY2FsKSksXz0hIW4uc2RmLGUuYnVja2V0LnNkZkljb25zPT09dm9pZCAwP2UuYnVja2V0LnNkZkljb25zPV86ZS5idWNrZXQuc2RmSWNvbnMhPT1fJiZJdChgU3R5bGUgc2hlZXQgd2FybmluZzogQ2Fubm90IG1peCBTREYgYW5kIG5vbi1TREYgaWNvbnMgaW4gb25lIGJ1ZmZlcmApLG4ucGl4ZWxSYXRpbz09PWUuYnVja2V0LnBpeGVsUmF0aW8/ci5nZXQoYGljb24tcm90YXRlYCkuY29uc3RhbnRPcigxKSE9PTAmJihlLmJ1Y2tldC5pY29uc05lZWRMaW5lYXI9ITApOmUuYnVja2V0Lmljb25zTmVlZExpbmVhcj0hMCl9bGV0IHY9a3cocC5ob3Jpem9udGFsKXx8cC52ZXJ0aWNhbDtlLmJ1Y2tldC5pY29uc0luVGV4dHx8PXY/di5pY29uc0luVGV4dDohMSwodnx8ZykmJkV3KGUuYnVja2V0LHQscCxnLGUuaW1hZ2VNYXAsYSxkLGYsaCxfLGUuY2Fub25pY2FsLGUuc3ViZGl2aXNpb25HcmFudWxhcml0eSl9ZS5zaG93Q29sbGlzaW9uQm94ZXMmJmUuYnVja2V0LmdlbmVyYXRlQ29sbGlzaW9uRGVidWdCdWZmZXJzKCl9ZnVuY3Rpb24gVHcoZSl7c3dpdGNoKGUpe2Nhc2VgcmlnaHRgOmNhc2VgdG9wLXJpZ2h0YDpjYXNlYGJvdHRvbS1yaWdodGA6cmV0dXJuYHJpZ2h0YDtjYXNlYGxlZnRgOmNhc2VgdG9wLWxlZnRgOmNhc2VgYm90dG9tLWxlZnRgOnJldHVybmBsZWZ0YH1yZXR1cm5gY2VudGVyYH1mdW5jdGlvbiBFdyhlLHQsbixyLGksYSxvLHMsYyxsLHUsZCl7bGV0IGY9YS50ZXh0TWF4U2l6ZS5ldmFsdWF0ZSh0LHt9KTtmPT09dm9pZCAwJiYoZj1vKTtsZXQgcD1lLmxheWVyc1swXS5sYXlvdXQsbT1wLmdldChgaWNvbi1vZmZzZXRgKS5ldmFsdWF0ZSh0LHt9LHUpLGg9a3cobi5ob3Jpem9udGFsKSxnPW8vMjQsXz1lLnRpbGVQaXhlbFJhdGlvKmcsdj1lLnRpbGVQaXhlbFJhdGlvKmYvMjQseT1lLnRpbGVQaXhlbFJhdGlvKnMsYj1lLnRpbGVQaXhlbFJhdGlvKnAuZ2V0KGBzeW1ib2wtc3BhY2luZ2ApLHg9cC5nZXQoYHRleHQtcGFkZGluZ2ApKmUudGlsZVBpeGVsUmF0aW8sUz1qdihwLHQsdSxlLnRpbGVQaXhlbFJhdGlvKSxDPXAuZ2V0KGB0ZXh0LW1heC1hbmdsZWApLzE4MCpNYXRoLlBJLHc9cC5nZXQoYHRleHQtcm90YXRpb24tYWxpZ25tZW50YCkhPT1gdmlld3BvcnRgJiZwLmdldChgc3ltYm9sLXBsYWNlbWVudGApIT09YHBvaW50YCxUPXAuZ2V0KGBpY29uLXJvdGF0aW9uLWFsaWdubWVudGApLmNvbnN0YW50T3IoYHZpZXdwb3J0YCk9PT1gbWFwYCYmcC5nZXQoYHN5bWJvbC1wbGFjZW1lbnRgKSE9PWBwb2ludGAsRT1wLmdldChgc3ltYm9sLXBsYWNlbWVudGApLEQ9Yi8yLE89cC5nZXQoYGljb24tdGV4dC1maXRgKSxrO3ImJk8hPT1gbm9uZWAmJihlLmFsbG93VmVydGljYWxQbGFjZW1lbnQmJm4udmVydGljYWwmJihrPWF2KHIsbi52ZXJ0aWNhbCxPLHAuZ2V0KGBpY29uLXRleHQtZml0LXBhZGRpbmdgKSxtLGcpKSxoJiYocj1hdihyLGgsTyxwLmdldChgaWNvbi10ZXh0LWZpdC1wYWRkaW5nYCksbSxnKSkpO2xldCBBPXU/ZC5saW5lLmdldEdyYW51bGFyaXR5Rm9yWm9vbUxldmVsKHUueik6MSxlZT0ocyxkKT0+e2QueDwwfHxkLng+PTgxOTJ8fGQueTwwfHxkLnk+PTgxOTJ8fEF3KGUsZCxzLG4scixpLGssZS5sYXllcnNbMF0sZS5jb2xsaXNpb25Cb3hBcnJheSx0LmluZGV4LHQuc291cmNlTGF5ZXJJbmRleCxlLmluZGV4LF8sW3gseCx4LHhdLHcsYyx5LFMsVCxtLHQsYSxsLHUsbyl9O2lmKEU9PT1gbGluZWApZm9yKGxldCBpIG9mIEdDKHQuZ2VvbWV0cnksMCwwLGosaikpe2xldCB0PVRwKGksQSksYT1hdyh0LGIsQyxuLnZlcnRpY2FsfHxoLHIsMjQsdixlLm92ZXJzY2FsaW5nLGopO2ZvcihsZXQgbiBvZiBhKXtsZXQgcj1oOyghcnx8IWp3KGUsci50ZXh0LEQsbikpJiZlZSh0LG4pfX1lbHNlIGlmKEU9PT1gbGluZS1jZW50ZXJgKXtmb3IobGV0IGUgb2YgdC5nZW9tZXRyeSlpZihlLmxlbmd0aD4xKXtsZXQgdD1UcChlLEEpLGk9aXcodCxDLG4udmVydGljYWx8fGgsciwyNCx2KTtpJiZlZSh0LGkpfX1lbHNlIGlmKHQudHlwZT09PWBQb2x5Z29uYClmb3IobGV0IGUgb2Ygb2kodC5nZW9tZXRyeSwwKSl7bGV0IHQ9aHcoZSwxNik7ZWUoVHAoZVswXSxBLCEwKSxuZXcgJEModC54LHQueSwwKSl9ZWxzZSBpZih0LnR5cGU9PT1gTGluZVN0cmluZ2ApZm9yKGxldCBlIG9mIHQuZ2VvbWV0cnkpe2xldCB0PVRwKGUsQSk7ZWUodCxuZXcgJEModFswXS54LHRbMF0ueSwwKSl9ZWxzZSBpZih0LnR5cGU9PT1gUG9pbnRgKWZvcihsZXQgZSBvZiB0Lmdlb21ldHJ5KWZvcihsZXQgdCBvZiBlKWVlKFt0XSxuZXcgJEModC54LHQueSwwKSl9ZnVuY3Rpb24gRHcoZSx0KXtsZXQgbj1lLmxlbmd0aCxyPXQ/LnZhbHVlcztpZihyPy5sZW5ndGg+MClmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrPTIpe2xldCBuPWJ3W3JbdF1dLGk9clt0KzFdO2UuZW1wbGFjZUJhY2sobixpWzBdLGlbMV0pfXJldHVybltuLGUubGVuZ3RoXX1mdW5jdGlvbiBPdyhlLHQsbixyLGksYSxvLHMsYyxsLHUsZCxmLHAsbSxoKXtsZXQgZz1mdyh0LG4scyxpLGEsbyxyLGUuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCksXz1lLnRleHRTaXplRGF0YSx2PW51bGw7Xy5raW5kPT09YHNvdXJjZWA/KHY9WzEyOCppLmxheW91dC5nZXQoYHRleHQtc2l6ZWApLmV2YWx1YXRlKG8se30pXSx2WzBdPjMyNjQwJiZJdChgJHtlLmxheWVySWRzWzBdfTogVmFsdWUgZm9yICJ0ZXh0LXNpemUiIGlzID49IDI1NS4gUmVkdWNlIHlvdXIgInRleHQtc2l6ZSIuYCkpOl8ua2luZD09PWBjb21wb3NpdGVgJiYodj1bMTI4Km0uY29tcG9zaXRlVGV4dFNpemVzWzBdLmV2YWx1YXRlKG8se30saCksMTI4Km0uY29tcG9zaXRlVGV4dFNpemVzWzFdLmV2YWx1YXRlKG8se30saCldLCh2WzBdPjMyNjQwfHx2WzFdPjMyNjQwKSYmSXQoYCR7ZS5sYXllcklkc1swXX06IFZhbHVlIGZvciAidGV4dC1zaXplIiBpcyA+PSAyNTUuIFJlZHVjZSB5b3VyICJ0ZXh0LXNpemUiLmApKSxlLmFkZFN5bWJvbHMoZS50ZXh0LGcsdixzLGEsbyx1LHQsbC5saW5lU3RhcnRJbmRleCxsLmxpbmVMZW5ndGgscCxoLGMpO2ZvcihsZXQgdCBvZiBkKWZbdF09ZS50ZXh0LnBsYWNlZFN5bWJvbEFycmF5Lmxlbmd0aC0xO3JldHVybiBnLmxlbmd0aCo0fWZ1bmN0aW9uIGt3KGUpe2ZvcihsZXQgdCBpbiBlKXJldHVybiBlW3RdO3JldHVybiBudWxsfWZ1bmN0aW9uIEF3KGUsdCxuLHIsaSxhLG8scyxjLGwsdSxkLGYscCxtLGgsZyxfLHYseSxiLHgsUyxDLHcpe2xldCBUPWUuYWRkVG9MaW5lVmVydGV4QXJyYXkodCxuKSxFPXMubGF5b3V0LmdldChgc3ltYm9sLWhlaWdodC1vZmZzZXRgKS5ldmFsdWF0ZShiLHt9LEMpLEQsTyxrLEEsZWU9MCx0ZT0wLG5lPTAscmU9MCxpZT0tMSxhZT0tMSxvZT17fSxzZT0oMCxqdS5kZWZhdWx0KShgYCk7aWYoZS5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50JiZyLnZlcnRpY2FsKXtsZXQgZT1zLmxheW91dC5nZXQoYHRleHQtcm90YXRlYCkuZXZhbHVhdGUoYix7fSxDKSs5MCxuPXIudmVydGljYWw7az1uZXcgcHcoYyx0LGwsdSxkLG4sZixwLG0sZSksbyYmKEE9bmV3IHB3KGMsdCxsLHUsZCxvLGcsXyxtLGUpKX1pZihpKXtsZXQgbj1zLmxheW91dC5nZXQoYGljb24tcm90YXRlYCkuZXZhbHVhdGUoYix7fSkscj1zLmxheW91dC5nZXQoYGljb24tdGV4dC1maXRgKSE9PWBub25lYCxhPXN3KGksbixTLHIpLGY9bz9zdyhvLG4sUyxyKTp2b2lkIDA7Tz1uZXcgcHcoYyx0LGwsdSxkLGksZyxfLCExLG4pLGVlPWEubGVuZ3RoKjQ7bGV0IHA9ZS5pY29uU2l6ZURhdGEsbT1udWxsO3Aua2luZD09PWBzb3VyY2VgPyhtPVsxMjgqcy5sYXlvdXQuZ2V0KGBpY29uLXNpemVgKS5ldmFsdWF0ZShiLHt9KV0sbVswXT4zMjY0MCYmSXQoYCR7ZS5sYXllcklkc1swXX06IFZhbHVlIGZvciAiaWNvbi1zaXplIiBpcyA+PSAyNTUuIFJlZHVjZSB5b3VyICJpY29uLXNpemUiLmApKTpwLmtpbmQ9PT1gY29tcG9zaXRlYCYmKG09WzEyOCp4LmNvbXBvc2l0ZUljb25TaXplc1swXS5ldmFsdWF0ZShiLHt9LEMpLDEyOCp4LmNvbXBvc2l0ZUljb25TaXplc1sxXS5ldmFsdWF0ZShiLHt9LEMpXSwobVswXT4zMjY0MHx8bVsxXT4zMjY0MCkmJkl0KGAke2UubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgImljb24tc2l6ZSIgaXMgPj0gMjU1LiBSZWR1Y2UgeW91ciAiaWNvbi1zaXplIi5gKSksZS5hZGRTeW1ib2xzKGUuaWNvbixhLG0seSx2LGIsMCx0LFQubGluZVN0YXJ0SW5kZXgsVC5saW5lTGVuZ3RoLC0xLEMsRSksaWU9ZS5pY29uLnBsYWNlZFN5bWJvbEFycmF5Lmxlbmd0aC0xLGYmJih0ZT1mLmxlbmd0aCo0LGUuYWRkU3ltYm9scyhlLmljb24sZixtLHksdixiLDIsdCxULmxpbmVTdGFydEluZGV4LFQubGluZUxlbmd0aCwtMSxDLEUpLGFlPWUuaWNvbi5wbGFjZWRTeW1ib2xBcnJheS5sZW5ndGgtMSl9bGV0IGNlPU9iamVjdC5rZXlzKHIuaG9yaXpvbnRhbCk7Zm9yKGxldCBuIG9mIGNlKXtsZXQgaT1yLmhvcml6b250YWxbbl07RHx8PShzZT0oMCxqdS5kZWZhdWx0KShpLnRleHQpLG5ldyBwdyhjLHQsbCx1LGQsaSxmLHAsbSxzLmxheW91dC5nZXQoYHRleHQtcm90YXRlYCkuZXZhbHVhdGUoYix7fSxDKSkpO2xldCBvPWkucG9zaXRpb25lZExpbmVzLmxlbmd0aD09PTE7aWYobmUrPU93KGUsdCxpLGEscyxtLGIsaCxFLFQsci52ZXJ0aWNhbD8xOjMsbz9jZTpbbl0sb2UsaWUseCxDKSxvKWJyZWFrfXIudmVydGljYWwmJihyZSs9T3coZSx0LHIudmVydGljYWwsYSxzLG0sYixoLEUsVCwyLFtgdmVydGljYWxgXSxvZSxhZSx4LEMpKTtsZXQgbGU9RD9ELmJveFN0YXJ0SW5kZXg6ZS5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsdWU9RD9ELmJveEVuZEluZGV4OmUuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLGRlPWs/ay5ib3hTdGFydEluZGV4OmUuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLGZlPWs/ay5ib3hFbmRJbmRleDplLmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxwZT1PP08uYm94U3RhcnRJbmRleDplLmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxtZT1PP08uYm94RW5kSW5kZXg6ZS5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsaGU9QT9BLmJveFN0YXJ0SW5kZXg6ZS5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsZ2U9QT9BLmJveEVuZEluZGV4OmUuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLF9lPS0xLHZlPShlLHQpPT5lPy5jaXJjbGVEaWFtZXRlcj9NYXRoLm1heChlLmNpcmNsZURpYW1ldGVyLHQpOnQ7X2U9dmUoRCxfZSksX2U9dmUoayxfZSksX2U9dmUoTyxfZSksX2U9dmUoQSxfZSk7bGV0IHllPSsoX2U+LTEpO3llJiYoX2UqPXcvMjQpLGUuZ2x5cGhPZmZzZXRBcnJheS5sZW5ndGg+PXh2Lk1BWF9HTFlQSFMmJkl0KGBUb28gbWFueSBnbHlwaHMgYmVpbmcgcmVuZGVyZWQgaW4gYSB0aWxlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI5MDdgKSxiLnNvcnRLZXkhPT12b2lkIDAmJmUuYWRkVG9Tb3J0S2V5UmFuZ2VzKGUuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aCxiLnNvcnRLZXkpO2xldCBiZT1DdyhzLGIsQyksW3hlLFNlXT1EdyhlLnRleHRBbmNob3JPZmZzZXRzLGJlKTtlLnN5bWJvbEluc3RhbmNlcy5lbXBsYWNlQmFjayh0LngsdC55LG9lLnJpZ2h0Pj0wP29lLnJpZ2h0Oi0xLG9lLmNlbnRlcj49MD9vZS5jZW50ZXI6LTEsb2UubGVmdD49MD9vZS5sZWZ0Oi0xLG9lLnZlcnRpY2FsfHwtMSxpZSxhZSxzZSxsZSx1ZSxkZSxmZSxwZSxtZSxoZSxnZSxsLG5lLHJlLGVlLHRlLHllLDAsZixfZSx4ZSxTZSxFKX1mdW5jdGlvbiBqdyhlLHQsbixyKXtsZXQgaT1lLmNvbXBhcmVUZXh0O2lmKCEodCBpbiBpKSlpW3RdPVtdO2Vsc2V7bGV0IGU9aVt0XTtmb3IobGV0IHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSlpZihyLmRpc3QoZVt0XSk8bilyZXR1cm4hMH1yZXR1cm4gaVt0XS5wdXNoKHIpLCExfWV4cG9ydHtmbSBhcyAkLHl0IGFzICRuLGplIGFzICRyLFcgYXMgJHQsdXYgYXMgQSxPIGFzIEFpLE9uIGFzIEFuLHJuIGFzIEFyLFVkIGFzIEF0LGlfIGFzIEIsbCBhcyBCaSxjbiBhcyBCbixPdCBhcyBCcixXdSBhcyBCdCxSdiBhcyBDLGFlIGFzIENpLExuIGFzIENuLFZ0IGFzIENyLGhmIGFzIEN0LHh2IGFzIEQsVCBhcyBEaSxrbiBhcyBEbixjdCBhcyBEcix0ZiBhcyBEdCxrdiBhcyBFLHcgYXMgRWksQW4gYXMgRW4sbm4gYXMgRXIscmYgYXMgRXQsQV8gYXMgRixnIGFzIEZpLHZuIGFzIEZuLHN0IGFzIEZyLHp1IGFzIEZ0LGRnIGFzIEcsYnQgYXMgR24sR2UgYXMgR3IsU3UgYXMgR3QsUGcgYXMgSCxxdCBhcyBIbixqIGFzIEhyLFR1IGFzIEh0LGtfIGFzIEksdiBhcyBJaSxobiBhcyBJbixhdCBhcyBJcixCdSBhcyBJdCx2bSBhcyBKLHJ0IGFzIEpuLEJlIGFzIEpyLHl1IGFzIEp0LEltIGFzIEssUHQgYXMgS24sWGUgYXMgS3IsaXUgYXMgS3QsRF8gYXMgTCxoIGFzIExpLGduIGFzIExuLFR0IGFzIExyLFZ1IGFzIEx0LE1fIGFzIE0sQSBhcyBNaSxibiBhcyBNbixrdCBhcyBNcixsZCBhcyBNdCxCXyBhcyBOLEQgYXMgTmkseW4gYXMgTm4senQgYXMgTnIsUnUgYXMgTnQsX3YgYXMgTyxpZSBhcyBPaSx3biBhcyBPbixZdCBhcyBPcixRZCBhcyBPdCxqXyBhcyBQLEUgYXMgUGkseG4gYXMgUG4sZW4gYXMgUHIsTHUgYXMgUHQsX20gYXMgUSxOdCBhcyBRbixQZSBhcyBRcixobCBhcyBRdCxPXyBhcyBSLG0gYXMgUmksX24gYXMgUm4sSXQgYXMgUnIsSHUgYXMgUnQsQnYgYXMgUyxvZSBhcyBTaSxGbiBhcyBTbixEdCBhcyBTcixnZiBhcyBTdCxGdiBhcyBULEMgYXMgVGksU24gYXMgVG4sb3QgYXMgVHIsbmYgYXMgVHQsRGcgYXMgVSxHdCBhcyBVbixVZSBhcyBVcixLbCBhcyBVdCxVZyBhcyBWLGx0IGFzIFZuLFplIGFzIFZyLEt1IGFzIFZ0LHlnIGFzIFcsdnQgYXMgV24sS2UgYXMgV3IsX3UgYXMgV3QsYm0gYXMgWCx0dCBhcyBYbixMZSBhcyBYcixidSBhcyBYdCx4bSBhcyBZLG50IGFzIFluLFZlIGFzIFlyLGF1IGFzIFl0LHltIGFzIFosZXQgYXMgWm4sUmUgYXMgWnIscSBhcyBadCxxdiBhcyBfLHhlIGFzIF9pLHogYXMgX24scG4gYXMgX3IseHAgYXMgX3QsR0MgYXMgYSxEZSBhcyBhaSxUYyBhcyBhbixTdCBhcyBhcixjbSBhcyBhdCxHdiBhcyBiLFMgYXMgYmksTSBhcyBibixqdCBhcyBicixicCBhcyBidCx6QyBhcyBjLGdlIGFzIGNpLGRjIGFzIGNuLGh0IGFzIGNyLGFtIGFzIGN0LHB5IGFzIGQsd2UgYXMgZGksdWMgYXMgZG4sJHQgYXMgZHIsZW0gYXMgZHQsTmUgYXMgZWksY2wgYXMgZW4sdG4gYXMgZXIsaG0gYXMgZXQsbnkgYXMgZixwZSBhcyBmaSxwYyBhcyBmbixhbiBhcyBmciwkcCBhcyBmdCxKdiBhcyBnLHllIGFzIGdpLFZyIGFzIGduLGRuIGFzIGdyLE5wIGFzIGd0LEt2IGFzIGgsYmUgYXMgaGksdGkgYXMgaG4sVXQgYXMgaHIsenAgYXMgaHQsS0MgYXMgaSxfZSBhcyBpaSxLYyBhcyBpbixBdCBhcyBpcixsbSBhcyBpdCxkdiBhcyBqLGsgYXMgamksam4sc24gYXMganIscGQgYXMganQsbXYgYXMgayxuZSBhcyBraSxNbiBhcyBrbixwdCBhcyBrciwkZCBhcyBrdCxSQyBhcyBsLFNlIGFzIGxpLG1jIGFzIGxuLG9uIGFzIGxyLG9tIGFzIGx0LGl5IGFzIG0sRWUgYXMgbWksTm8gYXMgbW4sZm4gYXMgbXIsV3AgYXMgbXQsd3cgYXMgbixjZSBhcyBuaSxaYyBhcyBubixkdCBhcyBucixnbSBhcyBudCxXQyBhcyBvLGxlIGFzIG9pLHdjIGFzIG9uLE10IGFzIG9yLHNtIGFzIG90LHJ5IGFzIHAsbWUgYXMgcGksdHMgYXMgcG4sV3QgYXMgcHIsR3AgYXMgcHQsa20gYXMgcSxpdCBhcyBxbixZZSBhcyBxcixydSBhcyBxdCxidyBhcyByLHZlIGFzIHJpLFUgYXMgcm4sJGUgYXMgcnIsZG0gYXMgcnQsVUMgYXMgcyxoZSBhcyBzaSxIIGFzIHNuLFJ0IGFzIHNyLGltIGFzIHN0LFR3IGFzIHQsZGUgYXMgdGksSmMgYXMgdG4sdXQgYXMgdHIscG0gYXMgdHQsbXkgYXMgdSxDZSBhcyB1aSxoYyBhcyB1bixndCBhcyB1cix0bSBhcyB1dCxZdiBhcyB2LFRlIGFzIHZpLE4gYXMgdm4sQnQgYXMgdnIsU3AgYXMgdnQsTHYgYXMgdyxlZSBhcyB3aSxDbiBhcyB3bixDdCBhcyB3cixsZiBhcyB3dCxVdiBhcyB4LGIgYXMgeGksSW4gYXMgeG4sZnQgYXMgeHIsdmYgYXMgeHQsZXkgYXMgeSx4IGFzIHlpLHpuIGFzIHluLG10IGFzIHlyLHlwIGFzIHl0LEVfIGFzIHosZiBhcyB6aSxRZSBhcyB6bix4dCBhcyB6cixVdSBhcyB6dH07Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcGxpYnJlLWdsLXNoYXJlZC5tanMubWFw", import.meta.url)
|
|
107
|
-
};
|
|
108
|
-
maplibre.setWorkerUrl(assets.worker.toString());
|
|
114
|
+
if (!maplibre.getWorkerUrl() && config.useMaplibreWorkerBlob) {
|
|
115
|
+
maplibre.setWorkerUrl(await getMaplibreWorkerUrl(maplibre));
|
|
109
116
|
}
|
|
110
117
|
const { getMaplibreGLLayer } = await import("../renderer/mapboxgl-layer.js");
|
|
111
118
|
layer = getMaplibreGLLayer(config, L, maplibre);
|