@labelbee/lb-components 1.24.0-alpha.33 → 1.24.0-alpha.35
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/dist/_virtual/2DViewWorker.js +1 -1
- package/dist/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +2 -2
- package/dist/_virtual/highlightSegmentWorker.js +1 -1
- package/dist/components/pointCloudView/components/UnifyParamsModal/index.js +1 -1
- package/es/_virtual/2DViewWorker.js +1 -1
- package/es/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +2 -2
- package/es/_virtual/highlightSegmentWorker.js +1 -1
- package/es/components/pointCloudView/components/UnifyParamsModal/index.js +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createBase64WorkerFactory as b}from"./_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js";var l=b("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24oTCxQLFYpeyJ1c2Ugc3RyaWN0Ijtjb25zdCB6PWk9PntsZXQgdD1JbmZpbml0eSxuPUluZmluaXR5LG89LUluZmluaXR5LHI9LUluZmluaXR5O2Zvcihjb25zdCBsIG9mIGkpdD1NYXRoLm1pbih0LGwueCksbj1NYXRoLm1pbihuLGwueSksbz1NYXRoLm1heChvLGwueCkscj1NYXRoLm1heChyLGwueSk7cmV0dXJue3g6dCx5Om4sd2lkdGg6by10LGhlaWdodDpyLW59fSxGPSgoKT0+e2NvbnN0IGk9KHQsbik9Pntjb25zdCBvPU1hdGgubWF4KHQueCxuLngpLHI9TWF0aC5tYXgodC55LG4ueSksbD1NYXRoLm1pbih0LngrdC53aWR0aCxuLngrbi53aWR0aCksZD1NYXRoLm1pbih0LnkrdC5oZWlnaHQsbi55K24uaGVpZ2h0KSx1PWwtbyxnPWQtcjtyZXR1cm4gdT49MCYmZz49MD97eDpvLHk6cix3aWR0aDp1LGhlaWdodDpnfTpudWxsfTtyZXR1cm4odCxuLG8pPT57aWYob1tuXSl7Y29uc3Qgcj1vW25dLndpZHRoLGw9b1tuXS5oZWlnaHQ7cmV0dXJuIGkodCx7eDowLHk6MCx3aWR0aDpyLGhlaWdodDpsfSkhPT1udWxsfXJldHVybiExfX0pKCk7dmFyIFU9T2JqZWN0LmRlZmluZVByb3BlcnR5LFg9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsWT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxPPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsVz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHE9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSx4PShpLHQsbik9PnQgaW4gaT9VKGksdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOmlbdF09bixjPShpLHQpPT57Zm9yKHZhciBuIGluIHR8fCh0PXt9KSlXLmNhbGwodCxuKSYmeChpLG4sdFtuXSk7aWYoTylmb3IodmFyIG4gb2YgTyh0KSlxLmNhbGwodCxuKSYmeChpLG4sdFtuXSk7cmV0dXJuIGl9LGE9KGksdCk9PlgoaSxZKHQpKTtjb25zdCBHPSh7dmlld0RhdGFQb2ludExpc3Q6aSxwb2ludENsb3VkQm94OnQsZGVmYXVsdFZpZXdTdHlsZTpuLHN0cm9rZTpvfSk9Pmk/aS5tYXAocj0+KHt0eXBlOnIudHlwZSxhbm5vdGF0aW9uOmEoYyh7aWQ6dC5pZCxwb2ludExpc3Q6ci5wb2ludExpc3R9LG4pLHtzdHJva2U6b30pfSkpOltdO2Z1bmN0aW9uIEooaSl7dmFyIHQ7Y29uc3R7Y3VycmVudERhdGE6bixkaXNwbGF5UG9pbnRDbG91ZExpc3Q6byxzZWxlY3RlZElEOnIsaGlnaGxpZ2h0QXR0cmlidXRlOmwsaW1hZ2VTaXplczpkLGNvbmZpZzp1LHBvbHlnb25MaXN0Omcsc2VsZWN0ZWRJRHM6bX09aSx3PXtmaWxsOiJ0cmFuc3BhcmVudCIsY29sb3I6ImdyZWVuIn07bGV0IHA9W107cmV0dXJuKHQ9bj09bnVsbD92b2lkIDA6bi5tYXBwaW5nSW1nTGlzdCk9PW51bGx8fHQuZm9yRWFjaChlPT57dmFyIE0sUixDLEE7Y29uc3QgUz1vLnJlZHVjZSgoZixoKT0+e3ZhciB2LHM7Y29uc3QgeT1oLmlkPT09cnx8bD09PWguYXR0cmlidXRlLHt0cmFuc2ZlclZpZXdEYXRhOkksdmlld1JhbmdlUG9pbnRMaXN0OmJ9PSh2PVAucG9pbnRDbG91ZExpZGFyMmltYWdlKGgsZS5jYWxpYix7Y3JlYXRlUmFuZ2U6eX0pKSE9bnVsbD92Ont9O2lmKCFJfHwhYilyZXR1cm5bXTtjb25zdCBLPUkucmVkdWNlKChFLEgpPT5ILnR5cGU9PT0ibGluZSI/Wy4uLkUsLi4uSC5wb2ludExpc3RdOkUsW10pLFE9YShjKHt9LHooSykpLHtpbWFnZU5hbWU6ZS5wYXRofSk7aWYoIUYoUSxlLnBhdGgsZCkpcmV0dXJuIGY7Y29uc3Qgaj0ocz1MLnRvb2xTdHlsZUNvbnZlcnRlci5nZXRDb2xvckZyb21Db25maWcoe2F0dHJpYnV0ZTpoLmF0dHJpYnV0ZX0sYShjKHt9LHUpLHthdHRyaWJ1dGVDb25maWd1cmFibGU6ITB9KSx7fSkpPT1udWxsP3ZvaWQgMDpzLnN0cm9rZSxUPUcoe3ZpZXdEYXRhUG9pbnRMaXN0OkkscG9pbnRDbG91ZEJveDpoLGRlZmF1bHRWaWV3U3R5bGU6dyxzdHJva2U6an0pLGs9Wy4uLmYsLi4uVF07cmV0dXJuKGI9PW51bGw/dm9pZCAwOmIubGVuZ3RoKT4wJiZrLnVuc2hpZnQoe3R5cGU6InBvbHlnb24iLGFubm90YXRpb246YShjKHtpZDpyLHBvaW50TGlzdDpifSx3KSx7c3Ryb2tlOmosZmlsbDoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpIn0pfSksa30sW10pLE49ZFsoTT1lPT1udWxsP3ZvaWQgMDplLnBhdGgpIT1udWxsP006IiJdO04mJlYuaXNOdW1iZXIoKFI9ZT09bnVsbD92b2lkIDA6ZS5jYWxpYik9PW51bGw/dm9pZCAwOlIuZ3JvdW5kSGVpZ2h0KSYmZy5mb3JFYWNoKGY9Pntjb25zdCBoPWYucG9pbnRMaXN0Lm1hcChzPT57dmFyIHk7cmV0dXJuIGEoYyh7fSxzKSx7ejooeT1lPT1udWxsP3ZvaWQgMDplLmNhbGliKT09bnVsbD92b2lkIDA6eS5ncm91bmRIZWlnaHR9KX0pLHY9UC5wb2ludExpc3RMaWRhcjJJbWcoaCxlPT1udWxsP3ZvaWQgMDplLmNhbGliLE4pO2lmKHYpe2NvbnN0IHM9TC50b29sU3R5bGVDb252ZXJ0ZXIuZ2V0Q29sb3JGcm9tQ29uZmlnKHthdHRyaWJ1dGU6Zi5hdHRyaWJ1dGV9LGEoYyh7fSx1KSx7YXR0cmlidXRlQ29uZmlndXJhYmxlOiEwfSkse30pO1MucHVzaCh7dHlwZToicG9seWdvbiIsYW5ub3RhdGlvbjphKGMoe2lkOmYuaWQscG9pbnRMaXN0OnZ9LHcpLHtzdHJva2U6cz09bnVsbD92b2lkIDA6cy5zdHJva2UsZmlsbDptLmluY2x1ZGVzKGYuaWQpP3M9PW51bGw/dm9pZCAwOnMuZmlsbDoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpIn0pfSl9fSkscC5wdXNoKHthbm5vdGF0aW9uczpTLHVybDplPT1udWxsP3ZvaWQgMDplLnVybCxmYWxsYmFja1VybDooQz1lPT1udWxsP3ZvaWQgMDplLmZhbGxiYWNrVXJsKSE9bnVsbD9DOiIiLGNhbE5hbWU6KEE9ZT09bnVsbD92b2lkIDA6ZS5jYWxpYik9PW51bGw/dm9pZCAwOkEuY2FsTmFtZSxjYWxpYjplPT1udWxsP3ZvaWQgMDplLmNhbGliLHBhdGg6ZT09bnVsbD92b2lkIDA6ZS5wYXRofSl9KSxwfW9ubWVzc2FnZT1pPT57Y29uc3R7Y3VycmVudERhdGE6dCxkaXNwbGF5UG9pbnRDbG91ZExpc3Q6bixzZWxlY3RlZElEOm8saGlnaGxpZ2h0QXR0cmlidXRlOnIsaW1hZ2VTaXplczpsLGNvbmZpZzpkLHBvbHlnb25MaXN0OnUsc2VsZWN0ZWRJRHM6Z309aS5kYXRhLG09Sih7Y3VycmVudERhdGE6dCxkaXNwbGF5UG9pbnRDbG91ZExpc3Q6bixzZWxlY3RlZElEOm8saGlnaGxpZ2h0QXR0cmlidXRlOnIsaW1hZ2VTaXplczpsLGNvbmZpZzpkLHBvbHlnb25MaXN0OnUsc2VsZWN0ZWRJRHM6Z30pO3Bvc3RNZXNzYWdlKG0pfX0pKGxiVXRpbHMsbGJBbm5vdGF0aW9uLF8pOwoK",null,!1);export{l as default};
|
|
1
|
+
import{createBase64WorkerFactory as d}from"./_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js";var l=d("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgUGY9TWF0aC5wb3c7IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KShlKX1mdW5jdGlvbiBlKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbihlKXt2YXIgbj1mdW5jdGlvbihlLG4pe2lmKCJvYmplY3QiIT10KGUpfHwhZSlyZXR1cm4gZTt2YXIgcj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIGk9ci5jYWxsKGUsbnx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9dChpKSlyZXR1cm4gaTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikoZSl9KGUsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT10KG4pP246bisiIn1mdW5jdGlvbiByKHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuKGkua2V5KSxpKX19ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIGUmJnIodC5wcm90b3R5cGUsZSksbiYmcih0LG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLHR9ZnVuY3Rpb24gbyh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9ZnVuY3Rpb24gcyh0LGUpe3JldHVybihzPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gYSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlJiZzKHQsZSl9ZnVuY3Rpb24gdShlLG4pe2lmKG4mJigib2JqZWN0Ij09dChuKXx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pKXJldHVybiBuO2lmKHZvaWQgMCE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gbyhlKX1mdW5jdGlvbiBjKHQpe3JldHVybihjPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gbCh0LGUscil7cmV0dXJuKGU9bihlKSlpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPXIsdH1mdW5jdGlvbiBoKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1BcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiBmKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fSh0KXx8ZnVuY3Rpb24odCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm51bGwhPXRbU3ltYm9sLml0ZXJhdG9yXXx8bnVsbCE9dFsiQEBpdGVyYXRvciJdKXJldHVybiBBcnJheS5mcm9tKHQpfSh0KXx8ZnVuY3Rpb24odCxlKXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGgodCxlKTt2YXIgbj17fS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PW58fCJTZXQiPT09bj9BcnJheS5mcm9tKHQpOiJBcmd1bWVudHMiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/aCh0LGUpOnZvaWQgMH19KHQpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gcCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gZCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9wKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6cChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH12YXIgZz17dHlwZToibG9nZ2VyIixsb2c6ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoImxvZyIsdCl9LHdhcm46ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoIndhcm4iLHQpfSxlcnJvcjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgiZXJyb3IiLHQpfSxvdXRwdXQ6ZnVuY3Rpb24odCxlKXtjb25zb2xlJiZjb25zb2xlW3RdfX0seT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2UodGhpcyx0KSx0aGlzLmluaXQobixyKX1yZXR1cm4gaSh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307dGhpcy5wcmVmaXg9ZS5wcmVmaXh8fCJpMThuZXh0OiIsdGhpcy5sb2dnZXI9dHx8Zyx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixkKGQoe30se3ByZWZpeDoiIi5jb25jYXQodGhpcy5wcmVmaXgsIjoiKS5jb25jYXQoZSwiOiIpfSksdGhpcy5vcHRpb25zKSl9fSx7a2V5OiJjbG9uZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZXx8dGhpcy5vcHRpb25zKS5wcmVmaXg9ZS5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyB0KHRoaXMubG9nZ2VyLGUpfX1dKSx0fSgpLG09bmV3IHksdj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtlKHRoaXMsdCksdGhpcy5vYnNlcnZlcnM9e319cmV0dXJuIGkodCxbe2tleToib24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdC5zcGxpdCgiICIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe24ub2JzZXJ2ZXJzW3RdPW4ub2JzZXJ2ZXJzW3RdfHxbXSxuLm9ic2VydmVyc1t0XS5wdXNoKGUpfSkpLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5vYnNlcnZlcnNbdF0pe2lmKCFlKXJldHVybiB2b2lkIGRlbGV0ZSB0aGlzLm9ic2VydmVyc1t0XTt0aGlzLm9ic2VydmVyc1t0XT10aGlzLm9ic2VydmVyc1t0XS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09ZX0pKX19fSx7a2V5OiJlbWl0Iix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07dGhpcy5vYnNlcnZlcnNbdF0mJltdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1t0XSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hcHBseSh2b2lkIDAsbil9KSk7dGhpcy5vYnNlcnZlcnNbIioiXSYmW10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzWyIqIl0pLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuYXBwbHkoZSxbdF0uY29uY2F0KG4pKX0pKX19XSksdH0oKTtmdW5jdGlvbiBfKCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe3Q9bixlPXJ9KSk7cmV0dXJuIG4ucmVzb2x2ZT10LG4ucmVqZWN0PWUsbn1mdW5jdGlvbiB4KHQpe3JldHVybiBudWxsPT10PyIiOiIiK3R9ZnVuY3Rpb24gdyh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBpKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKGkoKSlyZXR1cm57fTt2YXIgcz1yKG8uc2hpZnQoKSk7IXRbc10mJm4mJih0W3NdPW5ldyBuKSx0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHMpP3Rbc106e319cmV0dXJuIGkoKT97fTp7b2JqOnQsazpyKG8uc2hpZnQoKSl9fWZ1bmN0aW9uIGIodCxlLG4pe3ZhciByPXcodCxlLE9iamVjdCk7ci5vYmpbci5rXT1ufWZ1bmN0aW9uIEQodCxlKXt2YXIgbj13KHQsZSkscj1uLm9iaixpPW4uaztpZihyKXJldHVybiByW2ldfWZ1bmN0aW9uIEUodCxlLG4pe3ZhciByPUQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkQoZSxuKX1mdW5jdGlvbiBDKHQsZSxuKXtmb3IodmFyIHIgaW4gZSkiX19wcm90b19fIiE9PXImJiJjb25zdHJ1Y3RvciIhPT1yJiYociBpbiB0PyJzdHJpbmciPT10eXBlb2YgdFtyXXx8dFtyXWluc3RhbmNlb2YgU3RyaW5nfHwic3RyaW5nIj09dHlwZW9mIGVbcl18fGVbcl1pbnN0YW5jZW9mIFN0cmluZz9uJiYodFtyXT1lW3JdKTpDKHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFModCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCJcXCQmIil9dmFyIEE9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiBOKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLChmdW5jdGlvbih0KXtyZXR1cm4gQVt0XX0pKTp0fXZhciBJPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ2b2lkIDA9PT13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudERhdGEmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+LTEsTT1bIiAiLCIsIiwiPyIsIiEiLCI7Il07ZnVuY3Rpb24gRih0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gVCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9GKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6RihPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBPKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1jKHQpO2lmKGUpe3ZhciBpPWModGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHUodGhpcyxuKX19ZnVuY3Rpb24gTCh0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXToiLiI7aWYodCl7aWYodFtlXSlyZXR1cm4gdFtlXTtmb3IodmFyIHI9ZS5zcGxpdChuKSxpPXQsbz0wO288ci5sZW5ndGg7KytvKXtpZighaXx8InN0cmluZyI9PXR5cGVvZiBpW3Jbb11dJiZvKzE8ci5sZW5ndGgpcmV0dXJuO2lmKHZvaWQgMD09PWlbcltvXV0pe2Zvcih2YXIgcz0yLGE9ci5zbGljZShvLG8rcykuam9pbihuKSx1PWlbYV07dm9pZCAwPT09dSYmci5sZW5ndGg+bytzOylzKyssdT1pW2E9ci5zbGljZShvLG8rcykuam9pbihuKV07aWYodm9pZCAwPT09dSlyZXR1cm47aWYobnVsbD09PXUpcmV0dXJuIG51bGw7aWYoZS5lbmRzV2l0aChhKSl7aWYoInN0cmluZyI9PXR5cGVvZiB1KXJldHVybiB1O2lmKGEmJiJzdHJpbmciPT10eXBlb2YgdVthXSlyZXR1cm4gdVthXX12YXIgYz1yLnNsaWNlKG8rcykuam9pbihuKTtyZXR1cm4gYz9MKHUsYyxuKTp2b2lkIDB9aT1pW3Jbb11dfXJldHVybiBpfX12YXIgUD1mdW5jdGlvbih0KXthKHIsdCk7dmFyIG49TyhyKTtmdW5jdGlvbiByKHQpe3ZhciBpLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOiJ0cmFuc2xhdGlvbiJ9O3JldHVybiBlKHRoaXMsciksaT1uLmNhbGwodGhpcyksSSYmdi5jYWxsKG8oaSkpLGkuZGF0YT10fHx7fSxpLm9wdGlvbnM9cyx2b2lkIDA9PT1pLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYoaS5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLHZvaWQgMD09PWkub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlJiYoaS5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmU9ITApLGl9cmV0dXJuIGkocixbe2tleToiYWRkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmdGhpcy5vcHRpb25zLm5zLnB1c2godCl9fSx7a2V5OiJyZW1vdmVOYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTtlPi0xJiZ0aGlzLm9wdGlvbnMubnMuc3BsaWNlKGUsMSl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxpPXZvaWQgMCE9PXIua2V5U2VwYXJhdG9yP3Iua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3Isbz12b2lkIDAhPT1yLmlnbm9yZUpTT05TdHJ1Y3R1cmU/ci5pZ25vcmVKU09OU3RydWN0dXJlOnRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlLHM9W3QsZV07biYmInN0cmluZyIhPXR5cGVvZiBuJiYocz1zLmNvbmNhdChuKSksbiYmInN0cmluZyI9PXR5cGVvZiBuJiYocz1zLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocz10LnNwbGl0KCIuIikpO3ZhciBhPUQodGhpcy5kYXRhLHMpO3JldHVybiBhfHwhb3x8InN0cmluZyIhPXR5cGVvZiBuP2E6TCh0aGlzLmRhdGEmJnRoaXMuZGF0YVt0XSYmdGhpcy5kYXRhW3RdW2VdLG4saSl9fSx7a2V5OiJhZGRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOntzaWxlbnQ6ITF9LG89dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjt2b2lkIDA9PT1vJiYobz0iLiIpO3ZhciBzPVt0LGVdO24mJihzPXMuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihyPWUsZT0ocz10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSksYih0aGlzLmRhdGEscyxyKSxpLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4scil9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciBpIGluIG4pKCJzdHJpbmciPT10eXBlb2YgbltpXXx8IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkobltpXSkpJiZ0aGlzLmFkZFJlc291cmNlKHQsZSxpLG5baV0se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0scz1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0ocz10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIGE9RCh0aGlzLmRhdGEscyl8fHt9O3I/QyhhLG4saSk6YT1UKFQoe30sYSksbiksYih0aGlzLmRhdGEscyxhKSxvLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4pfX0se2tleToicmVtb3ZlUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5oYXNSZXNvdXJjZUJ1bmRsZSh0LGUpJiZkZWxldGUgdGhpcy5kYXRhW3RdW2VdLHRoaXMucmVtb3ZlTmFtZXNwYWNlcyhlKSx0aGlzLmVtaXQoInJlbW92ZWQiLHQsZSl9fSx7a2V5OiJoYXNSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0UmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fChlPXRoaXMub3B0aW9ucy5kZWZhdWx0TlMpLCJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQST9UKFQoe30se30pLHRoaXMuZ2V0UmVzb3VyY2UodCxlKSk6dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0RGF0YUJ5TGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGFbdF19fSx7a2V5OiJoYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGF0YUJ5TGFuZ3VhZ2UodCk7cmV0dXJuISEoZSYmT2JqZWN0LmtleXMoZSl8fFtdKS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XSYmT2JqZWN0LmtleXMoZVt0XSkubGVuZ3RoPjB9KSl9fSx7a2V5OiJ0b0pTT04iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX19XSkscn0odiksUj17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXRoaXM7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7by5wcm9jZXNzb3JzW3RdJiYoZT1vLnByb2Nlc3NvcnNbdF0ucHJvY2VzcyhlLG4scixpKSl9KSksZX19O2Z1bmN0aW9uIEIodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIGsodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/QihPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkIoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24geih0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Yyh0KTtpZihlKXt2YXIgaT1jKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB1KHRoaXMsbil9fXZhciBqPXt9LFU9ZnVuY3Rpb24obil7YShzLG4pO3ZhciByPXoocyk7ZnVuY3Rpb24gcyh0KXt2YXIgbixpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4gZSh0aGlzLHMpLG49ci5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKG4pKSxmdW5jdGlvbih0LGUsbil7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3RdJiYoblt0XT1lW3RdKX0pKX0oWyJyZXNvdXJjZVN0b3JlIiwibGFuZ3VhZ2VVdGlscyIsInBsdXJhbFJlc29sdmVyIiwiaW50ZXJwb2xhdG9yIiwiYmFja2VuZENvbm5lY3RvciIsImkxOG5Gb3JtYXQiLCJ1dGlscyJdLHQsbyhuKSksbi5vcHRpb25zPWksdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxuLmxvZ2dlcj1tLmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIGkocyxbe2tleToiY2hhbmdlTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3QmJih0aGlzLmxhbmd1YWdlPXQpfX0se2tleToiZXhpc3RzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319O2lmKG51bGw9PXQpcmV0dXJuITE7dmFyIG49dGhpcy5yZXNvbHZlKHQsZSk7cmV0dXJuIG4mJnZvaWQgMCE9PW4ucmVzfX0se2tleToiZXh0cmFjdEZyb21LZXkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dm9pZCAwIT09ZS5uc1NlcGFyYXRvcj9lLm5zU2VwYXJhdG9yOnRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjt2b2lkIDA9PT1uJiYobj0iOiIpO3ZhciByPXZvaWQgMCE9PWUua2V5U2VwYXJhdG9yP2Uua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsaT1lLm5zfHx0aGlzLm9wdGlvbnMuZGVmYXVsdE5TfHxbXSxvPW4mJnQuaW5kZXhPZihuKT4tMSxzPSEodGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yfHxlLmtleVNlcGFyYXRvcnx8dGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkTnNTZXBhcmF0b3J8fGUubnNTZXBhcmF0b3J8fGZ1bmN0aW9uKHQsZSxuKXtlPWV8fCIiLG49bnx8IiI7dmFyIHI9TS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmluZGV4T2YodCk8MCYmbi5pbmRleE9mKHQpPDB9KSk7aWYoMD09PXIubGVuZ3RoKXJldHVybiEwO3ZhciBpPW5ldyBSZWdFeHAoIigiLmNvbmNhdChyLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIj8iPT09dD8iXFw/Ijp0fSkpLmpvaW4oInwiKSwiKSIpKSxvPSFpLnRlc3QodCk7aWYoIW8pe3ZhciBzPXQuaW5kZXhPZihuKTtzPjAmJiFpLnRlc3QodC5zdWJzdHJpbmcoMCxzKSkmJihvPSEwKX1yZXR1cm4gb30odCxuLHIpKTtpZihvJiYhcyl7dmFyIGE9dC5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtpZihhJiZhLmxlbmd0aD4wKXJldHVybntrZXk6dCxuYW1lc3BhY2VzOml9O3ZhciB1PXQuc3BsaXQobik7KG4hPT1yfHxuPT09ciYmdGhpcy5vcHRpb25zLm5zLmluZGV4T2YodVswXSk+LTEpJiYoaT11LnNoaWZ0KCkpLHQ9dS5qb2luKHIpfXJldHVybiJzdHJpbmciPT10eXBlb2YgaSYmKGk9W2ldKSx7a2V5OnQsbmFtZXNwYWNlczppfX19LHtrZXk6InRyYW5zbGF0ZSIsdmFsdWU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXRoaXM7aWYoIm9iamVjdCIhPT10KG4pJiZ0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXImJihuPXRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihhcmd1bWVudHMpKSxufHwobj17fSksbnVsbD09ZSlyZXR1cm4iIjtBcnJheS5pc0FycmF5KGUpfHwoZT1bU3RyaW5nKGUpXSk7dmFyIG89dm9pZCAwIT09bi5yZXR1cm5EZXRhaWxzP24ucmV0dXJuRGV0YWlsczp0aGlzLm9wdGlvbnMucmV0dXJuRGV0YWlscyxhPXZvaWQgMCE9PW4ua2V5U2VwYXJhdG9yP24ua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsdT10aGlzLmV4dHJhY3RGcm9tS2V5KGVbZS5sZW5ndGgtMV0sbiksYz11LmtleSxsPXUubmFtZXNwYWNlcyxoPWxbbC5sZW5ndGgtMV0sZj1uLmxuZ3x8dGhpcy5sYW5ndWFnZSxwPW4uYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGV8fHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZTtpZihmJiYiY2ltb2RlIj09PWYudG9Mb3dlckNhc2UoKSl7aWYocCl7dmFyIGQ9bi5uc1NlcGFyYXRvcnx8dGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO3JldHVybiBvPyhnLnJlcz0iIi5jb25jYXQoaCkuY29uY2F0KGQpLmNvbmNhdChjKSxnKToiIi5jb25jYXQoaCkuY29uY2F0KGQpLmNvbmNhdChjKX1yZXR1cm4gbz8oZy5yZXM9YyxnKTpjfXZhciBnPXRoaXMucmVzb2x2ZShlLG4pLHk9ZyYmZy5yZXMsbT1nJiZnLnVzZWRLZXl8fGMsdj1nJiZnLmV4YWN0VXNlZEtleXx8YyxfPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoeSkseD12b2lkIDAhPT1uLmpvaW5BcnJheXM/bi5qb2luQXJyYXlzOnRoaXMub3B0aW9ucy5qb2luQXJyYXlzLHc9IXRoaXMuaTE4bkZvcm1hdHx8dGhpcy5pMThuRm9ybWF0LmhhbmRsZUFzT2JqZWN0O2lmKHcmJnkmJigic3RyaW5nIiE9dHlwZW9mIHkmJiJib29sZWFuIiE9dHlwZW9mIHkmJiJudW1iZXIiIT10eXBlb2YgeSkmJlsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXS5pbmRleE9mKF8pPDAmJigic3RyaW5nIiE9dHlwZW9mIHh8fCJbb2JqZWN0IEFycmF5XSIhPT1fKSl7aWYoIW4ucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXt0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyfHx0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKTt2YXIgYj10aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIobSx5LGsoayh7fSxuKSx7fSx7bnM6bH0pKToia2V5ICciLmNvbmNhdChjLCIgKCIpLmNvbmNhdCh0aGlzLmxhbmd1YWdlLCIpJyByZXR1cm5lZCBhbiBvYmplY3QgaW5zdGVhZCBvZiBzdHJpbmcuIik7cmV0dXJuIG8/KGcucmVzPWIsZyk6Yn1pZihhKXt2YXIgRD0iW29iamVjdCBBcnJheV0iPT09XyxFPUQ/W106e30sQz1EP3Y6bTtmb3IodmFyIFMgaW4geSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeSxTKSl7dmFyIEE9IiIuY29uY2F0KEMpLmNvbmNhdChhKS5jb25jYXQoUyk7RVtTXT10aGlzLnRyYW5zbGF0ZShBLGsoayh7fSxuKSx7am9pbkFycmF5czohMSxuczpsfSkpLEVbU109PT1BJiYoRVtTXT15W1NdKX15PUV9fWVsc2UgaWYodyYmInN0cmluZyI9PXR5cGVvZiB4JiYiW29iamVjdCBBcnJheV0iPT09XykoeT15LmpvaW4oeCkpJiYoeT10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKHksZSxuLHIpKTtlbHNle3ZhciBOPSExLEk9ITEsTT12b2lkIDAhPT1uLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIG4uY291bnQsRj1zLmhhc0RlZmF1bHRWYWx1ZShuKSxUPU0/dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoZixuLmNvdW50LG4pOiIiLE89blsiZGVmYXVsdFZhbHVlIi5jb25jYXQoVCldfHxuLmRlZmF1bHRWYWx1ZTshdGhpcy5pc1ZhbGlkTG9va3VwKHkpJiZGJiYoTj0hMCx5PU8pLHRoaXMuaXNWYWxpZExvb2t1cCh5KXx8KEk9ITAseT1jKTt2YXIgTD0obi5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXl8fHRoaXMub3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkpJiZJP3ZvaWQgMDp5LFA9RiYmTyE9PXkmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKEl8fE58fFApe2lmKHRoaXMubG9nZ2VyLmxvZyhQPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixmLGgsYyxQP086eSksYSl7dmFyIFI9dGhpcy5yZXNvbHZlKGMsayhrKHt9LG4pLHt9LHtrZXlTZXBhcmF0b3I6ITF9KSk7UiYmUi5yZXMmJnRoaXMubG9nZ2VyLndhcm4oIlNlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4iKX12YXIgQj1bXSx6PXRoaXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSk7aWYoImZhbGxiYWNrIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvJiZ6JiZ6WzBdKWZvcih2YXIgaj0wO2o8ei5sZW5ndGg7aisrKUIucHVzaCh6W2pdKTtlbHNlImFsbCI9PT10aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz9CPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobi5sbmd8fHRoaXMubGFuZ3VhZ2UpOkIucHVzaChuLmxuZ3x8dGhpcy5sYW5ndWFnZSk7dmFyIFU9ZnVuY3Rpb24odCxlLHIpe3ZhciBvPUYmJnIhPT15P3I6TDtpLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXI/aS5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKHQsaCxlLG8sUCxuKTppLmJhY2tlbmRDb25uZWN0b3ImJmkuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyYmaS5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKHQsaCxlLG8sUCxuKSxpLmVtaXQoIm1pc3NpbmdLZXkiLHQsaCxlLHkpfTt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmcmJih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZNP0IuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXhlcyh0LG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe1UoW3RdLGMrZSxuWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChlKV18fE8pfSkpfSkpOlUoQixjLE8pKX15PXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oeSxlLG4sZyxyKSxJJiZ5PT09YyYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKHk9IiIuY29uY2F0KGgsIjoiKS5jb25jYXQoYykpLChJfHxOKSYmdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXImJih5PSJ2MSIhPT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQST90aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcih0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5PyIiLmNvbmNhdChoLCI6IikuY29uY2F0KGMpOmMsTj95OnZvaWQgMCk6dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoeSkpfXJldHVybiBvPyhnLnJlcz15LGcpOnl9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsayhrKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLG4pLHIudXNlZExuZyxyLnVzZWROUyxyLnVzZWRLZXkse3Jlc29sdmVkOnJ9KTtlbHNlIGlmKCFuLnNraXBJbnRlcnBvbGF0aW9uKXtuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLmluaXQoayhrKHt9LG4pLHtpbnRlcnBvbGF0aW9uOmsoayh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiksbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgcyxhPSJzdHJpbmciPT10eXBlb2YgdCYmKG4mJm4uaW50ZXJwb2xhdGlvbiYmdm9pZCAwIT09bi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcz9uLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzOnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyk7aWYoYSl7dmFyIHU9dC5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtzPXUmJnUubGVuZ3RofXZhciBjPW4ucmVwbGFjZSYmInN0cmluZyIhPXR5cGVvZiBuLnJlcGxhY2U/bi5yZXBsYWNlOm47aWYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyYmKGM9ayhrKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLGMpKSx0PXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKHQsYyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSxuKSxhKXt2YXIgbD10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO3M8KGwmJmwubGVuZ3RoKSYmKG4ubmVzdD0hMSl9ITEhPT1uLm5lc3QmJih0PXRoaXMuaW50ZXJwb2xhdG9yLm5lc3QodCwoZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheSh0KSxzPTA7czx0O3MrKylyW3NdPWFyZ3VtZW50c1tzXTtyZXR1cm4gaSYmaVswXT09PXJbMF0mJiFuLmNvbnRleHQ/KG8ubG9nZ2VyLndhcm4oIkl0IHNlZW1zIHlvdSBhcmUgbmVzdGluZyByZWN1cnNpdmVseSBrZXk6ICIuY29uY2F0KHJbMF0sIiBpbiBrZXk6ICIpLmNvbmNhdChlWzBdKSksbnVsbCk6by50cmFuc2xhdGUuYXBwbHkobyxyLmNvbmNhdChbZV0pKX0pLG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGg9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLGY9InN0cmluZyI9PXR5cGVvZiBoP1toXTpoO3JldHVybiBudWxsIT10JiZmJiZmLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9Ui5oYW5kbGUoZix0LGUsdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ/ayh7aTE4blJlc29sdmVkOnJ9LG4pOm4sdGhpcykpLHR9fSx7a2V5OiJyZXNvbHZlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHM9dGhpcyxhPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighcy5pc1ZhbGlkTG9va3VwKGUpKXt2YXIgdT1zLmV4dHJhY3RGcm9tS2V5KHQsYSksYz11LmtleTtuPWM7dmFyIGw9dS5uYW1lc3BhY2VzO3Mub3B0aW9ucy5mYWxsYmFja05TJiYobD1sLmNvbmNhdChzLm9wdGlvbnMuZmFsbGJhY2tOUykpO3ZhciBoPXZvaWQgMCE9PWEuY291bnQmJiJzdHJpbmciIT10eXBlb2YgYS5jb3VudCxmPWgmJiFhLm9yZGluYWwmJjA9PT1hLmNvdW50JiZzLnBsdXJhbFJlc29sdmVyLnNob3VsZFVzZUludGxBcGkoKSxwPXZvaWQgMCE9PWEuY29udGV4dCYmKCJzdHJpbmciPT10eXBlb2YgYS5jb250ZXh0fHwibnVtYmVyIj09dHlwZW9mIGEuY29udGV4dCkmJiIiIT09YS5jb250ZXh0LGQ9YS5sbmdzP2EubG5nczpzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGEubG5nfHxzLmxhbmd1YWdlLGEuZmFsbGJhY2tMbmcpO2wuZm9yRWFjaCgoZnVuY3Rpb24odCl7cy5pc1ZhbGlkTG9va3VwKGUpfHwobz10LCFqWyIiLmNvbmNhdChkWzBdLCItIikuY29uY2F0KHQpXSYmcy51dGlscyYmcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiFzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShvKSYmKGpbIiIuY29uY2F0KGRbMF0sIi0iKS5jb25jYXQodCldPSEwLHMubG9nZ2VyLndhcm4oJ2tleSAiJy5jb25jYXQobiwnIiBmb3IgbGFuZ3VhZ2VzICInKS5jb25jYXQoZC5qb2luKCIsICIpLCciIHdvblwndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlICInKS5jb25jYXQobywnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIikpLGQuZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIXMuaXNWYWxpZExvb2t1cChlKSl7aT1uO3ZhciBvLHU9W2NdO2lmKHMuaTE4bkZvcm1hdCYmcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMpcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXModSxjLG4sdCxhKTtlbHNle3ZhciBsO2gmJihsPXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KG4sYS5jb3VudCxhKSk7dmFyIGQ9IiIuY29uY2F0KHMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsInplcm8iKTtpZihoJiYodS5wdXNoKGMrbCksZiYmdS5wdXNoKGMrZCkpLHApe3ZhciBnPSIiLmNvbmNhdChjKS5jb25jYXQocy5vcHRpb25zLmNvbnRleHRTZXBhcmF0b3IpLmNvbmNhdChhLmNvbnRleHQpO3UucHVzaChnKSxoJiYodS5wdXNoKGcrbCksZiYmdS5wdXNoKGcrZCkpfX1mb3IoO289dS5wb3AoKTspcy5pc1ZhbGlkTG9va3VwKGUpfHwocj1vLGU9cy5nZXRSZXNvdXJjZShuLHQsbyxhKSl9fSkpKX0pKX19KSkse3JlczplLHVzZWRLZXk6bixleGFjdFVzZWRLZXk6cix1c2VkTG5nOmksdXNlZE5TOm99fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuISh2b2lkIDA9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybk51bGwmJm51bGw9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nJiYiIj09PXQpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e307cmV0dXJuIHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlP3RoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZSh0LGUsbixyKTp0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UodCxlLG4scil9fV0sW3trZXk6Imhhc0RlZmF1bHRWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9ImRlZmF1bHRWYWx1ZSI7Zm9yKHZhciBuIGluIHQpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJmU9PT1uLnN1YnN0cmluZygwLDEyKSYmdm9pZCAwIT09dFtuXSlyZXR1cm4hMDtyZXR1cm4hMX19XSksc30odik7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBWPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuKXtlKHRoaXMsdCksdGhpcy5vcHRpb25zPW4sdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1tLmNyZWF0ZSgibGFuZ3VhZ2VVdGlscyIpfXJldHVybiBpKHQsW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiAyPT09ZS5sZW5ndGh8fChlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKSk/bnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlLmpvaW4oIi0iKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKX0pKToyPT09bi5sZW5ndGg/KG5bMF09blswXS50b0xvd2VyQ2FzZSgpLG5bMV09blsxXS50b1VwcGVyQ2FzZSgpLGUuaW5kZXhPZihuWzFdLnRvTG93ZXJDYXNlKCkpPi0xJiYoblsxXT1xKG5bMV0udG9Mb3dlckNhc2UoKSkpKTozPT09bi5sZW5ndGgmJihuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSwyPT09blsxXS5sZW5ndGgmJihuWzFdPW5bMV0udG9VcHBlckNhc2UoKSksInNnbiIhPT1uWzBdJiYyPT09blsyXS5sZW5ndGgmJihuWzJdPW5bMl0udG9VcHBlckNhc2UoKSksZS5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzFdPXEoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPXEoblsyXS50b0xvd2VyQ2FzZSgpKSkpLG4uam9pbigiLSIpfXJldHVybiB0aGlzLm9wdGlvbnMuY2xlYW5Db2RlfHx0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP3QudG9Mb3dlckNhc2UoKTp0fX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmZvcm1hdExhbmd1YWdlQ29kZSh0KTsoIW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHxuLmlzU3VwcG9ydGVkQ29kZShyKSkmJihlPXIpfX0pKSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJnQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCk7aWYobi5pc1N1cHBvcnRlZENvZGUocikpcmV0dXJuIGU9cjtlPW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzLmZpbmQoKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KSl9fSkpLGV8fChlPXRoaXMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpWzBdKSxlKTpudWxsfX0se2tleToiZ2V0RmFsbGJhY2tDb2RlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm5bXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dChlKSksInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLCJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHQpKXJldHVybiB0O2lmKCFlKXJldHVybiB0LmRlZmF1bHR8fFtdO3ZhciBuPXRbZV07cmV0dXJuIG58fChuPXRbdGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUoZSldKSxufHwobj10W3RoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUpXSksbnx8KG49dFt0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGUpXSksbnx8KG49dC5kZWZhdWx0KSxufHxbXX19LHtrZXk6InRvUmVzb2x2ZUhpZXJhcmNoeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dGhpcy5nZXRGYWxsYmFja0NvZGVzKGV8fHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZ3x8W10sdCksaT1bXSxvPWZ1bmN0aW9uKHQpeyF0fHwobi5pc1N1cHBvcnRlZENvZGUodCk/aS5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZvKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJm8odGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmbyh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZvKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuaW5kZXhPZih0KTwwJiZvKG4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKX0pKSxpfX1dKSx0fSgpLEc9W3tsbmdzOlsiYWNoIiwiYWsiLCJhbSIsImFybiIsImJyIiwiZmlsIiwiZ3VuIiwibG4iLCJtZmUiLCJtZyIsIm1pIiwib2MiLCJwdCIsInB0LUJSIiwidGciLCJ0bCIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtrIiwia24iLCJrdSIsImxiIiwibWFpIiwibWwiLCJtbiIsIm1yIiwibmFoIiwibmFwIiwibmIiLCJuZSIsIm5sIiwibm4iLCJubyIsIm5zbyIsInBhIiwicGFwIiwicG1zIiwicHMiLCJwdC1QVCIsInJtIiwic2NvIiwic2UiLCJzaSIsInNvIiwic29uIiwic3EiLCJzdiIsInN3IiwidGEiLCJ0ZSIsInRrIiwidXIiLCJ5byJdLG5yOlsxLDJdLGZjOjJ9LHtsbmdzOlsiYXkiLCJibyIsImNnZyIsImZhIiwiaHQiLCJpZCIsImphIiwiamJvIiwia2EiLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sWT17MTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ+MSl9LDI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxIT10KX0sMzpmdW5jdGlvbih0KXtyZXR1cm4gMH0sNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA+PTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSw1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMD09dD8wOjE9PXQ/MToyPT10PzI6dCUxMDA+PTMmJnQlMTAwPD0xMD8zOnQlMTAwPj0xMT80OjUpfSw2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOnQ+PTImJnQ8PTQ/MToyKX0sNzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sODpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6OCE9dCYmMTEhPXQ/MjozKX0sOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ+PTIpfSwxMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6dDw3PzI6dDwxMT8zOjQpfSwxMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXR8fDExPT10PzA6Mj09dHx8MTI9PXQ/MTp0PjImJnQ8MjA/MjozKX0sMTI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwIT0xfHx0JTEwMD09MTEpfSwxMzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDAhPT10KX0sMTQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjM9PXQ/MjozKX0sMTU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sMTY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDowIT09dD8xOjIpfSwxNzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXR8fHQlMTA9PTEmJnQlMTAwIT0xMT8wOjEpfSwxODpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mil9LDE5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjA9PXR8fHQlMTAwPjEmJnQlMTAwPDExPzE6dCUxMDA+MTAmJnQlMTAwPDIwPzI6Myl9LDIwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjA9PXR8fHQlMTAwPjAmJnQlMTAwPDIwPzE6Mil9LDIxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMDA9PTE/MTp0JTEwMD09Mj8yOnQlMTAwPT0zfHx0JTEwMD09ND8zOjApfSwyMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6KHQ8MHx8dD4xMCkmJnQlMTA9PTA/MjozKX19LFg9WyJ2MSIsInYyIiwidjMiXSxXPXt6ZXJvOjAsb25lOjEsdHdvOjIsZmV3OjMsbWFueTo0LG90aGVyOjV9O3ZhciBIPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307ZSh0aGlzLHQpLHRoaXMubGFuZ3VhZ2VVdGlscz1uLHRoaXMub3B0aW9ucz1yLHRoaXMubG9nZ2VyPW0uY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLCghdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OfHwidjQiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgSW50bHx8IUludGwuUGx1cmFsUnVsZXMpJiYodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPSJ2MyIsdGhpcy5sb2dnZXIuZXJyb3IoIllvdXIgZW52aXJvbm1lbnQgc2VlbXMgbm90IHRvIGJlIEludGwgQVBJIGNvbXBhdGlibGUsIHVzZSBhbiBJbnRsLlBsdXJhbFJ1bGVzIHBvbHlmaWxsLiBXaWxsIGZhbGxiYWNrIHRvIHRoZSBjb21wYXRpYmlsaXR5SlNPTiB2MyBmb3JtYXQgaGFuZGxpbmcuIikpLHRoaXMucnVsZXM9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gRy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmxuZ3MuZm9yRWFjaCgoZnVuY3Rpb24obil7dFtuXT17bnVtYmVyczplLm5yLHBsdXJhbHM6WVtlLmZjXX19KSl9KSksdH0oKX1yZXR1cm4gaSh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZih0aGlzLnNob3VsZFVzZUludGxBcGkoKSl0cnl7cmV0dXJuIG5ldyBJbnRsLlBsdXJhbFJ1bGVzKHQse3R5cGU6ZS5vcmRpbmFsPyJvcmRpbmFsIjoiY2FyZGluYWwifSl9Y2F0Y2godCl7cmV0dXJufXJldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49dGhpcy5nZXRSdWxlKHQsZSk7cmV0dXJuIHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpP24mJm4ucmVzb2x2ZWRPcHRpb25zKCkucGx1cmFsQ2F0ZWdvcmllcy5sZW5ndGg+MTpuJiZuLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fTtyZXR1cm4gdGhpcy5nZXRTdWZmaXhlcyh0LG4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiIuY29uY2F0KGUpLmNvbmNhdCh0KX0pKX19LHtrZXk6ImdldFN1ZmZpeGVzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LHI9dGhpcy5nZXRSdWxlKHQsbik7cmV0dXJuIHI/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/ci5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdbdF0tV1tlXX0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIiLmNvbmNhdChlLm9wdGlvbnMucHJlcGVuZCkuY29uY2F0KHQpfSkpOnIubnVtYmVycy5tYXAoKGZ1bmN0aW9uKHIpe3JldHVybiBlLmdldFN1ZmZpeCh0LHIsbil9KSk6W119fSx7a2V5OiJnZXRTdWZmaXgiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LHI9dGhpcy5nZXRSdWxlKHQsbik7cmV0dXJuIHI/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/IiIuY29uY2F0KHRoaXMub3B0aW9ucy5wcmVwZW5kKS5jb25jYXQoci5zZWxlY3QoZSkpOnRoaXMuZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlKHIsZSk6KHRoaXMubG9nZ2VyLndhcm4oIm5vIHBsdXJhbCBydWxlIGZvdW5kIGZvcjogIi5jb25jYXQodCkpLCIiKX19LHtrZXk6ImdldFN1ZmZpeFJldHJvQ29tcGF0aWJsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dC5ub0Ficz90LnBsdXJhbHMoZSk6dC5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXQubnVtYmVyc1tyXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT10Lm51bWJlcnMubGVuZ3RoJiYxPT09dC5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgbz1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6bygpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT058fHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXQubnVtYmVycy5sZW5ndGgmJjE9PT10Lm51bWJlcnNbMF0/bygpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZyLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrci50b1N0cmluZygpOnIudG9TdHJpbmcoKX19LHtrZXk6InNob3VsZFVzZUludGxBcGkiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIVguaW5jbHVkZXModGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKX19XSksdH0oKTtmdW5jdGlvbiBaKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBLKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP1ooT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpaKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fXZhciBKPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtlKHRoaXMsdCksdGhpcy5sb2dnZXI9bS5jcmVhdGUoImludGVycG9sYXRvciIpLHRoaXMub3B0aW9ucz1uLHRoaXMuZm9ybWF0PW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLmZvcm1hdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHRoaXMuaW5pdChuKX1yZXR1cm4gaSh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTt0LmludGVycG9sYXRpb258fCh0LmludGVycG9sYXRpb249e2VzY2FwZVZhbHVlOiEwfSk7dmFyIGU9dC5pbnRlcnBvbGF0aW9uO3RoaXMuZXNjYXBlPXZvaWQgMCE9PWUuZXNjYXBlP2UuZXNjYXBlOk4sdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9TKGUucHJlZml4KTplLnByZWZpeEVzY2FwZWR8fCJ7eyIsdGhpcy5zdWZmaXg9ZS5zdWZmaXg/UyhlLnN1ZmZpeCk6ZS5zdWZmaXhFc2NhcGVkfHwifX0iLHRoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCIsdGhpcy51bmVzY2FwZVByZWZpeD1lLnVuZXNjYXBlU3VmZml4PyIiOmUudW5lc2NhcGVQcmVmaXh8fCItIix0aGlzLnVuZXNjYXBlU3VmZml4PXRoaXMudW5lc2NhcGVQcmVmaXg/IiI6ZS51bmVzY2FwZVN1ZmZpeHx8IiIsdGhpcy5uZXN0aW5nUHJlZml4PWUubmVzdGluZ1ByZWZpeD9TKGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8UygiJHQoIiksdGhpcy5uZXN0aW5nU3VmZml4PWUubmVzdGluZ1N1ZmZpeD9TKGUubmVzdGluZ1N1ZmZpeCk6ZS5uZXN0aW5nU3VmZml4RXNjYXBlZHx8UygiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzLGE9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihhLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIGk9RShlLHUsdCk7cmV0dXJuIGEuYWx3YXlzRm9ybWF0P2EuZm9ybWF0KGksdm9pZCAwLG4sSyhLKEsoe30sciksZSkse30se2ludGVycG9sYXRpb25rZXk6dH0pKTppfXZhciBvPXQuc3BsaXQoYS5mb3JtYXRTZXBhcmF0b3IpLHM9by5zaGlmdCgpLnRyaW0oKSxjPW8uam9pbihhLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBhLmZvcm1hdChFKGUsdSxzKSxjLG4sSyhLKEsoe30sciksZSkse30se2ludGVycG9sYXRpb25rZXk6c30pKX07dGhpcy5yZXNldFJlZ0V4cCgpO3ZhciBoPXImJnIubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyfHx0aGlzLm9wdGlvbnMubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyLGY9ciYmci5pbnRlcnBvbGF0aW9uJiZ2b2lkIDAhPT1yLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzP3IuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM6dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO3JldHVyblt7cmVnZXg6dGhpcy5yZWdleHBVbmVzY2FwZSxzYWZlVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGModCl9fSx7cmVnZXg6dGhpcy5yZWdleHAsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBhLmVzY2FwZVZhbHVlP2MoYS5lc2NhcGUodCkpOmModCl9fV0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7Zm9yKHM9MDtpPWUucmVnZXguZXhlYyh0KTspe3ZhciBuPWlbMV0udHJpbSgpO2lmKHZvaWQgMD09PShvPWwobikpKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBoKXt2YXIgdT1oKHQsaSxyKTtvPSJzdHJpbmciPT10eXBlb2YgdT91OiIifWVsc2UgaWYociYmci5oYXNPd25Qcm9wZXJ0eShuKSlvPSIiO2Vsc2V7aWYoZil7bz1pWzBdO2NvbnRpbnVlfWEubG9nZ2VyLndhcm4oIm1pc3NlZCB0byBwYXNzIGluIHZhcmlhYmxlICIuY29uY2F0KG4sIiBmb3IgaW50ZXJwb2xhdGluZyAiKS5jb25jYXQodCkpLG89IiJ9ZWxzZSJzdHJpbmciIT10eXBlb2YgbyYmIWEudXNlUmF3VmFsdWVUb0VzY2FwZSYmKG89eChvKSk7dmFyIGM9ZS5zYWZlVmFsdWUobyk7aWYodD10LnJlcGxhY2UoaVswXSxjKSxmPyhlLnJlZ2V4Lmxhc3RJbmRleCs9by5sZW5ndGgsZS5yZWdleC5sYXN0SW5kZXgtPWlbMF0ubGVuZ3RoKTplLnJlZ2V4Lmxhc3RJbmRleD0wLCsrcz49YS5tYXhSZXBsYWNlcylicmVha319KSksdH19LHtrZXk6Im5lc3QiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30scz1LKHt9LG8pO2Z1bmN0aW9uIGEodCxlKXt2YXIgbj10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHQuaW5kZXhPZihuKTwwKXJldHVybiB0O3ZhciByPXQuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQobiwiWyBdKnsiKSkpLGk9InsiLmNvbmNhdChyWzFdKTt0PXJbMF07dmFyIG89KGk9dGhpcy5pbnRlcnBvbGF0ZShpLHMpKS5tYXRjaCgvJy9nKSxhPWkubWF0Y2goLyIvZyk7KG8mJm8ubGVuZ3RoJTI9PTAmJiFhfHxhLmxlbmd0aCUyIT0wKSYmKGk9aS5yZXBsYWNlKC8nL2csJyInKSk7dHJ5e3M9SlNPTi5wYXJzZShpKSxlJiYocz1LKEsoe30sZSkscykpfWNhdGNoKGUpe3JldHVybiB0aGlzLmxvZ2dlci53YXJuKCJmYWlsZWQgcGFyc2luZyBvcHRpb25zIHN0cmluZyBpbiBuZXN0aW5nIGZvciBrZXkgIi5jb25jYXQodCksZSksIiIuY29uY2F0KHQpLmNvbmNhdChuKS5jb25jYXQoaSl9cmV0dXJuIGRlbGV0ZSBzLmRlZmF1bHRWYWx1ZSx0fWZvcihzLmFwcGx5UG9zdFByb2Nlc3Nvcj0hMSxkZWxldGUgcy5kZWZhdWx0VmFsdWU7bj10aGlzLm5lc3RpbmdSZWdleHAuZXhlYyh0KTspe3ZhciB1PVtdLGM9ITE7aWYoLTEhPT1uWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSkpO25bMV09bC5zaGlmdCgpLHU9bCxjPSEwfWlmKChyPWUoYS5jYWxsKHRoaXMsblsxXS50cmltKCkscykscykpJiZuWzBdPT09dCYmInN0cmluZyIhPXR5cGVvZiByKXJldHVybiByOyJzdHJpbmciIT10eXBlb2YgciYmKHI9eChyKSkscnx8KHRoaXMubG9nZ2VyLndhcm4oIm1pc3NlZCB0byByZXNvbHZlICIuY29uY2F0KG5bMV0sIiBmb3IgbmVzdGluZyAiKS5jb25jYXQodCkpLHI9IiIpLGMmJihyPXUucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBpLmZvcm1hdCh0LGUsby5sbmcsSyhLKHt9LG8pLHt9LHtpbnRlcnBvbGF0aW9ua2V5Om5bMV0udHJpbSgpfSkpfSksci50cmltKCkpKSx0PXQucmVwbGFjZShuWzBdLHIpLHRoaXMucmVnZXhwLmxhc3RJbmRleD0wfXJldHVybiB0fX1dKSx0fSgpO2Z1bmN0aW9uIFEodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uICQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/UShPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlEoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gdHQodCl7dmFyIGU9e307cmV0dXJuIGZ1bmN0aW9uKG4scixpKXt2YXIgbz1yK0pTT04uc3RyaW5naWZ5KGkpLHM9ZVtvXTtyZXR1cm4gc3x8KHM9dChyLGkpLGVbb109cykscyhuKX19dmFyIGV0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtlKHRoaXMsdCksdGhpcy5sb2dnZXI9bS5jcmVhdGUoImZvcm1hdHRlciIpLHRoaXMub3B0aW9ucz1uLHRoaXMuZm9ybWF0cz17bnVtYmVyOnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLk51bWJlckZvcm1hdCh0LGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5mb3JtYXQodCl9fSkpLGN1cnJlbmN5OnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLk51bWJlckZvcm1hdCh0LCQoJCh7fSxlKSx7fSx7c3R5bGU6ImN1cnJlbmN5In0pKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQpfX0pKSxkYXRldGltZTp0dCgoZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LCQoe30sZSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5mb3JtYXQodCl9fSkpLHJlbGF0aXZldGltZTp0dCgoZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCwkKHt9LGUpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQsZS5yYW5nZXx8ImRheSIpfX0pKSxsaXN0OnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLkxpc3RGb3JtYXQodCwkKHt9LGUpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQpfX0pKX0sdGhpcy5pbml0KG4pfXJldHVybiBpKHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319KS5pbnRlcnBvbGF0aW9uO3RoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCJ9fSx7a2V5OiJhZGQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPWV9fSx7a2V5OiJhZGRDYWNoZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPXR0KGUpfX0se2tleToiZm9ybWF0Iix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLG89ZS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikucmVkdWNlKChmdW5jdGlvbih0LGUpe3ZhciBvPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9Mb3dlckNhc2UoKS50cmltKCksbj17fTtpZih0LmluZGV4T2YoIigiKT4tMSl7dmFyIHI9dC5zcGxpdCgiKCIpO2U9clswXS50b0xvd2VyQ2FzZSgpLnRyaW0oKTt2YXIgaT1yWzFdLnN1YnN0cmluZygwLHJbMV0ubGVuZ3RoLTEpOyJjdXJyZW5jeSI9PT1lJiZpLmluZGV4T2YoIjoiKTwwP24uY3VycmVuY3l8fChuLmN1cnJlbmN5PWkudHJpbSgpKToicmVsYXRpdmV0aW1lIj09PWUmJmkuaW5kZXhPZigiOiIpPDA/bi5yYW5nZXx8KG4ucmFuZ2U9aS50cmltKCkpOmkuc3BsaXQoIjsiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0KXt2YXIgZT1mKHQuc3BsaXQoIjoiKSkscj1lWzBdLGk9ZS5zbGljZSgxKS5qb2luKCI6IikudHJpbSgpLnJlcGxhY2UoL14nK3wnKyQvZywiIik7bltyLnRyaW0oKV18fChuW3IudHJpbSgpXT1pKSwiZmFsc2UiPT09aSYmKG5bci50cmltKCldPSExKSwidHJ1ZSI9PT1pJiYobltyLnRyaW0oKV09ITApLGlzTmFOKGkpfHwobltyLnRyaW0oKV09cGFyc2VJbnQoaSwxMCkpfX0pKX1yZXR1cm57Zm9ybWF0TmFtZTplLGZvcm1hdE9wdGlvbnM6bn19KGUpLHM9by5mb3JtYXROYW1lLGE9by5mb3JtYXRPcHRpb25zO2lmKGkuZm9ybWF0c1tzXSl7dmFyIHU9dDt0cnl7dmFyIGM9ciYmci5mb3JtYXRQYXJhbXMmJnIuZm9ybWF0UGFyYW1zW3IuaW50ZXJwb2xhdGlvbmtleV18fHt9LGw9Yy5sb2NhbGV8fGMubG5nfHxyLmxvY2FsZXx8ci5sbmd8fG47dT1pLmZvcm1hdHNbc10odCxsLCQoJCgkKHt9LGEpLHIpLGMpKX1jYXRjaCh0KXtpLmxvZ2dlci53YXJuKHQpfXJldHVybiB1fXJldHVybiBpLmxvZ2dlci53YXJuKCJ0aGVyZSB3YXMgbm8gZm9ybWF0IGZ1bmN0aW9uIGZvciAiLmNvbmNhdChzKSksdH0pLHQpO3JldHVybiBvfX1dKSx0fSgpO2Z1bmN0aW9uIG50KHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBydCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9udChPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOm50KE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fWZ1bmN0aW9uIGl0KHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1jKHQpO2lmKGUpe3ZhciBpPWModGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHUodGhpcyxuKX19dmFyIG90PWZ1bmN0aW9uKHQpe2Eocix0KTt2YXIgbj1pdChyKTtmdW5jdGlvbiByKHQsaSxzKXt2YXIgYSx1PWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gZSh0aGlzLHIpLGE9bi5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKGEpKSxhLmJhY2tlbmQ9dCxhLnN0b3JlPWksYS5zZXJ2aWNlcz1zLGEubGFuZ3VhZ2VVdGlscz1zLmxhbmd1YWdlVXRpbHMsYS5vcHRpb25zPXUsYS5sb2dnZXI9bS5jcmVhdGUoImJhY2tlbmRDb25uZWN0b3IiKSxhLndhaXRpbmdSZWFkcz1bXSxhLm1heFBhcmFsbGVsUmVhZHM9dS5tYXhQYXJhbGxlbFJlYWRzfHwxMCxhLnJlYWRpbmdDYWxscz0wLGEubWF4UmV0cmllcz11Lm1heFJldHJpZXM+PTA/dS5tYXhSZXRyaWVzOjUsYS5yZXRyeVRpbWVvdXQ9dS5yZXRyeVRpbWVvdXQ+PTE/dS5yZXRyeVRpbWVvdXQ6MzUwLGEuc3RhdGU9e30sYS5xdWV1ZT1bXSxhLmJhY2tlbmQmJmEuYmFja2VuZC5pbml0JiZhLmJhY2tlbmQuaW5pdChzLHUuYmFja2VuZCx1KSxhfXJldHVybiBpKHIsW3trZXk6InF1ZXVlTG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcyxvPXt9LHM9e30sYT17fSx1PXt9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGE9IiIuY29uY2F0KHQsInwiKS5jb25jYXQoZSk7IW4ucmVsb2FkJiZpLnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHQsZSk/aS5zdGF0ZVthXT0yOmkuc3RhdGVbYV08MHx8KDE9PT1pLnN0YXRlW2FdP3ZvaWQgMD09PXNbYV0mJihzW2FdPSEwKTooaS5zdGF0ZVthXT0xLHI9ITEsdm9pZCAwPT09c1thXSYmKHNbYV09ITApLHZvaWQgMD09PW9bYV0mJihvW2FdPSEwKSx2b2lkIDA9PT11W2VdJiYodVtlXT0hMCkpKX0pKSxyfHwoYVt0XT0hMCl9KSksKE9iamVjdC5rZXlzKG8pLmxlbmd0aHx8T2JqZWN0LmtleXMocykubGVuZ3RoKSYmdGhpcy5xdWV1ZS5wdXNoKHtwZW5kaW5nOnMscGVuZGluZ0NvdW50Ok9iamVjdC5rZXlzKHMpLmxlbmd0aCxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOk9iamVjdC5rZXlzKG8pLHBlbmRpbmc6T2JqZWN0LmtleXMocyksdG9Mb2FkTGFuZ3VhZ2VzOk9iamVjdC5rZXlzKGEpLHRvTG9hZE5hbWVzcGFjZXM6T2JqZWN0LmtleXModSl9fX0se2tleToibG9hZGVkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5zcGxpdCgifCIpLGk9clswXSxvPXJbMV07ZSYmdGhpcy5lbWl0KCJmYWlsZWRMb2FkaW5nIixpLG8sZSksbiYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShpLG8sbiksdGhpcy5zdGF0ZVt0XT1lPy0xOjI7dmFyIHM9e307dGhpcy5xdWV1ZS5mb3JFYWNoKChmdW5jdGlvbihuKXsoZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dyh0LGUsT2JqZWN0KSxvPWkub2JqLHM9aS5rO29bc109b1tzXXx8W10sciYmKG9bc109b1tzXS5jb25jYXQobikpLHJ8fG9bc10ucHVzaChuKX0pKG4ubG9hZGVkLFtpXSxvKSxmdW5jdGlvbih0LGUpe3ZvaWQgMCE9PXQucGVuZGluZ1tlXSYmKGRlbGV0ZSB0LnBlbmRpbmdbZV0sdC5wZW5kaW5nQ291bnQtLSl9KG4sdCksZSYmbi5lcnJvcnMucHVzaChlKSwwPT09bi5wZW5kaW5nQ291bnQmJiFuLmRvbmUmJihPYmplY3Qua2V5cyhuLmxvYWRlZCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7c1t0XXx8KHNbdF09e30pO3ZhciBlPW4ubG9hZGVkW3RdO2UubGVuZ3RoJiZlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZvaWQgMD09PXNbdF1bZV0mJihzW3RdW2VdPSEwKX0pKX0pKSxuLmRvbmU9ITAsbi5lcnJvcnMubGVuZ3RoP24uY2FsbGJhY2sobi5lcnJvcnMpOm4uY2FsbGJhY2soKSl9KSksdGhpcy5lbWl0KCJsb2FkZWQiLHMpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmRvbmV9KSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTowLG89YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOnRoaXMucmV0cnlUaW1lb3V0LHM9YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTp2b2lkIDA7cmV0dXJuIHQubGVuZ3RoP3RoaXMucmVhZGluZ0NhbGxzPj10aGlzLm1heFBhcmFsbGVsUmVhZHM/dm9pZCB0aGlzLndhaXRpbmdSZWFkcy5wdXNoKHtsbmc6dCxuczplLGZjTmFtZTpuLHRyaWVkOmksd2FpdDpvLGNhbGxiYWNrOnN9KToodGhpcy5yZWFkaW5nQ2FsbHMrKyx0aGlzLmJhY2tlbmRbbl0odCxlLChmdW5jdGlvbihhLHUpe2lmKHIucmVhZGluZ0NhbGxzLS0sci53YWl0aW5nUmVhZHMubGVuZ3RoPjApe3ZhciBjPXIud2FpdGluZ1JlYWRzLnNoaWZ0KCk7ci5yZWFkKGMubG5nLGMubnMsYy5mY05hbWUsYy50cmllZCxjLndhaXQsYy5jYWxsYmFjayl9YSYmdSYmaTxyLm1heFJldHJpZXM/c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyLnJlYWQuY2FsbChyLHQsZSxuLGkrMSwyKm8scyl9KSxvKTpzKGEsdSl9KSkpOnMobnVsbCx7fSl9fSx7a2V5OiJwcmVwYXJlTG9hZGluZyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7aWYoIXRoaXMuYmFja2VuZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiTm8gYmFja2VuZCB3YXMgYWRkZWQgdmlhIGkxOG5leHQudXNlLiBXaWxsIG5vdCBsb2FkIHJlc291cmNlcy4iKSxpJiZpKCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD10aGlzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpKSwic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSk7dmFyIG89dGhpcy5xdWV1ZUxvYWQodCxlLHIsaSk7aWYoIW8udG9Mb2FkLmxlbmd0aClyZXR1cm4gby5wZW5kaW5nLmxlbmd0aHx8aSgpLG51bGw7by50b0xvYWQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSkpfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3RoaXMucHJlcGFyZUxvYWRpbmcodCxlLHt9LG4pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse3JlbG9hZDohMH0sbil9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIiLHI9dC5zcGxpdCgifCIpLGk9clswXSxvPXJbMV07dGhpcy5yZWFkKGksbywicmVhZCIsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24ocixzKXtyJiZlLmxvZ2dlci53YXJuKCIiLmNvbmNhdChuLCJsb2FkaW5nIG5hbWVzcGFjZSAiKS5jb25jYXQobywiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQoaSwiIGZhaWxlZCIpLHIpLCFyJiZzJiZlLmxvZ2dlci5sb2coIiIuY29uY2F0KG4sImxvYWRlZCBuYW1lc3BhY2UgIikuY29uY2F0KG8sIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KGkpLHMpLGUubG9hZGVkKHQscixzKX0pKX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGw9PW58fCIiPT09bnx8KHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwscnQocnQoe30sbykse30se2lzVXBkYXRlOml9KSksdCYmdFswXSYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZSh0WzBdLGUsbixyKSl9fV0pLHJ9KHYpO2Z1bmN0aW9uIHN0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdC5ucyYmKHQubnM9W3QubnNdKSwic3RyaW5nIj09dHlwZW9mIHQuZmFsbGJhY2tMbmcmJih0LmZhbGxiYWNrTG5nPVt0LmZhbGxiYWNrTG5nXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTlMmJih0LmZhbGxiYWNrTlM9W3QuZmFsbGJhY2tOU10pLHQuc3VwcG9ydGVkTG5ncyYmdC5zdXBwb3J0ZWRMbmdzLmluZGV4T2YoImNpbW9kZSIpPDAmJih0LnN1cHBvcnRlZExuZ3M9dC5zdXBwb3J0ZWRMbmdzLmNvbmNhdChbImNpbW9kZSJdKSksdH1mdW5jdGlvbiBhdCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gdXQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/YXQoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTphdChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBjdCh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Yyh0KTtpZihlKXt2YXIgaT1jKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB1KHRoaXMsbil9fWZ1bmN0aW9uIGx0KCl7fXZhciBodD1mdW5jdGlvbihuKXthKHMsbik7dmFyIHI9Y3Qocyk7ZnVuY3Rpb24gcygpe3ZhciB0LG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoZSh0aGlzLHMpLHQ9ci5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKHQpKSx0Lm9wdGlvbnM9c3QobiksdC5zZXJ2aWNlcz17fSx0LmxvZ2dlcj1tLHQubW9kdWxlcz17ZXh0ZXJuYWw6W119LGZ1bmN0aW9uKHQpe09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIHRbZV0mJih0W2VdPXRbZV0uYmluZCh0KSl9KSl9KG8odCkpLGkmJiF0LmlzSW5pdGlhbGl6ZWQmJiFuLmlzQ2xvbmUpe2lmKCF0Lm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gdC5pbml0KG4saSksdSh0LG8odCkpO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5pbml0KG4saSl9KSwwKX1yZXR1cm4gdH1yZXR1cm4gaShzLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDsiZnVuY3Rpb24iPT10eXBlb2YgbiYmKHI9bixuPXt9KSwhbi5kZWZhdWx0TlMmJiExIT09bi5kZWZhdWx0TlMmJm4ubnMmJigic3RyaW5nIj09dHlwZW9mIG4ubnM/bi5kZWZhdWx0TlM9bi5uczpuLm5zLmluZGV4T2YoInRyYW5zbGF0aW9uIik8MCYmKG4uZGVmYXVsdE5TPW4ubnNbMF0pKTt2YXIgaT17ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIG49e307aWYoIm9iamVjdCI9PT10KGVbMV0pJiYobj1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMV0mJihuLmRlZmF1bHRWYWx1ZT1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMl0mJihuLnREZXNjcmlwdGlvbj1lWzJdKSwib2JqZWN0Ij09PXQoZVsyXSl8fCJvYmplY3QiPT09dChlWzNdKSl7dmFyIHI9ZVszXXx8ZVsyXTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKChmdW5jdGlvbih0KXtuW3RdPXJbdF19KSl9cmV0dXJuIG59LGludGVycG9sYXRpb246e2VzY2FwZVZhbHVlOiEwLGZvcm1hdDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdH0scHJlZml4OiJ7eyIsc3VmZml4OiJ9fSIsZm9ybWF0U2VwYXJhdG9yOiIsIix1bmVzY2FwZVByZWZpeDoiLSIsbmVzdGluZ1ByZWZpeDoiJHQoIixuZXN0aW5nU3VmZml4OiIpIixuZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjoiLCIsbWF4UmVwbGFjZXM6MWUzLHNraXBPblZhcmlhYmxlczohMH19O2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQ/ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bmV3IHQ6dDpudWxsfWlmKHRoaXMub3B0aW9ucz11dCh1dCh1dCh7fSxpKSx0aGlzLm9wdGlvbnMpLHN0KG4pKSwidjEiIT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkmJih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbj11dCh1dCh7fSxpLmludGVycG9sYXRpb24pLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSksdm9pZCAwIT09bi5rZXlTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3I9bi5rZXlTZXBhcmF0b3IpLHZvaWQgMCE9PW4ubnNTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvcj1uLm5zU2VwYXJhdG9yKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3ZhciBzO3RoaXMubW9kdWxlcy5sb2dnZXI/bS5pbml0KG8odGhpcy5tb2R1bGVzLmxvZ2dlciksdGhpcy5vcHRpb25zKTptLmluaXQobnVsbCx0aGlzLm9wdGlvbnMpLHRoaXMubW9kdWxlcy5mb3JtYXR0ZXI/cz10aGlzLm1vZHVsZXMuZm9ybWF0dGVyOiJ1bmRlZmluZWQiIT10eXBlb2YgSW50bCYmKHM9ZXQpO3ZhciBhPW5ldyBWKHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgUCh0aGlzLm9wdGlvbnMucmVzb3VyY2VzLHRoaXMub3B0aW9ucyk7dmFyIHU9dGhpcy5zZXJ2aWNlczt1LmxvZ2dlcj1tLHUucmVzb3VyY2VTdG9yZT10aGlzLnN0b3JlLHUubGFuZ3VhZ2VVdGlscz1hLHUucGx1cmFsUmVzb2x2ZXI9bmV3IEgoYSx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxzJiYoIXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdHx8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0PT09aS5pbnRlcnBvbGF0aW9uLmZvcm1hdCkmJih1LmZvcm1hdHRlcj1vKHMpLHUuZm9ybWF0dGVyLmluaXQodSx0aGlzLm9wdGlvbnMpLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdD11LmZvcm1hdHRlci5mb3JtYXQuYmluZCh1LmZvcm1hdHRlcikpLHUuaW50ZXJwb2xhdG9yPW5ldyBKKHRoaXMub3B0aW9ucyksdS51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LHUuYmFja2VuZENvbm5lY3Rvcj1uZXcgb3Qobyh0aGlzLm1vZHVsZXMuYmFja2VuZCksdS5yZXNvdXJjZVN0b3JlLHUsdGhpcy5vcHRpb25zKSx1LmJhY2tlbmRDb25uZWN0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07ZS5lbWl0LmFwcGx5KGUsW3RdLmNvbmNhdChyKSl9KSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJih1Lmxhbmd1YWdlRGV0ZWN0b3I9byh0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksdS5sYW5ndWFnZURldGVjdG9yLmluaXQodSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYodS5pMThuRm9ybWF0PW8odGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLHUuaTE4bkZvcm1hdC5pbml0JiZ1LmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBVKHRoaXMuc2VydmljZXMsdGhpcy5vcHRpb25zKSx0aGlzLnRyYW5zbGF0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07ZS5lbWl0LmFwcGx5KGUsW3RdLmNvbmNhdChyKSl9KSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaW5pdCYmdC5pbml0KGUpfSkpfWlmKHRoaXMuZm9ybWF0PXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCxyfHwocj1sdCksdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nJiYhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyl7dmFyIGM9dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtjLmxlbmd0aD4wJiYiZGV2IiE9PWNbMF0mJih0aGlzLm9wdGlvbnMubG5nPWNbMF0pfSF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJiF0aGlzLm9wdGlvbnMubG5nJiZ0aGlzLmxvZ2dlci53YXJuKCJpbml0OiBubyBsYW5ndWFnZURldGVjdG9yIGlzIHVzZWQgYW5kIG5vIGxuZyBpcyBkZWZpbmVkIik7WyJnZXRSZXNvdXJjZSIsImhhc1Jlc291cmNlQnVuZGxlIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJnZXREYXRhQnlMYW5ndWFnZSJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbdF09ZnVuY3Rpb24oKXt2YXIgbjtyZXR1cm4obj1lLnN0b3JlKVt0XS5hcHBseShuLGFyZ3VtZW50cyl9fSkpO1siYWRkUmVzb3VyY2UiLCJhZGRSZXNvdXJjZXMiLCJhZGRSZXNvdXJjZUJ1bmRsZSIsInJlbW92ZVJlc291cmNlQnVuZGxlIl0uZm9yRWFjaCgoZnVuY3Rpb24odCl7ZVt0XT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPWUuc3RvcmUpW3RdLmFwcGx5KG4sYXJndW1lbnRzKSxlfX0pKTt2YXIgbD1fKCksaD1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQsbil7ZS5pc0luaXRpYWxpemVkJiYhZS5pbml0aWFsaXplZFN0b3JlT25jZSYmZS5sb2dnZXIud2FybigiaW5pdDogaTE4bmV4dCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiBZb3Ugc2hvdWxkIGNhbGwgaW5pdCBqdXN0IG9uY2UhIiksZS5pc0luaXRpYWxpemVkPSEwLGUub3B0aW9ucy5pc0Nsb25lfHxlLmxvZ2dlci5sb2coImluaXRpYWxpemVkIixlLm9wdGlvbnMpLGUuZW1pdCgiaW5pdGlhbGl6ZWQiLGUub3B0aW9ucyksbC5yZXNvbHZlKG4pLHIodCxuKX07aWYoZS5sYW5ndWFnZXMmJiJ2MSIhPT1lLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSYmIWUuaXNJbml0aWFsaXplZClyZXR1cm4gdChudWxsLGUudC5iaW5kKGUpKTtlLmNoYW5nZUxhbmd1YWdlKGUub3B0aW9ucy5sbmcsdCl9O3JldHVybiB0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHwhdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGU/aCgpOnNldFRpbWVvdXQoaCwwKSxsfX0se2tleToibG9hZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpsdCxyPSJzdHJpbmciPT10eXBlb2YgdD90OnRoaXMubGFuZ3VhZ2U7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQpLCF0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHx0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXMpe2lmKHImJiJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiBuKCk7dmFyIGk9W10sbz1mdW5jdGlvbih0KXt0JiZlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuaW5kZXhPZih0KTwwJiZpLnB1c2godCl9KSl9O2lmKHIpbyhyKTtlbHNlIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZykuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIG8odCl9KSk7dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBvKHQpfSkpLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5sb2FkKGksdGhpcy5vcHRpb25zLm5zLChmdW5jdGlvbih0KXshdCYmIWUucmVzb2x2ZWRMYW5ndWFnZSYmZS5sYW5ndWFnZSYmZS5zZXRSZXNvbHZlZExhbmd1YWdlKGUubGFuZ3VhZ2UpLG4odCl9KSl9ZWxzZSBuKG51bGwpfX0se2tleToicmVsb2FkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9XygpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1sdCksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLG4odCl9KSkscn19LHtrZXk6InVzZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYW4gdW5kZWZpbmVkIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtpZighdC50eXBlKXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO3JldHVybiJiYWNrZW5kIj09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5iYWNrZW5kPXQpLCgibG9nZ2VyIj09PXQudHlwZXx8dC5sb2cmJnQud2FybiYmdC5lcnJvcikmJih0aGlzLm1vZHVsZXMubG9nZ2VyPXQpLCJsYW5ndWFnZURldGVjdG9yIj09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yPXQpLCJpMThuRm9ybWF0Ij09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0PXQpLCJwb3N0UHJvY2Vzc29yIj09PXQudHlwZSYmUi5hZGRQb3N0UHJvY2Vzc29yKHQpLCJmb3JtYXR0ZXIiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmZvcm1hdHRlcj10KSwiM3JkUGFydHkiPT09dC50eXBlJiZ0aGlzLm1vZHVsZXMuZXh0ZXJuYWwucHVzaCh0KSx0aGlzfX0se2tleToic2V0UmVzb2x2ZWRMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodCYmdGhpcy5sYW5ndWFnZXMmJiEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKHQpPi0xKSlmb3IodmFyIGU9MDtlPHRoaXMubGFuZ3VhZ2VzLmxlbmd0aDtlKyspe3ZhciBuPXRoaXMubGFuZ3VhZ2VzW2VdO2lmKCEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKG4pPi0xKSYmdGhpcy5zdG9yZS5oYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMobikpe3RoaXMucmVzb2x2ZWRMYW5ndWFnZT1uO2JyZWFrfX19fSx7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG89dDt2YXIgcj1fKCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgaT1mdW5jdGlvbih0KXtuLmxhbmd1YWdlPXQsbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSxuLnJlc29sdmVkTGFuZ3VhZ2U9dm9pZCAwLG4uc2V0UmVzb2x2ZWRMYW5ndWFnZSh0KX0sbz1mdW5jdGlvbihvKXshdCYmIW8mJm4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmKG89W10pO3ZhciBzPSJzdHJpbmciPT10eXBlb2Ygbz9vOm4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRCZXN0TWF0Y2hGcm9tQ29kZXMobyk7cyYmKG4ubGFuZ3VhZ2V8fGkocyksbi50cmFuc2xhdG9yLmxhbmd1YWdlfHxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uocyksbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiZuLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuY2FjaGVVc2VyTGFuZ3VhZ2UocykpLG4ubG9hZFJlc291cmNlcyhzLChmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhpKG8pLG4udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShvKSxuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxuLmVtaXQoImxhbmd1YWdlQ2hhbmdlZCIsbyksbi5sb2dnZXIubG9nKCJsYW5ndWFnZUNoYW5nZWQiLG8pKTpuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxyLnJlc29sdmUoKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSksZSYmZSh0LChmdW5jdGlvbigpe3JldHVybiBuLnQuYXBwbHkobixhcmd1bWVudHMpfSkpfSh0LHMpfSkpfTtyZXR1cm4gdHx8IXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jPyF0JiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz90aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KG8pOm8odCk6byh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KCkpLHJ9fSx7a2V5OiJnZXRGaXhlZFQiLHZhbHVlOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT10aGlzLG89ZnVuY3Rpb24gZShuLG8pe3ZhciBzO2lmKCJvYmplY3QiIT09dChvKSl7Zm9yKHZhciBhPWFyZ3VtZW50cy5sZW5ndGgsdT1uZXcgQXJyYXkoYT4yP2EtMjowKSxjPTI7YzxhO2MrKyl1W2MtMl09YXJndW1lbnRzW2NdO3M9aS5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKFtuLG9dLmNvbmNhdCh1KSl9ZWxzZSBzPXV0KHt9LG8pO3MubG5nPXMubG5nfHxlLmxuZyxzLmxuZ3M9cy5sbmdzfHxlLmxuZ3Mscy5ucz1zLm5zfHxlLm5zLHMua2V5UHJlZml4PXMua2V5UHJlZml4fHxyfHxlLmtleVByZWZpeDt2YXIgbD1pLm9wdGlvbnMua2V5U2VwYXJhdG9yfHwiLiIsaD1zLmtleVByZWZpeD8iIi5jb25jYXQocy5rZXlQcmVmaXgpLmNvbmNhdChsKS5jb25jYXQobik6bjtyZXR1cm4gaS50KGgscyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9vLmxuZz1lOm8ubG5ncz1lLG8ubnM9bixvLmtleVByZWZpeD1yLG99fSx7a2V5OiJ0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLnRyYW5zbGF0b3ImJih0PXRoaXMudHJhbnNsYXRvcikudHJhbnNsYXRlLmFwcGx5KHQsYXJndW1lbnRzKX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLmV4aXN0cy5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJzZXREZWZhdWx0TmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMuZGVmYXVsdE5TPXR9fSx7a2V5OiJoYXNMb2FkZWROYW1lc3BhY2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuZXh0IHdhcyBub3QgaW5pdGlhbGl6ZWQiLHRoaXMubGFuZ3VhZ2VzKSwhMTtpZighdGhpcy5sYW5ndWFnZXN8fCF0aGlzLmxhbmd1YWdlcy5sZW5ndGgpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bi5sYW5ndWFnZXMgd2VyZSB1bmRlZmluZWQgb3IgZW1wdHkiLHRoaXMubGFuZ3VhZ2VzKSwhMTt2YXIgcj10aGlzLnJlc29sdmVkTGFuZ3VhZ2V8fHRoaXMubGFuZ3VhZ2VzWzBdLGk9ISF0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxvPXRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aC0xXTtpZigiY2ltb2RlIj09PXIudG9Mb3dlckNhc2UoKSlyZXR1cm4hMDt2YXIgcz1mdW5jdGlvbih0LG4pe3ZhciByPWUuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVsiIi5jb25jYXQodCwifCIpLmNvbmNhdChuKV07cmV0dXJuLTE9PT1yfHwyPT09cn07aWYobi5wcmVjaGVjayl7dmFyIGE9bi5wcmVjaGVjayh0aGlzLHMpO2lmKHZvaWQgMCE9PWEpcmV0dXJuIGF9cmV0dXJuISEodGhpcy5oYXNSZXNvdXJjZUJ1bmRsZShyLHQpfHwhdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmJhY2tlbmR8fHRoaXMub3B0aW9ucy5yZXNvdXJjZXMmJiF0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXN8fHMocix0KSYmKCFpfHxzKG8sdCkpKX19LHtrZXk6ImxvYWROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1fKCk7cmV0dXJuIHRoaXMub3B0aW9ucy5ucz8oInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmbi5vcHRpb25zLm5zLnB1c2godCl9KSksdGhpcy5sb2FkUmVzb3VyY2VzKChmdW5jdGlvbih0KXtyLnJlc29sdmUoKSxlJiZlKHQpfSkpLHIpOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToibG9hZExhbmd1YWdlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj1fKCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pO3ZhciByPXRoaXMub3B0aW9ucy5wcmVsb2FkfHxbXSxpPXQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gci5pbmRleE9mKHQpPDB9KSk7cmV0dXJuIGkubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChpKSx0aGlzLmxvYWRSZXNvdXJjZXMoKGZ1bmN0aW9uKHQpe24ucmVzb2x2ZSgpLGUmJmUodCl9KSksbik6KGUmJmUoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJkaXIiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHR8fCh0PXRoaXMucmVzb2x2ZWRMYW5ndWFnZXx8KHRoaXMubGFuZ3VhZ2VzJiZ0aGlzLmxhbmd1YWdlcy5sZW5ndGg+MD90aGlzLmxhbmd1YWdlc1swXTp0aGlzLmxhbmd1YWdlKSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSIsImNrYiJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT4tMXx8dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi1hcmFiIik+MT8icnRsIjoibHRyIn19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpsdCxyPXV0KHV0KHV0KHt9LHRoaXMub3B0aW9ucyksZSkse2lzQ2xvbmU6ITB9KSxpPW5ldyBzKHIpOyh2b2lkIDAhPT1lLmRlYnVnfHx2b2lkIDAhPT1lLnByZWZpeCkmJihpLmxvZ2dlcj1pLmxvZ2dlci5jbG9uZShlKSk7cmV0dXJuWyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXS5mb3JFYWNoKChmdW5jdGlvbihlKXtpW2VdPXRbZV19KSksaS5zZXJ2aWNlcz11dCh7fSx0aGlzLnNlcnZpY2VzKSxpLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saS50cmFuc2xhdG9yPW5ldyBVKGkuc2VydmljZXMsaS5vcHRpb25zKSxpLnRyYW5zbGF0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07aS5lbWl0LmFwcGx5KGksW3RdLmNvbmNhdChuKSl9KSksaS5pbml0KHIsbiksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57b3B0aW9uczp0aGlzLm9wdGlvbnMsc3RvcmU6dGhpcy5zdG9yZSxsYW5ndWFnZTp0aGlzLmxhbmd1YWdlLGxhbmd1YWdlczp0aGlzLmxhbmd1YWdlcyxyZXNvbHZlZExhbmd1YWdlOnRoaXMucmVzb2x2ZWRMYW5ndWFnZX19fV0pLHN9KHYpO2woaHQsImNyZWF0ZUluc3RhbmNlIiwoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGh0KGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSk7dmFyIGZ0PWh0LmNyZWF0ZUluc3RhbmNlKCk7ZnQuY3JlYXRlSW5zdGFuY2U9aHQuY3JlYXRlSW5zdGFuY2UsZnQuY3JlYXRlSW5zdGFuY2UsZnQuaW5pdCxmdC5sb2FkUmVzb3VyY2VzLGZ0LnJlbG9hZFJlc291cmNlcyxmdC51c2UsZnQuY2hhbmdlTGFuZ3VhZ2UsZnQuZ2V0Rml4ZWRULGZ0LnQsZnQuZXhpc3RzLGZ0LnNldERlZmF1bHROYW1lc3BhY2UsZnQuaGFzTG9hZGVkTmFtZXNwYWNlLGZ0LmxvYWROYW1lc3BhY2VzLGZ0LmxvYWRMYW5ndWFnZXM7dmFyIHB0PXtDb25maXJtVG86IkNvbmZpcm0gVG8gIixUZXh0SW5wdXQ6IlRleHQgSW5wdXQiLEF0dHJpYnV0ZToiQXR0cmlidXRlIixOb0F0dHJpYnV0ZToiTm8gQXR0cmlidXRlIixTYXZlOiJTYXZlIixVbmRvOiJVbmRvIixSZWRvOiJSZWRvIixSb3RhdGU6IlJvdGF0ZSIsU3R5bGU6IlN0eWxlIixBZGp1c3Q6IkFkanVzdCIsQm9yZGVyVGhpY2tuZXNzOiJCb3JkZXIgVGhpY2tuZXNzIixDb2xvcjoiQ29sb3IiLEJvcmRlck9wYWNpdHk6IkJvcmRlciBPcGFjaXR5IixGaWxsT3BhY2l0eToiRmlsbCBPcGFjaXR5IixTYXR1cmF0aW9uOiJTYXR1cmF0aW9uIixDb250cmFzdDoiQ29udHJhc3QiLEV4cG9zdXJlOiJFeHBvc3VyZSIsU2NyZWVuUmF0aW86IlNjcmVlbiBSYXRpbyIsT3JpZ2luYWxTY2FsZToiT3JpZ2luYWwgU2NhbGUiLENvcHlUaGVQcmV2aW91czoiQ29weSBQcmV2IixDbGVhckxhYmVsOiJDbGVhciIsU2V0QXNJbnZhbGlkOiJTZXQgQXMgSW52YWxpZCIsU2V0QXNWYWxpZDoiU2V0IEFzIFZhbGlkIixDb25maXJtOiJDb25maXJtIixGaW5pc2g6IkZpbmlzaCIsQ2FuY2VsOiJDYW5jZWwiLEl0ZW1zT2ZUaGlzUGFnZToiSXRlbXMgT2YgVGhpcyBQYWdlIixIb3RrZXlzOiJIb3RrZXlzIixBbm5vdGF0ZVJlY3Q6IkFubm90YXRlIFJlY3QiLEFubm90YXRlSW52YWxpZFJlY3Q6IkFubm90YXRlIEludmFsaWQgUmVjdCIsU2VsZWN0UmVjdDoiU2VsZWN0IFJlY3QiLFJpZ2h0Q2xpY2s6IlJpZ2h0LWNsaWNrIixUb2dnbGVSZWN0RWZmZWN0aXZlbmVzczoiVG9nZ2xlIFJlY3QgVmFsaWRpdHkiLFRvZ2dsZUVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBWYWxpZGl0eSIsRGVsZXRlUmVjdDoiRGVsZXRlIFJlY3QiLFNlbGVjdEFuZERvdWJsZUNsaWNrOiJTZWxlY3QgQW5kIERvdWJsZSBDbGljayIsU2NhbGU6IlNjYWxlIixGdWxsc2NyZWVuOiJGdWxsc2NyZWVuIixQcmV2aW91c0ltYWdlOiJQcmV2aW91cyIsUHJldmlvdXNGaWxlOiJQcmV2aW91cyIsTmV4dEltYWdlOiJOZXh0IixOZXh0RmlsZToiTmV4dCIsUHJldmlvdXNGb2xkZXI6IlByZXZpb3VzIEZvbGRlciIsTmV4dEZvbGRlcjoiTmV4dCBGb2xkZXIiLERyYWc6IkRyYWciLFRvZ2dsZVNlbGVjdGVkOiJUb2dnbGUgU2VsZWN0ZWQiLFRvZ2dsZVNlbGVjdGVkUmV2ZXJzZToiVG9nZ2xlIFNlbGVjdGVkIFJldmVyc2UiLEhpZGVHcmFwaGljczoiSGlkZSBHcmFwaGljcyIsVG9nZ2xlTGluZVBhcnRpY3VsYXJpdHk6IlRvZ2dsZSBMaW5lIFBhcnRpY3VsYXJpdHkiLFRvU2lkZToiVG8gTGluZSIsU3BlY2lmaWVkQXR0cmlidXRlc09ubHk6IlNwZWNpZmllZCBBdHRyaWJ1dGVzIE9ubHkiLE51bWJlcjoiTnVtYmVyIixQcmVzczoiUHJlc3MiLFRvT3JpZ2luYWxTdGVwOiJUbyBPcmlnaW5hbCIsSG9yaXpvbnRhbE9yVmVydGljYWw6Ikhvcml6b250YWwvVmVydGljYWwiLEFubm90YXRlSW52YWxpZExpbmU6IkFubm90YXRlIEludmFsaWQgTGluZSIsQW5ub3RhdGVMaW5lOiJBbm5vdGF0ZSBMaW5lIixTZWxlY3RMaW5lOiJTZWxlY3QgTGluZSIsVG9nZ2xlTGluZUVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBMaW5lIFZhbGlkaXR5IixEZWxldGVMaW5lOiJEZWxldGUgTGluZSIsQ29udGludWVUb0xhYmVsOiJDb250aW51ZSBUbyBMYWJlbCIsU2VsZWN0OiJTZWxlY3QiLEluc2VydFBvaW50OiJJbnNlcnQgUG9pbnQiLENsaWNrT25MaW5lOiJDbGljayBPbiBMaW5lIixEZWxldGVQb2ludDoiRGVsZXRlIFBvaW50IixEYmxDbGlja09uUG9pbnQ6IkRvdWJsZSBDbGljayBPbiBQb2ludCIsU3RvcEFkc29ycHRpb246IlN0b3AgQWRzb3JwdGlvbiIsUHJldmlvdXNMaW5lOiJQcmV2aW91cyBMaW5lIixOZXh0TGluZToiTmV4dCBMaW5lIixTZWxlY3RQb2ludDoiU2VsZWN0IFBvaW50IixBbm5vdGF0ZUludmFsaWRQb2ludDoiQW5ub3RhdGUgSW52YWxpZCBQb2ludCIsQW5ub3RhdGVQb2ludDoiQW5ub3RhdGUgUG9pbnQiLEFubm90YXRlUG9seWdvbjoiQW5ub3RhdGUgUG9seWdvbiIsU2VsZWN0UG9seWdvbjoiU2VsZWN0IFBvbHlnb24iLEFubm90YXRlSW52YWxpZFBvbHlnb246IkFubm90YXRlIEludmFsaWQgUG9seWdvbiIsVG9nZ2xlUG9seWdvbkVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBQb2x5Z29uIFZhbGlkaXR5IixEZWxldGVQb2x5Z29uOiJEZWxldGUgUG9seWdvbiIsRGVsZXRlOiJEZWxldGUiLFRvZ2dsZVBvaW50UGFydGljdWxhcml0eToiVG9nZ2xlIFBvaW50IFBhcnRpY3VsYXJpdHkiLENyb3BPdmVybGFwQXJlYToiQ3JvcCBPdmVybGFwIEFyZWEiLFNlZ21lbnRhdGlvblJlY29nbml0aW9uOiJTZWdtZW50YXRpb24gUmVjb2duaXRpb24iLFN3aXRjaFBhdHRlcm46IlN3aXRjaCBQYXR0ZXJuIixUYWdnaW5nOiJUYWdnaW5nIixIaWRlOiJIaWRlICIsVGFnZ2luZ09yQXR0cjoiVGFnL2F0dHJpYnV0ZSIsSGlkZURyYXduQW5ub3RhdGlvbjoiSGlkZGVuIERyYXduIEFubm90YXRpb24iLEJsdWU6IkJsdWUiLEN5YW46IkN5YW4iLEdyZWVuOiJHcmVlbiIsWWVsbG93OiJZZWxsb3ciLFBpbms6IlBpbmsiLFN0ZXBzOiJTdGVwcyIsRXhwb3J0OiJFeHBvcnQiLE5leHRTdGVwOiJOZXh0IFN0ZXAiLFN0ZXBOb3RGaW5pc2hlZE5vdGlmeToiVGhlcmUgYXJlIHVuYW5ub3RhdGVkIGZpbGVzIGluIHRoZSBjdXJyZW50IHN0ZXAgLCBwbGVhc2UgZmluaXNoIGJlZm9yZSB0aGUgbmV4dCBzdGVwIixjdXJJdGVtczoie3tjdXJyZW50fX0ve3t0b3RhbH19IEl0ZW1zIixUdXJuUGFnZToiVHVybiBQYWdlIixTd2l0Y2g6IlN3aXRjaCIsRW1wdHlUZXh0SW5wdXQ6IkVtcHR5IFRleHQgSW5wdXQiLFJlZ3VsYXJFeHBJbmNvcnJlY3RseToiUmVndWxhciBleHByZXNzaW9uIGlzIGluY29ycmVjdGx5IixOb0NvbmZpZ3VyYXRpb246Ik1pc3NpbmcgQ29uZmlndXJhdGlvbiIsQ2xlYXJUaGlzT3B0aW9uOiJDbGVhciBUaGlzIE9wdGlvbiIsUmVzdG9yZUltYWdlQXR0cmlidXRlczoiUmVzdG9yZSBJbWFnZSBBdHRyaWJ1dGVzIixyZWN0VG9vbDoiUmVjdFRvb2wiLHRhZ1Rvb2w6IlRhZ1Rvb2wiLHBvbHlnb25Ub29sOiJQb2x5Z29uVG9vbCIsbGluZVRvb2w6IkxpbmVUb29sIixwb2ludFRvb2w6IlBvaW50VG9vbCIsdGV4dFRvb2w6IlRleHRUb29sIixTcGVlZDoiU3BlZWQiLFBsYXlQYXVzZToiUGxheSAvIFBhdXNlIixGYXN0Rm9yd2FyZDoiRmFzdCBGb3J3YXJkIixSZXdpbmQ6IlJld2luZCIsdmlkZW9JbnZhbGlkQW5kU2tpcDoiVmlkZW8gaW52YWxpZCwgcGxlYXNlIHNraXAiLGltYWdlSW52YWxpZEFuZFNraXA6IkltYWdlIGludmFsaWQsIHBsZWFzZSBza2lwIix2aWRlb0Vycm9yQW5kUmVsb2FkOiJGYWlsZWQgdG8gbG9hZCB2aWRlbywgcGxlYXNlIHJlbG9hZCIsaW1hZ2VFcnJvckFuZFJlbG9hZDoiRmFpbGVkIHRvIGxvYWQgaW1hZ2UsIHBsZWFzZSByZWxvYWQiLG9yTWFza0FzSW52YWxpZDoiIG9yIG1hc2sgaXQgYXMgaW52YWxpZCIsQ2xpY2tBbm90aGVyUG9seWdvbjoiQ2xpY2sgYW5vdGhlciBwb2x5Z29uIixQb2x5Z29uc1RvQmVDb21iaW5lZE5lZWRUb0JlU2VsZWN0ZWQ6IlBvbHlnb25zIHRvIGJlIGNvbWJpbmVkIG5lZWQgdG8gYmUgc2VsZWN0ZWQiLEN1cnZlTW9kZURvZXNOb3RTdXBwb3J0Q3V0dGluZzoiQ3VydmUgbW9kZSBkb2VzIG5vdCBzdXBwb3J0IGN1dHRpbmciLENvbWJpbmVTdWNjZXNzOiJDb21iaW5lIHN1Y2Nlc3MiLENvbWJpbmluZ0ZhaWxlZE5vdGlmeToiQ29tYmluaW5nIGZhaWxlZC4gUGxlYXNlIGNoZWNrIHdoZXRoZXIgdHdvIHBvbHlnb25zIGludGVyc2VjdCBvciB3aGV0aGVyIHBvbHlnb24gY29tYmluaW5nIGZvcm1zIGEgbGVhayIsQ29tYmluZU92ZXJsYXBBcmVhOiJDb21iaW5lIE92ZXJsYXAgQXJlYSIsTm9EZXBlbmRlbmN5OiJUaGlzIGltYWdlIGRvZXMgbm90IG5lZWQgdG8gYmUgbGFiZWxlZCIsVGV4dENoZWNrTnVtYmVyT25seToiUGxlYXNlIGVudGVyIHRoZSBudW1iZXIiLFRleHRDaGVja0VuZ2xpc2hPbmx5OiJQbGVhc2UgZW50ZXIgRW5nbGlzaCIsVGV4dENoZWNrQ3VzdG9tRm9ybWF0OiJQbGVhc2UgZW50ZXIgZGF0YSBpbiBjdXN0b20gZm9ybWF0IixGcmFtaW5nT2ZPYmplY3RUb0JlRGl2aWRlZDoiUGxlYXNlIGZyYW1lIHRoZSBvYmplY3QgdG8gYmUgZGl2aWRlZCBmaXJzdCIsQ2xpY2tPblRhcmdldDoiUGxlYXNlIGNsaWNrIG9uIHRhcmdldCBvYmplY3QiLFNwbGl0dGluZ0FsZ29yaXRobVByZWRpY3Rpb246IlNwbGl0dGluZyBhbGdvcml0aG0gcHJlZGljdGlvbiBpbiBwcm9ncmVzcy4uLiIsIjJEVmlldyI6IjJEVmlldyIsIjNEVmlldyI6IjNEVmlldyIsVG9wVmlldzoiVG9wVmlldyIsU2lkZVZpZXc6IlNpZGVWaWV3IixCYWNrVmlldzoiQmFja1ZpZXciLFNob3dBcnJvd3M6IlNob3cgQXJyb3dzIixMZW5ndGg6Ikxlbmd0aCIsV2lkdGg6IldpZHRoIixIZWlnaHQ6IkhlaWdodCIsUm90YXRpb25feToiUm90YXRpb25feSIsUG9pbnRDb3VudDoiUG9pbnQgQ291bnQiLEludmFsaWQ6IkludmFsaWQiLFRhZzoiVGFnIixTZWFyY2hUYWc6IlNlYXJjaCB0YWdzIixTdWJBdHRyaWJ1dGU6IlN1YkF0dHJpYnV0ZSIsUGxlYXNlU2VsZWN0OiJQbGVhc2UgU2VsZWN0IixDb3B5RW1wdHlJblBvaW50Q2xvdWQ6IlRoZSBjb3B5IGNvbnRlbnQgaXMgZW1wdHksIHBsZWFzZSBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgY2xvdWQgZGF0YSIsUGFzdGVFbXB0eUluUG9pbnRDbG91ZDoiUGxlYXNlIGNvcHkgdGhlIHBvaW50Q2xvdWQgZGF0YSBiZWZvcmUgcGFzdGluZyIsSGFzRHVwbGljYXRlSUQ6IkR1cGxpY2F0ZSBJRCBleGlzdHMsIGNvcHkgZmFpbGVkIixIYXNEdXBsaWNhdGVJREhlYWRlcjoiVHJhY2tJRCBkdXBsaWNhdGlvbiBleGlzdHMiLEhhc0R1cGxpY2F0ZUlETXNnOiJUaGVyZSBpcyBhbiBpc3N1ZSB3aXRoIGR1cGxpY2F0ZSB0cmFja0lEcywgb3ZlcnJpZGUgaXQ/IixDb3B5U3VjY2VzczoiQ29weSBTdWNjZXNzISIsTG93ZXJMaW1pdFBvaW50c051bUluQm94OiJUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgYm94IG11c3Qgbm90IGJlIGxlc3MgdGhhbiB7e251bX19IixQb2ludFRoaWNrbmVzczoiUG9pbnQgVGhpY2tuZXNzIixSb3RhdGVBcm91bmRDZW50ZXJQb2ludDoiUm90YXRlIEFyb3VuZCBDZW50ZXIgUG9pbnQiLFBvaW50Q2xvdWRWaWV3VHJhbnNsYXRlOiJQb2ludENsb3VkVmlldyBUcmFuc2xhdGlvbiIsVG9wVmlld1RyYW5zbGF0ZToiVG9wVmlldyBUcmFuc2xhdGlvbiIsQ2hhbmdlUG9pbnRDbG91ZFZhbGlkOiJDaGFuZ2UgUG9pbnRDbG91ZCBWYWxpZCIsTGFzc29TZWxlY3RvcjoiTGFzc28iLFJlY3RTZWxlY3RvcjoiUmVjdCIsU2VsZWN0b3JNc2c6IlJpZ2h0LWNsaWNrIGRyYWcgdG8gc2VsZWN0IixBZGRQb2ludDoiQWRkIFBvaW50IixDaXJjbGVTZWxlY3RvcjoiUG9pbnQiLERldGVjdGlvbk1vZGU6IkRldGVjdGlvbk1vZGUiLFNlZ21lbnRhdGlvbk1vZGU6IlNlZ21lbnRhdGlvbk1vZGUiLEVudGVyRWRpdE1vZGU6IkVudGVyIGVkaXQgbW9kZSIsU2VsZWN0ZWRQb2ludHM6IlNlbGVjdGVkIFBvaW50cyIsQ29weUJveDoiQ29weSBCb3giLFBhc3RlQm94OiJQYXN0ZSBCb3giLFJvdGF0ZUxlZnQ6IlJvdGF0ZSBMZWZ0IixSb3RhdGVSaWdodDoiUm90YXRlIFJpZ2h0IixOZXh0Qm94OiJOZXh0IEJveCIsUHJldmlvdXNCb3g6IlByZXZpb3VzIEJveCIsUm90YXRlOTA6IlJvdGF0ZSA5MMKwIixDb3B5UHJldlBhZ2U6IkNvcHkgUHJldmlvdXMgUGFnZSIsQ2hhbmdlQm94VmFsaWQ6IkNoYW5nZSBCb3gncyBWYWxpZCIsTXVsdGlTZWxlY3Q6Ik11bHRpIFNlbGVjdCIsU2VsZWN0QWxsQm94OiJTZWxlY3QgQWxsIEJveGVzIixHZW5lcmFsT3BlcmF0aW9uOiJHZW5lcmFsIE9wZXJhdGlvbiIsUmVjdFBhdHRlcm46IlJlY3QgUGF0dGVybiIsUG9seWdvblBhdHRlcm46IlBvbHlnb24gUGF0dGVybiIsQ2hhbmdlUGF0dGVybk1zZzoiQ2hhbmdlIFBhdHRlcm4gdG8ge3twYXR0ZXJufX0gc3VjY2Vzc2Z1bGx5IixEcmFnT3BlcmF0aW9uOiJEcmFnIixTZWxlY3RlZFN0YXR1czoiU2VsZWN0ZWQiLHVwZGF0ZVZhbGlkRnJvbVZhbGlkVG9JblZhbGlkOiJDb25maXJtIHVwZGF0ZSBhcyBpbnZhbGlkIHBhZ2XvvJ8iLHVwZGF0ZVZhbGlkRnJvbUluVmFsaWRUb1ZhbGlkOiJDb25maXJtIHVwZGF0ZSBhcyB2YWxpZCBwYWdl77yfIixBbGxUcmFja0lEczoiQWxsIFRyYWNrSURzIixDdXJyZW50Qm94VHJhY2tJRHM6IkN1cnJlbnQgVHJhY2tJRCIsUG9zaXRpdmVJbnRlZ2VyQ2hlY2s6IlBsZWFzZSBlbnRlciBhIHBvc2l0aXZlIGludGVnZXIiLE5vdEFsbG93RGVjaW1hbFBvaW50c0luVHJhY2tJRDoiVHJhY2tJRCBpcyBub3QgYWxsb3dlZCB0byBiZSBkZWNpbWFsIixEdXBsaWNhdGVUcmFja0lEc0V4aXN0OiJEdXBsaWNhdGUgdHJhY2tJRHMgZXhpdHMiLEJhdGNoVXBkYXRlVGV4dDoiQmF0Y2ggVXBkYXRlIixCYXRjaFVwZGF0ZVRyYWNrSUQ6IkJhdGNoIHVwZGF0ZSB0cmFja0lEcyIsVHJhY2tJRFVuaWZ5QXM6IlRyYWNrSUQgaXMgVW5pZnkgYXMiLFVuaWZ5VHJhY2tJRFJhbmdlOiJVbmlmeSBUcmFja0lEIFJhbmdlIixQYWdlOiJQYWdlIixPa1RleHQ6Ik9LIixDYW5jZWxUZXh0OiJDYW5jZWwiLFVuaWZ5UGFyYW1zOiJVbmlmeSBQYXJhbXMiLFVuaWZ5QXR0cmlidXRlUmFuZ2U6IlVuaWZ5IFJhbmdlIixVbmlmeVBhcmFtc1RpcHM6IlRoZSBzaXplIG9mIDJEIGZyYW1lcyBpbiBub24gY3VycmVudCBwYWdlIGltYWdlcyB3aWxsIG5vdCBiZSBzdGFuZGFyZGl6ZWQgdGVtcG9yYXJpbHkiLFVuaWZ5VHJhY2tJRDoiVW5pZnkgVHJhY2tJRCIsVW5pZnlTaXplOiJVbmlmeSBTaXplIixVbmlmeVRhZzoiVW5pZnkgVGFnIixOb0RhdGE6Ik5vIERhdGEiLEFubm90YXRlZExpc3Q6IkFubm90YXRlZCBMaXN0IixvbkRlbGV0ZUdyYXBoQnlBdHRyOiJBcmUgeW91IHN1cmUgdG8gZGVsZXRlIHRoZSBkYXRhIHdpdGggYXR0cmlidXRlIHt7YXR0cmlidXRlfX0/IixDYW5jZWxGaXhlZDoiQ2FuY2VsIEZpeGVkIixGaXhlZE9uTGVmdDoiRml4ZWQgT24gTGVmdCIsRml4ZWRPblJpZ2h0OiJGaXhlZCBPbiBSaWdodCIsQW5ub3RhdGVkUmVzdWx0OiJBbm5vdGF0ZWQgUmVzdWx0IixDb21wbGVtZW50YXJ5VHJhY2tpbmc6IkNvbXBsZW1lbnRhcnkgdHJhY2tpbmciLENvbXBsZW1lbnRhcnlUcmFja2luZ1ByZWRpY3Rpb246IkNvbXBsZW1lbnRhcnkgdHJhY2tpbmcgcHJlZGljdGlvbiIsQXBwbHk6IkFwcGx5IixCZWZvcmVQcmVkaWN0U3RhcnRpbmc6IkJlZm9yZSBzdGFydGluZywgcGxlYXNlIG1hcmsgdGhlIGZpcnN0IGFuZCBsYXN0IGJveCwgbmVlZCB0aGUgc2FtZSB0cmFja0lEIixUaGVQcmVkaWN0ZWRQb2ludENsb3VkOiJUaGUgcHJlZGljdGVkIHBvaW50IGNsb3VkIG5vdyBuZWVkcyB0byBiZSBsZXNzIHRoYW4gMTAgZnJhbWVzIixDYW1lcmFGb2xsb3dUb3BWaWV3OiJQb3NpdGlvbmVkIGJ5IHRvcCB2aWV3IixNYXJrT25seU9uZToiTWFyayBvbmx5IG9uZSBmcmFtZSBvZiBkYXRhLCBuZWVkIHRvIG1hcmsgdGhlIGZpcnN0IGFuZCBsYXN0IGZyYW1lIG9mIGRhdGEiLEhhdmVOb05lZWQ6IkhhdmUgbm8gbmVlZCB0byBwcmVkaWN0IHRoZSBkYXRhIGJldHdlZW4gdHdvIGZyYW1lcywgcGxlYXNlIG1hcmsgdGhlIGZpcnN0IGFuZCBsYXN0IGZyYW1lIGZpcnN0LCBhbmQgbmVlZCB0aGUgc2FtZSBzZXJpYWwgbnVtYmVyIixQcmVkaWN0aW5nRGF0YUZyb206IlByZWRpY3RpbmcgZGF0YSBmcm9tIHBhZ2Uge3tzdGFydFBhZ2V9fSB0byBwYWdlIHt7ZW5kUGFnZX19IHdpdGggYm94IElEIHt7c2VsZWN0ZWRCb3hUcmFja0lEfX0iLFBvaW50Q2xvdWRDb3Zlck1vZGU6IldoZW4gdGhlIHNhbWUgcG9pbnQgY2xvdWQgaXMgc2VsZWN0ZWQsIHRoZSBsYXRlciBtYXJrZXIgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgb25lIixQb2ludENsb3VkVW5jb3Zlck1vZGU6IldoZW4gdGhlIHNhbWUgcG9pbnQgY2xvdWQgaXMgc2VsZWN0ZWQsIHRoZSBsYXR0ZXIgbWFya2VyIGNhbm5vdCBvdmVyd3JpdGUgdGhlIGZvcm1lciBtYXJrZXIiLFBvaW50Q2xvdWRGb2N1c01vZGU6IkZvY3VzIG1vZGUgaGFzIGJlZW4gdHVybmVkIG9uIixQb2ludENsb3VkVW5mb2N1c01vZGU6IkZvY3VzIG1vZGUgaXMgdHVybmVkIG9mZiIsUG9pbnRDbG91ZEhpZGVTZWdtZW50OiJNYXJrZWQgcG9pbnQgY2xvdWQgaXMgaGlkZGVuIixQb2ludENsb3VkU2hvd1NlZ21lbnQ6IkFsbCBwb2ludCBjbG91ZHMgaGF2ZSBiZWVuIGRpc3BsYXllZCIsUG9pbnRDbG91ZEhpZGVTZWdtZW50SW52YWxpZDoiVW5hdmFpbGFibGUgaW4gZm9jdXMgbW9kZSIsUG9pbnRDbG91ZEhpZGVGb2N1c0ludmFsaWRfaGlkZToiRm9jdXMgbW9kZSBpcyBub3QgYXZhaWxhYmxlLCBwbGVhc2Ugc2hvdyB0aGUgbWFya2VkIHBvaW50IGZpcnN0IixQb2ludENsb3VkSGlkZUZvY3VzSW52YWxpZF9ub25lOiJGb2N1cyBtb2RlIGlzIG5vdCBhdmFpbGFibGUsIHBsZWFzZSBzZWxlY3QgdGhlIG1hcmtlciB0byBiZSBmb2N1c2VkIGZpcnN0IixQYWxldHRlOiJQYWxldHRlIixFZmZpY2llbnRMaXN0ZW5pbmc6IlRoZSB0YXNrIGlzIG1hcmtlZCBpbiB0aGUgZWZmaWNpZW5jeSBtb25pdG9yaW5nLi4uIixUaXRsZToiVGl0bGUiLEFuc3dlcjoiQW5zd2VyIixGaW5pc2hlZDoiRmluaXNoZWQiLFVuZmluaXNoZWQ6IlVuZmluaXNoZWQiLE92ZXJhbGxTY29yZToiT3ZlcmFsbFNjb3JlIixOb1Njb3JpbmdTY2FsZToiQ29uZmlndXJhYmxlIHN0ZXAgZGV0YWlscyBvbiB0aGUgbGVmdCIsQmVzdDoiQmVzdCIsV29yc3Q6IldvcnN0IixSYW5raW5nUXVhbGl0eU9mQW5zd2VyczoiUmFua2luZ1F1YWxpdHlPZkFuc3dlcnMiLFRvQmVTb3J0ZWQ6IlRvQmVTb3J0ZWQiLFllczoiWWVzIixObzoiTm8iLEFkZGl0aW9uYWxDb250ZW50OiJBZGRpdGlvbmFsQ29udGVudCIsU3VibWl0OiJTdWJtaXQiLERyYWdBbmREcm9wOiJEcmFnIGFuZCBkcmFwIixEZWZhdWx0U2l6ZToiQ2xpY2sgdG8gdXNlIHRoZSBkZWZhdWx0IHNpemUuIixOb3JtYWxTaXplUmFuZ2U6Ik5vcm1hbCBzaXplIHJhbmdlIixOb3JtYWxDZW50ZXJQb2ludFJhbmdlOiJOb3JtYWwgY2VudGVyIHBvaW50IHJhbmdlIixMb2FkaW5nVGlwczoiV2FpdCBhIG1pbnV0ZSwgRGF0YSBMb2FkaW5nIH4iLFVubG9ja2VkOiJVbmxvY2tlZCIsTG9ja2VkOiJMb2NrZWQiLExlYXN0Q2hhcmFjdGVyRXJyb3I6IlBsZWFzZSBlbnRlciBhdCBsZWFzdCB7e251bX19IGNoYXJhY3RlcnMiLEFuZDoiQW5kIixPcjoiT3IiLEltYWdlTGFiZWxzOiJJbWFnZSBsYWJlbHMiLCIzRFJlY3QiOiIzRCBSZWN0IiwiMkRSZWN0IjoiMkQgUmVjdCIsQWRkUG9pbnRzOiJBREQiLFJlbW92ZVBvaW50czoiUkVNT1ZFIixSZXNldDoiUmVzZXQiLFBsZWFzZUZyYW1lVGhlT2JqZWN0VG9CZURpdmlkZWRGaXJzdDoiUGxlYXNlIGZyYW1lIHRoZSBvYmplY3QgdG8gYmUgZGl2aWRlZCBmaXJzdCIsQ2xpY2tPblRoZVRhcmdldE9iamVjdFRvU3BsaXRJdDoiQ2xpY2sgb24gdGhlIHRhcmdldCBvYmplY3QgdG8gc3BsaXQgaXQiLENsaWNrVGhlVGFyZ2V0T2JqZWN0QWdhaW5Ub0luY3JlYXNlVGhlU2VnbWVudGF0aW9uOiJDbGljayB0aGUgdGFyZ2V0IG9iamVjdCBhZ2FpbiB0byBpbmNyZWFzZSB0aGUgc2VnbWVudGF0aW9uIixDbGlja09uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IkNsaWNrIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRvIGRlbGV0ZSB0aGUgc2VnbWVudGF0aW9uIixDbGlja0FnYWluT25UaGVUYXJnZXRPYmplY3RUb0RlbGV0ZVRoZVNlZ21lbnRhdGlvbjoiQ2xpY2sgYWdhaW4gb24gdGhlIHRhcmdldCBvYmplY3QgdG8gZGVsZXRlIHRoZSBzZWdtZW50YXRpb24iLEFuc3dlcnNBcmVCZWluZ0dlbmVyYXRlZDoiQW5zd2VycyBhcmUgYmVpbmcgZ2VuZXJhdGVkIixBbnN3ZXJHZW5lcmF0aW9uRmFpbGVkUGxlYXNlVHJ5QWdhaW5MYXRlcjoiQW5zd2VyIGdlbmVyYXRpb24gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIixSZUdlbmVyYXRlOiJSZS1nZW5lcmF0ZSIsQW5zd2VyVGV4dEVkaXQ6IkFuc3dlciB0ZXh0IGVkaXQiLFNob3dFZGl0aW5nUmVzdWx0RGlmZmVyZW5jZXNJblRleHRNb2RlT25seToiU2hvdyBlZGl0aW5nIHJlc3VsdCBkaWZmZXJlbmNlcyBpbiB0ZXh0IG1vZGUgb25seSIsQXR0cmlidXRlTG9ja05vdGlmeToiVmlldyBQcm9wZXJ0aWVz77yae3tsYWJlbH1977yMb25seSBkaXNwbGF5IHRoZSBhbm5vdGF0aW9uIGNvbnRlbnQgb2YgdGhlIHNlbGVjdGVkIHByb3BlcnRpZXMiLEF1ZGlvU2VnbWVudFRpcDoiUGxlYXNlIHNlbGVjdCB0aGUgZGVzaXJlZCB0aW1lIHBvaW50IGZvciBjYXB0dXJl77yIe3t0aW1lfX3vvIkiLEF1ZGlvQ29tYmluZVRpcDoiUGxlYXNlIGNsaWNrIG9uIHRoZSBpbnRlcnZhbHMgeW91IHdpc2ggdG8gbWVyZ2UiLENsaXBwZWRBdWRpbzoiQ2FwdHVyZWQgY29udGVudCIsTm9DbGlwcGVkRGF0YToiTm8gY2FwdHVyZWQgY29udGVudCIsQ29tcGFyZVRhZ3M6IlRhZyBjb21wYXJpc29uIGRpc3BsYXkiLENvbWJpbmVBdWRpbzoiTWVyZ2UgaW50ZXJ2YWxzIixDbGlwQXVkaW86IlNwbGl0IGludGVydmFscyIsU3dpdGNoQ2xpcE1vZGU6IlN3aXRjaCB0byBjYXB0dXJlIG1vZGUiLFN3aXRjaFRhZ01vZGU6IlN3aXRjaCB0byB0YWcgbW9kZSIsQ2xpcDoiQ2FwdHVyZSIsUHJldmlvdXNJbnRlcnZhbDoiUHJldmlvdXMgaW50ZXJ2YWwiLE5leHRJbnRlcnZhbDoiTmV4dCBpbnRlcnZhbCIsRGVsZXRlQ29tbWVudDoiRGVsZXRlIENvbW1lbnRzIixEZWxldGVDb21tZW50Q29uZmlybToiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFubm90YXRpb24/IixQcmV2aW91c0NvbW1lbnQ6IlByZXZpb3VzIGNvbW1lbnQiLE5leHRDb21tZW50OiJOZXh0IGNvbW1lbnQiLENsaXBTZWxlY3Q6IlNlbGVjdCIsIkZvcndhcmQwLjEiOiJBZHZhbmNlIGJ5IDAuMSBzZWNvbmRzIiwiQmFjazAuMSI6IlJld2luZCBieSAwLjEgc2Vjb25kcyIsTGVmdENsaWNrOiJMZWZ0LWNsaWNrIixTY3JpYmJsZToiU2NyaWJibGUiLEVyYXNlOiJFcmFzZSIsU2NyaWJibGVMaW5lOiJTY3JpYmJsZSAoQ29ubmVjdCkiLFN0cm9rZUVubGFyZ2U6IlN0cm9rZSB0byBlbmxhcmdlIixTdHJva2VSZWR1Y3Rpb246IlN0cm9rZSByZWR1Y3Rpb24iLHRvZ2dsZVNob3dUZXh0OiJUZXh0IENvbXBhcmlzb24gRGlzcGxheSIsQ2xpcFNsaWNlOiJUcmltIFNlZ21lbnQiLFRpbWVTdGFtcDoiQWRkIFRpbWVzdGFtcCIsQ2xpcFRpbWU6IlRyaW0gVGltZSIsU3RhbXBUaW1lOiJUaW1lc3RhbXAgVGltZSIsR2V0U3RhcnRUaW1lOiJSZXRyaWV2ZSBTdGFydCBUaW1lIixHZXRFbmRUaW1lOiJSZXRyaWV2ZSBFbmQgVGltZSIsT3V0cHV0RGlzcGxheToiT3V0cHV0IGRpc3BsYXkiLE1heGltdW1DaGFyYWN0ZXJFcnJvcjoiVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNhbm5vdCBleGNlZWQge3tudW19fSIsQ29tbW9uU3ltYm9sczoiQ29tbW9uIHN5bWJvbHMiLEJpbmFyeU9wZXJhdGlvbnM6IkJpbmFyeSBvcGVyYXRpb25zIixCaW5hcnlSZWxhdGlvbnM6IkJpbmFyeSByZWxhdGlvbnMiLEFycm93czoiQXJyb3dzIixPdGhlcnM6Ik90aGVycyIsR3JlZWs6IkdyZWVrIGFscGhhYmV0IixMb3dlcmNhc2U6Ikxvd2VyY2FzZSIsVXBwZXJjYXNlOiJVcHBlcmNhc2UiLEFkdmFuY2VkTWF0aGVtYXRpY3M6IkFkdmFuY2VkIG1hdGhlbWF0aWNzIixGcmFjdGlvbmFsRGlmZmVyZW50aWF0aW9uOiJGcmFjdGlvbmFsIGRpZmZlcmVudGlhdGlvbiIsRnJhY3Rpb246IkZyYWN0aW9uIixEZXJpdmF0aXZlOiJEZXJpdmF0aXZlIixNb2R1bGFyQXJpdGhtZXRpYzoiTW9kdWxhciBhcml0aG1ldGljIixSYWRpY2FsOiJSYWRpY2FsIixTdXBBbmRTdWI6IlN1cGVyc2NyaXB0IGFuZCBzdWJzY3JpcHQiLExpbWl0TG9nYXJpdGhtOiJMaW1pdCBsb2dhcml0aG0iLExpbWl0czoiTGltaXRzIixMb2dhcml0aG1zQW5kRXhwb25lbnRzOiJMb2dhcml0aG1zIGFuZCBleHBvbmVudHMiLEJvdW5kczoiQm91bmRzIixJbnRlZ3JhbE9wZXJhdGlvbjoiSW50ZWdyYWwgb3BlcmF0aW9uIixJbnRlZ3JhbDoiSW50ZWdyYWwiLERvdWJsZUludGVncmFsOiJEb3VibGUgaW50ZWdyYWwiLFRyaXBsZUludGVncmFsOiJUcmlwbGUgaW50ZWdyYWwiLExhcmdlT3BlcmF0aW9uczoiTGFyZ2Ugb3BlcmF0aW9ucyIsUHJvZHVjdHNBbmRDb3Byb2R1Y3RzOiJQcm9kdWN0cyBhbmQgY29wcm9kdWN0cyIsSW50ZXJzZWN0aW9uQW5kVW5pb246IkludGVyc2VjdGlvbiBhbmQgdW5pb24iLExpbmVhckFsZ2VicmE6IkxpbmVhciBhbGdlYnJhIixCcmFja2V0Rm9yZW5zaWNzOiJCcmFja2V0IGZvcmVuc2ljcyIsQnJhY2tldDoiQnJhY2tldCIsQ29tbW9uOiJDb21tb24iLEFycmF5TWF0cml4OiJBcnJheSBtYXRyaXgiLFRyaWdvbm9tZXRyaWNGdW5jdGlvbnM6IlRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIixJbnZlcnNlVHJpZ29ub21ldHJpY0Z1bmN0aW9uczoiSW52ZXJzZSB0cmlnb25vbWV0cmljIGZ1bmN0aW9ucyIsSHlwZXJibGljRnVuY3Rpb25zOiJIeXBlcmJsaWMgZnVuY3Rpb25zIixJbnZlcnNlSHlwZXJibGljRnVuY3Rpb25zOiJJbnZlcnNlIGh5cGVyYmxpYyBmdW5jdGlvbnMiLEZvcm11bGFUZW1wbGF0ZToiRm9ybXVsYSB0ZW1wbGF0ZSIsQWxnZWJyYToiQWxnZWJyYSIsR2VvbWV0cnk6Ikdlb21ldHJ5IixJbmVxdWFsaXR5OiJJbmVxdWFsaXR5IixNYXRyaXg6Ik1hdHJpeCIsVHJpYW5nbGU6IlRyaWFuZ2xlIixTdGF0aXN0aWNzOiJTdGF0aXN0aWNzIixTZXF1ZW5jZToiU2VxdWVuY2UiLFBoeXNpY3M6IlBoeXNpY3MiLEluZGljYXRvckp1ZGdtZW50OiJJbmRpY2F0b3IganVkZ21lbnQiLE9ubHlDdXJyZW50RnJhbWU6Ik9ubHkgY3VycmVudCBmcmFtZSIsQ2xpY2tPblRoZUlkVG9IaWdobGlnaHRUaGVNYXJrdXBCb3g6IkNsaWNrIG9uIHRoZSBJRCB0byBoaWdobGlnaHQgdGhlIG1hcmt1cCBib3giLERvdWJsZUNsaWNrT25UaGVJZFRvQ29udGludW91c2x5SGlnaGxpZ2h0Qm94ZXNBY3Jvc3NGcmFtZXM6IkRvdWJsZS1jbGljayBvbiB0aGUgSUQgdG8gY29udGludW91c2x5IGhpZ2hsaWdodCBib3hlcyBhY3Jvc3MgZnJhbWVzIixGaW5kVGhlRnJhbWVDb3JyZXNwb25kaW5nVG9UaGVMYWJlbGVkRnJhbWVJZDoiRmluZCB0aGUgZnJhbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbGFiZWxlZCBmcmFtZSBJRCIsR2xvYmFsQW5ub3RhdGlvbjoiR2xvYmFsIGFubm90YXRpb24iLFF1YWxpZmllZEFubm90YXRpb246IlF1YWxpZmllZCBhbm5vdGF0aW9uIixJbnZhbGlkUXVlc3Rpb25BbmRTa2lwOiJJbnZhbGlkIHF1ZXN0aW9uLCBwbGVhc2Ugc2tpcCB0aGlzIHF1ZXN0aW9uIixQcm9qZWN0aW9uRnJhbWVDYW5ub3RCZURlbGV0ZWQ6IlByb2plY3Rpb24gZnJhbWUgY2Fubm90IGJlIGRlbGV0ZWQiLEZhaWxlZFRvQ29weVJlc3VsdHM6IkZhaWxlZCB0byBjb3B5IHJlc3VsdHMiLFBhcnRpYWxSZXN1bHRzUmVwbGljYXRpb25GYWlsdXJlOiJQYXJ0aWFsIHJlc3VsdHMgcmVwbGljYXRpb24gZmFpbHVyZSIsUm90YXRpb25BbmdsZVNlbnNpdGl2aXR5OiJSb3RhdGlvbiBhbmdsZSBzZW5zaXRpdml0eSIsIjJESW1hZ2VCYXRjaCI6IjJEIEltYWdlIEJhdGNoIiwiMkRJbWFnZUJhdGNoQ29ubmVjdGlvbiI6IjJEIEltYWdlIEJhdGNoIENvbm5lY3Rpb24iLCIyREltYWdlQmF0Y2hEaXNjb25uZWN0aW9uIjoiMkQgSW1hZ2UgQmF0Y2ggRGlzY29ubmVjdGlvbiIsQ29uZmlybVRvQmF0Y2hDb25uZWN0OiJDb25maXJtIGJhdGNoIGNvbm5lY3Rpb24/IixDb25maXJtVG9CYXRjaERpc2Nvbm5lY3Q6IkNvbmZpcm0gYmF0Y2ggZGlzY29ubmVjdGlvbj8iLENvbm5lY3Q6IkNvbm5lY3QiLERpc2Nvbm5lY3Q6ImRpc2Nvbm5lY3QiLEltYWdlMkRCb3hTY2FsZToiSW1hZ2UgMkQgQm94IFNjYWxlIixTZWxlY3RlZFJlY3Q6IlNlbGVjdGVkIFJlY3QiLE9ubHlMb2FkVGhlRmlyc3RGcmFtZVByZUFubm90YXRpb246Ik9ubHkgbG9hZCB0aGUgZmlyc3QgZnJhbWUgcHJlIGFubm90YXRpb24iLFNlbGVjdEJveFRvRGlzcGxheUluZGVwZW5kZW50bHk6IlNlbGVjdCBib3ggdG8gZGlzcGxheSBpbmRlcGVuZGVudGx5IixTZWxlY3RCb3hTd2l0Y2hUaXBzOiJBZnRlciB0dXJuaW5nIG9uIHRoZSBzd2l0Y2gsIHNlbGVjdCB0aGUgYm94IGluIHRoZSB0b3AgdmlldywgYW5kIHRoZSBpbWFnZSB2aWV3IHdpbGwgb25seSBkaXNwbGF5IHRoZSBjb3JyZXNwb25kaW5nIDJELzNEIGJveCwgbWFraW5nIGl0IGVhc2llciB0byB2aWV3IHRoZSBjb3JyZXNwb25kaW5nIHJlbGF0aW9uc2hpcCBpbiB0aGUgdG9wIHZpZXciLFNvcnRDb252ZXJzYXRpb25RdWFsaXR5OiJQbGVhc2UgcmFuayB0aGUgcXVhbGl0eSBvZiBlYWNoIGNvbnZlcnNhdGlvbiIsRGlhbG9nOiJEaWFsb2ciLFNlbGVjdGlvbk9mQW5ub3RhdGlvbjoiU2VsZWN0aW9uIG9mIGFubm90YXRpb24iLEFubm90YXRpbmc6IkFubm90YXRpbmciLEdyb3VwOiJHcm91cCIsVGhlRHJhd0ZyYW1lU2l6ZUlzU21hbGxlclRoYW5UaGVNaW5pbXVtRHJhd1NpemVJblRoZVN0ZXBDb25maWd1cmF0aW9uOiJUaGUgZHJhdyBmcmFtZSBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBkcmF3IHNpemUgaW4gdGhlIHN0ZXAgY29uZmlndXJhdGlvbiIsVGhlU2l6ZU9mVGhlRHJhd2luZ0JveElzU21hbGxlclRoYW5UaGVNaW5pbXVtRHJhd2luZ1NpemVJblRoZU1haW5Qcm9wZXJ0eUNvbmZpZ3VyYXRpb246IlRoZSBzaXplIG9mIHRoZSBkcmF3aW5nIGJveCBpcyBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gZHJhd2luZyBzaXplIGluIHRoZSBtYWluIHByb3BlcnR5IGNvbmZpZ3VyYXRpb24ifSxkdD17VGV4dElucHV0OiLmlofmnKzovpPlhaUiLEF0dHJpYnV0ZToi5Li75bGe5oCnIixOb0F0dHJpYnV0ZToi5peg5bGe5oCnIixTYXZlOiLkv53lrZgiLFVuZG86IuaSpOmUgCIsUmVkbzoi6YeN5YGaIixSb3RhdGU6IuaXi+i9rCIsU3R5bGU6Iuagt+W8jyIsQWRqdXN0OiLlm77niYfosIPmlbQiLEJvcmRlclRoaWNrbmVzczoi6L655qGG57KX57uGIixDb2xvcjoi6aKc6ImyIixCb3JkZXJPcGFjaXR5OiLovrnmoYbpgI/mmI7luqYiLEZpbGxPcGFjaXR5OiLloavlhYXpgI/mmI7luqYiLFNhdHVyYXRpb246IumlseWSjOW6piIsQ29udHJhc3Q6IuWvueavlOW6piIsRXhwb3N1cmU6IuabneWFieW6piIsU2NyZWVuUmF0aW86IueUu+mdouWNoOavlCIsT3JpZ2luYWxTY2FsZToi5oyJ5Y6f5Zu+5q+U5L6L5pi+56S6IixDb3B5VGhlUHJldmlvdXM6IuWkjeWItuS4iuW8oCIsQ2xlYXJMYWJlbDoi5riF56m65qCH5rOoIixTZXRBc0ludmFsaWQ6Iuagh+S4uuaXoOaViCIsU2V0QXNWYWxpZDoi5Y+W5raI5peg5pWIIixDb25maXJtOiLnoa7orqQiLEZpbmlzaDoi5a6M5oiQIixDYW5jZWw6IuWPlua2iCIsSXRlbXNPZlRoaXNQYWdlOiLmnKzpobXku7bmlbAiLEhvdGtleXM6IuW/q+aNt+mUriIsQW5ub3RhdGVSZWN0OiLmi4nmoYYiLEFubm90YXRlSW52YWxpZFJlY3Q6IuaLieaXoOaViOahhiIsU2VsZWN0UmVjdDoi6YCJ5Lit5qGGIixSaWdodENsaWNrOiLlj7Plh7siLFRvZ2dsZVJlY3RFZmZlY3RpdmVuZXNzOiLliIfmjaLmoYbmmK/lkKbmnInmlYgiLFRvZ2dsZUVmZmVjdGl2ZW5lc3M6IuaYr+WQpuagh+S4uuaXoOaViCIsRGVsZXRlUmVjdDoi5Yig6Zmk5qGGIixTZWxlY3RBbmREb3VibGVDbGljazoi6YCJ5Lit5Y+M5Ye7IixTY2FsZToi57yp5pS+IixGdWxsc2NyZWVuOiLlhajlsY8iLFByZXZpb3VzSW1hZ2U6IuS4iuS4gOW8oCIsUHJldmlvdXNGaWxlOiLkuIrkuIDkuKoiLE5leHRJbWFnZToi5LiL5LiA5bygIixOZXh0RmlsZToi5LiL5LiA5LiqIixQcmV2aW91c0ZvbGRlcjoi5LiK5LiA5paH5Lu25aS5IixOZXh0Rm9sZGVyOiLkuIvkuIDmlofku7blpLkiLERyYWc6IuaLluWKqOWbvueJhyIsVG9nZ2xlU2VsZWN0ZWQ6IuWIh+aNoumAieS4rSIsVG9nZ2xlU2VsZWN0ZWRSZXZlcnNlOiLpgIbluo/liIfmjaLpgInkuK0iLEhpZGVHcmFwaGljczoi6ZqQ6JeP5Zu+5b2iIixUb2dnbGVMaW5lUGFydGljdWxhcml0eToi5o2i54m55q6K6L65IixUb1NpZGU6IuWvuei+uSIsU3BlY2lmaWVkQXR0cmlidXRlc09ubHk6IuS7heeci+aMh+WumuWxnuaApyIsTnVtYmVyOiLmlbDlrZciLFByZXNzOiLplb/mjIkiLFRvT3JpZ2luYWxTdGVwOiLku4Xljp/lm74iLEhvcml6b250YWxPclZlcnRpY2FsOiLmoIfmsLTlubMv5Z6C55u057q/IixBbm5vdGF0ZUludmFsaWRMaW5lOiLmoIfml6DmlYjnur8iLEFubm90YXRlTGluZToi5qCH57q/IixTZWxlY3RMaW5lOiLpgInkuK3nur8iLFRvZ2dsZUxpbmVFZmZlY3RpdmVuZXNzOiLliIfmjaLnur/mmK/lkKbmnInmlYgiLERlbGV0ZUxpbmU6IuWIoOmZpOe6vyIsQ29udGludWVUb0xhYmVsOiLnu63moIciLFNlbGVjdDoi6YCJ5LitIixJbnNlcnRQb2ludDoi5o+S5YWl54K5IixDbGlja09uTGluZToi5a+557q/5Y2V5Ye7IixEZWxldGVQb2ludDoi5Yig6Zmk54K5IixEYmxDbGlja09uUG9pbnQ6IuWvueeCueWPjOWHuyIsU3RvcEFkc29ycHRpb246IuaaguWBnOWQuOmZhCIsUHJldmlvdXNMaW5lOiLkuIrmnaHnur8iLE5leHRMaW5lOiLkuIvmnaHnur8iLFNlbGVjdFBvaW50OiLpgInkuK3ngrkiLEFubm90YXRlSW52YWxpZFBvaW50OiLmoIfml6DmlYjngrkiLEFubm90YXRlUG9pbnQ6Iuagh+eCuSIsQW5ub3RhdGVQb2x5Z29uOiLmoIflpJrovrnlvaIiLFNlbGVjdFBvbHlnb246IumAieS4reWkmui+ueW9oiIsQW5ub3RhdGVJbnZhbGlkUG9seWdvbjoi5qCH5peg5pWI5aSa6L655b2iIixUb2dnbGVQb2x5Z29uRWZmZWN0aXZlbmVzczoi5YiH5o2i5aSa6L655b2i5piv5ZCm5pyJ5pWIIixEZWxldGVQb2x5Z29uOiLliKDpmaTlpJrovrnlvaIiLERlbGV0ZToi5Yig6ZmkIixUb2dnbGVQb2ludFBhcnRpY3VsYXJpdHk6IuaNoueJueauiueCuSIsQ3JvcE92ZXJsYXBBcmVhOiLoo4Hliarph43lj6DljLrln58iLFNlZ21lbnRhdGlvblJlY29nbml0aW9uOiLliIblibLovoXliqkiLFN3aXRjaFBhdHRlcm46IuWIh+aNoue7mOWItuW9ouW8jyIsVGFnZ2luZzoi5omT5qCH562+IixIaWRlOiLmiZPmoIfnrb4iLFRhZ2dpbmdPckF0dHI6IuaJk+agh+etvi/lsZ7mgKciLEhpZGVEcmF3bkFubm90YXRpb246Iuagh+azqOmakOiXj+S4rSIsQmx1ZToi6JOdIixDeWFuOiLpnZIiLEdyZWVuOiLnu78iLFllbGxvdzoi6buEIixQaW5rOiLnsokiLFN0ZXBzOiLmoIfms6jmraXpqqQiLEV4cG9ydDoi5a+85Ye6IixOZXh0U3RlcDoi5LiL5LiA5q2lIixTdGVwTm90RmluaXNoZWROb3RpZnk6IuW9k+WJjeatpemqpOWtmOWcqOS4uuacquagh+azqOi/h+eahOWbvueJh++8jOivt+agh+azqOWujOaIkOWGjeeCueWHu+S4i+S4gOatpSIsY3VySXRlbXM6IuesrHt7Y3VycmVudH19L3t7dG90YWx9feWIhumhtSIsVHVyblBhZ2U6Iue/u+mhtSIsU3dpdGNoOiLliIfmjaIiLEVtcHR5VGV4dElucHV0OiLmuIXnqbrmlofmnKzovpPlhaUiLFJlZ3VsYXJFeHBJbmNvcnJlY3RseToi5q2j5YiZ6KGo6L6+5byP5aGr5YaZ6ZSZ6K+vIixOb0NvbmZpZ3VyYXRpb246IuaaguaXoOS/oeaBr+mFjee9riIsQ2xlYXJUaGlzT3B0aW9uOiLmuIXnqbrmraTpgInpobkiLFJlc3RvcmVJbWFnZUF0dHJpYnV0ZXM6Iui/mOWOn+WbvueJh+WxnuaApyIsQ29uZmlybVRvOiLnoa7orqQiLHJlY3RUb29sOiLmoIfnrb4iLHRhZ1Rvb2w6Iuagh+eCuSIscG9seWdvblRvb2w6IuWkmui+ueW9oiIsbGluZVRvb2w6Iue6v+adoSIscG9pbnRUb29sOiLmoIfngrkiLHRleHRUb29sOiLmlofmnKwiLFNwZWVkOiLlgI3pgJ8iLFBsYXlQYXVzZToi5pKt5pS+L+aaguWBnCIsRmFzdEZvcndhcmQ6IuW/q+i/myIsUmV3aW5kOiLlv6vpgIAiLHZpZGVvSW52YWxpZEFuZFNraXA6IuaXoOaViOinhumike+8jOivt+i3s+i/hyIsaW1hZ2VJbnZhbGlkQW5kU2tpcDoi5peg5pWI5Zu+54mH77yM6K+36Lez6L+HIix2aWRlb0Vycm9yQW5kUmVsb2FkOiLop4bpopHliqDovb3lpLHotKUsIOivt+mHjeaWsOWKoOi9vSIsaW1hZ2VFcnJvckFuZFJlbG9hZDoi5Zu+54mH5Yqg6L295aSx6LSlLCDor7fph43mlrDliqDovb0iLG9yTWFza0FzSW52YWxpZDoiIOaIliDlsIblhbbmoIfkuLrml6DmlYgiLENsaWNrQW5vdGhlclBvbHlnb246Iuivt+eCueWHu+W4jOacm+WQiOW5tueahOWkmui+ueW9oiIsUG9seWdvbnNUb0JlQ29tYmluZWROZWVkVG9CZVNlbGVjdGVkOiLpnIDopoHpgInkuK3pnIDopoHlkIjlubbnmoTlpJrovrnlvaIiLEN1cnZlTW9kZURvZXNOb3RTdXBwb3J0Q3V0dGluZzoi5puy57q/5qih5byP5pqC5LiN5pSv5oyB6KOB5YmqIixDb21iaW5lU3VjY2Vzczoi5ZCI5bm25oiQ5YqfIixDb21iaW5pbmdGYWlsZWROb3RpZnk6IuWQiOW5tuWksei0pe+8jOivt+ajgOafpeaYr+WQpuS4pOS4quWkmui+ueW9ouaYr+WQpuacieebuOS6pO+8jOaIluWkmui+ueW9ouWQiOW5tuaYr+WQpuW9ouaIkOa8j+epuiIsQ29tYmluZU92ZXJsYXBBcmVhOiLlkIjlubbph43lj6DljLrln58iLE5vRGVwZW5kZW5jeToi6K+l5Zu+54mH5peg6ZyA5qCH5rOoIixUZXh0Q2hlY2tOdW1iZXJPbmx5OiLor7fmjInku4XmlbDlrZfnmoTmoLzlvI/ovpPlhaUiLFRleHRDaGVja0VuZ2xpc2hPbmx5OiLor7fmjInku4Xoi7HmlofnmoTmoLzlvI/ovpPlhaUiLFRleHRDaGVja0N1c3RvbUZvcm1hdDoi6K+35oyJ6KaB5rGC55qE5qC85byP6L6T5YWlIixGcmFtaW5nT2ZPYmplY3RUb0JlRGl2aWRlZDoi6K+35YWI5qGG5Ye66ZyA5YiG5Ymy55qE54mp5L2TIixDbGlja09uVGFyZ2V0OiLor7fljZXlh7vnm67moIfniankvZMiLFNwbGl0dGluZ0FsZ29yaXRobVByZWRpY3Rpb246IuWIhuWJsueul+azlemihOa1i+S4rS4uLiIsIjJEVmlldyI6IjJE6KeG5Zu+IiwiM0RWaWV3IjoiM0Top4blm74iLFRvcFZpZXc6IuS/r+inhuWbviIsU2lkZVZpZXc6IuS+p+inhuWbviIsQmFja1ZpZXc6IuiDjOinhuWbviIsU2hvd0Fycm93czoi5pi+56S6566t5aS0IixMZW5ndGg6IumVvyIsV2lkdGg6IuWuvSIsSGVpZ2h0OiLpq5giLFJvdGF0aW9uX3k6IuacneWQkeinkiIsUG9pbnRDb3VudDoi54K55pWwIixJbnZhbGlkOiLml6DmlYgiLFRhZzoi5qCH562+IixTZWFyY2hUYWc6IuaQnOe0ouagh+etviIsU3ViQXR0cmlidXRlOiLlia/lsZ7mgKciLFBsZWFzZVNlbGVjdDoi6K+36YCJ5oupIixDb3B5RW1wdHlJblBvaW50Q2xvdWQ6IuWkjeWItuWGheWuueS4uuepuu+8jOivt+mAieaLqeWvueW6lOeahOeCueS6keaVsOaNriIsUGFzdGVFbXB0eUluUG9pbnRDbG91ZDoi6K+35YWI5aSN5Yi26ZyA6KaB55qE54K55LqR5pWw5o2u5YaN6L+b6KGM57KY6LS0IixIYXNEdXBsaWNhdGVJRDoi5a2Y5Zyo6YeN5aSNSUQs5aSN5Yi25aSx6LSlIixIYXNEdXBsaWNhdGVJREhlYWRlcjoi5a2Y5Zyo5qCH5rOo5qGGIElEIOmHjeWkjSIsSGFzRHVwbGljYXRlSURNc2c6IuWtmOWcqOagh+azqOahhiBJRCDph43lpI3nmoTpl67popjvvIzmmK/lkKbopoHopobnm5Y/IixDb3B5U3VjY2Vzczoi5aSN5Yi25oiQ5Yqf77yBIixMb3dlckxpbWl0UG9pbnRzTnVtSW5Cb3g6IuahhuS9k+WGheeCueaVsOS4jeWFgeiuuOS9juS6jiB7e251bX19IOS4qiIsUG9pbnRUaGlja25lc3M6IueCueeahOaYvuekuueyl+e7hiIsUm90YXRlQXJvdW5kQ2VudGVyUG9pbnQ6Iue7leS4reW/g+eCueaXi+i9rOeUu+mdoiIsUG9pbnRDbG91ZFZpZXdUcmFuc2xhdGU6IueCueS6keW5s+enuyIsVG9wVmlld1RyYW5zbGF0ZToi5L+v6KeG5Zu+5bmz56e7IixDaGFuZ2VQb2ludENsb3VkVmFsaWQ6IuWIh+aNoueCueS6keacieaViOaApyIsTGFzc29TZWxlY3Rvcjoi5aWX57SiIixSZWN0U2VsZWN0b3I6IuaLieahhiIsU2VsZWN0b3JNc2c6IuWPs+mUruaLluWKqOi/m+ihjOiMg+WbtOiOt+WPliIsQWRkUG9pbnQ6Iua3u+WKoOeCuSIsQ2lyY2xlU2VsZWN0b3I6IumAieeCuSIsRGV0ZWN0aW9uTW9kZToi5qOA5rWL5qih5byPIixTZWdtZW50YXRpb25Nb2RlOiLliIblibLmqKHlvI8iLEVudGVyRWRpdE1vZGU6Iui/m+WFpee8lui+kSIsU2VsZWN0ZWRQb2ludHM6IumAieS4reeCueaVsCIsQ29weUJveDoi5aSN5Yi25qGGIixQYXN0ZUJveDoi57KY6LS05qGGIixSb3RhdGVMZWZ0OiLlkJHlt6bml4vovazlvq7osIMiLFJvdGF0ZVJpZ2h0OiLlkJHlj7Pml4vovazlvq7osIMiLFByZXZpb3VzQm94OiLkuIrkuIDmoYYiLE5leHRCb3g6IuS4i+S4gOahhiIsUm90YXRlOTA6IuaXi+i9rDkwwrAiLENvcHlQcmV2UGFnZToi5aSN5Yi25LiK5LiA6aG1IixDaGFuZ2VCb3hWYWxpZDoi5YiH5o2i5qCH5rOo5qGG5pyJ5pWI5oCnIixNdWx0aVNlbGVjdDoi5aSa6YCJIixTZWxlY3RBbGxCb3g6IuWFqOmAiSIsR2VuZXJhbE9wZXJhdGlvbjoi6YCa55SoIixSZWN0UGF0dGVybjoi5ouJ5qGG5qih5byPIixQb2x5Z29uUGF0dGVybjoi5aSa6L655b2i5qih5byPIixDaGFuZ2VQYXR0ZXJuTXNnOiLmiJDlip/mm7TmlLnkuLp7e3BhdHRlcm59feaooeW8jyIsRHJhZ09wZXJhdGlvbjoi5ouW5YqoIixTZWxlY3RlZFN0YXR1czoi6YCJ5Lit5pe2Iix1cGRhdGVWYWxpZEZyb21WYWxpZFRvSW5WYWxpZDoi5piv5ZCm56Gu6K6k5qCH5Li65peg5pWI5paH5Lu277yfIix1cGRhdGVWYWxpZEZyb21JblZhbGlkVG9WYWxpZDoi5piv5ZCm56Gu6K6k5Y+W5raI5peg5pWI5paH5Lu277yfIixBbGxUcmFja0lEczoi5omA5pyJ5bey5qCH5rOo55qE5qGGSUQiLEN1cnJlbnRCb3hUcmFja0lEczoi5b2T5YmN5qCH5rOo5qGGSUQiLFBvc2l0aXZlSW50ZWdlckNoZWNrOiLor7fovpPlhaXmraPmlbTmlbAiLE5vdEFsbG93RGVjaW1hbFBvaW50c0luVHJhY2tJRDoi6L6T5YWldHJhY2tJROS4jeWFgeiuuOWMheWQq+Wwj+aVsOeCuSIsRHVwbGljYXRlVHJhY2tJRHNFeGlzdDoi5a2Y5Zyo6YeN5aSN55qEdHJhY2tJRCIsQmF0Y2hVcGRhdGVUZXh0OiLmibnph4/kv67mlLkiLEJhdGNoVXBkYXRlVHJhY2tJRDoi5om56YeP5L+u5pS5SUQiLFRyYWNrSURVbmlmeUFzOiLnu5/kuIDmoIfms6jmoYZJROS4uiIsVW5pZnlUcmFja0lEUmFuZ2U6Iue7n+S4gElE6IyD5Zu0IixQYWdlOiLpobUiLE9rVGV4dDoi56Gu6K6kIixDYW5jZWxUZXh0OiLlj5bmtogiLFVuaWZ5UGFyYW1zOiLnu5/kuIDlj4LmlbAiLFVuaWZ5QXR0cmlidXRlUmFuZ2U6Iue7n+S4gOWxnuaAp+iMg+WbtCIsVW5pZnlQYXJhbXNUaXBzOiLpnZ7lvZPliY3pobXlm77niYfph4znmoQyROahhuWwuuWvuOaaguaXtuS4jeWBmue7n+S4gCIsVW5pZnlUcmFja0lEOiLnu5/kuIDmoIfms6jmoYZJRCIsVW5pZnlTaXplOiLnu5/kuIDlsLrlr7giLFVuaWZ5VGFnOiLnu5/kuIDmoIfnrb4iLE5vRGF0YToi5pqC5peg5pWw5o2uIixBbm5vdGF0ZWRMaXN0OiLmoIfms6jliJfooagiLG9uRGVsZXRlR3JhcGhCeUF0dHI6IuehruWumuimgeWIoOmZpOWxnuaAp+S4uiB7e2F0dHJpYnV0ZX19IOeahOagh+azqOaVsOaNruWQlz8iLENhbmNlbEZpeGVkOiLlj5bmtojlm7rlrpoiLEZpeGVkT25MZWZ0OiLlm7rlrprlnKjlt6bkvqciLEZpeGVkT25SaWdodDoi5Zu65a6a5Zyo5Y+z5L6nIixBbm5vdGF0ZWRSZXN1bHQ6Iuagh+azqOe7k+aenCIsQ29tcGxlbWVudGFyeVRyYWNraW5nOiLooaXlhajot5/ouKoiLENvbXBsZW1lbnRhcnlUcmFja2luZ1ByZWRpY3Rpb246IuihpeWFqOi3n+i4qumihOa1iyIsQXBwbHk6IuW6lOeUqCIsQmVmb3JlUHJlZGljdFN0YXJ0aW5nOiLlkK/liqjliY3vvIzor7flhYjmoIflh7rpppblsL7nmoTmoYbvvIzpnIDlkIzluo/lj7ciLFRoZVByZWRpY3RlZFBvaW50Q2xvdWQ6IueOsOmihOa1i+eCueS6kemcgOimgeWwj+S6jiAxMCDluKciLENhbWVyYUZvbGxvd1RvcFZpZXc6IuaMieS/r+inhuWbvuWumuS9jSIsTWFya09ubHlPbmU6IuS7heagh+azqOS4gOW4p+aVsOaNru+8jOmcgOagh+WHuummluWwvueahOW4p+aVsOaNriIsSGF2ZU5vTmVlZDoi5Lik5bin5LmL6Ze05pqC5peg6ZyA6aKE5rWL55qE5pWw5o2u77yM6K+35YWI5qCH5Ye66aaW5bC+55qE5qGG77yM6ZyA5ZCM5bqP5Y+3IixQcmVkaWN0aW5nRGF0YUZyb206Iuato+WcqOmihOa1i+esrCB7e3N0YXJ0UGFnZX19IOmhteWIsOesrCB7e2VuZFBhZ2V9fSDpobXkuYvpl7TmoYZJROS4uiB7e3NlbGVjdGVkQm94VHJhY2tJRH19IOeahOaVsOaNriIsUG9pbnRDbG91ZENvdmVyTW9kZToi6YCJ5Lit55u45ZCM54K55LqR5pe277yM5ZCO5LiA5qCH6K6w6KaG55uW5YmN5LiA5qCH6K6wIixQb2ludENsb3VkVW5jb3Zlck1vZGU6IumAieS4reebuOWQjOeCueS6keaXtu+8jOWQjuS4gOagh+iusOS4jeWPr+imhuebluWJjeS4gOagh+iusCIsUG9pbnRDbG91ZEZvY3VzTW9kZToi5bey5byA5ZCv6IGa54Sm5qih5byPIixQb2ludENsb3VkVW5mb2N1c01vZGU6IuW3suWFs+mXreiBmueEpuaooeW8jyIsUG9pbnRDbG91ZEhpZGVTZWdtZW50OiLlt7LpmpDol4/moIfms6jngrnkupEiLFBvaW50Q2xvdWRTaG93U2VnbWVudDoi5bey5pi+56S65YWo6YOo54K55LqRIixQb2ludENsb3VkSGlkZVNlZ21lbnRJbnZhbGlkOiLpmpDol4/lt7LmoIfms6jkuI3lj6/nlKjvvIzor7flhYjlhbPpl63ogZrnhKYiLFBvaW50Q2xvdWRIaWRlRm9jdXNJbnZhbGlkX2hpZGU6IuiBmueEpuS4jeWPr+eUqO+8jOivt+WFiOWFs+mXreKAnOmakOiXj+W3suagh+azqOKAnSIsUG9pbnRDbG91ZEhpZGVGb2N1c0ludmFsaWRfbm9uZToi6IGa54Sm5LiN5Y+v55So77yM6K+35YWI6YCJ5oup6ZyA6KaB6IGa54Sm55qE5qCH6K6wIixQYWxldHRlOiLosIPoibLnm5giLEVmZmljaWVudExpc3RlbmluZzoi6K+l5Lu75Yqh5qCH5rOo5pWI546H55uR5o6n5LitLi4uIixUaXRsZToi6aKY55uuIixBbnN3ZXI6IuWbnuetlCIsRmluaXNoZWQ6IuW3suWujOaIkCIsVW5maW5pc2hlZDoi5pyq5a6M5oiQIixPdmVyYWxsU2NvcmU6IuaVtOS9k+ivhOWIhiIsTm9TY29yaW5nU2NhbGU6IuWPr+WcqOW3puS+p+mFjee9ruatpemqpOivpuaDhSIsQmVzdDoi5pyA5aW9IixXb3JzdDoi5pyA5beuIixSYW5raW5nUXVhbGl0eU9mQW5zd2Vyczoi6K+35a+55q+P5Liq5Zue562U55qE6LSo6YeP6L+b6KGM5o6S5bqPIixUb0JlU29ydGVkOiLlvoXmjpLluo8iLFllczoi5pivIixObzoi5ZCmIixBZGRpdGlvbmFsQ29udGVudDoi77yI6YCJ5aGr77yJ6K+35aGr5YaZ5Lu75L2V5L2g5a+5562U5qGI55qE6K+E5Lu35oiW5YW25LuW6KGl5YWF5YaF5a65IixTdWJtaXQ6IuaPkOS6pCIsRHJhZ0FuZERyb3A6IuaMieS9j+aLluWKqCIsRGVmYXVsdFNpemU6IueCueWHu+Wbvuagh+S7peS9v+eUqOm7mOiupOWwuuWvuCIsTm9ybWFsU2l6ZVJhbmdlOiLmraPluLjlsLrlr7jojIPlm7QiLE5vcm1hbENlbnRlclBvaW50UmFuZ2U6Iuato+W4uOS4reW/g+eCueiMg+WbtCIsTG9hZGluZ1RpcHM6IuaVsOaNruWKoOi9veS4rX7or7fnqI3lkI4iLFVubG9ja2VkOiLmnKrlvIDlkK8iLExvY2tlZDoi5bey5byA5ZCvIixMZWFzdENoYXJhY3RlckVycm9yOiLor7foh7PlsJHovpPlhaV7e251bX195Liq5a2X56ymIixBbmQ6IuS4lCIsT3I6IuaIliIsSW1hZ2VMYWJlbHM6IuWbvueJh+agh+azqOeJqSIsIjNEUmVjdCI6IjNEIOahhiIsIjJEUmVjdCI6IjJEIOahhiIsQWRkUG9pbnRzOiLlop7liqAiLFJlbW92ZVBvaW50czoi5Yig5YePIixSZXNldDoi6YeN572uIixQbGVhc2VGcmFtZVRoZU9iamVjdFRvQmVEaXZpZGVkRmlyc3Q6Iuivt+WFiOahhuWHuumcgOWIhuWJsueahOeJqeS9kyIsQ2xpY2tPblRoZVRhcmdldE9iamVjdFRvU3BsaXRJdDoi5Y2V5Ye755uu5qCH54mp5L2T6L+b6KGM5YiG5YmyIixDbGlja1RoZVRhcmdldE9iamVjdEFnYWluVG9JbmNyZWFzZVRoZVNlZ21lbnRhdGlvbjoi5YaN5qyh5Y2V5Ye755uu5qCH54mp5L2T5aKe5Yqg5YiG5YmyIixDbGlja09uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IuWNleWHu+ebruagh+eJqeS9k+WIoOWHj+WIhuWJsiIsQ2xpY2tBZ2Fpbk9uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IuWGjeasoeWNleWHu+ebruagh+eJqeS9k+WIoOWHj+WIhuWJsiIsQW5zd2Vyc0FyZUJlaW5nR2VuZXJhdGVkOiLlm57nrZTnlJ/miJDkuK0iLEFuc3dlckdlbmVyYXRpb25GYWlsZWRQbGVhc2VUcnlBZ2FpbkxhdGVyOiLlm57nrZTnlJ/miJDlpLHotKXvvIzor7fnqI3lkI7ph43or5UiLFJlR2VuZXJhdGU6IumHjeaWsOeUn+aIkCIsQW5zd2VyVGV4dEVkaXQ6IuWbnuetlOaWh+acrOe8lui+kSIsU2hvd0VkaXRpbmdSZXN1bHREaWZmZXJlbmNlc0luVGV4dE1vZGVPbmx5OiLku4XmlofmnKzmqKHlvI/kuIvmmL7npLrnvJbovpHnu5Pmnpzlt67lvIIiLEF0dHJpYnV0ZUxvY2tOb3RpZnk6Iuafpeeci+WxnuaAp++8mnt7bGFiZWx9fe+8jOWPquaYvuekuuaJgOmAieWxnuaAp+eahOagh+azqOWGheWuuSIsQXVkaW9TZWdtZW50VGlwOiLor7fpgInmi6nluIzmnJvmiKrlj5bnmoTml7bpl7TngrnvvIh7e3RpbWV9fe+8iSIsQXVkaW9Db21iaW5lVGlwOiLor7fngrnlh7vluIzmnJvlkIjlubbnmoTljLrpl7QiLENsaXBwZWRBdWRpbzoi5bey5oiq5Y+W6Z+z6aKRIixOb0NsaXBwZWREYXRhOiLmmoLml6DmiKrlj5blhoXlrrkiLENvbXBhcmVUYWdzOiLmoIfnrb7lr7nnhafmmL7npLoiLENvbWJpbmVBdWRpbzoi5ZCI5bm25Yy66Ze0IixDbGlwQXVkaW86IuWIhuWJsuWMuumXtCIsU3dpdGNoQ2xpcE1vZGU6IuWIh+aNouaIquWPluaooeW8jyIsU3dpdGNoVGFnTW9kZToi5YiH5o2i5qCH562+5qih5byPIixDbGlwOiLmiKrlj5YiLFByZXZpb3VzSW50ZXJ2YWw6IuS4iuS4gOWMuumXtCIsTmV4dEludGVydmFsOiLkuIvkuIDljLrpl7QiLERlbGV0ZUNvbW1lbnQ6IuWIoOmZpOaJueazqCIsRGVsZXRlQ29tbWVudENvbmZpcm06IuehruWumuWIoOmZpOivpeadoeagh+azqOWQlyIsUHJldmlvdXNDb21tZW50OiLkuIrkuIDmnaHmibnms6giLE5leHRDb21tZW50OiLkuIvkuIDmnaHmibnms6giLENsaXBTZWxlY3Q6IuaIquWPlumAieS4rSIsIkZvcndhcmQwLjEiOiLliY3ov5swLjFzIiwiQmFjazAuMSI6IuWQjumAgDAuMXMiLExlZnRDbGljazoi5bem5Ye7IixTY3JpYmJsZToi5raC5oq5IixFcmFzZToi5pOm6ZmkIixTY3JpYmJsZUxpbmU6Iua2guaKue+8iOi/nue6v++8iSIsU3Ryb2tlRW5sYXJnZToi56yU6Kem5pS+5aSnIixTdHJva2VSZWR1Y3Rpb246IueslOinpue8qeWwjyIsdG9nZ2xlU2hvd1RleHQ6IuaWh+acrOWvueeFp+aYvuekuiIsQ2xpcFNsaWNlOiLmiKrlj5bniYfmrrUiLFRpbWVTdGFtcDoi5qCH5pe26Ze054K5IixDbGlwVGltZToi5oiq5Y+W5pe26Ze0IixTdGFtcFRpbWU6IuaXtumXtOeCueaXtumXtCIsR2V0U3RhcnRUaW1lOiLojrflj5blvIDlp4vml7bpl7QiLEdldEVuZFRpbWU6IuiOt+WPlue7k+adn+aXtumXtCIsT3V0cHV0RGlzcGxheToi6L6T5Ye65bGV56S6IixNYXhpbXVtQ2hhcmFjdGVyRXJyb3I6IuWtl+espuaVsOS4jeiDvei2hei/h3t7bnVtfX0iLENvbW1vblN5bWJvbHM6IuW4uOeUqOespuWPtyIsQmluYXJ5T3BlcmF0aW9uczoi5LqM5YWD6L+Q566X56ymIixCaW5hcnlSZWxhdGlvbnM6IuS6jOWFg+WFs+ezu+espiIsQXJyb3dzOiLnrq3lpLTnrKblj7ciLE90aGVyczoi5YW25LuW56ym5Y+3IixHcmVlazoi5biM6IWK5a2X5q+NIixMb3dlcmNhc2U6IuWwj+WGmSIsVXBwZXJjYXNlOiLlpKflhpkiLEFkdmFuY2VkTWF0aGVtYXRpY3M6IumrmOetieaVsOWtpiIsRnJhY3Rpb25hbERpZmZlcmVudGlhdGlvbjoi5YiG5pWw5b6u5YiGIixGcmFjdGlvbjoi5YiG5pWwIixEZXJpdmF0aXZlOiLlr7zmlbAiLE1vZHVsYXJBcml0aG1ldGljOiLmqKHnrpfmnK8iLFJhZGljYWw6IuagueW8jyIsU3VwQW5kU3ViOiLkuIrkuIvmoIciLExpbWl0TG9nYXJpdGhtOiLmnoHpmZDlr7nmlbAiLExpbWl0czoi5p6B6ZmQIixMb2dhcml0aG1zQW5kRXhwb25lbnRzOiLlr7nmlbDmjIfmlbAiLEJvdW5kczoi55WM6ZmQIixJbnRlZ3JhbE9wZXJhdGlvbjoi56ev5YiG6L+Q566XIixJbnRlZ3JhbDoi56ev5YiGIixEb3VibGVJbnRlZ3JhbDoi5Y+M6YeN56ev5YiGIixUcmlwbGVJbnRlZ3JhbDoi5LiJ6YeN56ev5YiGIixMYXJnZU9wZXJhdGlvbnM6IuWkp+Wei+i/kOeulyIsUHJvZHVjdHNBbmRDb3Byb2R1Y3RzOiLkuZjnp6/kvZnnp68iLEludGVyc2VjdGlvbkFuZFVuaW9uOiLkuqTpm4blubbpm4YiLExpbmVhckFsZ2VicmE6Iue6v+aAp+S7o+aVsCIsQnJhY2tldEZvcmVuc2ljczoi5ous5Y+35Y+W6K+BIixCcmFja2V0OiLmi6zlj7ciLENvbW1vbjoi5bi455SoIixBcnJheU1hdHJpeDoi5pWw57uE55+p6Zi1IixUcmlnb25vbWV0cmljRnVuY3Rpb25zOiLkuInop5Llh73mlbAiLEludmVyc2VUcmlnb25vbWV0cmljRnVuY3Rpb25zOiLlj43kuInop5Llh73mlbAiLEh5cGVyYmxpY0Z1bmN0aW9uczoi5Y+M5puy5Ye95pWwIixJbnZlcnNlSHlwZXJibGljRnVuY3Rpb25zOiLlj43lj4zmm7Llh73mlbAiLEZvcm11bGFUZW1wbGF0ZToi5YWs5byP5qih5p2/IixBbGdlYnJhOiLku6PmlbAiLEdlb21ldHJ5OiLlh6DkvZUiLEluZXF1YWxpdHk6IuS4jeetieW8jyIsTWF0cml4OiLnn6npmLUiLFRyaWFuZ2xlOiLkuInop5IiLFN0YXRpc3RpY3M6Iue7n+iuoSIsU2VxdWVuY2U6IuaVsOWIlyIsUGh5c2ljczoi54mp55CGIixJbmRpY2F0b3JKdWRnbWVudDoi5oyH5qCH5Yik5patIixPbmx5Q3VycmVudEZyYW1lOiLlj6rnnIvlvZPliY3luKciLENsaWNrT25UaGVJZFRvSGlnaGxpZ2h0VGhlTWFya3VwQm94OiLngrnlh7tJROWPr+S7pemrmOS6ruagh+azqOahhiIsRG91YmxlQ2xpY2tPblRoZUlkVG9Db250aW51b3VzbHlIaWdobGlnaHRCb3hlc0Fjcm9zc0ZyYW1lczoi5Y+M5Ye7SUTlj6/ku6Xot6jluKfov57nu63pq5jkuq7moIfms6jmoYYiLEZpbmRUaGVGcmFtZUNvcnJlc3BvbmRpbmdUb1RoZUxhYmVsZWRGcmFtZUlkOiLmn6Xmib7moIfms6jmoYZJROWvueW6lOW4pyIsR2xvYmFsQW5ub3RhdGlvbjoi5YWo5bGA5qCH5rOoIixRdWFsaWZpZWRBbm5vdGF0aW9uOiLpmZDlrprmoIfms6giLEludmFsaWRRdWVzdGlvbkFuZFNraXA6IuaXoOaViOmimOebru+8jOivt+i3s+i/h+atpOmimCIsUHJvamVjdGlvbkZyYW1lQ2Fubm90QmVEZWxldGVkOiLmipXlsITmoYbml6Dms5XliKDpmaQiLEZhaWxlZFRvQ29weVJlc3VsdHM6IuWkjeWItue7k+aenOWksei0pSIsUGFydGlhbFJlc3VsdHNSZXBsaWNhdGlvbkZhaWx1cmU6IumDqOWIhue7k+aenOWkjeWItuWksei0pSIsUm90YXRpb25BbmdsZVNlbnNpdGl2aXR5OiLml4vovazlvq7osIPop5LluqYiLCIyREltYWdlQmF0Y2giOiIyROWbvueJh+aJuemHjyIsIjJESW1hZ2VCYXRjaENvbm5lY3Rpb24iOiIyROWbvueJh+aJuemHj+i/nuaOpSIsIjJESW1hZ2VCYXRjaERpc2Nvbm5lY3Rpb24iOiIyROWbvueJh+aJuemHj+aWreW8gCIsQ29uZmlybVRvQmF0Y2hDb25uZWN0OiLnoa7orqTmibnph4/ov57mjqXvvJ8iLENvbmZpcm1Ub0JhdGNoRGlzY29ubmVjdDoi56Gu6K6k5om56YeP5pat5byA77yfIixDb25uZWN0OiLov57mjqUiLERpc2Nvbm5lY3Q6IuaWreW8gCIsSW1hZ2UyREJveFNjYWxlOiLlm77niYcyROahhuS9k+e8qeWwj+WkhOeQhiIsU2VsZWN0ZWRSZWN0OiLpgInkuK3moYbkvZMiLE9ubHlMb2FkVGhlRmlyc3RGcmFtZVByZUFubm90YXRpb246IuS7hei9veWFpeesrOS4gOW4p+mihOagh+azqCIsU2VsZWN0Qm94VG9EaXNwbGF5SW5kZXBlbmRlbnRseToi6YCJ5Lit5qGG54us56uL5pi+56S6IixTZWxlY3RCb3hTd2l0Y2hUaXBzOiLlvIDlkK/lvIDlhbPlkI7vvIzpgInkuK3kv6/op4blm77nmoTmoYbkvZPvvIzlm77niYfop4blm77ku4XmmL7npLrlr7nlupTnmoQyRC8zROahhuS9k++8jOS+v+S6juafpeeci+S/r+inhuWbvueahOWvueW6lOWFs+ezuyIsU29ydENvbnZlcnNhdGlvblF1YWxpdHk6Iuivt+Wvueavj+e7hOWvueivneeahOi0qOmHj+i/m+ihjOaOkuW6jyIsRGlhbG9nOiLlr7nor50iLFNlbGVjdGlvbk9mQW5ub3RhdGlvbjoi6YCJ5Lit5qCH5rOoIixBbm5vdGF0aW5nOiLmraPlnKjmoIfms6giLEdyb3VwOiLnu4QiLFRoZURyYXdGcmFtZVNpemVJc1NtYWxsZXJUaGFuVGhlTWluaW11bURyYXdTaXplSW5UaGVTdGVwQ29uZmlndXJhdGlvbjoi57uY5Yi25qGG5bC65a+45bCP5LqO5q2l6aqk6YWN572u6YeM55qE5pyA5bCP57uY5Yi25bC65a+4IixUaGVTaXplT2ZUaGVEcmF3aW5nQm94SXNTbWFsbGVyVGhhblRoZU1pbmltdW1EcmF3aW5nU2l6ZUluVGhlTWFpblByb3BlcnR5Q29uZmlndXJhdGlvbjoi57uY5Yi25qGG5bC65a+45bCP5LqO5Li75bGe5oCn6YWN572u6YeM55qE5pyA5bCP57uY5Yi25bC65a+4In07ZnQubGFuZ3VhZ2V8fGZ0LmluaXQoe2xuZzoiZW4iLGludGVycG9sYXRpb246e2VzY2FwZVZhbHVlOiExfX0pLGZ0LmFkZFJlc291cmNlQnVuZGxlKCJlbiIsInRyYW5zbGF0aW9uIixwdCwhMCksZnQuYWRkUmVzb3VyY2VCdW5kbGUoImNuIiwidHJhbnNsYXRpb24iLGR0LCEwKTtjb25zdCBndD17MDowLDE6LjIsMzouNCw1Oi42LDc6LjgsOToxLDEwOjF9LHl0PXswOjAsMTowLDM6LjIsNTouNCw3Oi42LDk6LjgsMTA6MX0sbXQ9Y2xhc3N7c3RhdGljIHJnYmFTdHJpbmdUb0hleCh0KXtjb25zdCBlPXQuc3Vic3RyaW5nKDUsdC5sZW5ndGgtMSkucmVwbGFjZSgvIC9nLCIiKS5zcGxpdCgiLCIpLG49cGFyc2VJbnQoZVswXSkscj1wYXJzZUludChlWzFdKSxpPXBhcnNlSW50KGVbMl0pLG89cGFyc2VGbG9hdChlWzNdKTtyZXR1cm4iIyIrbi50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpK3IudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKStpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikrTWF0aC5yb3VuZCgyNTUqbykudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKX19O2xldCB2dD1tdDt2dC5yZXBsYWNlQUZyb21SR0JBPSh0LGUpPT50LnNwbGl0KCIgIikuam9pbigiIikucmVwbGFjZSgvLFswLTldKyhbLl17MX1bMC05XSspezAsMX1cKS8sYCwke2UudG9GaXhlZCgyKX0pYCksdnQudG9SR0JBQXJyPXQ9Pntjb25zdCBlPXQubWF0Y2goL1xkKy9nKTtpZihlKXtjb25zdFt0LG4scixpXT1lO3JldHVyblt0LG4scixpXX19LHZ0LmdldFRvb2xTdHJva2VBbmRGaWxsPSh0LGUpPT57Y29uc3R7aG92ZXI6bj0hMSxzZWxlY3RlZDpyPSExLGJvcmRlck9wYWNpdHk6aT0xLGZpbGxPcGFjaXR5Om89MSxjb21tb25PcGFjaXR5OnM9Ljh9PWU7cmV0dXJuIHJ8fG4/e3N0cm9rZTptdC5yZXBsYWNlQUZyb21SR0JBKHQsaSksZmlsbDptdC5yZXBsYWNlQUZyb21SR0JBKHQsbykscmdiYTptdC50b1JHQkFBcnIodCl9OntzdHJva2U6bXQucmVwbGFjZUFGcm9tUkdCQSh0LGkqcyksZmlsbDptdC5yZXBsYWNlQUZyb21SR0JBKHQsbypzKSxyZ2JhOm10LnRvUkdCQUFycih0KX19LHZ0LmdldFN0cm9rZUFuZEZpbGw9KHQsZT0xLG49MSk9Pih7c3Ryb2tlOm10LnJlcGxhY2VBRnJvbVJHQkEodCxlKSxmaWxsOm10LnJlcGxhY2VBRnJvbVJHQkEodCxuKX0pLHZ0LmdldFRvb2xDb2xvckxpc3Q9KHQsZT05LG49OSk9Pntjb25zdCByPWd0W2VdLGk9eXRbbl07cmV0dXJue3ZhbGlkOm10LmdldFN0cm9rZUFuZEZpbGwodCwxKnIsLjQqaSksaW52YWxpZDptdC5nZXRTdHJva2VBbmRGaWxsKEl0LDEqciwuOCppKSx2YWxpZFNlbGVjdGVkOm10LmdldFN0cm9rZUFuZEZpbGwodCwxKnIsLjgqaSksaW52YWxpZFNlbGVjdGVkOm10LmdldFN0cm9rZUFuZEZpbGwoSXQsMSpyLC4yNCppKSx2YWxpZEhvdmVyOm10LmdldFN0cm9rZUFuZEZpbGwodCwxKnIsLjY0KmkpLGludmFsaWRIb3ZlcjptdC5nZXRTdHJva2VBbmRGaWxsKEl0LDEqciwuNCppKX19LHZ0LmdldEF0dHJpYnV0ZUluZGV4PSh0LGUpPT57dHJ5e3JldHVybiBlLmZpbmRJbmRleCgoZT0+ZS52YWx1ZT09PXQpKX1jYXRjaCh0KXtyZXR1cm4tMX19O3ZhciBfdD1PYmplY3QuZGVmaW5lUHJvcGVydHkseHQ9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsd3Q9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsYnQ9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxEdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEV0PU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsQ3Q9KHQsZSxuKT0+ZSBpbiB0P190KHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOnRbZV09bjtjb25zdCBTdD1bInJnYmEoMTAyLCAxMTEsIDI1NSwgMSkiLCJyZ2JhKDEwMiwgMjMwLCAyNTUsIDEpIiwicmdiYSgxOTEsIDI1NSwgMTAyLCAxKSIsInJnYmEoMjU1LCAyMzAsIDEwMiwgMSkiLCJyZ2JhKDIzMCwgMTAyLCAyNTUsIDEpIl0sQXQ9WyJyZ2JhKDEyOCwgMTIsIDI0OSwgMSkiLCJyZ2JhKDAsIDI1NSwgNDgsIDEpIiwicmdiYSgyNTUsIDEzNiwgMjQ3LCAxKSIsInJnYmEoMjU1LCAyMjYsIDUwLCAxKSIsInJnYmEoMTUzLCA2NiwgMjMsIDEpIiwicmdiYSgyLCAxMzAsIDI1MCwgMSkiLCJyZ2JhKDI1NSwgMzUsIDM1LCAxKSIsInJnYmEoMCwgMjU1LCAyMzQsIDEpIl0sTnQ9W3tyZ2JhOiJyZ2JhKDEyOCwgMTIsIDI0OSwgMSkiLGhleDo4MzkxOTI5fSx7cmdiYToicmdiYSgwLCAyNTUsIDQ4LCAxKSIsaGV4OjY1MzI4fSx7cmdiYToicmdiYSgyNTUsIDEzNiwgMjQ3LCAxKSIsaGV4OjE2NzQ2NzQzfSx7cmdiYToicmdiYSgyNTUsIDIyNiwgNTAsIDEpIixoZXg6MTY3Njk1ODZ9LHtyZ2JhOiJyZ2JhKDE1MywgNjYsIDIzLCAxKSIsaGV4OjEwMDQzOTI3fSx7cmdiYToicmdiYSgyLCAxMzAsIDI1MCwgMSkiLGhleDoxNjQ2MDJ9LHtyZ2JhOiJyZ2JhKDI1NSwgMzUsIDM1LCAxKSIsaGV4OjE2NzIwNjc1fSx7cmdiYToicmdiYSgwLCAyNTUsIDIzNCwgMSkiLGhleDo2NTUxNH1dLEl0PSJyZ2JhKDI1NSwgMTUzLCAxMDIsIDEpIixNdD0icmdiYSgyMDQsIDIwNCwgMjA0LCAxKSI7IWZ1bmN0aW9uKCl7bGV0IHQ7Y29uc3QgZT1uZXcgQXJyYXkoMjU2KS5maWxsKCIiKS5tYXAoKHQ9Pm5ldyBBcnJheSgzKS5maWxsKCIiKSkpO2ZvcihsZXQgbj0wO248MjA7bisrKXtmb3IodD0wO3Q8MzI7dCsrKWVbdF1bMF09MTI4KzQqdCxlW3RdWzFdPTAsZVt0XVsyXT0wO2ZvcihlWzMyXVswXT0yNTUsZVszMl1bMV09MCxlWzMyXVsyXT0wLHQ9MDt0PDYzO3QrKyllWzMzK3RdWzBdPTI1NSxlWzMzK3RdWzFdPTQrNCp0LGVbMzMrdF1bMl09MDtmb3IoZVs5Nl1bMF09MjU0LGVbOTZdWzFdPTI1NSxlWzk2XVsyXT0yLHQ9MDt0PDYyO3QrKyllWzk3K3RdWzBdPTI1MC00KnQsZVs5Nyt0XVsxXT0yNTUsZVs5Nyt0XVsyXT02KzQqdDtmb3IoZVsxNTldWzBdPTEsZVsxNTldWzFdPTI1NSxlWzE1OV1bMl09MjU0LHQ9MDt0PDY0O3QrKyllWzE2MCt0XVswXT0wLGVbMTYwK3RdWzFdPTI1Mi00KnQsZVsxNjArdF1bMl09MjU1O2Zvcih0PTA7dDwzMjt0KyspZVsyMjQrdF1bMF09MCxlWzIyNCt0XVsxXT0wLGVbMjI0K3RdWzJdPTI1Mi00KnR9fSgpO3ZhciBGdD1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9kZWZhdWx0Q29sb3JzPVN0LHRoaXMuX2F0dHJpYnV0ZUNvbG9ycz1BdH1nZXQgZGVmYXVsdENvbG9ycygpe3JldHVybiB0aGlzLl9kZWZhdWx0Q29sb3JzfWdldCBhdHRyaWJ1dGVDb2xvcnMoKXtyZXR1cm4gdGhpcy5fYXR0cmlidXRlQ29sb3JzfWdldENvbG9yRnJvbUNvbmZpZyh0LGUsbixyKXt2YXIgaSxvLHMsYSx1O2lmKCJbb2JqZWN0IE9iamVjdF0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXRocm93IkNvbmZpZyBtdXN0IGJlIE9iamVjdCI7aWYoIltvYmplY3QgT2JqZWN0XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpdGhyb3ciUmVzdWx0IG11c3QgYmUgT2JqZWN0Ijtjb25zdHtib3JkZXJPcGFjaXR5OmM9MSxmaWxsT3BhY2l0eTpsPS42LGNvbG9ySW5kZXg6aD0wfT1uO3J8fChyPXt9KTtjb25zdCBmPW51bGw9PShpPW51bGw9PXQ/dm9pZCAwOnQudmFsaWQpfHxpLHttdWx0aUNvbG9ySW5kZXg6cD0tMSxzZWxlY3RlZDpkLGhvdmVyOmd9PXIseT17c2VsZWN0ZWQ6ZCxob3ZlcjpnLGJvcmRlck9wYWNpdHk6YyxmaWxsT3BhY2l0eTpsfTtsZXQgbT10aGlzLmRlZmF1bHRDb2xvcnM7aWYoKCEwPT09KG51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlQ29uZmlndXJhYmxlKXx8cD4tMSkmJihtPXRoaXMuYXR0cmlidXRlQ29sb3JzKSwhMT09PWYpcmV0dXJuIHZ0LmdldFRvb2xTdHJva2VBbmRGaWxsKEl0LHkpO2lmKCEwPT09KG51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlQ29uZmlndXJhYmxlKSl7Y29uc3Qgbj12dC5nZXRBdHRyaWJ1dGVJbmRleChudWxsPT10P3ZvaWQgMDp0LmF0dHJpYnV0ZSxudWxsPT1lP3ZvaWQgMDplLmF0dHJpYnV0ZUxpc3QpO2xldCByPW51bGw9PShzPW51bGw9PShvPW51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlTGlzdCk/dm9pZCAwOm8uZmluZCgoZT0+ZS52YWx1ZT09PShudWxsPT10P3ZvaWQgMDp0LmF0dHJpYnV0ZSkpKSk/dm9pZCAwOnMuY29sb3IsaT0iIjshciYmLTEhPT1uJiYocj1tW24lbS5sZW5ndGhdKSwtMT09PW4mJihyPU10KSxpPXZ0LnJnYmFTdHJpbmdUb0hleChyKS50b1N0cmluZygpLnN1YnN0cmluZygxKTtjb25zdCBjPXBhcnNlSW50KGksMTYpLGw9bnVsbCE9KHU9bnVsbD09KGE9TnRbbiVtLmxlbmd0aF0pP3ZvaWQgMDphLmhleCk/dToiIjtyZXR1cm4oKHQsZSk9Pnh0KHQsd3QoZSkpKSgoKHQsZSk9Pntmb3IodmFyIG4gaW4gZXx8KGU9e30pKUR0LmNhbGwoZSxuKSYmQ3QodCxuLGVbbl0pO2lmKGJ0KWZvcih2YXIgbiBvZiBidChlKSlFdC5jYWxsKGUsbikmJkN0KHQsbixlW25dKTtyZXR1cm4gdH0pKHt9LHZ0LmdldFRvb2xTdHJva2VBbmRGaWxsKHIseSkpLHtoZXg6Y3x8bH0pfXJldHVybiBwPi0xP3Z0LmdldFRvb2xTdHJva2VBbmRGaWxsKG1bcCVtLmxlbmd0aF0seSk6dnQuZ2V0VG9vbFN0cm9rZUFuZEZpbGwobVtoJW0ubGVuZ3RoXSx5KX1nZXRDb2xvckJ5Q29uZmlnKHthdHRyaWJ1dGU6dCxjb25maWc6ZSxzdHlsZTpufSl7dmFyIHIsaSxvO2lmKCEwPT09KG51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlQ29uZmlndXJhYmxlKSl7Y29uc3Qgcz1udWxsPT0oaT1udWxsPT0ocj1udWxsPT1lP3ZvaWQgMDplLmF0dHJpYnV0ZUxpc3QpP3ZvaWQgMDpyLmZpbmQoKGU9PmUudmFsdWU9PT10KSkpP3ZvaWQgMDppLmNvbG9yO2lmKHMpcmV0dXJuIHZ0LmdldFRvb2xDb2xvckxpc3QocyxudWxsPT1uP3ZvaWQgMDpuLmJvcmRlck9wYWNpdHksbnVsbD09bj92b2lkIDA6bi5maWxsT3BhY2l0eSk7aWYobnVsbD09bj92b2lkIDA6bi5hdHRyaWJ1dGVDb2xvcil7Y29uc3Qgcj12dC5nZXRBdHRyaWJ1dGVJbmRleCh0LG51bGwhPShvPW51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlTGlzdCk/bzpbXSklOCsxO3JldHVybiBuLmF0dHJpYnV0ZUNvbG9yW3JdfX1pZihuKXtjb25zdHtjb2xvcjp0LHRvb2xDb2xvcjplfT1uO2lmKGUpcmV0dXJuIGVbdF19cmV0dXJuIHZ0LmdldFRvb2xDb2xvckxpc3QoTXQpfX0sVHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5LE90PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsTHQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxQdD1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLFJ0PSh0LGUsbik9PmUgaW4gdD9UdCh0LGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm59KTp0W2VdPW4sQnQ9KHQsZSk9Pntmb3IodmFyIG4gaW4gZXx8KGU9e30pKUx0LmNhbGwoZSxuKSYmUnQodCxuLGVbbl0pO2lmKE90KWZvcih2YXIgbiBvZiBPdChlKSlQdC5jYWxsKGUsbikmJlJ0KHQsbixlW25dKTtyZXR1cm4gdH0sa3Q9KHQsZSk9Pnt2YXIgbj17fTtmb3IodmFyIHIgaW4gdClMdC5jYWxsKHQscikmJmUuaW5kZXhPZihyKTwwJiYobltyXT10W3JdKTtpZihudWxsIT10JiZPdClmb3IodmFyIHIgb2YgT3QodCkpZS5pbmRleE9mKHIpPDAmJlB0LmNhbGwodCxyKSYmKG5bcl09dFtyXSk7cmV0dXJuIG59O2NvbnN0IHp0PSJzdGVwXzEiLGp0PWNsYXNze3N0YXRpYyBnZW5Db2xvckJ5Q29vcmQodCxlLG4pe3JldHVybiBuPD0wP1sxMjgsMTI4LDEyOF06bjw1P1syNTUsMCwwXTpuPDEwP1swLDI1NSwwXTpbMCwwLDI1NV19c3RhdGljIGdldFN0YW5kYXJkQ29sb3JCeUNvb3JkKHQsZSxuKXtyZXR1cm4gdGhpcy5nZW5Db2xvckJ5Q29vcmQodCxlLG4pLm1hcCgodD0+dC8yNTUpKX1zdGF0aWMgcGFyc2VQb2ludENsb3VkQ3VycmVudFJlc3VsdCh0KXt2YXIgZSxuLHIsaSxvLHMsYSx1O2NvbnN0IGM9dGhpcy5qc29uUGFyc2VyKHQpLGw9bnVsbCE9KGU9bnVsbD09Yz92b2lkIDA6Y1t6dF0pP2U6e30saD1udWxsIT0obj1udWxsPT1sP3ZvaWQgMDpsLnJlc3VsdCk/bjpbXSxmPW51bGwhPShpPW51bGwhPShyPW51bGw9PWw/dm9pZCAwOmwucmVzdWx0UG9seWdvbik/cjpudWxsPT1sP3ZvaWQgMDpsLnJlbmRlclBvbHlnb24pP2k6W10scD1udWxsIT0obz1udWxsPT1sP3ZvaWQgMDpsLnJlc3VsdExpbmUpP286W10sZD1udWxsIT0ocz1udWxsPT1sP3ZvaWQgMDpsLnJlc3VsdFBvaW50KT9zOltdLGc9bnVsbCE9KGE9bnVsbD09bD92b2lkIDA6bC5zZWdtZW50YXRpb24pP2E6W10seT1udWxsIT0odT1udWxsPT1sP3ZvaWQgMDpsLnJlc3VsdFJlY3QpP3U6W107cmV0dXJue2JveFBhcmFtc0xpc3Q6aC5maWx0ZXIoKHQ9PiF0aGlzLmhhc0Vycm9yVmFsdWVPYmoodCkpKSxwb2x5Z29uTGlzdDpmLGxpbmVMaXN0OnAsc3BoZXJlUGFyYW1zTGlzdDpkLHNlZ21lbnRhdGlvbjpnLHJlY3RMaXN0Onl9fXN0YXRpYyBoYXNFcnJvclZhbHVlT2JqKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fE51bWJlci5pc05hTih0KX1yZXR1cm4gZnVuY3Rpb24gdChuKXtpZigib2JqZWN0IiE9dHlwZW9mIG58fG51bGw9PT1uKXJldHVybiBlKG4pO2Zvcihjb25zdCByIGluIG4pe2NvbnN0IGk9bltyXTtpZihlKGkpfHwib2JqZWN0Ij09dHlwZW9mIGkmJnQoaSkpcmV0dXJuITB9cmV0dXJuITF9KHQpfXN0YXRpYyBnZXRCb3hQYXJhbXNGcm9tUmVzdWx0TGlzdCh0KXtjb25zdHtib3hQYXJhbXNMaXN0OmV9PXRoaXMucGFyc2VQb2ludENsb3VkQ3VycmVudFJlc3VsdCh0KTtyZXR1cm4gZX1zdGF0aWMgZ2V0UmVjdFBhcmFtc0Zyb21SZXN1bHRMaXN0KHQpe3ZhciBlLG47Y29uc3Qgcj10aGlzLmpzb25QYXJzZXIodCk7cmV0dXJuIG51bGwhPShuPW51bGw9PShlPW51bGw9PXI/dm9pZCAwOnJbenRdKT92b2lkIDA6ZS5yZXN1bHRSZWN0KT9uOltdfXN0YXRpYyBnZXRTcGhlcmVQYXJhbXNGcm9tUmVzdWx0TGlzdCh0KXt2YXIgZSxuO2NvbnN0IHI9dGhpcy5qc29uUGFyc2VyKHQpO3JldHVybiBudWxsIT0obj1udWxsPT0oZT1udWxsPT1yP3ZvaWQgMDpyW3p0XSk/dm9pZCAwOmUucmVzdWx0UG9pbnQpP246W119c3RhdGljIGdldFNlZ21lbnRGcm9tUmVzdWx0TGlzdCh0KXt2YXIgZSxuO2NvbnN0IHI9dGhpcy5qc29uUGFyc2VyKHQpO3JldHVybiBudWxsIT0obj1udWxsPT0oZT1udWxsPT1yP3ZvaWQgMDpyW3p0XSk/dm9pZCAwOmUuc2VnbWVudGF0aW9uKT9uOltdfXN0YXRpYyBnZXRMaW5lTGlzdEZyb21SZXN1bHRMaXN0KHQpe3ZhciBlLG47Y29uc3Qgcj10aGlzLmpzb25QYXJzZXIodCk7cmV0dXJuIG51bGwhPShuPW51bGw9PShlPW51bGw9PXI/dm9pZCAwOnJbenRdKT92b2lkIDA6ZS5yZXN1bHRMaW5lKT9uOltdfXN0YXRpYyBnZXRQb2x5Z29uTGlzdEZyb21SZXN1bHRMaXN0KHQpe3ZhciBlLG4scixpO2NvbnN0IG89dGhpcy5qc29uUGFyc2VyKHQpO3JldHVybiBudWxsIT0oaT1udWxsIT0ocj1udWxsPT0oZT1udWxsPT1vP3ZvaWQgMDpvW3p0XSk/dm9pZCAwOmUucmVzdWx0UG9seWdvbik/cjpudWxsPT0obj1udWxsPT1vP3ZvaWQgMDpvW3p0XSk/dm9pZCAwOm4ucmVuZGVyUG9seWdvbik/aTpbXX1zdGF0aWMgZ2V0RnJvbnRWaWV3UG9seWdvbih0KXtjb25zdHtjZW50ZXI6e3g6ZSx5Om4sejpyfSx3aWR0aDppLGhlaWdodDpvLGRlcHRoOnN9PXQ7cmV0dXJuW3t4OmUraS8yLHk6bitvLzIsejpyLXMvMn0se3g6ZStpLzIseTpuK28vMix6OnIrcy8yfSx7eDplK2kvMix5Om4tby8yLHo6citzLzJ9LHt4OmUraS8yLHk6bi1vLzIsejpyLXMvMn0se3g6ZStpLzIseTpuK28vMix6OnItcy8yfV19c3RhdGljIGdldEJhY2tWaWV3UG9seWdvbih0KXtjb25zdHtjZW50ZXI6e3g6ZSx5Om4sejpyfSx3aWR0aDppLGhlaWdodDpvLGRlcHRoOnN9PXQ7cmV0dXJuW3t4OmUtaS8yLHk6bi1vLzIsejpyLXMvMn0se3g6ZS1pLzIseTpuK28vMix6OnItcy8yfSx7eDplLWkvMix5Om4rby8yLHo6citzLzJ9LHt4OmUtaS8yLHk6bi1vLzIsejpyK3MvMn0se3g6ZS1pLzIseTpuLW8vMix6OnItcy8yfV19c3RhdGljIGdldEFsbERpcmVjdGlvbkxpbmUodCl7Y29uc3R7Y2VudGVyOnt4OmUseTpuLHo6cn0sd2lkdGg6aSxoZWlnaHQ6byxkZXB0aDpzfT10O3JldHVybltbe3g6ZStpLzIseTpuLW8vMix6OnItcy8yfSx7eDplLWkvMix5Om4tby8yLHo6ci1zLzJ9XSxbe3g6ZStpLzIseTpuK28vMix6OnItcy8yfSx7eDplLWkvMix5Om4rby8yLHo6ci1zLzJ9XSxbe3g6ZStpLzIseTpuLW8vMix6OnIrcy8yfSx7eDplLWkvMix5Om4tby8yLHo6citzLzJ9XSxbe3g6ZStpLzIseTpuK28vMix6OnIrcy8yfSx7eDplLWkvMix5Om4rby8yLHo6citzLzJ9XV19c3RhdGljIGdldEFsbFZpZXdEYXRhKHQpe3JldHVyblt7dHlwZToicG9seWdvbiIscG9pbnRMaXN0OnRoaXMuZ2V0RnJvbnRWaWV3UG9seWdvbih0KX0se3R5cGU6InBvbHlnb24iLHBvaW50TGlzdDp0aGlzLmdldEJhY2tWaWV3UG9seWdvbih0KX0sLi4udGhpcy5nZXRBbGxEaXJlY3Rpb25MaW5lKHQpLm1hcCgodD0+KHt0eXBlOiJsaW5lIixwb2ludExpc3Q6dH0pKSldfXN0YXRpYyB0cmFuc2ZlckJveDJLaXR0aSh0KXt2YXIgZSxuLHI7cmV0dXJue2hlaWdodDpudWxsIT0oZT10LmRlcHRoKT9lOjAsbGVuZ3RoOm51bGwhPShuPXQud2lkdGgpP246MCx3aWR0aDpudWxsIT0ocj10LmhlaWdodCk/cjowLHJvdGF0aW9uX3k6dC5yb3RhdGlvbj90aGlzLnRyYW5zZmVyUm90YXRpb24yS2l0dGlSb3RhdGlvbl95KHQucm90YXRpb24pOjB9fXN0YXRpYyByZXN0cmljdEFuZ2xlUmFuZ2UodCl7Y29uc3QgZT0yKk1hdGguUEk7bGV0IG49dCVlO3JldHVybiBuPDA/ZStuOm59c3RhdGljIHRyYW5zZmVyUm90YXRpb24yS2l0dGlSb3RhdGlvbl95KHQpe2lmKHQ8MClyZXR1cm4tdDtjb25zdCBlPTIqTWF0aC5QSS10O3JldHVybiBlPk1hdGguUEkmJmU8MipNYXRoLlBJPy0xKnQ6MipNYXRoLlBJLXR9c3RhdGljIGdldEFsbFBvaW50Q2xvdWRSZXN1bHQoe2ltZ0xpc3Q6dCxzdGVwOmU9MSxleHRyYUJveExpc3Q6bixleHRyYVNwaGVyZUxpc3Q6cj1bXSxpZ25vcmVJbmRleExpc3Q6aT1bXSxpc1ByZVJlc3VsdDpvPSExfSl7Y29uc3Qgcz10LmZpbHRlcigoKHQsZSk9PiEobnVsbD09aT92b2lkIDA6aS5pbmNsdWRlcyhlKSkpKS5tYXAoKHQ9Pnt2YXIgZTtyZXR1cm4gdGhpcy5qc29uUGFyc2VyKG51bGwhPShlPW51bGw9PXQ/dm9pZCAwOnRbbz8icHJlUmVzdWx0IjoicmVzdWx0Il0pP2U6IiIpfSkpLGE9YHN0ZXBfJHtlfWA7bGV0IHU9W107cmV0dXJuIHMuZm9yRWFjaCgodD0+e3ZhciBlLG47KG51bGw9PShuPW51bGw9PShlPW51bGw9PXQ/dm9pZCAwOnRbYV0pP3ZvaWQgMDplLnJlc3VsdCk/dm9pZCAwOm4ubGVuZ3RoKT4wJiYodT11LmNvbmNhdCh0W2FdLnJlc3VsdCkpfSkpLG4mJih1PXUuY29uY2F0KG4pKSxyJiYodT11LmNvbmNhdChyKSksdX1zdGF0aWMgZ2V0SW5kZXhCeVRyYWNrSUQodCxlLG4pe2NvbnN0IHI9W10saT1lLm1hcCgodD0+e3ZhciBlO3JldHVybiB0aGlzLmpzb25QYXJzZXIobnVsbCE9KGU9bnVsbD09dD92b2lkIDA6dFtuPyJwcmVSZXN1bHQiOiJyZXN1bHQiXSk/ZToiIil9KSk7cmV0dXJuIGkuZm9yRWFjaCgoKGUsbik9Pnt2YXIgaTtjb25zdCBvPW51bGw9PShpPW51bGw9PWU/dm9pZCAwOmUuc3RlcF8xKT92b2lkIDA6aS5yZXN1bHQ7KG51bGw9PW8/dm9pZCAwOm8ubGVuZ3RoKT4wJiYobnVsbD09bz92b2lkIDA6by5maW5kKChlPT4obnVsbD09ZT92b2lkIDA6ZS50cmFja0lEKT09PXQpKSkmJnIucHVzaChuKX0pKSxyfXN0YXRpYyBnZXROZXh0VHJhY2tJRCh7aW1nTGlzdDp0LHN0ZXA6ZT0xLGV4dHJhQm94TGlzdDpuLGV4dHJhU3BoZXJlTGlzdDpyfSl7bGV0IGk9MTtyZXR1cm4gdGhpcy5nZXRBbGxQb2ludENsb3VkUmVzdWx0KHtpbWdMaXN0OnQsc3RlcDplLGV4dHJhQm94TGlzdDpuLGV4dHJhU3BoZXJlTGlzdDpyfSkuZm9yRWFjaCgodD0+eyJudW1iZXIiPT10eXBlb2YobnVsbD09dD92b2lkIDA6dC50cmFja0lEKSYmdC50cmFja0lEPj1pJiYoaT10LnRyYWNrSUQrMSl9KSksaX1zdGF0aWMgYmF0Y2hVcGRhdGVUcmFja0lEKHtpZDp0LG5ld0lEOmUscmVzdWx0Om4sc3RlcDpyPTF9KXt2YXIgaTtjb25zdCBvPWBzdGVwXyR7cn1gLHM9dGhpcy5qc29uUGFyc2VyKG4pLGE9bnVsbD09KGk9bnVsbD09cz92b2lkIDA6c1tvXSk/dm9pZCAwOmkucmVzdWx0O3JldHVybiBhPyhhLmZvckVhY2goKG49PigobnVsbD09bj92b2lkIDA6bi50cmFja0lEKT09PXQmJihuLnRyYWNrSUQ9ZSksbikpKSxKU09OLnN0cmluZ2lmeShzKSk6bn1zdGF0aWMgYmF0Y2hVcGRhdGVUcmFja0lEQ2hlY2soe25ld0lEOnQscmVzdWx0OmUsc3RlcDpuPTF9KXt2YXIgcjtjb25zdCBpPWBzdGVwXyR7bn1gLG89dGhpcy5qc29uUGFyc2VyKGUpLHM9bnVsbD09KHI9bnVsbD09bz92b2lkIDA6b1tpXSk/dm9pZCAwOnIucmVzdWx0O3JldHVybiEhcyYmcy5zb21lKChlPT5lLnRyYWNrSUQ9PT10KSl9c3RhdGljIGJhdGNoVXBkYXRlUmVzdWx0QnlUcmFja0lEKHtpZDp0LG5ld0RhdGE6ZSxyZXN1bHQ6bixzdGVwOnI9MX0pe3ZhciBpO2NvbnN0IG89YHN0ZXBfJHtyfWAscz10aGlzLmpzb25QYXJzZXIobiksYT1udWxsPT0oaT1udWxsPT1zP3ZvaWQgMDpzW29dKT92b2lkIDA6aS5yZXN1bHQ7cmV0dXJuIGE/KHNbb10ucmVzdWx0PWEubWFwKChuPT57aWYoKG51bGw9PW4/dm9pZCAwOm4udHJhY2tJRCk9PT10KXtjb25zdCB0PUJ0KHt9LGUpLHI9dC5zdWJBdHRyaWJ1dGU7cmV0dXJuIHImJm4uc3ViQXR0cmlidXRlJiZPYmplY3QuYXNzaWduKHQse3N1YkF0dHJpYnV0ZTpCdChCdCh7fSxuLnN1YkF0dHJpYnV0ZSkscil9KSxCdChCdCh7fSxuKSx0KX1yZXR1cm4gbn0pKSxKU09OLnN0cmluZ2lmeShzKSk6bn1zdGF0aWMgZ2V0TWF4U2l6ZUZyb21Cb3goe3RyYWNrSUQ6dCxpbWdMaXN0OmV9KXtsZXQgbjtyZXR1cm4gZS5mb3JFYWNoKChlPT57dmFyIHI7Y29uc3QgaT10aGlzLmpzb25QYXJzZXIoZS5yZXN1bHQpLG89bnVsbD09KHI9bnVsbD09aT92b2lkIDA6aVt6dF0pP3ZvaWQgMDpyLnJlc3VsdDshb3x8by5mb3JFYWNoKChlPT57aWYoKG51bGw9PWU/dm9pZCAwOmUudHJhY2tJRCk9PT10KXtpZighbilyZXR1cm4gdm9pZChuPXt3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodCxkZXB0aDplLmRlcHRofSk7ZS53aWR0aD5uLndpZHRoJiYobi53aWR0aD1lLndpZHRoKSxlLmhlaWdodD5uLmhlaWdodCYmKG4uaGVpZ2h0PWUuaGVpZ2h0KSxlLmRlcHRoPm4uZGVwdGgmJihuLmRlcHRoPWUuZGVwdGgpfX0pKX0pKSxufXN0YXRpYyBnZXRTdWJBdHRyaWJ1dGVOYW1lKHQsZSl7Y29uc3Qgbj1lLmlucHV0TGlzdDtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkubWFwKCgoW3QsZV0pPT57dmFyIHI7Y29uc3QgaT1uLmZpbmQoKGU9PmUudmFsdWU9PT10KSk7aWYoaSl7Y29uc3QgdD1udWxsPT0ocj1udWxsPT1pP3ZvaWQgMDppLnN1YlNlbGVjdGVkKT92b2lkIDA6ci5maW5kKCh0PT50LnZhbHVlPT09ZSkpO2lmKHQpcmV0dXJue2xhYmVsOmkua2V5LHZhbHVlOnQua2V5fX1yZXR1cm57bGFiZWw6dCx2YWx1ZTplfX0pKX1zdGF0aWMgZ2V0SW50ZXJzZWN0aW9uQnlTbG9wZSh0KXtjb25zdHtwMTplLGxpbmUxOm4scDI6cixsaW5lMjppfT10O2lmKGUueD09PXIueCYmZS55PT09ci55KXJldHVybiBlO2xldCBvLHM7blswXS54PT09blsxXS54JiYobz1lLngpLG5bMF0ueT09PW5bMV0ueSYmKHM9ZS55KSxpWzBdLng9PT1pWzFdLngmJihvPXIueCksaVswXS55PT09aVsxXS55JiYocz1yLnkpO2NvbnN0IGE9KG5bMF0ueS1uWzFdLnkpLyhuWzBdLngtblsxXS54KSx1PShpWzBdLnktaVsxXS55KS8oaVswXS54LWlbMV0ueCk7cmV0dXJuIG89bnVsbCE9bz9vOihlLnktci55LWEqZS54K3Uqci54KS8odS1hKSxzPW51bGwhPXM/czplLnktYSooZS54LW8pLHt4Om8seTpzfX1zdGF0aWMgZ2V0Q2xvdWRLZXlzKHQsZSxuKXtyZXR1cm5bdCxlLG5dLmpvaW4oIkAiKX1zdGF0aWMgc3BsaXRQb2ludHNGcm9tSW5kZXhlcyh0LGUpe2NvbnN0IG49bmV3IFNldDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTEpbi5hZGQoZVt0XSk7Y29uc3Qgcj1bXTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrPTEpbi5oYXModFtlXSl8fHIucHVzaCh0W2VdKTtyZXR1cm4gcn1zdGF0aWMgc3BsaXRQb2ludHNGcm9tUG9pbnRzKHQsZSl7Y29uc3Qgbj1uZXcgTWFwO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9MyluLnNldChqdC5nZXRDbG91ZEtleXMoZVt0XSxlW3QrMV0sZVt0KzJdKSwxKTtjb25zdCByPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9Myl7Y29uc3QgaT1qdC5nZXRDbG91ZEtleXModFtlXSx0W2UrMV0sdFtlKzJdKTtuLmhhcyhpKXx8ci5wdXNoKHRbZV0sdFtlKzFdLHRbZSsyXSl9cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkocil9c3RhdGljIGdldERlZmF1bHRPcnRob2dyYXBoaWNQYXJhbXModCl7cmV0dXJue2xlZnQ6LXQud2lkdGgvMixyaWdodDp0LndpZHRoLzIsdG9wOnQuaGVpZ2h0LzIsYm90dG9tOi10LmhlaWdodC8yLG5lYXI6LjEsZmFyOjFlNH19fTtsZXQgVXQ9anQ7VXQuanNvblBhcnNlcj10PT57dHJ5e3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKHQpe3JldHVybnt9fX0sVXQudHJhbnNmZXJDYW52YXMyV29ybGQ9KHQsZSk9Pntjb25zdHt3aWR0aDpuLGhlaWdodDpyfT1lLGk9dCx7eDpvLHk6c309aSxhPWt0KGksWyJ4IiwieSJdKTtyZXR1cm4gQnQoe3g6ci8yLXMseTotKG8tbi8yKX0sYSl9LFV0LnBvaW50TGlzdFRyYW5zZmVyQ2FudmFzMldvcmxkPSh0LGUpPT5udWxsPT10P3ZvaWQgMDp0Lm1hcCgodD0+QnQoQnQoe30sdCksanQudHJhbnNmZXJDYW52YXMyV29ybGQodCxlKSkpKSxVdC50cmFuc2ZlcldvcmxkMkNhbnZhcz0odCxlKT0+e2NvbnN0e3dpZHRoOm4saGVpZ2h0OnJ9PWUsaT10LHt4Om8seTpzfT1pLGE9a3QoaSxbIngiLCJ5Il0pO3JldHVybiBCdCh7eDpuLzItcyx5OnIvMi1vfSxhKX07Y29uc3QgcXQ9KHQsZSk9PlsuLi50LC4uLmVdO2NsYXNzIFZ0e3N0YXRpYyB0cmFuc2Zlck1hdHJpeDM0RnJvbUtpdHRpMlRocmVlKHQpe3JldHVyblsuLi50LnJlZHVjZShxdCxbXSksMCwwLDAsMV19c3RhdGljIHRyYW5zZmVyTWF0cml4MzNGcm9tS2l0dGkyVGhyZWUodCl7cmV0dXJuWy4uLnQucmVkdWNlKCgodCxlKT0+Wy4uLnQsLi4uZV0uY29uY2F0KFswXSkpLFtdKSwwLDAsMCwxXX19dmFyIEd0LFl0LFh0LFd0LEh0LFp0LEt0LEp0LFF0LCR0OyhZdD1HdHx8KEd0PXt9KSkuRnJvbnQ9IkZST05UIixZdC5CYWNrPSJCQUNLIixZdC5MZWZ0PSJMRUZUIixZdC5SaWdodD0iUklHSFQiLFl0LlRvcD0iVE9QIixZdC5MRlQ9IkxFRlRfRlJPTlRfVE9QIixZdC5SQlQ9IlJJR0hUX0JBQ0tfVE9QIixmdW5jdGlvbih0KXt0LkRldGVjdGlvbj0iRGV0ZWN0aW9uIix0LlNlZ21lbnRhdGlvbj0iU2VnbWVudGF0aW9uIn0oWHR8fChYdD17fSkpLGZ1bmN0aW9uKHQpe3QuQWRkPSJBREQiLHQuUmVtb3ZlPSJSRU1PVkUifShXdHx8KFd0PXt9KSksZnVuY3Rpb24odCl7dC5Db3Zlcj0iQ292ZXIiLHQuVW5jb3Zlcj0iVW5jb3ZlciJ9KEh0fHwoSHQ9e30pKSxmdW5jdGlvbih0KXt0LkZvY3VzPSJGb2N1cyIsdC5VbmZvY3VzPSJVbmZvY3VzIn0oWnR8fChadD17fSkpLGZ1bmN0aW9uKHQpe3QuUmVhZHk9IlJFQURZIix0LkNoZWNrPSJDSEVDSyIsdC5FZGl0PSJFRElUIix0LkhvdmVyPSJIT1ZFUiJ9KEt0fHwoS3Q9e30pKSxmdW5jdGlvbih0KXt0W3QuTm9ybWFsPTBdPSJOb3JtYWwiLHRbdC5PbW5pQ2FtZXJhPTFdPSJPbW5pQ2FtZXJhIix0W3QuS2FubmFsYUJyYW5kdD0yXT0iS2FubmFsYUJyYW5kdCIsdFt0Lk9tbmlDYW1lcmExMVY9M109Ik9tbmlDYW1lcmExMVYifShKdHx8KEp0PXt9KSksZnVuY3Rpb24odCl7dFt0LkxpbmU9MF09IkxpbmUiLHRbdC5DdXJ2ZT0xXT0iQ3VydmUifShRdHx8KFF0PXt9KSksZnVuY3Rpb24odCl7dFt0LlBlcmlvZD0wXT0iUGVyaW9kIix0W3QuVGltZT0xXT0iVGltZSJ9KCR0fHwoJHQ9e30pKTt2YXIgdGU9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBlZSh0KXt2YXIgZT17ZXhwb3J0czp7fX07cmV0dXJuIHQoZSxlLmV4cG9ydHMpLGUuZXhwb3J0c31lZSgoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24oKXt2YXIgbixyPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIixpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixvPSJfX2xvZGFzaF9wbGFjZWhvbGRlcl9fIixzPTE2LGE9MzIsdT02NCxjPTEyOCxsPTI1NixoPTEvMCxmPTkwMDcxOTkyNTQ3NDA5OTEscD1OYU4sZD00Mjk0OTY3Mjk1LGc9ZC0xLHk9ZD4+PjEsbT1bWyJhcnkiLGNdLFsiYmluZCIsMV0sWyJiaW5kS2V5IiwyXSxbImN1cnJ5Iiw4XSxbImN1cnJ5UmlnaHQiLHNdLFsiZmxpcCIsNTEyXSxbInBhcnRpYWwiLGFdLFsicGFydGlhbFJpZ2h0Iix1XSxbInJlYXJnIixsXV0sdj0iW29iamVjdCBBcmd1bWVudHNdIixfPSJbb2JqZWN0IEFycmF5XSIseD0iW29iamVjdCBCb29sZWFuXSIsdz0iW29iamVjdCBEYXRlXSIsYj0iW29iamVjdCBFcnJvcl0iLEQ9IltvYmplY3QgRnVuY3Rpb25dIixFPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsQz0iW29iamVjdCBNYXBdIixTPSJbb2JqZWN0IE51bWJlcl0iLEE9IltvYmplY3QgT2JqZWN0XSIsTj0iW29iamVjdCBQcm9taXNlXSIsST0iW29iamVjdCBSZWdFeHBdIixNPSJbb2JqZWN0IFNldF0iLEY9IltvYmplY3QgU3RyaW5nXSIsVD0iW29iamVjdCBTeW1ib2xdIixPPSJbb2JqZWN0IFdlYWtNYXBdIixMPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsUD0iW29iamVjdCBEYXRhVmlld10iLFI9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsQj0iW29iamVjdCBGbG9hdDY0QXJyYXldIixrPSJbb2JqZWN0IEludDhBcnJheV0iLHo9IltvYmplY3QgSW50MTZBcnJheV0iLGo9IltvYmplY3QgSW50MzJBcnJheV0iLFU9IltvYmplY3QgVWludDhBcnJheV0iLHE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixWPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsRz0iW29iamVjdCBVaW50MzJBcnJheV0iLFk9L1xiX19wIFwrPSAnJzsvZyxYPS9cYihfX3AgXCs9KSAnJyBcKy9nLFc9LyhfX2VcKC4qP1wpfFxiX190XCkpIFwrXG4nJzsvZyxIPS8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxaPS9bJjw+IiddL2csSz1SZWdFeHAoSC5zb3VyY2UpLEo9UmVnRXhwKFouc291cmNlKSxRPS88JS0oW1xzXFNdKz8pJT4vZywkPS88JShbXHNcU10rPyklPi9nLHR0PS88JT0oW1xzXFNdKz8pJT4vZyxldD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxudD0vXlx3KiQvLHJ0PS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLGl0PS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxvdD1SZWdFeHAoaXQuc291cmNlKSxzdD0vXlxzKy8sYXQ9L1xzLyx1dD0vXHsoPzpcblwvXCogXFt3cmFwcGVkIHdpdGggLitcXSBcKlwvKT9cbj8vLGN0PS9ce1xuXC9cKiBcW3dyYXBwZWQgd2l0aCAoLispXF0gXCovLGx0PS8sPyAmIC8saHQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZyxmdD0vWygpPSx7fVxbXF1cL1xzXS8scHQ9L1xcKFxcKT8vZyxkdD0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2csZ3Q9L1x3KiQvLHl0PS9eWy0rXTB4WzAtOWEtZl0rJC9pLG10PS9eMGJbMDFdKyQvaSx2dD0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxfdD0vXjBvWzAtN10rJC9pLHh0PS9eKD86MHxbMS05XVxkKikkLyx3dD0vW1x4YzAtXHhkNlx4ZDgtXHhmNlx4ZjgtXHhmZlx1MDEwMC1cdTAxN2ZdL2csYnQ9LygkXikvLER0PS9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZyxFdD0iXFx1ZDgwMC1cXHVkZmZmIixDdD0iXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmIixTdD0iXFx1MjcwMC1cXHUyN2JmIixBdD0iYS16XFx4ZGYtXFx4ZjZcXHhmOC1cXHhmZiIsTnQ9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLEl0PSJcXHVmZTBlXFx1ZmUwZiIsTXQ9IlxceGFjXFx4YjFcXHhkN1xceGY3XFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4YmZcXHUyMDAwLVxcdTIwNmYgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLEZ0PSJbJ+KAmV0iLFR0PSJbIitFdCsiXSIsT3Q9IlsiK010KyJdIixMdD0iWyIrQ3QrIl0iLFB0PSJcXGQrIixSdD0iWyIrU3QrIl0iLEJ0PSJbIitBdCsiXSIsa3Q9IlteIitFdCtNdCtQdCtTdCtBdCtOdCsiXSIsenQ9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsanQ9IlteIitFdCsiXSIsVXQ9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHF0PSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixWdD0iWyIrTnQrIl0iLEd0PSJcXHUyMDBkIixZdD0iKD86IitCdCsifCIra3QrIikiLFh0PSIoPzoiK1Z0KyJ8IitrdCsiKSIsV3Q9Iig/Olsn4oCZXSg/OmR8bGx8bXxyZXxzfHR8dmUpKT8iLEh0PSIoPzpbJ+KAmV0oPzpEfExMfE18UkV8U3xUfFZFKSk/IixadD0iKD86IitMdCsifCIrenQrIikiKyI/IixLdD0iWyIrSXQrIl0/IixKdD1LdCtadCsoIig/OiIrR3QrIig/OiIrW2p0LFV0LHF0XS5qb2luKCJ8IikrIikiK0t0K1p0KyIpKiIpLFF0PSIoPzoiK1tSdCxVdCxxdF0uam9pbigifCIpKyIpIitKdCwkdD0iKD86IitbanQrTHQrIj8iLEx0LFV0LHF0LFR0XS5qb2luKCJ8IikrIikiLGVlPVJlZ0V4cChGdCwiZyIpLG5lPVJlZ0V4cChMdCwiZyIpLHJlPVJlZ0V4cCh6dCsiKD89Iit6dCsiKXwiKyR0K0p0LCJnIiksaWU9UmVnRXhwKFtWdCsiPyIrQnQrIisiK1d0KyIoPz0iK1tPdCxWdCwiJCJdLmpvaW4oInwiKSsiKSIsWHQrIisiK0h0KyIoPz0iK1tPdCxWdCtZdCwiJCJdLmpvaW4oInwiKSsiKSIsVnQrIj8iK1l0KyIrIitXdCxWdCsiKyIrSHQsIlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoPz1cXGJ8W2Etel9dKSIsIlxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXGR0aCkoPz1cXGJ8W0EtWl9dKSIsUHQsUXRdLmpvaW4oInwiKSwiZyIpLG9lPVJlZ0V4cCgiWyIrR3QrRXQrQ3QrSXQrIl0iKSxzZT0vW2Etel1bQS1aXXxbQS1aXXsyfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLyxhZT1bIkFycmF5IiwiQnVmZmVyIiwiRGF0YVZpZXciLCJEYXRlIiwiRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGdW5jdGlvbiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiTWFwIiwiTWF0aCIsIk9iamVjdCIsIlByb21pc2UiLCJSZWdFeHAiLCJTZXQiLCJTdHJpbmciLCJTeW1ib2wiLCJUeXBlRXJyb3IiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiV2Vha01hcCIsIl8iLCJjbGVhclRpbWVvdXQiLCJpc0Zpbml0ZSIsInBhcnNlSW50Iiwic2V0VGltZW91dCJdLHVlPS0xLGNlPXt9O2NlW1JdPWNlW0JdPWNlW2tdPWNlW3pdPWNlW2pdPWNlW1VdPWNlW3FdPWNlW1ZdPWNlW0ddPSEwLGNlW3ZdPWNlW19dPWNlW0xdPWNlW3hdPWNlW1BdPWNlW3ddPWNlW2JdPWNlW0RdPWNlW0NdPWNlW1NdPWNlW0FdPWNlW0ldPWNlW01dPWNlW0ZdPWNlW09dPSExO3ZhciBsZT17fTtsZVt2XT1sZVtfXT1sZVtMXT1sZVtQXT1sZVt4XT1sZVt3XT1sZVtSXT1sZVtCXT1sZVtrXT1sZVt6XT1sZVtqXT1sZVtDXT1sZVtTXT1sZVtBXT1sZVtJXT1sZVtNXT1sZVtGXT1sZVtUXT1sZVtVXT1sZVtxXT1sZVtWXT1sZVtHXT0hMCxsZVtiXT1sZVtEXT1sZVtPXT0hMTt2YXIgaGU9eyJcXCI6IlxcIiwiJyI6IiciLCJcbiI6Im4iLCJcciI6InIiLCJcdTIwMjgiOiJ1MjAyOCIsIlx1MjAyOSI6InUyMDI5In0sZmU9cGFyc2VGbG9hdCxwZT1wYXJzZUludCxkZT0ib2JqZWN0Ij09dHlwZW9mIHRlJiZ0ZSYmdGUuT2JqZWN0PT09T2JqZWN0JiZ0ZSxnZT0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLHllPWRlfHxnZXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxtZT1lJiYhZS5ub2RlVHlwZSYmZSx2ZT1tZSYmdCYmIXQubm9kZVR5cGUmJnQsX2U9dmUmJnZlLmV4cG9ydHM9PT1tZSx4ZT1fZSYmZGUucHJvY2Vzcyx3ZT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gdmUmJnZlLnJlcXVpcmUmJnZlLnJlcXVpcmUoInV0aWwiKS50eXBlc3x8eGUmJnhlLmJpbmRpbmcmJnhlLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpLGJlPXdlJiZ3ZS5pc0FycmF5QnVmZmVyLERlPXdlJiZ3ZS5pc0RhdGUsRWU9d2UmJndlLmlzTWFwLENlPXdlJiZ3ZS5pc1JlZ0V4cCxTZT13ZSYmd2UuaXNTZXQsQWU9d2UmJndlLmlzVHlwZWRBcnJheTtmdW5jdGlvbiBOZSh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIEllKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK2k8bzspe3ZhciBzPXRbaV07ZShyLHMsbihzKSx0KX1yZXR1cm4gcn1mdW5jdGlvbiBNZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248ciYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fWZ1bmN0aW9uIEZlKHQsZSl7Zm9yKHZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtuLS0mJiExIT09ZSh0W25dLG4sdCk7KTtyZXR1cm4gdH1mdW5jdGlvbiBUZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248cjspaWYoIWUodFtuXSxuLHQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIE9lKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXTtlKHMsbix0KSYmKG9baSsrXT1zKX1yZXR1cm4gb31mdW5jdGlvbiBMZSh0LGUpe3JldHVybiEhKG51bGw9PXQ/MDp0Lmxlbmd0aCkmJkdlKHQsZSwwKT4tMX1mdW5jdGlvbiBQZSh0LGUsbil7Zm9yKHZhciByPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoOysrcjxpOylpZihuKGUsdFtyXSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gUmUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShyKTsrK248cjspaVtuXT1lKHRbbl0sbix0KTtyZXR1cm4gaX1mdW5jdGlvbiBCZSh0LGUpe2Zvcih2YXIgbj0tMSxyPWUubGVuZ3RoLGk9dC5sZW5ndGg7KytuPHI7KXRbaStuXT1lW25dO3JldHVybiB0fWZ1bmN0aW9uIGtlKHQsZSxuLHIpe3ZhciBpPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoO2ZvcihyJiZvJiYobj10WysraV0pOysraTxvOyluPWUobix0W2ldLGksdCk7cmV0dXJuIG59ZnVuY3Rpb24gemUodCxlLG4scil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2ZvcihyJiZpJiYobj10Wy0taV0pO2ktLTspbj1lKG4sdFtpXSxpLHQpO3JldHVybiBufWZ1bmN0aW9uIGplKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyOylpZihlKHRbbl0sbix0KSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgVWU9SGUoImxlbmd0aCIpO2Z1bmN0aW9uIHFlKHQsZSxuKXt2YXIgcjtyZXR1cm4gbih0LChmdW5jdGlvbih0LG4saSl7aWYoZSh0LG4saSkpcmV0dXJuIHI9biwhMX0pKSxyfWZ1bmN0aW9uIFZlKHQsZSxuLHIpe2Zvcih2YXIgaT10Lmxlbmd0aCxvPW4rKHI/MTotMSk7cj9vLS06KytvPGk7KWlmKGUodFtvXSxvLHQpKXJldHVybiBvO3JldHVybi0xfWZ1bmN0aW9uIEdlKHQsZSxuKXtyZXR1cm4gZT09ZT9mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW4tMSxpPXQubGVuZ3RoOysrcjxpOylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0odCxlLG4pOlZlKHQsWGUsbil9ZnVuY3Rpb24gWWUodCxlLG4scil7Zm9yKHZhciBpPW4tMSxvPXQubGVuZ3RoOysraTxvOylpZihyKHRbaV0sZSkpcmV0dXJuIGk7cmV0dXJuLTF9ZnVuY3Rpb24gWGUodCl7cmV0dXJuIHQhPXR9ZnVuY3Rpb24gV2UodCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIG4/SmUodCxlKS9uOnB9ZnVuY3Rpb24gSGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP246ZVt0XX19ZnVuY3Rpb24gWmUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT10P246dFtlXX19ZnVuY3Rpb24gS2UodCxlLG4scixpKXtyZXR1cm4gaSh0LChmdW5jdGlvbih0LGksbyl7bj1yPyhyPSExLHQpOmUobix0LGksbyl9KSksbn1mdW5jdGlvbiBKZSh0LGUpe2Zvcih2YXIgcixpPS0xLG89dC5sZW5ndGg7KytpPG87KXt2YXIgcz1lKHRbaV0pO3MhPT1uJiYocj1yPT09bj9zOnIrcyl9cmV0dXJuIHJ9ZnVuY3Rpb24gUWUodCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfWZ1bmN0aW9uICRlKHQpe3JldHVybiB0JiZ0LnNsaWNlKDAseW4odCkrMSkucmVwbGFjZShzdCwiIil9ZnVuY3Rpb24gdG4odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX1mdW5jdGlvbiBlbih0LGUpe3JldHVybiBSZShlLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX1mdW5jdGlvbiBubih0LGUpe3JldHVybiB0LmhhcyhlKX1mdW5jdGlvbiBybih0LGUpe2Zvcih2YXIgbj0tMSxyPXQubGVuZ3RoOysrbjxyJiZHZShlLHRbbl0sMCk+LTE7KTtyZXR1cm4gbn1mdW5jdGlvbiBvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS0mJkdlKGUsdFtuXSwwKT4tMTspO3JldHVybiBufXZhciBzbj1aZSh7IsOAIjoiQSIsIsOBIjoiQSIsIsOCIjoiQSIsIsODIjoiQSIsIsOEIjoiQSIsIsOFIjoiQSIsIsOgIjoiYSIsIsOhIjoiYSIsIsOiIjoiYSIsIsOjIjoiYSIsIsOkIjoiYSIsIsOlIjoiYSIsIsOHIjoiQyIsIsOnIjoiYyIsIsOQIjoiRCIsIsOwIjoiZCIsIsOIIjoiRSIsIsOJIjoiRSIsIsOKIjoiRSIsIsOLIjoiRSIsIsOoIjoiZSIsIsOpIjoiZSIsIsOqIjoiZSIsIsOrIjoiZSIsIsOMIjoiSSIsIsONIjoiSSIsIsOOIjoiSSIsIsOPIjoiSSIsIsOsIjoiaSIsIsOtIjoiaSIsIsOuIjoiaSIsIsOvIjoiaSIsIsORIjoiTiIsIsOxIjoibiIsIsOSIjoiTyIsIsOTIjoiTyIsIsOUIjoiTyIsIsOVIjoiTyIsIsOWIjoiTyIsIsOYIjoiTyIsIsOyIjoibyIsIsOzIjoibyIsIsO0IjoibyIsIsO1IjoibyIsIsO2IjoibyIsIsO4IjoibyIsIsOZIjoiVSIsIsOaIjoiVSIsIsObIjoiVSIsIsOcIjoiVSIsIsO5IjoidSIsIsO6IjoidSIsIsO7IjoidSIsIsO8IjoidSIsIsOdIjoiWSIsIsO9IjoieSIsIsO/IjoieSIsIsOGIjoiQWUiLCLDpiI6ImFlIiwiw54iOiJUaCIsIsO+IjoidGgiLCLDnyI6InNzIiwixIAiOiJBIiwixIIiOiJBIiwixIQiOiJBIiwixIEiOiJhIiwixIMiOiJhIiwixIUiOiJhIiwixIYiOiJDIiwixIgiOiJDIiwixIoiOiJDIiwixIwiOiJDIiwixIciOiJjIiwixIkiOiJjIiwixIsiOiJjIiwixI0iOiJjIiwixI4iOiJEIiwixJAiOiJEIiwixI8iOiJkIiwixJEiOiJkIiwixJIiOiJFIiwixJQiOiJFIiwixJYiOiJFIiwixJgiOiJFIiwixJoiOiJFIiwixJMiOiJlIiwixJUiOiJlIiwixJciOiJlIiwixJkiOiJlIiwixJsiOiJlIiwixJwiOiJHIiwixJ4iOiJHIiwixKAiOiJHIiwixKIiOiJHIiwixJ0iOiJnIiwixJ8iOiJnIiwixKEiOiJnIiwixKMiOiJnIiwixKQiOiJIIiwixKYiOiJIIiwixKUiOiJoIiwixKciOiJoIiwixKgiOiJJIiwixKoiOiJJIiwixKwiOiJJIiwixK4iOiJJIiwixLAiOiJJIiwixKkiOiJpIiwixKsiOiJpIiwixK0iOiJpIiwixK8iOiJpIiwixLEiOiJpIiwixLQiOiJKIiwixLUiOiJqIiwixLYiOiJLIiwixLciOiJrIiwixLgiOiJrIiwixLkiOiJMIiwixLsiOiJMIiwixL0iOiJMIiwixL8iOiJMIiwixYEiOiJMIiwixLoiOiJsIiwixLwiOiJsIiwixL4iOiJsIiwixYAiOiJsIiwixYIiOiJsIiwixYMiOiJOIiwixYUiOiJOIiwixYciOiJOIiwixYoiOiJOIiwixYQiOiJuIiwixYYiOiJuIiwixYgiOiJuIiwixYsiOiJuIiwixYwiOiJPIiwixY4iOiJPIiwixZAiOiJPIiwixY0iOiJvIiwixY8iOiJvIiwixZEiOiJvIiwixZQiOiJSIiwixZYiOiJSIiwixZgiOiJSIiwixZUiOiJyIiwixZciOiJyIiwixZkiOiJyIiwixZoiOiJTIiwixZwiOiJTIiwixZ4iOiJTIiwixaAiOiJTIiwixZsiOiJzIiwixZ0iOiJzIiwixZ8iOiJzIiwixaEiOiJzIiwixaIiOiJUIiwixaQiOiJUIiwixaYiOiJUIiwixaMiOiJ0IiwixaUiOiJ0IiwixaciOiJ0IiwixagiOiJVIiwixaoiOiJVIiwixawiOiJVIiwixa4iOiJVIiwixbAiOiJVIiwixbIiOiJVIiwixakiOiJ1IiwixasiOiJ1Iiwixa0iOiJ1Iiwixa8iOiJ1IiwixbEiOiJ1IiwixbMiOiJ1IiwixbQiOiJXIiwixbUiOiJ3IiwixbYiOiJZIiwixbciOiJ5IiwixbgiOiJZIiwixbkiOiJaIiwixbsiOiJaIiwixb0iOiJaIiwixboiOiJ6IiwixbwiOiJ6Iiwixb4iOiJ6IiwixLIiOiJJSiIsIsSzIjoiaWoiLCLFkiI6Ik9lIiwixZMiOiJvZSIsIsWJIjoiJ24iLCLFvyI6InMifSksYW49WmUoeyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9KTtmdW5jdGlvbiB1bih0KXtyZXR1cm4iXFwiK2hlW3RdfWZ1bmN0aW9uIGNuKHQpe3JldHVybiBvZS50ZXN0KHQpfWZ1bmN0aW9uIGxuKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe25bKytlXT1bcix0XX0pKSxufWZ1bmN0aW9uIGhuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KGUobikpfX1mdW5jdGlvbiBmbih0LGUpe2Zvcih2YXIgbj0tMSxyPXQubGVuZ3RoLGk9MCxzPVtdOysrbjxyOyl7dmFyIGE9dFtuXTsoYT09PWV8fGE9PT1vKSYmKHRbbl09byxzW2krK109bil9cmV0dXJuIHN9ZnVuY3Rpb24gcG4odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT10fSkpLG59ZnVuY3Rpb24gZG4odCl7cmV0dXJuIGNuKHQpP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1yZS5sYXN0SW5kZXg9MDtyZS50ZXN0KHQpOykrK2U7cmV0dXJuIGV9KHQpOlVlKHQpfWZ1bmN0aW9uIGduKHQpe3JldHVybiBjbih0KT9mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaChyZSl8fFtdfSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gdC5zcGxpdCgiIil9KHQpfWZ1bmN0aW9uIHluKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJmF0LnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9dmFyIG1uPVplKHsiJmFtcDsiOiImIiwiJmx0OyI6IjwiLCImZ3Q7IjoiPiIsIiZxdW90OyI6JyInLCImIzM5OyI6IicifSk7dmFyIHZuPWZ1bmN0aW9uIHQoZSl7dmFyIGF0LEV0PShlPW51bGw9PWU/eWU6dm4uZGVmYXVsdHMoeWUuT2JqZWN0KCksZSx2bi5waWNrKHllLGFlKSkpLkFycmF5LEN0PWUuRGF0ZSxTdD1lLkVycm9yLEF0PWUuRnVuY3Rpb24sTnQ9ZS5NYXRoLEl0PWUuT2JqZWN0LE10PWUuUmVnRXhwLEZ0PWUuU3RyaW5nLFR0PWUuVHlwZUVycm9yLE90PUV0LnByb3RvdHlwZSxMdD1BdC5wcm90b3R5cGUsUHQ9SXQucHJvdG90eXBlLFJ0PWVbIl9fY29yZS1qc19zaGFyZWRfXyJdLEJ0PUx0LnRvU3RyaW5nLGt0PVB0Lmhhc093blByb3BlcnR5LHp0PTAsanQ9KGF0PS9bXi5dKyQvLmV4ZWMoUnQmJlJ0LmtleXMmJlJ0LmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIithdDoiIixVdD1QdC50b1N0cmluZyxxdD1CdC5jYWxsKEl0KSxWdD15ZS5fLEd0PU10KCJeIitCdC5jYWxsKGt0KS5yZXBsYWNlKGl0LCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpLFl0PV9lP2UuQnVmZmVyOm4sWHQ9ZS5TeW1ib2wsV3Q9ZS5VaW50OEFycmF5LEh0PVl0P1l0LmFsbG9jVW5zYWZlOm4sWnQ9aG4oSXQuZ2V0UHJvdG90eXBlT2YsSXQpLEt0PUl0LmNyZWF0ZSxKdD1QdC5wcm9wZXJ0eUlzRW51bWVyYWJsZSxRdD1PdC5zcGxpY2UsJHQ9WHQ/WHQuaXNDb25jYXRTcHJlYWRhYmxlOm4sdGU9WHQ/WHQuaXRlcmF0b3I6bixyZT1YdD9YdC50b1N0cmluZ1RhZzpuLG9lPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXBvKEl0LCJkZWZpbmVQcm9wZXJ0eSIpO3JldHVybiB0KHt9LCIiLHt9KSx0fWNhdGNoKHQpe319KCksaGU9ZS5jbGVhclRpbWVvdXQhPT15ZS5jbGVhclRpbWVvdXQmJmUuY2xlYXJUaW1lb3V0LGRlPUN0JiZDdC5ub3chPT15ZS5EYXRlLm5vdyYmQ3Qubm93LGdlPWUuc2V0VGltZW91dCE9PXllLnNldFRpbWVvdXQmJmUuc2V0VGltZW91dCxtZT1OdC5jZWlsLHZlPU50LmZsb29yLHhlPUl0LmdldE93blByb3BlcnR5U3ltYm9scyx3ZT1ZdD9ZdC5pc0J1ZmZlcjpuLFVlPWUuaXNGaW5pdGUsWmU9T3Quam9pbixfbj1obihJdC5rZXlzLEl0KSx4bj1OdC5tYXgsd249TnQubWluLGJuPUN0Lm5vdyxEbj1lLnBhcnNlSW50LEVuPU50LnJhbmRvbSxDbj1PdC5yZXZlcnNlLFNuPXBvKGUsIkRhdGFWaWV3IiksQW49cG8oZSwiTWFwIiksTm49cG8oZSwiUHJvbWlzZSIpLEluPXBvKGUsIlNldCIpLE1uPXBvKGUsIldlYWtNYXAiKSxGbj1wbyhJdCwiY3JlYXRlIiksVG49TW4mJm5ldyBNbixPbj17fSxMbj1qbyhTbiksUG49am8oQW4pLFJuPWpvKE5uKSxCbj1qbyhJbiksa249am8oTW4pLHpuPVh0P1h0LnByb3RvdHlwZTpuLGpuPXpuP3puLnZhbHVlT2Y6bixVbj16bj96bi50b1N0cmluZzpuO2Z1bmN0aW9uIHFuKHQpe2lmKHJhKHQpJiYhWHModCkmJiEodCBpbnN0YW5jZW9mIFhuKSl7aWYodCBpbnN0YW5jZW9mIFluKXJldHVybiB0O2lmKGt0LmNhbGwodCwiX193cmFwcGVkX18iKSlyZXR1cm4gVW8odCl9cmV0dXJuIG5ldyBZbih0KX12YXIgVm49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtpZighbmEoZSkpcmV0dXJue307aWYoS3QpcmV0dXJuIEt0KGUpO3QucHJvdG90eXBlPWU7dmFyIHI9bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPW4scn19KCk7ZnVuY3Rpb24gR24oKXt9ZnVuY3Rpb24gWW4odCxlKXt0aGlzLl9fd3JhcHBlZF9fPXQsdGhpcy5fX2FjdGlvbnNfXz1bXSx0aGlzLl9fY2hhaW5fXz0hIWUsdGhpcy5fX2luZGV4X189MCx0aGlzLl9fdmFsdWVzX189bn1mdW5jdGlvbiBYbih0KXt0aGlzLl9fd3JhcHBlZF9fPXQsdGhpcy5fX2FjdGlvbnNfXz1bXSx0aGlzLl9fZGlyX189MSx0aGlzLl9fZmlsdGVyZWRfXz0hMSx0aGlzLl9faXRlcmF0ZWVzX189W10sdGhpcy5fX3Rha2VDb3VudF9fPWQsdGhpcy5fX3ZpZXdzX189W119ZnVuY3Rpb24gV24odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19ZnVuY3Rpb24gSG4odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19ZnVuY3Rpb24gWm4odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19ZnVuY3Rpb24gS24odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IFpuOysrZTxuOyl0aGlzLmFkZCh0W2VdKX1mdW5jdGlvbiBKbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBIbih0KTt0aGlzLnNpemU9ZS5zaXplfWZ1bmN0aW9uIFFuKHQsZSl7dmFyIG49WHModCkscj0hbiYmWXModCksaT0hbiYmIXImJktzKHQpLG89IW4mJiFyJiYhaSYmaGEodCkscz1ufHxyfHxpfHxvLGE9cz9RZSh0Lmxlbmd0aCxGdCk6W10sdT1hLmxlbmd0aDtmb3IodmFyIGMgaW4gdCkoZXx8a3QuY2FsbCh0LGMpKSYmKCFzfHwhKCJsZW5ndGgiPT1jfHxpJiYoIm9mZnNldCI9PWN8fCJwYXJlbnQiPT1jKXx8byYmKCJidWZmZXIiPT1jfHwiYnl0ZUxlbmd0aCI9PWN8fCJieXRlT2Zmc2V0Ij09Yyl8fHdvKGMsdSkpKSYmYS5wdXNoKGMpO3JldHVybiBhfWZ1bmN0aW9uICRuKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybiBlP3RbS3IoMCxlLTEpXTpufWZ1bmN0aW9uIHRyKHQsZSl7cmV0dXJuIEJvKEZpKHQpLGNyKGUsMCx0Lmxlbmd0aCkpfWZ1bmN0aW9uIGVyKHQpe3JldHVybiBCbyhGaSh0KSl9ZnVuY3Rpb24gbnIodCxlLHIpeyhyIT09biYmIXFzKHRbZV0scil8fHI9PT1uJiYhKGUgaW4gdCkpJiZhcih0LGUscil9ZnVuY3Rpb24gcnIodCxlLHIpe3ZhciBpPXRbZV07KCFrdC5jYWxsKHQsZSl8fCFxcyhpLHIpfHxyPT09biYmIShlIGluIHQpKSYmYXIodCxlLHIpfWZ1bmN0aW9uIGlyKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLTspaWYocXModFtuXVswXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBvcih0LGUsbixyKXtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxpLG8pe2Uocix0LG4odCksbyl9KSkscn1mdW5jdGlvbiBzcih0LGUpe3JldHVybiB0JiZUaShlLE9hKGUpLHQpfWZ1bmN0aW9uIGFyKHQsZSxuKXsiX19wcm90b19fIj09ZSYmb2U/b2UodCxlLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpuLHdyaXRhYmxlOiEwfSk6dFtlXT1ufWZ1bmN0aW9uIHVyKHQsZSl7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz1FdChpKSxzPW51bGw9PXQ7KytyPGk7KW9bcl09cz9uOk5hKHQsZVtyXSk7cmV0dXJuIG99ZnVuY3Rpb24gY3IodCxlLHIpe3JldHVybiB0PT10JiYociE9PW4mJih0PXQ8PXI/dDpyKSxlIT09biYmKHQ9dD49ZT90OmUpKSx0fWZ1bmN0aW9uIGxyKHQsZSxyLGksbyxzKXt2YXIgYSx1PTEmZSxjPTImZSxsPTQmZTtpZihyJiYoYT1vP3IodCxpLG8scyk6cih0KSksYSE9PW4pcmV0dXJuIGE7aWYoIW5hKHQpKXJldHVybiB0O3ZhciBoPVhzKHQpO2lmKGgpe2lmKGE9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgsbj1uZXcgdC5jb25zdHJ1Y3RvcihlKTtyZXR1cm4gZSYmInN0cmluZyI9PXR5cGVvZiB0WzBdJiZrdC5jYWxsKHQsImluZGV4IikmJihuLmluZGV4PXQuaW5kZXgsbi5pbnB1dD10LmlucHV0KSxufSh0KSwhdSlyZXR1cm4gRmkodCxhKX1lbHNle3ZhciBmPW1vKHQpLHA9Zj09RHx8Zj09RTtpZihLcyh0KSlyZXR1cm4gQ2kodCx1KTtpZihmPT1BfHxmPT12fHxwJiYhbyl7aWYoYT1jfHxwP3t9Ol9vKHQpLCF1KXJldHVybiBjP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIFRpKHQseW8odCksZSl9KHQsZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmVGkoZSxMYShlKSx0KX0oYSx0KSk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gVGkodCxnbyh0KSxlKX0odCxzcihhLHQpKX1lbHNle2lmKCFsZVtmXSlyZXR1cm4gbz90Ont9O2E9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuY29uc3RydWN0b3I7c3dpdGNoKGUpe2Nhc2UgTDpyZXR1cm4gU2kodCk7Y2FzZSB4OmNhc2UgdzpyZXR1cm4gbmV3IHIoK3QpO2Nhc2UgUDpyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj1lP1NpKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX0odCxuKTtjYXNlIFI6Y2FzZSBCOmNhc2UgazpjYXNlIHo6Y2FzZSBqOmNhc2UgVTpjYXNlIHE6Y2FzZSBWOmNhc2UgRzpyZXR1cm4gQWkodCxuKTtjYXNlIEM6cmV0dXJuIG5ldyByO2Nhc2UgUzpjYXNlIEY6cmV0dXJuIG5ldyByKHQpO2Nhc2UgSTpyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5zb3VyY2UsZ3QuZXhlYyh0KSk7cmV0dXJuIGUubGFzdEluZGV4PXQubGFzdEluZGV4LGV9KHQpO2Nhc2UgTTpyZXR1cm4gbmV3IHI7Y2FzZSBUOnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gam4/SXQoam4uY2FsbCh0KSk6e319KHQpfX0odCxmLHUpfX1zfHwocz1uZXcgSm4pO3ZhciBkPXMuZ2V0KHQpO2lmKGQpcmV0dXJuIGQ7cy5zZXQodCxhKSx1YSh0KT90LmZvckVhY2goKGZ1bmN0aW9uKG4pe2EuYWRkKGxyKG4sZSxyLG4sdCxzKSl9KSk6aWEodCkmJnQuZm9yRWFjaCgoZnVuY3Rpb24obixpKXthLnNldChpLGxyKG4sZSxyLGksdCxzKSl9KSk7dmFyIGc9aD9uOihsP2M/c286b286Yz9MYTpPYSkodCk7cmV0dXJuIE1lKGd8fHQsKGZ1bmN0aW9uKG4saSl7ZyYmKG49dFtpPW5dKSxycihhLGksbHIobixlLHIsaSx0LHMpKX0pKSxhfWZ1bmN0aW9uIGhyKHQsZSxyKXt2YXIgaT1yLmxlbmd0aDtpZihudWxsPT10KXJldHVybiFpO2Zvcih0PUl0KHQpO2ktLTspe3ZhciBvPXJbaV0scz1lW29dLGE9dFtvXTtpZihhPT09biYmIShvIGluIHQpfHwhcyhhKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBmcih0LGUsaSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBPbygoZnVuY3Rpb24oKXt0LmFwcGx5KG4saSl9KSxlKX1mdW5jdGlvbiBwcih0LGUsbixyKXt2YXIgaT0tMSxvPUxlLHM9ITAsYT10Lmxlbmd0aCx1PVtdLGM9ZS5sZW5ndGg7aWYoIWEpcmV0dXJuIHU7biYmKGU9UmUoZSx0bihuKSkpLHI/KG89UGUscz0hMSk6ZS5sZW5ndGg+PTIwMCYmKG89bm4scz0hMSxlPW5ldyBLbihlKSk7dDpmb3IoOysraTxhOyl7dmFyIGw9dFtpXSxoPW51bGw9PW4/bDpuKGwpO2lmKGw9cnx8MCE9PWw/bDowLHMmJmg9PWgpe2Zvcih2YXIgZj1jO2YtLTspaWYoZVtmXT09PWgpY29udGludWUgdDt1LnB1c2gobCl9ZWxzZSBvKGUsaCxyKXx8dS5wdXNoKGwpfXJldHVybiB1fXFuLnRlbXBsYXRlU2V0dGluZ3M9e2VzY2FwZTpRLGV2YWx1YXRlOiQsaW50ZXJwb2xhdGU6dHQsdmFyaWFibGU6IiIsaW1wb3J0czp7Xzpxbn19LHFuLnByb3RvdHlwZT1Hbi5wcm90b3R5cGUscW4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPXFuLFluLnByb3RvdHlwZT1WbihHbi5wcm90b3R5cGUpLFluLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZbixYbi5wcm90b3R5cGU9Vm4oR24ucHJvdG90eXBlKSxYbi5wcm90b3R5cGUuY29uc3RydWN0b3I9WG4sV24ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1Gbj9GbihudWxsKTp7fSx0aGlzLnNpemU9MH0sV24ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sV24ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKEZuKXt2YXIgcj1lW3RdO3JldHVybiByPT09aT9uOnJ9cmV0dXJuIGt0LmNhbGwoZSx0KT9lW3RdOm59LFduLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gRm4/ZVt0XSE9PW46a3QuY2FsbChlLHQpfSxXbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1GbiYmZT09PW4/aTplLHRoaXN9LEhuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9LEhuLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWlyKGUsdCk7cmV0dXJuIShuPDApJiYobj09ZS5sZW5ndGgtMT9lLnBvcCgpOlF0LmNhbGwoZSxuLDEpLC0tdGhpcy5zaXplLCEwKX0sSG4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9aXIoZSx0KTtyZXR1cm4gcjwwP246ZVtyXVsxXX0sSG4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gaXIodGhpcy5fX2RhdGFfXyx0KT4tMX0sSG4ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1pcihuLHQpO3JldHVybiByPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5bcl1bMV09ZSx0aGlzfSxabi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBXbixtYXA6bmV3KEFufHxIbiksc3RyaW5nOm5ldyBXbn19LFpuLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9aG8odGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sWm4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gaG8odGhpcyx0KS5nZXQodCl9LFpuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIGhvKHRoaXMsdCkuaGFzKHQpfSxabi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49aG8odGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc30sS24ucHJvdG90eXBlLmFkZD1Lbi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQodCxpKSx0aGlzfSxLbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sSm4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgSG4sdGhpcy5zaXplPTB9LEpuLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLG59LEpuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfSxKbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sSm4ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187aWYobiBpbnN0YW5jZW9mIEhuKXt2YXIgcj1uLl9fZGF0YV9fO2lmKCFBbnx8ci5sZW5ndGg8MTk5KXJldHVybiByLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgWm4ocil9cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplPW4uc2l6ZSx0aGlzfTt2YXIgZHI9UGkoYnIpLGdyPVBpKERyLCEwKTtmdW5jdGlvbiB5cih0LGUpe3ZhciBuPSEwO3JldHVybiBkcih0LChmdW5jdGlvbih0LHIsaSl7cmV0dXJuIG49ISFlKHQscixpKX0pKSxufWZ1bmN0aW9uIG1yKHQsZSxyKXtmb3IodmFyIGk9LTEsbz10Lmxlbmd0aDsrK2k8bzspe3ZhciBzPXRbaV0sYT1lKHMpO2lmKG51bGwhPWEmJih1PT09bj9hPT1hJiYhbGEoYSk6cihhLHUpKSl2YXIgdT1hLGM9c31yZXR1cm4gY31mdW5jdGlvbiB2cih0LGUpe3ZhciBuPVtdO3JldHVybiBkcih0LChmdW5jdGlvbih0LHIsaSl7ZSh0LHIsaSkmJm4ucHVzaCh0KX0pKSxufWZ1bmN0aW9uIF9yKHQsZSxuLHIsaSl7dmFyIG89LTEscz10Lmxlbmd0aDtmb3Iobnx8KG49eG8pLGl8fChpPVtdKTsrK288czspe3ZhciBhPXRbb107ZT4wJiZuKGEpP2U+MT9fcihhLGUtMSxuLHIsaSk6QmUoaSxhKTpyfHwoaVtpLmxlbmd0aF09YSl9cmV0dXJuIGl9dmFyIHhyPVJpKCksd3I9UmkoITApO2Z1bmN0aW9uIGJyKHQsZSl7cmV0dXJuIHQmJnhyKHQsZSxPYSl9ZnVuY3Rpb24gRHIodCxlKXtyZXR1cm4gdCYmd3IodCxlLE9hKX1mdW5jdGlvbiBFcih0LGUpe3JldHVybiBPZShlLChmdW5jdGlvbihlKXtyZXR1cm4gJHModFtlXSl9KSl9ZnVuY3Rpb24gQ3IodCxlKXtmb3IodmFyIHI9MCxpPShlPXdpKGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPGk7KXQ9dFt6byhlW3IrK10pXTtyZXR1cm4gciYmcj09aT90Om59ZnVuY3Rpb24gU3IodCxlLG4pe3ZhciByPWUodCk7cmV0dXJuIFhzKHQpP3I6QmUocixuKHQpKX1mdW5jdGlvbiBBcih0KXtyZXR1cm4gbnVsbD09dD90PT09bj8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6cmUmJnJlIGluIEl0KHQpP2Z1bmN0aW9uKHQpe3ZhciBlPWt0LmNhbGwodCxyZSkscj10W3JlXTt0cnl7dFtyZV09bjt2YXIgaT0hMH1jYXRjaCh0KXt9dmFyIG89VXQuY2FsbCh0KTtyZXR1cm4gaSYmKGU/dFtyZV09cjpkZWxldGUgdFtyZV0pLG99KHQpOmZ1bmN0aW9uKHQpe3JldHVybiBVdC5jYWxsKHQpfSh0KX1mdW5jdGlvbiBOcih0LGUpe3JldHVybiB0PmV9ZnVuY3Rpb24gSXIodCxlKXtyZXR1cm4gbnVsbCE9dCYma3QuY2FsbCh0LGUpfWZ1bmN0aW9uIE1yKHQsZSl7cmV0dXJuIG51bGwhPXQmJmUgaW4gSXQodCl9ZnVuY3Rpb24gRnIodCxlLHIpe2Zvcih2YXIgaT1yP1BlOkxlLG89dFswXS5sZW5ndGgscz10Lmxlbmd0aCxhPXMsdT1FdChzKSxjPTEvMCxsPVtdO2EtLTspe3ZhciBoPXRbYV07YSYmZSYmKGg9UmUoaCx0bihlKSkpLGM9d24oaC5sZW5ndGgsYyksdVthXT0hciYmKGV8fG8+PTEyMCYmaC5sZW5ndGg+PTEyMCk/bmV3IEtuKGEmJmgpOm59aD10WzBdO3ZhciBmPS0xLHA9dVswXTt0OmZvcig7KytmPG8mJmwubGVuZ3RoPGM7KXt2YXIgZD1oW2ZdLGc9ZT9lKGQpOmQ7aWYoZD1yfHwwIT09ZD9kOjAsIShwP25uKHAsZyk6aShsLGcscikpKXtmb3IoYT1zOy0tYTspe3ZhciB5PXVbYV07aWYoISh5P25uKHksZyk6aSh0W2FdLGcscikpKWNvbnRpbnVlIHR9cCYmcC5wdXNoKGcpLGwucHVzaChkKX19cmV0dXJuIGx9ZnVuY3Rpb24gVHIodCxlLHIpe3ZhciBpPW51bGw9PSh0PU1vKHQsZT13aShlLHQpKSk/dDp0W3pvKFFvKGUpKV07cmV0dXJuIG51bGw9PWk/bjpOZShpLHQscil9ZnVuY3Rpb24gT3IodCl7cmV0dXJuIHJhKHQpJiZBcih0KT09dn1mdW5jdGlvbiBMcih0LGUscixpLG8pe3JldHVybiB0PT09ZXx8KG51bGw9PXR8fG51bGw9PWV8fCFyYSh0KSYmIXJhKGUpP3QhPXQmJmUhPWU6ZnVuY3Rpb24odCxlLHIsaSxvLHMpe3ZhciBhPVhzKHQpLHU9WHMoZSksYz1hP186bW8odCksbD11P186bW8oZSksaD0oYz1jPT12P0E6Yyk9PUEsZj0obD1sPT12P0E6bCk9PUEscD1jPT1sO2lmKHAmJktzKHQpKXtpZighS3MoZSkpcmV0dXJuITE7YT0hMCxoPSExfWlmKHAmJiFoKXJldHVybiBzfHwocz1uZXcgSm4pLGF8fGhhKHQpP3JvKHQsZSxyLGksbyxzKTpmdW5jdGlvbih0LGUsbixyLGksbyxzKXtzd2l0Y2gobil7Y2FzZSBQOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSBMOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFvKG5ldyBXdCh0KSxuZXcgV3QoZSkpKTtjYXNlIHg6Y2FzZSB3OmNhc2UgUzpyZXR1cm4gcXMoK3QsK2UpO2Nhc2UgYjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UgSTpjYXNlIEY6cmV0dXJuIHQ9PWUrIiI7Y2FzZSBDOnZhciBhPWxuO2Nhc2UgTTp2YXIgdT0xJnI7aWYoYXx8KGE9cG4pLHQuc2l6ZSE9ZS5zaXplJiYhdSlyZXR1cm4hMTt2YXIgYz1zLmdldCh0KTtpZihjKXJldHVybiBjPT1lO3J8PTIscy5zZXQodCxlKTt2YXIgbD1ybyhhKHQpLGEoZSkscixpLG8scyk7cmV0dXJuIHMuZGVsZXRlKHQpLGw7Y2FzZSBUOmlmKGpuKXJldHVybiBqbi5jYWxsKHQpPT1qbi5jYWxsKGUpfXJldHVybiExfSh0LGUsYyxyLGksbyxzKTtpZighKDEmcikpe3ZhciBkPWgmJmt0LmNhbGwodCwiX193cmFwcGVkX18iKSxnPWYmJmt0LmNhbGwoZSwiX193cmFwcGVkX18iKTtpZihkfHxnKXt2YXIgeT1kP3QudmFsdWUoKTp0LG09Zz9lLnZhbHVlKCk6ZTtyZXR1cm4gc3x8KHM9bmV3IEpuKSxvKHksbSxyLGkscyl9fXJldHVybiEhcCYmKHN8fChzPW5ldyBKbiksZnVuY3Rpb24odCxlLHIsaSxvLHMpe3ZhciBhPTEmcix1PW9vKHQpLGM9dS5sZW5ndGgsbD1vbyhlKSxoPWwubGVuZ3RoO2lmKGMhPWgmJiFhKXJldHVybiExO2Zvcih2YXIgZj1jO2YtLTspe3ZhciBwPXVbZl07aWYoIShhP3AgaW4gZTprdC5jYWxsKGUscCkpKXJldHVybiExfXZhciBkPXMuZ2V0KHQpLGc9cy5nZXQoZSk7aWYoZCYmZylyZXR1cm4gZD09ZSYmZz09dDt2YXIgeT0hMDtzLnNldCh0LGUpLHMuc2V0KGUsdCk7Zm9yKHZhciBtPWE7KytmPGM7KXt2YXIgdj10W3A9dVtmXV0sXz1lW3BdO2lmKGkpdmFyIHg9YT9pKF8sdixwLGUsdCxzKTppKHYsXyxwLHQsZSxzKTtpZighKHg9PT1uP3Y9PT1ffHxvKHYsXyxyLGkscyk6eCkpe3k9ITE7YnJlYWt9bXx8KG09ImNvbnN0cnVjdG9yIj09cCl9aWYoeSYmIW0pe3ZhciB3PXQuY29uc3RydWN0b3IsYj1lLmNvbnN0cnVjdG9yO3chPWImJiJjb25zdHJ1Y3RvciJpbiB0JiYiY29uc3RydWN0b3IiaW4gZSYmISgiZnVuY3Rpb24iPT10eXBlb2YgdyYmdyBpbnN0YW5jZW9mIHcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiIGluc3RhbmNlb2YgYikmJih5PSExKX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSkseX0odCxlLHIsaSxvLHMpKX0odCxlLHIsaSxMcixvKSl9ZnVuY3Rpb24gUHIodCxlLHIsaSl7dmFyIG89ci5sZW5ndGgscz1vLGE9IWk7aWYobnVsbD09dClyZXR1cm4hcztmb3IodD1JdCh0KTtvLS07KXt2YXIgdT1yW29dO2lmKGEmJnVbMl0/dVsxXSE9PXRbdVswXV06ISh1WzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK288czspe3ZhciBjPSh1PXJbb10pWzBdLGw9dFtjXSxoPXVbMV07aWYoYSYmdVsyXSl7aWYobD09PW4mJiEoYyBpbiB0KSlyZXR1cm4hMX1lbHNle3ZhciBmPW5ldyBKbjtpZihpKXZhciBwPWkobCxoLGMsdCxlLGYpO2lmKCEocD09PW4/THIoaCxsLDMsaSxmKTpwKSlyZXR1cm4hMX19cmV0dXJuITB9ZnVuY3Rpb24gUnIodCl7cmV0dXJuISghbmEodCl8fGZ1bmN0aW9uKHQpe3JldHVybiEhanQmJmp0IGluIHR9KHQpKSYmKCRzKHQpP0d0OnZ0KS50ZXN0KGpvKHQpKX1mdW5jdGlvbiBCcih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGw9PXQ/b3U6Im9iamVjdCI9PXR5cGVvZiB0P1hzKHQpP1ZyKHRbMF0sdFsxXSk6cXIodCk6ZHUodCl9ZnVuY3Rpb24ga3IodCl7aWYoIVNvKHQpKXJldHVybiBfbih0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gSXQodCkpa3QuY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24genIodCl7aWYoIW5hKHQpKXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT1bXTtpZihudWxsIT10KWZvcih2YXIgbiBpbiBJdCh0KSllLnB1c2gobik7cmV0dXJuIGV9KHQpO3ZhciBlPVNvKHQpLG49W107Zm9yKHZhciByIGluIHQpImNvbnN0cnVjdG9yIj09ciYmKGV8fCFrdC5jYWxsKHQscikpfHxuLnB1c2gocik7cmV0dXJuIG59ZnVuY3Rpb24ganIodCxlKXtyZXR1cm4gdDxlfWZ1bmN0aW9uIFVyKHQsZSl7dmFyIG49LTEscj1Icyh0KT9FdCh0Lmxlbmd0aCk6W107cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQsaSxvKXtyWysrbl09ZSh0LGksbyl9KSkscn1mdW5jdGlvbiBxcih0KXt2YXIgZT1mbyh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/Tm8oZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihuKXtyZXR1cm4gbj09PXR8fFByKG4sdCxlKX19ZnVuY3Rpb24gVnIodCxlKXtyZXR1cm4gRG8odCkmJkFvKGUpP05vKHpvKHQpLGUpOmZ1bmN0aW9uKHIpe3ZhciBpPU5hKHIsdCk7cmV0dXJuIGk9PT1uJiZpPT09ZT9JYShyLHQpOkxyKGUsaSwzKX19ZnVuY3Rpb24gR3IodCxlLHIsaSxvKXt0IT09ZSYmeHIoZSwoZnVuY3Rpb24ocyxhKXtpZihvfHwobz1uZXcgSm4pLG5hKHMpKSFmdW5jdGlvbih0LGUscixpLG8scyxhKXt2YXIgdT1Gbyh0LHIpLGM9Rm8oZSxyKSxsPWEuZ2V0KGMpO2lmKGwpcmV0dXJuIHZvaWQgbnIodCxyLGwpO3ZhciBoPXM/cyh1LGMscisiIix0LGUsYSk6bixmPWg9PT1uO2lmKGYpe3ZhciBwPVhzKGMpLGQ9IXAmJktzKGMpLGc9IXAmJiFkJiZoYShjKTtoPWMscHx8ZHx8Zz9Ycyh1KT9oPXU6WnModSk/aD1GaSh1KTpkPyhmPSExLGg9Q2koYywhMCkpOmc/KGY9ITEsaD1BaShjLCEwKSk6aD1bXTpzYShjKXx8WXMoYyk/KGg9dSxZcyh1KT9oPV9hKHUpOighbmEodSl8fCRzKHUpKSYmKGg9X28oYykpKTpmPSExfWYmJihhLnNldChjLGgpLG8oaCxjLGkscyxhKSxhLmRlbGV0ZShjKSksbnIodCxyLGgpfSh0LGUsYSxyLEdyLGksbyk7ZWxzZXt2YXIgdT1pP2koRm8odCxhKSxzLGErIiIsdCxlLG8pOm47dT09PW4mJih1PXMpLG5yKHQsYSx1KX19KSxMYSl9ZnVuY3Rpb24gWXIodCxlKXt2YXIgcj10Lmxlbmd0aDtpZihyKXJldHVybiB3byhlKz1lPDA/cjowLHIpP3RbZV06bn1mdW5jdGlvbiBYcih0LGUsbil7ZT1lLmxlbmd0aD9SZShlLChmdW5jdGlvbih0KXtyZXR1cm4gWHModCk/ZnVuY3Rpb24oZSl7cmV0dXJuIENyKGUsMT09PXQubGVuZ3RoP3RbMF06dCl9OnR9KSk6W291XTt2YXIgcj0tMTtyZXR1cm4gZT1SZShlLHRuKGxvKCkpKSxmdW5jdGlvbih0LGUpe3ZhciBuPXQubGVuZ3RoO2Zvcih0LnNvcnQoZSk7bi0tOyl0W25dPXRbbl0udmFsdWU7cmV0dXJuIHR9KFVyKHQsKGZ1bmN0aW9uKHQsbixpKXtyZXR1cm57Y3JpdGVyaWE6UmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSksaW5kZXg6KytyLHZhbHVlOnR9fSkpLChmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPS0xLGk9dC5jcml0ZXJpYSxvPWUuY3JpdGVyaWEscz1pLmxlbmd0aCxhPW4ubGVuZ3RoOysrcjxzOyl7dmFyIHU9TmkoaVtyXSxvW3JdKTtpZih1KXJldHVybiByPj1hP3U6dSooImRlc2MiPT1uW3JdPy0xOjEpfXJldHVybiB0LmluZGV4LWUuaW5kZXh9KHQsZSxuKX0pKX1mdW5jdGlvbiBXcih0LGUsbil7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz17fTsrK3I8aTspe3ZhciBzPWVbcl0sYT1Dcih0LHMpO24oYSxzKSYmZWkobyx3aShzLHQpLGEpfXJldHVybiBvfWZ1bmN0aW9uIEhyKHQsZSxuLHIpe3ZhciBpPXI/WWU6R2Usbz0tMSxzPWUubGVuZ3RoLGE9dDtmb3IodD09PWUmJihlPUZpKGUpKSxuJiYoYT1SZSh0LHRuKG4pKSk7KytvPHM7KWZvcih2YXIgdT0wLGM9ZVtvXSxsPW4/bihjKTpjOyh1PWkoYSxsLHUscikpPi0xOylhIT09dCYmUXQuY2FsbChhLHUsMSksUXQuY2FsbCh0LHUsMSk7cmV0dXJuIHR9ZnVuY3Rpb24gWnIodCxlKXtmb3IodmFyIG49dD9lLmxlbmd0aDowLHI9bi0xO24tLTspe3ZhciBpPWVbbl07aWYobj09cnx8aSE9PW8pe3ZhciBvPWk7d28oaSk/UXQuY2FsbCh0LGksMSk6cGkodCxpKX19cmV0dXJuIHR9ZnVuY3Rpb24gS3IodCxlKXtyZXR1cm4gdCt2ZShFbigpKihlLXQrMSkpfWZ1bmN0aW9uIEpyKHQsZSl7dmFyIG49IiI7aWYoIXR8fGU8MXx8ZT5mKXJldHVybiBuO2Rve2UlMiYmKG4rPXQpLChlPXZlKGUvMikpJiYodCs9dCl9d2hpbGUoZSk7cmV0dXJuIG59ZnVuY3Rpb24gUXIodCxlKXtyZXR1cm4gTG8oSW8odCxlLG91KSx0KyIiKX1mdW5jdGlvbiAkcih0KXtyZXR1cm4gJG4ocWEodCkpfWZ1bmN0aW9uIHRpKHQsZSl7dmFyIG49cWEodCk7cmV0dXJuIEJvKG4sY3IoZSwwLG4ubGVuZ3RoKSl9ZnVuY3Rpb24gZWkodCxlLHIsaSl7aWYoIW5hKHQpKXJldHVybiB0O2Zvcih2YXIgbz0tMSxzPShlPXdpKGUsdCkpLmxlbmd0aCxhPXMtMSx1PXQ7bnVsbCE9dSYmKytvPHM7KXt2YXIgYz16byhlW29dKSxsPXI7aWYoIl9fcHJvdG9fXyI9PT1jfHwiY29uc3RydWN0b3IiPT09Y3x8InByb3RvdHlwZSI9PT1jKXJldHVybiB0O2lmKG8hPWEpe3ZhciBoPXVbY107KGw9aT9pKGgsYyx1KTpuKT09PW4mJihsPW5hKGgpP2g6d28oZVtvKzFdKT9bXTp7fSl9cnIodSxjLGwpLHU9dVtjXX1yZXR1cm4gdH12YXIgbmk9VG4/ZnVuY3Rpb24odCxlKXtyZXR1cm4gVG4uc2V0KHQsZSksdH06b3Uscmk9b2U/ZnVuY3Rpb24odCxlKXtyZXR1cm4gb2UodCwidG9TdHJpbmciLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpudShlKSx3cml0YWJsZTohMH0pfTpvdTtmdW5jdGlvbiBpaSh0KXtyZXR1cm4gQm8ocWEodCkpfWZ1bmN0aW9uIG9pKHQsZSxuKXt2YXIgcj0tMSxpPXQubGVuZ3RoO2U8MCYmKGU9LWU+aT8wOmkrZSksKG49bj5pP2k6bik8MCYmKG4rPWkpLGk9ZT5uPzA6bi1lPj4+MCxlPj4+PTA7Zm9yKHZhciBvPUV0KGkpOysrcjxpOylvW3JdPXRbcitlXTtyZXR1cm4gb31mdW5jdGlvbiBzaSh0LGUpe3ZhciBuO3JldHVybiBkcih0LChmdW5jdGlvbih0LHIsaSl7cmV0dXJuIShuPWUodCxyLGkpKX0pKSwhIW59ZnVuY3Rpb24gYWkodCxlLG4pe3ZhciByPTAsaT1udWxsPT10P3I6dC5sZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiBlJiZlPT1lJiZpPD15KXtmb3IoO3I8aTspe3ZhciBvPXIraT4+PjEscz10W29dO251bGwhPT1zJiYhbGEocykmJihuP3M8PWU6czxlKT9yPW8rMTppPW99cmV0dXJuIGl9cmV0dXJuIHVpKHQsZSxvdSxuKX1mdW5jdGlvbiB1aSh0LGUscixpKXt2YXIgbz0wLHM9bnVsbD09dD8wOnQubGVuZ3RoO2lmKDA9PT1zKXJldHVybiAwO2Zvcih2YXIgYT0oZT1yKGUpKSE9ZSx1PW51bGw9PT1lLGM9bGEoZSksbD1lPT09bjtvPHM7KXt2YXIgaD12ZSgobytzKS8yKSxmPXIodFtoXSkscD1mIT09bixkPW51bGw9PT1mLHk9Zj09ZixtPWxhKGYpO2lmKGEpdmFyIHY9aXx8eTtlbHNlIHY9bD95JiYoaXx8cCk6dT95JiZwJiYoaXx8IWQpOmM/eSYmcCYmIWQmJihpfHwhbSk6IWQmJiFtJiYoaT9mPD1lOmY8ZSk7dj9vPWgrMTpzPWh9cmV0dXJuIHduKHMsZyl9ZnVuY3Rpb24gY2kodCxlKXtmb3IodmFyIG49LTEscj10Lmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBzPXRbbl0sYT1lP2Uocyk6cztpZighbnx8IXFzKGEsdSkpe3ZhciB1PWE7b1tpKytdPTA9PT1zPzA6c319cmV0dXJuIG99ZnVuY3Rpb24gbGkodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3Q6bGEodCk/cDordH1mdW5jdGlvbiBoaSh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoWHModCkpcmV0dXJuIFJlKHQsaGkpKyIiO2lmKGxhKHQpKXJldHVybiBVbj9Vbi5jYWxsKHQpOiIiO3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1oPyItMCI6ZX1mdW5jdGlvbiBmaSh0LGUsbil7dmFyIHI9LTEsaT1MZSxvPXQubGVuZ3RoLHM9ITAsYT1bXSx1PWE7aWYobilzPSExLGk9UGU7ZWxzZSBpZihvPj0yMDApe3ZhciBjPWU/bnVsbDpKaSh0KTtpZihjKXJldHVybiBwbihjKTtzPSExLGk9bm4sdT1uZXcgS259ZWxzZSB1PWU/W106YTt0OmZvcig7KytyPG87KXt2YXIgbD10W3JdLGg9ZT9lKGwpOmw7aWYobD1ufHwwIT09bD9sOjAscyYmaD09aCl7Zm9yKHZhciBmPXUubGVuZ3RoO2YtLTspaWYodVtmXT09PWgpY29udGludWUgdDtlJiZ1LnB1c2goaCksYS5wdXNoKGwpfWVsc2UgaSh1LGgsbil8fCh1IT09YSYmdS5wdXNoKGgpLGEucHVzaChsKSl9cmV0dXJuIGF9ZnVuY3Rpb24gcGkodCxlKXtyZXR1cm4gbnVsbD09KHQ9TW8odCxlPXdpKGUsdCkpKXx8ZGVsZXRlIHRbem8oUW8oZSkpXX1mdW5jdGlvbiBkaSh0LGUsbixyKXtyZXR1cm4gZWkodCxlLG4oQ3IodCxlKSkscil9ZnVuY3Rpb24gZ2kodCxlLG4scil7Zm9yKHZhciBpPXQubGVuZ3RoLG89cj9pOi0xOyhyP28tLTorK288aSkmJmUodFtvXSxvLHQpOyk7cmV0dXJuIG4/b2kodCxyPzA6byxyP28rMTppKTpvaSh0LHI/bysxOjAscj9pOm8pfWZ1bmN0aW9uIHlpKHQsZSl7dmFyIG49dDtyZXR1cm4gbiBpbnN0YW5jZW9mIFhuJiYobj1uLnZhbHVlKCkpLGtlKGUsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZnVuYy5hcHBseShlLnRoaXNBcmcsQmUoW3RdLGUuYXJncykpfSksbil9ZnVuY3Rpb24gbWkodCxlLG4pe3ZhciByPXQubGVuZ3RoO2lmKHI8MilyZXR1cm4gcj9maSh0WzBdKTpbXTtmb3IodmFyIGk9LTEsbz1FdChyKTsrK2k8cjspZm9yKHZhciBzPXRbaV0sYT0tMTsrK2E8cjspYSE9aSYmKG9baV09cHIob1tpXXx8cyx0W2FdLGUsbikpO3JldHVybiBmaShfcihvLDEpLGUsbil9ZnVuY3Rpb24gdmkodCxlLHIpe2Zvcih2YXIgaT0tMSxvPXQubGVuZ3RoLHM9ZS5sZW5ndGgsYT17fTsrK2k8bzspe3ZhciB1PWk8cz9lW2ldOm47cihhLHRbaV0sdSl9cmV0dXJuIGF9ZnVuY3Rpb24gX2kodCl7cmV0dXJuIFpzKHQpP3Q6W119ZnVuY3Rpb24geGkodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpvdX1mdW5jdGlvbiB3aSh0LGUpe3JldHVybiBYcyh0KT90OkRvKHQsZSk/W3RdOmtvKHhhKHQpKX12YXIgYmk9UXI7ZnVuY3Rpb24gRGkodCxlLHIpe3ZhciBpPXQubGVuZ3RoO3JldHVybiByPXI9PT1uP2k6ciwhZSYmcj49aT90Om9pKHQsZSxyKX12YXIgRWk9aGV8fGZ1bmN0aW9uKHQpe3JldHVybiB5ZS5jbGVhclRpbWVvdXQodCl9O2Z1bmN0aW9uIENpKHQsZSl7aWYoZSlyZXR1cm4gdC5zbGljZSgpO3ZhciBuPXQubGVuZ3RoLHI9SHQ/SHQobik6bmV3IHQuY29uc3RydWN0b3Iobik7cmV0dXJuIHQuY29weShyKSxyfWZ1bmN0aW9uIFNpKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBXdChlKS5zZXQobmV3IFd0KHQpKSxlfWZ1bmN0aW9uIEFpKHQsZSl7dmFyIG49ZT9TaSh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKG4sdC5ieXRlT2Zmc2V0LHQubGVuZ3RoKX1mdW5jdGlvbiBOaSh0LGUpe2lmKHQhPT1lKXt2YXIgcj10IT09bixpPW51bGw9PT10LG89dD09dCxzPWxhKHQpLGE9ZSE9PW4sdT1udWxsPT09ZSxjPWU9PWUsbD1sYShlKTtpZighdSYmIWwmJiFzJiZ0PmV8fHMmJmEmJmMmJiF1JiYhbHx8aSYmYSYmY3x8IXImJmN8fCFvKXJldHVybiAxO2lmKCFpJiYhcyYmIWwmJnQ8ZXx8bCYmciYmbyYmIWkmJiFzfHx1JiZyJiZvfHwhYSYmb3x8IWMpcmV0dXJuLTF9cmV0dXJuIDB9ZnVuY3Rpb24gSWkodCxlLG4scil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGgscz1uLmxlbmd0aCxhPS0xLHU9ZS5sZW5ndGgsYz14bihvLXMsMCksbD1FdCh1K2MpLGg9IXI7KythPHU7KWxbYV09ZVthXTtmb3IoOysraTxzOykoaHx8aTxvKSYmKGxbbltpXV09dFtpXSk7Zm9yKDtjLS07KWxbYSsrXT10W2krK107cmV0dXJuIGx9ZnVuY3Rpb24gTWkodCxlLG4scil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGgscz0tMSxhPW4ubGVuZ3RoLHU9LTEsYz1lLmxlbmd0aCxsPXhuKG8tYSwwKSxoPUV0KGwrYyksZj0hcjsrK2k8bDspaFtpXT10W2ldO2Zvcih2YXIgcD1pOysrdTxjOyloW3ArdV09ZVt1XTtmb3IoOysrczxhOykoZnx8aTxvKSYmKGhbcCtuW3NdXT10W2krK10pO3JldHVybiBofWZ1bmN0aW9uIEZpKHQsZSl7dmFyIG49LTEscj10Lmxlbmd0aDtmb3IoZXx8KGU9RXQocikpOysrbjxyOyllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gVGkodCxlLHIsaSl7dmFyIG89IXI7cnx8KHI9e30pO2Zvcih2YXIgcz0tMSxhPWUubGVuZ3RoOysrczxhOyl7dmFyIHU9ZVtzXSxjPWk/aShyW3VdLHRbdV0sdSxyLHQpOm47Yz09PW4mJihjPXRbdV0pLG8/YXIocix1LGMpOnJyKHIsdSxjKX1yZXR1cm4gcn1mdW5jdGlvbiBPaSh0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe3ZhciBpPVhzKG4pP0llOm9yLG89ZT9lKCk6e307cmV0dXJuIGkobix0LGxvKHIsMiksbyl9fWZ1bmN0aW9uIExpKHQpe3JldHVybiBRcigoZnVuY3Rpb24oZSxyKXt2YXIgaT0tMSxvPXIubGVuZ3RoLHM9bz4xP3Jbby0xXTpuLGE9bz4yP3JbMl06bjtmb3Iocz10Lmxlbmd0aD4zJiYiZnVuY3Rpb24iPT10eXBlb2Ygcz8oby0tLHMpOm4sYSYmYm8oclswXSxyWzFdLGEpJiYocz1vPDM/bjpzLG89MSksZT1JdChlKTsrK2k8bzspe3ZhciB1PXJbaV07dSYmdChlLHUsaSxzKX1yZXR1cm4gZX0pKX1mdW5jdGlvbiBQaSh0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe2lmKG51bGw9PW4pcmV0dXJuIG47aWYoIUhzKG4pKXJldHVybiB0KG4scik7Zm9yKHZhciBpPW4ubGVuZ3RoLG89ZT9pOi0xLHM9SXQobik7KGU/by0tOisrbzxpKSYmITEhPT1yKHNbb10sbyxzKTspO3JldHVybiBufX1mdW5jdGlvbiBSaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe2Zvcih2YXIgaT0tMSxvPUl0KGUpLHM9cihlKSxhPXMubGVuZ3RoO2EtLTspe3ZhciB1PXNbdD9hOisraV07aWYoITE9PT1uKG9bdV0sdSxvKSlicmVha31yZXR1cm4gZX19ZnVuY3Rpb24gQmkodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWNuKGU9eGEoZSkpP2duKGUpOm4saT1yP3JbMF06ZS5jaGFyQXQoMCksbz1yP0RpKHIsMSkuam9pbigiIik6ZS5zbGljZSgxKTtyZXR1cm4gaVt0XSgpK299fWZ1bmN0aW9uIGtpKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4ga2UoJGEoWWEoZSkucmVwbGFjZShlZSwiIikpLHQsIiIpfX1mdW5jdGlvbiB6aSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQoZVswXSk7Y2FzZSAyOnJldHVybiBuZXcgdChlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSk7Y2FzZSA1OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSl9dmFyIG49Vm4odC5wcm90b3R5cGUpLHI9dC5hcHBseShuLGUpO3JldHVybiBuYShyKT9yOm59fWZ1bmN0aW9uIGppKHQpe3JldHVybiBmdW5jdGlvbihlLHIsaSl7dmFyIG89SXQoZSk7aWYoIUhzKGUpKXt2YXIgcz1sbyhyLDMpO2U9T2EoZSkscj1mdW5jdGlvbih0KXtyZXR1cm4gcyhvW3RdLHQsbyl9fXZhciBhPXQoZSxyLGkpO3JldHVybiBhPi0xP29bcz9lW2FdOmFdOm59fWZ1bmN0aW9uIFVpKHQpe3JldHVybiBpbygoZnVuY3Rpb24oZSl7dmFyIGk9ZS5sZW5ndGgsbz1pLHM9WW4ucHJvdG90eXBlLnRocnU7Zm9yKHQmJmUucmV2ZXJzZSgpO28tLTspe3ZhciBhPWVbb107aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGEpdGhyb3cgbmV3IFR0KHIpO2lmKHMmJiF1JiYid3JhcHBlciI9PXVvKGEpKXZhciB1PW5ldyBZbihbXSwhMCl9Zm9yKG89dT9vOmk7KytvPGk7KXt2YXIgYz11byhhPWVbb10pLGw9IndyYXBwZXIiPT1jP2FvKGEpOm47dT1sJiZFbyhsWzBdKSYmNDI0PT1sWzFdJiYhbFs0XS5sZW5ndGgmJjE9PWxbOV0/dVt1byhsWzBdKV0uYXBwbHkodSxsWzNdKToxPT1hLmxlbmd0aCYmRW8oYSk/dVtjXSgpOnUudGhydShhKX1yZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMsbj10WzBdO2lmKHUmJjE9PXQubGVuZ3RoJiZYcyhuKSlyZXR1cm4gdS5wbGFudChuKS52YWx1ZSgpO2Zvcih2YXIgcj0wLG89aT9lW3JdLmFwcGx5KHRoaXMsdCk6bjsrK3I8aTspbz1lW3JdLmNhbGwodGhpcyxvKTtyZXR1cm4gb319KSl9ZnVuY3Rpb24gcWkodCxlLHIsaSxvLHMsYSx1LGwsaCl7dmFyIGY9ZSZjLHA9MSZlLGQ9MiZlLGc9MjQmZSx5PTUxMiZlLG09ZD9uOnppKHQpO3JldHVybiBmdW5jdGlvbiBjKCl7Zm9yKHZhciB2PWFyZ3VtZW50cy5sZW5ndGgsXz1FdCh2KSx4PXY7eC0tOylfW3hdPWFyZ3VtZW50c1t4XTtpZihnKXZhciB3PWNvKGMpLGI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGgscj0wO24tLTspdFtuXT09PWUmJisrcjtyZXR1cm4gcn0oXyx3KTtpZihpJiYoXz1JaShfLGksbyxnKSkscyYmKF89TWkoXyxzLGEsZykpLHYtPWIsZyYmdjxoKXt2YXIgRD1mbihfLHcpO3JldHVybiBaaSh0LGUscWksYy5wbGFjZWhvbGRlcixyLF8sRCx1LGwsaC12KX12YXIgRT1wP3I6dGhpcyxDPWQ/RVt0XTp0O3JldHVybiB2PV8ubGVuZ3RoLHU/Xz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aCxpPXduKGUubGVuZ3RoLHIpLG89RmkodCk7aS0tOyl7dmFyIHM9ZVtpXTt0W2ldPXdvKHMscik/b1tzXTpufXJldHVybiB0fShfLHUpOnkmJnY+MSYmXy5yZXZlcnNlKCksZiYmbDx2JiYoXy5sZW5ndGg9bCksdGhpcyYmdGhpcyE9PXllJiZ0aGlzIGluc3RhbmNlb2YgYyYmKEM9bXx8emkoQykpLEMuYXBwbHkoRSxfKX19ZnVuY3Rpb24gVmkodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGJyKHQsKGZ1bmN0aW9uKHQsaSxvKXtlKHIsbih0KSxpLG8pfSkpLHJ9KG4sdCxlKHIpLHt9KX19ZnVuY3Rpb24gR2kodCxlKXtyZXR1cm4gZnVuY3Rpb24ocixpKXt2YXIgbztpZihyPT09biYmaT09PW4pcmV0dXJuIGU7aWYociE9PW4mJihvPXIpLGkhPT1uKXtpZihvPT09bilyZXR1cm4gaTsic3RyaW5nIj09dHlwZW9mIHJ8fCJzdHJpbmciPT10eXBlb2YgaT8ocj1oaShyKSxpPWhpKGkpKToocj1saShyKSxpPWxpKGkpKSxvPXQocixpKX1yZXR1cm4gb319ZnVuY3Rpb24gWWkodCl7cmV0dXJuIGlvKChmdW5jdGlvbihlKXtyZXR1cm4gZT1SZShlLHRuKGxvKCkpKSxRcigoZnVuY3Rpb24obil7dmFyIHI9dGhpcztyZXR1cm4gdChlLChmdW5jdGlvbih0KXtyZXR1cm4gTmUodCxyLG4pfSkpfSkpfSkpfWZ1bmN0aW9uIFhpKHQsZSl7dmFyIHI9KGU9ZT09PW4/IiAiOmhpKGUpKS5sZW5ndGg7aWYocjwyKXJldHVybiByP0pyKGUsdCk6ZTt2YXIgaT1KcihlLG1lKHQvZG4oZSkpKTtyZXR1cm4gY24oZSk/RGkoZ24oaSksMCx0KS5qb2luKCIiKTppLnNsaWNlKDAsdCl9ZnVuY3Rpb24gV2kodCl7cmV0dXJuIGZ1bmN0aW9uKGUscixpKXtyZXR1cm4gaSYmIm51bWJlciIhPXR5cGVvZiBpJiZibyhlLHIsaSkmJihyPWk9biksZT1nYShlKSxyPT09bj8ocj1lLGU9MCk6cj1nYShyKSxmdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9LTEsbz14bihtZSgoZS10KS8obnx8MSkpLDApLHM9RXQobyk7by0tOylzW3I/bzorK2ldPXQsdCs9bjtyZXR1cm4gc30oZSxyLGk9aT09PW4/ZTxyPzE6LTE6Z2EoaSksdCl9fWZ1bmN0aW9uIEhpKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmInN0cmluZyI9PXR5cGVvZiBufHwoZT12YShlKSxuPXZhKG4pKSx0KGUsbil9fWZ1bmN0aW9uIFppKHQsZSxyLGksbyxzLGMsbCxoLGYpe3ZhciBwPTgmZTtlfD1wP2E6dSw0JihlJj1+KHA/dTphKSl8fChlJj0tNCk7dmFyIGQ9W3QsZSxvLHA/czpuLHA/YzpuLHA/bjpzLHA/bjpjLGwsaCxmXSxnPXIuYXBwbHkobixkKTtyZXR1cm4gRW8odCkmJlRvKGcsZCksZy5wbGFjZWhvbGRlcj1pLFBvKGcsdCxlKX1mdW5jdGlvbiBLaSh0KXt2YXIgZT1OdFt0XTtyZXR1cm4gZnVuY3Rpb24odCxuKXtpZih0PXZhKHQpLChuPW51bGw9PW4/MDp3bih5YShuKSwyOTIpKSYmVWUodCkpe3ZhciByPSh4YSh0KSsiZSIpLnNwbGl0KCJlIik7cmV0dXJuKygocj0oeGEoZShyWzBdKyJlIisoK3JbMV0rbikpKSsiZSIpLnNwbGl0KCJlIikpWzBdKyJlIisoK3JbMV0tbikpfXJldHVybiBlKHQpfX12YXIgSmk9SW4mJjEvcG4obmV3IEluKFssLTBdKSlbMV09PWg/ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBJbih0KX06bHU7ZnVuY3Rpb24gUWkodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPW1vKGUpO3JldHVybiBuPT1DP2xuKGUpOm49PU0/ZnVuY3Rpb24odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT1bdCx0XX0pKSxufShlKTpmdW5jdGlvbih0LGUpe3JldHVybiBSZShlLChmdW5jdGlvbihlKXtyZXR1cm5bZSx0W2VdXX0pKX0oZSx0KGUpKX19ZnVuY3Rpb24gJGkodCxlLGksaCxmLHAsZCxnKXt2YXIgeT0yJmU7aWYoIXkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTt2YXIgbT1oP2gubGVuZ3RoOjA7aWYobXx8KGUmPS05NyxoPWY9biksZD1kPT09bj9kOnhuKHlhKGQpLDApLGc9Zz09PW4/Zzp5YShnKSxtLT1mP2YubGVuZ3RoOjAsZSZ1KXt2YXIgdj1oLF89ZjtoPWY9bn12YXIgeD15P246YW8odCksdz1bdCxlLGksaCxmLHYsXyxwLGQsZ107aWYoeCYmZnVuY3Rpb24odCxlKXt2YXIgbj10WzFdLHI9ZVsxXSxpPW58cixzPWk8MTMxLGE9cj09YyYmOD09bnx8cj09YyYmbj09bCYmdFs3XS5sZW5ndGg8PWVbOF18fDM4ND09ciYmZVs3XS5sZW5ndGg8PWVbOF0mJjg9PW47aWYoIXMmJiFhKXJldHVybiB0OzEmciYmKHRbMl09ZVsyXSxpfD0xJm4/MDo0KTt2YXIgdT1lWzNdO2lmKHUpe3ZhciBoPXRbM107dFszXT1oP0lpKGgsdSxlWzRdKTp1LHRbNF09aD9mbih0WzNdLG8pOmVbNF19dT1lWzVdLHUmJihoPXRbNV0sdFs1XT1oP01pKGgsdSxlWzZdKTp1LHRbNl09aD9mbih0WzVdLG8pOmVbNl0pLHU9ZVs3XSx1JiYodFs3XT11KSxyJmMmJih0WzhdPW51bGw9PXRbOF0/ZVs4XTp3bih0WzhdLGVbOF0pKSxudWxsPT10WzldJiYodFs5XT1lWzldKSx0WzBdPWVbMF0sdFsxXT1pfSh3LHgpLHQ9d1swXSxlPXdbMV0saT13WzJdLGg9d1szXSxmPXdbNF0sIShnPXdbOV09d1s5XT09PW4/eT8wOnQubGVuZ3RoOnhuKHdbOV0tbSwwKSkmJjI0JmUmJihlJj0tMjUpLGUmJjEhPWUpYj04PT1lfHxlPT1zP2Z1bmN0aW9uKHQsZSxyKXt2YXIgaT16aSh0KTtyZXR1cm4gZnVuY3Rpb24gbygpe2Zvcih2YXIgcz1hcmd1bWVudHMubGVuZ3RoLGE9RXQocyksdT1zLGM9Y28obyk7dS0tOylhW3VdPWFyZ3VtZW50c1t1XTt2YXIgbD1zPDMmJmFbMF0hPT1jJiZhW3MtMV0hPT1jP1tdOmZuKGEsYyk7cmV0dXJuKHMtPWwubGVuZ3RoKTxyP1ppKHQsZSxxaSxvLnBsYWNlaG9sZGVyLG4sYSxsLG4sbixyLXMpOk5lKHRoaXMmJnRoaXMhPT15ZSYmdGhpcyBpbnN0YW5jZW9mIG8/aTp0LHRoaXMsYSl9fSh0LGUsZyk6ZSE9YSYmMzMhPWV8fGYubGVuZ3RoP3FpLmFwcGx5KG4sdyk6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9MSZlLG89emkodCk7cmV0dXJuIGZ1bmN0aW9uIGUoKXtmb3IodmFyIHM9LTEsYT1hcmd1bWVudHMubGVuZ3RoLHU9LTEsYz1yLmxlbmd0aCxsPUV0KGMrYSksaD10aGlzJiZ0aGlzIT09eWUmJnRoaXMgaW5zdGFuY2VvZiBlP286dDsrK3U8YzspbFt1XT1yW3VdO2Zvcig7YS0tOylsW3UrK109YXJndW1lbnRzWysrc107cmV0dXJuIE5lKGgsaT9uOnRoaXMsbCl9fSh0LGUsaSxoKTtlbHNlIHZhciBiPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0xJmUsaT16aSh0KTtyZXR1cm4gZnVuY3Rpb24gZSgpe3JldHVybih0aGlzJiZ0aGlzIT09eWUmJnRoaXMgaW5zdGFuY2VvZiBlP2k6dCkuYXBwbHkocj9uOnRoaXMsYXJndW1lbnRzKX19KHQsZSxpKTtyZXR1cm4gUG8oKHg/bmk6VG8pKGIsdyksdCxlKX1mdW5jdGlvbiB0byh0LGUscixpKXtyZXR1cm4gdD09PW58fHFzKHQsUHRbcl0pJiYha3QuY2FsbChpLHIpP2U6dH1mdW5jdGlvbiBlbyh0LGUscixpLG8scyl7cmV0dXJuIG5hKHQpJiZuYShlKSYmKHMuc2V0KGUsdCksR3IodCxlLG4sZW8scykscy5kZWxldGUoZSkpLHR9ZnVuY3Rpb24gbm8odCl7cmV0dXJuIHNhKHQpP246dH1mdW5jdGlvbiBybyh0LGUscixpLG8scyl7dmFyIGE9MSZyLHU9dC5sZW5ndGgsYz1lLmxlbmd0aDtpZih1IT1jJiYhKGEmJmM+dSkpcmV0dXJuITE7dmFyIGw9cy5nZXQodCksaD1zLmdldChlKTtpZihsJiZoKXJldHVybiBsPT1lJiZoPT10O3ZhciBmPS0xLHA9ITAsZD0yJnI/bmV3IEtuOm47Zm9yKHMuc2V0KHQsZSkscy5zZXQoZSx0KTsrK2Y8dTspe3ZhciBnPXRbZl0seT1lW2ZdO2lmKGkpdmFyIG09YT9pKHksZyxmLGUsdCxzKTppKGcseSxmLHQsZSxzKTtpZihtIT09bil7aWYobSljb250aW51ZTtwPSExO2JyZWFrfWlmKGQpe2lmKCFqZShlLChmdW5jdGlvbih0LGUpe2lmKCFubihkLGUpJiYoZz09PXR8fG8oZyx0LHIsaSxzKSkpcmV0dXJuIGQucHVzaChlKX0pKSl7cD0hMTticmVha319ZWxzZSBpZihnIT09eSYmIW8oZyx5LHIsaSxzKSl7cD0hMTticmVha319cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLHB9ZnVuY3Rpb24gaW8odCl7cmV0dXJuIExvKElvKHQsbixXbyksdCsiIil9ZnVuY3Rpb24gb28odCl7cmV0dXJuIFNyKHQsT2EsZ28pfWZ1bmN0aW9uIHNvKHQpe3JldHVybiBTcih0LExhLHlvKX12YXIgYW89VG4/ZnVuY3Rpb24odCl7cmV0dXJuIFRuLmdldCh0KX06bHU7ZnVuY3Rpb24gdW8odCl7Zm9yKHZhciBlPXQubmFtZSsiIixuPU9uW2VdLHI9a3QuY2FsbChPbixlKT9uLmxlbmd0aDowO3ItLTspe3ZhciBpPW5bcl0sbz1pLmZ1bmM7aWYobnVsbD09b3x8bz09dClyZXR1cm4gaS5uYW1lfXJldHVybiBlfWZ1bmN0aW9uIGNvKHQpe3JldHVybihrdC5jYWxsKHFuLCJwbGFjZWhvbGRlciIpP3FuOnQpLnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGxvKCl7dmFyIHQ9cW4uaXRlcmF0ZWV8fHN1O3JldHVybiB0PXQ9PT1zdT9Ccjp0LGFyZ3VtZW50cy5sZW5ndGg/dChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTp0fWZ1bmN0aW9uIGhvKHQsZSl7dmFyIG49dC5fX2RhdGFfXztyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH0oZSk/blsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpuLm1hcH1mdW5jdGlvbiBmbyh0KXtmb3IodmFyIGU9T2EodCksbj1lLmxlbmd0aDtuLS07KXt2YXIgcj1lW25dLGk9dFtyXTtlW25dPVtyLGksQW8oaSldfXJldHVybiBlfWZ1bmN0aW9uIHBvKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD9uOnRbZV19KHQsZSk7cmV0dXJuIFJyKHIpP3I6bn12YXIgZ289eGU/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9SXQodCksT2UoeGUodCksKGZ1bmN0aW9uKGUpe3JldHVybiBKdC5jYWxsKHQsZSl9KSkpfTptdSx5bz14ZT9mdW5jdGlvbih0KXtmb3IodmFyIGU9W107dDspQmUoZSxnbyh0KSksdD1adCh0KTtyZXR1cm4gZX06bXUsbW89QXI7ZnVuY3Rpb24gdm8odCxlLG4pe2Zvcih2YXIgcj0tMSxpPShlPXdpKGUsdCkpLmxlbmd0aCxvPSExOysrcjxpOyl7dmFyIHM9em8oZVtyXSk7aWYoIShvPW51bGwhPXQmJm4odCxzKSkpYnJlYWs7dD10W3NdfXJldHVybiBvfHwrK3IhPWk/bzohIShpPW51bGw9PXQ/MDp0Lmxlbmd0aCkmJmVhKGkpJiZ3byhzLGkpJiYoWHModCl8fFlzKHQpKX1mdW5jdGlvbiBfbyh0KXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdC5jb25zdHJ1Y3Rvcnx8U28odCk/e306Vm4oWnQodCkpfWZ1bmN0aW9uIHhvKHQpe3JldHVybiBYcyh0KXx8WXModCl8fCEhKCR0JiZ0JiZ0WyR0XSl9ZnVuY3Rpb24gd28odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/ZjplKSYmKCJudW1iZXIiPT1ufHwic3ltYm9sIiE9biYmeHQudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfWZ1bmN0aW9uIGJvKHQsZSxuKXtpZighbmEobikpcmV0dXJuITE7dmFyIHI9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PXI/SHMobikmJndvKGUsbi5sZW5ndGgpOiJzdHJpbmciPT1yJiZlIGluIG4pJiZxcyhuW2VdLHQpfWZ1bmN0aW9uIERvKHQsZSl7aWYoWHModCkpcmV0dXJuITE7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9dCYmIWxhKHQpKXx8KG50LnRlc3QodCl8fCFldC50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIEl0KGUpKX1mdW5jdGlvbiBFbyh0KXt2YXIgZT11byh0KSxuPXFuW2VdO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBufHwhKGUgaW4gWG4ucHJvdG90eXBlKSlyZXR1cm4hMTtpZih0PT09bilyZXR1cm4hMDt2YXIgcj1hbyhuKTtyZXR1cm4hIXImJnQ9PT1yWzBdfShTbiYmbW8obmV3IFNuKG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1QfHxBbiYmbW8obmV3IEFuKSE9Q3x8Tm4mJm1vKE5uLnJlc29sdmUoKSkhPU58fEluJiZtbyhuZXcgSW4pIT1NfHxNbiYmbW8obmV3IE1uKSE9TykmJihtbz1mdW5jdGlvbih0KXt2YXIgZT1Bcih0KSxyPWU9PUE/dC5jb25zdHJ1Y3RvcjpuLGk9cj9qbyhyKToiIjtpZihpKXN3aXRjaChpKXtjYXNlIExuOnJldHVybiBQO2Nhc2UgUG46cmV0dXJuIEM7Y2FzZSBSbjpyZXR1cm4gTjtjYXNlIEJuOnJldHVybiBNO2Nhc2Uga246cmV0dXJuIE99cmV0dXJuIGV9KTt2YXIgQ289UnQ/JHM6dnU7ZnVuY3Rpb24gU28odCl7dmFyIGU9dCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4gdD09PSgiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5wcm90b3R5cGV8fFB0KX1mdW5jdGlvbiBBbyh0KXtyZXR1cm4gdD09dCYmIW5hKHQpfWZ1bmN0aW9uIE5vKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiYoclt0XT09PWUmJihlIT09bnx8dCBpbiBJdChyKSkpfX1mdW5jdGlvbiBJbyh0LGUscil7cmV0dXJuIGU9eG4oZT09PW4/dC5sZW5ndGgtMTplLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPWFyZ3VtZW50cyxpPS0xLG89eG4obi5sZW5ndGgtZSwwKSxzPUV0KG8pOysraTxvOylzW2ldPW5bZStpXTtpPS0xO2Zvcih2YXIgYT1FdChlKzEpOysraTxlOylhW2ldPW5baV07cmV0dXJuIGFbZV09cihzKSxOZSh0LHRoaXMsYSl9fWZ1bmN0aW9uIE1vKHQsZSl7cmV0dXJuIGUubGVuZ3RoPDI/dDpDcih0LG9pKGUsMCwtMSkpfWZ1bmN0aW9uIEZvKHQsZSl7aWYoKCJjb25zdHJ1Y3RvciIhPT1lfHwiZnVuY3Rpb24iIT10eXBlb2YgdFtlXSkmJiJfX3Byb3RvX18iIT1lKXJldHVybiB0W2VdfXZhciBUbz1SbyhuaSksT289Z2V8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHllLnNldFRpbWVvdXQodCxlKX0sTG89Um8ocmkpO2Z1bmN0aW9uIFBvKHQsZSxuKXt2YXIgcj1lKyIiO3JldHVybiBMbyh0LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5sZW5ndGg7aWYoIW4pcmV0dXJuIHQ7dmFyIHI9bi0xO3JldHVybiBlW3JdPShuPjE/IiYgIjoiIikrZVtyXSxlPWUuam9pbihuPjI/IiwgIjoiICIpLHQucmVwbGFjZSh1dCwie1xuLyogW3dyYXBwZWQgd2l0aCAiK2UrIl0gKi9cbiIpfShyLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1lKG0sKGZ1bmN0aW9uKG4pe3ZhciByPSJfLiIrblswXTtlJm5bMV0mJiFMZSh0LHIpJiZ0LnB1c2gocil9KSksdC5zb3J0KCl9KGZ1bmN0aW9uKHQpe3ZhciBlPXQubWF0Y2goY3QpO3JldHVybiBlP2VbMV0uc3BsaXQobHQpOltdfShyKSxuKSkpfWZ1bmN0aW9uIFJvKHQpe3ZhciBlPTAscj0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWJuKCksbz0xNi0oaS1yKTtpZihyPWksbz4wKXtpZigrK2U+PTgwMClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KG4sYXJndW1lbnRzKX19ZnVuY3Rpb24gQm8odCxlKXt2YXIgcj0tMSxpPXQubGVuZ3RoLG89aS0xO2ZvcihlPWU9PT1uP2k6ZTsrK3I8ZTspe3ZhciBzPUtyKHIsbyksYT10W3NdO3Rbc109dFtyXSx0W3JdPWF9cmV0dXJuIHQubGVuZ3RoPWUsdH12YXIga289ZnVuY3Rpb24odCl7dmFyIGU9UnModCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PW4uc2l6ZSYmbi5jbGVhcigpLHR9KSksbj1lLmNhY2hlO3JldHVybiBlfSgoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ2PT09dC5jaGFyQ29kZUF0KDApJiZlLnB1c2goIiIpLHQucmVwbGFjZShydCwoZnVuY3Rpb24odCxuLHIsaSl7ZS5wdXNoKHI/aS5yZXBsYWNlKHB0LCIkMSIpOm58fHQpfSkpLGV9KSk7ZnVuY3Rpb24gem8odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxsYSh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0taD8iLTAiOmV9ZnVuY3Rpb24gam8odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBCdC5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn1mdW5jdGlvbiBVbyh0KXtpZih0IGluc3RhbmNlb2YgWG4pcmV0dXJuIHQuY2xvbmUoKTt2YXIgZT1uZXcgWW4odC5fX3dyYXBwZWRfXyx0Ll9fY2hhaW5fXyk7cmV0dXJuIGUuX19hY3Rpb25zX189RmkodC5fX2FjdGlvbnNfXyksZS5fX2luZGV4X189dC5fX2luZGV4X18sZS5fX3ZhbHVlc19fPXQuX192YWx1ZXNfXyxlfXZhciBxbz1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gWnModCk/cHIodCxfcihlLDEsWnMsITApKTpbXX0pKSxWbz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1RbyhlKTtyZXR1cm4gWnMocikmJihyPW4pLFpzKHQpP3ByKHQsX3IoZSwxLFpzLCEwKSxsbyhyLDIpKTpbXX0pKSxHbz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1RbyhlKTtyZXR1cm4gWnMocikmJihyPW4pLFpzKHQpP3ByKHQsX3IoZSwxLFpzLCEwKSxuLHIpOltdfSkpO2Z1bmN0aW9uIFlvKHQsZSxuKXt2YXIgcj1udWxsPT10PzA6dC5sZW5ndGg7aWYoIXIpcmV0dXJuLTE7dmFyIGk9bnVsbD09bj8wOnlhKG4pO3JldHVybiBpPDAmJihpPXhuKHIraSwwKSksVmUodCxsbyhlLDMpLGkpfWZ1bmN0aW9uIFhvKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7aWYoIWkpcmV0dXJuLTE7dmFyIG89aS0xO3JldHVybiByIT09biYmKG89eWEociksbz1yPDA/eG4oaStvLDApOnduKG8saS0xKSksVmUodCxsbyhlLDMpLG8sITApfWZ1bmN0aW9uIFdvKHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP19yKHQsMSk6W119ZnVuY3Rpb24gSG8odCl7cmV0dXJuIHQmJnQubGVuZ3RoP3RbMF06bn12YXIgWm89UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVJlKHQsX2kpO3JldHVybiBlLmxlbmd0aCYmZVswXT09PXRbMF0/RnIoZSk6W119KSksS289UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpLHI9UmUodCxfaSk7cmV0dXJuIGU9PT1RbyhyKT9lPW46ci5wb3AoKSxyLmxlbmd0aCYmclswXT09PXRbMF0/RnIocixsbyhlLDIpKTpbXX0pKSxKbz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCkscj1SZSh0LF9pKTtyZXR1cm4oZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4pJiZyLnBvcCgpLHIubGVuZ3RoJiZyWzBdPT09dFswXT9GcihyLG4sZSk6W119KSk7ZnVuY3Rpb24gUW8odCl7dmFyIGU9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBlP3RbZS0xXTpufXZhciAkbz1Rcih0cyk7ZnVuY3Rpb24gdHModCxlKXtyZXR1cm4gdCYmdC5sZW5ndGgmJmUmJmUubGVuZ3RoP0hyKHQsZSk6dH12YXIgZXM9aW8oKGZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoLHI9dXIodCxlKTtyZXR1cm4gWnIodCxSZShlLChmdW5jdGlvbih0KXtyZXR1cm4gd28odCxuKT8rdDp0fSkpLnNvcnQoTmkpKSxyfSkpO2Z1bmN0aW9uIG5zKHQpe3JldHVybiBudWxsPT10P3Q6Q24uY2FsbCh0KX12YXIgcnM9UXIoKGZ1bmN0aW9uKHQpe3JldHVybiBmaShfcih0LDEsWnMsITApKX0pKSxpcz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCk7cmV0dXJuIFpzKGUpJiYoZT1uKSxmaShfcih0LDEsWnMsITApLGxvKGUsMikpfSkpLG9zPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KTtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4sZmkoX3IodCwxLFpzLCEwKSxuLGUpfSkpO2Z1bmN0aW9uIHNzKHQpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuW107dmFyIGU9MDtyZXR1cm4gdD1PZSh0LChmdW5jdGlvbih0KXtpZihacyh0KSlyZXR1cm4gZT14bih0Lmxlbmd0aCxlKSwhMH0pKSxRZShlLChmdW5jdGlvbihlKXtyZXR1cm4gUmUodCxIZShlKSl9KSl9ZnVuY3Rpb24gYXModCxlKXtpZighdHx8IXQubGVuZ3RoKXJldHVybltdO3ZhciByPXNzKHQpO3JldHVybiBudWxsPT1lP3I6UmUociwoZnVuY3Rpb24odCl7cmV0dXJuIE5lKGUsbix0KX0pKX12YXIgdXM9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFpzKHQpP3ByKHQsZSk6W119KSksY3M9UXIoKGZ1bmN0aW9uKHQpe3JldHVybiBtaShPZSh0LFpzKSl9KSksbHM9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpO3JldHVybiBacyhlKSYmKGU9biksbWkoT2UodCxacyksbG8oZSwyKSl9KSksaHM9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpO3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bixtaShPZSh0LFpzKSxuLGUpfSkpLGZzPVFyKHNzKTt2YXIgcHM9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoLHI9ZT4xP3RbZS0xXTpuO3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiByPyh0LnBvcCgpLHIpOm4sYXModCxyKX0pKTtmdW5jdGlvbiBkcyh0KXt2YXIgZT1xbih0KTtyZXR1cm4gZS5fX2NoYWluX189ITAsZX1mdW5jdGlvbiBncyh0LGUpe3JldHVybiBlKHQpfXZhciB5cz1pbygoZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscj1lP3RbMF06MCxpPXRoaXMuX193cmFwcGVkX18sbz1mdW5jdGlvbihlKXtyZXR1cm4gdXIoZSx0KX07cmV0dXJuIShlPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKSYmaSBpbnN0YW5jZW9mIFhuJiZ3byhyKT8oKGk9aS5zbGljZShyLCtyKyhlPzE6MCkpKS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOmdzLGFyZ3M6W29dLHRoaXNBcmc6bn0pLG5ldyBZbihpLHRoaXMuX19jaGFpbl9fKS50aHJ1KChmdW5jdGlvbih0KXtyZXR1cm4gZSYmIXQubGVuZ3RoJiZ0LnB1c2gobiksdH0pKSk6dGhpcy50aHJ1KG8pfSkpO3ZhciBtcz1PaSgoZnVuY3Rpb24odCxlLG4pe2t0LmNhbGwodCxuKT8rK3Rbbl06YXIodCxuLDEpfSkpO3ZhciB2cz1qaShZbyksX3M9amkoWG8pO2Z1bmN0aW9uIHhzKHQsZSl7cmV0dXJuKFhzKHQpP01lOmRyKSh0LGxvKGUsMykpfWZ1bmN0aW9uIHdzKHQsZSl7cmV0dXJuKFhzKHQpP0ZlOmdyKSh0LGxvKGUsMykpfXZhciBicz1PaSgoZnVuY3Rpb24odCxlLG4pe2t0LmNhbGwodCxuKT90W25dLnB1c2goZSk6YXIodCxuLFtlXSl9KSk7dmFyIERzPVFyKChmdW5jdGlvbih0LGUsbil7dmFyIHI9LTEsaT0iZnVuY3Rpb24iPT10eXBlb2YgZSxvPUhzKHQpP0V0KHQubGVuZ3RoKTpbXTtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCl7b1srK3JdPWk/TmUoZSx0LG4pOlRyKHQsZSxuKX0pKSxvfSkpLEVzPU9pKChmdW5jdGlvbih0LGUsbil7YXIodCxuLGUpfSkpO2Z1bmN0aW9uIENzKHQsZSl7cmV0dXJuKFhzKHQpP1JlOlVyKSh0LGxvKGUsMykpfXZhciBTcz1PaSgoZnVuY3Rpb24odCxlLG4pe3Rbbj8wOjFdLnB1c2goZSl9KSwoZnVuY3Rpb24oKXtyZXR1cm5bW10sW11dfSkpO3ZhciBBcz1RcigoZnVuY3Rpb24odCxlKXtpZihudWxsPT10KXJldHVybltdO3ZhciBuPWUubGVuZ3RoO3JldHVybiBuPjEmJmJvKHQsZVswXSxlWzFdKT9lPVtdOm4+MiYmYm8oZVswXSxlWzFdLGVbMl0pJiYoZT1bZVswXV0pLFhyKHQsX3IoZSwxKSxbXSl9KSksTnM9ZGV8fGZ1bmN0aW9uKCl7cmV0dXJuIHllLkRhdGUubm93KCl9O2Z1bmN0aW9uIElzKHQsZSxyKXtyZXR1cm4gZT1yP246ZSxlPXQmJm51bGw9PWU/dC5sZW5ndGg6ZSwkaSh0LGMsbixuLG4sbixlKX1mdW5jdGlvbiBNcyh0LGUpe3ZhciBpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUdChyKTtyZXR1cm4gdD15YSh0KSxmdW5jdGlvbigpe3JldHVybi0tdD4wJiYoaT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdDw9MSYmKGU9biksaX19dmFyIEZzPVFyKChmdW5jdGlvbih0LGUsbil7dmFyIHI9MTtpZihuLmxlbmd0aCl7dmFyIGk9Zm4obixjbyhGcykpO3J8PWF9cmV0dXJuICRpKHQscixlLG4saSl9KSksVHM9UXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0zO2lmKG4ubGVuZ3RoKXt2YXIgaT1mbihuLGNvKFRzKSk7cnw9YX1yZXR1cm4gJGkoZSxyLHQsbixpKX0pKTtmdW5jdGlvbiBPcyh0LGUsaSl7dmFyIG8scyxhLHUsYyxsLGg9MCxmPSExLHA9ITEsZD0hMDtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7ZnVuY3Rpb24gZyhlKXt2YXIgcj1vLGk9cztyZXR1cm4gbz1zPW4saD1lLHU9dC5hcHBseShpLHIpfWZ1bmN0aW9uIHkodCl7dmFyIHI9dC1sO3JldHVybiBsPT09bnx8cj49ZXx8cjwwfHxwJiZ0LWg+PWF9ZnVuY3Rpb24gbSgpe3ZhciB0PU5zKCk7aWYoeSh0KSlyZXR1cm4gdih0KTtjPU9vKG0sZnVuY3Rpb24odCl7dmFyIG49ZS0odC1sKTtyZXR1cm4gcD93bihuLGEtKHQtaCkpOm59KHQpKX1mdW5jdGlvbiB2KHQpe3JldHVybiBjPW4sZCYmbz9nKHQpOihvPXM9bix1KX1mdW5jdGlvbiBfKCl7dmFyIHQ9TnMoKSxyPXkodCk7aWYobz1hcmd1bWVudHMscz10aGlzLGw9dCxyKXtpZihjPT09bilyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGg9dCxjPU9vKG0sZSksZj9nKHQpOnV9KGwpO2lmKHApcmV0dXJuIEVpKGMpLGM9T28obSxlKSxnKGwpfXJldHVybiBjPT09biYmKGM9T28obSxlKSksdX1yZXR1cm4gZT12YShlKXx8MCxuYShpKSYmKGY9ISFpLmxlYWRpbmcsYT0ocD0ibWF4V2FpdCJpbiBpKT94bih2YShpLm1heFdhaXQpfHwwLGUpOmEsZD0idHJhaWxpbmciaW4gaT8hIWkudHJhaWxpbmc6ZCksXy5jYW5jZWw9ZnVuY3Rpb24oKXtjIT09biYmRWkoYyksaD0wLG89bD1zPWM9bn0sXy5mbHVzaD1mdW5jdGlvbigpe3JldHVybiBjPT09bj91OnYoTnMoKSl9LF99dmFyIExzPVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBmcih0LDEsZSl9KSksUHM9UXIoKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnIodCx2YShlKXx8MCxuKX0pKTtmdW5jdGlvbiBScyh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHQocik7dmFyIG49ZnVuY3Rpb24oKXt2YXIgcj1hcmd1bWVudHMsaT1lP2UuYXBwbHkodGhpcyxyKTpyWzBdLG89bi5jYWNoZTtpZihvLmhhcyhpKSlyZXR1cm4gby5nZXQoaSk7dmFyIHM9dC5hcHBseSh0aGlzLHIpO3JldHVybiBuLmNhY2hlPW8uc2V0KGkscyl8fG8sc307cmV0dXJuIG4uY2FjaGU9bmV3KFJzLkNhY2hlfHxabiksbn1mdW5jdGlvbiBCcyh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiF0LmNhbGwodGhpcyk7Y2FzZSAxOnJldHVybiF0LmNhbGwodGhpcyxlWzBdKTtjYXNlIDI6cmV0dXJuIXQuY2FsbCh0aGlzLGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiF0LmNhbGwodGhpcyxlWzBdLGVbMV0sZVsyXSl9cmV0dXJuIXQuYXBwbHkodGhpcyxlKX19UnMuQ2FjaGU9Wm47dmFyIGtzPWJpKChmdW5jdGlvbih0LGUpe3ZhciBuPShlPTE9PWUubGVuZ3RoJiZYcyhlWzBdKT9SZShlWzBdLHRuKGxvKCkpKTpSZShfcihlLDEpLHRuKGxvKCkpKSkubGVuZ3RoO3JldHVybiBRcigoZnVuY3Rpb24ocil7Zm9yKHZhciBpPS0xLG89d24oci5sZW5ndGgsbik7KytpPG87KXJbaV09ZVtpXS5jYWxsKHRoaXMscltpXSk7cmV0dXJuIE5lKHQsdGhpcyxyKX0pKX0pKSx6cz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1mbihlLGNvKHpzKSk7cmV0dXJuICRpKHQsYSxuLGUscil9KSksanM9UXIoKGZ1bmN0aW9uKHQsZSl7dmFyIHI9Zm4oZSxjbyhqcykpO3JldHVybiAkaSh0LHUsbixlLHIpfSkpLFVzPWlvKChmdW5jdGlvbih0LGUpe3JldHVybiAkaSh0LGwsbixuLG4sZSl9KSk7ZnVuY3Rpb24gcXModCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9dmFyIFZzPUhpKE5yKSxHcz1IaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdD49ZX0pKSxZcz1PcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP09yOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYma3QuY2FsbCh0LCJjYWxsZWUiKSYmIUp0LmNhbGwodCwiY2FsbGVlIil9LFhzPUV0LmlzQXJyYXksV3M9YmU/dG4oYmUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmQXIodCk9PUx9O2Z1bmN0aW9uIEhzKHQpe3JldHVybiBudWxsIT10JiZlYSh0Lmxlbmd0aCkmJiEkcyh0KX1mdW5jdGlvbiBacyh0KXtyZXR1cm4gcmEodCkmJkhzKHQpfXZhciBLcz13ZXx8dnUsSnM9RGU/dG4oRGUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmQXIodCk9PXd9O2Z1bmN0aW9uIFFzKHQpe2lmKCFyYSh0KSlyZXR1cm4hMTt2YXIgZT1Bcih0KTtyZXR1cm4gZT09Ynx8IltvYmplY3QgRE9NRXhjZXB0aW9uXSI9PWV8fCJzdHJpbmciPT10eXBlb2YgdC5tZXNzYWdlJiYic3RyaW5nIj09dHlwZW9mIHQubmFtZSYmIXNhKHQpfWZ1bmN0aW9uICRzKHQpe2lmKCFuYSh0KSlyZXR1cm4hMTt2YXIgZT1Bcih0KTtyZXR1cm4gZT09RHx8ZT09RXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfWZ1bmN0aW9uIHRhKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD09eWEodCl9ZnVuY3Rpb24gZWEodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PWZ9ZnVuY3Rpb24gbmEodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9ZnVuY3Rpb24gcmEodCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH12YXIgaWE9RWU/dG4oRWUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmbW8odCk9PUN9O2Z1bmN0aW9uIG9hKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8cmEodCkmJkFyKHQpPT1TfWZ1bmN0aW9uIHNhKHQpe2lmKCFyYSh0KXx8QXIodCkhPUEpcmV0dXJuITE7dmFyIGU9WnQodCk7aWYobnVsbD09PWUpcmV0dXJuITA7dmFyIG49a3QuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuIGluc3RhbmNlb2YgbiYmQnQuY2FsbChuKT09cXR9dmFyIGFhPUNlP3RuKENlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJkFyKHQpPT1JfTt2YXIgdWE9U2U/dG4oU2UpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmbW8odCk9PU19O2Z1bmN0aW9uIGNhKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8IVhzKHQpJiZyYSh0KSYmQXIodCk9PUZ9ZnVuY3Rpb24gbGEodCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxyYSh0KSYmQXIodCk9PVR9dmFyIGhhPUFlP3RuKEFlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJmVhKHQubGVuZ3RoKSYmISFjZVtBcih0KV19O3ZhciBmYT1IaShqcikscGE9SGkoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8PWV9KSk7ZnVuY3Rpb24gZGEodCl7aWYoIXQpcmV0dXJuW107aWYoSHModCkpcmV0dXJuIGNhKHQpP2duKHQpOkZpKHQpO2lmKHRlJiZ0W3RlXSlyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49W107IShlPXQubmV4dCgpKS5kb25lOyluLnB1c2goZS52YWx1ZSk7cmV0dXJuIG59KHRbdGVdKCkpO3ZhciBlPW1vKHQpO3JldHVybihlPT1DP2xuOmU9PU0/cG46cWEpKHQpfWZ1bmN0aW9uIGdhKHQpe3JldHVybiB0Pyh0PXZhKHQpKT09PWh8fHQ9PT0taD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9ZnVuY3Rpb24geWEodCl7dmFyIGU9Z2EodCksbj1lJTE7cmV0dXJuIGU9PWU/bj9lLW46ZTowfWZ1bmN0aW9uIG1hKHQpe3JldHVybiB0P2NyKHlhKHQpLDAsZCk6MH1mdW5jdGlvbiB2YSh0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYobGEodCkpcmV0dXJuIHA7aWYobmEodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PW5hKGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD0kZSh0KTt2YXIgbj1tdC50ZXN0KHQpO3JldHVybiBufHxfdC50ZXN0KHQpP3BlKHQuc2xpY2UoMiksbj8yOjgpOnl0LnRlc3QodCk/cDordH1mdW5jdGlvbiBfYSh0KXtyZXR1cm4gVGkodCxMYSh0KSl9ZnVuY3Rpb24geGEodCl7cmV0dXJuIG51bGw9PXQ/IiI6aGkodCl9dmFyIHdhPUxpKChmdW5jdGlvbih0LGUpe2lmKFNvKGUpfHxIcyhlKSlUaShlLE9hKGUpLHQpO2Vsc2UgZm9yKHZhciBuIGluIGUpa3QuY2FsbChlLG4pJiZycih0LG4sZVtuXSl9KSksYmE9TGkoKGZ1bmN0aW9uKHQsZSl7VGkoZSxMYShlKSx0KX0pKSxEYT1MaSgoZnVuY3Rpb24odCxlLG4scil7VGkoZSxMYShlKSx0LHIpfSkpLEVhPUxpKChmdW5jdGlvbih0LGUsbixyKXtUaShlLE9hKGUpLHQscil9KSksQ2E9aW8odXIpO3ZhciBTYT1RcigoZnVuY3Rpb24odCxlKXt0PUl0KHQpO3ZhciByPS0xLGk9ZS5sZW5ndGgsbz1pPjI/ZVsyXTpuO2ZvcihvJiZibyhlWzBdLGVbMV0sbykmJihpPTEpOysrcjxpOylmb3IodmFyIHM9ZVtyXSxhPUxhKHMpLHU9LTEsYz1hLmxlbmd0aDsrK3U8Yzspe3ZhciBsPWFbdV0saD10W2xdOyhoPT09bnx8cXMoaCxQdFtsXSkmJiFrdC5jYWxsKHQsbCkpJiYodFtsXT1zW2xdKX1yZXR1cm4gdH0pKSxBYT1RcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucHVzaChuLGVvKSxOZShSYSxuLHQpfSkpO2Z1bmN0aW9uIE5hKHQsZSxyKXt2YXIgaT1udWxsPT10P246Q3IodCxlKTtyZXR1cm4gaT09PW4/cjppfWZ1bmN0aW9uIElhKHQsZSl7cmV0dXJuIG51bGwhPXQmJnZvKHQsZSxNcil9dmFyIE1hPVZpKChmdW5jdGlvbih0LGUsbil7bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUudG9TdHJpbmcmJihlPVV0LmNhbGwoZSkpLHRbZV09bn0pLG51KG91KSksRmE9VmkoKGZ1bmN0aW9uKHQsZSxuKXtudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZyYmKGU9VXQuY2FsbChlKSksa3QuY2FsbCh0LGUpP3RbZV0ucHVzaChuKTp0W2VdPVtuXX0pLGxvKSxUYT1RcihUcik7ZnVuY3Rpb24gT2EodCl7cmV0dXJuIEhzKHQpP1FuKHQpOmtyKHQpfWZ1bmN0aW9uIExhKHQpe3JldHVybiBIcyh0KT9Rbih0LCEwKTp6cih0KX12YXIgUGE9TGkoKGZ1bmN0aW9uKHQsZSxuKXtHcih0LGUsbil9KSksUmE9TGkoKGZ1bmN0aW9uKHQsZSxuLHIpe0dyKHQsZSxuLHIpfSkpLEJhPWlvKChmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2lmKG51bGw9PXQpcmV0dXJuIG47dmFyIHI9ITE7ZT1SZShlLChmdW5jdGlvbihlKXtyZXR1cm4gZT13aShlLHQpLHJ8fChyPWUubGVuZ3RoPjEpLGV9KSksVGkodCxzbyh0KSxuKSxyJiYobj1scihuLDcsbm8pKTtmb3IodmFyIGk9ZS5sZW5ndGg7aS0tOylwaShuLGVbaV0pO3JldHVybiBufSkpO3ZhciBrYT1pbygoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD97fTpmdW5jdGlvbih0LGUpe3JldHVybiBXcih0LGUsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIElhKHQsbil9KSl9KHQsZSl9KSk7ZnVuY3Rpb24gemEodCxlKXtpZihudWxsPT10KXJldHVybnt9O3ZhciBuPVJlKHNvKHQpLChmdW5jdGlvbih0KXtyZXR1cm5bdF19KSk7cmV0dXJuIGU9bG8oZSksV3IodCxuLChmdW5jdGlvbih0LG4pe3JldHVybiBlKHQsblswXSl9KSl9dmFyIGphPVFpKE9hKSxVYT1RaShMYSk7ZnVuY3Rpb24gcWEodCl7cmV0dXJuIG51bGw9PXQ/W106ZW4odCxPYSh0KSl9dmFyIFZhPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIGU9ZS50b0xvd2VyQ2FzZSgpLHQrKG4/R2EoZSk6ZSl9KSk7ZnVuY3Rpb24gR2EodCl7cmV0dXJuIFFhKHhhKHQpLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIFlhKHQpe3JldHVybih0PXhhKHQpKSYmdC5yZXBsYWNlKHd0LHNuKS5yZXBsYWNlKG5lLCIiKX12YXIgWGE9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iLSI6IiIpK2UudG9Mb3dlckNhc2UoKX0pKSxXYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyIgIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpLEhhPUJpKCJ0b0xvd2VyQ2FzZSIpO3ZhciBaYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyJfIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpO3ZhciBLYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyIgIjoiIikrUWEoZSl9KSk7dmFyIEphPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStlLnRvVXBwZXJDYXNlKCl9KSksUWE9QmkoInRvVXBwZXJDYXNlIik7ZnVuY3Rpb24gJGEodCxlLHIpe3JldHVybiB0PXhhKHQpLChlPXI/bjplKT09PW4/ZnVuY3Rpb24odCl7cmV0dXJuIHNlLnRlc3QodCl9KHQpP2Z1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKGllKXx8W119KHQpOmZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKGh0KXx8W119KHQpOnQubWF0Y2goZSl8fFtdfXZhciB0dT1RcigoZnVuY3Rpb24odCxlKXt0cnl7cmV0dXJuIE5lKHQsbixlKX1jYXRjaCh0KXtyZXR1cm4gUXModCk/dDpuZXcgU3QodCl9fSkpLGV1PWlvKChmdW5jdGlvbih0LGUpe3JldHVybiBNZShlLChmdW5jdGlvbihlKXtlPXpvKGUpLGFyKHQsZSxGcyh0W2VdLHQpKX0pKSx0fSkpO2Z1bmN0aW9uIG51KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgcnU9VWkoKSxpdT1VaSghMCk7ZnVuY3Rpb24gb3UodCl7cmV0dXJuIHR9ZnVuY3Rpb24gc3UodCl7cmV0dXJuIEJyKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bHIodCwxKSl9dmFyIGF1PVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gVHIobix0LGUpfX0pKSx1dT1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIFRyKHQsbixlKX19KSk7ZnVuY3Rpb24gY3UodCxlLG4pe3ZhciByPU9hKGUpLGk9RXIoZSxyKTtudWxsPT1uJiYoIW5hKGUpfHwhaS5sZW5ndGgmJnIubGVuZ3RoKSYmKG49ZSxlPXQsdD10aGlzLGk9RXIoZSxPYShlKSkpO3ZhciBvPSEobmEobikmJiJjaGFpbiJpbiBuJiYhbi5jaGFpbikscz0kcyh0KTtyZXR1cm4gTWUoaSwoZnVuY3Rpb24obil7dmFyIHI9ZVtuXTt0W25dPXIscyYmKHQucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX2NoYWluX187aWYob3x8ZSl7dmFyIG49dCh0aGlzLl9fd3JhcHBlZF9fKTtyZXR1cm4obi5fX2FjdGlvbnNfXz1GaSh0aGlzLl9fYWN0aW9uc19fKSkucHVzaCh7ZnVuYzpyLGFyZ3M6YXJndW1lbnRzLHRoaXNBcmc6dH0pLG4uX19jaGFpbl9fPWUsbn1yZXR1cm4gci5hcHBseSh0LEJlKFt0aGlzLnZhbHVlKCldLGFyZ3VtZW50cykpfSl9KSksdH1mdW5jdGlvbiBsdSgpe312YXIgaHU9WWkoUmUpLGZ1PVlpKFRlKSxwdT1ZaShqZSk7ZnVuY3Rpb24gZHUodCl7cmV0dXJuIERvKHQpP0hlKHpvKHQpKTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIENyKGUsdCl9fSh0KX12YXIgZ3U9V2koKSx5dT1XaSghMCk7ZnVuY3Rpb24gbXUoKXtyZXR1cm5bXX1mdW5jdGlvbiB2dSgpe3JldHVybiExfXZhciBfdT1HaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlfSksMCkseHU9S2koImNlaWwiKSx3dT1HaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC9lfSksMSksYnU9S2koImZsb29yIik7dmFyIER1PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0KmV9KSwxKSxFdT1LaSgicm91bmQiKSxDdT1HaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSksMCk7cmV0dXJuIHFuLmFmdGVyPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR0KHIpO3JldHVybiB0PXlhKHQpLGZ1bmN0aW9uKCl7aWYoLS10PDEpcmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0scW4uYXJ5PUlzLHFuLmFzc2lnbj13YSxxbi5hc3NpZ25Jbj1iYSxxbi5hc3NpZ25JbldpdGg9RGEscW4uYXNzaWduV2l0aD1FYSxxbi5hdD1DYSxxbi5iZWZvcmU9TXMscW4uYmluZD1Gcyxxbi5iaW5kQWxsPWV1LHFuLmJpbmRLZXk9VHMscW4uY2FzdEFycmF5PWZ1bmN0aW9uKCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW107dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBYcyh0KT90Olt0XX0scW4uY2hhaW49ZHMscW4uY2h1bms9ZnVuY3Rpb24odCxlLHIpe2U9KHI/Ym8odCxlLHIpOmU9PT1uKT8xOnhuKHlhKGUpLDApO3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaXx8ZTwxKXJldHVybltdO2Zvcih2YXIgbz0wLHM9MCxhPUV0KG1lKGkvZSkpO288aTspYVtzKytdPW9pKHQsbyxvKz1lKTtyZXR1cm4gYX0scW4uY29tcGFjdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgscj0wLGk9W107KytlPG47KXt2YXIgbz10W2VdO28mJihpW3IrK109byl9cmV0dXJuIGl9LHFuLmNvbmNhdD1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg7aWYoIXQpcmV0dXJuW107Zm9yKHZhciBlPUV0KHQtMSksbj1hcmd1bWVudHNbMF0scj10O3ItLTspZVtyLTFdPWFyZ3VtZW50c1tyXTtyZXR1cm4gQmUoWHMobik/Rmkobik6W25dLF9yKGUsMSkpfSxxbi5jb25kPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGw9PXQ/MDp0Lmxlbmd0aCxuPWxvKCk7cmV0dXJuIHQ9ZT9SZSh0LChmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdFsxXSl0aHJvdyBuZXcgVHQocik7cmV0dXJuW24odFswXSksdFsxXV19KSk6W10sUXIoKGZ1bmN0aW9uKG4pe2Zvcih2YXIgcj0tMTsrK3I8ZTspe3ZhciBpPXRbcl07aWYoTmUoaVswXSx0aGlzLG4pKXJldHVybiBOZShpWzFdLHRoaXMsbil9fSkpfSxxbi5jb25mb3Jtcz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9T2EodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBocihuLHQsZSl9fShscih0LDEpKX0scW4uY29uc3RhbnQ9bnUscW4uY291bnRCeT1tcyxxbi5jcmVhdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj1Wbih0KTtyZXR1cm4gbnVsbD09ZT9uOnNyKG4sZSl9LHFuLmN1cnJ5PWZ1bmN0aW9uIHQoZSxyLGkpe3ZhciBvPSRpKGUsOCxuLG4sbixuLG4scj1pP246cik7cmV0dXJuIG8ucGxhY2Vob2xkZXI9dC5wbGFjZWhvbGRlcixvfSxxbi5jdXJyeVJpZ2h0PWZ1bmN0aW9uIHQoZSxyLGkpe3ZhciBvPSRpKGUscyxuLG4sbixuLG4scj1pP246cik7cmV0dXJuIG8ucGxhY2Vob2xkZXI9dC5wbGFjZWhvbGRlcixvfSxxbi5kZWJvdW5jZT1Pcyxxbi5kZWZhdWx0cz1TYSxxbi5kZWZhdWx0c0RlZXA9QWEscW4uZGVmZXI9THMscW4uZGVsYXk9UHMscW4uZGlmZmVyZW5jZT1xbyxxbi5kaWZmZXJlbmNlQnk9Vm8scW4uZGlmZmVyZW5jZVdpdGg9R28scW4uZHJvcD1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpP29pKHQsKGU9cnx8ZT09PW4/MTp5YShlKSk8MD8wOmUsaSk6W119LHFuLmRyb3BSaWdodD1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpP29pKHQsMCwoZT1pLShlPXJ8fGU9PT1uPzE6eWEoZSkpKTwwPzA6ZSk6W119LHFuLmRyb3BSaWdodFdoaWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2dpKHQsbG8oZSwzKSwhMCwhMCk6W119LHFuLmRyb3BXaGlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9naSh0LGxvKGUsMyksITApOltdfSxxbi5maWxsPWZ1bmN0aW9uKHQsZSxyLGkpe3ZhciBvPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gbz8ociYmIm51bWJlciIhPXR5cGVvZiByJiZibyh0LGUscikmJihyPTAsaT1vKSxmdW5jdGlvbih0LGUscixpKXt2YXIgbz10Lmxlbmd0aDtmb3IoKHI9eWEocikpPDAmJihyPS1yPm8/MDpvK3IpLChpPWk9PT1ufHxpPm8/bzp5YShpKSk8MCYmKGkrPW8pLGk9cj5pPzA6bWEoaSk7cjxpOyl0W3IrK109ZTtyZXR1cm4gdH0odCxlLHIsaSkpOltdfSxxbi5maWx0ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4oWHModCk/T2U6dnIpKHQsbG8oZSwzKSl9LHFuLmZsYXRNYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gX3IoQ3ModCxlKSwxKX0scW4uZmxhdE1hcERlZXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gX3IoQ3ModCxlKSxoKX0scW4uZmxhdE1hcERlcHRoPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcj1yPT09bj8xOnlhKHIpLF9yKENzKHQsZSkscil9LHFuLmZsYXR0ZW49V28scW4uZmxhdHRlbkRlZXA9ZnVuY3Rpb24odCl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/X3IodCxoKTpbXX0scW4uZmxhdHRlbkRlcHRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/X3IodCxlPWU9PT1uPzE6eWEoZSkpOltdfSxxbi5mbGlwPWZ1bmN0aW9uKHQpe3JldHVybiAkaSh0LDUxMil9LHFuLmZsb3c9cnUscW4uZmxvd1JpZ2h0PWl1LHFuLmZyb21QYWlycz1mdW5jdGlvbih0KXtmb3IodmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgscj17fTsrK2U8bjspe3ZhciBpPXRbZV07cltpWzBdXT1pWzFdfXJldHVybiByfSxxbi5mdW5jdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106RXIodCxPYSh0KSl9LHFuLmZ1bmN0aW9uc0luPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOkVyKHQsTGEodCkpfSxxbi5ncm91cEJ5PWJzLHFuLmluaXRpYWw9ZnVuY3Rpb24odCl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/b2kodCwwLC0xKTpbXX0scW4uaW50ZXJzZWN0aW9uPVpvLHFuLmludGVyc2VjdGlvbkJ5PUtvLHFuLmludGVyc2VjdGlvbldpdGg9Sm8scW4uaW52ZXJ0PU1hLHFuLmludmVydEJ5PUZhLHFuLmludm9rZU1hcD1Ecyxxbi5pdGVyYXRlZT1zdSxxbi5rZXlCeT1Fcyxxbi5rZXlzPU9hLHFuLmtleXNJbj1MYSxxbi5tYXA9Q3MscW4ubWFwS2V5cz1mdW5jdGlvbih0LGUpe3ZhciBuPXt9O3JldHVybiBlPWxvKGUsMyksYnIodCwoZnVuY3Rpb24odCxyLGkpe2FyKG4sZSh0LHIsaSksdCl9KSksbn0scW4ubWFwVmFsdWVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49e307cmV0dXJuIGU9bG8oZSwzKSxicih0LChmdW5jdGlvbih0LHIsaSl7YXIobixyLGUodCxyLGkpKX0pKSxufSxxbi5tYXRjaGVzPWZ1bmN0aW9uKHQpe3JldHVybiBxcihscih0LDEpKX0scW4ubWF0Y2hlc1Byb3BlcnR5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFZyKHQsbHIoZSwxKSl9LHFuLm1lbW9pemU9UnMscW4ubWVyZ2U9UGEscW4ubWVyZ2VXaXRoPVJhLHFuLm1ldGhvZD1hdSxxbi5tZXRob2RPZj11dSxxbi5taXhpbj1jdSxxbi5uZWdhdGU9QnMscW4ubnRoQXJnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXlhKHQpLFFyKChmdW5jdGlvbihlKXtyZXR1cm4gWXIoZSx0KX0pKX0scW4ub21pdD1CYSxxbi5vbWl0Qnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gemEodCxCcyhsbyhlKSkpfSxxbi5vbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBNcygyLHQpfSxxbi5vcmRlckJ5PWZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBudWxsPT10P1tdOihYcyhlKXx8KGU9bnVsbD09ZT9bXTpbZV0pLFhzKHI9aT9uOnIpfHwocj1udWxsPT1yP1tdOltyXSksWHIodCxlLHIpKX0scW4ub3Zlcj1odSxxbi5vdmVyQXJncz1rcyxxbi5vdmVyRXZlcnk9ZnUscW4ub3ZlclNvbWU9cHUscW4ucGFydGlhbD16cyxxbi5wYXJ0aWFsUmlnaHQ9anMscW4ucGFydGl0aW9uPVNzLHFuLnBpY2s9a2EscW4ucGlja0J5PXphLHFuLnByb3BlcnR5PWR1LHFuLnByb3BlcnR5T2Y9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT10P246Q3IodCxlKX19LHFuLnB1bGw9JG8scW4ucHVsbEFsbD10cyxxbi5wdWxsQWxsQnk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0JiZ0Lmxlbmd0aCYmZSYmZS5sZW5ndGg/SHIodCxlLGxvKG4sMikpOnR9LHFuLnB1bGxBbGxXaXRoPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdCYmdC5sZW5ndGgmJmUmJmUubGVuZ3RoP0hyKHQsZSxuLHIpOnR9LHFuLnB1bGxBdD1lcyxxbi5yYW5nZT1ndSxxbi5yYW5nZVJpZ2h0PXl1LHFuLnJlYXJnPVVzLHFuLnJlamVjdD1mdW5jdGlvbih0LGUpe3JldHVybihYcyh0KT9PZTp2cikodCxCcyhsbyhlLDMpKSl9LHFuLnJlbW92ZT1mdW5jdGlvbih0LGUpe3ZhciBuPVtdO2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuIG47dmFyIHI9LTEsaT1bXSxvPXQubGVuZ3RoO2ZvcihlPWxvKGUsMyk7KytyPG87KXt2YXIgcz10W3JdO2UocyxyLHQpJiYobi5wdXNoKHMpLGkucHVzaChyKSl9cmV0dXJuIFpyKHQsaSksbn0scW4ucmVzdD1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gUXIodCxlPWU9PT1uP2U6eWEoZSkpfSxxbi5yZXZlcnNlPW5zLHFuLnNhbXBsZVNpemU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPShyP2JvKHQsZSxyKTplPT09bik/MTp5YShlKSwoWHModCk/dHI6dGkpKHQsZSl9LHFuLnNldD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PXQ/dDplaSh0LGUsbil9LHFuLnNldFdpdGg9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aTpuLG51bGw9PXQ/dDplaSh0LGUscixpKX0scW4uc2h1ZmZsZT1mdW5jdGlvbih0KXtyZXR1cm4oWHModCk/ZXI6aWkpKHQpfSxxbi5zbGljZT1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpPyhyJiYibnVtYmVyIiE9dHlwZW9mIHImJmJvKHQsZSxyKT8oZT0wLHI9aSk6KGU9bnVsbD09ZT8wOnlhKGUpLHI9cj09PW4/aTp5YShyKSksb2kodCxlLHIpKTpbXX0scW4uc29ydEJ5PUFzLHFuLnNvcnRlZFVuaXE9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP2NpKHQpOltdfSxxbi5zb3J0ZWRVbmlxQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Y2kodCxsbyhlLDIpKTpbXX0scW4uc3BsaXQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByJiYibnVtYmVyIiE9dHlwZW9mIHImJmJvKHQsZSxyKSYmKGU9cj1uKSwocj1yPT09bj9kOnI+Pj4wKT8odD14YSh0KSkmJigic3RyaW5nIj09dHlwZW9mIGV8fG51bGwhPWUmJiFhYShlKSkmJighKGU9aGkoZSkpJiZjbih0KSk/RGkoZ24odCksMCxyKTp0LnNwbGl0KGUscik6W119LHFuLnNwcmVhZD1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gZT1udWxsPT1lPzA6eG4oeWEoZSksMCksUXIoKGZ1bmN0aW9uKG4pe3ZhciByPW5bZV0saT1EaShuLDAsZSk7cmV0dXJuIHImJkJlKGksciksTmUodCx0aGlzLGkpfSkpfSxxbi50YWlsPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gZT9vaSh0LDEsZSk6W119LHFuLnRha2U9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0JiZ0Lmxlbmd0aD9vaSh0LDAsKGU9cnx8ZT09PW4/MTp5YShlKSk8MD8wOmUpOltdfSxxbi50YWtlUmlnaHQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gaT9vaSh0LChlPWktKGU9cnx8ZT09PW4/MTp5YShlKSkpPDA/MDplLGkpOltdfSxxbi50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9naSh0LGxvKGUsMyksITEsITApOltdfSxxbi50YWtlV2hpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Z2kodCxsbyhlLDMpKTpbXX0scW4udGFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUodCksdH0scW4udGhyb3R0bGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPSEwLG89ITA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBuYShuKSYmKGk9ImxlYWRpbmciaW4gbj8hIW4ubGVhZGluZzppLG89InRyYWlsaW5nImluIG4/ISFuLnRyYWlsaW5nOm8pLE9zKHQsZSx7bGVhZGluZzppLG1heFdhaXQ6ZSx0cmFpbGluZzpvfSl9LHFuLnRocnU9Z3MscW4udG9BcnJheT1kYSxxbi50b1BhaXJzPWphLHFuLnRvUGFpcnNJbj1VYSxxbi50b1BhdGg9ZnVuY3Rpb24odCl7cmV0dXJuIFhzKHQpP1JlKHQsem8pOmxhKHQpP1t0XTpGaShrbyh4YSh0KSkpfSxxbi50b1BsYWluT2JqZWN0PV9hLHFuLnRyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7dmFyIHI9WHModCksaT1yfHxLcyh0KXx8aGEodCk7aWYoZT1sbyhlLDQpLG51bGw9PW4pe3ZhciBvPXQmJnQuY29uc3RydWN0b3I7bj1pP3I/bmV3IG86W106bmEodCkmJiRzKG8pP1ZuKFp0KHQpKTp7fX1yZXR1cm4oaT9NZTpicikodCwoZnVuY3Rpb24odCxyLGkpe3JldHVybiBlKG4sdCxyLGkpfSkpLG59LHFuLnVuYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBJcyh0LDEpfSxxbi51bmlvbj1ycyxxbi51bmlvbkJ5PWlzLHFuLnVuaW9uV2l0aD1vcyxxbi51bmlxPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9maSh0KTpbXX0scW4udW5pcUJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2ZpKHQsbG8oZSwyKSk6W119LHFuLnVuaXFXaXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuLHQmJnQubGVuZ3RoP2ZpKHQsbixlKTpbXX0scW4udW5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dHx8cGkodCxlKX0scW4udW56aXA9c3MscW4udW56aXBXaXRoPWFzLHFuLnVwZGF0ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PXQ/dDpkaSh0LGUseGkobikpfSxxbi51cGRhdGVXaXRoPWZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiBpP2k6bixudWxsPT10P3Q6ZGkodCxlLHhpKHIpLGkpfSxxbi52YWx1ZXM9cWEscW4udmFsdWVzSW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106ZW4odCxMYSh0KSl9LHFuLndpdGhvdXQ9dXMscW4ud29yZHM9JGEscW4ud3JhcD1mdW5jdGlvbih0LGUpe3JldHVybiB6cyh4aShlKSx0KX0scW4ueG9yPWNzLHFuLnhvckJ5PWxzLHFuLnhvcldpdGg9aHMscW4uemlwPWZzLHFuLnppcE9iamVjdD1mdW5jdGlvbih0LGUpe3JldHVybiB2aSh0fHxbXSxlfHxbXSxycil9LHFuLnppcE9iamVjdERlZXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdmkodHx8W10sZXx8W10sZWkpfSxxbi56aXBXaXRoPXBzLHFuLmVudHJpZXM9amEscW4uZW50cmllc0luPVVhLHFuLmV4dGVuZD1iYSxxbi5leHRlbmRXaXRoPURhLGN1KHFuLHFuKSxxbi5hZGQ9X3UscW4uYXR0ZW1wdD10dSxxbi5jYW1lbENhc2U9VmEscW4uY2FwaXRhbGl6ZT1HYSxxbi5jZWlsPXh1LHFuLmNsYW1wPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcj09PW4mJihyPWUsZT1uKSxyIT09biYmKHI9KHI9dmEocikpPT1yP3I6MCksZSE9PW4mJihlPShlPXZhKGUpKT09ZT9lOjApLGNyKHZhKHQpLGUscil9LHFuLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBscih0LDQpfSxxbi5jbG9uZURlZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGxyKHQsNSl9LHFuLmNsb25lRGVlcFdpdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHIodCw1LGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuKX0scW4uY2xvbmVXaXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGxyKHQsNCxlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bil9LHFuLmNvbmZvcm1zVG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09ZXx8aHIodCxlLE9hKGUpKX0scW4uZGVidXJyPVlhLHFuLmRlZmF1bHRUbz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10fHx0IT10P2U6dH0scW4uZGl2aWRlPXd1LHFuLmVuZHNXaXRoPWZ1bmN0aW9uKHQsZSxyKXt0PXhhKHQpLGU9aGkoZSk7dmFyIGk9dC5sZW5ndGgsbz1yPXI9PT1uP2k6Y3IoeWEociksMCxpKTtyZXR1cm4oci09ZS5sZW5ndGgpPj0wJiZ0LnNsaWNlKHIsbyk9PWV9LHFuLmVxPXFzLHFuLmVzY2FwZT1mdW5jdGlvbih0KXtyZXR1cm4odD14YSh0KSkmJkoudGVzdCh0KT90LnJlcGxhY2UoWixhbik6dH0scW4uZXNjYXBlUmVnRXhwPWZ1bmN0aW9uKHQpe3JldHVybih0PXhhKHQpKSYmb3QudGVzdCh0KT90LnJlcGxhY2UoaXQsIlxcJCYiKTp0fSxxbi5ldmVyeT1mdW5jdGlvbih0LGUscil7dmFyIGk9WHModCk/VGU6eXI7cmV0dXJuIHImJmJvKHQsZSxyKSYmKGU9biksaSh0LGxvKGUsMykpfSxxbi5maW5kPXZzLHFuLmZpbmRJbmRleD1Zbyxxbi5maW5kS2V5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHFlKHQsbG8oZSwzKSxicil9LHFuLmZpbmRMYXN0PV9zLHFuLmZpbmRMYXN0SW5kZXg9WG8scW4uZmluZExhc3RLZXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcWUodCxsbyhlLDMpLERyKX0scW4uZmxvb3I9YnUscW4uZm9yRWFjaD14cyxxbi5mb3JFYWNoUmlnaHQ9d3MscW4uZm9ySW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD90OnhyKHQsbG8oZSwzKSxMYSl9LHFuLmZvckluUmlnaHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD90OndyKHQsbG8oZSwzKSxMYSl9LHFuLmZvck93bj1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZicih0LGxvKGUsMykpfSxxbi5mb3JPd25SaWdodD1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZEcih0LGxvKGUsMykpfSxxbi5nZXQ9TmEscW4uZ3Q9VnMscW4uZ3RlPUdzLHFuLmhhcz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZ2byh0LGUsSXIpfSxxbi5oYXNJbj1JYSxxbi5oZWFkPUhvLHFuLmlkZW50aXR5PW91LHFuLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxuLHIpe3Q9SHModCk/dDpxYSh0KSxuPW4mJiFyP3lhKG4pOjA7dmFyIGk9dC5sZW5ndGg7cmV0dXJuIG48MCYmKG49eG4oaStuLDApKSxjYSh0KT9uPD1pJiZ0LmluZGV4T2YoZSxuKT4tMTohIWkmJkdlKHQsZSxuKT4tMX0scW4uaW5kZXhPZj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFyKXJldHVybi0xO3ZhciBpPW51bGw9PW4/MDp5YShuKTtyZXR1cm4gaTwwJiYoaT14bihyK2ksMCkpLEdlKHQsZSxpKX0scW4uaW5SYW5nZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9Z2EoZSkscj09PW4/KHI9ZSxlPTApOnI9Z2EociksZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Pj13bihlLG4pJiZ0PHhuKGUsbil9KHQ9dmEodCksZSxyKX0scW4uaW52b2tlPVRhLHFuLmlzQXJndW1lbnRzPVlzLHFuLmlzQXJyYXk9WHMscW4uaXNBcnJheUJ1ZmZlcj1Xcyxxbi5pc0FycmF5TGlrZT1Icyxxbi5pc0FycmF5TGlrZU9iamVjdD1acyxxbi5pc0Jvb2xlYW49ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fHwhMT09PXR8fHJhKHQpJiZBcih0KT09eH0scW4uaXNCdWZmZXI9S3MscW4uaXNEYXRlPUpzLHFuLmlzRWxlbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJjE9PT10Lm5vZGVUeXBlJiYhc2EodCl9LHFuLmlzRW1wdHk9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4hMDtpZihIcyh0KSYmKFhzKHQpfHwic3RyaW5nIj09dHlwZW9mIHR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0LnNwbGljZXx8S3ModCl8fGhhKHQpfHxZcyh0KSkpcmV0dXJuIXQubGVuZ3RoO3ZhciBlPW1vKHQpO2lmKGU9PUN8fGU9PU0pcmV0dXJuIXQuc2l6ZTtpZihTbyh0KSlyZXR1cm4ha3IodCkubGVuZ3RoO2Zvcih2YXIgbiBpbiB0KWlmKGt0LmNhbGwodCxuKSlyZXR1cm4hMTtyZXR1cm4hMH0scW4uaXNFcXVhbD1mdW5jdGlvbih0LGUpe3JldHVybiBMcih0LGUpfSxxbi5pc0VxdWFsV2l0aD1mdW5jdGlvbih0LGUscil7dmFyIGk9KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpuKT9yKHQsZSk6bjtyZXR1cm4gaT09PW4/THIodCxlLG4scik6ISFpfSxxbi5pc0Vycm9yPVFzLHFuLmlzRmluaXRlPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmVWUodCl9LHFuLmlzRnVuY3Rpb249JHMscW4uaXNJbnRlZ2VyPXRhLHFuLmlzTGVuZ3RoPWVhLHFuLmlzTWFwPWlhLHFuLmlzTWF0Y2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fFByKHQsZSxmbyhlKSl9LHFuLmlzTWF0Y2hXaXRoPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOm4sUHIodCxlLGZvKGUpLHIpfSxxbi5pc05hTj1mdW5jdGlvbih0KXtyZXR1cm4gb2EodCkmJnQhPSt0fSxxbi5pc05hdGl2ZT1mdW5jdGlvbih0KXtpZihDbyh0KSl0aHJvdyBuZXcgU3QoIlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLiIpO3JldHVybiBScih0KX0scW4uaXNOaWw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR9LHFuLmlzTnVsbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXR9LHFuLmlzTnVtYmVyPW9hLHFuLmlzT2JqZWN0PW5hLHFuLmlzT2JqZWN0TGlrZT1yYSxxbi5pc1BsYWluT2JqZWN0PXNhLHFuLmlzUmVnRXhwPWFhLHFuLmlzU2FmZUludGVnZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRhKHQpJiZ0Pj0tZiYmdDw9Zn0scW4uaXNTZXQ9dWEscW4uaXNTdHJpbmc9Y2EscW4uaXNTeW1ib2w9bGEscW4uaXNUeXBlZEFycmF5PWhhLHFuLmlzVW5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09bn0scW4uaXNXZWFrTWFwPWZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmbW8odCk9PU99LHFuLmlzV2Vha1NldD1mdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJiJbb2JqZWN0IFdlYWtTZXRdIj09QXIodCl9LHFuLmpvaW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD8iIjpaZS5jYWxsKHQsZSl9LHFuLmtlYmFiQ2FzZT1YYSxxbi5sYXN0PVFvLHFuLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7aWYoIWkpcmV0dXJuLTE7dmFyIG89aTtyZXR1cm4gciE9PW4mJihvPShvPXlhKHIpKTwwP3huKGkrbywwKTp3bihvLGktMSkpLGU9PWU/ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uKzE7ci0tOylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4gcn0odCxlLG8pOlZlKHQsWGUsbywhMCl9LHFuLmxvd2VyQ2FzZT1XYSxxbi5sb3dlckZpcnN0PUhhLHFuLmx0PWZhLHFuLmx0ZT1wYSxxbi5tYXg9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsb3UsTnIpOm59LHFuLm1heEJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsbG8oZSwyKSxOcik6bn0scW4ubWVhbj1mdW5jdGlvbih0KXtyZXR1cm4gV2UodCxvdSl9LHFuLm1lYW5CeT1mdW5jdGlvbih0LGUpe3JldHVybiBXZSh0LGxvKGUsMikpfSxxbi5taW49ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsb3UsanIpOm59LHFuLm1pbkJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsbG8oZSwyKSxqcik6bn0scW4uc3R1YkFycmF5PW11LHFuLnN0dWJGYWxzZT12dSxxbi5zdHViT2JqZWN0PWZ1bmN0aW9uKCl7cmV0dXJue319LHFuLnN0dWJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIn0scW4uc3R1YlRydWU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0scW4ubXVsdGlwbHk9RHUscW4ubnRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP1lyKHQseWEoZSkpOm59LHFuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4geWUuXz09PXRoaXMmJih5ZS5fPVZ0KSx0aGlzfSxxbi5ub29wPWx1LHFuLm5vdz1Ocyxxbi5wYWQ9ZnVuY3Rpb24odCxlLG4pe3Q9eGEodCk7dmFyIHI9KGU9eWEoZSkpP2RuKHQpOjA7aWYoIWV8fHI+PWUpcmV0dXJuIHQ7dmFyIGk9KGUtcikvMjtyZXR1cm4gWGkodmUoaSksbikrdCtYaShtZShpKSxuKX0scW4ucGFkRW5kPWZ1bmN0aW9uKHQsZSxuKXt0PXhhKHQpO3ZhciByPShlPXlhKGUpKT9kbih0KTowO3JldHVybiBlJiZyPGU/dCtYaShlLXIsbik6dH0scW4ucGFkU3RhcnQ9ZnVuY3Rpb24odCxlLG4pe3Q9eGEodCk7dmFyIHI9KGU9eWEoZSkpP2RuKHQpOjA7cmV0dXJuIGUmJnI8ZT9YaShlLXIsbikrdDp0fSxxbi5wYXJzZUludD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG58fG51bGw9PWU/ZT0wOmUmJihlPStlKSxEbih4YSh0KS5yZXBsYWNlKHN0LCIiKSxlfHwwKX0scW4ucmFuZG9tPWZ1bmN0aW9uKHQsZSxyKXtpZihyJiYiYm9vbGVhbiIhPXR5cGVvZiByJiZibyh0LGUscikmJihlPXI9bikscj09PW4mJigiYm9vbGVhbiI9PXR5cGVvZiBlPyhyPWUsZT1uKToiYm9vbGVhbiI9PXR5cGVvZiB0JiYocj10LHQ9bikpLHQ9PT1uJiZlPT09bj8odD0wLGU9MSk6KHQ9Z2EodCksZT09PW4/KGU9dCx0PTApOmU9Z2EoZSkpLHQ+ZSl7dmFyIGk9dDt0PWUsZT1pfWlmKHJ8fHQlMXx8ZSUxKXt2YXIgbz1FbigpO3JldHVybiB3bih0K28qKGUtdCtmZSgiMWUtIisoKG8rIiIpLmxlbmd0aC0xKSkpLGUpfXJldHVybiBLcih0LGUpfSxxbi5yZWR1Y2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVhzKHQpP2tlOktlLGk9YXJndW1lbnRzLmxlbmd0aDwzO3JldHVybiByKHQsbG8oZSw0KSxuLGksZHIpfSxxbi5yZWR1Y2VSaWdodD1mdW5jdGlvbih0LGUsbil7dmFyIHI9WHModCk/emU6S2UsaT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIHIodCxsbyhlLDQpLG4saSxncil9LHFuLnJlcGVhdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9KHI/Ym8odCxlLHIpOmU9PT1uKT8xOnlhKGUpLEpyKHhhKHQpLGUpfSxxbi5yZXBsYWNlPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLGU9eGEodFswXSk7cmV0dXJuIHQubGVuZ3RoPDM/ZTplLnJlcGxhY2UodFsxXSx0WzJdKX0scW4ucmVzdWx0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT0tMSxvPShlPXdpKGUsdCkpLmxlbmd0aDtmb3Iob3x8KG89MSx0PW4pOysraTxvOyl7dmFyIHM9bnVsbD09dD9uOnRbem8oZVtpXSldO3M9PT1uJiYoaT1vLHM9ciksdD0kcyhzKT9zLmNhbGwodCk6c31yZXR1cm4gdH0scW4ucm91bmQ9RXUscW4ucnVuSW5Db250ZXh0PXQscW4uc2FtcGxlPWZ1bmN0aW9uKHQpe3JldHVybihYcyh0KT8kbjokcikodCl9LHFuLnNpemU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihIcyh0KSlyZXR1cm4gY2EodCk/ZG4odCk6dC5sZW5ndGg7dmFyIGU9bW8odCk7cmV0dXJuIGU9PUN8fGU9PU0/dC5zaXplOmtyKHQpLmxlbmd0aH0scW4uc25ha2VDYXNlPVphLHFuLnNvbWU9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPVhzKHQpP2plOnNpO3JldHVybiByJiZibyh0LGUscikmJihlPW4pLGkodCxsbyhlLDMpKX0scW4uc29ydGVkSW5kZXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWkodCxlKX0scW4uc29ydGVkSW5kZXhCeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHVpKHQsZSxsbyhuLDIpKX0scW4uc29ydGVkSW5kZXhPZj1mdW5jdGlvbih0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZihuKXt2YXIgcj1haSh0LGUpO2lmKHI8biYmcXModFtyXSxlKSlyZXR1cm4gcn1yZXR1cm4tMX0scW4uc29ydGVkTGFzdEluZGV4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFpKHQsZSwhMCl9LHFuLnNvcnRlZExhc3RJbmRleEJ5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdWkodCxlLGxvKG4sMiksITApfSxxbi5zb3J0ZWRMYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUpe2lmKG51bGw9PXQ/MDp0Lmxlbmd0aCl7dmFyIG49YWkodCxlLCEwKS0xO2lmKHFzKHRbbl0sZSkpcmV0dXJuIG59cmV0dXJuLTF9LHFuLnN0YXJ0Q2FzZT1LYSxxbi5zdGFydHNXaXRoPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD14YSh0KSxuPW51bGw9PW4/MDpjcih5YShuKSwwLHQubGVuZ3RoKSxlPWhpKGUpLHQuc2xpY2UobixuK2UubGVuZ3RoKT09ZX0scW4uc3VidHJhY3Q9Q3UscW4uc3VtPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9KZSh0LG91KTowfSxxbi5zdW1CeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9KZSh0LGxvKGUsMikpOjB9LHFuLnRlbXBsYXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1xbi50ZW1wbGF0ZVNldHRpbmdzO3ImJmJvKHQsZSxyKSYmKGU9biksdD14YSh0KSxlPURhKHt9LGUsaSx0byk7dmFyIG8scyxhPURhKHt9LGUuaW1wb3J0cyxpLmltcG9ydHMsdG8pLHU9T2EoYSksYz1lbihhLHUpLGw9MCxoPWUuaW50ZXJwb2xhdGV8fGJ0LGY9Il9fcCArPSAnIixwPU10KChlLmVzY2FwZXx8YnQpLnNvdXJjZSsifCIraC5zb3VyY2UrInwiKyhoPT09dHQ/ZHQ6YnQpLnNvdXJjZSsifCIrKGUuZXZhbHVhdGV8fGJ0KS5zb3VyY2UrInwkIiwiZyIpLGQ9Ii8vIyBzb3VyY2VVUkw9Iisoa3QuY2FsbChlLCJzb3VyY2VVUkwiKT8oZS5zb3VyY2VVUkwrIiIpLnJlcGxhY2UoL1xzL2csIiAiKToibG9kYXNoLnRlbXBsYXRlU291cmNlc1siKyArK3VlKyJdIikrIlxuIjt0LnJlcGxhY2UocCwoZnVuY3Rpb24oZSxuLHIsaSxhLHUpe3JldHVybiByfHwocj1pKSxmKz10LnNsaWNlKGwsdSkucmVwbGFjZShEdCx1biksbiYmKG89ITAsZis9IicgK1xuX19lKCIrbisiKSArXG4nIiksYSYmKHM9ITAsZis9Iic7XG4iK2ErIjtcbl9fcCArPSAnIiksciYmKGYrPSInICtcbigoX190ID0gKCIrcisiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXG4nIiksbD11K2UubGVuZ3RoLGV9KSksZis9Iic7XG4iO3ZhciBnPWt0LmNhbGwoZSwidmFyaWFibGUiKSYmZS52YXJpYWJsZTtpZihnKXtpZihmdC50ZXN0KGcpKXRocm93IG5ldyBTdCgiSW52YWxpZCBgdmFyaWFibGVgIG9wdGlvbiBwYXNzZWQgaW50byBgXy50ZW1wbGF0ZWAiKX1lbHNlIGY9IndpdGggKG9iaikge1xuIitmKyJcbn1cbiI7Zj0ocz9mLnJlcGxhY2UoWSwiIik6ZikucmVwbGFjZShYLCIkMSIpLnJlcGxhY2UoVywiJDE7IiksZj0iZnVuY3Rpb24oIisoZ3x8Im9iaiIpKyIpIHtcbiIrKGc/IiI6Im9iaiB8fCAob2JqID0ge30pO1xuIikrInZhciBfX3QsIF9fcCA9ICcnIisobz8iLCBfX2UgPSBfLmVzY2FwZSI6IiIpKyhzPyIsIF9faiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xuZnVuY3Rpb24gcHJpbnQoKSB7IF9fcCArPSBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XG4iOiI7XG4iKStmKyJyZXR1cm4gX19wXG59Ijt2YXIgeT10dSgoZnVuY3Rpb24oKXtyZXR1cm4gQXQodSxkKyJyZXR1cm4gIitmKS5hcHBseShuLGMpfSkpO2lmKHkuc291cmNlPWYsUXMoeSkpdGhyb3cgeTtyZXR1cm4geX0scW4udGltZXM9ZnVuY3Rpb24odCxlKXtpZigodD15YSh0KSk8MXx8dD5mKXJldHVybltdO3ZhciBuPWQscj13bih0LGQpO2U9bG8oZSksdC09ZDtmb3IodmFyIGk9UWUocixlKTsrK248dDspZShuKTtyZXR1cm4gaX0scW4udG9GaW5pdGU9Z2EscW4udG9JbnRlZ2VyPXlhLHFuLnRvTGVuZ3RoPW1hLHFuLnRvTG93ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHhhKHQpLnRvTG93ZXJDYXNlKCl9LHFuLnRvTnVtYmVyPXZhLHFuLnRvU2FmZUludGVnZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/Y3IoeWEodCksLWYsZik6MD09PXQ/dDowfSxxbi50b1N0cmluZz14YSxxbi50b1VwcGVyPWZ1bmN0aW9uKHQpe3JldHVybiB4YSh0KS50b1VwcGVyQ2FzZSgpfSxxbi50cmltPWZ1bmN0aW9uKHQsZSxyKXtpZigodD14YSh0KSkmJihyfHxlPT09bikpcmV0dXJuICRlKHQpO2lmKCF0fHwhKGU9aGkoZSkpKXJldHVybiB0O3ZhciBpPWduKHQpLG89Z24oZSk7cmV0dXJuIERpKGkscm4oaSxvKSxvbihpLG8pKzEpLmpvaW4oIiIpfSxxbi50cmltRW5kPWZ1bmN0aW9uKHQsZSxyKXtpZigodD14YSh0KSkmJihyfHxlPT09bikpcmV0dXJuIHQuc2xpY2UoMCx5bih0KSsxKTtpZighdHx8IShlPWhpKGUpKSlyZXR1cm4gdDt2YXIgaT1nbih0KTtyZXR1cm4gRGkoaSwwLG9uKGksZ24oZSkpKzEpLmpvaW4oIiIpfSxxbi50cmltU3RhcnQ9ZnVuY3Rpb24odCxlLHIpe2lmKCh0PXhhKHQpKSYmKHJ8fGU9PT1uKSlyZXR1cm4gdC5yZXBsYWNlKHN0LCIiKTtpZighdHx8IShlPWhpKGUpKSlyZXR1cm4gdDt2YXIgaT1nbih0KTtyZXR1cm4gRGkoaSxybihpLGduKGUpKSkuam9pbigiIil9LHFuLnRydW5jYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9MzAsaT0iLi4uIjtpZihuYShlKSl7dmFyIG89InNlcGFyYXRvciJpbiBlP2Uuc2VwYXJhdG9yOm87cj0ibGVuZ3RoImluIGU/eWEoZS5sZW5ndGgpOnIsaT0ib21pc3Npb24iaW4gZT9oaShlLm9taXNzaW9uKTppfXZhciBzPSh0PXhhKHQpKS5sZW5ndGg7aWYoY24odCkpe3ZhciBhPWduKHQpO3M9YS5sZW5ndGh9aWYocj49cylyZXR1cm4gdDt2YXIgdT1yLWRuKGkpO2lmKHU8MSlyZXR1cm4gaTt2YXIgYz1hP0RpKGEsMCx1KS5qb2luKCIiKTp0LnNsaWNlKDAsdSk7aWYobz09PW4pcmV0dXJuIGMraTtpZihhJiYodSs9Yy5sZW5ndGgtdSksYWEobykpe2lmKHQuc2xpY2UodSkuc2VhcmNoKG8pKXt2YXIgbCxoPWM7Zm9yKG8uZ2xvYmFsfHwobz1NdChvLnNvdXJjZSx4YShndC5leGVjKG8pKSsiZyIpKSxvLmxhc3RJbmRleD0wO2w9by5leGVjKGgpOyl2YXIgZj1sLmluZGV4O2M9Yy5zbGljZSgwLGY9PT1uP3U6Zil9fWVsc2UgaWYodC5pbmRleE9mKGhpKG8pLHUpIT11KXt2YXIgcD1jLmxhc3RJbmRleE9mKG8pO3A+LTEmJihjPWMuc2xpY2UoMCxwKSl9cmV0dXJuIGMraX0scW4udW5lc2NhcGU9ZnVuY3Rpb24odCl7cmV0dXJuKHQ9eGEodCkpJiZLLnRlc3QodCk/dC5yZXBsYWNlKEgsbW4pOnR9LHFuLnVuaXF1ZUlkPWZ1bmN0aW9uKHQpe3ZhciBlPSsrenQ7cmV0dXJuIHhhKHQpK2V9LHFuLnVwcGVyQ2FzZT1KYSxxbi51cHBlckZpcnN0PVFhLHFuLmVhY2g9eHMscW4uZWFjaFJpZ2h0PXdzLHFuLmZpcnN0PUhvLGN1KHFuLGZ1bmN0aW9uKCl7dmFyIHQ9e307cmV0dXJuIGJyKHFuLChmdW5jdGlvbihlLG4pe2t0LmNhbGwocW4ucHJvdG90eXBlLG4pfHwodFtuXT1lKX0pKSx0fSgpLHtjaGFpbjohMX0pLHFuLlZFUlNJT049IjQuMTcuMjEiLE1lKFsiYmluZCIsImJpbmRLZXkiLCJjdXJyeSIsImN1cnJ5UmlnaHQiLCJwYXJ0aWFsIiwicGFydGlhbFJpZ2h0Il0sKGZ1bmN0aW9uKHQpe3FuW3RdLnBsYWNlaG9sZGVyPXFufSkpLE1lKFsiZHJvcCIsInRha2UiXSwoZnVuY3Rpb24odCxlKXtYbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24ocil7cj1yPT09bj8xOnhuKHlhKHIpLDApO3ZhciBpPXRoaXMuX19maWx0ZXJlZF9fJiYhZT9uZXcgWG4odGhpcyk6dGhpcy5jbG9uZSgpO3JldHVybiBpLl9fZmlsdGVyZWRfXz9pLl9fdGFrZUNvdW50X189d24ocixpLl9fdGFrZUNvdW50X18pOmkuX192aWV3c19fLnB1c2goe3NpemU6d24ocixkKSx0eXBlOnQrKGkuX19kaXJfXzwwPyJSaWdodCI6IiIpfSksaX0sWG4ucHJvdG90eXBlW3QrIlJpZ2h0Il09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpW3RdKGUpLnJldmVyc2UoKX19KSksTWUoWyJmaWx0ZXIiLCJtYXAiLCJ0YWtlV2hpbGUiXSwoZnVuY3Rpb24odCxlKXt2YXIgbj1lKzEscj0xPT1ufHwzPT1uO1huLnByb3RvdHlwZVt0XT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNsb25lKCk7cmV0dXJuIGUuX19pdGVyYXRlZXNfXy5wdXNoKHtpdGVyYXRlZTpsbyh0LDMpLHR5cGU6bn0pLGUuX19maWx0ZXJlZF9fPWUuX19maWx0ZXJlZF9ffHxyLGV9fSkpLE1lKFsiaGVhZCIsImxhc3QiXSwoZnVuY3Rpb24odCxlKXt2YXIgbj0idGFrZSIrKGU/IlJpZ2h0IjoiIik7WG4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbbl0oMSkudmFsdWUoKVswXX19KSksTWUoWyJpbml0aWFsIiwidGFpbCJdLChmdW5jdGlvbih0LGUpe3ZhciBuPSJkcm9wIisoZT8iIjoiUmlnaHQiKTtYbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IFhuKHRoaXMpOnRoaXNbbl0oMSl9fSkpLFhuLnByb3RvdHlwZS5jb21wYWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKG91KX0sWG4ucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmlsdGVyKHQpLmhlYWQoKX0sWG4ucHJvdG90eXBlLmZpbmRMYXN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHQpfSxYbi5wcm90b3R5cGUuaW52b2tlTWFwPVFyKChmdW5jdGlvbih0LGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P25ldyBYbih0aGlzKTp0aGlzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIFRyKG4sdCxlKX0pKX0pKSxYbi5wcm90b3R5cGUucmVqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbHRlcihCcyhsbyh0KSkpfSxYbi5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt0PXlhKHQpO3ZhciByPXRoaXM7cmV0dXJuIHIuX19maWx0ZXJlZF9fJiYodD4wfHxlPDApP25ldyBYbihyKToodDwwP3I9ci50YWtlUmlnaHQoLXQpOnQmJihyPXIuZHJvcCh0KSksZSE9PW4mJihyPShlPXlhKGUpKTwwP3IuZHJvcFJpZ2h0KC1lKTpyLnRha2UoZS10KSkscil9LFhuLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHQpLnJldmVyc2UoKX0sWG4ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWtlKGQpfSxicihYbi5wcm90b3R5cGUsKGZ1bmN0aW9uKHQsZSl7dmFyIHI9L14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QoZSksaT0vXig/OmhlYWR8bGFzdCkkLy50ZXN0KGUpLG89cW5baT8idGFrZSIrKCJsYXN0Ij09ZT8iUmlnaHQiOiIiKTplXSxzPWl8fC9eZmluZC8udGVzdChlKTshb3x8KHFuLnByb3RvdHlwZVtlXT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX193cmFwcGVkX18sYT1pP1sxXTphcmd1bWVudHMsdT1lIGluc3RhbmNlb2YgWG4sYz1hWzBdLGw9dXx8WHMoZSksaD1mdW5jdGlvbih0KXt2YXIgZT1vLmFwcGx5KHFuLEJlKFt0XSxhKSk7cmV0dXJuIGkmJmY/ZVswXTplfTtsJiZyJiYiZnVuY3Rpb24iPT10eXBlb2YgYyYmMSE9Yy5sZW5ndGgmJih1PWw9ITEpO3ZhciBmPXRoaXMuX19jaGFpbl9fLHA9ISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxkPXMmJiFmLGc9dSYmIXA7aWYoIXMmJmwpe2U9Zz9lOm5ldyBYbih0aGlzKTt2YXIgeT10LmFwcGx5KGUsYSk7cmV0dXJuIHkuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpncyxhcmdzOltoXSx0aGlzQXJnOm59KSxuZXcgWW4oeSxmKX1yZXR1cm4gZCYmZz90LmFwcGx5KHRoaXMsYSk6KHk9dGhpcy50aHJ1KGgpLGQ/aT95LnZhbHVlKClbMF06eS52YWx1ZSgpOnkpfSl9KSksTWUoWyJwb3AiLCJwdXNoIiwic2hpZnQiLCJzb3J0Iiwic3BsaWNlIiwidW5zaGlmdCJdLChmdW5jdGlvbih0KXt2YXIgZT1PdFt0XSxuPS9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdCh0KT8idGFwIjoidGhydSIscj0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KHQpO3FuLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztpZihyJiYhdGhpcy5fX2NoYWluX18pe3ZhciBpPXRoaXMudmFsdWUoKTtyZXR1cm4gZS5hcHBseShYcyhpKT9pOltdLHQpfXJldHVybiB0aGlzW25dKChmdW5jdGlvbihuKXtyZXR1cm4gZS5hcHBseShYcyhuKT9uOltdLHQpfSkpfX0pKSxicihYbi5wcm90b3R5cGUsKGZ1bmN0aW9uKHQsZSl7dmFyIG49cW5bZV07aWYobil7dmFyIHI9bi5uYW1lKyIiO2t0LmNhbGwoT24scil8fChPbltyXT1bXSksT25bcl0ucHVzaCh7bmFtZTplLGZ1bmM6bn0pfX0pKSxPbltxaShuLDIpLm5hbWVdPVt7bmFtZToid3JhcHBlciIsZnVuYzpufV0sWG4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFhuKHRoaXMuX193cmFwcGVkX18pO3JldHVybiB0Ll9fYWN0aW9uc19fPUZpKHRoaXMuX19hY3Rpb25zX18pLHQuX19kaXJfXz10aGlzLl9fZGlyX18sdC5fX2ZpbHRlcmVkX189dGhpcy5fX2ZpbHRlcmVkX18sdC5fX2l0ZXJhdGVlc19fPUZpKHRoaXMuX19pdGVyYXRlZXNfXyksdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXyx0Ll9fdmlld3NfXz1GaSh0aGlzLl9fdmlld3NfXyksdH0sWG4ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHQ9bmV3IFhuKHRoaXMpO3QuX19kaXJfXz0tMSx0Ll9fZmlsdGVyZWRfXz0hMH1lbHNlKHQ9dGhpcy5jbG9uZSgpKS5fX2Rpcl9fKj0tMTtyZXR1cm4gdH0sWG4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGU9dGhpcy5fX2Rpcl9fLG49WHModCkscj1lPDAsaT1uP3QubGVuZ3RoOjAsbz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPS0xLGk9bi5sZW5ndGg7KytyPGk7KXt2YXIgbz1uW3JdLHM9by5zaXplO3N3aXRjaChvLnR5cGUpe2Nhc2UiZHJvcCI6dCs9czticmVhaztjYXNlImRyb3BSaWdodCI6ZS09czticmVhaztjYXNlInRha2UiOmU9d24oZSx0K3MpO2JyZWFrO2Nhc2UidGFrZVJpZ2h0Ijp0PXhuKHQsZS1zKX19cmV0dXJue3N0YXJ0OnQsZW5kOmV9fSgwLGksdGhpcy5fX3ZpZXdzX18pLHM9by5zdGFydCxhPW8uZW5kLHU9YS1zLGM9cj9hOnMtMSxsPXRoaXMuX19pdGVyYXRlZXNfXyxoPWwubGVuZ3RoLGY9MCxwPXduKHUsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighbnx8IXImJmk9PXUmJnA9PXUpcmV0dXJuIHlpKHQsdGhpcy5fX2FjdGlvbnNfXyk7dmFyIGQ9W107dDpmb3IoO3UtLSYmZjxwOyl7Zm9yKHZhciBnPS0xLHk9dFtjKz1lXTsrK2c8aDspe3ZhciBtPWxbZ10sdj1tLml0ZXJhdGVlLF89bS50eXBlLHg9dih5KTtpZigyPT1fKXk9eDtlbHNlIGlmKCF4KXtpZigxPT1fKWNvbnRpbnVlIHQ7YnJlYWsgdH19ZFtmKytdPXl9cmV0dXJuIGR9LHFuLnByb3RvdHlwZS5hdD15cyxxbi5wcm90b3R5cGUuY2hhaW49ZnVuY3Rpb24oKXtyZXR1cm4gZHModGhpcyl9LHFuLnByb3RvdHlwZS5jb21taXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFluKHRoaXMudmFsdWUoKSx0aGlzLl9fY2hhaW5fXyl9LHFuLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dGhpcy5fX3ZhbHVlc19fPT09biYmKHRoaXMuX192YWx1ZXNfXz1kYSh0aGlzLnZhbHVlKCkpKTt2YXIgdD10aGlzLl9faW5kZXhfXz49dGhpcy5fX3ZhbHVlc19fLmxlbmd0aDtyZXR1cm57ZG9uZTp0LHZhbHVlOnQ/bjp0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK119fSxxbi5wcm90b3R5cGUucGxhbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHI9dGhpcztyIGluc3RhbmNlb2YgR247KXt2YXIgaT1VbyhyKTtpLl9faW5kZXhfXz0wLGkuX192YWx1ZXNfXz1uLGU/by5fX3dyYXBwZWRfXz1pOmU9aTt2YXIgbz1pO3I9ci5fX3dyYXBwZWRfX31yZXR1cm4gby5fX3dyYXBwZWRfXz10LGV9LHFuLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fX3dyYXBwZWRfXztpZih0IGluc3RhbmNlb2YgWG4pe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoJiYoZT1uZXcgWG4odGhpcykpLChlPWUucmV2ZXJzZSgpKS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOmdzLGFyZ3M6W25zXSx0aGlzQXJnOm59KSxuZXcgWW4oZSx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShucyl9LHFuLnByb3RvdHlwZS50b0pTT049cW4ucHJvdG90eXBlLnZhbHVlT2Y9cW4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHlpKHRoaXMuX193cmFwcGVkX18sdGhpcy5fX2FjdGlvbnNfXyl9LHFuLnByb3RvdHlwZS5maXJzdD1xbi5wcm90b3R5cGUuaGVhZCx0ZSYmKHFuLnByb3RvdHlwZVt0ZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHFufSgpO3ZlPygodmUuZXhwb3J0cz12bikuXz12bixtZS5fPXZuKTp5ZS5fPXZufSkuY2FsbCh0ZSl9KSk7dmFyIG5lPTYzNzEwMDguOCxyZT17bWV0ZXJzOm5lLG1ldHJlczpuZSxtaWxsaW1ldGVyczoxZTMqbmUsbWlsbGltZXRyZXM6MWUzKm5lLGNlbnRpbWV0ZXJzOjEwMCpuZSxjZW50aW1ldHJlczoxMDAqbmUsa2lsb21ldGVyczpuZS8xZTMsa2lsb21ldHJlczpuZS8xZTMsbWlsZXM6bmUvMTYwOS4zNDQsbmF1dGljYWxtaWxlczpuZS8xODUyLGluY2hlczozOS4zNypuZSx5YXJkczpuZS8xLjA5MzYsZmVldDozLjI4MDg0Km5lLHJhZGlhbnM6MSxkZWdyZWVzOm5lLzExMTMyNX0saWU9e21ldGVyczoxLG1ldHJlczoxLG1pbGxpbWV0ZXJzOjFlMyxtaWxsaW1ldHJlczoxZTMsY2VudGltZXRlcnM6MTAwLGNlbnRpbWV0cmVzOjEwMCxraWxvbWV0ZXJzOi4wMDEsa2lsb21ldHJlczouMDAxLG1pbGVzOjEvMTYwOS4zNDQsbmF1dGljYWxtaWxlczoxLzE4NTIsaW5jaGVzOjM5LjM3LHlhcmRzOjEvMS4wOTM2LGZlZXQ6My4yODA4NCxyYWRpYW5zOjEvbmUsZGVncmVlczoxLzExMTMyNX0sb2U9e21ldGVyczoxLG1ldHJlczoxLG1pbGxpbWV0ZXJzOjFlNixtaWxsaW1ldHJlczoxZTYsY2VudGltZXRlcnM6MWU0LGNlbnRpbWV0cmVzOjFlNCxraWxvbWV0ZXJzOjFlLTYsa2lsb21ldHJlczoxZS02LGFjcmVzOjI0NzEwNWUtOSxtaWxlczozODZlLTkseWFyZHM6MS4xOTU5OTAwNDYsZmVldDoxMC43NjM5MTA0MTcsaW5jaGVzOjE1NTAuMDAzMTAwMDA2fTtmdW5jdGlvbiBzZSh0LGUsbil7aWYoIXZlKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi5iYm94LGk9bi5pZDtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcigiZ2VvbWV0cnkgaXMgcmVxdWlyZWQiKTtpZihlJiZlLmNvbnN0cnVjdG9yIT09T2JqZWN0KXRocm93IG5ldyBFcnJvcigicHJvcGVydGllcyBtdXN0IGJlIGFuIE9iamVjdCIpO3ImJl9lKHIpLGkmJnhlKGkpO3ZhciBvPXt0eXBlOiJGZWF0dXJlIn07cmV0dXJuIGkmJihvLmlkPWkpLHImJihvLmJib3g9ciksby5wcm9wZXJ0aWVzPWV8fHt9LG8uZ2VvbWV0cnk9dCxvfWZ1bmN0aW9uIGFlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7aWYodC5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYXQgbGVhc3QgMiBudW1iZXJzIGxvbmciKTtpZighbWUodFswXSl8fCFtZSh0WzFdKSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgY29udGFpbiBudW1iZXJzIik7cmV0dXJuIHNlKHt0eXBlOiJQb2ludCIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiB1ZSh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgaT10W3JdO2lmKGkubGVuZ3RoPDQpdGhyb3cgbmV3IEVycm9yKCJFYWNoIExpbmVhclJpbmcgb2YgYSBQb2x5Z29uIG11c3QgaGF2ZSA0IG9yIG1vcmUgUG9zaXRpb25zLiIpO2Zvcih2YXIgbz0wO288aVtpLmxlbmd0aC0xXS5sZW5ndGg7bysrKXtpZigwPT09ciYmMD09PW8mJiFtZShpWzBdWzBdKXx8IW1lKGlbMF1bMV0pKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBjb250YWluIG51bWJlcnMiKTtpZihpW2kubGVuZ3RoLTFdW29dIT09aVswXVtvXSl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IFBvc2l0aW9uIGFyZSBub3QgZXF1aXZhbGVudC4iKX19cmV0dXJuIHNlKHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIGNlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYodC5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gYXJyYXkgb2YgdHdvIG9yIG1vcmUgcG9zaXRpb25zIik7aWYoIW1lKHRbMF1bMV0pfHwhbWUodFswXVsxXSkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGNvbnRhaW4gbnVtYmVycyIpO3JldHVybiBzZSh7dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiBsZSh0LGUpe2lmKCF2ZShlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuPWUuYmJveCxyPWUuaWQ7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJObyBmZWF0dXJlcyBwYXNzZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmVzIG11c3QgYmUgYW4gQXJyYXkiKTtuJiZfZShuKSxyJiZ4ZShyKTt2YXIgaT17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24ifTtyZXR1cm4gciYmKGkuaWQ9ciksbiYmKGkuYmJveD1uKSxpLmZlYXR1cmVzPXQsaX1mdW5jdGlvbiBoZSh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO3JldHVybiBzZSh7dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIGZlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7cmV0dXJuIHNlKHt0eXBlOiJNdWx0aVBvaW50Iixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIHBlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7cmV0dXJuIHNlKHt0eXBlOiJNdWx0aVBvbHlnb24iLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gZGUodCxlKXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigicmFkaWFucyBpcyByZXF1aXJlZCIpO2lmKGUmJiJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInVuaXRzIG11c3QgYmUgYSBzdHJpbmciKTt2YXIgbj1yZVtlfHwia2lsb21ldGVycyJdO2lmKCFuKXRocm93IG5ldyBFcnJvcihlKyIgdW5pdHMgaXMgaW52YWxpZCIpO3JldHVybiB0Km59ZnVuY3Rpb24gZ2UodCxlKXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigiZGlzdGFuY2UgaXMgcmVxdWlyZWQiKTtpZihlJiYic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJ1bml0cyBtdXN0IGJlIGEgc3RyaW5nIik7dmFyIG49cmVbZXx8ImtpbG9tZXRlcnMiXTtpZighbil0aHJvdyBuZXcgRXJyb3IoZSsiIHVuaXRzIGlzIGludmFsaWQiKTtyZXR1cm4gdC9ufWZ1bmN0aW9uIHllKHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJyYWRpYW5zIGlzIHJlcXVpcmVkIik7cmV0dXJuIDE4MCoodCUoMipNYXRoLlBJKSkvTWF0aC5QSX1mdW5jdGlvbiBtZSh0KXtyZXR1cm4haXNOYU4odCkmJm51bGwhPT10JiYhQXJyYXkuaXNBcnJheSh0KX1mdW5jdGlvbiB2ZSh0KXtyZXR1cm4hIXQmJnQuY29uc3RydWN0b3I9PT1PYmplY3R9ZnVuY3Rpb24gX2UodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJiYm94IGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJiYm94IG11c3QgYmUgYW4gQXJyYXkiKTtpZig0IT09dC5sZW5ndGgmJjYhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBiZSBhbiBBcnJheSBvZiA0IG9yIDYgbnVtYmVycyIpO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIW1lKHQpKXRocm93IG5ldyBFcnJvcigiYmJveCBtdXN0IG9ubHkgY29udGFpbiBudW1iZXJzIil9KSl9ZnVuY3Rpb24geGUodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJpZCBpcyByZXF1aXJlZCIpO2lmKC0xPT09WyJzdHJpbmciLCJudW1iZXIiXS5pbmRleE9mKHR5cGVvZiB0KSl0aHJvdyBuZXcgRXJyb3IoImlkIG11c3QgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmciKX1mdW5jdGlvbiB3ZSh0LGUsbil7aWYobnVsbCE9PXQpZm9yKHZhciByLGksbyxzLGEsdSxjLGwsaD0wLGY9MCxwPXQudHlwZSxkPSJGZWF0dXJlQ29sbGVjdGlvbiI9PT1wLGc9IkZlYXR1cmUiPT09cCx5PWQ/dC5mZWF0dXJlcy5sZW5ndGg6MSxtPTA7bTx5O20rKyl7YT0obD0hIShjPWQ/dC5mZWF0dXJlc1ttXS5nZW9tZXRyeTpnP3QuZ2VvbWV0cnk6dCkmJiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09Yy50eXBlKT9jLmdlb21ldHJpZXMubGVuZ3RoOjE7Zm9yKHZhciB2PTA7djxhO3YrKyl7dmFyIF89MCx4PTA7aWYobnVsbCE9PShzPWw/Yy5nZW9tZXRyaWVzW3ZdOmMpKXt1PXMuY29vcmRpbmF0ZXM7dmFyIHc9cy50eXBlO3N3aXRjaChoPSFufHwiUG9seWdvbiIhPT13JiYiTXVsdGlQb2x5Z29uIiE9PXc/MDoxLHcpe2Nhc2UgbnVsbDpicmVhaztjYXNlIlBvaW50IjplKHUsZixtLF8seCksZisrLF8rKzticmVhaztjYXNlIkxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2ludCI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyllKHVbcl0sZixtLF8seCksZisrLCJNdWx0aVBvaW50Ij09PXcmJl8rKzsiTGluZVN0cmluZyI9PT13JiZfKys7YnJlYWs7Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpTGluZVN0cmluZyI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyl7Zm9yKGk9MDtpPHVbcl0ubGVuZ3RoLWg7aSsrKWUodVtyXVtpXSxmLG0sXyx4KSxmKys7Ik11bHRpTGluZVN0cmluZyI9PT13JiZfKyssIlBvbHlnb24iPT09dyYmeCsrfSJQb2x5Z29uIj09PXcmJl8rKzticmVhaztjYXNlIk11bHRpUG9seWdvbiI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyl7Zm9yKCJNdWx0aVBvbHlnb24iPT09dyYmKHg9MCksaT0wO2k8dVtyXS5sZW5ndGg7aSsrKXtmb3Iobz0wO288dVtyXVtpXS5sZW5ndGgtaDtvKyspZSh1W3JdW2ldW29dLGYsbSxfLHgpLGYrKzt4Kyt9XysrfWJyZWFrO2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpmb3Iocj0wO3I8cy5nZW9tZXRyaWVzLmxlbmd0aDtyKyspd2Uocy5nZW9tZXRyaWVzW3JdLGUsbik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gR2VvbWV0cnkgVHlwZSIpfX19fX1mdW5jdGlvbiBiZSh0LGUsbixyKXt2YXIgaT1uO3JldHVybiB3ZSh0LChmdW5jdGlvbih0LHIsbyxzLGEpe2k9MD09PXImJnZvaWQgMD09PW4/dDplKGksdCxyLG8scyxhKX0pLHIpLGl9ZnVuY3Rpb24gRGUodCxlKXt2YXIgbjtzd2l0Y2godC50eXBlKXtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpmb3Iobj0wO248dC5mZWF0dXJlcy5sZW5ndGg7bisrKWUodC5mZWF0dXJlc1tuXS5wcm9wZXJ0aWVzLG4pO2JyZWFrO2Nhc2UiRmVhdHVyZSI6ZSh0LnByb3BlcnRpZXMsMCl9fWZ1bmN0aW9uIEVlKHQsZSl7aWYoIkZlYXR1cmUiPT09dC50eXBlKWUodCwwKTtlbHNlIGlmKCJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGUpZm9yKHZhciBuPTA7bjx0LmZlYXR1cmVzLmxlbmd0aDtuKyspZSh0LmZlYXR1cmVzW25dLG4pfWZ1bmN0aW9uIENlKHQsZSl7dmFyIG4scixpLG8scyxhLHUsYyxsLGgsZj0wLHA9IkZlYXR1cmVDb2xsZWN0aW9uIj09PXQudHlwZSxkPSJGZWF0dXJlIj09PXQudHlwZSxnPXA/dC5mZWF0dXJlcy5sZW5ndGg6MTtmb3Iobj0wO248ZztuKyspe2ZvcihhPXA/dC5mZWF0dXJlc1tuXS5nZW9tZXRyeTpkP3QuZ2VvbWV0cnk6dCxjPXA/dC5mZWF0dXJlc1tuXS5wcm9wZXJ0aWVzOmQ/dC5wcm9wZXJ0aWVzOnt9LGw9cD90LmZlYXR1cmVzW25dLmJib3g6ZD90LmJib3g6dm9pZCAwLGg9cD90LmZlYXR1cmVzW25dLmlkOmQ/dC5pZDp2b2lkIDAscz0odT0hIWEmJiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09YS50eXBlKT9hLmdlb21ldHJpZXMubGVuZ3RoOjEsaT0wO2k8cztpKyspaWYobnVsbCE9PShvPXU/YS5nZW9tZXRyaWVzW2ldOmEpKXN3aXRjaChvLnR5cGUpe2Nhc2UiUG9pbnQiOmNhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvaW50IjpjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIk11bHRpUG9seWdvbiI6ZShvLGYsYyxsLGgpO2JyZWFrO2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpmb3Iocj0wO3I8by5nZW9tZXRyaWVzLmxlbmd0aDtyKyspZShvLmdlb21ldHJpZXNbcl0sZixjLGwsaCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gR2VvbWV0cnkgVHlwZSIpfWVsc2UgZShudWxsLGYsYyxsLGgpO2YrK319ZnVuY3Rpb24gU2UodCxlKXtDZSh0LChmdW5jdGlvbih0LG4scixpLG8pe3ZhciBzLGE9bnVsbD09PXQ/bnVsbDp0LnR5cGU7c3dpdGNoKGEpe2Nhc2UgbnVsbDpjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6cmV0dXJuIHZvaWQgZShzZSh0LHIse2Jib3g6aSxpZDpvfSksbiwwKX1zd2l0Y2goYSl7Y2FzZSJNdWx0aVBvaW50IjpzPSJQb2ludCI7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnM9IkxpbmVTdHJpbmciO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpzPSJQb2x5Z29uIn10LmNvb3JkaW5hdGVzLmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7ZShzZSh7dHlwZTpzLGNvb3JkaW5hdGVzOnR9LHIpLG4saSl9KSl9KSl9ZnVuY3Rpb24gQWUodCxlKXtTZSh0LChmdW5jdGlvbih0LG4scil7dmFyIGk9MDtpZih0Lmdlb21ldHJ5KXt2YXIgbz10Lmdlb21ldHJ5LnR5cGU7IlBvaW50Ij09PW98fCJNdWx0aVBvaW50Ij09PW98fGJlKHQsKGZ1bmN0aW9uKG8scyxhLHUsYyxsKXt2YXIgaD1jZShbbyxzXSx0LnByb3BlcnRpZXMpO3JldHVybiBlKGgsbixyLGwsaSksaSsrLHN9KSl9fSkpfWZ1bmN0aW9uIE5lKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7U2UodCwoZnVuY3Rpb24odCxuLHIpe2lmKG51bGwhPT10Lmdlb21ldHJ5KXt2YXIgaT10Lmdlb21ldHJ5LnR5cGUsbz10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzO3N3aXRjaChpKXtjYXNlIkxpbmVTdHJpbmciOmUodCxuLHIsMCwwKTticmVhaztjYXNlIlBvbHlnb24iOmZvcih2YXIgcz0wO3M8by5sZW5ndGg7cysrKWUoY2Uob1tzXSx0LnByb3BlcnRpZXMpLG4scixzKX19fSkpfWZ1bmN0aW9uIEllKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigib2JqIGlzIHJlcXVpcmVkIik7dmFyIGU9TWUodCk7aWYoZS5sZW5ndGg+MSYmbWUoZVswXSkmJm1lKGVbMV0pKXJldHVybiBlO3Rocm93IG5ldyBFcnJvcigiQ29vcmRpbmF0ZSBpcyBub3QgYSB2YWxpZCBQb2ludCIpfWZ1bmN0aW9uIE1lKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigib2JqIGlzIHJlcXVpcmVkIik7dmFyIGU7aWYodC5sZW5ndGg/ZT10OnQuY29vcmRpbmF0ZXM/ZT10LmNvb3JkaW5hdGVzOnQuZ2VvbWV0cnkmJnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMmJihlPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpLGUpcmV0dXJuIEZlKGUpLGU7dGhyb3cgbmV3IEVycm9yKCJObyB2YWxpZCBjb29yZGluYXRlcyIpfWZ1bmN0aW9uIEZlKHQpe2lmKHQubGVuZ3RoPjEmJm1lKHRbMF0pJiZtZSh0WzFdKSlyZXR1cm4hMDtpZihBcnJheS5pc0FycmF5KHRbMF0pJiZ0WzBdLmxlbmd0aClyZXR1cm4gRmUodFswXSk7dGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IG9ubHkgY29udGFpbiBudW1iZXJzIil9T2JqZWN0LmZyZWV6ZSh7ZWFydGhSYWRpdXM6bmUsZmFjdG9yczpyZSx1bml0c0ZhY3RvcnM6aWUsYXJlYUZhY3RvcnM6b2UsZmVhdHVyZTpzZSxnZW9tZXRyeTpmdW5jdGlvbih0LGUsbil7aWYoIXZlKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHIsaT1uLmJib3g7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJ0eXBlIGlzIHJlcXVpcmVkIik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSIpO3N3aXRjaChpJiZfZShpKSx0KXtjYXNlIlBvaW50IjpyPWFlKGUpLmdlb21ldHJ5O2JyZWFrO2Nhc2UiTGluZVN0cmluZyI6cj1jZShlKS5nZW9tZXRyeTticmVhaztjYXNlIlBvbHlnb24iOnI9dWUoZSkuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJNdWx0aVBvaW50IjpyPWZlKGUpLmdlb21ldHJ5O2JyZWFrO2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjpyPWhlKGUpLmdlb21ldHJ5O2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpyPXBlKGUpLmdlb21ldHJ5O2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKHQrIiBpcyBpbnZhbGlkIil9cmV0dXJuIGkmJihyLmJib3g9aSkscn0scG9pbnQ6YWUscG9pbnRzOmZ1bmN0aW9uKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7cmV0dXJuIGxlKHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gYWUodCxlKX0pKSxuKX0scG9seWdvbjp1ZSxwb2x5Z29uczpmdW5jdGlvbih0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSIpO3JldHVybiBsZSh0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHVlKHQsZSl9KSksbil9LGxpbmVTdHJpbmc6Y2UsbGluZVN0cmluZ3M6ZnVuY3Rpb24odCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gQXJyYXkiKTtyZXR1cm4gbGUodC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBjZSh0LGUpfSkpLG4pfSxmZWF0dXJlQ29sbGVjdGlvbjpsZSxtdWx0aUxpbmVTdHJpbmc6aGUsbXVsdGlQb2ludDpmZSxtdWx0aVBvbHlnb246cGUsZ2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb21ldHJpZXMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImdlb21ldHJpZXMgbXVzdCBiZSBhbiBBcnJheSIpO3JldHVybiBzZSh7dHlwZToiR2VvbWV0cnlDb2xsZWN0aW9uIixnZW9tZXRyaWVzOnR9LGUsbil9LHJvdW5kOmZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dHx8aXNOYU4odCkpdGhyb3cgbmV3IEVycm9yKCJudW0gaXMgcmVxdWlyZWQiKTtpZihlJiYhKGU+PTApKXRocm93IG5ldyBFcnJvcigicHJlY2lzaW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTt2YXIgbj1NYXRoLnBvdygxMCxlfHwwKTtyZXR1cm4gTWF0aC5yb3VuZCh0Km4pL259LHJhZGlhbnNUb0xlbmd0aDpkZSxsZW5ndGhUb1JhZGlhbnM6Z2UsbGVuZ3RoVG9EZWdyZWVzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHllKGdlKHQsZSkpfSxiZWFyaW5nVG9BemltdXRoOmZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJiZWFyaW5nIGlzIHJlcXVpcmVkIik7dmFyIGU9dCUzNjA7cmV0dXJuIGU8MCYmKGUrPTM2MCksZX0scmFkaWFuc1RvRGVncmVlczp5ZSxkZWdyZWVzVG9SYWRpYW5zOmZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJkZWdyZWVzIGlzIHJlcXVpcmVkIik7cmV0dXJuIHQlMzYwKk1hdGguUEkvMTgwfSxjb252ZXJ0TGVuZ3RoOmZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigibGVuZ3RoIGlzIHJlcXVpcmVkIik7aWYoISh0Pj0wKSl0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGRlKGdlKHQsZSksbnx8ImtpbG9tZXRlcnMiKX0sY29udmVydEFyZWE6ZnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJhcmVhIGlzIHJlcXVpcmVkIik7aWYoISh0Pj0wKSl0aHJvdyBuZXcgRXJyb3IoImFyZWEgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpO3ZhciByPW9lW2V8fCJtZXRlcnMiXTtpZighcil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgb3JpZ2luYWwgdW5pdHMiKTt2YXIgaT1vZVtufHwia2lsb21ldGVycyJdO2lmKCFpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmaW5hbCB1bml0cyIpO3JldHVybiB0L3IqaX0saXNOdW1iZXI6bWUsaXNPYmplY3Q6dmUsdmFsaWRhdGVCQm94Ol9lLHZhbGlkYXRlSWQ6eGUscmFkaWFuczJkZWdyZWVzOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgcmFkaWFuc1RvRGVncmVlc2AiKX0sZGVncmVlczJyYWRpYW5zOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgZGVncmVlc1RvUmFkaWFuc2AiKX0sZGlzdGFuY2VUb0RlZ3JlZXM6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGBsZW5ndGhUb0RlZ3JlZXNgIil9LGRpc3RhbmNlVG9SYWRpYW5zOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgbGVuZ3RoVG9SYWRpYW5zYCIpfSxyYWRpYW5zVG9EaXN0YW5jZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigibWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYHJhZGlhbnNUb0xlbmd0aGAiKX0sYmVhcmluZ1RvQW5nbGU6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGBiZWFyaW5nVG9BemltdXRoYCIpfSxjb252ZXJ0RGlzdGFuY2U6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGBjb252ZXJ0TGVuZ3RoYCIpfX0pLE9iamVjdC5mcmVlemUoe2Nvb3JkRWFjaDp3ZSxjb29yZFJlZHVjZTpiZSxwcm9wRWFjaDpEZSxwcm9wUmVkdWNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiBEZSh0LChmdW5jdGlvbih0LGkpe3I9MD09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxpKX0pKSxyfSxmZWF0dXJlRWFjaDpFZSxmZWF0dXJlUmVkdWNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiBFZSh0LChmdW5jdGlvbih0LGkpe3I9MD09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxpKX0pKSxyfSxjb29yZEFsbDpmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gd2UodCwoZnVuY3Rpb24odCl7ZS5wdXNoKHQpfSkpLGV9LGdlb21FYWNoOkNlLGdlb21SZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIENlKHQsKGZ1bmN0aW9uKHQsaSxvLHMsYSl7cj0wPT09aSYmdm9pZCAwPT09bj90OmUocix0LGksbyxzLGEpfSkpLHJ9LGZsYXR0ZW5FYWNoOlNlLGZsYXR0ZW5SZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIFNlKHQsKGZ1bmN0aW9uKHQsaSxvKXtyPTA9PT1pJiYwPT09byYmdm9pZCAwPT09bj90OmUocix0LGksbyl9KSkscn0sc2VnbWVudEVhY2g6QWUsc2VnbWVudFJlZHVjZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bixpPSExO3JldHVybiBBZSh0LChmdW5jdGlvbih0LG8scyxhLHUpe3I9ITE9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsbyxzLGEsdSksaT0hMH0pKSxyfSxsaW5lRWFjaDpOZSxsaW5lUmVkdWNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiBOZSh0LChmdW5jdGlvbih0LGksbyxzKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvLHMpfSkpLHJ9fSksT2JqZWN0LmZyZWV6ZSh7Z2V0Q29vcmQ6SWUsZ2V0Q29vcmRzOk1lLGNvbnRhaW5zTnVtYmVyOkZlLGdlb2pzb25UeXBlOmZ1bmN0aW9uKHQsZSxuKXtpZighZXx8IW4pdGhyb3cgbmV3IEVycm9yKCJ0eXBlIGFuZCBuYW1lIHJlcXVpcmVkIik7aWYoIXR8fHQudHlwZSE9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiOiBtdXN0IGJlIGEgIitlKyIsIGdpdmVuICIrdC50eXBlKX0sZmVhdHVyZU9mOmZ1bmN0aW9uKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIk5vIGZlYXR1cmUgcGFzc2VkIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCIuZmVhdHVyZU9mKCkgcmVxdWlyZXMgYSBuYW1lIik7aWYoIXR8fCJGZWF0dXJlIiE9PXQudHlwZXx8IXQuZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiLCBGZWF0dXJlIHdpdGggZ2VvbWV0cnkgcmVxdWlyZWQiKTtpZighdC5nZW9tZXRyeXx8dC5nZW9tZXRyeS50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIit0Lmdlb21ldHJ5LnR5cGUpfSxjb2xsZWN0aW9uT2Y6ZnVuY3Rpb24odCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiTm8gZmVhdHVyZUNvbGxlY3Rpb24gcGFzc2VkIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCIuY29sbGVjdGlvbk9mKCkgcmVxdWlyZXMgYSBuYW1lIik7aWYoIXR8fCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiLCBGZWF0dXJlQ29sbGVjdGlvbiByZXF1aXJlZCIpO2Zvcih2YXIgcj0wO3I8dC5mZWF0dXJlcy5sZW5ndGg7cisrKXt2YXIgaT10LmZlYXR1cmVzW3JdO2lmKCFpfHwiRmVhdHVyZSIhPT1pLnR5cGV8fCFpLmdlb21ldHJ5KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK24rIiwgRmVhdHVyZSB3aXRoIGdlb21ldHJ5IHJlcXVpcmVkIik7aWYoIWkuZ2VvbWV0cnl8fGkuZ2VvbWV0cnkudHlwZSE9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiOiBtdXN0IGJlIGEgIitlKyIsIGdpdmVuICIraS5nZW9tZXRyeS50eXBlKX19LGdldEdlb206ZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYodm9pZCAwIT09dC5nZW9tZXRyeSlyZXR1cm4gdC5nZW9tZXRyeTtpZih0LmNvb3JkaW5hdGVzfHx0Lmdlb21ldHJpZXMpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIG11c3QgYmUgYSB2YWxpZCBGZWF0dXJlIG9yIEdlb21ldHJ5IE9iamVjdCIpfSxnZXRHZW9tVHlwZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiaW52YXJpYW50LmdldEdlb21UeXBlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gdjUuMCBpbiBmYXZvciBvZiBpbnZhcmlhbnQuZ2V0VHlwZSIpfSxnZXRUeXBlOmZ1bmN0aW9uKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKChlfHwiZ2VvanNvbiIpKyIgaXMgcmVxdWlyZWQiKTtpZih0Lmdlb21ldHJ5JiZ0Lmdlb21ldHJ5LnR5cGUpcmV0dXJuIHQuZ2VvbWV0cnkudHlwZTtpZih0LnR5cGUpcmV0dXJuIHQudHlwZTt0aHJvdyBuZXcgRXJyb3IoKGV8fCJnZW9qc29uIikrIiBpcyBpbnZhbGlkIil9fSk7dmFyIFRlPWZ1bmN0aW9uIHQoZSxuLHIsaSxvKXtmb3Iocj1yfHwwLGk9aXx8ZS5sZW5ndGgtMSxvPW98fExlO2k+cjspe2lmKGktcj42MDApe3ZhciBzPWktcisxLGE9bi1yKzEsdT1NYXRoLmxvZyhzKSxjPS41Kk1hdGguZXhwKDIqdS8zKSxsPS41Kk1hdGguc3FydCh1KmMqKHMtYykvcykqKGEtcy8yPDA/LTE6MSksaD1NYXRoLm1heChyLE1hdGguZmxvb3Iobi1hKmMvcytsKSksZj1NYXRoLm1pbihpLE1hdGguZmxvb3Iobisocy1hKSpjL3MrbCkpO3QoZSxuLGgsZixvKX12YXIgcD1lW25dLGQ9cixnPWk7Zm9yKE9lKGUscixuKSxvKGVbaV0scCk+MCYmT2UoZSxyLGkpO2Q8Zzspe2ZvcihPZShlLGQsZyksZCsrLGctLTtvKGVbZF0scCk8MDspZCsrO2Zvcig7byhlW2ddLHApPjA7KWctLX0wPT09byhlW3JdLHApP09lKGUscixnKTpPZShlLCsrZyxpKSxnPD1uJiYocj1nKzEpLG48PWcmJihpPWctMSl9fTtmdW5jdGlvbiBPZSh0LGUsbil7dmFyIHI9dFtlXTt0W2VdPXRbbl0sdFtuXT1yfWZ1bmN0aW9uIExlKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTowfXZhciBQZT1SZTtmdW5jdGlvbiBSZSh0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFJlKSlyZXR1cm4gbmV3IFJlKHQsZSk7dGhpcy5fbWF4RW50cmllcz1NYXRoLm1heCg0LHR8fDkpLHRoaXMuX21pbkVudHJpZXM9TWF0aC5tYXgoMixNYXRoLmNlaWwoLjQqdGhpcy5fbWF4RW50cmllcykpLGUmJnRoaXMuX2luaXRGb3JtYXQoZSksdGhpcy5jbGVhcigpfWZ1bmN0aW9uIEJlKHQsZSxuKXtpZighbilyZXR1cm4gZS5pbmRleE9mKHQpO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKG4odCxlW3JdKSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBrZSh0LGUpe3plKHQsMCx0LmNoaWxkcmVuLmxlbmd0aCxlLHQpfWZ1bmN0aW9uIHplKHQsZSxuLHIsaSl7aXx8KGk9WmUobnVsbCkpLGkubWluWD0xLzAsaS5taW5ZPTEvMCxpLm1heFg9LTEvMCxpLm1heFk9LTEvMDtmb3IodmFyIG8scz1lO3M8bjtzKyspbz10LmNoaWxkcmVuW3NdLGplKGksdC5sZWFmP3Iobyk6byk7cmV0dXJuIGl9ZnVuY3Rpb24gamUodCxlKXtyZXR1cm4gdC5taW5YPU1hdGgubWluKHQubWluWCxlLm1pblgpLHQubWluWT1NYXRoLm1pbih0Lm1pblksZS5taW5ZKSx0Lm1heFg9TWF0aC5tYXgodC5tYXhYLGUubWF4WCksdC5tYXhZPU1hdGgubWF4KHQubWF4WSxlLm1heFkpLHR9ZnVuY3Rpb24gVWUodCxlKXtyZXR1cm4gdC5taW5YLWUubWluWH1mdW5jdGlvbiBxZSh0LGUpe3JldHVybiB0Lm1pblktZS5taW5ZfWZ1bmN0aW9uIFZlKHQpe3JldHVybih0Lm1heFgtdC5taW5YKSoodC5tYXhZLXQubWluWSl9ZnVuY3Rpb24gR2UodCl7cmV0dXJuIHQubWF4WC10Lm1pblgrKHQubWF4WS10Lm1pblkpfWZ1bmN0aW9uIFllKHQsZSl7cmV0dXJuKE1hdGgubWF4KGUubWF4WCx0Lm1heFgpLU1hdGgubWluKGUubWluWCx0Lm1pblgpKSooTWF0aC5tYXgoZS5tYXhZLHQubWF4WSktTWF0aC5taW4oZS5taW5ZLHQubWluWSkpfWZ1bmN0aW9uIFhlKHQsZSl7dmFyIG49TWF0aC5tYXgodC5taW5YLGUubWluWCkscj1NYXRoLm1heCh0Lm1pblksZS5taW5ZKSxpPU1hdGgubWluKHQubWF4WCxlLm1heFgpLG89TWF0aC5taW4odC5tYXhZLGUubWF4WSk7cmV0dXJuIE1hdGgubWF4KDAsaS1uKSpNYXRoLm1heCgwLG8tcil9ZnVuY3Rpb24gV2UodCxlKXtyZXR1cm4gdC5taW5YPD1lLm1pblgmJnQubWluWTw9ZS5taW5ZJiZlLm1heFg8PXQubWF4WCYmZS5tYXhZPD10Lm1heFl9ZnVuY3Rpb24gSGUodCxlKXtyZXR1cm4gZS5taW5YPD10Lm1heFgmJmUubWluWTw9dC5tYXhZJiZlLm1heFg+PXQubWluWCYmZS5tYXhZPj10Lm1pbll9ZnVuY3Rpb24gWmUodCl7cmV0dXJue2NoaWxkcmVuOnQsaGVpZ2h0OjEsbGVhZjohMCxtaW5YOjEvMCxtaW5ZOjEvMCxtYXhYOi0xLzAsbWF4WTotMS8wfX1mdW5jdGlvbiBLZSh0LGUsbixyLGkpe2Zvcih2YXIgbyxzPVtlLG5dO3MubGVuZ3RoOykhKChuPXMucG9wKCkpLShlPXMucG9wKCkpPD1yKSYmKG89ZStNYXRoLmNlaWwoKG4tZSkvci8yKSpyLFRlKHQsbyxlLG4saSkscy5wdXNoKGUsbyxvLG4pKX1mdW5jdGlvbiBKZSh0LGUpe3JldHVybiB0KGU9e2V4cG9ydHM6e319LGUuZXhwb3J0cyksZS5leHBvcnRzfVJlLnByb3RvdHlwZT17YWxsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FsbCh0aGlzLmRhdGEsW10pfSxzZWFyY2g6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXRhLG49W10scj10aGlzLnRvQkJveDtpZighSGUodCxlKSlyZXR1cm4gbjtmb3IodmFyIGksbyxzLGEsdT1bXTtlOyl7Zm9yKGk9MCxvPWUuY2hpbGRyZW4ubGVuZ3RoO2k8bztpKyspcz1lLmNoaWxkcmVuW2ldLEhlKHQsYT1lLmxlYWY/cihzKTpzKSYmKGUubGVhZj9uLnB1c2gocyk6V2UodCxhKT90aGlzLl9hbGwocyxuKTp1LnB1c2gocykpO2U9dS5wb3AoKX1yZXR1cm4gbn0sY29sbGlkZXM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXRhLG49dGhpcy50b0JCb3g7aWYoIUhlKHQsZSkpcmV0dXJuITE7Zm9yKHZhciByLGksbyxzLGE9W107ZTspe2ZvcihyPTAsaT1lLmNoaWxkcmVuLmxlbmd0aDtyPGk7cisrKWlmKG89ZS5jaGlsZHJlbltyXSxIZSh0LHM9ZS5sZWFmP24obyk6bykpe2lmKGUubGVhZnx8V2UodCxzKSlyZXR1cm4hMDthLnB1c2gobyl9ZT1hLnBvcCgpfXJldHVybiExfSxsb2FkOmZ1bmN0aW9uKHQpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuIHRoaXM7aWYodC5sZW5ndGg8dGhpcy5fbWluRW50cmllcyl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuaW5zZXJ0KHRbZV0pO3JldHVybiB0aGlzfXZhciByPXRoaXMuX2J1aWxkKHQuc2xpY2UoKSwwLHQubGVuZ3RoLTEsMCk7aWYodGhpcy5kYXRhLmNoaWxkcmVuLmxlbmd0aClpZih0aGlzLmRhdGEuaGVpZ2h0PT09ci5oZWlnaHQpdGhpcy5fc3BsaXRSb290KHRoaXMuZGF0YSxyKTtlbHNle2lmKHRoaXMuZGF0YS5oZWlnaHQ8ci5oZWlnaHQpe3ZhciBpPXRoaXMuZGF0YTt0aGlzLmRhdGE9cixyPWl9dGhpcy5faW5zZXJ0KHIsdGhpcy5kYXRhLmhlaWdodC1yLmhlaWdodC0xLCEwKX1lbHNlIHRoaXMuZGF0YT1yO3JldHVybiB0aGlzfSxpbnNlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuX2luc2VydCh0LHRoaXMuZGF0YS5oZWlnaHQtMSksdGhpc30sY2xlYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhPVplKFtdKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gdGhpcztmb3IodmFyIG4scixpLG8scz10aGlzLmRhdGEsYT10aGlzLnRvQkJveCh0KSx1PVtdLGM9W107c3x8dS5sZW5ndGg7KXtpZihzfHwocz11LnBvcCgpLHI9dVt1Lmxlbmd0aC0xXSxuPWMucG9wKCksbz0hMCkscy5sZWFmJiYtMSE9PShpPUJlKHQscy5jaGlsZHJlbixlKSkpcmV0dXJuIHMuY2hpbGRyZW4uc3BsaWNlKGksMSksdS5wdXNoKHMpLHRoaXMuX2NvbmRlbnNlKHUpLHRoaXM7b3x8cy5sZWFmfHwhV2UocyxhKT9yPyhuKysscz1yLmNoaWxkcmVuW25dLG89ITEpOnM9bnVsbDoodS5wdXNoKHMpLGMucHVzaChuKSxuPTAscj1zLHM9cy5jaGlsZHJlblswXSl9cmV0dXJuIHRoaXN9LHRvQkJveDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sY29tcGFyZU1pblg6VWUsY29tcGFyZU1pblk6cWUsdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX0sZnJvbUpTT046ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YT10LHRoaXN9LF9hbGw6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W107dDspdC5sZWFmP2UucHVzaC5hcHBseShlLHQuY2hpbGRyZW4pOm4ucHVzaC5hcHBseShuLHQuY2hpbGRyZW4pLHQ9bi5wb3AoKTtyZXR1cm4gZX0sX2J1aWxkOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG89bi1lKzEscz10aGlzLl9tYXhFbnRyaWVzO2lmKG88PXMpcmV0dXJuIGtlKGk9WmUodC5zbGljZShlLG4rMSkpLHRoaXMudG9CQm94KSxpO3J8fChyPU1hdGguY2VpbChNYXRoLmxvZyhvKS9NYXRoLmxvZyhzKSkscz1NYXRoLmNlaWwoby9NYXRoLnBvdyhzLHItMSkpKSwoaT1aZShbXSkpLmxlYWY9ITEsaS5oZWlnaHQ9cjt2YXIgYSx1LGMsbCxoPU1hdGguY2VpbChvL3MpLGY9aCpNYXRoLmNlaWwoTWF0aC5zcXJ0KHMpKTtmb3IoS2UodCxlLG4sZix0aGlzLmNvbXBhcmVNaW5YKSxhPWU7YTw9bjthKz1mKWZvcihLZSh0LGEsYz1NYXRoLm1pbihhK2YtMSxuKSxoLHRoaXMuY29tcGFyZU1pblkpLHU9YTt1PD1jO3UrPWgpbD1NYXRoLm1pbih1K2gtMSxjKSxpLmNoaWxkcmVuLnB1c2godGhpcy5fYnVpbGQodCx1LGwsci0xKSk7cmV0dXJuIGtlKGksdGhpcy50b0JCb3gpLGl9LF9jaG9vc2VTdWJ0cmVlOmZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaSxvLHMsYSx1LGMsbCxoO3IucHVzaChlKSwhZS5sZWFmJiZyLmxlbmd0aC0xIT09bjspe2ZvcihsPWg9MS8wLGk9MCxvPWUuY2hpbGRyZW4ubGVuZ3RoO2k8bztpKyspdT1WZShzPWUuY2hpbGRyZW5baV0pLChjPVllKHQscyktdSk8aD8oaD1jLGw9dTxsP3U6bCxhPXMpOmM9PT1oJiZ1PGwmJihsPXUsYT1zKTtlPWF8fGUuY2hpbGRyZW5bMF19cmV0dXJuIGV9LF9pbnNlcnQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMudG9CQm94LGk9bj90OnIodCksbz1bXSxzPXRoaXMuX2Nob29zZVN1YnRyZWUoaSx0aGlzLmRhdGEsZSxvKTtmb3Iocy5jaGlsZHJlbi5wdXNoKHQpLGplKHMsaSk7ZT49MCYmb1tlXS5jaGlsZHJlbi5sZW5ndGg+dGhpcy5fbWF4RW50cmllczspdGhpcy5fc3BsaXQobyxlKSxlLS07dGhpcy5fYWRqdXN0UGFyZW50QkJveGVzKGksbyxlKX0sX3NwbGl0OmZ1bmN0aW9uKHQsZSl7dmFyIG49dFtlXSxyPW4uY2hpbGRyZW4ubGVuZ3RoLGk9dGhpcy5fbWluRW50cmllczt0aGlzLl9jaG9vc2VTcGxpdEF4aXMobixpLHIpO3ZhciBvPXRoaXMuX2Nob29zZVNwbGl0SW5kZXgobixpLHIpLHM9WmUobi5jaGlsZHJlbi5zcGxpY2UobyxuLmNoaWxkcmVuLmxlbmd0aC1vKSk7cy5oZWlnaHQ9bi5oZWlnaHQscy5sZWFmPW4ubGVhZixrZShuLHRoaXMudG9CQm94KSxrZShzLHRoaXMudG9CQm94KSxlP3RbZS0xXS5jaGlsZHJlbi5wdXNoKHMpOnRoaXMuX3NwbGl0Um9vdChuLHMpfSxfc3BsaXRSb290OmZ1bmN0aW9uKHQsZSl7dGhpcy5kYXRhPVplKFt0LGVdKSx0aGlzLmRhdGEuaGVpZ2h0PXQuaGVpZ2h0KzEsdGhpcy5kYXRhLmxlYWY9ITEsa2UodGhpcy5kYXRhLHRoaXMudG9CQm94KX0sX2Nob29zZVNwbGl0SW5kZXg6ZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbyxzLGEsdSxjLGw7Zm9yKHU9Yz0xLzAscj1lO3I8PW4tZTtyKyspcz1YZShpPXplKHQsMCxyLHRoaXMudG9CQm94KSxvPXplKHQscixuLHRoaXMudG9CQm94KSksYT1WZShpKStWZShvKSxzPHU/KHU9cyxsPXIsYz1hPGM/YTpjKTpzPT09dSYmYTxjJiYoYz1hLGw9cik7cmV0dXJuIGx9LF9jaG9vc2VTcGxpdEF4aXM6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQubGVhZj90aGlzLmNvbXBhcmVNaW5YOlVlLGk9dC5sZWFmP3RoaXMuY29tcGFyZU1pblk6cWU7dGhpcy5fYWxsRGlzdE1hcmdpbih0LGUsbixyKTx0aGlzLl9hbGxEaXN0TWFyZ2luKHQsZSxuLGkpJiZ0LmNoaWxkcmVuLnNvcnQocil9LF9hbGxEaXN0TWFyZ2luOmZ1bmN0aW9uKHQsZSxuLHIpe3QuY2hpbGRyZW4uc29ydChyKTt2YXIgaSxvLHM9dGhpcy50b0JCb3gsYT16ZSh0LDAsZSxzKSx1PXplKHQsbi1lLG4scyksYz1HZShhKStHZSh1KTtmb3IoaT1lO2k8bi1lO2krKylvPXQuY2hpbGRyZW5baV0samUoYSx0LmxlYWY/cyhvKTpvKSxjKz1HZShhKTtmb3IoaT1uLWUtMTtpPj1lO2ktLSlvPXQuY2hpbGRyZW5baV0samUodSx0LmxlYWY/cyhvKTpvKSxjKz1HZSh1KTtyZXR1cm4gY30sX2FkanVzdFBhcmVudEJCb3hlczpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW47cj49MDtyLS0pamUoZVtyXSx0KX0sX2NvbmRlbnNlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXQubGVuZ3RoLTE7bj49MDtuLS0pMD09PXRbbl0uY2hpbGRyZW4ubGVuZ3RoP24+MD8oZT10W24tMV0uY2hpbGRyZW4pLnNwbGljZShlLmluZGV4T2YodFtuXSksMSk6dGhpcy5jbGVhcigpOmtlKHRbbl0sdGhpcy50b0JCb3gpfSxfaW5pdEZvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1bInJldHVybiBhIiwiIC0gYiIsIjsiXTt0aGlzLmNvbXBhcmVNaW5YPW5ldyBGdW5jdGlvbigiYSIsImIiLGUuam9pbih0WzBdKSksdGhpcy5jb21wYXJlTWluWT1uZXcgRnVuY3Rpb24oImEiLCJiIixlLmpvaW4odFsxXSkpLHRoaXMudG9CQm94PW5ldyBGdW5jdGlvbigiYSIsInJldHVybiB7bWluWDogYSIrdFswXSsiLCBtaW5ZOiBhIit0WzFdKyIsIG1heFg6IGEiK3RbMl0rIiwgbWF4WTogYSIrdFszXSsifTsiKX19O3ZhciBRZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dCplLGk9JGUqdCxvPWktdCxzPWktbyxhPXQtcyx1PSRlKmUsYz11LSh1LWUpLGw9ZS1jLGg9YSpsLShyLXMqYy1hKmMtcypsKTtyZXR1cm4gbj8oblswXT1oLG5bMV09cixuKTpbaCxyXX0sJGU9KyhNYXRoLnBvdygyLDI3KSsxKTt2YXIgdG49ZnVuY3Rpb24odCxlKXt2YXIgbj0wfHQubGVuZ3RoLHI9MHxlLmxlbmd0aDtpZigxPT09biYmMT09PXIpcmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49dCtlLHI9bi10LGk9bi1yLG89ZS1yLHM9dC1pLGE9cytvO3JldHVybiBhP1thLG5dOltuXX0odFswXSxlWzBdKTt2YXIgaSxvLHM9bmV3IEFycmF5KG4rciksYT0wLHU9MCxjPTAsbD1NYXRoLmFicyxoPXRbdV0sZj1sKGgpLHA9ZVtjXSxkPWwocCk7ZjxkPyhvPWgsKHUrPTEpPG4mJihoPXRbdV0sZj1sKGgpKSk6KG89cCwoYys9MSk8ciYmKHA9ZVtjXSxkPWwocCkpKSx1PG4mJmY8ZHx8Yz49cj8oaT1oLCh1Kz0xKTxuJiYoaD10W3VdLGY9bChoKSkpOihpPXAsKGMrPTEpPHImJihwPWVbY10sZD1sKHApKSk7Zm9yKHZhciBnLHksbT1pK28sdj1tLWksXz1vLXYseD1fLHc9bTt1PG4mJmM8cjspZjxkPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0sZj1sKGgpKSk6KGk9cCwoYys9MSk8ciYmKHA9ZVtjXSxkPWwocCkpKSwoXz0obz14KS0odj0obT1pK28pLWkpKSYmKHNbYSsrXT1fKSx4PXctKChnPXcrbSktKHk9Zy13KSkrKG0teSksdz1nO2Zvcig7dTxuOykoXz0obz14KS0odj0obT0oaT1oKStvKS1pKSkmJihzW2ErK109XykseD13LSgoZz13K20pLSh5PWctdykpKyhtLXkpLHc9ZywodSs9MSk8biYmKGg9dFt1XSk7Zm9yKDtjPHI7KShfPShvPXgpLSh2PShtPShpPXApK28pLWkpKSYmKHNbYSsrXT1fKSx4PXctKChnPXcrbSktKHk9Zy13KSkrKG0teSksdz1nLChjKz0xKTxyJiYocD1lW2NdKTtyZXR1cm4geCYmKHNbYSsrXT14KSx3JiYoc1thKytdPXcpLGF8fChzW2ErK109MCkscy5sZW5ndGg9YSxzfTt2YXIgZW49ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQrZSxpPXItdCxvPWUtaSxzPXQtKHItaSk7cmV0dXJuIG4/KG5bMF09cytvLG5bMV09cixuKTpbcytvLHJdfTt2YXIgbm49ZnVuY3Rpb24odCxlKXt2YXIgbj10Lmxlbmd0aDtpZigxPT09bil7dmFyIHI9UWUodFswXSxlKTtyZXR1cm4gclswXT9yOltyWzFdXX12YXIgaT1uZXcgQXJyYXkoMipuKSxvPVsuMSwuMV0scz1bLjEsLjFdLGE9MDtRZSh0WzBdLGUsbyksb1swXSYmKGlbYSsrXT1vWzBdKTtmb3IodmFyIHU9MTt1PG47Kyt1KXtRZSh0W3VdLGUscyk7dmFyIGM9b1sxXTtlbihjLHNbMF0sbyksb1swXSYmKGlbYSsrXT1vWzBdKTt2YXIgbD1zWzFdLGg9b1sxXSxmPWwraCxwPWgtKGYtbCk7b1sxXT1mLHAmJihpW2ErK109cCl9cmV0dXJuIG9bMV0mJihpW2ErK109b1sxXSksMD09PWEmJihpW2ErK109MCksaS5sZW5ndGg9YSxpfTt2YXIgcm49ZnVuY3Rpb24odCxlKXt2YXIgbj0wfHQubGVuZ3RoLHI9MHxlLmxlbmd0aDtpZigxPT09biYmMT09PXIpcmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49dCtlLHI9bi10LGk9bi1yLG89ZS1yLHM9dC1pLGE9cytvO3JldHVybiBhP1thLG5dOltuXX0odFswXSwtZVswXSk7dmFyIGksbyxzPW5ldyBBcnJheShuK3IpLGE9MCx1PTAsYz0wLGw9TWF0aC5hYnMsaD10W3VdLGY9bChoKSxwPS1lW2NdLGQ9bChwKTtmPGQ/KG89aCwodSs9MSk8biYmKGg9dFt1XSxmPWwoaCkpKToobz1wLChjKz0xKTxyJiYocD0tZVtjXSxkPWwocCkpKSx1PG4mJmY8ZHx8Yz49cj8oaT1oLCh1Kz0xKTxuJiYoaD10W3VdLGY9bChoKSkpOihpPXAsKGMrPTEpPHImJihwPS1lW2NdLGQ9bChwKSkpO2Zvcih2YXIgZyx5LG09aStvLHY9bS1pLF89by12LHg9Xyx3PW07dTxuJiZjPHI7KWY8ZD8oaT1oLCh1Kz0xKTxuJiYoaD10W3VdLGY9bChoKSkpOihpPXAsKGMrPTEpPHImJihwPS1lW2NdLGQ9bChwKSkpLChfPShvPXgpLSh2PShtPWkrbyktaSkpJiYoc1thKytdPV8pLHg9dy0oKGc9dyttKS0oeT1nLXcpKSsobS15KSx3PWc7Zm9yKDt1PG47KShfPShvPXgpLSh2PShtPShpPWgpK28pLWkpKSYmKHNbYSsrXT1fKSx4PXctKChnPXcrbSktKHk9Zy13KSkrKG0teSksdz1nLCh1Kz0xKTxuJiYoaD10W3VdKTtmb3IoO2M8cjspKF89KG89eCktKHY9KG09KGk9cCkrbyktaSkpJiYoc1thKytdPV8pLHg9dy0oKGc9dyttKS0oeT1nLXcpKSsobS15KSx3PWcsKGMrPTEpPHImJihwPS1lW2NdKTtyZXR1cm4geCYmKHNbYSsrXT14KSx3JiYoc1thKytdPXcpLGF8fChzW2ErK109MCkscy5sZW5ndGg9YSxzfTt2YXIgb249SmUoKGZ1bmN0aW9uKHQpe3ZhciBlPTExMTAyMjMwMjQ2MjUxNTY1ZS0zMixuPSgzKzE2KmUpKmUscj0oNys1NiplKSplO2Z1bmN0aW9uIGkodCxlKXtmb3IodmFyIG49bmV3IEFycmF5KHQubGVuZ3RoLTEpLHI9MTtyPHQubGVuZ3RoOysrcilmb3IodmFyIGk9bltyLTFdPW5ldyBBcnJheSh0Lmxlbmd0aC0xKSxvPTAscz0wO288dC5sZW5ndGg7KytvKW8hPT1lJiYoaVtzKytdPXRbcl1bb10pO3JldHVybiBufWZ1bmN0aW9uIG8odCl7cmV0dXJuIDEmdD8iLSI6IiJ9ZnVuY3Rpb24gcyh0KXtpZigxPT09dC5sZW5ndGgpcmV0dXJuIHRbMF07aWYoMj09PXQubGVuZ3RoKXJldHVyblsic3VtKCIsdFswXSwiLCIsdFsxXSwiKSJdLmpvaW4oIiIpO3ZhciBlPXQubGVuZ3RoPj4xO3JldHVyblsic3VtKCIscyh0LnNsaWNlKDAsZSkpLCIsIixzKHQuc2xpY2UoZSkpLCIpIl0uam9pbigiIil9ZnVuY3Rpb24gYSh0KXtpZigyPT09dC5sZW5ndGgpcmV0dXJuW1sic3VtKHByb2QoIix0WzBdWzBdLCIsIix0WzFdWzFdLCIpLHByb2QoLSIsdFswXVsxXSwiLCIsdFsxXVswXSwiKSkiXS5qb2luKCIiKV07Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOysrbillLnB1c2goWyJzY2FsZSgiLHMoYShpKHQsbikpKSwiLCIsbyhuKSx0WzBdW25dLCIpIl0uam9pbigiIikpO3JldHVybiBlfWZ1bmN0aW9uIHUodCl7Zm9yKHZhciBlPVtdLG49W10scj1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7KytuKXtlW25dPW5ldyBBcnJheSh0KTtmb3IodmFyIHI9MDtyPHQ7KytyKWVbbl1bcl09WyJtIixyLCJbIix0LW4tMSwiXSJdLmpvaW4oIiIpfXJldHVybiBlfSh0KSxvPVtdLHU9MDt1PHQ7Kyt1KTEmdT9uLnB1c2guYXBwbHkobixhKGkocix1KSkpOmUucHVzaC5hcHBseShlLGEoaShyLHUpKSksby5wdXNoKCJtIit1KTt2YXIgYz1zKGUpLGw9cyhuKSxoPSJvcmllbnRhdGlvbiIrdCsiRXhhY3QiLGY9WyJmdW5jdGlvbiAiLGgsIigiLG8uam9pbigpLCIpe3ZhciBwPSIsYywiLG49IixsLCIsZD1zdWIocCxuKTtyZXR1cm4gZFtkLmxlbmd0aC0xXTt9O3JldHVybiAiLGhdLmpvaW4oIiIpO3JldHVybiBuZXcgRnVuY3Rpb24oInN1bSIsInByb2QiLCJzY2FsZSIsInN1YiIsZikodG4sUWUsbm4scm4pfXZhciBjPXUoMyksbD11KDQpLGg9W2Z1bmN0aW9uKCl7cmV0dXJuIDB9LGZ1bmN0aW9uKCl7cmV0dXJuIDB9LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVbMF0tdFswXX0sZnVuY3Rpb24odCxlLHIpe3ZhciBpLG89KHRbMV0tclsxXSkqKGVbMF0tclswXSkscz0odFswXS1yWzBdKSooZVsxXS1yWzFdKSxhPW8tcztpZihvPjApe2lmKHM8PTApcmV0dXJuIGE7aT1vK3N9ZWxzZXtpZighKG88MCkpcmV0dXJuIGE7aWYocz49MClyZXR1cm4gYTtpPS0obytzKX12YXIgdT1uKmk7cmV0dXJuIGE+PXV8fGE8PS11P2E6Yyh0LGUscil9LGZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvPXRbMF0taVswXSxzPWVbMF0taVswXSxhPW5bMF0taVswXSx1PXRbMV0taVsxXSxjPWVbMV0taVsxXSxoPW5bMV0taVsxXSxmPXRbMl0taVsyXSxwPWVbMl0taVsyXSxkPW5bMl0taVsyXSxnPXMqaCx5PWEqYyxtPWEqdSx2PW8qaCxfPW8qYyx4PXMqdSx3PWYqKGcteSkrcCoobS12KStkKihfLXgpLGI9KE1hdGguYWJzKGcpK01hdGguYWJzKHkpKSpNYXRoLmFicyhmKSsoTWF0aC5hYnMobSkrTWF0aC5hYnModikpKk1hdGguYWJzKHApKyhNYXRoLmFicyhfKStNYXRoLmFicyh4KSkqTWF0aC5hYnMoZCksRD1yKmI7cmV0dXJuIHc+RHx8LXc+RD93OmwodCxlLG4saSl9XTtmdW5jdGlvbiBmKHQpe3ZhciBlPWhbdC5sZW5ndGhdO3JldHVybiBlfHwoZT1oW3QubGVuZ3RoXT11KHQubGVuZ3RoKSksZS5hcHBseSh2b2lkIDAsdCl9IWZ1bmN0aW9uKCl7Zm9yKDtoLmxlbmd0aDw9NTspaC5wdXNoKHUoaC5sZW5ndGgpKTtmb3IodmFyIGU9W10sbj1bInNsb3ciXSxyPTA7cjw9NTsrK3IpZS5wdXNoKCJhIityKSxuLnB1c2goIm8iK3IpO3ZhciBpPVsiZnVuY3Rpb24gZ2V0T3JpZW50YXRpb24oIixlLmpvaW4oKSwiKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmNhc2UgMTpyZXR1cm4gMDsiXTtmb3Iocj0yO3I8PTU7KytyKWkucHVzaCgiY2FzZSAiLHIsIjpyZXR1cm4gbyIsciwiKCIsZS5zbGljZSgwLHIpLmpvaW4oKSwiKTsiKTtpLnB1c2goIn12YXIgcz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoOysraSl7c1tpXT1hcmd1bWVudHNbaV19O3JldHVybiBzbG93KHMpO31yZXR1cm4gZ2V0T3JpZW50YXRpb24iKSxuLnB1c2goaS5qb2luKCIiKSk7dmFyIG89RnVuY3Rpb24uYXBwbHkodm9pZCAwLG4pO2Zvcih0LmV4cG9ydHM9by5hcHBseSh2b2lkIDAsW2ZdLmNvbmNhdChoKSkscj0wO3I8PTU7KytyKXQuZXhwb3J0c1tyXT1oW3JdfSgpfSkpLHNuPWZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8Myl7Zm9yKHZhciBuPW5ldyBBcnJheShlKSxyPTA7cjxlOysrciluW3JdPXI7cmV0dXJuIDI9PT1lJiZ0WzBdWzBdPT09dFsxXVswXSYmdFswXVsxXT09PXRbMV1bMV0/WzBdOm59dmFyIGk9bmV3IEFycmF5KGUpO2ZvcihyPTA7cjxlOysrcilpW3JdPXI7aS5zb3J0KChmdW5jdGlvbihlLG4pe3JldHVybiB0W2VdWzBdLXRbbl1bMF18fHRbZV1bMV0tdFtuXVsxXX0pKTt2YXIgbz1baVswXSxpWzFdXSxzPVtpWzBdLGlbMV1dO2ZvcihyPTI7cjxlOysrcil7Zm9yKHZhciBhPWlbcl0sdT10W2FdLGM9by5sZW5ndGg7Yz4xJiZhbih0W29bYy0yXV0sdFtvW2MtMV1dLHUpPD0wOyljLT0xLG8ucG9wKCk7Zm9yKG8ucHVzaChhKSxjPXMubGVuZ3RoO2M+MSYmYW4odFtzW2MtMl1dLHRbc1tjLTFdXSx1KT49MDspYy09MSxzLnBvcCgpO3MucHVzaChhKX1uPW5ldyBBcnJheShzLmxlbmd0aCtvLmxlbmd0aC0yKTtmb3IodmFyIGw9MCxoPShyPTAsby5sZW5ndGgpO3I8aDsrK3IpbltsKytdPW9bcl07Zm9yKHZhciBmPXMubGVuZ3RoLTI7Zj4wOy0tZiluW2wrK109c1tmXTtyZXR1cm4gbn0sYW49b25bM107dmFyIHVuPWxuLGNuPWxuO2Z1bmN0aW9uIGxuKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgbG4pKXJldHVybiBuZXcgbG4odCxlKTtpZih0aGlzLmRhdGE9dHx8W10sdGhpcy5sZW5ndGg9dGhpcy5kYXRhLmxlbmd0aCx0aGlzLmNvbXBhcmU9ZXx8aG4sdGhpcy5sZW5ndGg+MClmb3IodmFyIG49KHRoaXMubGVuZ3RoPj4xKS0xO24+PTA7bi0tKXRoaXMuX2Rvd24obil9ZnVuY3Rpb24gaG4odCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9bG4ucHJvdG90eXBlPXtwdXNoOmZ1bmN0aW9uKHQpe3RoaXMuZGF0YS5wdXNoKHQpLHRoaXMubGVuZ3RoKyssdGhpcy5fdXAodGhpcy5sZW5ndGgtMSl9LHBvcDpmdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5kYXRhWzBdO3JldHVybiB0aGlzLmxlbmd0aC0tLHRoaXMubGVuZ3RoPjAmJih0aGlzLmRhdGFbMF09dGhpcy5kYXRhW3RoaXMubGVuZ3RoXSx0aGlzLl9kb3duKDApKSx0aGlzLmRhdGEucG9wKCksdH19LHBlZWs6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhWzBdfSxfdXA6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZGF0YSxuPXRoaXMuY29tcGFyZSxyPWVbdF07dD4wOyl7dmFyIGk9dC0xPj4xLG89ZVtpXTtpZihuKHIsbyk+PTApYnJlYWs7ZVt0XT1vLHQ9aX1lW3RdPXJ9LF9kb3duOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmRhdGEsbj10aGlzLmNvbXBhcmUscj10aGlzLmxlbmd0aD4+MSxpPWVbdF07dDxyOyl7dmFyIG89MSsodDw8MSkscz1vKzEsYT1lW29dO2lmKHM8dGhpcy5sZW5ndGgmJm4oZVtzXSxhKTwwJiYobz1zLGE9ZVtzXSksbihhLGkpPj0wKWJyZWFrO2VbdF09YSx0PW99ZVt0XT1pfX0sdW4uZGVmYXVsdD1jbjt2YXIgZm49ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dFswXSxyPXRbMV0saT0hMSxvPTAscz1lLmxlbmd0aC0xO288ZS5sZW5ndGg7cz1vKyspe3ZhciBhPWVbb11bMF0sdT1lW29dWzFdLGM9ZVtzXVswXSxsPWVbc11bMV07dT5yIT1sPnImJm48KGMtYSkqKHItdSkvKGwtdSkrYSYmKGk9IWkpfXJldHVybiBpfSxwbj1vblszXSxkbj1nbjtmdW5jdGlvbiBnbih0LGUsbil7ZT1NYXRoLm1heCgwLHZvaWQgMD09PWU/MjplKSxuPW58fDA7Zm9yKHZhciByLGk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF0sbj10WzBdLHI9dFswXSxpPXRbMF0sbz0wO288dC5sZW5ndGg7bysrKXt2YXIgcz10W29dO3NbMF08ZVswXSYmKGU9cyksc1swXT5yWzBdJiYocj1zKSxzWzFdPG5bMV0mJihuPXMpLHNbMV0+aVsxXSYmKGk9cyl9dmFyIGE9W2UsbixyLGldLHU9YS5zbGljZSgpO2ZvcihvPTA7bzx0Lmxlbmd0aDtvKyspZm4odFtvXSxhKXx8dS5wdXNoKHRbb10pO3ZhciBjPXNuKHUpLGw9W107Zm9yKG89MDtvPGMubGVuZ3RoO28rKylsLnB1c2godVtjW29dXSk7cmV0dXJuIGx9KHQpLG89UGUoMTYsWyJbMF0iLCJbMV0iLCJbMF0iLCJbMV0iXSkubG9hZCh0KSxzPVtdLGE9MDthPGkubGVuZ3RoO2ErKyl7dmFyIHU9aVthXTtvLnJlbW92ZSh1KSxyPURuKHUscikscy5wdXNoKHIpfXZhciBjPVBlKDE2KTtmb3IoYT0wO2E8cy5sZW5ndGg7YSsrKWMuaW5zZXJ0KGJuKHNbYV0pKTtmb3IodmFyIGw9ZSplLGg9bipuO3MubGVuZ3RoOyl7dmFyIGY9cy5zaGlmdCgpLHA9Zi5wLGQ9Zi5uZXh0LnAsZz1FbihwLGQpO2lmKCEoZzxoKSl7dmFyIHk9Zy9sOyh1PXluKG8sZi5wcmV2LnAscCxkLGYubmV4dC5uZXh0LnAseSxjKSkmJk1hdGgubWluKEVuKHUscCksRW4odSxkKSk8PXkmJihzLnB1c2goZikscy5wdXNoKERuKHUsZikpLG8ucmVtb3ZlKHUpLGMucmVtb3ZlKGYpLGMuaW5zZXJ0KGJuKGYpKSxjLmluc2VydChibihmLm5leHQpKSl9fWY9cjt2YXIgbT1bXTtkb3ttLnB1c2goZi5wKSxmPWYubmV4dH13aGlsZShmIT09cik7cmV0dXJuIG0ucHVzaChmLnApLG19ZnVuY3Rpb24geW4odCxlLG4scixpLG8scyl7Zm9yKHZhciBhPW5ldyB1bihudWxsLG1uKSx1PXQuZGF0YTt1Oyl7Zm9yKHZhciBjPTA7Yzx1LmNoaWxkcmVuLmxlbmd0aDtjKyspe3ZhciBsPXUuY2hpbGRyZW5bY10saD11LmxlYWY/Q24obCxuLHIpOnZuKG4scixsKTtoPm98fGEucHVzaCh7bm9kZTpsLGRpc3Q6aH0pfWZvcig7YS5sZW5ndGgmJiFhLnBlZWsoKS5ub2RlLmNoaWxkcmVuOyl7dmFyIGY9YS5wb3AoKSxwPWYubm9kZSxkPUNuKHAsZSxuKSxnPUNuKHAscixpKTtpZihmLmRpc3Q8ZCYmZi5kaXN0PGcmJnhuKG4scCxzKSYmeG4ocixwLHMpKXJldHVybiBwfSh1PWEucG9wKCkpJiYodT11Lm5vZGUpfXJldHVybiBudWxsfWZ1bmN0aW9uIG1uKHQsZSl7cmV0dXJuIHQuZGlzdC1lLmRpc3R9ZnVuY3Rpb24gdm4odCxlLG4pe2lmKF9uKHQsbil8fF9uKGUsbikpcmV0dXJuIDA7dmFyIHI9U24odFswXSx0WzFdLGVbMF0sZVsxXSxuLm1pblgsbi5taW5ZLG4ubWF4WCxuLm1pblkpO2lmKDA9PT1yKXJldHVybiAwO3ZhciBpPVNuKHRbMF0sdFsxXSxlWzBdLGVbMV0sbi5taW5YLG4ubWluWSxuLm1pblgsbi5tYXhZKTtpZigwPT09aSlyZXR1cm4gMDt2YXIgbz1Tbih0WzBdLHRbMV0sZVswXSxlWzFdLG4ubWF4WCxuLm1pblksbi5tYXhYLG4ubWF4WSk7aWYoMD09PW8pcmV0dXJuIDA7dmFyIHM9U24odFswXSx0WzFdLGVbMF0sZVsxXSxuLm1pblgsbi5tYXhZLG4ubWF4WCxuLm1heFkpO3JldHVybiAwPT09cz8wOk1hdGgubWluKHIsaSxvLHMpfWZ1bmN0aW9uIF9uKHQsZSl7cmV0dXJuIHRbMF0+PWUubWluWCYmdFswXTw9ZS5tYXhYJiZ0WzFdPj1lLm1pblkmJnRbMV08PWUubWF4WX1mdW5jdGlvbiB4bih0LGUsbil7Zm9yKHZhciByPU1hdGgubWluKHRbMF0sZVswXSksaT1NYXRoLm1pbih0WzFdLGVbMV0pLG89TWF0aC5tYXgodFswXSxlWzBdKSxzPU1hdGgubWF4KHRbMV0sZVsxXSksYT1uLnNlYXJjaCh7bWluWDpyLG1pblk6aSxtYXhYOm8sbWF4WTpzfSksdT0wO3U8YS5sZW5ndGg7dSsrKWlmKHduKGFbdV0ucCxhW3VdLm5leHQucCx0LGUpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHduKHQsZSxuLHIpe3JldHVybiB0IT09ciYmZSE9PW4mJnBuKHQsZSxuKT4wIT1wbih0LGUscik+MCYmcG4obixyLHQpPjAhPXBuKG4scixlKT4wfWZ1bmN0aW9uIGJuKHQpe3ZhciBlPXQucCxuPXQubmV4dC5wO3JldHVybiB0Lm1pblg9TWF0aC5taW4oZVswXSxuWzBdKSx0Lm1pblk9TWF0aC5taW4oZVsxXSxuWzFdKSx0Lm1heFg9TWF0aC5tYXgoZVswXSxuWzBdKSx0Lm1heFk9TWF0aC5tYXgoZVsxXSxuWzFdKSx0fWZ1bmN0aW9uIERuKHQsZSl7dmFyIG49e3A6dCxwcmV2Om51bGwsbmV4dDpudWxsLG1pblg6MCxtaW5ZOjAsbWF4WDowLG1heFk6MH07cmV0dXJuIGU/KG4ubmV4dD1lLm5leHQsbi5wcmV2PWUsZS5uZXh0LnByZXY9bixlLm5leHQ9bik6KG4ucHJldj1uLG4ubmV4dD1uKSxufWZ1bmN0aW9uIEVuKHQsZSl7dmFyIG49dFswXS1lWzBdLHI9dFsxXS1lWzFdO3JldHVybiBuKm4rcipyfWZ1bmN0aW9uIENuKHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXSxvPW5bMF0tcixzPW5bMV0taTtpZigwIT09b3x8MCE9PXMpe3ZhciBhPSgodFswXS1yKSpvKyh0WzFdLWkpKnMpLyhvKm8rcypzKTthPjE/KHI9blswXSxpPW5bMV0pOmE+MCYmKHIrPW8qYSxpKz1zKmEpfXJldHVybihvPXRbMF0tcikqbysocz10WzFdLWkpKnN9ZnVuY3Rpb24gU24odCxlLG4scixpLG8scyxhKXt2YXIgdSxjLGwsaCxmPW4tdCxwPXItZSxkPXMtaSxnPWEtbyx5PXQtaSxtPWUtbyx2PWYqZitwKnAsXz1mKmQrcCpnLHg9ZCpkK2cqZyx3PWYqeStwKm0sYj1kKnkrZyptLEQ9dip4LV8qXyxFPUQsQz1EOzA9PT1EPyhjPTAsRT0xLGg9YixDPXgpOihoPXYqYi1fKncsKGM9XypiLXgqdyk8MD8oYz0wLGg9YixDPXgpOmM+RSYmKGM9RSxoPWIrXyxDPXgpKSxoPDA/KGg9MCwtdzwwP2M9MDotdz52P2M9RTooYz0tdyxFPXYpKTpoPkMmJihoPUMsLXcrXzwwP2M9MDotdytfPnY/Yz1FOihjPS13K18sRT12KSk7dmFyIFM9KDEtKGw9MD09PWg/MDpoL0MpKSppK2wqcy0oKDEtKHU9MD09PWM/MDpjL0UpKSp0K3UqbiksQT0oMS1sKSpvK2wqYS0oKDEtdSkqZSt1KnIpO3JldHVybiBTKlMrQSpBfWZ1bmN0aW9uIEFuKHQsZSxuKXtpZigib2JqZWN0IiE9dHlwZW9mKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi5pZ25vcmVCb3VuZGFyeTtpZighdCl0aHJvdyBuZXcgRXJyb3IoInBvaW50IGlzIHJlcXVpcmVkIik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJwb2x5Z29uIGlzIHJlcXVpcmVkIik7dmFyIGk9SWUodCksbz1NZShlKSxzPWUuZ2VvbWV0cnk/ZS5nZW9tZXRyeS50eXBlOmUudHlwZSxhPWUuYmJveDtpZihhJiYhMT09PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVbMF08PXRbMF0mJmVbMV08PXRbMV0mJmVbMl0+PXRbMF0mJmVbM10+PXRbMV19KGksYSkpcmV0dXJuITE7IlBvbHlnb24iPT09cyYmKG89W29dKTtmb3IodmFyIHU9MCxjPSExO3U8by5sZW5ndGgmJiFjO3UrKylpZihObihpLG9bdV1bMF0scikpe2Zvcih2YXIgbD0hMSxoPTE7aDxvW3VdLmxlbmd0aCYmIWw7KU5uKGksb1t1XVtoXSwhcikmJihsPSEwKSxoKys7bHx8KGM9ITApfXJldHVybiBjfWZ1bmN0aW9uIE5uKHQsZSxuKXt2YXIgcj0hMTtlWzBdWzBdPT09ZVtlLmxlbmd0aC0xXVswXSYmZVswXVsxXT09PWVbZS5sZW5ndGgtMV1bMV0mJihlPWUuc2xpY2UoMCxlLmxlbmd0aC0xKSk7Zm9yKHZhciBpPTAsbz1lLmxlbmd0aC0xO2k8ZS5sZW5ndGg7bz1pKyspe3ZhciBzPWVbaV1bMF0sYT1lW2ldWzFdLHU9ZVtvXVswXSxjPWVbb11bMV07aWYodFsxXSoocy11KSthKih1LXRbMF0pK2MqKHRbMF0tcyk9PTAmJihzLXRbMF0pKih1LXRbMF0pPD0wJiYoYS10WzFdKSooYy10WzFdKTw9MClyZXR1cm4hbjthPnRbMV0hPWM+dFsxXSYmdFswXTwodS1zKSoodFsxXS1hKS8oYy1hKStzJiYocj0hcil9cmV0dXJuIHJ9ZnVuY3Rpb24gSW4odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7c3dpdGNoKHQudHlwZSl7Y2FzZSJGZWF0dXJlIjpyZXR1cm4gTW4odCk7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiJ9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihuKXtzd2l0Y2gobil7Y2FzZSJ0eXBlIjpjYXNlImZlYXR1cmVzIjpyZXR1cm47ZGVmYXVsdDplW25dPXRbbl19fSkpLGUuZmVhdHVyZXM9dC5mZWF0dXJlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBNbih0KX0pKSxlfSh0KTtjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aVBvaW50IjpjYXNlIk11bHRpTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvbHlnb24iOmNhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpyZXR1cm4gVG4odCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVua25vd24gR2VvSlNPTiB0eXBlIil9fWZ1bmN0aW9uIE1uKHQpe3ZhciBlPXt0eXBlOiJGZWF0dXJlIn07cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3N3aXRjaChuKXtjYXNlInR5cGUiOmNhc2UicHJvcGVydGllcyI6Y2FzZSJnZW9tZXRyeSI6cmV0dXJuO2RlZmF1bHQ6ZVtuXT10W25dfX0pKSxlLnByb3BlcnRpZXM9Rm4odC5wcm9wZXJ0aWVzKSxlLmdlb21ldHJ5PVRuKHQuZ2VvbWV0cnkpLGV9ZnVuY3Rpb24gRm4odCl7dmFyIGU9e307cmV0dXJuIHQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPXRbbl07Im9iamVjdCI9PXR5cGVvZiByP251bGw9PT1yP2Vbbl09bnVsbDpyLmxlbmd0aD9lW25dPXIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKTplW25dPUZuKHIpOmVbbl09cn0pKSxlfWZ1bmN0aW9uIFRuKHQpe3ZhciBlPXt0eXBlOnQudHlwZX07cmV0dXJuIHQuYmJveCYmKGUuYmJveD10LmJib3gpLCJHZW9tZXRyeUNvbGxlY3Rpb24iPT09dC50eXBlPyhlLmdlb21ldHJpZXM9dC5nZW9tZXRyaWVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFRuKHQpfSkpLGUpOihlLmNvb3JkaW5hdGVzPU9uKHQuY29vcmRpbmF0ZXMpLGUpfWZ1bmN0aW9uIE9uKHQpe3JldHVybiJvYmplY3QiIT10eXBlb2YgdFswXT90LnNsaWNlKCk6dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBPbih0KX0pKX1mdW5jdGlvbiBMbih0KXtyZXR1cm4gZnVuY3Rpb24odCl7X2UodCk7dmFyIGU9TnVtYmVyKHRbMF0pLG49TnVtYmVyKHRbMV0pLHI9TnVtYmVyKHRbMl0pLGk9TnVtYmVyKHRbM10pO2lmKDY9PT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkB0dXJmL2Jib3gtcG9seWdvbiBkb2VzIG5vdCBzdXBwb3J0IEJCb3ggd2l0aCA2IHBvc2l0aW9ucyIpO3ZhciBvPVtlLG5dO3JldHVybiB1ZShbW28sW3Isbl0sW3IsaV0sW2UsaV0sb11dKX0oZnVuY3Rpb24odCl7dmFyIGU9WzEvMCwxLzAsLTEvMCwtMS8wXTtyZXR1cm4gd2UodCwoZnVuY3Rpb24odCl7ZVswXT50WzBdJiYoZVswXT10WzBdKSxlWzFdPnRbMV0mJihlWzFdPXRbMV0pLGVbMl08dFswXSYmKGVbMl09dFswXSksZVszXTx0WzFdJiYoZVszXT10WzFdKX0pKSxlfSh0KSl9Z24uZGVmYXVsdD1kbjt2YXIgUG49Qm4sUm49Qm47ZnVuY3Rpb24gQm4odCxlLG4pe249bnx8Mjt2YXIgcixpLG8scyxhLHUsYyxsPWUmJmUubGVuZ3RoLGg9bD9lWzBdKm46dC5sZW5ndGgsZj1rbih0LDAsaCxuLCEwKSxwPVtdO2lmKCFmKXJldHVybiBwO2lmKGwmJihmPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG8scyxhLHUsYz1bXTtmb3IoaT0wLG89ZS5sZW5ndGg7aTxvO2krKylzPWVbaV0qcixhPWk8by0xP2VbaSsxXSpyOnQubGVuZ3RoLCh1PWtuKHQscyxhLHIsITEpKT09PXUubmV4dCYmKHUuc3RlaW5lcj0hMCksYy5wdXNoKEhuKHUpKTtmb3IoYy5zb3J0KFluKSxpPTA7aTxjLmxlbmd0aDtpKyspWG4oY1tpXSxuKSxuPXpuKG4sbi5uZXh0KTtyZXR1cm4gbn0odCxlLGYsbikpLHQubGVuZ3RoPjgwKm4pe3I9bz10WzBdLGk9cz10WzFdO2Zvcih2YXIgZD1uO2Q8aDtkKz1uKShhPXRbZF0pPHImJihyPWEpLCh1PXRbZCsxXSk8aSYmKGk9dSksYT5vJiYobz1hKSx1PnMmJihzPXUpO2M9MCE9PShjPU1hdGgubWF4KG8tcixzLWkpKT8xL2M6MH1yZXR1cm4gam4oZixwLG4scixpLGMpLHB9ZnVuY3Rpb24ga24odCxlLG4scixpKXt2YXIgbyxzO2lmKGk9PT1vcih0LGUsbixyKT4wKWZvcihvPWU7bzxuO28rPXIpcz1ucihvLHRbb10sdFtvKzFdLHMpO2Vsc2UgZm9yKG89bi1yO28+PWU7by09cilzPW5yKG8sdFtvXSx0W28rMV0scyk7cmV0dXJuIHMmJlFuKHMscy5uZXh0KSYmKHJyKHMpLHM9cy5uZXh0KSxzfWZ1bmN0aW9uIHpuKHQsZSl7aWYoIXQpcmV0dXJuIHQ7ZXx8KGU9dCk7dmFyIG4scj10O2Rve2lmKG49ITEsci5zdGVpbmVyfHwhUW4ocixyLm5leHQpJiYwIT09Sm4oci5wcmV2LHIsci5uZXh0KSlyPXIubmV4dDtlbHNle2lmKHJyKHIpLChyPWU9ci5wcmV2KT09PXIubmV4dClicmVhaztuPSEwfX13aGlsZShufHxyIT09ZSk7cmV0dXJuIGV9ZnVuY3Rpb24gam4odCxlLG4scixpLG8scyl7aWYodCl7IXMmJm8mJmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXQ7ZG97bnVsbD09PWkueiYmKGkuej1XbihpLngsaS55LGUsbixyKSksaS5wcmV2Wj1pLnByZXYsaS5uZXh0Wj1pLm5leHQsaT1pLm5leHR9d2hpbGUoaSE9PXQpO2kucHJldloubmV4dFo9bnVsbCxpLnByZXZaPW51bGwsZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxzLGEsdSxjPTE7ZG97Zm9yKG49dCx0PW51bGwsbz1udWxsLHM9MDtuOyl7Zm9yKHMrKyxyPW4sYT0wLGU9MDtlPGMmJihhKysscj1yLm5leHRaKTtlKyspO2Zvcih1PWM7YT4wfHx1PjAmJnI7KTAhPT1hJiYoMD09PXV8fCFyfHxuLno8PXIueik/KGk9bixuPW4ubmV4dFosYS0tKTooaT1yLHI9ci5uZXh0Wix1LS0pLG8/by5uZXh0Wj1pOnQ9aSxpLnByZXZaPW8sbz1pO249cn1vLm5leHRaPW51bGwsYyo9Mn13aGlsZShzPjEpfShpKX0odCxyLGksbyk7Zm9yKHZhciBhLHUsYz10O3QucHJldiE9PXQubmV4dDspaWYoYT10LnByZXYsdT10Lm5leHQsbz9xbih0LHIsaSxvKTpVbih0KSllLnB1c2goYS5pL24pLGUucHVzaCh0LmkvbiksZS5wdXNoKHUuaS9uKSxycih0KSx0PXUubmV4dCxjPXUubmV4dDtlbHNlIGlmKCh0PXUpPT09Yyl7cz8xPT09cz9qbih0PVZuKHQsZSxuKSxlLG4scixpLG8sMik6Mj09PXMmJkduKHQsZSxuLHIsaSxvKTpqbih6bih0KSxlLG4scixpLG8sMSk7YnJlYWt9fX1mdW5jdGlvbiBVbih0KXt2YXIgZT10LnByZXYsbj10LHI9dC5uZXh0O2lmKEpuKGUsbixyKT49MClyZXR1cm4hMTtmb3IodmFyIGk9dC5uZXh0Lm5leHQ7aSE9PXQucHJldjspe2lmKFpuKGUueCxlLnksbi54LG4ueSxyLngsci55LGkueCxpLnkpJiZKbihpLnByZXYsaSxpLm5leHQpPj0wKXJldHVybiExO2k9aS5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIHFuKHQsZSxuLHIpe3ZhciBpPXQucHJldixvPXQscz10Lm5leHQ7aWYoSm4oaSxvLHMpPj0wKXJldHVybiExO2Zvcih2YXIgYT1pLng8by54P2kueDxzLng/aS54OnMueDpvLng8cy54P28ueDpzLngsdT1pLnk8by55P2kueTxzLnk/aS55OnMueTpvLnk8cy55P28ueTpzLnksYz1pLng+by54P2kueD5zLng/aS54OnMueDpvLng+cy54P28ueDpzLngsbD1pLnk+by55P2kueT5zLnk/aS55OnMueTpvLnk+cy55P28ueTpzLnksaD1XbihhLHUsZSxuLHIpLGY9V24oYyxsLGUsbixyKSxwPXQubmV4dFo7cCYmcC56PD1mOyl7aWYocCE9PXQucHJldiYmcCE9PXQubmV4dCYmWm4oaS54LGkueSxvLngsby55LHMueCxzLnkscC54LHAueSkmJkpuKHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLm5leHRafWZvcihwPXQucHJldlo7cCYmcC56Pj1oOyl7aWYocCE9PXQucHJldiYmcCE9PXQubmV4dCYmWm4oaS54LGkueSxvLngsby55LHMueCxzLnkscC54LHAueSkmJkpuKHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLnByZXZafXJldHVybiEwfWZ1bmN0aW9uIFZuKHQsZSxuKXt2YXIgcj10O2Rve3ZhciBpPXIucHJldixvPXIubmV4dC5uZXh0OyFRbihpLG8pJiYkbihpLHIsci5uZXh0LG8pJiZ0cihpLG8pJiZ0cihvLGkpJiYoZS5wdXNoKGkuaS9uKSxlLnB1c2goci5pL24pLGUucHVzaChvLmkvbikscnIocikscnIoci5uZXh0KSxyPXQ9bykscj1yLm5leHR9d2hpbGUociE9PXQpO3JldHVybiByfWZ1bmN0aW9uIEduKHQsZSxuLHIsaSxvKXt2YXIgcz10O2Rve2Zvcih2YXIgYT1zLm5leHQubmV4dDthIT09cy5wcmV2Oyl7aWYocy5pIT09YS5pJiZLbihzLGEpKXt2YXIgdT1lcihzLGEpO3JldHVybiBzPXpuKHMscy5uZXh0KSx1PXpuKHUsdS5uZXh0KSxqbihzLGUsbixyLGksbyksdm9pZCBqbih1LGUsbixyLGksbyl9YT1hLm5leHR9cz1zLm5leHR9d2hpbGUocyE9PXQpfWZ1bmN0aW9uIFluKHQsZSl7cmV0dXJuIHQueC1lLnh9ZnVuY3Rpb24gWG4odCxlKXtpZihlPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1lLGk9dC54LG89dC55LHM9LTEvMDtkb3tpZihvPD1yLnkmJm8+PXIubmV4dC55JiZyLm5leHQueSE9PXIueSl7dmFyIGE9ci54KyhvLXIueSkqKHIubmV4dC54LXIueCkvKHIubmV4dC55LXIueSk7aWYoYTw9aSYmYT5zKXtpZihzPWEsYT09PWkpe2lmKG89PT1yLnkpcmV0dXJuIHI7aWYobz09PXIubmV4dC55KXJldHVybiByLm5leHR9bj1yLng8ci5uZXh0Lng/cjpyLm5leHR9fXI9ci5uZXh0fXdoaWxlKHIhPT1lKTtpZighbilyZXR1cm4gbnVsbDtpZihpPT09cylyZXR1cm4gbi5wcmV2O3ZhciB1LGM9bixsPW4ueCxoPW4ueSxmPTEvMDtmb3Iocj1uLm5leHQ7ciE9PWM7KWk+PXIueCYmci54Pj1sJiZpIT09ci54JiZabihvPGg/aTpzLG8sbCxoLG88aD9zOmksbyxyLngsci55KSYmKCh1PU1hdGguYWJzKG8tci55KS8oaS1yLngpKTxmfHx1PT09ZiYmci54Pm4ueCkmJnRyKHIsdCkmJihuPXIsZj11KSxyPXIubmV4dDtyZXR1cm4gbn0odCxlKSxlKXt2YXIgbj1lcihlLHQpO3puKG4sbi5uZXh0KX19ZnVuY3Rpb24gV24odCxlLG4scixpKXtyZXR1cm4odD0xNDMxNjU1NzY1JigodD04NTg5OTM0NTkmKCh0PTI1MjY0NTEzNSYoKHQ9MTY3MTE5MzUmKCh0PTMyNzY3Kih0LW4pKmkpfHQ8PDgpKXx0PDw0KSl8dDw8MikpfHQ8PDEpKXwoZT0xNDMxNjU1NzY1JigoZT04NTg5OTM0NTkmKChlPTI1MjY0NTEzNSYoKGU9MTY3MTE5MzUmKChlPTMyNzY3KihlLXIpKmkpfGU8PDgpKXxlPDw0KSl8ZTw8MikpfGU8PDEpKTw8MX1mdW5jdGlvbiBIbih0KXt2YXIgZT10LG49dDtkb3tlLng8bi54JiYobj1lKSxlPWUubmV4dH13aGlsZShlIT09dCk7cmV0dXJuIG59ZnVuY3Rpb24gWm4odCxlLG4scixpLG8scyxhKXtyZXR1cm4oaS1zKSooZS1hKS0odC1zKSooby1hKT49MCYmKHQtcykqKHItYSktKG4tcykqKGUtYSk+PTAmJihuLXMpKihvLWEpLShpLXMpKihyLWEpPj0wfWZ1bmN0aW9uIEtuKHQsZSl7cmV0dXJuIHQubmV4dC5pIT09ZS5pJiZ0LnByZXYuaSE9PWUuaSYmIWZ1bmN0aW9uKHQsZSl7dmFyIG49dDtkb3tpZihuLmkhPT10LmkmJm4ubmV4dC5pIT09dC5pJiZuLmkhPT1lLmkmJm4ubmV4dC5pIT09ZS5pJiYkbihuLG4ubmV4dCx0LGUpKXJldHVybiEwO249bi5uZXh0fXdoaWxlKG4hPT10KTtyZXR1cm4hMX0odCxlKSYmdHIodCxlKSYmdHIoZSx0KSYmZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ITEsaT0odC54K2UueCkvMixvPSh0LnkrZS55KS8yO2Rve24ueT5vIT1uLm5leHQueT5vJiZuLm5leHQueSE9PW4ueSYmaTwobi5uZXh0Lngtbi54KSooby1uLnkpLyhuLm5leHQueS1uLnkpK24ueCYmKHI9IXIpLG49bi5uZXh0fXdoaWxlKG4hPT10KTtyZXR1cm4gcn0odCxlKX1mdW5jdGlvbiBKbih0LGUsbil7cmV0dXJuKGUueS10LnkpKihuLngtZS54KS0oZS54LXQueCkqKG4ueS1lLnkpfWZ1bmN0aW9uIFFuKHQsZSl7cmV0dXJuIHQueD09PWUueCYmdC55PT09ZS55fWZ1bmN0aW9uICRuKHQsZSxuLHIpe3JldHVybiEhKFFuKHQsZSkmJlFuKG4scil8fFFuKHQscikmJlFuKG4sZSkpfHxKbih0LGUsbik+MCE9Sm4odCxlLHIpPjAmJkpuKG4scix0KT4wIT1KbihuLHIsZSk+MH1mdW5jdGlvbiB0cih0LGUpe3JldHVybiBKbih0LnByZXYsdCx0Lm5leHQpPDA/Sm4odCxlLHQubmV4dCk+PTAmJkpuKHQsdC5wcmV2LGUpPj0wOkpuKHQsZSx0LnByZXYpPDB8fEpuKHQsdC5uZXh0LGUpPDB9ZnVuY3Rpb24gZXIodCxlKXt2YXIgbj1uZXcgaXIodC5pLHQueCx0LnkpLHI9bmV3IGlyKGUuaSxlLngsZS55KSxpPXQubmV4dCxvPWUucHJldjtyZXR1cm4gdC5uZXh0PWUsZS5wcmV2PXQsbi5uZXh0PWksaS5wcmV2PW4sci5uZXh0PW4sbi5wcmV2PXIsby5uZXh0PXIsci5wcmV2PW8scn1mdW5jdGlvbiBucih0LGUsbixyKXt2YXIgaT1uZXcgaXIodCxlLG4pO3JldHVybiByPyhpLm5leHQ9ci5uZXh0LGkucHJldj1yLHIubmV4dC5wcmV2PWksci5uZXh0PWkpOihpLnByZXY9aSxpLm5leHQ9aSksaX1mdW5jdGlvbiBycih0KXt0Lm5leHQucHJldj10LnByZXYsdC5wcmV2Lm5leHQ9dC5uZXh0LHQucHJldlomJih0LnByZXZaLm5leHRaPXQubmV4dFopLHQubmV4dFomJih0Lm5leHRaLnByZXZaPXQucHJldlopfWZ1bmN0aW9uIGlyKHQsZSxuKXt0aGlzLmk9dCx0aGlzLng9ZSx0aGlzLnk9bix0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLno9bnVsbCx0aGlzLnByZXZaPW51bGwsdGhpcy5uZXh0Wj1udWxsLHRoaXMuc3RlaW5lcj0hMX1mdW5jdGlvbiBvcih0LGUsbixyKXtmb3IodmFyIGk9MCxvPWUscz1uLXI7bzxuO28rPXIpaSs9KHRbc10tdFtvXSkqKHRbbysxXSt0W3MrMV0pLHM9bztyZXR1cm4gaX1mdW5jdGlvbiBzcih0LGUsbil7aWYoIXZlKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi5tdXRhdGU7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJm1lKHRbMF0pP3Q9Im1lcmNhdG9yIj09PWU/YXIodCk6dXIodCk6KCEwIT09ciYmKHQ9SW4odCkpLHdlKHQsKGZ1bmN0aW9uKHQpe3ZhciBuPSJtZXJjYXRvciI9PT1lP2FyKHQpOnVyKHQpO3RbMF09blswXSx0WzFdPW5bMV19KSkpLHR9ZnVuY3Rpb24gYXIodCl7dmFyIGU9TWF0aC5QSS8xODAsbj02Mzc4MTM3LHI9MjAwMzc1MDguMzQyNzg5MjQ0LGk9TWF0aC5hYnModFswXSk8PTE4MD90WzBdOnRbMF0tMzYwKmZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6dD4wPzE6MH0odFswXSksbz1bbippKmUsbipNYXRoLmxvZyhNYXRoLnRhbiguMjUqTWF0aC5QSSsuNSp0WzFdKmUpKV07cmV0dXJuIG9bMF0+ciYmKG9bMF09ciksb1swXTwtciYmKG9bMF09LXIpLG9bMV0+ciYmKG9bMV09ciksb1sxXTwtciYmKG9bMV09LXIpLG99ZnVuY3Rpb24gdXIodCl7dmFyIGU9MTgwL01hdGguUEksbj02Mzc4MTM3O3JldHVyblt0WzBdKmUvbiwoLjUqTWF0aC5QSS0yKk1hdGguYXRhbihNYXRoLmV4cCgtdFsxXS9uKSkpKmVdfWZ1bmN0aW9uIGNyKHQsZSxuKXt2YXIgcixpLG8scyxhLHU9dC5sZW5ndGgsYz1ocih0WzBdLGUpLGw9W107Zm9yKG58fChuPVtdKSxyPTE7cjx1O3IrKyl7Zm9yKGk9dFtyLTFdLHM9YT1ocihvPXRbcl0sZSk7Oyl7aWYoIShjfHMpKXtsLnB1c2goaSkscyE9PWE/KGwucHVzaChvKSxyPHUtMSYmKG4ucHVzaChsKSxsPVtdKSk6cj09PXUtMSYmbC5wdXNoKG8pO2JyZWFrfWlmKGMmcylicmVhaztjP2M9aHIoaT1scihpLG8sYyxlKSxlKTpzPWhyKG89bHIoaSxvLHMsZSksZSl9Yz1hfXJldHVybiBsLmxlbmd0aCYmbi5wdXNoKGwpLG59ZnVuY3Rpb24gbHIodCxlLG4scil7cmV0dXJuIDgmbj9bdFswXSsoZVswXS10WzBdKSooclszXS10WzFdKS8oZVsxXS10WzFdKSxyWzNdXTo0Jm4/W3RbMF0rKGVbMF0tdFswXSkqKHJbMV0tdFsxXSkvKGVbMV0tdFsxXSksclsxXV06MiZuP1tyWzJdLHRbMV0rKGVbMV0tdFsxXSkqKHJbMl0tdFswXSkvKGVbMF0tdFswXSldOjEmbj9bclswXSx0WzFdKyhlWzFdLXRbMV0pKihyWzBdLXRbMF0pLyhlWzBdLXRbMF0pXTpudWxsfWZ1bmN0aW9uIGhyKHQsZSl7dmFyIG49MDtyZXR1cm4gdFswXTxlWzBdP258PTE6dFswXT5lWzJdJiYobnw9MiksdFsxXTxlWzFdP258PTQ6dFsxXT5lWzNdJiYobnw9OCksbn1mdW5jdGlvbiBmcih0LGUpe3JldHVybiBlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gQW4oYWUoZSksdCl9KSl9Qm4uZGV2aWF0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWUmJmUubGVuZ3RoLG89aT9lWzBdKm46dC5sZW5ndGgscz1NYXRoLmFicyhvcih0LDAsbyxuKSk7aWYoaSlmb3IodmFyIGE9MCx1PWUubGVuZ3RoO2E8dTthKyspe3ZhciBjPWVbYV0qbixsPWE8dS0xP2VbYSsxXSpuOnQubGVuZ3RoO3MtPU1hdGguYWJzKG9yKHQsYyxsLG4pKX12YXIgaD0wO2ZvcihhPTA7YTxyLmxlbmd0aDthKz0zKXt2YXIgZj1yW2FdKm4scD1yW2ErMV0qbixkPXJbYSsyXSpuO2grPU1hdGguYWJzKCh0W2ZdLXRbZF0pKih0W3ArMV0tdFtmKzFdKS0odFtmXS10W3BdKSoodFtkKzFdLXRbZisxXSkpfXJldHVybiAwPT09cyYmMD09PWg/MDpNYXRoLmFicygoaC1zKS9zKX0sQm4uZmxhdHRlbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXVswXS5sZW5ndGgsbj17dmVydGljZXM6W10saG9sZXM6W10sZGltZW5zaW9uczplfSxyPTAsaT0wO2k8dC5sZW5ndGg7aSsrKXtmb3IodmFyIG89MDtvPHRbaV0ubGVuZ3RoO28rKylmb3IodmFyIHM9MDtzPGU7cysrKW4udmVydGljZXMucHVzaCh0W2ldW29dW3NdKTtpPjAmJihyKz10W2ktMV0ubGVuZ3RoLG4uaG9sZXMucHVzaChyKSl9cmV0dXJuIG59LFBuLmRlZmF1bHQ9Um4sT2JqZWN0LmZyZWV6ZSh7dG9NZXJjYXRvcjpmdW5jdGlvbih0LGUpe3JldHVybiBzcih0LCJtZXJjYXRvciIsZSl9LHRvV2dzODQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gc3IodCwid2dzODQiLGUpfX0pLE51bWJlci5wcm90b3R5cGUubW9kdWxvPWZ1bmN0aW9uKHQpe3JldHVybih0aGlzJXQrdCkldH0sY3IucG9seWxpbmU9Y3IsY3IucG9seWdvbj1mdW5jdGlvbih0LGUpe3ZhciBuLHIsaSxvLHMsYSx1O2ZvcihyPTE7cjw9ODtyKj0yKXtmb3Iobj1bXSxvPSEoaHIoaT10W3QubGVuZ3RoLTFdLGUpJnIpLHM9MDtzPHQubGVuZ3RoO3MrKykodT0hKGhyKGE9dFtzXSxlKSZyKSkhPT1vJiZuLnB1c2gobHIoaSxhLHIsZSkpLHUmJm4ucHVzaChhKSxpPWEsbz11O2lmKCEodD1uKS5sZW5ndGgpYnJlYWt9cmV0dXJuIG59O3ZhciBwcj1mdW5jdGlvbigpe3RoaXMuZWRnZXM9W10sdGhpcy5wb2x5Z29uPXZvaWQgMCx0aGlzLmVudmVsb3BlPXZvaWQgMH0sZHI9e2xlbmd0aDp7Y29uZmlndXJhYmxlOiEwfX07cHIucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dGhpc1t0aGlzLmVkZ2VzLmxlbmd0aF09dCx0aGlzLmVkZ2VzLnB1c2godCksdGhpcy5wb2x5Z29uPXRoaXMuZW52ZWxvcGU9dm9pZCAwfSxwci5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVkZ2VzW3RdfSxkci5sZW5ndGguZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMubGVuZ3RofSxwci5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt0aGlzLmVkZ2VzLmZvckVhY2godCl9LHByLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWRnZXMubWFwKHQpfSxwci5wcm90b3R5cGUuc29tZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZGdlcy5zb21lKHQpfSxwci5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiEwfSxwci5wcm90b3R5cGUuaXNIb2xlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuZWRnZXMucmVkdWNlKChmdW5jdGlvbihlLG4scil7cmV0dXJuIG4uZnJvbS5jb29yZGluYXRlc1sxXT50LmVkZ2VzW2VdLmZyb20uY29vcmRpbmF0ZXNbMV0mJihlPXIpLGV9KSwwKSxuPSgwPT09ZT90aGlzLmxlbmd0aDplKS0xLHI9KGUrMSkldGhpcy5sZW5ndGgsaT1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZVswXS10WzBdLGk9ZVsxXS10WzFdLG89blswXS1lWzBdLHM9blsxXS1lWzFdO3JldHVybiBNYXRoLnNpZ24ocipzLW8qaSl9KHRoaXMuZWRnZXNbbl0uZnJvbS5jb29yZGluYXRlcyx0aGlzLmVkZ2VzW2VdLmZyb20uY29vcmRpbmF0ZXMsdGhpcy5lZGdlc1tyXS5mcm9tLmNvb3JkaW5hdGVzKTtyZXR1cm4gMD09PWk/dGhpcy5lZGdlc1tuXS5mcm9tLmNvb3JkaW5hdGVzWzBdPnRoaXMuZWRnZXNbcl0uZnJvbS5jb29yZGluYXRlc1swXTppPjB9LHByLnByb3RvdHlwZS50b011bHRpUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZmUodGhpcy5lZGdlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZyb20uY29vcmRpbmF0ZXN9KSkpfSxwci5wcm90b3R5cGUudG9Qb2x5Z29uPWZ1bmN0aW9uKCl7aWYodGhpcy5wb2x5Z29uKXJldHVybiB0aGlzLnBvbHlnb247dmFyIHQ9dGhpcy5lZGdlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZyb20uY29vcmRpbmF0ZXN9KSk7cmV0dXJuIHQucHVzaCh0aGlzLmVkZ2VzWzBdLmZyb20uY29vcmRpbmF0ZXMpLHRoaXMucG9seWdvbj11ZShbdF0pfSxwci5wcm90b3R5cGUuZ2V0RW52ZWxvcGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbnZlbG9wZT90aGlzLmVudmVsb3BlOnRoaXMuZW52ZWxvcGU9TG4odGhpcy50b1BvbHlnb24oKSl9LHByLmZpbmRFZGdlUmluZ0NvbnRhaW5pbmc9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk9dC5nZXRFbnZlbG9wZSgpO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBvPWUuZ2V0RW52ZWxvcGUoKTtpZihyJiYobj1yLmdldEVudmVsb3BlKCkpLCFmdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFswXX0pKSxyPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFsxXX0pKSxpPWUuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFswXX0pKSxvPWUuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFsxXX0pKTtyZXR1cm4gTWF0aC5tYXgobnVsbCxuKT09PU1hdGgubWF4KG51bGwsaSkmJk1hdGgubWF4KG51bGwscik9PT1NYXRoLm1heChudWxsLG8pJiZNYXRoLm1pbihudWxsLG4pPT09TWF0aC5taW4obnVsbCxpKSYmTWF0aC5taW4obnVsbCxyKT09PU1hdGgubWluKG51bGwsbyl9KG8saSkmJmZyKG8saSkpe3ZhciBzPXQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5mcm9tLmNvb3JkaW5hdGVzfSkpLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiFlLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPT09ZVswXSYmdFsxXT09PWVbMV19KHQsZS5mcm9tLmNvb3JkaW5hdGVzKX0pKX0pKTtzJiZlLmluc2lkZShhZShzKSkmJighcnx8ZnIobixvKSkmJihyPWUpfX0pKSxyfSxwci5wcm90b3R5cGUuaW5zaWRlPWZ1bmN0aW9uKHQpe3JldHVybiBBbih0LHRoaXMudG9Qb2x5Z29uKCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwci5wcm90b3R5cGUsZHIpO3ZhciBncj1KZSgoZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZX0odC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3Qua2V5cz9PYmplY3Qua2V5czpuKS5zaGltPW59KSk7Z3Iuc2hpbTt2YXIgeXI9SmUoKGZ1bmN0aW9uKHQsZSl7dmFyIG49IltvYmplY3QgQXJndW1lbnRzXSI9PWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudHMpfSgpO2Z1bmN0aW9uIHIodCl7cmV0dXJuIltvYmplY3QgQXJndW1lbnRzXSI9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBpKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJjYWxsZWUiKSYmIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LCJjYWxsZWUiKXx8ITF9KGU9dC5leHBvcnRzPW4/cjppKS5zdXBwb3J0ZWQ9cixlLnVuc3VwcG9ydGVkPWl9KSk7eXIuc3VwcG9ydGVkLHlyLnVuc3VwcG9ydGVkLEplKChmdW5jdGlvbih0KXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2Usbj10LmV4cG9ydHM9ZnVuY3Rpb24odCxvLHMpe3JldHVybiBzfHwocz17fSksdD09PW98fCh0IGluc3RhbmNlb2YgRGF0ZSYmbyBpbnN0YW5jZW9mIERhdGU/dC5nZXRUaW1lKCk9PT1vLmdldFRpbWUoKTohdHx8IW98fCJvYmplY3QiIT10eXBlb2YgdCYmIm9iamVjdCIhPXR5cGVvZiBvP3Muc3RyaWN0P3Q9PT1vOnQ9PW86ZnVuY3Rpb24odCxvLHMpe3ZhciBhLHU7aWYocih0KXx8cihvKXx8dC5wcm90b3R5cGUhPT1vLnByb3RvdHlwZSlyZXR1cm4hMTtpZih5cih0KSlyZXR1cm4hIXlyKG8pJiYodD1lLmNhbGwodCksbz1lLmNhbGwobyksbih0LG8scykpO2lmKGkodCkpe2lmKCFpKG8pfHx0Lmxlbmd0aCE9PW8ubGVuZ3RoKXJldHVybiExO2ZvcihhPTA7YTx0Lmxlbmd0aDthKyspaWYodFthXSE9PW9bYV0pcmV0dXJuITE7cmV0dXJuITB9dHJ5e3ZhciBjPWdyKHQpLGw9Z3Iobyl9Y2F0Y2godCl7cmV0dXJuITF9aWYoYy5sZW5ndGghPWwubGVuZ3RoKXJldHVybiExO2ZvcihjLnNvcnQoKSxsLnNvcnQoKSxhPWMubGVuZ3RoLTE7YT49MDthLS0paWYoY1thXSE9bFthXSlyZXR1cm4hMTtmb3IoYT1jLmxlbmd0aC0xO2E+PTA7YS0tKWlmKHU9Y1thXSwhbih0W3VdLG9bdV0scykpcmV0dXJuITE7cmV0dXJuIHR5cGVvZiB0PT10eXBlb2Ygb30odCxvLHMpKX07ZnVuY3Rpb24gcih0KXtyZXR1cm4gbnVsbD09dH1mdW5jdGlvbiBpKHQpe3JldHVybiEoIXR8fCJvYmplY3QiIT10eXBlb2YgdHx8Im51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29weXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHQuc2xpY2V8fHQubGVuZ3RoPjAmJiJudW1iZXIiIT10eXBlb2YgdFswXSl9fSkpO3ZhciBtcj1KZSgoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbixyKXt0aGlzLmRhdGFzZXQ9W10sdGhpcy5lcHNpbG9uPTEsdGhpcy5taW5QdHM9Mix0aGlzLmRpc3RhbmNlPXRoaXMuX2V1Y2xpZGVhbkRpc3RhbmNlLHRoaXMuY2x1c3RlcnM9W10sdGhpcy5ub2lzZT1bXSx0aGlzLl92aXNpdGVkPVtdLHRoaXMuX2Fzc2lnbmVkPVtdLHRoaXMuX2RhdGFzZXRMZW5ndGg9MCx0aGlzLl9pbml0KHQsZSxuLHIpfWUucHJvdG90eXBlLnJ1bj1mdW5jdGlvbih0LGUsbixyKXt0aGlzLl9pbml0KHQsZSxuLHIpO2Zvcih2YXIgaT0wO2k8dGhpcy5fZGF0YXNldExlbmd0aDtpKyspaWYoMSE9PXRoaXMuX3Zpc2l0ZWRbaV0pe3RoaXMuX3Zpc2l0ZWRbaV09MTt2YXIgbz10aGlzLl9yZWdpb25RdWVyeShpKTtpZihvLmxlbmd0aDx0aGlzLm1pblB0cyl0aGlzLm5vaXNlLnB1c2goaSk7ZWxzZXt2YXIgcz10aGlzLmNsdXN0ZXJzLmxlbmd0aDt0aGlzLmNsdXN0ZXJzLnB1c2goW10pLHRoaXMuX2FkZFRvQ2x1c3RlcihpLHMpLHRoaXMuX2V4cGFuZENsdXN0ZXIocyxvKX19cmV0dXJuIHRoaXMuY2x1c3RlcnN9LGUucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQpe2lmKCEodCBpbnN0YW5jZW9mIEFycmF5KSl0aHJvdyBFcnJvcigiRGF0YXNldCBtdXN0IGJlIG9mIHR5cGUgYXJyYXksICIrdHlwZW9mIHQrIiBnaXZlbiIpO3RoaXMuZGF0YXNldD10LHRoaXMuY2x1c3RlcnM9W10sdGhpcy5ub2lzZT1bXSx0aGlzLl9kYXRhc2V0TGVuZ3RoPXQubGVuZ3RoLHRoaXMuX3Zpc2l0ZWQ9bmV3IEFycmF5KHRoaXMuX2RhdGFzZXRMZW5ndGgpLHRoaXMuX2Fzc2lnbmVkPW5ldyBBcnJheSh0aGlzLl9kYXRhc2V0TGVuZ3RoKX1lJiYodGhpcy5lcHNpbG9uPWUpLG4mJih0aGlzLm1pblB0cz1uKSxyJiYodGhpcy5kaXN0YW5jZT1yKX0sZS5wcm90b3R5cGUuX2V4cGFuZENsdXN0ZXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtpZigxIT09dGhpcy5fdmlzaXRlZFtyXSl7dGhpcy5fdmlzaXRlZFtyXT0xO3ZhciBpPXRoaXMuX3JlZ2lvblF1ZXJ5KHIpO2kubGVuZ3RoPj10aGlzLm1pblB0cyYmKGU9dGhpcy5fbWVyZ2VBcnJheXMoZSxpKSl9MSE9PXRoaXMuX2Fzc2lnbmVkW3JdJiZ0aGlzLl9hZGRUb0NsdXN0ZXIocix0KX19LGUucHJvdG90eXBlLl9hZGRUb0NsdXN0ZXI9ZnVuY3Rpb24odCxlKXt0aGlzLmNsdXN0ZXJzW2VdLnB1c2godCksdGhpcy5fYXNzaWduZWRbdF09MX0sZS5wcm90b3R5cGUuX3JlZ2lvblF1ZXJ5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0aGlzLl9kYXRhc2V0TGVuZ3RoO24rKyl7dGhpcy5kaXN0YW5jZSh0aGlzLmRhdGFzZXRbdF0sdGhpcy5kYXRhc2V0W25dKTx0aGlzLmVwc2lsb24mJmUucHVzaChuKX1yZXR1cm4gZX0sZS5wcm90b3R5cGUuX21lcmdlQXJyYXlzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9MDtyPG47cisrKXt2YXIgaT1lW3JdO3QuaW5kZXhPZihpKTwwJiZ0LnB1c2goaSl9cmV0dXJuIHR9LGUucHJvdG90eXBlLl9ldWNsaWRlYW5EaXN0YW5jZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpO3ItLTspbis9KHRbcl0tZVtyXSkqKHRbcl0tZVtyXSk7cmV0dXJuIE1hdGguc3FydChuKX0sdC5leHBvcnRzJiYodC5leHBvcnRzPWUpfSkpLHZyPUplKChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSxuKXt0aGlzLms9Myx0aGlzLmRhdGFzZXQ9W10sdGhpcy5hc3NpZ25tZW50cz1bXSx0aGlzLmNlbnRyb2lkcz1bXSx0aGlzLmluaXQodCxlLG4pfWUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMuYXNzaWdubWVudHM9W10sdGhpcy5jZW50cm9pZHM9W10sdm9pZCAwIT09dCYmKHRoaXMuZGF0YXNldD10KSx2b2lkIDAhPT1lJiYodGhpcy5rPWUpLHZvaWQgMCE9PW4mJih0aGlzLmRpc3RhbmNlPW4pfSxlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24odCxlKXt0aGlzLmluaXQodCxlKTtmb3IodmFyIG49dGhpcy5kYXRhc2V0Lmxlbmd0aCxyPTA7cjx0aGlzLms7cisrKXRoaXMuY2VudHJvaWRzW3JdPXRoaXMucmFuZG9tQ2VudHJvaWQoKTtmb3IodmFyIGk9ITA7aTspe2k9dGhpcy5hc3NpZ24oKTtmb3IodmFyIG89MDtvPHRoaXMuaztvKyspe2Zvcih2YXIgcz1uZXcgQXJyYXkobCksYT0wLHU9MDt1PGw7dSsrKXNbdV09MDtmb3IodmFyIGM9MDtjPG47YysrKXt2YXIgbD10aGlzLmRhdGFzZXRbY10ubGVuZ3RoO2lmKG89PT10aGlzLmFzc2lnbm1lbnRzW2NdKXtmb3IodT0wO3U8bDt1Kyspc1t1XSs9dGhpcy5kYXRhc2V0W2NdW3VdO2ErK319aWYoYT4wKXtmb3IodT0wO3U8bDt1Kyspc1t1XS89YTt0aGlzLmNlbnRyb2lkc1tvXT1zfWVsc2UgdGhpcy5jZW50cm9pZHNbb109dGhpcy5yYW5kb21DZW50cm9pZCgpLGk9ITB9fXJldHVybiB0aGlzLmdldENsdXN0ZXJzKCl9LGUucHJvdG90eXBlLnJhbmRvbUNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMuZGF0YXNldC5sZW5ndGgtMTtkb3tlPU1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpuKSx0PXRoaXMuZGF0YXNldFtlXX13aGlsZSh0aGlzLmNlbnRyb2lkcy5pbmRleE9mKHQpPj0wKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuYXNzaWduPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9ITEsbj10aGlzLmRhdGFzZXQubGVuZ3RoLHI9MDtyPG47cisrKSh0PXRoaXMuYXJnbWluKHRoaXMuZGF0YXNldFtyXSx0aGlzLmNlbnRyb2lkcyx0aGlzLmRpc3RhbmNlKSkhPXRoaXMuYXNzaWdubWVudHNbcl0mJih0aGlzLmFzc2lnbm1lbnRzW3JdPXQsZT0hMCk7cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldENsdXN0ZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9bmV3IEFycmF5KHRoaXMuayksbj0wO248dGhpcy5hc3NpZ25tZW50cy5sZW5ndGg7bisrKXZvaWQgMD09PWVbdD10aGlzLmFzc2lnbm1lbnRzW25dXSYmKGVbdF09W10pLGVbdF0ucHVzaChuKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuYXJnbWluPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsaT1OdW1iZXIuTUFYX1ZBTFVFLG89MCxzPWUubGVuZ3RoLGE9MDthPHM7YSsrKShyPW4odCxlW2FdKSk8aSYmKGk9cixvPWEpO3JldHVybiBvfSxlLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpO3ItLTspe3ZhciBpPXRbcl0tZVtyXTtuKz1pKml9cmV0dXJuIE1hdGguc3FydChuKX0sdC5leHBvcnRzJiYodC5leHBvcnRzPWUpfSkpLF9yPUplKChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSxuKXt0aGlzLl9xdWV1ZT1bXSx0aGlzLl9wcmlvcml0aWVzPVtdLHRoaXMuX3NvcnRpbmc9ImRlc2MiLHRoaXMuX2luaXQodCxlLG4pfWUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLl9xdWV1ZS5sZW5ndGgscj1uO3ItLTspe3ZhciBpPXRoaXMuX3ByaW9yaXRpZXNbcl07ImRlc2MiPT09dGhpcy5fc29ydGluZz9lPmkmJihuPXIpOmU8aSYmKG49cil9dGhpcy5faW5zZXJ0QXQodCxlLG4pfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3F1ZXVlLmxlbmd0aDtlLS07KXtpZih0PT09dGhpcy5fcXVldWVbZV0pe3RoaXMuX3F1ZXVlLnNwbGljZShlLDEpLHRoaXMuX3ByaW9yaXRpZXMuc3BsaWNlKGUsMSk7YnJlYWt9fX0sZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt0aGlzLl9xdWV1ZS5mb3JFYWNoKHQpfSxlLnByb3RvdHlwZS5nZXRFbGVtZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9xdWV1ZX0sZS5wcm90b3R5cGUuZ2V0RWxlbWVudFByaW9yaXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wcmlvcml0aWVzW3RdfSxlLnByb3RvdHlwZS5nZXRQcmlvcml0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByaW9yaXRpZXN9LGUucHJvdG90eXBlLmdldEVsZW1lbnRzV2l0aFByaW9yaXRpZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5fcXVldWUubGVuZ3RoO2U8bjtlKyspdC5wdXNoKFt0aGlzLl9xdWV1ZVtlXSx0aGlzLl9wcmlvcml0aWVzW2VdXSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQsZSxuKXtpZih0JiZlKXtpZih0aGlzLl9xdWV1ZT1bXSx0aGlzLl9wcmlvcml0aWVzPVtdLHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJBcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCIpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRoaXMuaW5zZXJ0KHRbcl0sZVtyXSl9biYmKHRoaXMuX3NvcnRpbmc9bil9LGUucHJvdG90eXBlLl9pbnNlcnRBdD1mdW5jdGlvbih0LGUsbil7dGhpcy5fcXVldWUubGVuZ3RoPT09bj8odGhpcy5fcXVldWUucHVzaCh0KSx0aGlzLl9wcmlvcml0aWVzLnB1c2goZSkpOih0aGlzLl9xdWV1ZS5zcGxpY2UobiwwLHQpLHRoaXMuX3ByaW9yaXRpZXMuc3BsaWNlKG4sMCxlKSl9LHQuZXhwb3J0cyYmKHQuZXhwb3J0cz1lKX0pKSx4cj1KZSgoZnVuY3Rpb24odCl7aWYodC5leHBvcnRzKXZhciBlPV9yO2Z1bmN0aW9uIG4odCxlLG4scil7dGhpcy5lcHNpbG9uPTEsdGhpcy5taW5QdHM9MSx0aGlzLmRpc3RhbmNlPXRoaXMuX2V1Y2xpZGVhbkRpc3RhbmNlLHRoaXMuX3JlYWNoYWJpbGl0eT1bXSx0aGlzLl9wcm9jZXNzZWQ9W10sdGhpcy5fY29yZURpc3RhbmNlPTAsdGhpcy5fb3JkZXJlZExpc3Q9W10sdGhpcy5faW5pdCh0LGUsbixyKX1uLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24odCxuLHIsaSl7dGhpcy5faW5pdCh0LG4scixpKTtmb3IodmFyIG89MCxzPXRoaXMuZGF0YXNldC5sZW5ndGg7bzxzO28rKylpZigxIT09dGhpcy5fcHJvY2Vzc2VkW29dKXt0aGlzLl9wcm9jZXNzZWRbb109MSx0aGlzLmNsdXN0ZXJzLnB1c2goW29dKTt2YXIgYT10aGlzLmNsdXN0ZXJzLmxlbmd0aC0xO3RoaXMuX29yZGVyZWRMaXN0LnB1c2gobyk7dmFyIHU9bmV3IGUobnVsbCxudWxsLCJhc2MiKSxjPXRoaXMuX3JlZ2lvblF1ZXJ5KG8pO3ZvaWQgMCE9PXRoaXMuX2Rpc3RhbmNlVG9Db3JlKG8pJiYodGhpcy5fdXBkYXRlUXVldWUobyxjLHUpLHRoaXMuX2V4cGFuZENsdXN0ZXIoYSx1KSl9cmV0dXJuIHRoaXMuY2x1c3RlcnN9LG4ucHJvdG90eXBlLmdldFJlYWNoYWJpbGl0eVBsb3Q9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5fb3JkZXJlZExpc3QubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX29yZGVyZWRMaXN0W2VdLGk9dGhpcy5fcmVhY2hhYmlsaXR5W3JdO3QucHVzaChbcixpXSl9cmV0dXJuIHR9LG4ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQpe2lmKCEodCBpbnN0YW5jZW9mIEFycmF5KSl0aHJvdyBFcnJvcigiRGF0YXNldCBtdXN0IGJlIG9mIHR5cGUgYXJyYXksICIrdHlwZW9mIHQrIiBnaXZlbiIpO3RoaXMuZGF0YXNldD10LHRoaXMuY2x1c3RlcnM9W10sdGhpcy5fcmVhY2hhYmlsaXR5PW5ldyBBcnJheSh0aGlzLmRhdGFzZXQubGVuZ3RoKSx0aGlzLl9wcm9jZXNzZWQ9bmV3IEFycmF5KHRoaXMuZGF0YXNldC5sZW5ndGgpLHRoaXMuX2NvcmVEaXN0YW5jZT0wLHRoaXMuX29yZGVyZWRMaXN0PVtdfWUmJih0aGlzLmVwc2lsb249ZSksbiYmKHRoaXMubWluUHRzPW4pLHImJih0aGlzLmRpc3RhbmNlPXIpfSxuLnByb3RvdHlwZS5fdXBkYXRlUXVldWU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7dGhpcy5fY29yZURpc3RhbmNlPXRoaXMuX2Rpc3RhbmNlVG9Db3JlKHQpLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ci5fcHJvY2Vzc2VkW2VdKXt2YXIgaT1yLmRpc3RhbmNlKHIuZGF0YXNldFt0XSxyLmRhdGFzZXRbZV0pLG89TWF0aC5tYXgoci5fY29yZURpc3RhbmNlLGkpO3ZvaWQgMD09PXIuX3JlYWNoYWJpbGl0eVtlXT8oci5fcmVhY2hhYmlsaXR5W2VdPW8sbi5pbnNlcnQoZSxvKSk6bzxyLl9yZWFjaGFiaWxpdHlbZV0mJihyLl9yZWFjaGFiaWxpdHlbZV09byxuLnJlbW92ZShlKSxuLmluc2VydChlLG8pKX19KSl9LG4ucHJvdG90eXBlLl9leHBhbmRDbHVzdGVyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuZ2V0RWxlbWVudHMoKSxyPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO2lmKHZvaWQgMD09PXRoaXMuX3Byb2Nlc3NlZFtvXSl7dmFyIHM9dGhpcy5fcmVnaW9uUXVlcnkobyk7dGhpcy5fcHJvY2Vzc2VkW29dPTEsdGhpcy5jbHVzdGVyc1t0XS5wdXNoKG8pLHRoaXMuX29yZGVyZWRMaXN0LnB1c2gobyksdm9pZCAwIT09dGhpcy5fZGlzdGFuY2VUb0NvcmUobykmJih0aGlzLl91cGRhdGVRdWV1ZShvLHMsZSksdGhpcy5fZXhwYW5kQ2x1c3Rlcih0LGUpKX19fSxuLnByb3RvdHlwZS5fZGlzdGFuY2VUb0NvcmU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZXBzaWxvbixuPTA7bjxlO24rKyl7aWYodGhpcy5fcmVnaW9uUXVlcnkodCxuKS5sZW5ndGg+PXRoaXMubWluUHRzKXJldHVybiBufX0sbi5wcm90b3R5cGUuX3JlZ2lvblF1ZXJ5PWZ1bmN0aW9uKHQsZSl7ZT1lfHx0aGlzLmVwc2lsb247Zm9yKHZhciBuPVtdLHI9MCxpPXRoaXMuZGF0YXNldC5sZW5ndGg7cjxpO3IrKyl0aGlzLmRpc3RhbmNlKHRoaXMuZGF0YXNldFt0XSx0aGlzLmRhdGFzZXRbcl0pPGUmJm4ucHVzaChyKTtyZXR1cm4gbn0sbi5wcm90b3R5cGUuX2V1Y2xpZGVhbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCk7ci0tOyluKz0odFtyXS1lW3JdKSoodFtyXS1lW3JdKTtyZXR1cm4gTWF0aC5zcXJ0KG4pfSx0LmV4cG9ydHMmJih0LmV4cG9ydHM9bil9KSksd3I9SmUoKGZ1bmN0aW9uKHQpe3QuZXhwb3J0cyYmKHQuZXhwb3J0cz17REJTQ0FOOm1yLEtNRUFOUzp2cixPUFRJQ1M6eHIsUHJpb3JpdHlRdWV1ZTpfcn0pfSkpO2Z1bmN0aW9uIGJyKCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gRHIodCl7dC5VPXQuQz10Lkw9dC5SPXQuUD10Lk49bnVsbH1mdW5jdGlvbiBFcih0LGUpe3ZhciBuPWUscj1lLlIsaT1uLlU7aT9pLkw9PT1uP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLG4uVT1yLG4uUj1yLkwsbi5SJiYobi5SLlU9biksci5MPW59ZnVuY3Rpb24gQ3IodCxlKXt2YXIgbj1lLHI9ZS5MLGk9bi5VO2k/aS5MPT09bj9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxuLlU9cixuLkw9ci5SLG4uTCYmKG4uTC5VPW4pLHIuUj1ufWZ1bmN0aW9uIFNyKHQpe2Zvcig7dC5MOyl0PXQuTDtyZXR1cm4gdH1mdW5jdGlvbiBBcih0LGUsbixyKXt2YXIgaT1bbnVsbCxudWxsXSxvPUpyLnB1c2goaSktMTtyZXR1cm4gaS5sZWZ0PXQsaS5yaWdodD1lLG4mJklyKGksdCxlLG4pLHImJklyKGksZSx0LHIpLFpyW3QuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLFpyW2UuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLGl9ZnVuY3Rpb24gTnIodCxlLG4pe3ZhciByPVtlLG5dO3JldHVybiByLmxlZnQ9dCxyfWZ1bmN0aW9uIElyKHQsZSxuLHIpe3RbMF18fHRbMV0/dC5sZWZ0PT09bj90WzFdPXI6dFswXT1yOih0WzBdPXIsdC5sZWZ0PWUsdC5yaWdodD1uKX1mdW5jdGlvbiBNcih0LGUsbixyLGkpe3ZhciBvLHM9dFswXSxhPXRbMV0sdT1zWzBdLGM9c1sxXSxsPTAsaD0xLGY9YVswXS11LHA9YVsxXS1jO2lmKG89ZS11LGZ8fCEobz4wKSl7aWYoby89ZixmPDApe2lmKG88bClyZXR1cm47bzxoJiYoaD1vKX1lbHNlIGlmKGY+MCl7aWYobz5oKXJldHVybjtvPmwmJihsPW8pfWlmKG89ci11LGZ8fCEobzwwKSl7aWYoby89ZixmPDApe2lmKG8+aClyZXR1cm47bz5sJiYobD1vKX1lbHNlIGlmKGY+MCl7aWYobzxsKXJldHVybjtvPGgmJihoPW8pfWlmKG89bi1jLHB8fCEobz4wKSl7aWYoby89cCxwPDApe2lmKG88bClyZXR1cm47bzxoJiYoaD1vKX1lbHNlIGlmKHA+MCl7aWYobz5oKXJldHVybjtvPmwmJihsPW8pfWlmKG89aS1jLHB8fCEobzwwKSl7aWYoby89cCxwPDApe2lmKG8+aClyZXR1cm47bz5sJiYobD1vKX1lbHNlIGlmKHA+MCl7aWYobzxsKXJldHVybjtvPGgmJihoPW8pfXJldHVybiEobD4wKSYmIShoPDEpfHwobD4wJiYodFswXT1bdStsKmYsYytsKnBdKSxoPDEmJih0WzFdPVt1K2gqZixjK2gqcF0pKSwhMH19fX19ZnVuY3Rpb24gRnIodCxlLG4scixpKXt2YXIgbz10WzFdO2lmKG8pcmV0dXJuITA7dmFyIHMsYSx1PXRbMF0sYz10LmxlZnQsbD10LnJpZ2h0LGg9Y1swXSxmPWNbMV0scD1sWzBdLGQ9bFsxXSxnPShoK3ApLzIseT0oZitkKS8yO2lmKGQ9PT1mKXtpZihnPGV8fGc+PXIpcmV0dXJuO2lmKGg+cCl7aWYodSl7aWYodVsxXT49aSlyZXR1cm59ZWxzZSB1PVtnLG5dO289W2csaV19ZWxzZXtpZih1KXtpZih1WzFdPG4pcmV0dXJufWVsc2UgdT1bZyxpXTtvPVtnLG5dfX1lbHNlIGlmKGE9eS0ocz0oaC1wKS8oZC1mKSkqZyxzPC0xfHxzPjEpaWYoaD5wKXtpZih1KXtpZih1WzFdPj1pKXJldHVybn1lbHNlIHU9WyhuLWEpL3Msbl07bz1bKGktYSkvcyxpXX1lbHNle2lmKHUpe2lmKHVbMV08bilyZXR1cm59ZWxzZSB1PVsoaS1hKS9zLGldO289WyhuLWEpL3Msbl19ZWxzZSBpZihmPGQpe2lmKHUpe2lmKHVbMF0+PXIpcmV0dXJufWVsc2UgdT1bZSxzKmUrYV07bz1bcixzKnIrYV19ZWxzZXtpZih1KXtpZih1WzBdPGUpcmV0dXJufWVsc2UgdT1bcixzKnIrYV07bz1bZSxzKmUrYV19cmV0dXJuIHRbMF09dSx0WzFdPW8sITB9ZnVuY3Rpb24gVHIodCxlKXt2YXIgbj10LnNpdGUscj1lLmxlZnQsaT1lLnJpZ2h0O3JldHVybiBuPT09aSYmKGk9cixyPW4pLGk/TWF0aC5hdGFuMihpWzFdLXJbMV0saVswXS1yWzBdKToobj09PXI/KHI9ZVsxXSxpPWVbMF0pOihyPWVbMF0saT1lWzFdKSxNYXRoLmF0YW4yKHJbMF0taVswXSxpWzFdLXJbMV0pKX1mdW5jdGlvbiBPcih0LGUpe3JldHVybiBlWysoZS5sZWZ0IT09dC5zaXRlKV19ZnVuY3Rpb24gTHIodCxlKXtyZXR1cm4gZVsrKGUubGVmdD09PXQuc2l0ZSldfXdyLkRCU0NBTix3ci5LTUVBTlMsd3IuT1BUSUNTLHdyLlByaW9yaXR5UXVldWUsYnIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpicixpbnNlcnQ6ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7aWYodCl7aWYoZS5QPXQsZS5OPXQuTix0Lk4mJih0Lk4uUD1lKSx0Lk49ZSx0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1lfWVsc2UgdC5SPWU7bj10fWVsc2UgdGhpcy5fPyh0PVNyKHRoaXMuXyksZS5QPW51bGwsZS5OPXQsdC5QPXQuTD1lLG49dCk6KGUuUD1lLk49bnVsbCx0aGlzLl89ZSxuPW51bGwpO2ZvcihlLkw9ZS5SPW51bGwsZS5VPW4sZS5DPSEwLHQ9ZTtuJiZuLkM7KW49PT0ocj1uLlUpLkw/KGk9ci5SKSYmaS5DPyhuLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09bi5SJiYoRXIodGhpcyxuKSxuPSh0PW4pLlUpLG4uQz0hMSxyLkM9ITAsQ3IodGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhuLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09bi5MJiYoQ3IodGhpcyxuKSxuPSh0PW4pLlUpLG4uQz0hMSxyLkM9ITAsRXIodGhpcyxyKSksbj10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBlLG4scixpPXQuVSxvPXQuTCxzPXQuUjtpZihuPW8/cz9TcihzKTpvOnMsaT9pLkw9PT10P2kuTD1uOmkuUj1uOnRoaXMuXz1uLG8mJnM/KHI9bi5DLG4uQz10LkMsbi5MPW8sby5VPW4sbiE9PXM/KGk9bi5VLG4uVT10LlUsdD1uLlIsaS5MPXQsbi5SPXMscy5VPW4pOihuLlU9aSxpPW4sdD1uLlIpKToocj10LkMsdD1uKSx0JiYodC5VPWkpLCFyKXtpZih0JiZ0LkMpcmV0dXJuIHZvaWQodC5DPSExKTtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChlPWkuUikuQyYmKGUuQz0hMSxpLkM9ITAsRXIodGhpcyxpKSxlPWkuUiksZS5MJiZlLkwuQ3x8ZS5SJiZlLlIuQyl7KCFlLlJ8fCFlLlIuQykmJihlLkwuQz0hMSxlLkM9ITAsQ3IodGhpcyxlKSxlPWkuUiksZS5DPWkuQyxpLkM9ZS5SLkM9ITEsRXIodGhpcyxpKSx0PXRoaXMuXzticmVha319ZWxzZSBpZigoZT1pLkwpLkMmJihlLkM9ITEsaS5DPSEwLENyKHRoaXMsaSksZT1pLkwpLGUuTCYmZS5MLkN8fGUuUiYmZS5SLkMpeyghZS5MfHwhZS5MLkMpJiYoZS5SLkM9ITEsZS5DPSEwLEVyKHRoaXMsZSksZT1pLkwpLGUuQz1pLkMsaS5DPWUuTC5DPSExLENyKHRoaXMsaSksdD10aGlzLl87YnJlYWt9ZS5DPSEwLHQ9aSxpPWkuVX13aGlsZSghdC5DKTt0JiYodC5DPSExKX19fTt2YXIgUHIsUnI9W107ZnVuY3Rpb24gQnIoKXtEcih0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24ga3IodCl7dmFyIGU9dC5QLG49dC5OO2lmKGUmJm4pe3ZhciByPWUuc2l0ZSxpPXQuc2l0ZSxvPW4uc2l0ZTtpZihyIT09byl7dmFyIHM9aVswXSxhPWlbMV0sdT1yWzBdLXMsYz1yWzFdLWEsbD1vWzBdLXMsaD1vWzFdLWEsZj0yKih1KmgtYypsKTtpZighKGY+PS0kcikpe3ZhciBwPXUqdStjKmMsZD1sKmwraCpoLGc9KGgqcC1jKmQpL2YseT0odSpkLWwqcCkvZixtPVJyLnBvcCgpfHxuZXcgQnI7bS5hcmM9dCxtLnNpdGU9aSxtLng9ZytzLG0ueT0obS5jeT15K2EpK01hdGguc3FydChnKmcreSp5KSx0LmNpcmNsZT1tO2Zvcih2YXIgdj1udWxsLF89S3IuXztfOylpZihtLnk8Xy55fHxtLnk9PT1fLnkmJm0ueDw9Xy54KXtpZighXy5MKXt2PV8uUDticmVha31fPV8uTH1lbHNle2lmKCFfLlIpe3Y9XzticmVha31fPV8uUn1Lci5pbnNlcnQodixtKSx2fHwoUHI9bSl9fX19ZnVuY3Rpb24genIodCl7dmFyIGU9dC5jaXJjbGU7ZSYmKGUuUHx8KFByPWUuTiksS3IucmVtb3ZlKGUpLFJyLnB1c2goZSksRHIoZSksdC5jaXJjbGU9bnVsbCl9dmFyIGpyPVtdO2Z1bmN0aW9uIFVyKCl7RHIodGhpcyksdGhpcy5lZGdlPXRoaXMuc2l0ZT10aGlzLmNpcmNsZT1udWxsfWZ1bmN0aW9uIHFyKHQpe3ZhciBlPWpyLnBvcCgpfHxuZXcgVXI7cmV0dXJuIGUuc2l0ZT10LGV9ZnVuY3Rpb24gVnIodCl7enIodCksSHIucmVtb3ZlKHQpLGpyLnB1c2godCksRHIodCl9ZnVuY3Rpb24gR3IodCl7dmFyIGU9dC5jaXJjbGUsbj1lLngscj1lLmN5LGk9W24scl0sbz10LlAscz10Lk4sYT1bdF07VnIodCk7Zm9yKHZhciB1PW87dS5jaXJjbGUmJk1hdGguYWJzKG4tdS5jaXJjbGUueCk8UXImJk1hdGguYWJzKHItdS5jaXJjbGUuY3kpPFFyOylvPXUuUCxhLnVuc2hpZnQodSksVnIodSksdT1vO2EudW5zaGlmdCh1KSx6cih1KTtmb3IodmFyIGM9cztjLmNpcmNsZSYmTWF0aC5hYnMobi1jLmNpcmNsZS54KTxRciYmTWF0aC5hYnMoci1jLmNpcmNsZS5jeSk8UXI7KXM9Yy5OLGEucHVzaChjKSxWcihjKSxjPXM7YS5wdXNoKGMpLHpyKGMpO3ZhciBsLGg9YS5sZW5ndGg7Zm9yKGw9MTtsPGg7KytsKWM9YVtsXSx1PWFbbC0xXSxJcihjLmVkZ2UsdS5zaXRlLGMuc2l0ZSxpKTt1PWFbMF0sKGM9YVtoLTFdKS5lZGdlPUFyKHUuc2l0ZSxjLnNpdGUsbnVsbCxpKSxrcih1KSxrcihjKX1mdW5jdGlvbiBZcih0KXtmb3IodmFyIGUsbixyLGksbz10WzBdLHM9dFsxXSxhPUhyLl87YTspaWYoKHI9WHIoYSxzKS1vKT5RcilhPWEuTDtlbHNle2lmKCEoKGk9by1XcihhLHMpKT5Rcikpe3I+LVFyPyhlPWEuUCxuPWEpOmk+LVFyPyhlPWEsbj1hLk4pOmU9bj1hO2JyZWFrfWlmKCFhLlIpe2U9YTticmVha31hPWEuUn0hZnVuY3Rpb24odCl7WnJbdC5pbmRleF09e3NpdGU6dCxoYWxmZWRnZXM6W119fSh0KTt2YXIgdT1xcih0KTtpZihIci5pbnNlcnQoZSx1KSxlfHxuKXtpZihlPT09bilyZXR1cm4genIoZSksbj1xcihlLnNpdGUpLEhyLmluc2VydCh1LG4pLHUuZWRnZT1uLmVkZ2U9QXIoZS5zaXRlLHUuc2l0ZSksa3IoZSksdm9pZCBrcihuKTtpZighbilyZXR1cm4gdm9pZCh1LmVkZ2U9QXIoZS5zaXRlLHUuc2l0ZSkpO3pyKGUpLHpyKG4pO3ZhciBjPWUuc2l0ZSxsPWNbMF0saD1jWzFdLGY9dFswXS1sLHA9dFsxXS1oLGQ9bi5zaXRlLGc9ZFswXS1sLHk9ZFsxXS1oLG09MiooZip5LXAqZyksdj1mKmYrcCpwLF89ZypnK3kqeSx4PVsoeSp2LXAqXykvbStsLChmKl8tZyp2KS9tK2hdO0lyKG4uZWRnZSxjLGQseCksdS5lZGdlPUFyKGMsdCxudWxsLHgpLG4uZWRnZT1Bcih0LGQsbnVsbCx4KSxrcihlKSxrcihuKX19ZnVuY3Rpb24gWHIodCxlKXt2YXIgbj10LnNpdGUscj1uWzBdLGk9blsxXSxvPWktZTtpZighbylyZXR1cm4gcjt2YXIgcz10LlA7aWYoIXMpcmV0dXJuLTEvMDt2YXIgYT0obj1zLnNpdGUpWzBdLHU9blsxXSxjPXUtZTtpZighYylyZXR1cm4gYTt2YXIgbD1hLXIsaD0xL28tMS9jLGY9bC9jO3JldHVybiBoPygtZitNYXRoLnNxcnQoZipmLTIqaCoobCpsLygtMipjKS11K2MvMitpLW8vMikpKS9oK3I6KHIrYSkvMn1mdW5jdGlvbiBXcih0LGUpe3ZhciBuPXQuTjtpZihuKXJldHVybiBYcihuLGUpO3ZhciByPXQuc2l0ZTtyZXR1cm4gclsxXT09PWU/clswXToxLzB9dmFyIEhyLFpyLEtyLEpyLFFyPTFlLTYsJHI9MWUtMTI7ZnVuY3Rpb24gdGkodCxlLG4pe3JldHVybih0WzBdLW5bMF0pKihlWzFdLXRbMV0pLSh0WzBdLWVbMF0pKihuWzFdLXRbMV0pfWZ1bmN0aW9uIGVpKHQsZSl7cmV0dXJuIGVbMV0tdFsxXXx8ZVswXS10WzBdfWZ1bmN0aW9uIG5pKHQsZSl7dmFyIG4scixpLG89dC5zb3J0KGVpKS5wb3AoKTtmb3IoSnI9W10sWnI9bmV3IEFycmF5KHQubGVuZ3RoKSxIcj1uZXcgYnIsS3I9bmV3IGJyOzspaWYoaT1QcixvJiYoIWl8fG9bMV08aS55fHxvWzFdPT09aS55JiZvWzBdPGkueCkpKG9bMF0hPT1ufHxvWzFdIT09cikmJihZcihvKSxuPW9bMF0scj1vWzFdKSxvPXQucG9wKCk7ZWxzZXtpZighaSlicmVhaztHcihpLmFyYyl9aWYoZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxuLHIsaT0wLG89WnIubGVuZ3RoO2k8bzsrK2kpaWYoKHQ9WnJbaV0pJiYocj0oZT10LmhhbGZlZGdlcykubGVuZ3RoKSl7dmFyIHM9bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KHIpO2ZvcihuPTA7bjxyOysrbilzW25dPW4sYVtuXT1Ucih0LEpyW2Vbbl1dKTtmb3Iocy5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBhW2VdLWFbdF19KSksbj0wO248cjsrK24pYVtuXT1lW3Nbbl1dO2ZvcihuPTA7bjxyOysrbillW25dPWFbbl19fSgpLGUpe3ZhciBzPStlWzBdWzBdLGE9K2VbMF1bMV0sdT0rZVsxXVswXSxjPStlWzFdWzFdOyhmdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGksbz1Kci5sZW5ndGg7by0tOylGcihpPUpyW29dLHQsZSxuLHIpJiZNcihpLHQsZSxuLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5Rcnx8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5Rcil8fGRlbGV0ZSBKcltvXX0pKHMsYSx1LGMpLGZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG8scyxhLHUsYyxsLGgsZixwLGQsZyx5PVpyLmxlbmd0aCxtPSEwO2ZvcihpPTA7aTx5OysraSlpZihvPVpyW2ldKXtmb3Iocz1vLnNpdGUsYT0odT1vLmhhbGZlZGdlcykubGVuZ3RoO2EtLTspSnJbdVthXV18fHUuc3BsaWNlKGEsMSk7Zm9yKGE9MCxjPXUubGVuZ3RoO2E8YzspZD0ocD1McihvLEpyW3VbYV1dKSlbMF0sZz1wWzFdLGg9KGw9T3IobyxKclt1WysrYSVjXV0pKVswXSxmPWxbMV0sKE1hdGguYWJzKGQtaCk+UXJ8fE1hdGguYWJzKGctZik+UXIpJiYodS5zcGxpY2UoYSwwLEpyLnB1c2goTnIocyxwLE1hdGguYWJzKGQtdCk8UXImJnItZz5Rcj9bdCxNYXRoLmFicyhoLXQpPFFyP2Y6cl06TWF0aC5hYnMoZy1yKTxRciYmbi1kPlFyP1tNYXRoLmFicyhmLXIpPFFyP2g6bixyXTpNYXRoLmFicyhkLW4pPFFyJiZnLWU+UXI/W24sTWF0aC5hYnMoaC1uKTxRcj9mOmVdOk1hdGguYWJzKGctZSk8UXImJmQtdD5Rcj9bTWF0aC5hYnMoZi1lKTxRcj9oOnQsZV06bnVsbCkpLTEpLCsrYyk7YyYmKG09ITEpfWlmKG0pe3ZhciB2LF8seCx3PTEvMDtmb3IoaT0wLG09bnVsbDtpPHk7KytpKShvPVpyW2ldKSYmKHg9KHY9KHM9by5zaXRlKVswXS10KSp2KyhfPXNbMV0tZSkqXyk8dyYmKHc9eCxtPW8pO2lmKG0pe3ZhciBiPVt0LGVdLEQ9W3Qscl0sRT1bbixyXSxDPVtuLGVdO20uaGFsZmVkZ2VzLnB1c2goSnIucHVzaChOcihzPW0uc2l0ZSxiLEQpKS0xLEpyLnB1c2goTnIocyxELEUpKS0xLEpyLnB1c2goTnIocyxFLEMpKS0xLEpyLnB1c2goTnIocyxDLGIpKS0xKX19Zm9yKGk9MDtpPHk7KytpKShvPVpyW2ldKSYmKG8uaGFsZmVkZ2VzLmxlbmd0aHx8ZGVsZXRlIFpyW2ldKX0ocyxhLHUsYyl9dGhpcy5lZGdlcz1Kcix0aGlzLmNlbGxzPVpyLEhyPUtyPUpyPVpyPW51bGx9ZnVuY3Rpb24gcmkodCl7aWYodmUodCkmJih0PXQuYmJveCksdCYmIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJiYm94IGlzIGludmFsaWQiKTtyZXR1cm4gdD9mdW5jdGlvbih0KXtyZXR1cm5bTWF0aC5yYW5kb20oKSoodFsyXS10WzBdKSt0WzBdLE1hdGgucmFuZG9tKCkqKHRbM10tdFsxXSkrdFsxXV19KHQpOlszNjAqb2koKSwxODAqb2koKV19ZnVuY3Rpb24gaWkodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybltlWzBdK3RbMF0sZVsxXSt0WzFdXX19ZnVuY3Rpb24gb2koKXtyZXR1cm4gTWF0aC5yYW5kb20oKS0uNX1mdW5jdGlvbiBzaSh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYoIkZlYXR1cmVDb2xsZWN0aW9uIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gbXVzdCBiZSBhIEZlYXR1cmVDb2xsZWN0aW9uIik7aWYobnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoInByb3BlcnR5IGlzIHJlcXVpcmVkIik7Zm9yKHZhciByPWFpKHQsZSksaT1PYmplY3Qua2V5cyhyKSxvPTA7bzxpLmxlbmd0aDtvKyspe2Zvcih2YXIgcz1pW29dLGE9cltzXSx1PVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl1LnB1c2godC5mZWF0dXJlc1thW2NdXSk7bihsZSh1KSxzLG8pfX1mdW5jdGlvbiBhaSh0LGUpe3ZhciBuPXt9O3JldHVybiBFZSh0LChmdW5jdGlvbih0LHIpe3ZhciBpPXQucHJvcGVydGllc3x8e307aWYoaS5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIG89aVtlXTtuLmhhc093blByb3BlcnR5KG8pP25bb10ucHVzaChyKTpuW29dPVtyXX19KSksbn1mdW5jdGlvbiB1aSh0LGUpe2lmKHZvaWQgMD09PXQpcmV0dXJuITE7dmFyIG49dHlwZW9mIGU7aWYoIm51bWJlciI9PT1ufHwic3RyaW5nIj09PW4pcmV0dXJuIHQuaGFzT3duUHJvcGVydHkoZSk7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoIXVpKHQsZVtyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIGNpKHQsZSl9ZnVuY3Rpb24gY2kodCxlKXtmb3IodmFyIG49T2JqZWN0LmtleXMoZSkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO2lmKHRbaV0hPT1lW2ldKXJldHVybiExfXJldHVybiEwfW5pLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bmkscG9seWdvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLm1hcCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5oYWxmZWRnZXMubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gT3IoZSx0W25dKX0pKTtyZXR1cm4gbi5kYXRhPWUuc2l0ZS5kYXRhLG59KSl9LHRyaWFuZ2xlczpmdW5jdGlvbigpe3ZhciB0PVtdLGU9dGhpcy5lZGdlcztyZXR1cm4gdGhpcy5jZWxscy5mb3JFYWNoKChmdW5jdGlvbihuLHIpe2lmKG89KGk9bi5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyxzLGE9bi5zaXRlLHU9LTEsYz1lW2lbby0xXV0sbD1jLmxlZnQ9PT1hP2MucmlnaHQ6Yy5sZWZ0OysrdTxvOylzPWwsbD0oYz1lW2lbdV1dKS5sZWZ0PT09YT9jLnJpZ2h0OmMubGVmdCxzJiZsJiZyPHMuaW5kZXgmJnI8bC5pbmRleCYmdGkoYSxzLGwpPDAmJnQucHVzaChbYS5kYXRhLHMuZGF0YSxsLmRhdGFdKX0pKSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucmlnaHR9KSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSkpfSxmaW5kOmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsaSxvPXRoaXMscz1vLl9mb3VuZHx8MCxhPW8uY2VsbHMubGVuZ3RoOyEoaT1vLmNlbGxzW3NdKTspaWYoKytzPj1hKXJldHVybiBudWxsO3ZhciB1PXQtaS5zaXRlWzBdLGM9ZS1pLnNpdGVbMV0sbD11KnUrYypjO2Rve2k9by5jZWxsc1tyPXNdLHM9bnVsbCxpLmhhbGZlZGdlcy5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgcj1vLmVkZ2VzW25dLGE9ci5sZWZ0O2lmKGEhPT1pLnNpdGUmJmF8fChhPXIucmlnaHQpKXt2YXIgdT10LWFbMF0sYz1lLWFbMV0saD11KnUrYypjO2g8bCYmKGw9aCxzPWEuaW5kZXgpfX0pKX13aGlsZShudWxsIT09cyk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09bnx8bDw9bipuP2kuc2l0ZTpudWxsfX0sT2JqZWN0LmZyZWV6ZSh7cmFuZG9tUG9zaXRpb246cmkscmFuZG9tUG9pbnQ6ZnVuY3Rpb24odCxlKXtpZighdmUoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLmJib3g7bnVsbD09dCYmKHQ9MSk7Zm9yKHZhciByPVtdLGk9MDtpPHQ7aSsrKXIucHVzaChhZShyaShuKSkpO3JldHVybiBsZShyKX0scmFuZG9tUG9seWdvbjpmdW5jdGlvbih0LGUpe2lmKCF2ZShlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuPWUuYmJveCxyPWUubnVtX3ZlcnRpY2VzLGk9ZS5tYXhfcmFkaWFsX2xlbmd0aDtudWxsPT10JiYodD0xKSxtZShyKXx8KHI9MTApLG1lKGkpfHwoaT0xMCk7Zm9yKHZhciBvPVtdLHM9MDtzPHQ7cysrKXt2YXIgYT1bXSx1PUFycmF5LmFwcGx5KG51bGwsbmV3IEFycmF5KHIrMSkpLm1hcChNYXRoLnJhbmRvbSk7dS5mb3JFYWNoKGMpLHUuZm9yRWFjaChsKSxhW2EubGVuZ3RoLTFdPWFbMF0sYT1hLm1hcChpaShyaShuKSkpLG8ucHVzaCh1ZShbYV0pKX1mdW5jdGlvbiBjKHQsZSxuKXtuW2VdPWU+MD90K25bZS0xXTp0fWZ1bmN0aW9uIGwodCl7dD0yKnQqTWF0aC5QSS91W3UubGVuZ3RoLTFdO3ZhciBlPU1hdGgucmFuZG9tKCk7YS5wdXNoKFtlKmkqTWF0aC5zaW4odCksZSppKk1hdGguY29zKHQpXSl9cmV0dXJuIGxlKG8pfSxyYW5kb21MaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7aWYoIXZlKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5iYm94LHI9ZS5udW1fdmVydGljZXMsaT1lLm1heF9sZW5ndGgsbz1lLm1heF9yb3RhdGlvbjtudWxsPT10JiYodD0xKSwoIW1lKHIpfHxyPDIpJiYocj0xMCksbWUoaSl8fChpPTFlLTQpLG1lKG8pfHwobz1NYXRoLlBJLzgpO2Zvcih2YXIgcz1bXSxhPTA7YTx0O2ErKyl7Zm9yKHZhciB1PVtyaShuKV0sYz0wO2M8ci0xO2MrKyl7dmFyIGw9KDA9PT1jPzIqTWF0aC5yYW5kb20oKSpNYXRoLlBJOk1hdGgudGFuKCh1W2NdWzFdLXVbYy0xXVsxXSkvKHVbY11bMF0tdVtjLTFdWzBdKSkpKyhNYXRoLnJhbmRvbSgpLS41KSpvKjIsaD1NYXRoLnJhbmRvbSgpKmk7dS5wdXNoKFt1W2NdWzBdK2gqTWF0aC5jb3MobCksdVtjXVsxXStoKk1hdGguc2luKGwpXSl9cy5wdXNoKGNlKHUpKX1yZXR1cm4gbGUocyl9fSksT2JqZWN0LmZyZWV6ZSh7Z2V0Q2x1c3RlcjpmdW5jdGlvbih0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO2lmKCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIG11c3QgYmUgYSBGZWF0dXJlQ29sbGVjdGlvbiIpO2lmKG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJmaWx0ZXIgaXMgcmVxdWlyZWQiKTt2YXIgbj1bXTtyZXR1cm4gRWUodCwoZnVuY3Rpb24odCl7dWkodC5wcm9wZXJ0aWVzLGUpJiZuLnB1c2godCl9KSksbGUobil9LGNsdXN0ZXJFYWNoOnNpLGNsdXN0ZXJSZWR1Y2U6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9cjtyZXR1cm4gc2kodCxlLChmdW5jdGlvbih0LGUsbyl7aT0wPT09byYmdm9pZCAwPT09cj90Om4oaSx0LGUsbyl9KSksaX0sY3JlYXRlQmluczphaSxhcHBseUZpbHRlcjp1aSxwcm9wZXJ0aWVzQ29udGFpbnNGaWx0ZXI6Y2ksZmlsdGVyUHJvcGVydGllczpmdW5jdGlvbih0LGUpe2lmKCFlKXJldHVybnt9O2lmKCFlLmxlbmd0aClyZXR1cm57fTtmb3IodmFyIG49e30scj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO3QuaGFzT3duUHJvcGVydHkoaSkmJihuW2ldPXRbaV0pfXJldHVybiBufX0pLCJmaWxsImluIEFycmF5LnByb3RvdHlwZXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwiZmlsbCIse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTpmdW5jdGlvbih0KXtpZihudWxsPT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3IodGhpcysiIGlzIG5vdCBhbiBvYmplY3QiKTt2YXIgZT1PYmplY3QodGhpcyksbj1NYXRoLm1heChNYXRoLm1pbihlLmxlbmd0aCw5MDA3MTk5MjU0NzQwOTkxKSwwKXx8MCxyPTEgaW4gYXJndW1lbnRzJiZwYXJzZUludChOdW1iZXIoYXJndW1lbnRzWzFdKSwxMCl8fDA7cj1yPDA/TWF0aC5tYXgobityLDApOk1hdGgubWluKHIsbik7dmFyIGk9MiBpbiBhcmd1bWVudHMmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9wYXJzZUludChOdW1iZXIoYXJndW1lbnRzWzJdKSwxMCl8fDA6bjtmb3IoaT1pPDA/TWF0aC5tYXgobithcmd1bWVudHNbMl0sMCk6TWF0aC5taW4oaSxuKTtyPGk7KWVbcl09dCwrK3I7cmV0dXJuIGV9LHdyaXRhYmxlOiEwfSksTnVtYmVyLmlzRmluaXRlPU51bWJlci5pc0Zpbml0ZXx8ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZpc0Zpbml0ZSh0KX0sTnVtYmVyLmlzSW50ZWdlcj1OdW1iZXIuaXNJbnRlZ2VyfHxmdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJmlzRmluaXRlKHQpJiZNYXRoLmZsb29yKHQpPT09dH0sTnVtYmVyLnBhcnNlRmxvYXQ9TnVtYmVyLnBhcnNlRmxvYXR8fHBhcnNlRmxvYXQsTnVtYmVyLmlzTmFOPU51bWJlci5pc05hTnx8ZnVuY3Rpb24odCl7cmV0dXJuIHQhPXR9LE1hdGgudHJ1bmM9TWF0aC50cnVuY3x8ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD9NYXRoLmNlaWwodCk6TWF0aC5mbG9vcih0KX07dmFyIGxpPWZ1bmN0aW9uKCl7fTtsaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbGkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGxpfSxsaS5wcm90b3R5cGUuZXF1YWxzV2l0aFRvbGVyYW5jZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE1hdGguYWJzKHQtZSk8PW59O3ZhciBoaT1mdW5jdGlvbigpe30sZmk9ZnVuY3Rpb24oKXt9LHBpPXtNQVhfVkFMVUU6e2NvbmZpZ3VyYWJsZTohMH19O2ZpLmlzTmFOPWZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIuaXNOYU4odCl9LGZpLmRvdWJsZVRvTG9uZ0JpdHM9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGZpLmxvbmdCaXRzVG9Eb3VibGU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGZpLmlzSW5maW5pdGU9ZnVuY3Rpb24odCl7cmV0dXJuIU51bWJlci5pc0Zpbml0ZSh0KX0scGkuTUFYX1ZBTFVFLmdldD1mdW5jdGlvbigpe3JldHVybiBOdW1iZXIuTUFYX1ZBTFVFfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmaSxwaSk7dmFyIGRpPWZ1bmN0aW9uKCl7fSxnaT1mdW5jdGlvbigpe30seWk9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIG1pKCl7fXZhciB2aT1mdW5jdGlvbiB0KCl7aWYodGhpcy54PW51bGwsdGhpcy55PW51bGwsdGhpcy56PW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy54PTAsdGhpcy55PTAsdGhpcy56PXQuTlVMTF9PUkRJTkFURTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy54PWUueCx0aGlzLnk9ZS55LHRoaXMuej1lLnp9ZWxzZSAyPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy54PWFyZ3VtZW50c1swXSx0aGlzLnk9YXJndW1lbnRzWzFdLHRoaXMuej10Lk5VTExfT1JESU5BVEUpOjM9PT1hcmd1bWVudHMubGVuZ3RoJiYodGhpcy54PWFyZ3VtZW50c1swXSx0aGlzLnk9YXJndW1lbnRzWzFdLHRoaXMuej1hcmd1bWVudHNbMl0pfSxfaT17RGltZW5zaW9uYWxDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0sTlVMTF9PUkRJTkFURTp7Y29uZmlndXJhYmxlOiEwfSxYOntjb25maWd1cmFibGU6ITB9LFk6e2NvbmZpZ3VyYWJsZTohMH0sWjp7Y29uZmlndXJhYmxlOiEwfX07dmkucHJvdG90eXBlLnNldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQpe2Nhc2UgdmkuWDp0aGlzLng9ZTticmVhaztjYXNlIHZpLlk6dGhpcy55PWU7YnJlYWs7Y2FzZSB2aS5aOnRoaXMuej1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGhpfX0sdmkucHJvdG90eXBlLmVxdWFsczJEPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4hKHRoaXMueCE9PXQueHx8dGhpcy55IT09dC55KX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEoIWxpLmVxdWFsc1dpdGhUb2xlcmFuY2UodGhpcy54LGUueCxuKXx8IWxpLmVxdWFsc1dpdGhUb2xlcmFuY2UodGhpcy55LGUueSxuKSl9fSx2aS5wcm90b3R5cGUuZ2V0T3JkaW5hdGU9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgdmkuWDpyZXR1cm4gdGhpcy54O2Nhc2UgdmkuWTpyZXR1cm4gdGhpcy55O2Nhc2UgdmkuWjpyZXR1cm4gdGhpcy56fXRocm93IG5ldyBoaX0sdmkucHJvdG90eXBlLmVxdWFsczNEPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLng9PT10LngmJnRoaXMueT09PXQueSYmKHRoaXMuej09PXQuenx8ZmkuaXNOYU4odGhpcy56KSkmJmZpLmlzTmFOKHQueil9LHZpLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB2aSYmdGhpcy5lcXVhbHMyRCh0KX0sdmkucHJvdG90eXBlLmVxdWFsSW5aPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGxpLmVxdWFsc1dpdGhUb2xlcmFuY2UodGhpcy56LHQueixlKX0sdmkucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLng8ZS54Py0xOnRoaXMueD5lLng/MTp0aGlzLnk8ZS55Py0xOnRoaXMueT5lLnk/MTowfSx2aS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt9LHZpLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2aSh0aGlzKX0sdmkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIigiK3RoaXMueCsiLCAiK3RoaXMueSsiLCAiK3RoaXMueisiKSJ9LHZpLnByb3RvdHlwZS5kaXN0YW5jZTNEPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMueC10Lngsbj10aGlzLnktdC55LHI9dGhpcy56LXQuejtyZXR1cm4gTWF0aC5zcXJ0KGUqZStuKm4rcipyKX0sdmkucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMueC10Lngsbj10aGlzLnktdC55O3JldHVybiBNYXRoLnNxcnQoZSplK24qbil9LHZpLnByb3RvdHlwZS5oYXNoQ29kZT1mdW5jdGlvbigpe3ZhciB0PTE3O3JldHVybiB0PTM3Kih0PTM3KnQrdmkuaGFzaENvZGUodGhpcy54KSkrdmkuaGFzaENvZGUodGhpcy55KX0sdmkucHJvdG90eXBlLnNldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7dGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10Lnp9LHZpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaSxnaSxtaV19LHZpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB2aX0sdmkuaGFzaENvZGU9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7ZmkuZG91YmxlVG9Mb25nQml0cyhhcmd1bWVudHNbMF0pO3JldHVybiBNYXRoLnRydW5jKDApfX0sX2kuRGltZW5zaW9uYWxDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiB4aX0sX2kuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg1Y2JmMmMyMzVjN2U1ODAwfSxfaS5OVUxMX09SRElOQVRFLmdldD1mdW5jdGlvbigpe3JldHVybiBmaS5OYU59LF9pLlguZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LF9pLlkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LF9pLlouZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHZpLF9pKTt2YXIgeGk9ZnVuY3Rpb24odCl7aWYodGhpcy5fZGltZW5zaW9uc1RvVGVzdD0yLDAhPT1hcmd1bWVudHMubGVuZ3RoJiYxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO2lmKDIhPT1lJiYzIT09ZSl0aHJvdyBuZXcgaGk7dGhpcy5fZGltZW5zaW9uc1RvVGVzdD1lfX07eGkucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZSxpPXhpLmNvbXBhcmUobi54LHIueCk7aWYoMCE9PWkpcmV0dXJuIGk7dmFyIG89eGkuY29tcGFyZShuLnksci55KTtyZXR1cm4gMCE9PW8/bzp0aGlzLl9kaW1lbnNpb25zVG9UZXN0PD0yPzA6eGkuY29tcGFyZShuLnosci56KX0seGkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3lpXX0seGkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHhpfSx4aS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTpmaS5pc05hTih0KT9maS5pc05hTihlKT8wOi0xOmZpLmlzTmFOKGUpPzE6MH07dmFyIHdpPWZ1bmN0aW9uKCl7fTt3aS5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7fSx3aS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sd2kucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHdpfTt2YXIgYmk9ZnVuY3Rpb24oKXt9LERpPXtJTlRFUklPUjp7Y29uZmlndXJhYmxlOiEwfSxCT1VOREFSWTp7Y29uZmlndXJhYmxlOiEwfSxFWFRFUklPUjp7Y29uZmlndXJhYmxlOiEwfSxOT05FOntjb25maWd1cmFibGU6ITB9fTtiaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sYmkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGJpfSxiaS50b0xvY2F0aW9uU3ltYm9sPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIGJpLkVYVEVSSU9SOnJldHVybiJlIjtjYXNlIGJpLkJPVU5EQVJZOnJldHVybiJiIjtjYXNlIGJpLklOVEVSSU9SOnJldHVybiJpIjtjYXNlIGJpLk5PTkU6cmV0dXJuIi0ifXRocm93IG5ldyBoaX0sRGkuSU5URVJJT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LERpLkJPVU5EQVJZLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxEaS5FWFRFUklPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sRGkuTk9ORS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYmksRGkpO3ZhciBFaT1mdW5jdGlvbih0LGUpe3JldHVybiB0LmludGVyZmFjZXNfJiZ0LmludGVyZmFjZXNfKCkuaW5kZXhPZihlKT4tMX0sQ2k9ZnVuY3Rpb24oKXt9LFNpPXtMT0dfMTA6e2NvbmZpZ3VyYWJsZTohMH19O0NpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxDaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQ2l9LENpLmxvZzEwPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGgubG9nKHQpO3JldHVybiBmaS5pc0luZmluaXRlKGUpfHxmaS5pc05hTihlKT9lOmUvQ2kuTE9HXzEwfSxDaS5taW49ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dDtyZXR1cm4gZTxpJiYoaT1lKSxuPGkmJihpPW4pLHI8aSYmKGk9ciksaX0sQ2kuY2xhbXA9ZnVuY3Rpb24oKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07cmV0dXJuIHQ8ZT9lOnQ+bj9uOnR9aWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMl0pJiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkmJk51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzFdKSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO3JldHVybiByPGk/aTpyPm8/bzpyfX0sQ2kud3JhcD1mdW5jdGlvbih0LGUpe3JldHVybiB0PDA/ZS0gLXQlZTp0JWV9LENpLm1heD1mdW5jdGlvbigpe2lmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMV0sZT1hcmd1bWVudHNbMl0sbj1hcmd1bWVudHNbMF07cmV0dXJuIHQ+biYmKG49dCksZT5uJiYobj1lKSxufWlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl0sbz1hcmd1bWVudHNbM10scz1hcmd1bWVudHNbMF07cmV0dXJuIHI+cyYmKHM9ciksaT5zJiYocz1pKSxvPnMmJihzPW8pLHN9fSxDaS5hdmVyYWdlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQrZSkvMn0sU2kuTE9HXzEwLmdldD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmxvZygxMCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENpLFNpKTt2YXIgQWk9ZnVuY3Rpb24odCl7dGhpcy5zdHI9dH07QWkucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbih0KXt0aGlzLnN0cis9dH0sQWkucHJvdG90eXBlLnNldENoYXJBdD1mdW5jdGlvbih0LGUpe3RoaXMuc3RyPXRoaXMuc3RyLnN1YnN0cigwLHQpK2UrdGhpcy5zdHIuc3Vic3RyKHQrMSl9LEFpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHJ9O3ZhciBOaT1mdW5jdGlvbih0KXt0aGlzLnZhbHVlPXR9O05pLnByb3RvdHlwZS5pbnRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfSxOaS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnZhbHVlPHQ/LTE6dGhpcy52YWx1ZT50PzE6MH0sTmkuaXNOYU49ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlci5pc05hTih0KX07dmFyIElpPWZ1bmN0aW9uKCl7fTtJaS5pc1doaXRlc3BhY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTMyJiZ0Pj0wfHwxMjc9PT10fSxJaS50b1VwcGVyQ2FzZT1mdW5jdGlvbih0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfTt2YXIgTWk9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX2hpPTAsdGhpcy5fbG89MCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLmluaXQoMCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmluaXQoZSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLmluaXQobil9ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dC5jYWxsKHRoaXMsdC5wYXJzZShhcmd1bWVudHNbMF0pKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMuaW5pdChyLGkpfX0sRmk9e1BJOntjb25maWd1cmFibGU6ITB9LFRXT19QSTp7Y29uZmlndXJhYmxlOiEwfSxQSV8yOntjb25maWd1cmFibGU6ITB9LEU6e2NvbmZpZ3VyYWJsZTohMH0sTmFOOntjb25maWd1cmFibGU6ITB9LEVQUzp7Y29uZmlndXJhYmxlOiEwfSxTUExJVDp7Y29uZmlndXJhYmxlOiEwfSxNQVhfUFJJTlRfRElHSVRTOntjb25maWd1cmFibGU6ITB9LFRFTjp7Y29uZmlndXJhYmxlOiEwfSxPTkU6e2NvbmZpZ3VyYWJsZTohMH0sU0NJX05PVF9FWFBPTkVOVF9DSEFSOntjb25maWd1cmFibGU6ITB9LFNDSV9OT1RfWkVSTzp7Y29uZmlndXJhYmxlOiEwfX07TWkucHJvdG90eXBlLmxlPWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9oaTx0Ll9oaXx8dGhpcy5faGk9PT10Ll9oaSkmJnRoaXMuX2xvPD10Ll9sb30sTWkucHJvdG90eXBlLmV4dHJhY3RTaWduaWZpY2FudERpZ2l0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuYWJzKCkscj1NaS5tYWduaXR1ZGUobi5faGkpLGk9TWkuVEVOLnBvdyhyKTsobj1uLmRpdmlkZShpKSkuZ3QoTWkuVEVOKT8obj1uLmRpdmlkZShNaS5URU4pLHIrPTEpOm4ubHQoTWkuT05FKSYmKG49bi5tdWx0aXBseShNaS5URU4pLHItPTEpO2Zvcih2YXIgbz1yKzEscz1uZXcgQWksYT1NaS5NQVhfUFJJTlRfRElHSVRTLTEsdT0wO3U8PWE7dSsrKXt0JiZ1PT09byYmcy5hcHBlbmQoIi4iKTt2YXIgYz1NYXRoLnRydW5jKG4uX2hpKTtpZihjPDApYnJlYWs7dmFyIGw9ITEsaD0wO2M+OT8obD0hMCxoPSI5Iik6aD0iMCIrYyxzLmFwcGVuZChoKSxuPW4uc3VidHJhY3QoTWkudmFsdWVPZihjKSkubXVsdGlwbHkoTWkuVEVOKSxsJiZuLnNlbGZBZGQoTWkuVEVOKTt2YXIgZj0hMCxwPU1pLm1hZ25pdHVkZShuLl9oaSk7aWYocDwwJiZNYXRoLmFicyhwKT49YS11JiYoZj0hMSksIWYpYnJlYWt9cmV0dXJuIGVbMF09cixzLnRvU3RyaW5nKCl9LE1pLnByb3RvdHlwZS5zcXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdWx0aXBseSh0aGlzKX0sTWkucHJvdG90eXBlLmRvdWJsZVZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpK3RoaXMuX2xvfSxNaS5wcm90b3R5cGUuc3VidHJhY3Q9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuYWRkKHQubmVnYXRlKCkpfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuYWRkKC1lKX19LE1pLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9oaT09PXQuX2hpJiZ0aGlzLl9sbz09PXQuX2xvfX0sTWkucHJvdG90eXBlLmlzWmVybz1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5faGkmJjA9PT10aGlzLl9sb30sTWkucHJvdG90eXBlLnNlbGZTdWJ0cmFjdD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5pc05hTigpP3RoaXM6dGhpcy5zZWxmQWRkKC10Ll9oaSwtdC5fbG8pfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuaXNOYU4oKT90aGlzOnRoaXMuc2VsZkFkZCgtZSwwKX19LE1pLnByb3RvdHlwZS5nZXRTcGVjaWFsTnVtYmVyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNaZXJvKCk/IjAuMCI6dGhpcy5pc05hTigpPyJOYU4gIjpudWxsfSxNaS5wcm90b3R5cGUubWluPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlKHQpP3RoaXM6dH0sTWkucHJvdG90eXBlLnNlbGZEaXZpZGU9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnNlbGZEaXZpZGUodC5faGksdC5fbG8pfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZkRpdmlkZShlLDApfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbixyLGksbyxzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXSx1PW51bGwsYz1udWxsLGw9bnVsbCxoPW51bGw7cmV0dXJuIGk9dGhpcy5faGkvcyxoPSh1PShsPU1pLlNQTElUKmkpLSh1PWwtaSkpKihjPShoPU1pLlNQTElUKnMpLShjPWgtcykpLShvPWkqcykrdSoocj1zLWMpKyhuPWktdSkqYytuKnIsaD1pKyhsPSh0aGlzLl9oaS1vLWgrdGhpcy5fbG8taSphKS9zKSx0aGlzLl9oaT1oLHRoaXMuX2xvPWktaCtsLHRoaXN9fSxNaS5wcm90b3R5cGUuZHVtcD1mdW5jdGlvbigpe3JldHVybiJERDwiK3RoaXMuX2hpKyIsICIrdGhpcy5fbG8rIj4ifSxNaS5wcm90b3R5cGUuZGl2aWRlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQsZSxuLHIsaT1hcmd1bWVudHNbMF0sbz1udWxsLHM9bnVsbCxhPW51bGwsdT1udWxsO3JldHVybiB0PShuPXRoaXMuX2hpL2kuX2hpKS0obz0oYT1NaS5TUExJVCpuKS0obz1hLW4pKSx1PW8qKHM9KHU9TWkuU1BMSVQqaS5faGkpLShzPXUtaS5faGkpKS0ocj1uKmkuX2hpKStvKihlPWkuX2hpLXMpK3Qqcyt0KmUsYT0odGhpcy5faGktci11K3RoaXMuX2xvLW4qaS5fbG8pL2kuX2hpLG5ldyBNaSh1PW4rYSxuLXUrYSl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBjPWFyZ3VtZW50c1swXTtyZXR1cm4gZmkuaXNOYU4oYyk/TWkuY3JlYXRlTmFOKCk6TWkuY29weSh0aGlzKS5zZWxmRGl2aWRlKGMsMCl9fSxNaS5wcm90b3R5cGUuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX2hpPnQuX2hpfHx0aGlzLl9oaT09PXQuX2hpKSYmdGhpcy5fbG8+PXQuX2xvfSxNaS5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQpe2lmKDA9PT10KXJldHVybiBNaS52YWx1ZU9mKDEpO3ZhciBlPW5ldyBNaSh0aGlzKSxuPU1pLnZhbHVlT2YoMSkscj1NYXRoLmFicyh0KTtpZihyPjEpZm9yKDtyPjA7KXIlMj09MSYmbi5zZWxmTXVsdGlwbHkoZSksKHIvPTIpPjAmJihlPWUuc3FyKCkpO2Vsc2Ugbj1lO3JldHVybiB0PDA/bi5yZWNpcHJvY2FsKCk6bn0sTWkucHJvdG90eXBlLmNlaWw9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTmFOKCkpcmV0dXJuIE1pLk5hTjt2YXIgdD1NYXRoLmNlaWwodGhpcy5faGkpLGU9MDtyZXR1cm4gdD09PXRoaXMuX2hpJiYoZT1NYXRoLmNlaWwodGhpcy5fbG8pKSxuZXcgTWkodCxlKX0sTWkucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl9oaTxlLl9oaT8tMTp0aGlzLl9oaT5lLl9oaT8xOnRoaXMuX2xvPGUuX2xvPy0xOnRoaXMuX2xvPmUuX2xvPzE6MH0sTWkucHJvdG90eXBlLnJpbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc05hTigpP3RoaXM6dGhpcy5hZGQoLjUpLmZsb29yKCl9LE1pLnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5pbml0KHQpLHRoaXN9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5pbml0KGUpLHRoaXN9fSxNaS5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdlKHQpP3RoaXM6dH0sTWkucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzWmVybygpKXJldHVybiBNaS52YWx1ZU9mKDApO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiBNaS5OYU47dmFyIHQ9MS9NYXRoLnNxcnQodGhpcy5faGkpLGU9dGhpcy5faGkqdCxuPU1pLnZhbHVlT2YoZSkscj10aGlzLnN1YnRyYWN0KG4uc3FyKCkpLl9oaSooLjUqdCk7cmV0dXJuIG4uYWRkKHIpfSxNaS5wcm90b3R5cGUuc2VsZkFkZD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZkFkZCh0Ll9oaSx0Ll9sbyl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlLG4scixpLG8scz1hcmd1bWVudHNbMF0sYT1udWxsO3JldHVybiBhPShyPXRoaXMuX2hpK3MpLShpPXItdGhpcy5faGkpLG49KG89KGE9cy1pKyh0aGlzLl9oaS1hKSkrdGhpcy5fbG8pKyhyLShlPXIrbykpLHRoaXMuX2hpPWUrbix0aGlzLl9sbz1uKyhlLXRoaXMuX2hpKSx0aGlzfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdSxjLGwsaCxmPWFyZ3VtZW50c1swXSxwPWFyZ3VtZW50c1sxXSxkPW51bGwsZz1udWxsLHk9bnVsbDtsPXRoaXMuX2hpK2YsYz10aGlzLl9sbytwLGc9bC0oeT1sLXRoaXMuX2hpKSxkPWMtKGg9Yy10aGlzLl9sbyk7dmFyIG09KHU9bCsoeT0oZz1mLXkrKHRoaXMuX2hpLWcpKStjKSkrKHk9KGQ9cC1oKyh0aGlzLl9sby1kKSkrKHkrKGwtdSkpKSx2PXkrKHUtbSk7cmV0dXJuIHRoaXMuX2hpPW0sdGhpcy5fbG89dix0aGlzfX0sTWkucHJvdG90eXBlLnNlbGZNdWx0aXBseT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZk11bHRpcGx5KHQuX2hpLHQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnNlbGZNdWx0aXBseShlLDApfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbixyLGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9bnVsbCxhPW51bGwsdT1udWxsLGM9bnVsbDtzPSh1PU1pLlNQTElUKnRoaXMuX2hpKS10aGlzLl9oaSxjPU1pLlNQTElUKmkscz11LXMsbj10aGlzLl9oaS1zLGE9Yy1pO3ZhciBsPSh1PXRoaXMuX2hpKmkpKyhjPXMqKGE9Yy1hKS11K3MqKHI9aS1hKStuKmErbipyKyh0aGlzLl9oaSpvK3RoaXMuX2xvKmkpKSxoPWMrKHM9dS1sKTtyZXR1cm4gdGhpcy5faGk9bCx0aGlzLl9sbz1oLHRoaXN9fSxNaS5wcm90b3R5cGUuc2VsZlNxcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGZNdWx0aXBseSh0aGlzKX0sTWkucHJvdG90eXBlLmZsb29yPWZ1bmN0aW9uKCl7aWYodGhpcy5pc05hTigpKXJldHVybiBNaS5OYU47dmFyIHQ9TWF0aC5mbG9vcih0aGlzLl9oaSksZT0wO3JldHVybiB0PT09dGhpcy5faGkmJihlPU1hdGguZmxvb3IodGhpcy5fbG8pKSxuZXcgTWkodCxlKX0sTWkucHJvdG90eXBlLm5lZ2F0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczpuZXcgTWkoLXRoaXMuX2hpLC10aGlzLl9sbyl9LE1pLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe30sTWkucHJvdG90eXBlLm11bHRpcGx5PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0LmlzTmFOKCk/TWkuY3JlYXRlTmFOKCk6TWkuY29weSh0aGlzKS5zZWxmTXVsdGlwbHkodCl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gZmkuaXNOYU4oZSk/TWkuY3JlYXRlTmFOKCk6TWkuY29weSh0aGlzKS5zZWxmTXVsdGlwbHkoZSwwKX19LE1pLnByb3RvdHlwZS5pc05hTj1mdW5jdGlvbigpe3JldHVybiBmaS5pc05hTih0aGlzLl9oaSl9LE1pLnByb3RvdHlwZS5pbnRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBNYXRoLnRydW5jKHRoaXMuX2hpKX0sTWkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9TWkubWFnbml0dWRlKHRoaXMuX2hpKTtyZXR1cm4gdD49LTMmJnQ8PTIwP3RoaXMudG9TdGFuZGFyZE5vdGF0aW9uKCk6dGhpcy50b1NjaU5vdGF0aW9uKCl9LE1pLnByb3RvdHlwZS50b1N0YW5kYXJkTm90YXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFNwZWNpYWxOdW1iZXJTdHJpbmcoKTtpZihudWxsIT09dClyZXR1cm4gdDt2YXIgZT1uZXcgQXJyYXkoMSkuZmlsbChudWxsKSxuPXRoaXMuZXh0cmFjdFNpZ25pZmljYW50RGlnaXRzKCEwLGUpLHI9ZVswXSsxLGk9bjtpZigiLiI9PT1uLmNoYXJBdCgwKSlpPSIwIituO2Vsc2UgaWYocjwwKWk9IjAuIitNaS5zdHJpbmdPZkNoYXIoIjAiLC1yKStuO2Vsc2UgaWYoLTE9PT1uLmluZGV4T2YoIi4iKSl7dmFyIG89ci1uLmxlbmd0aDtpPW4rTWkuc3RyaW5nT2ZDaGFyKCIwIixvKSsiLjAifXJldHVybiB0aGlzLmlzTmVnYXRpdmUoKT8iLSIraTppfSxNaS5wcm90b3R5cGUucmVjaXByb2NhbD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9bnVsbCxvPW51bGwscz1udWxsLGE9bnVsbDt0PShuPTEvdGhpcy5faGkpLShpPShzPU1pLlNQTElUKm4pLShpPXMtbikpLG89KGE9TWkuU1BMSVQqdGhpcy5faGkpLXRoaXMuX2hpO3ZhciB1PW4rKHM9KDEtKHI9bip0aGlzLl9oaSktKGE9aSoobz1hLW8pLXIraSooZT10aGlzLl9oaS1vKSt0Km8rdCplKS1uKnRoaXMuX2xvKS90aGlzLl9oaSk7cmV0dXJuIG5ldyBNaSh1LG4tdStzKX0sTWkucHJvdG90eXBlLnRvU2NpTm90YXRpb249ZnVuY3Rpb24oKXtpZih0aGlzLmlzWmVybygpKXJldHVybiBNaS5TQ0lfTk9UX1pFUk87dmFyIHQ9dGhpcy5nZXRTcGVjaWFsTnVtYmVyU3RyaW5nKCk7aWYobnVsbCE9PXQpcmV0dXJuIHQ7dmFyIGU9bmV3IEFycmF5KDEpLmZpbGwobnVsbCksbj10aGlzLmV4dHJhY3RTaWduaWZpY2FudERpZ2l0cyghMSxlKSxyPU1pLlNDSV9OT1RfRVhQT05FTlRfQ0hBUitlWzBdO2lmKCIwIj09PW4uY2hhckF0KDApKXRocm93IG5ldyBFcnJvcigiRm91bmQgbGVhZGluZyB6ZXJvOiAiK24pO3ZhciBpPSIiO24ubGVuZ3RoPjEmJihpPW4uc3Vic3RyaW5nKDEpKTt2YXIgbz1uLmNoYXJBdCgwKSsiLiIraTtyZXR1cm4gdGhpcy5pc05lZ2F0aXZlKCk/Ii0iK28rcjpvK3J9LE1pLnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc05hTigpP01pLk5hTjp0aGlzLmlzTmVnYXRpdmUoKT90aGlzLm5lZ2F0ZSgpOm5ldyBNaSh0aGlzKX0sTWkucHJvdG90eXBlLmlzUG9zaXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5faGk+MHx8MD09PXRoaXMuX2hpKSYmdGhpcy5fbG8+MH0sTWkucHJvdG90eXBlLmx0PWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9oaTx0Ll9oaXx8dGhpcy5faGk9PT10Ll9oaSkmJnRoaXMuX2xvPHQuX2xvfSxNaS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBNaS5jb3B5KHRoaXMpLnNlbGZBZGQodCl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gTWkuY29weSh0aGlzKS5zZWxmQWRkKGUpfX0sTWkucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9oaT10LHRoaXMuX2xvPTB9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5faGk9ZS5faGksdGhpcy5fbG89ZS5fbG99fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLl9oaT1uLHRoaXMuX2xvPXJ9fSxNaS5wcm90b3R5cGUuZ3Q9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX2hpPnQuX2hpfHx0aGlzLl9oaT09PXQuX2hpKSYmdGhpcy5fbG8+dC5fbG99LE1pLnByb3RvdHlwZS5pc05lZ2F0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuX2hpPDB8fDA9PT10aGlzLl9oaSkmJnRoaXMuX2xvPDB9LE1pLnByb3RvdHlwZS50cnVuYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/TWkuTmFOOnRoaXMuaXNQb3NpdGl2ZSgpP3RoaXMuZmxvb3IoKTp0aGlzLmNlaWwoKX0sTWkucHJvdG90eXBlLnNpZ251bT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oaT4wPzE6dGhpcy5faGk8MD8tMTp0aGlzLl9sbz4wPzE6dGhpcy5fbG88MD8tMTowfSxNaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbWksZGksZ2ldfSxNaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTWl9LE1pLnNxcj1mdW5jdGlvbih0KXtyZXR1cm4gTWkudmFsdWVPZih0KS5zZWxmTXVsdGlwbHkodCl9LE1pLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGFyZ3VtZW50c1swXT9NaS5wYXJzZShhcmd1bWVudHNbMF0pOiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdP25ldyBNaShhcmd1bWVudHNbMF0pOnZvaWQgMH0sTWkuc3FydD1mdW5jdGlvbih0KXtyZXR1cm4gTWkudmFsdWVPZih0KS5zcXJ0KCl9LE1pLnBhcnNlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGg7SWkuaXNXaGl0ZXNwYWNlKHQuY2hhckF0KGUpKTspZSsrO3ZhciByPSExO2lmKGU8bil7dmFyIGk9dC5jaGFyQXQoZSk7KCItIj09PWl8fCIrIj09PWkpJiYoZSsrLCItIj09PWkmJihyPSEwKSl9Zm9yKHZhciBvPW5ldyBNaSxzPTAsYT0wLHU9MDshKGU+PW4pOyl7dmFyIGM9dC5jaGFyQXQoZSk7aWYoZSsrLElpLmlzRGlnaXQoYykpe3ZhciBsPWMtIjAiO28uc2VsZk11bHRpcGx5KE1pLlRFTiksby5zZWxmQWRkKGwpLHMrK31lbHNle2lmKCIuIiE9PWMpe2lmKCJlIj09PWN8fCJFIj09PWMpe3ZhciBoPXQuc3Vic3RyaW5nKGUpO3RyeXt1PU5pLnBhcnNlSW50KGgpfWNhdGNoKGUpe3Rocm93IGUgaW5zdGFuY2VvZiBFcnJvcj9uZXcgRXJyb3IoIkludmFsaWQgZXhwb25lbnQgIitoKyIgaW4gc3RyaW5nICIrdCk6ZX1icmVha310aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICciK2MrIicgYXQgcG9zaXRpb24gIitlKyIgaW4gc3RyaW5nICIrdCl9YT1zfX12YXIgZj1vLHA9cy1hLXU7aWYoMD09PXApZj1vO2Vsc2UgaWYocD4wKXt2YXIgZD1NaS5URU4ucG93KHApO2Y9by5kaXZpZGUoZCl9ZWxzZSBpZihwPDApe3ZhciBnPU1pLlRFTi5wb3coLXApO2Y9by5tdWx0aXBseShnKX1yZXR1cm4gcj9mLm5lZ2F0ZSgpOmZ9LE1pLmNyZWF0ZU5hTj1mdW5jdGlvbigpe3JldHVybiBuZXcgTWkoZmkuTmFOLGZpLk5hTil9LE1pLmNvcHk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBNaSh0KX0sTWkubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguYWJzKHQpLG49TWF0aC5sb2coZSkvTWF0aC5sb2coMTApLHI9TWF0aC50cnVuYyhNYXRoLmZsb29yKG4pKTtyZXR1cm4gMTAqTWF0aC5wb3coMTAscik8PWUmJihyKz0xKSxyfSxNaS5zdHJpbmdPZkNoYXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IEFpLHI9MDtyPGU7cisrKW4uYXBwZW5kKHQpO3JldHVybiBuLnRvU3RyaW5nKCl9LEZpLlBJLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgTWkoMy4xNDE1OTI2NTM1ODk3OTMsMTIyNDY0Njc5OTE0NzM1MzJlLTMyKX0sRmkuVFdPX1BJLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgTWkoNi4yODMxODUzMDcxNzk1ODYsMjQ0OTI5MzU5ODI5NDcwNjRlLTMyKX0sRmkuUElfMi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE1pKDEuNTcwNzk2MzI2Nzk0ODk2Niw2MTIzMjMzOTk1NzM2NzY2ZS0zMil9LEZpLkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaSgyLjcxODI4MTgyODQ1OTA0NSwxNDQ1NjQ2ODkxNzI5MjUwMmUtMzIpfSxGaS5OYU4uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaShmaS5OYU4sZmkuTmFOKX0sRmkuRVBTLmdldD1mdW5jdGlvbigpe3JldHVybiAxMjMyNTk1MTY0NDA3ODNlLTQ2fSxGaS5TUExJVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTM0MjE3NzI5fSxGaS5NQVhfUFJJTlRfRElHSVRTLmdldD1mdW5jdGlvbigpe3JldHVybiAzMn0sRmkuVEVOLmdldD1mdW5jdGlvbigpe3JldHVybiBNaS52YWx1ZU9mKDEwKX0sRmkuT05FLmdldD1mdW5jdGlvbigpe3JldHVybiBNaS52YWx1ZU9mKDEpfSxGaS5TQ0lfTk9UX0VYUE9ORU5UX0NIQVIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIkUifSxGaS5TQ0lfTk9UX1pFUk8uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIjAuMEUwIn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTWksRmkpO3ZhciBUaT1mdW5jdGlvbigpe30sT2k9e0RQX1NBRkVfRVBTSUxPTjp7Y29uZmlndXJhYmxlOiEwfX07VGkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFRpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBUaX0sVGkub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbih0LGUsbil7dmFyIHI9VGkub3JpZW50YXRpb25JbmRleEZpbHRlcih0LGUsbik7aWYocjw9MSlyZXR1cm4gcjt2YXIgaT1NaS52YWx1ZU9mKGUueCkuc2VsZkFkZCgtdC54KSxvPU1pLnZhbHVlT2YoZS55KS5zZWxmQWRkKC10LnkpLHM9TWkudmFsdWVPZihuLngpLnNlbGZBZGQoLWUueCksYT1NaS52YWx1ZU9mKG4ueSkuc2VsZkFkZCgtZS55KTtyZXR1cm4gaS5zZWxmTXVsdGlwbHkoYSkuc2VsZlN1YnRyYWN0KG8uc2VsZk11bHRpcGx5KHMpKS5zaWdudW0oKX0sVGkuc2lnbk9mRGV0MngyPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0Lm11bHRpcGx5KHIpLnNlbGZTdWJ0cmFjdChlLm11bHRpcGx5KG4pKS5zaWdudW0oKX0sVGkuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPU1pLnZhbHVlT2Yoci55KS5zZWxmU3VidHJhY3Qobi55KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZihlLngpLnNlbGZTdWJ0cmFjdCh0LngpKSxvPU1pLnZhbHVlT2Yoci54KS5zZWxmU3VidHJhY3Qobi54KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZihlLnkpLnNlbGZTdWJ0cmFjdCh0LnkpKSxzPWkuc3VidHJhY3QobyksYT1NaS52YWx1ZU9mKHIueCkuc2VsZlN1YnRyYWN0KG4ueCkuc2VsZk11bHRpcGx5KE1pLnZhbHVlT2YodC55KS5zZWxmU3VidHJhY3Qobi55KSksdT1NaS52YWx1ZU9mKHIueSkuc2VsZlN1YnRyYWN0KG4ueSkuc2VsZk11bHRpcGx5KE1pLnZhbHVlT2YodC54KS5zZWxmU3VidHJhY3Qobi54KSksYz1hLnN1YnRyYWN0KHUpLnNlbGZEaXZpZGUocykuZG91YmxlVmFsdWUoKSxsPU1pLnZhbHVlT2YodC54KS5zZWxmQWRkKE1pLnZhbHVlT2YoZS54KS5zZWxmU3VidHJhY3QodC54KS5zZWxmTXVsdGlwbHkoYykpLmRvdWJsZVZhbHVlKCksaD1NaS52YWx1ZU9mKGUueCkuc2VsZlN1YnRyYWN0KHQueCkuc2VsZk11bHRpcGx5KE1pLnZhbHVlT2YodC55KS5zZWxmU3VidHJhY3Qobi55KSksZj1NaS52YWx1ZU9mKGUueSkuc2VsZlN1YnRyYWN0KHQueSkuc2VsZk11bHRpcGx5KE1pLnZhbHVlT2YodC54KS5zZWxmU3VidHJhY3Qobi54KSkscD1oLnN1YnRyYWN0KGYpLnNlbGZEaXZpZGUocykuZG91YmxlVmFsdWUoKSxkPU1pLnZhbHVlT2Yobi55KS5zZWxmQWRkKE1pLnZhbHVlT2Yoci55KS5zZWxmU3VidHJhY3Qobi55KS5zZWxmTXVsdGlwbHkocCkpLmRvdWJsZVZhbHVlKCk7cmV0dXJuIG5ldyB2aShsLGQpfSxUaS5vcmllbnRhdGlvbkluZGV4RmlsdGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1udWxsLGk9KHQueC1uLngpKihlLnktbi55KSxvPSh0Lnktbi55KSooZS54LW4ueCkscz1pLW87aWYoaT4wKXtpZihvPD0wKXJldHVybiBUaS5zaWdudW0ocyk7cj1pK299ZWxzZXtpZighKGk8MCkpcmV0dXJuIFRpLnNpZ251bShzKTtpZihvPj0wKXJldHVybiBUaS5zaWdudW0ocyk7cj0taS1vfXZhciBhPVRpLkRQX1NBRkVfRVBTSUxPTipyO3JldHVybiBzPj1hfHwtcz49YT9UaS5zaWdudW0ocyk6Mn0sVGkuc2lnbnVtPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sT2kuRFBfU0FGRV9FUFNJTE9OLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS0xNX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVGksT2kpO3ZhciBMaT1mdW5jdGlvbigpe30sUGk9e1g6e2NvbmZpZ3VyYWJsZTohMH0sWTp7Y29uZmlndXJhYmxlOiEwfSxaOntjb25maWd1cmFibGU6ITB9LE06e2NvbmZpZ3VyYWJsZTohMH19O1BpLlguZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LFBpLlkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LFBpLlouZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LFBpLk0uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LExpLnByb3RvdHlwZS5zZXRPcmRpbmF0ZT1mdW5jdGlvbih0LGUsbil7fSxMaS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe30sTGkucHJvdG90eXBlLmdldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSl7fSxMaS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe30sTGkucHJvdG90eXBlLmdldENvb3JkaW5hdGVDb3B5PWZ1bmN0aW9uKHQpe30sTGkucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe30sTGkucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24odCl7fSxMaS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt9LExpLnByb3RvdHlwZS5leHBhbmRFbnZlbG9wZT1mdW5jdGlvbih0KXt9LExpLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7fSxMaS5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbih0KXt9LExpLnByb3RvdHlwZS50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbigpe30sTGkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2dpXX0sTGkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIExpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhMaSxQaSk7dmFyIFJpPWZ1bmN0aW9uKCl7fSxCaT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMsIlByb2plY3RpdmUgcG9pbnQgbm90IHJlcHJlc2VudGFibGUgb24gdGhlIENhcnRlc2lhbiBwbGFuZS4iKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oUmkpLGtpPWZ1bmN0aW9uKCl7fTtraS5hcnJheWNvcHk9ZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG89MCxzPWU7czxlK2k7cysrKW5bcitvXT10W3NdLG8rK30sa2kuZ2V0UHJvcGVydHk9ZnVuY3Rpb24odCl7cmV0dXJueyJsaW5lLnNlcGFyYXRvciI6IlxuIn1bdF19O3ZhciB6aT1mdW5jdGlvbiB0KCl7aWYodGhpcy54PW51bGwsdGhpcy55PW51bGwsdGhpcy53PW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy54PTAsdGhpcy55PTAsdGhpcy53PTE7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMueD1lLngsdGhpcy55PWUueSx0aGlzLnc9MX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLng9bix0aGlzLnk9cix0aGlzLnc9MX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0KXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07dGhpcy54PWkueSpvLnctby55Kmkudyx0aGlzLnk9by54Kmkudy1pLngqby53LHRoaXMudz1pLngqby55LW8ueCppLnl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV07dGhpcy54PXMueS1hLnksdGhpcy55PWEueC1zLngsdGhpcy53PXMueCphLnktYS54KnMueX19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHU9YXJndW1lbnRzWzBdLGM9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdO3RoaXMueD11LHRoaXMueT1jLHRoaXMudz1sfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBoPWFyZ3VtZW50c1swXSxmPWFyZ3VtZW50c1sxXSxwPWFyZ3VtZW50c1syXSxkPWFyZ3VtZW50c1szXSxnPWgueS1mLnkseT1mLngtaC54LG09aC54KmYueS1mLngqaC55LHY9cC55LWQueSxfPWQueC1wLngseD1wLngqZC55LWQueCpwLnk7dGhpcy54PXkqeC1fKm0sdGhpcy55PXYqbS1nKngsdGhpcy53PWcqXy12Knl9fTt6aS5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbigpe3ZhciB0PXRoaXMueS90aGlzLnc7aWYoZmkuaXNOYU4odCl8fGZpLmlzSW5maW5pdGUodCkpdGhyb3cgbmV3IEJpO3JldHVybiB0fSx6aS5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3ZhciB0PXRoaXMueC90aGlzLnc7aWYoZmkuaXNOYU4odCl8fGZpLmlzSW5maW5pdGUodCkpdGhyb3cgbmV3IEJpO3JldHVybiB0fSx6aS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyB2aTtyZXR1cm4gdC54PXRoaXMuZ2V0WCgpLHQueT10aGlzLmdldFkoKSx0fSx6aS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0semkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHppfSx6aS5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dC55LWUueSxvPWUueC10Lngscz10LngqZS55LWUueCp0LnksYT1uLnktci55LHU9ci54LW4ueCxjPW4ueCpyLnktci54Km4ueSxsPWkqdS1hKm8saD0obypjLXUqcykvbCxmPShhKnMtaSpjKS9sO2lmKGZpLmlzTmFOKGgpfHxmaS5pc0luZmluaXRlKGgpfHxmaS5pc05hTihmKXx8ZmkuaXNJbmZpbml0ZShmKSl0aHJvdyBuZXcgQmk7cmV0dXJuIG5ldyB2aShoLGYpfTt2YXIgamk9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX21pbng9bnVsbCx0aGlzLl9tYXh4PW51bGwsdGhpcy5fbWlueT1udWxsLHRoaXMuX21heHk9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLmluaXQoKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5pbml0KGUueCxlLngsZS55LGUueSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLmluaXQobil9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTt0aGlzLmluaXQoci54LGkueCxyLnksaS55KX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl0sdT1hcmd1bWVudHNbM107dGhpcy5pbml0KG8scyxhLHUpfX0sVWk9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O2ppLnByb3RvdHlwZS5nZXRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSp0aGlzLmdldEhlaWdodCgpfSxqaS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIGppKSlyZXR1cm4hMTt2YXIgZT10O3JldHVybiB0aGlzLmlzTnVsbCgpP2UuaXNOdWxsKCk6dGhpcy5fbWF4eD09PWUuZ2V0TWF4WCgpJiZ0aGlzLl9tYXh5PT09ZS5nZXRNYXhZKCkmJnRoaXMuX21pbng9PT1lLmdldE1pblgoKSYmdGhpcy5fbWlueT09PWUuZ2V0TWluWSgpfSxqaS5wcm90b3R5cGUuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNOdWxsKCl8fHQuaXNOdWxsKCl8fCF0aGlzLmludGVyc2VjdHModCkpcmV0dXJuIG5ldyBqaTt2YXIgZT10aGlzLl9taW54PnQuX21pbng/dGhpcy5fbWlueDp0Ll9taW54LG49dGhpcy5fbWlueT50Ll9taW55P3RoaXMuX21pbnk6dC5fbWlueSxyPXRoaXMuX21heHg8dC5fbWF4eD90aGlzLl9tYXh4OnQuX21heHgsaT10aGlzLl9tYXh5PHQuX21heHk/dGhpcy5fbWF4eTp0Ll9tYXh5O3JldHVybiBuZXcgamkoZSxyLG4saSl9LGppLnByb3RvdHlwZS5pc051bGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4eDx0aGlzLl9taW54fSxqaS5wcm90b3R5cGUuZ2V0TWF4WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh4fSxqaS5wcm90b3R5cGUuY292ZXJzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jb3ZlcnModC54LHQueSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBqaSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiF0aGlzLmlzTnVsbCgpJiYhZS5pc051bGwoKSYmKGUuZ2V0TWluWCgpPj10aGlzLl9taW54JiZlLmdldE1heFgoKTw9dGhpcy5fbWF4eCYmZS5nZXRNaW5ZKCk+PXRoaXMuX21pbnkmJmUuZ2V0TWF4WSgpPD10aGlzLl9tYXh5KX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3JldHVybiF0aGlzLmlzTnVsbCgpJiYobj49dGhpcy5fbWlueCYmbjw9dGhpcy5fbWF4eCYmcj49dGhpcy5fbWlueSYmcjw9dGhpcy5fbWF4eSl9fSxqaS5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGppKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIXRoaXMuaXNOdWxsKCkmJiF0LmlzTnVsbCgpJiYhKHQuX21pbng+dGhpcy5fbWF4eHx8dC5fbWF4eDx0aGlzLl9taW54fHx0Ll9taW55PnRoaXMuX21heHl8fHQuX21heHk8dGhpcy5fbWlueSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmludGVyc2VjdHMoZS54LGUueSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4hdGhpcy5pc051bGwoKSYmIShuPnRoaXMuX21heHh8fG48dGhpcy5fbWlueHx8cj50aGlzLl9tYXh5fHxyPHRoaXMuX21pbnkpfX0samkucHJvdG90eXBlLmdldE1pblk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWlueX0samkucHJvdG90eXBlLmdldE1pblg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWlueH0samkucHJvdG90eXBlLmV4cGFuZFRvSW5jbHVkZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5leHBhbmRUb0luY2x1ZGUodC54LHQueSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGppKXt2YXIgZT1hcmd1bWVudHNbMF07aWYoZS5pc051bGwoKSlyZXR1cm4gbnVsbDt0aGlzLmlzTnVsbCgpPyh0aGlzLl9taW54PWUuZ2V0TWluWCgpLHRoaXMuX21heHg9ZS5nZXRNYXhYKCksdGhpcy5fbWlueT1lLmdldE1pblkoKSx0aGlzLl9tYXh5PWUuZ2V0TWF4WSgpKTooZS5fbWlueDx0aGlzLl9taW54JiYodGhpcy5fbWlueD1lLl9taW54KSxlLl9tYXh4PnRoaXMuX21heHgmJih0aGlzLl9tYXh4PWUuX21heHgpLGUuX21pbnk8dGhpcy5fbWlueSYmKHRoaXMuX21pbnk9ZS5fbWlueSksZS5fbWF4eT50aGlzLl9tYXh5JiYodGhpcy5fbWF4eT1lLl9tYXh5KSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLmlzTnVsbCgpPyh0aGlzLl9taW54PW4sdGhpcy5fbWF4eD1uLHRoaXMuX21pbnk9cix0aGlzLl9tYXh5PXIpOihuPHRoaXMuX21pbngmJih0aGlzLl9taW54PW4pLG4+dGhpcy5fbWF4eCYmKHRoaXMuX21heHg9bikscjx0aGlzLl9taW55JiYodGhpcy5fbWlueT1yKSxyPnRoaXMuX21heHkmJih0aGlzLl9tYXh5PXIpKX19LGppLnByb3RvdHlwZS5taW5FeHRlbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTnVsbCgpKXJldHVybiAwO3ZhciB0PXRoaXMuZ2V0V2lkdGgoKSxlPXRoaXMuZ2V0SGVpZ2h0KCk7cmV0dXJuIHQ8ZT90OmV9LGppLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTnVsbCgpPzA6dGhpcy5fbWF4eC10aGlzLl9taW54fSxqaS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuaXNOdWxsKCk/ZS5pc051bGwoKT8wOi0xOmUuaXNOdWxsKCk/MTp0aGlzLl9taW54PGUuX21pbng/LTE6dGhpcy5fbWlueD5lLl9taW54PzE6dGhpcy5fbWlueTxlLl9taW55Py0xOnRoaXMuX21pbnk+ZS5fbWlueT8xOnRoaXMuX21heHg8ZS5fbWF4eD8tMTp0aGlzLl9tYXh4PmUuX21heHg/MTp0aGlzLl9tYXh5PGUuX21heHk/LTE6dGhpcy5fbWF4eT5lLl9tYXh5PzE6MH0samkucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuaXNOdWxsKCkpcmV0dXJuIG51bGw7dGhpcy5pbml0KHRoaXMuZ2V0TWluWCgpK3QsdGhpcy5nZXRNYXhYKCkrdCx0aGlzLmdldE1pblkoKStlLHRoaXMuZ2V0TWF4WSgpK2UpfSxqaS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iRW52WyIrdGhpcy5fbWlueCsiIDogIit0aGlzLl9tYXh4KyIsICIrdGhpcy5fbWlueSsiIDogIit0aGlzLl9tYXh5KyJdIn0samkucHJvdG90eXBlLnNldFRvTnVsbD1mdW5jdGlvbigpe3RoaXMuX21pbng9MCx0aGlzLl9tYXh4PS0xLHRoaXMuX21pbnk9MCx0aGlzLl9tYXh5PS0xfSxqaS5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/MDp0aGlzLl9tYXh5LXRoaXMuX21pbnl9LGppLnByb3RvdHlwZS5tYXhFeHRlbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTnVsbCgpKXJldHVybiAwO3ZhciB0PXRoaXMuZ2V0V2lkdGgoKSxlPXRoaXMuZ2V0SGVpZ2h0KCk7cmV0dXJuIHQ+ZT90OmV9LGppLnByb3RvdHlwZS5leHBhbmRCeT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5leHBhbmRCeSh0LHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLmlzTnVsbCgpKXJldHVybiBudWxsO3RoaXMuX21pbngtPWUsdGhpcy5fbWF4eCs9ZSx0aGlzLl9taW55LT1uLHRoaXMuX21heHkrPW4sKHRoaXMuX21pbng+dGhpcy5fbWF4eHx8dGhpcy5fbWlueT50aGlzLl9tYXh5KSYmdGhpcy5zZXRUb051bGwoKX19LGppLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGppKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY292ZXJzKHQpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jb3ZlcnMoZSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5jb3ZlcnMobixyKX19LGppLnByb3RvdHlwZS5jZW50cmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc051bGwoKT9udWxsOm5ldyB2aSgodGhpcy5nZXRNaW5YKCkrdGhpcy5nZXRNYXhYKCkpLzIsKHRoaXMuZ2V0TWluWSgpK3RoaXMuZ2V0TWF4WSgpKS8yKX0samkucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnNldFRvTnVsbCgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmluaXQodC54LHQueCx0LnksdC55KX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygamkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9taW54PWUuX21pbngsdGhpcy5fbWF4eD1lLl9tYXh4LHRoaXMuX21pbnk9ZS5fbWlueSx0aGlzLl9tYXh5PWUuX21heHl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLmluaXQobi54LHIueCxuLnksci55KX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM107aTxvPyh0aGlzLl9taW54PWksdGhpcy5fbWF4eD1vKToodGhpcy5fbWlueD1vLHRoaXMuX21heHg9aSksczxhPyh0aGlzLl9taW55PXMsdGhpcy5fbWF4eT1hKToodGhpcy5fbWlueT1hLHRoaXMuX21heHk9cyl9fSxqaS5wcm90b3R5cGUuZ2V0TWF4WT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh5fSxqaS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7aWYodGhpcy5pbnRlcnNlY3RzKHQpKXJldHVybiAwO3ZhciBlPTA7dGhpcy5fbWF4eDx0Ll9taW54P2U9dC5fbWlueC10aGlzLl9tYXh4OnRoaXMuX21pbng+dC5fbWF4eCYmKGU9dGhpcy5fbWlueC10Ll9tYXh4KTt2YXIgbj0wO3JldHVybiB0aGlzLl9tYXh5PHQuX21pbnk/bj10Ll9taW55LXRoaXMuX21heHk6dGhpcy5fbWlueT50Ll9tYXh5JiYobj10aGlzLl9taW55LXQuX21heHkpLDA9PT1lP246MD09PW4/ZTpNYXRoLnNxcnQoZSplK24qbil9LGppLnByb3RvdHlwZS5oYXNoQ29kZT1mdW5jdGlvbigpe3ZhciB0PTE3O3JldHVybiB0PTM3Kih0PTM3Kih0PTM3Kih0PTM3KnQrdmkuaGFzaENvZGUodGhpcy5fbWlueCkpK3ZpLmhhc2hDb2RlKHRoaXMuX21heHgpKSt2aS5oYXNoQ29kZSh0aGlzLl9taW55KSkrdmkuaGFzaENvZGUodGhpcy5fbWF4eSl9LGppLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaSxtaV19LGppLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBqaX0samkuaW50ZXJzZWN0cz1mdW5jdGlvbigpe2lmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07cmV0dXJuIG4ueD49KHQueDxlLng/dC54OmUueCkmJm4ueDw9KHQueD5lLng/dC54OmUueCkmJm4ueT49KHQueTxlLnk/dC55OmUueSkmJm4ueTw9KHQueT5lLnk/dC55OmUueSl9aWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXSxzPWFyZ3VtZW50c1szXSxhPU1hdGgubWluKG8ueCxzLngpLHU9TWF0aC5tYXgoby54LHMueCksYz1NYXRoLm1pbihyLngsaS54KSxsPU1hdGgubWF4KHIueCxpLngpO3JldHVybiEoYz51fHxsPGF8fChhPU1hdGgubWluKG8ueSxzLnkpLHU9TWF0aC5tYXgoby55LHMueSksYz1NYXRoLm1pbihyLnksaS55KSxsPU1hdGgubWF4KHIueSxpLnkpLGM+dSl8fGw8YSl9fSxVaS5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDUxODQ1Y2Q1NTIxODk4MDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGppLFVpKTt2YXIgcWk9e3R5cGVTdHI6L15ccyooXHcrKVxzKlwoXHMqKC4qKVxzKlwpXHMqJC8sZW1wdHlUeXBlU3RyOi9eXHMqKFx3KylccypFTVBUWVxzKiQvLHNwYWNlczovXHMrLyxwYXJlbkNvbW1hOi9cKVxzKixccypcKC8sZG91YmxlUGFyZW5Db21tYTovXClccypcKVxzKixccypcKFxzKlwoLyx0cmltUGFyZW5zOi9eXHMqXCg/KC4qPylcKT9ccyokL30sVmk9ZnVuY3Rpb24odCl7dGhpcy5nZW9tZXRyeUZhY3Rvcnk9dHx8bmV3IElzfTtWaS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXt2YXIgZSxuLHI7dD10LnJlcGxhY2UoL1tcblxyXS9nLCIgIik7dmFyIGk9cWkudHlwZVN0ci5leGVjKHQpO2lmKC0xIT09dC5zZWFyY2goIkVNUFRZIikmJigoaT1xaS5lbXB0eVR5cGVTdHIuZXhlYyh0KSlbMl09dm9pZCAwKSxpJiYobj1pWzFdLnRvTG93ZXJDYXNlKCkscj1pWzJdLFlpW25dJiYoZT1ZaVtuXS5hcHBseSh0aGlzLFtyXSkpKSx2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IHBhcnNlIFdLVCAiK3QpO3JldHVybiBlfSxWaS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZXh0cmFjdEdlb21ldHJ5KHQpfSxWaS5wcm90b3R5cGUuZXh0cmFjdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0R2VvbWV0cnlUeXBlKCkudG9Mb3dlckNhc2UoKTtpZighR2lbZV0pcmV0dXJuIG51bGw7dmFyIG49ZS50b1VwcGVyQ2FzZSgpO3JldHVybiB0LmlzRW1wdHkoKT9uKyIgRU1QVFkiOm4rIigiK0dpW2VdLmFwcGx5KHRoaXMsW3RdKSsiKSJ9O3ZhciBHaT17Y29vcmRpbmF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC54KyIgIit0Lnl9LHBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiBHaS5jb29yZGluYXRlLmNhbGwodGhpcyx0Ll9jb29yZGluYXRlcy5fY29vcmRpbmF0ZXNbMF0pfSxtdWx0aXBvaW50OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9nZW9tZXRyaWVzLmxlbmd0aDtuPHI7KytuKWUucHVzaCgiKCIrR2kucG9pbnQuYXBwbHkodGhpcyxbdC5fZ2VvbWV0cmllc1tuXV0pKyIpIik7cmV0dXJuIGUuam9pbigiLCIpfSxsaW5lc3RyaW5nOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9wb2ludHMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtuPHI7KytuKWUucHVzaChHaS5jb29yZGluYXRlLmFwcGx5KHRoaXMsW3QuX3BvaW50cy5fY29vcmRpbmF0ZXNbbl1dKSk7cmV0dXJuIGUuam9pbigiLCIpfSxsaW5lYXJyaW5nOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9wb2ludHMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtuPHI7KytuKWUucHVzaChHaS5jb29yZGluYXRlLmFwcGx5KHRoaXMsW3QuX3BvaW50cy5fY29vcmRpbmF0ZXNbbl1dKSk7cmV0dXJuIGUuam9pbigiLCIpfSxtdWx0aWxpbmVzdHJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX2dlb21ldHJpZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKCIoIitHaS5saW5lc3RyaW5nLmFwcGx5KHRoaXMsW3QuX2dlb21ldHJpZXNbbl1dKSsiKSIpO3JldHVybiBlLmpvaW4oIiwiKX0scG9seWdvbjpmdW5jdGlvbih0KXt2YXIgZT1bXTtlLnB1c2goIigiK0dpLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbdC5fc2hlbGxdKSsiKSIpO2Zvcih2YXIgbj0wLHI9dC5faG9sZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKCIoIitHaS5saW5lc3RyaW5nLmFwcGx5KHRoaXMsW3QuX2hvbGVzW25dXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LG11bHRpcG9seWdvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fZ2VvbWV0cmllcy5sZW5ndGg7bjxyOysrbillLnB1c2goIigiK0dpLnBvbHlnb24uYXBwbHkodGhpcyxbdC5fZ2VvbWV0cmllc1tuXV0pKyIpIik7cmV0dXJuIGUuam9pbigiLCIpfSxnZW9tZXRyeWNvbGxlY3Rpb246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX2dlb21ldHJpZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKHRoaXMuZXh0cmFjdEdlb21ldHJ5KHQuX2dlb21ldHJpZXNbbl0pKTtyZXR1cm4gZS5qb2luKCIsIil9fSxZaT17cG9pbnQ6ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlUG9pbnQoKTt2YXIgZT10LnRyaW0oKS5zcGxpdChxaS5zcGFjZXMpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2ludChuZXcgdmkoTnVtYmVyLnBhcnNlRmxvYXQoZVswXSksTnVtYmVyLnBhcnNlRmxvYXQoZVsxXSkpKX0sbXVsdGlwb2ludDpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aVBvaW50KCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnJlcGxhY2UocWkudHJpbVBhcmVucywiJDEiKSxyLnB1c2goWWkucG9pbnQuYXBwbHkodGhpcyxbZV0pKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlQb2ludChyKX0sbGluZXN0cmluZzpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnRyaW0oKS5zcGxpdChxaS5zcGFjZXMpLHIucHVzaChuZXcgdmkoTnVtYmVyLnBhcnNlRmxvYXQoZVswXSksTnVtYmVyLnBhcnNlRmxvYXQoZVsxXSkpKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZVN0cmluZyhyKX0sbGluZWFycmluZzpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnRyaW0oKS5zcGxpdChxaS5zcGFjZXMpLHIucHVzaChuZXcgdmkoTnVtYmVyLnBhcnNlRmxvYXQoZVswXSksTnVtYmVyLnBhcnNlRmxvYXQoZVsxXSkpKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhyKX0sbXVsdGlsaW5lc3RyaW5nOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpTGluZVN0cmluZygpO2Zvcih2YXIgZSxuPXQudHJpbSgpLnNwbGl0KHFpLnBhcmVuQ29tbWEpLHI9W10saT0wLG89bi5sZW5ndGg7aTxvOysraSllPW5baV0ucmVwbGFjZShxaS50cmltUGFyZW5zLCIkMSIpLHIucHVzaChZaS5saW5lc3RyaW5nLmFwcGx5KHRoaXMsW2VdKSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpTGluZVN0cmluZyhyKX0scG9seWdvbjpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2x5Z29uKCk7Zm9yKHZhciBlLG4scixpLG89dC50cmltKCkuc3BsaXQocWkucGFyZW5Db21tYSkscz1bXSxhPTAsdT1vLmxlbmd0aDthPHU7KythKWU9b1thXS5yZXBsYWNlKHFpLnRyaW1QYXJlbnMsIiQxIiksbj1ZaS5saW5lc3RyaW5nLmFwcGx5KHRoaXMsW2VdKSxyPXRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcobi5fcG9pbnRzKSwwPT09YT9pPXI6cy5wdXNoKHIpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2x5Z29uKGkscyl9LG11bHRpcG9seWdvbjpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aVBvbHlnb24oKTtmb3IodmFyIGUsbj10LnRyaW0oKS5zcGxpdChxaS5kb3VibGVQYXJlbkNvbW1hKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnJlcGxhY2UocWkudHJpbVBhcmVucywiJDEiKSxyLnB1c2goWWkucG9seWdvbi5hcHBseSh0aGlzLFtlXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aVBvbHlnb24ocil9LGdlb21ldHJ5Y29sbGVjdGlvbjpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oKTtmb3IodmFyIGU9KHQ9dC5yZXBsYWNlKC8sXHMqKFtBLVphLXpdKS9nLCJ8JDEiKSkudHJpbSgpLnNwbGl0KCJ8Iiksbj1bXSxyPTAsaT1lLmxlbmd0aDtyPGk7KytyKW4ucHVzaCh0aGlzLnJlYWQoZVtyXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obil9fSxYaT1mdW5jdGlvbih0KXt0aGlzLnBhcnNlcj1uZXcgVmkodCl9O1hpLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJzZXIud3JpdGUodCl9LFhpLnRvTGluZVN0cmluZz1mdW5jdGlvbih0LGUpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIik7cmV0dXJuIkxJTkVTVFJJTkcgKCAiK3QueCsiICIrdC55KyIsICIrZS54KyIgIitlLnkrIiApIn07dmFyIFdpPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMsZSksdGhpcy5uYW1lPSJSdW50aW1lRXhjZXB0aW9uIix0aGlzLm1lc3NhZ2U9ZSx0aGlzLnN0YWNrPShuZXcgdCkuc3RhY2t9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEVycm9yKSxIaT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7aWYodC5jYWxsKHRoaXMpLDA9PT1hcmd1bWVudHMubGVuZ3RoKXQuY2FsbCh0aGlzKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dC5jYWxsKHRoaXMsZSl9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShXaSksWmk9ZnVuY3Rpb24oKXt9O1ppLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxaaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWml9LFppLnNob3VsZE5ldmVyUmVhY2hIZXJlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpWmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUobnVsbCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3Rocm93IG5ldyBIaSgiU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUiKyhudWxsIT09dD8iOiAiK3Q6IiIpKX19LFppLmlzVHJ1ZT1mdW5jdGlvbigpe3ZhciB0O2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKVppLmlzVHJ1ZShhcmd1bWVudHNbMF0sbnVsbCk7ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmKHQ9YXJndW1lbnRzWzFdLCFhcmd1bWVudHNbMF0pKXRocm93IG51bGw9PT10P25ldyBIaTpuZXcgSGkodCl9LFppLmVxdWFscz1mdW5jdGlvbigpe3ZhciB0LGUsbjtpZigyPT09YXJndW1lbnRzLmxlbmd0aClaaS5lcXVhbHModD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbnVsbCk7ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCYmKHQ9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzJdLCEoZT1hcmd1bWVudHNbMV0pLmVxdWFscyh0KSkpdGhyb3cgbmV3IEhpKCJFeHBlY3RlZCAiK3QrIiBidXQgZW5jb3VudGVyZWQgIitlKyhudWxsIT09bj8iOiAiK246IiIpKX07dmFyIEtpPWZ1bmN0aW9uKCl7dGhpcy5fcmVzdWx0PW51bGwsdGhpcy5faW5wdXRMaW5lcz1BcnJheSgyKS5maWxsKCkubWFwKChmdW5jdGlvbigpe3JldHVybiBBcnJheSgyKX0pKSx0aGlzLl9pbnRQdD1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9pbnRMaW5lSW5kZXg9bnVsbCx0aGlzLl9pc1Byb3Blcj1udWxsLHRoaXMuX3BhPW51bGwsdGhpcy5fcGI9bnVsbCx0aGlzLl9wcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX2ludFB0WzBdPW5ldyB2aSx0aGlzLl9pbnRQdFsxXT1uZXcgdmksdGhpcy5fcGE9dGhpcy5faW50UHRbMF0sdGhpcy5fcGI9dGhpcy5faW50UHRbMV0sdGhpcy5fcmVzdWx0PTB9LEppPXtET05UX0lOVEVSU0VDVDp7Y29uZmlndXJhYmxlOiEwfSxET19JTlRFUlNFQ1Q6e2NvbmZpZ3VyYWJsZTohMH0sQ09MTElORUFSOntjb25maWd1cmFibGU6ITB9LE5PX0lOVEVSU0VDVElPTjp7Y29uZmlndXJhYmxlOiEwfSxQT0lOVF9JTlRFUlNFQ1RJT046e2NvbmZpZ3VyYWJsZTohMH0sQ09MTElORUFSX0lOVEVSU0VDVElPTjp7Y29uZmlndXJhYmxlOiEwfX07S2kucHJvdG90eXBlLmdldEluZGV4QWxvbmdTZWdtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29tcHV0ZUludExpbmVJbmRleCgpLHRoaXMuX2ludExpbmVJbmRleFt0XVtlXX0sS2kucHJvdG90eXBlLmdldFRvcG9sb2d5U3VtbWFyeT1mdW5jdGlvbigpe3ZhciB0PW5ldyBBaTtyZXR1cm4gdGhpcy5pc0VuZFBvaW50KCkmJnQuYXBwZW5kKCIgZW5kcG9pbnQiKSx0aGlzLl9pc1Byb3BlciYmdC5hcHBlbmQoIiBwcm9wZXIiKSx0aGlzLmlzQ29sbGluZWFyKCkmJnQuYXBwZW5kKCIgY29sbGluZWFyIiksdC50b1N0cmluZygpfSxLaS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXt0aGlzLl9pbnB1dExpbmVzWzBdWzBdPXQsdGhpcy5faW5wdXRMaW5lc1swXVsxXT1lLHRoaXMuX2lucHV0TGluZXNbMV1bMF09bix0aGlzLl9pbnB1dExpbmVzWzFdWzFdPXIsdGhpcy5fcmVzdWx0PXRoaXMuY29tcHV0ZUludGVyc2VjdCh0LGUsbixyKX0sS2kucHJvdG90eXBlLmdldEludGVyc2VjdGlvbk51bT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXN1bHR9LEtpLnByb3RvdHlwZS5jb21wdXRlSW50TGluZUluZGV4PWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpbnVsbD09PXRoaXMuX2ludExpbmVJbmRleCYmKHRoaXMuX2ludExpbmVJbmRleD1BcnJheSgyKS5maWxsKCkubWFwKChmdW5jdGlvbigpe3JldHVybiBBcnJheSgyKX0pKSx0aGlzLmNvbXB1dGVJbnRMaW5lSW5kZXgoMCksdGhpcy5jb21wdXRlSW50TGluZUluZGV4KDEpKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5nZXRFZGdlRGlzdGFuY2UodCwwKT50aGlzLmdldEVkZ2VEaXN0YW5jZSh0LDEpPyh0aGlzLl9pbnRMaW5lSW5kZXhbdF1bMF09MCx0aGlzLl9pbnRMaW5lSW5kZXhbdF1bMV09MSk6KHRoaXMuX2ludExpbmVJbmRleFt0XVswXT0xLHRoaXMuX2ludExpbmVJbmRleFt0XVsxXT0wKX19LEtpLnByb3RvdHlwZS5pc1Byb3Blcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc0ludGVyc2VjdGlvbigpJiZ0aGlzLl9pc1Byb3Blcn0sS2kucHJvdG90eXBlLnNldFByZWNpc2lvbk1vZGVsPWZ1bmN0aW9uKHQpe3RoaXMuX3ByZWNpc2lvbk1vZGVsPXR9LEtpLnByb3RvdHlwZS5pc0ludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4hKCF0aGlzLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oMCkmJiF0aGlzLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oMSkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MDtuPHRoaXMuX3Jlc3VsdDtuKyspaWYoIXQuX2ludFB0W25dLmVxdWFsczJEKHQuX2lucHV0TGluZXNbZV1bMF0pJiYhdC5faW50UHRbbl0uZXF1YWxzMkQodC5faW5wdXRMaW5lc1tlXVsxXSkpcmV0dXJuITA7cmV0dXJuITF9fSxLaS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbnRQdFt0XX0sS2kucHJvdG90eXBlLmlzRW5kUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNJbnRlcnNlY3Rpb24oKSYmIXRoaXMuX2lzUHJvcGVyfSxLaS5wcm90b3R5cGUuaGFzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdCE9PUtpLk5PX0lOVEVSU0VDVElPTn0sS2kucHJvdG90eXBlLmdldEVkZ2VEaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBLaS5jb21wdXRlRWRnZURpc3RhbmNlKHRoaXMuX2ludFB0W2VdLHRoaXMuX2lucHV0TGluZXNbdF1bMF0sdGhpcy5faW5wdXRMaW5lc1t0XVsxXSl9LEtpLnByb3RvdHlwZS5pc0NvbGxpbmVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXN1bHQ9PT1LaS5DT0xMSU5FQVJfSU5URVJTRUNUSU9OfSxLaS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWGkudG9MaW5lU3RyaW5nKHRoaXMuX2lucHV0TGluZXNbMF1bMF0sdGhpcy5faW5wdXRMaW5lc1swXVsxXSkrIiAtICIrWGkudG9MaW5lU3RyaW5nKHRoaXMuX2lucHV0TGluZXNbMV1bMF0sdGhpcy5faW5wdXRMaW5lc1sxXVsxXSkrdGhpcy5nZXRUb3BvbG9neVN1bW1hcnkoKX0sS2kucHJvdG90eXBlLmdldEVuZHBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2lucHV0TGluZXNbdF1bZV19LEtpLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX3Jlc3VsdDtlKyspaWYodGhpcy5faW50UHRbZV0uZXF1YWxzMkQodCkpcmV0dXJuITA7cmV0dXJuITF9LEtpLnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25BbG9uZ1NlZ21lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb21wdXRlSW50TGluZUluZGV4KCksdGhpcy5faW50UHRbdGhpcy5faW50TGluZUluZGV4W3RdW2VdXX0sS2kucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEtpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBLaX0sS2kuY29tcHV0ZUVkZ2VEaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9TWF0aC5hYnMobi54LWUueCksaT1NYXRoLmFicyhuLnktZS55KSxvPS0xO2lmKHQuZXF1YWxzKGUpKW89MDtlbHNlIGlmKHQuZXF1YWxzKG4pKW89cj5pP3I6aTtlbHNle3ZhciBzPU1hdGguYWJzKHQueC1lLngpLGE9TWF0aC5hYnModC55LWUueSk7MD09PShvPXI+aT9zOmEpJiYhdC5lcXVhbHMoZSkmJihvPU1hdGgubWF4KHMsYSkpfXJldHVybiBaaS5pc1RydWUoISgwPT09byYmIXQuZXF1YWxzKGUpKSwiQmFkIGRpc3RhbmNlIGNhbGN1bGF0aW9uIiksb30sS2kubm9uUm9idXN0Q29tcHV0ZUVkZ2VEaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC54LWUueCxpPXQueS1lLnksbz1NYXRoLnNxcnQocipyK2kqaSk7cmV0dXJuIFppLmlzVHJ1ZSghKDA9PT1vJiYhdC5lcXVhbHMoZSkpLCJJbnZhbGlkIGRpc3RhbmNlIGNhbGN1bGF0aW9uIiksb30sSmkuRE9OVF9JTlRFUlNFQ1QuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LEppLkRPX0lOVEVSU0VDVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sSmkuQ09MTElORUFSLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxKaS5OT19JTlRFUlNFQ1RJT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LEppLlBPSU5UX0lOVEVSU0VDVElPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sSmkuQ09MTElORUFSX0lOVEVSU0VDVElPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoS2ksSmkpO3ZhciBRaT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzSW5TZWdtZW50RW52ZWxvcGVzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBqaSh0aGlzLl9pbnB1dExpbmVzWzBdWzBdLHRoaXMuX2lucHV0TGluZXNbMF1bMV0pLG49bmV3IGppKHRoaXMuX2lucHV0TGluZXNbMV1bMF0sdGhpcy5faW5wdXRMaW5lc1sxXVsxXSk7cmV0dXJuIGUuY29udGFpbnModCkmJm4uY29udGFpbnModCl9LGUucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtpZigzIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKHRoaXMuX2lzUHJvcGVyPSExLGppLmludGVyc2VjdHMobixyLGUpJiYwPT09ZW8ub3JpZW50YXRpb25JbmRleChuLHIsZSkmJjA9PT1lby5vcmllbnRhdGlvbkluZGV4KHIsbixlKSlyZXR1cm4gdGhpcy5faXNQcm9wZXI9ITAsKGUuZXF1YWxzKG4pfHxlLmVxdWFscyhyKSkmJih0aGlzLl9pc1Byb3Blcj0hMSksdGhpcy5fcmVzdWx0PXQuUE9JTlRfSU5URVJTRUNUSU9OLG51bGw7dGhpcy5fcmVzdWx0PXQuTk9fSU5URVJTRUNUSU9OfSxlLnByb3RvdHlwZS5ub3JtYWxpemVUb01pbmltdW09ZnVuY3Rpb24odCxlLG4scixpKXtpLng9dGhpcy5zbWFsbGVzdEluQWJzVmFsdWUodC54LGUueCxuLngsci54KSxpLnk9dGhpcy5zbWFsbGVzdEluQWJzVmFsdWUodC55LGUueSxuLnksci55KSx0LngtPWkueCx0LnktPWkueSxlLngtPWkueCxlLnktPWkueSxuLngtPWkueCxuLnktPWkueSxyLngtPWkueCxyLnktPWkueX0sZS5wcm90b3R5cGUuc2FmZUhDb29yZGluYXRlSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPW51bGw7dHJ5e289emkuaW50ZXJzZWN0aW9uKHQsbixyLGkpfWNhdGNoKHMpe2lmKCEocyBpbnN0YW5jZW9mIEJpKSl0aHJvdyBzO289ZS5uZWFyZXN0RW5kcG9pbnQodCxuLHIsaSl9cmV0dXJuIG99LGUucHJvdG90eXBlLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LG4scixpKXt2YXIgbz10aGlzLmludGVyc2VjdGlvbldpdGhOb3JtYWxpemF0aW9uKHQsbixyLGkpO3JldHVybiB0aGlzLmlzSW5TZWdtZW50RW52ZWxvcGVzKG8pfHwobz1uZXcgdmkoZS5uZWFyZXN0RW5kcG9pbnQodCxuLHIsaSkpKSxudWxsIT09dGhpcy5fcHJlY2lzaW9uTW9kZWwmJnRoaXMuX3ByZWNpc2lvbk1vZGVsLm1ha2VQcmVjaXNlKG8pLG99LGUucHJvdG90eXBlLnNtYWxsZXN0SW5BYnNWYWx1ZT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LG89TWF0aC5hYnMoaSk7cmV0dXJuIE1hdGguYWJzKGUpPG8mJihpPWUsbz1NYXRoLmFicyhlKSksTWF0aC5hYnMobik8byYmKGk9bixvPU1hdGguYWJzKG4pKSxNYXRoLmFicyhyKTxvJiYoaT1yKSxpfSxlLnByb3RvdHlwZS5jaGVja0REPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89VGkuaW50ZXJzZWN0aW9uKHQsZSxuLHIpLHM9dGhpcy5pc0luU2VnbWVudEVudmVsb3BlcyhvKTtraS5vdXQucHJpbnRsbigiREQgaW4gZW52ID0gIitzKyIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAiK28pLGkuZGlzdGFuY2Uobyk+MWUtNCYma2kub3V0LnByaW50bG4oIkRpc3RhbmNlID0gIitpLmRpc3RhbmNlKG8pKX0sZS5wcm90b3R5cGUuaW50ZXJzZWN0aW9uV2l0aE5vcm1hbGl6YXRpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bmV3IHZpKHQpLG89bmV3IHZpKGUpLHM9bmV3IHZpKG4pLGE9bmV3IHZpKHIpLHU9bmV3IHZpO3RoaXMubm9ybWFsaXplVG9FbnZDZW50cmUoaSxvLHMsYSx1KTt2YXIgYz10aGlzLnNhZmVIQ29vcmRpbmF0ZUludGVyc2VjdGlvbihpLG8scyxhKTtyZXR1cm4gYy54Kz11LngsYy55Kz11LnksY30sZS5wcm90b3R5cGUuY29tcHV0ZUNvbGxpbmVhckludGVyc2VjdGlvbj1mdW5jdGlvbihlLG4scixpKXt2YXIgbz1qaS5pbnRlcnNlY3RzKGUsbixyKSxzPWppLmludGVyc2VjdHMoZSxuLGkpLGE9amkuaW50ZXJzZWN0cyhyLGksZSksdT1qaS5pbnRlcnNlY3RzKHIsaSxuKTtyZXR1cm4gbyYmcz8odGhpcy5faW50UHRbMF09cix0aGlzLl9pbnRQdFsxXT1pLHQuQ09MTElORUFSX0lOVEVSU0VDVElPTik6YSYmdT8odGhpcy5faW50UHRbMF09ZSx0aGlzLl9pbnRQdFsxXT1uLHQuQ09MTElORUFSX0lOVEVSU0VDVElPTik6byYmYT8odGhpcy5faW50UHRbMF09cix0aGlzLl9pbnRQdFsxXT1lLCFyLmVxdWFscyhlKXx8c3x8dT90LkNPTExJTkVBUl9JTlRFUlNFQ1RJT046dC5QT0lOVF9JTlRFUlNFQ1RJT04pOm8mJnU/KHRoaXMuX2ludFB0WzBdPXIsdGhpcy5faW50UHRbMV09biwhci5lcXVhbHMobil8fHN8fGE/dC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OOnQuUE9JTlRfSU5URVJTRUNUSU9OKTpzJiZhPyh0aGlzLl9pbnRQdFswXT1pLHRoaXMuX2ludFB0WzFdPWUsIWkuZXF1YWxzKGUpfHxvfHx1P3QuQ09MTElORUFSX0lOVEVSU0VDVElPTjp0LlBPSU5UX0lOVEVSU0VDVElPTik6cyYmdT8odGhpcy5faW50UHRbMF09aSx0aGlzLl9pbnRQdFsxXT1uLCFpLmVxdWFscyhuKXx8b3x8YT90LkNPTExJTkVBUl9JTlRFUlNFQ1RJT046dC5QT0lOVF9JTlRFUlNFQ1RJT04pOnQuTk9fSU5URVJTRUNUSU9OfSxlLnByb3RvdHlwZS5ub3JtYWxpemVUb0VudkNlbnRyZT1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXQueDxlLng/dC54OmUueCxzPXQueTxlLnk/dC55OmUueSxhPXQueD5lLng/dC54OmUueCx1PXQueT5lLnk/dC55OmUueSxjPW4ueDxyLng/bi54OnIueCxsPW4ueTxyLnk/bi55OnIueSxoPW4ueD5yLng/bi54OnIueCxmPW4ueT5yLnk/bi55OnIueSxwPSgobz5jP286YykrKGE8aD9hOmgpKS8yLGQ9KChzPmw/czpsKSsodTxmP3U6ZikpLzI7aS54PXAsaS55PWQsdC54LT1pLngsdC55LT1pLnksZS54LT1pLngsZS55LT1pLnksbi54LT1pLngsbi55LT1pLnksci54LT1pLngsci55LT1pLnl9LGUucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Q9ZnVuY3Rpb24oZSxuLHIsaSl7aWYodGhpcy5faXNQcm9wZXI9ITEsIWppLmludGVyc2VjdHMoZSxuLHIsaSkpcmV0dXJuIHQuTk9fSU5URVJTRUNUSU9OO3ZhciBvPWVvLm9yaWVudGF0aW9uSW5kZXgoZSxuLHIpLHM9ZW8ub3JpZW50YXRpb25JbmRleChlLG4saSk7aWYobz4wJiZzPjB8fG88MCYmczwwKXJldHVybiB0Lk5PX0lOVEVSU0VDVElPTjt2YXIgYT1lby5vcmllbnRhdGlvbkluZGV4KHIsaSxlKSx1PWVvLm9yaWVudGF0aW9uSW5kZXgocixpLG4pO3JldHVybiBhPjAmJnU+MHx8YTwwJiZ1PDA/dC5OT19JTlRFUlNFQ1RJT046MD09PW8mJjA9PT1zJiYwPT09YSYmMD09PXU/dGhpcy5jb21wdXRlQ29sbGluZWFySW50ZXJzZWN0aW9uKGUsbixyLGkpOigwPT09b3x8MD09PXN8fDA9PT1hfHwwPT09dT8odGhpcy5faXNQcm9wZXI9ITEsZS5lcXVhbHMyRChyKXx8ZS5lcXVhbHMyRChpKT90aGlzLl9pbnRQdFswXT1lOm4uZXF1YWxzMkQocil8fG4uZXF1YWxzMkQoaSk/dGhpcy5faW50UHRbMF09bjowPT09bz90aGlzLl9pbnRQdFswXT1uZXcgdmkocik6MD09PXM/dGhpcy5faW50UHRbMF09bmV3IHZpKGkpOjA9PT1hP3RoaXMuX2ludFB0WzBdPW5ldyB2aShlKTowPT09dSYmKHRoaXMuX2ludFB0WzBdPW5ldyB2aShuKSkpOih0aGlzLl9pc1Byb3Blcj0hMCx0aGlzLl9pbnRQdFswXT10aGlzLmludGVyc2VjdGlvbihlLG4scixpKSksdC5QT0lOVF9JTlRFUlNFQ1RJT04pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLm5lYXJlc3RFbmRwb2ludD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LG89ZW8uZGlzdGFuY2VQb2ludExpbmUodCxuLHIpLHM9ZW8uZGlzdGFuY2VQb2ludExpbmUoZSxuLHIpO3JldHVybiBzPG8mJihvPXMsaT1lKSwocz1lby5kaXN0YW5jZVBvaW50TGluZShuLHQsZSkpPG8mJihvPXMsaT1uKSwocz1lby5kaXN0YW5jZVBvaW50TGluZShyLHQsZSkpPG8mJihvPXMsaT1yKSxpfSxlfShLaSksJGk9ZnVuY3Rpb24oKXt9OyRpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSwkaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gJGl9LCRpLm9yaWVudGF0aW9uSW5kZXg9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUueC10LngsaT1lLnktdC55LG89bi54LWUueCxzPW4ueS1lLnk7cmV0dXJuICRpLnNpZ25PZkRldDJ4MihyLGksbyxzKX0sJGkuc2lnbk9mRGV0MngyPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW51bGwsbz1udWxsLHM9bnVsbDtpZihpPTEsMD09PXR8fDA9PT1yKXJldHVybiAwPT09ZXx8MD09PW4/MDplPjA/bj4wPy1pOmk6bj4wP2k6LWk7aWYoMD09PWV8fDA9PT1uKXJldHVybiByPjA/dD4wP2k6LWk6dD4wPy1pOmk7aWYoZT4wP3I+MD9lPD1yfHwoaT0taSxvPXQsdD1uLG49byxvPWUsZT1yLHI9byk6ZTw9LXI/KGk9LWksbj0tbixyPS1yKToobz10LHQ9LW4sbj1vLG89ZSxlPS1yLHI9byk6cj4wPy1lPD1yPyhpPS1pLHQ9LXQsZT0tZSk6KG89LXQsdD1uLG49byxvPS1lLGU9cixyPW8pOmU+PXI/KHQ9LXQsZT0tZSxuPS1uLHI9LXIpOihpPS1pLG89LXQsdD0tbixuPW8sbz0tZSxlPS1yLHI9byksdD4wKXtpZighKG4+MCkpcmV0dXJuIGk7aWYoISh0PD1uKSlyZXR1cm4gaX1lbHNle2lmKG4+MClyZXR1cm4taTtpZighKHQ+PW4pKXJldHVybi1pO2k9LWksdD0tdCxuPS1ufWZvcig7Oyl7aWYoKHItPShzPU1hdGguZmxvb3Iobi90KSkqZSk8MClyZXR1cm4taTtpZihyPmUpcmV0dXJuIGk7aWYodD4obi09cyp0KStuKXtpZihlPHIrcilyZXR1cm4gaX1lbHNle2lmKGU+cityKXJldHVybi1pO249dC1uLHI9ZS1yLGk9LWl9aWYoMD09PXIpcmV0dXJuIDA9PT1uPzA6LWk7aWYoMD09PW58fCh0LT0ocz1NYXRoLmZsb29yKHQvbikpKm4sKGUtPXMqcik8MCkpcmV0dXJuIGk7aWYoZT5yKXJldHVybi1pO2lmKG4+dCt0KXtpZihyPGUrZSlyZXR1cm4taX1lbHNle2lmKHI+ZStlKXJldHVybiBpO3Q9bi10LGU9ci1lLGk9LWl9aWYoMD09PWUpcmV0dXJuIDA9PT10PzA6aTtpZigwPT09dClyZXR1cm4taX19O3ZhciB0bz1mdW5jdGlvbigpe3RoaXMuX3A9bnVsbCx0aGlzLl9jcm9zc2luZ0NvdW50PTAsdGhpcy5faXNQb2ludE9uU2VnbWVudD0hMTt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fcD10fTt0by5wcm90b3R5cGUuY291bnRTZWdtZW50PWZ1bmN0aW9uKHQsZSl7aWYodC54PHRoaXMuX3AueCYmZS54PHRoaXMuX3AueClyZXR1cm4gbnVsbDtpZih0aGlzLl9wLng9PT1lLngmJnRoaXMuX3AueT09PWUueSlyZXR1cm4gdGhpcy5faXNQb2ludE9uU2VnbWVudD0hMCxudWxsO2lmKHQueT09PXRoaXMuX3AueSYmZS55PT09dGhpcy5fcC55KXt2YXIgbj10Lngscj1lLng7cmV0dXJuIG4+ciYmKG49ZS54LHI9dC54KSx0aGlzLl9wLng+PW4mJnRoaXMuX3AueDw9ciYmKHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ9ITApLG51bGx9aWYodC55PnRoaXMuX3AueSYmZS55PD10aGlzLl9wLnl8fGUueT50aGlzLl9wLnkmJnQueTw9dGhpcy5fcC55KXt2YXIgaT10LngtdGhpcy5fcC54LG89dC55LXRoaXMuX3AueSxzPWUueC10aGlzLl9wLngsYT1lLnktdGhpcy5fcC55LHU9JGkuc2lnbk9mRGV0MngyKGksbyxzLGEpO2lmKDA9PT11KXJldHVybiB0aGlzLl9pc1BvaW50T25TZWdtZW50PSEwLG51bGw7YTxvJiYodT0tdSksdT4wJiZ0aGlzLl9jcm9zc2luZ0NvdW50Kyt9fSx0by5wcm90b3R5cGUuaXNQb2ludEluUG9seWdvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldExvY2F0aW9uKCkhPT1iaS5FWFRFUklPUn0sdG8ucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ/YmkuQk9VTkRBUlk6dGhpcy5fY3Jvc3NpbmdDb3VudCUyPT0xP2JpLklOVEVSSU9SOmJpLkVYVEVSSU9SfSx0by5wcm90b3R5cGUuaXNPblNlZ21lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNQb2ludE9uU2VnbWVudH0sdG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHRvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0b30sdG8ubG9jYXRlUG9pbnRJblJpbmc9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZFaShhcmd1bWVudHNbMV0sTGkpKXtmb3IodmFyIHQ9YXJndW1lbnRzWzFdLGU9bmV3IHRvKGFyZ3VtZW50c1swXSksbj1uZXcgdmkscj1uZXcgdmksaT0xO2k8dC5zaXplKCk7aSsrKWlmKHQuZ2V0Q29vcmRpbmF0ZShpLG4pLHQuZ2V0Q29vcmRpbmF0ZShpLTEsciksZS5jb3VudFNlZ21lbnQobixyKSxlLmlzT25TZWdtZW50KCkpcmV0dXJuIGUuZ2V0TG9jYXRpb24oKTtyZXR1cm4gZS5nZXRMb2NhdGlvbigpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgbz1hcmd1bWVudHNbMV0scz1uZXcgdG8oYXJndW1lbnRzWzBdKSxhPTE7YTxvLmxlbmd0aDthKyspe3ZhciB1PW9bYV0sYz1vW2EtMV07aWYocy5jb3VudFNlZ21lbnQodSxjKSxzLmlzT25TZWdtZW50KCkpcmV0dXJuIHMuZ2V0TG9jYXRpb24oKX1yZXR1cm4gcy5nZXRMb2NhdGlvbigpfX07dmFyIGVvPWZ1bmN0aW9uKCl7fSxubz17Q0xPQ0tXSVNFOntjb25maWd1cmFibGU6ITB9LFJJR0hUOntjb25maWd1cmFibGU6ITB9LENPVU5URVJDTE9DS1dJU0U6e2NvbmZpZ3VyYWJsZTohMH0sTEVGVDp7Y29uZmlndXJhYmxlOiEwfSxDT0xMSU5FQVI6e2NvbmZpZ3VyYWJsZTohMH0sU1RSQUlHSFQ6e2NvbmZpZ3VyYWJsZTohMH19O2VvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZW99LGVvLm9yaWVudGF0aW9uSW5kZXg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBUaS5vcmllbnRhdGlvbkluZGV4KHQsZSxuKX0sZW8uc2lnbmVkQXJlYT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciB0PWFyZ3VtZW50c1swXTtpZih0Lmxlbmd0aDwzKXJldHVybiAwO2Zvcih2YXIgZT0wLG49dFswXS54LHI9MTtyPHQubGVuZ3RoLTE7cisrKXt2YXIgaT10W3JdLngtbixvPXRbcisxXS55O2UrPWkqKHRbci0xXS55LW8pfXJldHVybiBlLzJ9aWYoRWkoYXJndW1lbnRzWzBdLExpKSl7dmFyIHM9YXJndW1lbnRzWzBdLGE9cy5zaXplKCk7aWYoYTwzKXJldHVybiAwO3ZhciB1PW5ldyB2aSxjPW5ldyB2aSxsPW5ldyB2aTtzLmdldENvb3JkaW5hdGUoMCxjKSxzLmdldENvb3JkaW5hdGUoMSxsKTt2YXIgaD1jLng7bC54LT1oO2Zvcih2YXIgZj0wLHA9MTtwPGEtMTtwKyspdS55PWMueSxjLng9bC54LGMueT1sLnkscy5nZXRDb29yZGluYXRlKHArMSxsKSxsLngtPWgsZis9Yy54Kih1LnktbC55KTtyZXR1cm4gZi8yfX0sZW8uZGlzdGFuY2VMaW5lTGluZT1mdW5jdGlvbih0LGUsbixyKXtpZih0LmVxdWFscyhlKSlyZXR1cm4gZW8uZGlzdGFuY2VQb2ludExpbmUodCxuLHIpO2lmKG4uZXF1YWxzKHIpKXJldHVybiBlby5kaXN0YW5jZVBvaW50TGluZShyLHQsZSk7dmFyIGk9ITE7aWYoamkuaW50ZXJzZWN0cyh0LGUsbixyKSl7dmFyIG89KGUueC10LngpKihyLnktbi55KS0oZS55LXQueSkqKHIueC1uLngpO2lmKDA9PT1vKWk9ITA7ZWxzZXt2YXIgcz0odC55LW4ueSkqKHIueC1uLngpLSh0Lngtbi54KSooci55LW4ueSksYT0oKHQueS1uLnkpKihlLngtdC54KS0odC54LW4ueCkqKGUueS10LnkpKS9vLHU9cy9vOyh1PDB8fHU+MXx8YTwwfHxhPjEpJiYoaT0hMCl9fWVsc2UgaT0hMDtyZXR1cm4gaT9DaS5taW4oZW8uZGlzdGFuY2VQb2ludExpbmUodCxuLHIpLGVvLmRpc3RhbmNlUG9pbnRMaW5lKGUsbixyKSxlby5kaXN0YW5jZVBvaW50TGluZShuLHQsZSksZW8uZGlzdGFuY2VQb2ludExpbmUocix0LGUpKTowfSxlby5pc1BvaW50SW5SaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVvLmxvY2F0ZVBvaW50SW5SaW5nKHQsZSkhPT1iaS5FWFRFUklPUn0sZW8uY29tcHV0ZUxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT10LnNpemUoKTtpZihlPD0xKXJldHVybiAwO3ZhciBuPTAscj1uZXcgdmk7dC5nZXRDb29yZGluYXRlKDAscik7Zm9yKHZhciBpPXIueCxvPXIueSxzPTE7czxlO3MrKyl7dC5nZXRDb29yZGluYXRlKHMscik7dmFyIGE9ci54LHU9ci55LGM9YS1pLGw9dS1vO24rPU1hdGguc3FydChjKmMrbCpsKSxpPWEsbz11fXJldHVybiBufSxlby5pc0NDVz1mdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aC0xO2lmKGU8Myl0aHJvdyBuZXcgaGk7Zm9yKHZhciBuPXRbMF0scj0wLGk9MTtpPD1lO2krKyl7dmFyIG89dFtpXTtvLnk+bi55JiYobj1vLHI9aSl9dmFyIHM9cjtkb3socy09MSk8MCYmKHM9ZSl9d2hpbGUodFtzXS5lcXVhbHMyRChuKSYmcyE9PXIpO3ZhciBhPXI7ZG97YT0oYSsxKSVlfXdoaWxlKHRbYV0uZXF1YWxzMkQobikmJmEhPT1yKTt2YXIgdT10W3NdLGM9dFthXTtpZih1LmVxdWFsczJEKG4pfHxjLmVxdWFsczJEKG4pfHx1LmVxdWFsczJEKGMpKXJldHVybiExO3ZhciBsPWVvLmNvbXB1dGVPcmllbnRhdGlvbih1LG4sYyk7cmV0dXJuIDA9PT1sP3UueD5jLng6bD4wfSxlby5sb2NhdGVQb2ludEluUmluZz1mdW5jdGlvbih0LGUpe3JldHVybiB0by5sb2NhdGVQb2ludEluUmluZyh0LGUpfSxlby5kaXN0YW5jZVBvaW50TGluZVBlcnBlbmRpY3VsYXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPShuLngtZS54KSoobi54LWUueCkrKG4ueS1lLnkpKihuLnktZS55KSxpPSgoZS55LXQueSkqKG4ueC1lLngpLShlLngtdC54KSoobi55LWUueSkpL3I7cmV0dXJuIE1hdGguYWJzKGkpKk1hdGguc3FydChyKX0sZW8uY29tcHV0ZU9yaWVudGF0aW9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZW8ub3JpZW50YXRpb25JbmRleCh0LGUsbil9LGVvLmRpc3RhbmNlUG9pbnRMaW5lPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IGhpO2Zvcih2YXIgbj10LmRpc3RhbmNlKGVbMF0pLHI9MDtyPGUubGVuZ3RoLTE7cisrKXt2YXIgaT1lby5kaXN0YW5jZVBvaW50TGluZSh0LGVbcl0sZVtyKzFdKTtpPG4mJihuPWkpfXJldHVybiBufWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl07aWYocy54PT09YS54JiZzLnk9PT1hLnkpcmV0dXJuIG8uZGlzdGFuY2Uocyk7dmFyIHU9KGEueC1zLngpKihhLngtcy54KSsoYS55LXMueSkqKGEueS1zLnkpLGM9KChvLngtcy54KSooYS54LXMueCkrKG8ueS1zLnkpKihhLnktcy55KSkvdTtpZihjPD0wKXJldHVybiBvLmRpc3RhbmNlKHMpO2lmKGM+PTEpcmV0dXJuIG8uZGlzdGFuY2UoYSk7dmFyIGw9KChzLnktby55KSooYS54LXMueCktKHMueC1vLngpKihhLnktcy55KSkvdTtyZXR1cm4gTWF0aC5hYnMobCkqTWF0aC5zcXJ0KHUpfX0sZW8uaXNPbkxpbmU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IFFpLHI9MTtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyLTFdLG89ZVtyXTtpZihuLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxpLG8pLG4uaGFzSW50ZXJzZWN0aW9uKCkpcmV0dXJuITB9cmV0dXJuITF9LG5vLkNMT0NLV0lTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMX0sbm8uUklHSFQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGVvLkNMT0NLV0lTRX0sbm8uQ09VTlRFUkNMT0NLV0lTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sbm8uTEVGVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uQ09VTlRFUkNMT0NLV0lTRX0sbm8uQ09MTElORUFSLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxuby5TVFJBSUdIVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uQ09MTElORUFSfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlbyxubyk7dmFyIHJvPWZ1bmN0aW9uKCl7fTtyby5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe30scm8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHJvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiByb307dmFyIGlvPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2VudmVsb3BlPW51bGwsdGhpcy5fZmFjdG9yeT1udWxsLHRoaXMuX1NSSUQ9bnVsbCx0aGlzLl91c2VyRGF0YT1udWxsLHRoaXMuX2ZhY3Rvcnk9dCx0aGlzLl9TUklEPXQuZ2V0U1JJRCgpfSxvbz17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfUE9JTlQ6e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX01VTFRJUE9JTlQ6e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX0xJTkVTVFJJTkc6e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX0xJTkVBUlJJTkc6e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX01VTFRJTElORVNUUklORzp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfUE9MWUdPTjp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTVVMVElQT0xZR09OOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT046e2NvbmZpZ3VyYWJsZTohMH0sZ2VvbWV0cnlDaGFuZ2VkRmlsdGVyOntjb25maWd1cmFibGU6ITB9fTtpby5wcm90b3R5cGUuaXNHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTb3J0SW5kZXgoKT09PWlvLlNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT059LGlvLnByb3RvdHlwZS5nZXRGYWN0b3J5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZhY3Rvcnl9LGlvLnByb3RvdHlwZS5nZXRHZW9tZXRyeU49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXN9LGlvLnByb3RvdHlwZS5nZXRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGlvLnByb3RvdHlwZS5pc1JlY3RhbmdsZT1mdW5jdGlvbigpe3JldHVybiExfSxpby5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBudWxsIT09dCYmdGhpcy5lcXVhbHNUb3BvKHQpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0KXt2YXIgZT1hcmd1bWVudHNbMF07aWYoIShlIGluc3RhbmNlb2YgaW8pKXJldHVybiExO3ZhciBuPWU7cmV0dXJuIHRoaXMuZXF1YWxzRXhhY3Qobil9fSxpby5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXM9PT10fHx0aGlzLmVxdWFsc0V4YWN0KHQsMCl9LGlvLnByb3RvdHlwZS5nZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXt0aGlzLmFwcGx5KGlvLmdlb21ldHJ5Q2hhbmdlZEZpbHRlcil9LGlvLnByb3RvdHlwZS5nZW9tZXRyeUNoYW5nZWRBY3Rpb249ZnVuY3Rpb24oKXt0aGlzLl9lbnZlbG9wZT1udWxsfSxpby5wcm90b3R5cGUuZXF1YWxzTm9ybT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXQmJnRoaXMubm9ybSgpLmVxdWFsc0V4YWN0KHQubm9ybSgpKX0saW8ucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiAwfSxpby5wcm90b3R5cGUuZ2V0TnVtR2VvbWV0cmllcz1mdW5jdGlvbigpe3JldHVybiAxfSxpby5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXQ7cmV0dXJuIHRoaXMuZ2V0U29ydEluZGV4KCkhPT1lLmdldFNvcnRJbmRleCgpP3RoaXMuZ2V0U29ydEluZGV4KCktZS5nZXRTb3J0SW5kZXgoKTp0aGlzLmlzRW1wdHkoKSYmZS5pc0VtcHR5KCk/MDp0aGlzLmlzRW1wdHkoKT8tMTplLmlzRW1wdHkoKT8xOnRoaXMuY29tcGFyZVRvU2FtZUNsYXNzKHQpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuZ2V0U29ydEluZGV4KCkhPT1uLmdldFNvcnRJbmRleCgpP3RoaXMuZ2V0U29ydEluZGV4KCktbi5nZXRTb3J0SW5kZXgoKTp0aGlzLmlzRW1wdHkoKSYmbi5pc0VtcHR5KCk/MDp0aGlzLmlzRW1wdHkoKT8tMTpuLmlzRW1wdHkoKT8xOnRoaXMuY29tcGFyZVRvU2FtZUNsYXNzKG4scil9fSxpby5wcm90b3R5cGUuZ2V0VXNlckRhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXNlckRhdGF9LGlvLnByb3RvdHlwZS5nZXRTUklEPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX1NSSUR9LGlvLnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS50b0dlb21ldHJ5KHRoaXMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKX0saW8ucHJvdG90eXBlLmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKHQpe2lmKHQuZ2V0U29ydEluZGV4KCk9PT1pby5TT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OKXRocm93IG5ldyBoaX0saW8ucHJvdG90eXBlLmVxdWFsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMD09PW4/dC5lcXVhbHMoZSk6dC5kaXN0YW5jZShlKTw9bn0saW8ucHJvdG90eXBlLm5vcm09ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvcHkoKTtyZXR1cm4gdC5ub3JtYWxpemUoKSx0fSxpby5wcm90b3R5cGUuZ2V0UHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmFjdG9yeS5nZXRQcmVjaXNpb25Nb2RlbCgpfSxpby5wcm90b3R5cGUuZ2V0RW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fZW52ZWxvcGUmJih0aGlzLl9lbnZlbG9wZT10aGlzLmNvbXB1dGVFbnZlbG9wZUludGVybmFsKCkpLG5ldyBqaSh0aGlzLl9lbnZlbG9wZSl9LGlvLnByb3RvdHlwZS5zZXRTUklEPWZ1bmN0aW9uKHQpe3RoaXMuX1NSSUQ9dH0saW8ucHJvdG90eXBlLnNldFVzZXJEYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX3VzZXJEYXRhPXR9LGlvLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuaXRlcmF0b3IoKSxyPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKSYmci5oYXNOZXh0KCk7KXt2YXIgaT1uLm5leHQoKSxvPXIubmV4dCgpLHM9aS5jb21wYXJlVG8obyk7aWYoMCE9PXMpcmV0dXJuIHN9cmV0dXJuIG4uaGFzTmV4dCgpPzE6ci5oYXNOZXh0KCk/LTE6MH0saW8ucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmhhc2hDb2RlKCl9LGlvLnByb3RvdHlwZS5pc0dlb21ldHJ5Q29sbGVjdGlvbk9yRGVyaXZlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFNvcnRJbmRleCgpPT09aW8uU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTnx8dGhpcy5nZXRTb3J0SW5kZXgoKT09PWlvLlNPUlRJTkRFWF9NVUxUSVBPSU5UfHx0aGlzLmdldFNvcnRJbmRleCgpPT09aW8uU09SVElOREVYX01VTFRJTElORVNUUklOR3x8dGhpcy5nZXRTb3J0SW5kZXgoKT09PWlvLlNPUlRJTkRFWF9NVUxUSVBPTFlHT059LGlvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltnaSxkaSxtaV19LGlvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBpb30saW8uaGFzTm9uRW1wdHlFbGVtZW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZighdFtlXS5pc0VtcHR5KCkpcmV0dXJuITA7cmV0dXJuITF9LGlvLmhhc051bGxFbGVtZW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZihudWxsPT09dFtlXSlyZXR1cm4hMDtyZXR1cm4hMX0sb28uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg3OTllYTQ2NTIyODU0YzAwfSxvby5TT1JUSU5ERVhfUE9JTlQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LG9vLlNPUlRJTkRFWF9NVUxUSVBPSU5ULmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxvby5TT1JUSU5ERVhfTElORVNUUklORy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sb28uU09SVElOREVYX0xJTkVBUlJJTkcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LG9vLlNPUlRJTkRFWF9NVUxUSUxJTkVTVFJJTkcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDR9LG9vLlNPUlRJTkRFWF9QT0xZR09OLmdldD1mdW5jdGlvbigpe3JldHVybiA1fSxvby5TT1JUSU5ERVhfTVVMVElQT0xZR09OLmdldD1mdW5jdGlvbigpe3JldHVybiA2fSxvby5TT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OLmdldD1mdW5jdGlvbigpe3JldHVybiA3fSxvby5nZW9tZXRyeUNoYW5nZWRGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHNvfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpbyxvbyk7dmFyIHNvPWZ1bmN0aW9uKCl7fTtzby5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltyb119LHNvLmZpbHRlcj1mdW5jdGlvbih0KXt0Lmdlb21ldHJ5Q2hhbmdlZEFjdGlvbigpfTt2YXIgYW89ZnVuY3Rpb24oKXt9O2FvLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7fSxhby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sYW8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGFvfTt2YXIgdW89ZnVuY3Rpb24oKXt9LGNvPXtNb2QyQm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGU6e2NvbmZpZ3VyYWJsZTohMH0sTXVsdGlWYWxlbnRFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGU6e2NvbmZpZ3VyYWJsZTohMH0sTW9ub1ZhbGVudEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxNT0QyX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH0sRU5EUE9JTlRfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfSxNVUxUSVZBTEVOVF9FTkRQT0lOVF9CT1VOREFSWV9SVUxFOntjb25maWd1cmFibGU6ITB9LE1PTk9WQUxFTlRfRU5EUE9JTlRfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfSxPR0NfU0ZTX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH19O3VvLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7fSx1by5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdW8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHVvfSxjby5Nb2QyQm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbG99LGNvLkVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gaG99LGNvLk11bHRpVmFsZW50RW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlLmdldD1mdW5jdGlvbigpe3JldHVybiBmb30sY28uTW9ub1ZhbGVudEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gcG99LGNvLk1PRDJfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGxvfSxjby5FTkRQT0lOVF9CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgaG99LGNvLk1VTFRJVkFMRU5UX0VORFBPSU5UX0JPVU5EQVJZX1JVTEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBmb30sY28uTU9OT1ZBTEVOVF9FTkRQT0lOVF9CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgcG99LGNvLk9HQ19TRlNfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdW8uTU9EMl9CT1VOREFSWV9SVUxFfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1byxjbyk7dmFyIGxvPWZ1bmN0aW9uKCl7fTtsby5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0JTI9PTF9LGxvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt1b119LGxvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBsb307dmFyIGhvPWZ1bmN0aW9uKCl7fTtoby5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PjB9LGhvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt1b119LGhvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBob307dmFyIGZvPWZ1bmN0aW9uKCl7fTtmby5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PjF9LGZvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt1b119LGZvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBmb307dmFyIHBvPWZ1bmN0aW9uKCl7fTtwby5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dH0scG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3VvXX0scG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBvfTt2YXIgZ289ZnVuY3Rpb24oKXt9O2dvLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXt9LGdvLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24oKXt9LGdvLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7fSxnby5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXt9LGdvLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7fSxnby5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe30sZ28ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307dmFyIHlvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLHRoaXMubWVzc2FnZT1lfHwiIn10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17bmFtZTp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIG4ubmFtZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oRXJyb3IpLG1vPWZ1bmN0aW9uKCl7fTttby5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe30sbW8ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt9LG1vLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt9O3ZhciB2bz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7fSxlfShnbyk7ZnVuY3Rpb24gX28odCl7dGhpcy5tZXNzYWdlPXR8fCIifV9vLnByb3RvdHlwZT1uZXcgRXJyb3IsX28ucHJvdG90eXBlLm5hbWU9Ik5vU3VjaEVsZW1lbnRFeGNlcHRpb24iO3ZhciB4bz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuYXJyYXlfPVtdLGFyZ3VtZW50c1swXWluc3RhbmNlb2YgZ28mJnRoaXMuYWRkQWxsKGFyZ3VtZW50c1swXSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmVuc3VyZUNhcGFjaXR5PWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt0LGdvXX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmFycmF5Xy5wdXNoKHQpOnRoaXMuYXJyYXlfLnNwbGljZShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKSwhMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmFycmF5Xz1bXX0sZS5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXRoaXMuYWRkKGUubmV4dCgpKTtyZXR1cm4hMH0sZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5hcnJheV9bdF07cmV0dXJuIHRoaXMuYXJyYXlfW3RdPWUsbn0sZS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHdvKHRoaXMpfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYodDwwfHx0Pj10aGlzLnNpemUoKSl0aHJvdyBuZXcgeW87cmV0dXJuIHRoaXMuYXJyYXlfW3RdfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9LGUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcnJheV8ubGVuZ3RofSxlLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXQucHVzaCh0aGlzLmFycmF5X1tlXSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9ITEsbj0wLHI9dGhpcy5hcnJheV8ubGVuZ3RoO248cjtuKyspaWYodGhpcy5hcnJheV9bbl09PT10KXt0aGlzLmFycmF5Xy5zcGxpY2UobiwxKSxlPSEwO2JyZWFrfXJldHVybiBlfSxlfSh2byksd289ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyksdGhpcy5hcnJheUxpc3RfPWUsdGhpcy5wb3NpdGlvbl89MH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMucG9zaXRpb25fPT09dGhpcy5hcnJheUxpc3RfLnNpemUoKSl0aHJvdyBuZXcgX287cmV0dXJuIHRoaXMuYXJyYXlMaXN0Xy5nZXQodGhpcy5wb3NpdGlvbl8rKyl9LGUucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbl88dGhpcy5hcnJheUxpc3RfLnNpemUoKX0sZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFycmF5TGlzdF8uc2V0KHRoaXMucG9zaXRpb25fLTEsdCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuYXJyYXlMaXN0Xy5yZW1vdmUodGhpcy5hcnJheUxpc3RfLmdldCh0aGlzLnBvc2l0aW9uXykpfSxlfShtbyksYm89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe2lmKHQuY2FsbCh0aGlzKSwwIT09YXJndW1lbnRzLmxlbmd0aClpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuZW5zdXJlQ2FwYWNpdHkoZS5sZW5ndGgpLHRoaXMuYWRkKGUsITApfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLmVuc3VyZUNhcGFjaXR5KG4ubGVuZ3RoKSx0aGlzLmFkZChuLHIpfX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17Y29vcmRBcnJheVR5cGU6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBuLmNvb3JkQXJyYXlUeXBlLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgQXJyYXkoMCkuZmlsbChudWxsKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXQodCl9LGUucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YXJndW1lbnRzWzFdLG49ITEscj1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtyLmhhc05leHQoKTspdGhpcy5hZGQoci5uZXh0KCksZSksbj0hMDtyZXR1cm4gbn1yZXR1cm4gdC5wcm90b3R5cGUuYWRkQWxsLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKSxuPTA7bjx0aGlzLnNpemUoKTtuKyspZS5hZGQobix0aGlzLmdldChuKS5jb3B5KCkpO3JldHVybiBlfSxlLnByb3RvdHlwZS50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvQXJyYXkoZS5jb29yZEFycmF5VHlwZSl9LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXTt0LnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLG4pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJiJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmFkZChyLGksITApLCEwfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJiJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIG89YXJndW1lbnRzWzBdO2lmKCFhcmd1bWVudHNbMV0mJnRoaXMuc2l6ZSgpPj0xKWlmKHRoaXMuZ2V0KHRoaXMuc2l6ZSgpLTEpLmVxdWFsczJEKG8pKXJldHVybiBudWxsO3QucHJvdG90eXBlLmFkZC5jYWxsKHRoaXMsbyl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuYWRkKHMsYSksITB9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdT1hcmd1bWVudHNbMF0sYz1hcmd1bWVudHNbMV07aWYoYXJndW1lbnRzWzJdKWZvcih2YXIgbD0wO2w8dS5sZW5ndGg7bCsrKWUuYWRkKHVbbF0sYyk7ZWxzZSBmb3IodmFyIGg9dS5sZW5ndGgtMTtoPj0wO2gtLSllLmFkZCh1W2hdLGMpO3JldHVybiEwfWlmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgZj1hcmd1bWVudHNbMF0scD1hcmd1bWVudHNbMV07aWYoIWFyZ3VtZW50c1syXSl7dmFyIGQ9dGhpcy5zaXplKCk7aWYoZD4wKXtpZihmPjApaWYodGhpcy5nZXQoZi0xKS5lcXVhbHMyRChwKSlyZXR1cm4gbnVsbDtpZihmPGQpaWYodGhpcy5nZXQoZikuZXF1YWxzMkQocCkpcmV0dXJuIG51bGx9fXQucHJvdG90eXBlLmFkZC5jYWxsKHRoaXMsZixwKX19ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGc9YXJndW1lbnRzWzBdLHk9YXJndW1lbnRzWzFdLG09YXJndW1lbnRzWzJdLHY9YXJndW1lbnRzWzNdLF89MTttPnYmJihfPS0xKTtmb3IodmFyIHg9bTt4IT09djt4Kz1fKWUuYWRkKGdbeF0seSk7cmV0dXJuITB9fSxlLnByb3RvdHlwZS5jbG9zZVJpbmc9ZnVuY3Rpb24oKXt0aGlzLnNpemUoKT4wJiZ0aGlzLmFkZChuZXcgdmkodGhpcy5nZXQoMCkpLCExKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfSh4byksRG89ZnVuY3Rpb24oKXt9LEVvPXtGb3J3YXJkQ29tcGFyYXRvcjp7Y29uZmlndXJhYmxlOiEwfSxCaWRpcmVjdGlvbmFsQ29tcGFyYXRvcjp7Y29uZmlndXJhYmxlOiEwfSxjb29yZEFycmF5VHlwZTp7Y29uZmlndXJhYmxlOiEwfX07RW8uRm9yd2FyZENvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIENvfSxFby5CaWRpcmVjdGlvbmFsQ29tcGFyYXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gU299LEVvLmNvb3JkQXJyYXlUeXBlLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgQXJyYXkoMCkuZmlsbChudWxsKX0sRG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LERvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBEb30sRG8uaXNSaW5nPWZ1bmN0aW9uKHQpe3JldHVybiEodC5sZW5ndGg8NHx8IXRbMF0uZXF1YWxzMkQodFt0Lmxlbmd0aC0xXSkpfSxEby5wdE5vdEluTGlzdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO2lmKERvLmluZGV4T2YocixlKTwwKXJldHVybiByfXJldHVybiBudWxsfSxEby5zY3JvbGw9ZnVuY3Rpb24odCxlKXt2YXIgbj1Eby5pbmRleE9mKGUsdCk7aWYobjwwKXJldHVybiBudWxsO3ZhciByPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChudWxsKTtraS5hcnJheWNvcHkodCxuLHIsMCx0Lmxlbmd0aC1uKSxraS5hcnJheWNvcHkodCwwLHIsdC5sZW5ndGgtbixuKSxraS5hcnJheWNvcHkociwwLHQsMCx0Lmxlbmd0aCl9LERvLmVxdWFscz1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYodD09PWUpcmV0dXJuITA7aWYobnVsbD09PXR8fG51bGw9PT1lfHx0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWlmKCF0W25dLmVxdWFscyhlW25dKSlyZXR1cm4hMTtyZXR1cm4hMH1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO2lmKHI9PT1pKXJldHVybiEwO2lmKG51bGw9PT1yfHxudWxsPT09aXx8ci5sZW5ndGghPT1pLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHM9MDtzPHIubGVuZ3RoO3MrKylpZigwIT09by5jb21wYXJlKHJbc10saVtzXSkpcmV0dXJuITE7cmV0dXJuITB9fSxEby5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IGJvLHI9MDtyPHQubGVuZ3RoO3IrKyllLmludGVyc2VjdHModFtyXSkmJm4uYWRkKHRbcl0sITApO3JldHVybiBuLnRvQ29vcmRpbmF0ZUFycmF5KCl9LERvLmhhc1JlcGVhdGVkUG9pbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZS0xXS5lcXVhbHModFtlXSkpcmV0dXJuITA7cmV0dXJuITF9LERvLnJlbW92ZVJlcGVhdGVkUG9pbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBEby5oYXNSZXBlYXRlZFBvaW50cyh0KT9uZXcgYm8odCwhMSkudG9Db29yZGluYXRlQXJyYXkoKTp0fSxEby5yZXZlcnNlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aC0xLG49TWF0aC50cnVuYyhlLzIpLHI9MDtyPD1uO3IrKyl7dmFyIGk9dFtyXTt0W3JdPXRbZS1yXSx0W2Utcl09aX19LERvLnJlbW92ZU51bGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGg7bisrKW51bGwhPT10W25dJiZlKys7dmFyIHI9bmV3IEFycmF5KGUpLmZpbGwobnVsbCk7aWYoMD09PWUpcmV0dXJuIHI7Zm9yKHZhciBpPTAsbz0wO288dC5sZW5ndGg7bysrKW51bGwhPT10W29dJiYocltpKytdPXRbb10pO3JldHVybiByfSxEby5jb3B5RGVlcD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IEFycmF5KHQubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPHQubGVuZ3RoO24rKyllW25dPW5ldyB2aSh0W25dKTtyZXR1cm4gZX1pZig1PT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdLHM9YXJndW1lbnRzWzNdLGE9YXJndW1lbnRzWzRdLHU9MDt1PGE7dSsrKW9bcyt1XT1uZXcgdmkocltpK3VdKX0sRG8uaXNFcXVhbFJldmVyc2VkPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl0saT1lW3QubGVuZ3RoLW4tMV07aWYoMCE9PXIuY29tcGFyZVRvKGkpKXJldHVybiExfXJldHVybiEwfSxEby5lbnZlbG9wZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGppLG49MDtuPHQubGVuZ3RoO24rKyllLmV4cGFuZFRvSW5jbHVkZSh0W25dKTtyZXR1cm4gZX0sRG8udG9Db29yZGluYXRlQXJyYXk9ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9BcnJheShEby5jb29yZEFycmF5VHlwZSl9LERvLmF0TGVhc3ROQ29vcmRpbmF0ZXNPck5vdGhpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5sZW5ndGg+PXQ/ZTpbXX0sRG8uaW5kZXhPZj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWlmKHQuZXF1YWxzKGVbbl0pKXJldHVybiBuO3JldHVybi0xfSxEby5pbmNyZWFzaW5nRGlyZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8TWF0aC50cnVuYyh0Lmxlbmd0aC8yKTtlKyspe3ZhciBuPXQubGVuZ3RoLTEtZSxyPXRbZV0uY29tcGFyZVRvKHRbbl0pO2lmKDAhPT1yKXJldHVybiByfXJldHVybiAxfSxEby5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmbjxlLmxlbmd0aDspe3ZhciByPXRbbl0uY29tcGFyZVRvKGVbbl0pO2lmKDAhPT1yKXJldHVybiByO24rK31yZXR1cm4gbjxlLmxlbmd0aD8tMTpuPHQubGVuZ3RoPzE6MH0sRG8ubWluQ29vcmRpbmF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bnVsbCxuPTA7bjx0Lmxlbmd0aDtuKyspKG51bGw9PT1lfHxlLmNvbXBhcmVUbyh0W25dKT4wKSYmKGU9dFtuXSk7cmV0dXJuIGV9LERvLmV4dHJhY3Q9ZnVuY3Rpb24odCxlLG4pe2U9Q2kuY2xhbXAoZSwwLHQubGVuZ3RoKTt2YXIgcj0obj1DaS5jbGFtcChuLC0xLHQubGVuZ3RoKSktZSsxO248MCYmKHI9MCksZT49dC5sZW5ndGgmJihyPTApLG48ZSYmKHI9MCk7dmFyIGk9bmV3IEFycmF5KHIpLmZpbGwobnVsbCk7aWYoMD09PXIpcmV0dXJuIGk7Zm9yKHZhciBvPTAscz1lO3M8PW47cysrKWlbbysrXT10W3NdO3JldHVybiBpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhEbyxFbyk7dmFyIENvPWZ1bmN0aW9uKCl7fTtDby5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUpe3JldHVybiBEby5jb21wYXJlKHQsZSl9LENvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt5aV19LENvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDb307dmFyIFNvPWZ1bmN0aW9uKCl7fTtTby5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQscj1lO2lmKG4ubGVuZ3RoPHIubGVuZ3RoKXJldHVybi0xO2lmKG4ubGVuZ3RoPnIubGVuZ3RoKXJldHVybiAxO2lmKDA9PT1uLmxlbmd0aClyZXR1cm4gMDt2YXIgaT1Eby5jb21wYXJlKG4scik7cmV0dXJuIERvLmlzRXF1YWxSZXZlcnNlZChuLHIpPzA6aX0sU28ucHJvdG90eXBlLk9MRGNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZTtpZihuLmxlbmd0aDxyLmxlbmd0aClyZXR1cm4tMTtpZihuLmxlbmd0aD5yLmxlbmd0aClyZXR1cm4gMTtpZigwPT09bi5sZW5ndGgpcmV0dXJuIDA7Zm9yKHZhciBpPURvLmluY3JlYXNpbmdEaXJlY3Rpb24obiksbz1Eby5pbmNyZWFzaW5nRGlyZWN0aW9uKHIpLHM9aT4wPzA6bi5sZW5ndGgtMSxhPW8+MD8wOm4ubGVuZ3RoLTEsdT0wO3U8bi5sZW5ndGg7dSsrKXt2YXIgYz1uW3NdLmNvbXBhcmVUbyhyW2FdKTtpZigwIT09YylyZXR1cm4gYztzKz1pLGErPW99cmV0dXJuIDB9LFNvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt5aV19LFNvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBTb307dmFyIEFvPWZ1bmN0aW9uKCl7fTtBby5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7fSxBby5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKCl7fSxBby5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe30sQW8ucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe30sQW8ucHJvdG90eXBlLmVudHJ5U2V0PWZ1bmN0aW9uKCl7fTt2YXIgTm89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShBbyk7ZnVuY3Rpb24gSW8odCl7dGhpcy5tZXNzYWdlPXR8fCIifWZ1bmN0aW9uIE1vKCl7fUlvLnByb3RvdHlwZT1uZXcgRXJyb3IsSW8ucHJvdG90eXBlLm5hbWU9Ik9wZXJhdGlvbk5vdFN1cHBvcnRlZCIsTW8ucHJvdG90eXBlPW5ldyBnbyxNby5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24oKXt9O3ZhciBGbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuYXJyYXlfPVtdLGFyZ3VtZW50c1swXWluc3RhbmNlb2YgZ28mJnRoaXMuYWRkQWxsKGFyZ3VtZW50c1swXSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspe2lmKHRoaXMuYXJyYXlfW2VdPT09dClyZXR1cm4hMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiF0aGlzLmNvbnRhaW5zKHQpJiYodGhpcy5hcnJheV8ucHVzaCh0KSwhMCl9LGUucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSk7cmV0dXJuITB9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3J9LGUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcnJheV8ubGVuZ3RofSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9LGUucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspdC5wdXNoKHRoaXMuYXJyYXlfW2VdKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRvKHRoaXMpfSxlfShNbyksVG89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyksdGhpcy5oYXNoU2V0Xz1lLHRoaXMucG9zaXRpb25fPTB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvc2l0aW9uXz09PXRoaXMuaGFzaFNldF8uc2l6ZSgpKXRocm93IG5ldyBfbztyZXR1cm4gdGhpcy5oYXNoU2V0Xy5hcnJheV9bdGhpcy5wb3NpdGlvbl8rK119LGUucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbl88dGhpcy5oYXNoU2V0Xy5zaXplKCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBJb30sZX0obW8pO2Z1bmN0aW9uIE9vKHQpe3JldHVybiBudWxsPT09dD8wOnQuY29sb3J9ZnVuY3Rpb24gTG8odCl7cmV0dXJuIG51bGw9PT10P251bGw6dC5wYXJlbnR9ZnVuY3Rpb24gUG8odCxlKXtudWxsIT09dCYmKHQuY29sb3I9ZSl9ZnVuY3Rpb24gUm8odCl7cmV0dXJuIG51bGw9PT10P251bGw6dC5sZWZ0fWZ1bmN0aW9uIEJvKHQpe3JldHVybiBudWxsPT09dD9udWxsOnQucmlnaHR9ZnVuY3Rpb24ga28oKXt0aGlzLnJvb3RfPW51bGwsdGhpcy5zaXplXz0wfWtvLnByb3RvdHlwZT1uZXcgTm8sa28ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5yb290XztudWxsIT09ZTspe3ZhciBuPXQuY29tcGFyZVRvKGUua2V5KTtpZihuPDApZT1lLmxlZnQ7ZWxzZXtpZighKG4+MCkpcmV0dXJuIGUudmFsdWU7ZT1lLnJpZ2h0fX1yZXR1cm4gbnVsbH0sa28ucHJvdG90eXBlLnB1dD1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10aGlzLnJvb3RfKXJldHVybiB0aGlzLnJvb3RfPXtrZXk6dCx2YWx1ZTplLGxlZnQ6bnVsbCxyaWdodDpudWxsLHBhcmVudDpudWxsLGNvbG9yOjAsZ2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX0sZ2V0S2V5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2V5fX0sdGhpcy5zaXplXz0xLG51bGw7dmFyIG4scixpPXRoaXMucm9vdF87ZG97aWYobj1pLChyPXQuY29tcGFyZVRvKGkua2V5KSk8MClpPWkubGVmdDtlbHNle2lmKCEocj4wKSl7dmFyIG89aS52YWx1ZTtyZXR1cm4gaS52YWx1ZT1lLG99aT1pLnJpZ2h0fX13aGlsZShudWxsIT09aSk7dmFyIHM9e2tleTp0LGxlZnQ6bnVsbCxyaWdodDpudWxsLHZhbHVlOmUscGFyZW50Om4sY29sb3I6MCxnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfSxnZXRLZXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rZXl9fTtyZXR1cm4gcjwwP24ubGVmdD1zOm4ucmlnaHQ9cyx0aGlzLmZpeEFmdGVySW5zZXJ0aW9uKHMpLHRoaXMuc2l6ZV8rKyxudWxsfSxrby5wcm90b3R5cGUuZml4QWZ0ZXJJbnNlcnRpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztmb3IodC5jb2xvcj0xO251bGwhPXQmJnQhPT10aGlzLnJvb3RfJiYxPT09dC5wYXJlbnQuY29sb3I7KWlmKExvKHQpPT09Um8oTG8oTG8odCkpKSl7dmFyIG49Qm8oTG8oTG8odCkpKTsxPT09T28obik/KFBvKExvKHQpLDApLFBvKG4sMCksUG8oTG8oTG8odCkpLDEpLHQ9TG8oTG8odCkpKToodD09PUJvKExvKHQpKSYmKHQ9TG8odCksZS5yb3RhdGVMZWZ0KHQpKSxQbyhMbyh0KSwwKSxQbyhMbyhMbyh0KSksMSksZS5yb3RhdGVSaWdodChMbyhMbyh0KSkpKX1lbHNle3ZhciByPVJvKExvKExvKHQpKSk7MT09PU9vKHIpPyhQbyhMbyh0KSwwKSxQbyhyLDApLFBvKExvKExvKHQpKSwxKSx0PUxvKExvKHQpKSk6KHQ9PT1SbyhMbyh0KSkmJih0PUxvKHQpLGUucm90YXRlUmlnaHQodCkpLFBvKExvKHQpLDApLFBvKExvKExvKHQpKSwxKSxlLnJvdGF0ZUxlZnQoTG8oTG8odCkpKSl9dGhpcy5yb290Xy5jb2xvcj0wfSxrby5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHhvLGU9dGhpcy5nZXRGaXJzdEVudHJ5KCk7aWYobnVsbCE9PWUpZm9yKHQuYWRkKGUudmFsdWUpO251bGwhPT0oZT1rby5zdWNjZXNzb3IoZSkpOyl0LmFkZChlLnZhbHVlKTtyZXR1cm4gdH0sa28ucHJvdG90eXBlLmVudHJ5U2V0PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEZvLGU9dGhpcy5nZXRGaXJzdEVudHJ5KCk7aWYobnVsbCE9PWUpZm9yKHQuYWRkKGUpO251bGwhPT0oZT1rby5zdWNjZXNzb3IoZSkpOyl0LmFkZChlKTtyZXR1cm4gdH0sa28ucHJvdG90eXBlLnJvdGF0ZUxlZnQ9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dmFyIGU9dC5yaWdodDt0LnJpZ2h0PWUubGVmdCxudWxsIT1lLmxlZnQmJihlLmxlZnQucGFyZW50PXQpLGUucGFyZW50PXQucGFyZW50LG51bGw9PT10LnBhcmVudD90aGlzLnJvb3RfPWU6dC5wYXJlbnQubGVmdD09PXQ/dC5wYXJlbnQubGVmdD1lOnQucGFyZW50LnJpZ2h0PWUsZS5sZWZ0PXQsdC5wYXJlbnQ9ZX19LGtvLnByb3RvdHlwZS5yb3RhdGVSaWdodD1mdW5jdGlvbih0KXtpZihudWxsIT10KXt2YXIgZT10LmxlZnQ7dC5sZWZ0PWUucmlnaHQsbnVsbCE9ZS5yaWdodCYmKGUucmlnaHQucGFyZW50PXQpLGUucGFyZW50PXQucGFyZW50LG51bGw9PT10LnBhcmVudD90aGlzLnJvb3RfPWU6dC5wYXJlbnQucmlnaHQ9PT10P3QucGFyZW50LnJpZ2h0PWU6dC5wYXJlbnQubGVmdD1lLGUucmlnaHQ9dCx0LnBhcmVudD1lfX0sa28ucHJvdG90eXBlLmdldEZpcnN0RW50cnk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJvb3RfO2lmKG51bGwhPXQpZm9yKDtudWxsIT10LmxlZnQ7KXQ9dC5sZWZ0O3JldHVybiB0fSxrby5zdWNjZXNzb3I9ZnVuY3Rpb24odCl7aWYobnVsbD09PXQpcmV0dXJuIG51bGw7aWYobnVsbCE9PXQucmlnaHQpe2Zvcih2YXIgZT10LnJpZ2h0O251bGwhPT1lLmxlZnQ7KWU9ZS5sZWZ0O3JldHVybiBlfWZvcih2YXIgbj10LnBhcmVudCxyPXQ7bnVsbCE9PW4mJnI9PT1uLnJpZ2h0OylyPW4sbj1uLnBhcmVudDtyZXR1cm4gbn0sa28ucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaXplX307dmFyIHpvPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBqbygpe31mdW5jdGlvbiBVbygpe3RoaXMuYXJyYXlfPVtdLGFyZ3VtZW50c1swXWluc3RhbmNlb2YgZ28mJnRoaXMuYWRkQWxsKGFyZ3VtZW50c1swXSl9em8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHpvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB6b30sam8ucHJvdG90eXBlPW5ldyBNbyxVby5wcm90b3R5cGU9bmV3IGpvLFVvLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXtpZigwPT09dGhpcy5hcnJheV9bZV0uY29tcGFyZVRvKHQpKXJldHVybiEwfXJldHVybiExfSxVby5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2lmKHRoaXMuY29udGFpbnModCkpcmV0dXJuITE7Zm9yKHZhciBlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl7aWYoMT09PXRoaXMuYXJyYXlfW2VdLmNvbXBhcmVUbyh0KSlyZXR1cm4gdGhpcy5hcnJheV8uc3BsaWNlKGUsMCx0KSwhMH1yZXR1cm4gdGhpcy5hcnJheV8ucHVzaCh0KSwhMH0sVW8ucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSk7cmV0dXJuITB9LFVvLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IElvfSxVby5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5Xy5sZW5ndGh9LFVvLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9LFVvLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXQucHVzaCh0aGlzLmFycmF5X1tlXSk7cmV0dXJuIHR9LFVvLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgcW8odGhpcyl9O3ZhciBxbz1mdW5jdGlvbih0KXt0aGlzLnRyZWVTZXRfPXQsdGhpcy5wb3NpdGlvbl89MH07cW8ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvc2l0aW9uXz09PXRoaXMudHJlZVNldF8uc2l6ZSgpKXRocm93IG5ldyBfbztyZXR1cm4gdGhpcy50cmVlU2V0Xy5hcnJheV9bdGhpcy5wb3NpdGlvbl8rK119LHFvLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb25fPHRoaXMudHJlZVNldF8uc2l6ZSgpfSxxby5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IElvfTt2YXIgVm89ZnVuY3Rpb24oKXt9O1ZvLnNvcnQ9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpPWFyZ3VtZW50c1swXTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY29tcGFyZVRvKGUpfSxpLnNvcnQocik7ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCluPWFyZ3VtZW50c1sxXSxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY29tcGFyZSh0LGUpfSxpLnNvcnQocik7ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7KGU9aS5zbGljZShhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKSkuc29ydCgpO3ZhciBvPWkuc2xpY2UoMCxhcmd1bWVudHNbMV0pLmNvbmNhdChlLGkuc2xpY2UoYXJndW1lbnRzWzJdLGkubGVuZ3RoKSk7Zm9yKGkuc3BsaWNlKDAsaS5sZW5ndGgpLHQ9MDt0PG8ubGVuZ3RoO3QrKylpLnB1c2gob1t0XSl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aClmb3IoZT1pLnNsaWNlKGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pLG49YXJndW1lbnRzWzNdLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5jb21wYXJlKHQsZSl9LGUuc29ydChyKSxvPWkuc2xpY2UoMCxhcmd1bWVudHNbMV0pLmNvbmNhdChlLGkuc2xpY2UoYXJndW1lbnRzWzJdLGkubGVuZ3RoKSksaS5zcGxpY2UoMCxpLmxlbmd0aCksdD0wO3Q8by5sZW5ndGg7dCsrKWkucHVzaChvW3RdKX0sVm8uYXNMaXN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj0wLHI9dC5sZW5ndGg7bjxyO24rKyllLmFkZCh0W25dKTtyZXR1cm4gZX07dmFyIEdvPWZ1bmN0aW9uKCl7fSxZbz17UDp7Y29uZmlndXJhYmxlOiEwfSxMOntjb25maWd1cmFibGU6ITB9LEE6e2NvbmZpZ3VyYWJsZTohMH0sRkFMU0U6e2NvbmZpZ3VyYWJsZTohMH0sVFJVRTp7Y29uZmlndXJhYmxlOiEwfSxET05UQ0FSRTp7Y29uZmlndXJhYmxlOiEwfSxTWU1fRkFMU0U6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX1RSVUU6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX0RPTlRDQVJFOntjb25maWd1cmFibGU6ITB9LFNZTV9QOntjb25maWd1cmFibGU6ITB9LFNZTV9MOntjb25maWd1cmFibGU6ITB9LFNZTV9BOntjb25maWd1cmFibGU6ITB9fTtZby5QLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxZby5MLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxZby5BLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxZby5GQUxTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMX0sWW8uVFJVRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMn0sWW8uRE9OVENBUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTN9LFlvLlNZTV9GQUxTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iRiJ9LFlvLlNZTV9UUlVFLmdldD1mdW5jdGlvbigpe3JldHVybiJUIn0sWW8uU1lNX0RPTlRDQVJFLmdldD1mdW5jdGlvbigpe3JldHVybiIqIn0sWW8uU1lNX1AuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIjAifSxZby5TWU1fTC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iMSJ9LFlvLlNZTV9BLmdldD1mdW5jdGlvbigpe3JldHVybiIyIn0sR28ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEdvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBHb30sR28udG9EaW1lbnNpb25TeW1ib2w9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgR28uRkFMU0U6cmV0dXJuIEdvLlNZTV9GQUxTRTtjYXNlIEdvLlRSVUU6cmV0dXJuIEdvLlNZTV9UUlVFO2Nhc2UgR28uRE9OVENBUkU6cmV0dXJuIEdvLlNZTV9ET05UQ0FSRTtjYXNlIEdvLlA6cmV0dXJuIEdvLlNZTV9QO2Nhc2UgR28uTDpyZXR1cm4gR28uU1lNX0w7Y2FzZSBHby5BOnJldHVybiBHby5TWU1fQX10aHJvdyBuZXcgaGl9LEdvLnRvRGltZW5zaW9uVmFsdWU9ZnVuY3Rpb24odCl7c3dpdGNoKElpLnRvVXBwZXJDYXNlKHQpKXtjYXNlIEdvLlNZTV9GQUxTRTpyZXR1cm4gR28uRkFMU0U7Y2FzZSBHby5TWU1fVFJVRTpyZXR1cm4gR28uVFJVRTtjYXNlIEdvLlNZTV9ET05UQ0FSRTpyZXR1cm4gR28uRE9OVENBUkU7Y2FzZSBHby5TWU1fUDpyZXR1cm4gR28uUDtjYXNlIEdvLlNZTV9MOnJldHVybiBHby5MO2Nhc2UgR28uU1lNX0E6cmV0dXJuIEdvLkF9dGhyb3cgbmV3IGhpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhHbyxZbyk7dmFyIFhvPWZ1bmN0aW9uKCl7fTtYby5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe30sWG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFhvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYb307dmFyIFdvPWZ1bmN0aW9uKCl7fTtXby5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQsZSl7fSxXby5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7fSxXby5wcm90b3R5cGUuaXNHZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXt9LFdvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxXby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gV299O3ZhciBIbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7aWYodC5jYWxsKHRoaXMsbiksdGhpcy5fZ2VvbWV0cmllcz1lfHxbXSx0Lmhhc051bGxFbGVtZW50cyh0aGlzLl9nZW9tZXRyaWVzKSl0aHJvdyBuZXcgaGl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgamksZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKXQuZXhwYW5kVG9JbmNsdWRlKHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlOPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9nZW9tZXRyaWVzW3RdfSxlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5nZXROdW1Qb2ludHMoKSkuZmlsbChudWxsKSxlPS0xLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKylmb3IodmFyIHI9dGhpcy5fZ2VvbWV0cmllc1tuXS5nZXRDb29yZGluYXRlcygpLGk9MDtpPHIubGVuZ3RoO2krKyl0WysrZV09cltpXTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0QXJlYT1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0Kz10aGlzLl9nZW9tZXRyaWVzW2VdLmdldEFyZWEoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKCF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpKXJldHVybiExO3ZhciByPWU7aWYodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGghPT1yLl9nZW9tZXRyaWVzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGk9MDtpPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2krKylpZighdGhpcy5fZ2VvbWV0cmllc1tpXS5lcXVhbHNFeGFjdChyLl9nZW9tZXRyaWVzW2ldLG4pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7dCsrKXRoaXMuX2dlb21ldHJpZXNbdF0ubm9ybWFsaXplKCk7Vm8uc29ydCh0aGlzLl9nZW9tZXRyaWVzKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9udWxsOnRoaXMuX2dlb21ldHJpZXNbMF0uZ2V0Q29vcmRpbmF0ZSgpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1Hby5GQUxTRSxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdD1NYXRoLm1heCh0LHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0Qm91bmRhcnlEaW1lbnNpb24oKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1Hby5GQUxTRSxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdD1NYXRoLm1heCh0LHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0RGltZW5zaW9uKCkpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdCs9dGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRMZW5ndGgoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0TnVtUG9pbnRzKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldE51bUdlb21ldHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2VvbWV0cmllcy5sZW5ndGh9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgsZT1uZXcgQXJyYXkodCkuZmlsbChudWxsKSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZVtuXT10aGlzLl9nZW9tZXRyaWVzW25dLnJldmVyc2UoKTtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKGUpfSxlLnByb3RvdHlwZS5jb21wYXJlVG9TYW1lQ2xhc3M9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IFVvKFZvLmFzTGlzdCh0aGlzLl9nZW9tZXRyaWVzKSksbj1uZXcgVW8oVm8uYXNMaXN0KHQuX2dlb21ldHJpZXMpKTtyZXR1cm4gdGhpcy5jb21wYXJlKGUsbil9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgcj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMF0sbz10aGlzLmdldE51bUdlb21ldHJpZXMoKSxzPWkuZ2V0TnVtR2VvbWV0cmllcygpLGE9MDthPG8mJmE8czspe3ZhciB1PXRoaXMuZ2V0R2VvbWV0cnlOKGEpLGM9aS5nZXRHZW9tZXRyeU4oYSksbD11LmNvbXBhcmVUb1NhbWVDbGFzcyhjLHIpO2lmKDAhPT1sKXJldHVybiBsO2ErK31yZXR1cm4gYTxvPzE6YTxzPy0xOjB9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoRWkoYXJndW1lbnRzWzBdLGFvKSlmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyl0Ll9nZW9tZXRyaWVzW25dLmFwcGx5KGUpO2Vsc2UgaWYoRWkoYXJndW1lbnRzWzBdLFdvKSl7dmFyIHI9YXJndW1lbnRzWzBdO2lmKDA9PT10aGlzLl9nZW9tZXRyaWVzLmxlbmd0aClyZXR1cm4gbnVsbDtmb3IodmFyIGk9MDtpPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoJiYodC5fZ2VvbWV0cmllc1tpXS5hcHBseShyKSwhci5pc0RvbmUoKSk7aSsrKTtyLmlzR2VvbWV0cnlDaGFuZ2VkKCkmJnRoaXMuZ2VvbWV0cnlDaGFuZ2VkKCl9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0sWG8pKXt2YXIgbz1hcmd1bWVudHNbMF07by5maWx0ZXIodGhpcyk7Zm9yKHZhciBzPTA7czx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtzKyspdC5fZ2VvbWV0cmllc1tzXS5hcHBseShvKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxybykpe3ZhciBhPWFyZ3VtZW50c1swXTthLmZpbHRlcih0aGlzKTtmb3IodmFyIHU9MDt1PHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO3UrKyl0Ll9nZW9tZXRyaWVzW3VdLmFwcGx5KGEpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0aGlzKSxaaS5zaG91bGROZXZlclJlYWNoSGVyZSgpLG51bGx9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtlLl9nZW9tZXRyaWVzPW5ldyBBcnJheSh0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCkuZmlsbChudWxsKTtmb3IodmFyIG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyllLl9nZW9tZXRyaWVzW25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY2xvbmUoKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIkdlb21ldHJ5Q29sbGVjdGlvbiJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPHQubGVuZ3RoO24rKyl0W25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY29weSgpO3JldHVybiBuZXcgZSh0LHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDt0KyspaWYoIXRoaXMuX2dlb21ldHJpZXNbdF0uaXNFbXB0eSgpKXJldHVybiExO3JldHVybiEwfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4NGYwN2JjYjFmODU3ZDgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShpbyksWm89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIGlvLlNPUlRJTkRFWF9NVUxUSUxJTkVTVFJJTkd9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4hIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkmJnQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmNhbGwodGhpcyxlLG4pfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNDbG9zZWQoKT9Hby5GQUxTRTowfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO2Zvcih2YXIgdD0wO3Q8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7dCsrKWlmKCF0aGlzLl9nZW9tZXRyaWVzW3RdLmlzQ2xvc2VkKCkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dlb21ldHJpZXMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLmZpbGwobnVsbCksbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKWVbdC0xLW5dPXRoaXMuX2dlb21ldHJpZXNbbl0ucmV2ZXJzZSgpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoZSl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBLbyh0aGlzKS5nZXRCb3VuZGFyeSgpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTXVsdGlMaW5lU3RyaW5nIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3pvXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDcxNTVkMmFiNGFmYTgwMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oSG8pLEtvPWZ1bmN0aW9uKCl7aWYodGhpcy5fZ2VvbT1udWxsLHRoaXMuX2dlb21GYWN0PW51bGwsdGhpcy5fYm5SdWxlPW51bGwsdGhpcy5fZW5kcG9pbnRNYXA9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dW8uTU9EMl9CT1VOREFSWV9SVUxFO3RoaXMuX2dlb209dCx0aGlzLl9nZW9tRmFjdD10LmdldEZhY3RvcnkoKSx0aGlzLl9iblJ1bGU9ZX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbT1uLHRoaXMuX2dlb21GYWN0PW4uZ2V0RmFjdG9yeSgpLHRoaXMuX2JuUnVsZT1yfX07S28ucHJvdG90eXBlLmJvdW5kYXJ5TXVsdGlMaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2dlb20uaXNFbXB0eSgpKXJldHVybiB0aGlzLmdldEVtcHR5TXVsdGlQb2ludCgpO3ZhciBlPXRoaXMuY29tcHV0ZUJvdW5kYXJ5Q29vcmRpbmF0ZXModCk7cmV0dXJuIDE9PT1lLmxlbmd0aD90aGlzLl9nZW9tRmFjdC5jcmVhdGVQb2ludChlWzBdKTp0aGlzLl9nZW9tRmFjdC5jcmVhdGVNdWx0aVBvaW50RnJvbUNvb3JkcyhlKX0sS28ucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dlb20gaW5zdGFuY2VvZiBhcz90aGlzLmJvdW5kYXJ5TGluZVN0cmluZyh0aGlzLl9nZW9tKTp0aGlzLl9nZW9tIGluc3RhbmNlb2YgWm8/dGhpcy5ib3VuZGFyeU11bHRpTGluZVN0cmluZyh0aGlzLl9nZW9tKTp0aGlzLl9nZW9tLmdldEJvdW5kYXJ5KCl9LEtvLnByb3RvdHlwZS5ib3VuZGFyeUxpbmVTdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dlb20uaXNFbXB0eSgpP3RoaXMuZ2V0RW1wdHlNdWx0aVBvaW50KCk6dC5pc0Nsb3NlZCgpP3RoaXMuX2JuUnVsZS5pc0luQm91bmRhcnkoMik/dC5nZXRTdGFydFBvaW50KCk6dGhpcy5fZ2VvbUZhY3QuY3JlYXRlTXVsdGlQb2ludCgpOnRoaXMuX2dlb21GYWN0LmNyZWF0ZU11bHRpUG9pbnQoW3QuZ2V0U3RhcnRQb2ludCgpLHQuZ2V0RW5kUG9pbnQoKV0pfSxLby5wcm90b3R5cGUuZ2V0RW1wdHlNdWx0aVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dlb21GYWN0LmNyZWF0ZU11bHRpUG9pbnQoKX0sS28ucHJvdG90eXBlLmNvbXB1dGVCb3VuZGFyeUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1uZXcgeG87dGhpcy5fZW5kcG9pbnRNYXA9bmV3IGtvO2Zvcih2YXIgcj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10LmdldEdlb21ldHJ5TihyKTswIT09aS5nZXROdW1Qb2ludHMoKSYmKGUuYWRkRW5kcG9pbnQoaS5nZXRDb29yZGluYXRlTigwKSksZS5hZGRFbmRwb2ludChpLmdldENvb3JkaW5hdGVOKGkuZ2V0TnVtUG9pbnRzKCktMSkpKX1mb3IodmFyIG89dGhpcy5fZW5kcG9pbnRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCksYT1zLmdldFZhbHVlKCkuY291bnQ7ZS5fYm5SdWxlLmlzSW5Cb3VuZGFyeShhKSYmbi5hZGQocy5nZXRLZXkoKSl9cmV0dXJuIERvLnRvQ29vcmRpbmF0ZUFycmF5KG4pfSxLby5wcm90b3R5cGUuYWRkRW5kcG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZW5kcG9pbnRNYXAuZ2V0KHQpO251bGw9PT1lJiYoZT1uZXcgSm8sdGhpcy5fZW5kcG9pbnRNYXAucHV0KHQsZSkpLGUuY291bnQrK30sS28ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEtvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBLb30sS28uZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IEtvKGFyZ3VtZW50c1swXSkuZ2V0Qm91bmRhcnkoKToyPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgS28oYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSkuZ2V0Qm91bmRhcnkoKTp2b2lkIDB9O3ZhciBKbz1mdW5jdGlvbigpe3RoaXMuY291bnQ9bnVsbH07ZnVuY3Rpb24gUW8oKXt9ZnVuY3Rpb24gJG8oKXt9Sm8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEpvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBKb307dmFyIHRzPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBlcygpe31mdW5jdGlvbiBucygpe31mdW5jdGlvbiBycygpe312YXIgaXM9ZnVuY3Rpb24oKXt9LG9zPXtORVdMSU5FOntjb25maWd1cmFibGU6ITB9LFNJTVBMRV9PUkRJTkFURV9GT1JNQVQ6e2NvbmZpZ3VyYWJsZTohMH19O2lzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxpcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaXN9LGlzLmNoYXJzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyBBcnJheShlKS5maWxsKG51bGwpLHI9MDtyPGU7cisrKW5bcl09dDtyZXR1cm4gU3RyaW5nKG4pfSxpcy5nZXRTdGFja1RyYWNlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPW5ldyBlcyxuPW5ldyBRbztyZXR1cm4gdC5wcmludFN0YWNrVHJhY2UobiksZS50b1N0cmluZygpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMV0saT0iIjtuZXcgJG8oaXMuZ2V0U3RhY2tUcmFjZShhcmd1bWVudHNbMF0pKTtmb3IodmFyIG89bmV3IHJzLHM9MDtzPHI7cysrKXRyeXtpKz1vLnJlYWRMaW5lKCkraXMuTkVXTElORX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBucykpdGhyb3cgdDtaaS5zaG91bGROZXZlclJlYWNoSGVyZSgpfXJldHVybiBpfX0saXMuc3BsaXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5sZW5ndGgscj1uZXcgeG8saT0iIit0LG89aS5pbmRleE9mKGUpO28+PTA7KXt2YXIgcz1pLnN1YnN0cmluZygwLG8pO3IuYWRkKHMpLG89KGk9aS5zdWJzdHJpbmcobytuKSkuaW5kZXhPZihlKX1pLmxlbmd0aD4wJiZyLmFkZChpKTtmb3IodmFyIGE9bmV3IEFycmF5KHIuc2l6ZSgpKS5maWxsKG51bGwpLHU9MDt1PGEubGVuZ3RoO3UrKylhW3VdPXIuZ2V0KHUpO3JldHVybiBhfSxpcy50b1N0cmluZz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGlzLlNJTVBMRV9PUkRJTkFURV9GT1JNQVQuZm9ybWF0KHQpfX0saXMuc3BhY2VzPWZ1bmN0aW9uKHQpe3JldHVybiBpcy5jaGFycygiICIsdCl9LG9zLk5FV0xJTkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGtpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpfSxvcy5TSU1QTEVfT1JESU5BVEVfRk9STUFULmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgdHN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGlzLG9zKTt2YXIgc3M9ZnVuY3Rpb24oKXt9O3NzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxzcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gc3N9LHNzLmNvcHlDb29yZD1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9TWF0aC5taW4odC5nZXREaW1lbnNpb24oKSxuLmdldERpbWVuc2lvbigpKSxvPTA7bzxpO28rKyluLnNldE9yZGluYXRlKHIsbyx0LmdldE9yZGluYXRlKGUsbykpfSxzcy5pc1Jpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dC5zaXplKCk7cmV0dXJuIDA9PT1lfHwhKGU8PTMpJiYodC5nZXRPcmRpbmF0ZSgwLExpLlgpPT09dC5nZXRPcmRpbmF0ZShlLTEsTGkuWCkmJnQuZ2V0T3JkaW5hdGUoMCxMaS5ZKT09PXQuZ2V0T3JkaW5hdGUoZS0xLExpLlkpKX0sc3MuaXNFcXVhbD1mdW5jdGlvbih0LGUpe3ZhciBuPXQuc2l6ZSgpO2lmKG4hPT1lLnNpemUoKSlyZXR1cm4hMTtmb3IodmFyIHI9TWF0aC5taW4odC5nZXREaW1lbnNpb24oKSxlLmdldERpbWVuc2lvbigpKSxpPTA7aTxuO2krKylmb3IodmFyIG89MDtvPHI7bysrKXt2YXIgcz10LmdldE9yZGluYXRlKGksbyksYT1lLmdldE9yZGluYXRlKGksbyk7aWYoISh0LmdldE9yZGluYXRlKGksbyk9PT1lLmdldE9yZGluYXRlKGksbyl8fGZpLmlzTmFOKHMpJiZmaS5pc05hTihhKSkpcmV0dXJuITF9cmV0dXJuITB9LHNzLmV4dGVuZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5jcmVhdGUobixlLmdldERpbWVuc2lvbigpKSxpPWUuc2l6ZSgpO2lmKHNzLmNvcHkoZSwwLHIsMCxpKSxpPjApZm9yKHZhciBvPWk7bzxuO28rKylzcy5jb3B5KGUsaS0xLHIsbywxKTtyZXR1cm4gcn0sc3MucmV2ZXJzZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5zaXplKCktMSxuPU1hdGgudHJ1bmMoZS8yKSxyPTA7cjw9bjtyKyspc3Muc3dhcCh0LHIsZS1yKX0sc3Muc3dhcD1mdW5jdGlvbih0LGUsbil7aWYoZT09PW4pcmV0dXJuIG51bGw7Zm9yKHZhciByPTA7cjx0LmdldERpbWVuc2lvbigpO3IrKyl7dmFyIGk9dC5nZXRPcmRpbmF0ZShlLHIpO3Quc2V0T3JkaW5hdGUoZSxyLHQuZ2V0T3JkaW5hdGUobixyKSksdC5zZXRPcmRpbmF0ZShuLHIsaSl9fSxzcy5jb3B5PWZ1bmN0aW9uKHQsZSxuLHIsaSl7Zm9yKHZhciBvPTA7bzxpO28rKylzcy5jb3B5Q29vcmQodCxlK28sbixyK28pfSxzcy50b1N0cmluZz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT10LnNpemUoKTtpZigwPT09ZSlyZXR1cm4iKCkiO3ZhciBuPXQuZ2V0RGltZW5zaW9uKCkscj1uZXcgQWk7ci5hcHBlbmQoIigiKTtmb3IodmFyIGk9MDtpPGU7aSsrKXtpPjAmJnIuYXBwZW5kKCIgIik7Zm9yKHZhciBvPTA7bzxuO28rKylvPjAmJnIuYXBwZW5kKCIsIiksci5hcHBlbmQoaXMudG9TdHJpbmcodC5nZXRPcmRpbmF0ZShpLG8pKSl9cmV0dXJuIHIuYXBwZW5kKCIpIiksci50b1N0cmluZygpfX0sc3MuZW5zdXJlVmFsaWRSaW5nPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5zaXplKCk7cmV0dXJuIDA9PT1uP2U6bjw9Mz9zcy5jcmVhdGVDbG9zZWRSaW5nKHQsZSw0KTplLmdldE9yZGluYXRlKDAsTGkuWCk9PT1lLmdldE9yZGluYXRlKG4tMSxMaS5YKSYmZS5nZXRPcmRpbmF0ZSgwLExpLlkpPT09ZS5nZXRPcmRpbmF0ZShuLTEsTGkuWSk/ZTpzcy5jcmVhdGVDbG9zZWRSaW5nKHQsZSxuKzEpfSxzcy5jcmVhdGVDbG9zZWRSaW5nPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNyZWF0ZShuLGUuZ2V0RGltZW5zaW9uKCkpLGk9ZS5zaXplKCk7c3MuY29weShlLDAsciwwLGkpO2Zvcih2YXIgbz1pO288bjtvKyspc3MuY29weShlLDAscixvLDEpO3JldHVybiByfTt2YXIgYXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3QuY2FsbCh0aGlzLG4pLHRoaXMuX3BvaW50cz1udWxsLHRoaXMuaW5pdChlKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmNvbXB1dGVFbnZlbG9wZUludGVybmFsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP25ldyBqaTp0aGlzLl9wb2ludHMuZXhwYW5kRW52ZWxvcGUobmV3IGppKX0sZS5wcm90b3R5cGUuaXNSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNDbG9zZWQoKSYmdGhpcy5pc1NpbXBsZSgpfSxlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TT1JUSU5ERVhfTElORVNUUklOR30sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9pbnRzLnRvQ29vcmRpbmF0ZUFycmF5KCl9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZighdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSlyZXR1cm4hMTt2YXIgcj1lO2lmKHRoaXMuX3BvaW50cy5zaXplKCkhPT1yLl9wb2ludHMuc2l6ZSgpKXJldHVybiExO2Zvcih2YXIgaT0wO2k8dGhpcy5fcG9pbnRzLnNpemUoKTtpKyspaWYoIXRoaXMuZXF1YWwodGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUoaSksci5fcG9pbnRzLmdldENvb3JkaW5hdGUoaSksbikpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT0wO2U8TWF0aC50cnVuYyh0aGlzLl9wb2ludHMuc2l6ZSgpLzIpO2UrKyl7dmFyIG49dC5fcG9pbnRzLnNpemUoKS0xLWU7aWYoIXQuX3BvaW50cy5nZXRDb29yZGluYXRlKGUpLmVxdWFscyh0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShuKSkpcmV0dXJuIHQuX3BvaW50cy5nZXRDb29yZGluYXRlKGUpLmNvbXBhcmVUbyh0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShuKSk+MCYmc3MucmV2ZXJzZSh0Ll9wb2ludHMpLG51bGx9fSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP251bGw6dGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUoMCl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNDbG9zZWQoKT9Hby5GQUxTRTowfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzRW1wdHkoKSYmdGhpcy5nZXRDb29yZGluYXRlTigwKS5lcXVhbHMyRCh0aGlzLmdldENvb3JkaW5hdGVOKHRoaXMuZ2V0TnVtUG9pbnRzKCktMSkpfSxlLnByb3RvdHlwZS5nZXRFbmRQb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9udWxsOnRoaXMuZ2V0UG9pbnROKHRoaXMuZ2V0TnVtUG9pbnRzKCktMSl9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uY29tcHV0ZUxlbmd0aCh0aGlzLl9wb2ludHMpfSxlLnByb3RvdHlwZS5nZXROdW1Qb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9pbnRzLnNpemUoKX0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BvaW50cy5jb3B5KCk7cmV0dXJuIHNzLnJldmVyc2UodCksdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTGluZVN0cmluZyh0KX0sZS5wcm90b3R5cGUuY29tcGFyZVRvU2FtZUNsYXNzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD1hcmd1bWVudHNbMF0sZT0wLG49MDtlPHRoaXMuX3BvaW50cy5zaXplKCkmJm48dC5fcG9pbnRzLnNpemUoKTspe3ZhciByPXRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKGUpLmNvbXBhcmVUbyh0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShuKSk7aWYoMCE9PXIpcmV0dXJuIHI7ZSsrLG4rK31yZXR1cm4gZTx0aGlzLl9wb2ludHMuc2l6ZSgpPzE6bjx0Ll9wb2ludHMuc2l6ZSgpPy0xOjB9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzFdLmNvbXBhcmUodGhpcy5fcG9pbnRzLGkuX3BvaW50cyl9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe2lmKEVpKGFyZ3VtZW50c1swXSxhbykpZm9yKHZhciB0PWFyZ3VtZW50c1swXSxlPTA7ZTx0aGlzLl9wb2ludHMuc2l6ZSgpO2UrKyl0LmZpbHRlcih0aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZShlKSk7ZWxzZSBpZihFaShhcmd1bWVudHNbMF0sV28pKXt2YXIgbj1hcmd1bWVudHNbMF07aWYoMD09PXRoaXMuX3BvaW50cy5zaXplKCkpcmV0dXJuIG51bGw7Zm9yKHZhciByPTA7cjx0aGlzLl9wb2ludHMuc2l6ZSgpJiYobi5maWx0ZXIodGhpcy5fcG9pbnRzLHIpLCFuLmlzRG9uZSgpKTtyKyspO24uaXNHZW9tZXRyeUNoYW5nZWQoKSYmdGhpcy5nZW9tZXRyeUNoYW5nZWQoKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxYbykpe2FyZ3VtZW50c1swXS5maWx0ZXIodGhpcyl9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0scm8pKXthcmd1bWVudHNbMF0uZmlsdGVyKHRoaXMpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEtvKHRoaXMpLmdldEJvdW5kYXJ5KCl9LGUucHJvdG90eXBlLmlzRXF1aXZhbGVudENsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiBlLl9wb2ludHM9dGhpcy5fcG9pbnRzLmNsb25lKCksZX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZU49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKHQpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTGluZVN0cmluZyJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5fcG9pbnRzLmNvcHkoKSx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvaW50c30sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fcG9pbnRzLnNpemUoKX0sZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXtpZihudWxsPT09dCYmKHQ9dGhpcy5nZXRGYWN0b3J5KCkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpLDE9PT10LnNpemUoKSl0aHJvdyBuZXcgaGkoIkludmFsaWQgbnVtYmVyIG9mIHBvaW50cyBpbiBMaW5lU3RyaW5nIChmb3VuZCAiK3Quc2l6ZSgpKyIgLSBtdXN0IGJlIDAgb3IgPj0gMikiKTt0aGlzLl9wb2ludHM9dH0sZS5wcm90b3R5cGUuaXNDb29yZGluYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fcG9pbnRzLnNpemUoKTtlKyspaWYodGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUoZSkuZXF1YWxzKHQpKXJldHVybiEwO3JldHVybiExfSxlLnByb3RvdHlwZS5nZXRTdGFydFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP251bGw6dGhpcy5nZXRQb2ludE4oMCl9LGUucHJvdG90eXBlLmdldFBvaW50Tj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlUG9pbnQodGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUodCkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt6b119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHgyYjJiNTFiYTQzNWM4ZTAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGlvKSx1cz1mdW5jdGlvbigpe307dXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHVzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB1c307dmFyIGNzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt0LmNhbGwodGhpcyxuKSx0aGlzLl9jb29yZGluYXRlcz1lfHxudWxsLHRoaXMuaW5pdCh0aGlzLl9jb29yZGluYXRlcyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBuZXcgamk7dmFyIHQ9bmV3IGppO3JldHVybiB0LmV4cGFuZFRvSW5jbHVkZSh0aGlzLl9jb29yZGluYXRlcy5nZXRYKDApLHRoaXMuX2Nvb3JkaW5hdGVzLmdldFkoMCkpLHR9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9QT0lOVH0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/W106W3RoaXMuZ2V0Q29vcmRpbmF0ZSgpXX0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmKCEoIXRoaXMuaXNFbXB0eSgpfHwhZS5pc0VtcHR5KCkpfHx0aGlzLmlzRW1wdHkoKT09PWUuaXNFbXB0eSgpJiZ0aGlzLmVxdWFsKGUuZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLG4pKX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuX2Nvb3JkaW5hdGVzLnNpemUoKT90aGlzLl9jb29yZGluYXRlcy5nZXRDb29yZGluYXRlKDApOm51bGx9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIEdvLkZBTFNFfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPzA6MX0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvcHkoKX0sZS5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLmdldENvb3JkaW5hdGUoKSl0aHJvdyBuZXcgRXJyb3IoImdldFggY2FsbGVkIG9uIGVtcHR5IFBvaW50Iik7cmV0dXJuIHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLnh9LGUucHJvdG90eXBlLmNvbXBhcmVUb1NhbWVDbGFzcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLmNvbXBhcmVUbyh0LmdldENvb3JkaW5hdGUoKSl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzFdLmNvbXBhcmUodGhpcy5fY29vcmRpbmF0ZXMsZS5fY29vcmRpbmF0ZXMpfX0sZS5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oKXtpZihFaShhcmd1bWVudHNbMF0sYW8pKXt2YXIgdD1hcmd1bWVudHNbMF07aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dC5maWx0ZXIodGhpcy5nZXRDb29yZGluYXRlKCkpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLFdvKSl7dmFyIGU9YXJndW1lbnRzWzBdO2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBudWxsO2UuZmlsdGVyKHRoaXMuX2Nvb3JkaW5hdGVzLDApLGUuaXNHZW9tZXRyeUNoYW5nZWQoKSYmdGhpcy5nZW9tZXRyeUNoYW5nZWQoKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxYbykpe2FyZ3VtZW50c1swXS5maWx0ZXIodGhpcyl9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0scm8pKXthcmd1bWVudHNbMF0uZmlsdGVyKHRoaXMpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKG51bGwpfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7cmV0dXJuIGUuX2Nvb3JkaW5hdGVzPXRoaXMuX2Nvb3JkaW5hdGVzLmNsb25lKCksZX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIlBvaW50In0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLl9jb29yZGluYXRlcy5jb3B5KCksdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVTZXF1ZW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlc30sZS5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLmdldENvb3JkaW5hdGUoKSl0aHJvdyBuZXcgRXJyb3IoImdldFkgY2FsbGVkIG9uIGVtcHR5IFBvaW50Iik7cmV0dXJuIHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLnl9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuX2Nvb3JkaW5hdGVzLnNpemUoKX0sZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXtudWxsPT09dCYmKHQ9dGhpcy5nZXRGYWN0b3J5KCkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpLFppLmlzVHJ1ZSh0LnNpemUoKTw9MSksdGhpcy5fY29vcmRpbmF0ZXM9dH0sZS5wcm90b3R5cGUuaXNTaW1wbGU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdXNdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NDQwNzdiYWQxNjFjYmMwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShpbyksbHM9ZnVuY3Rpb24oKXt9O2xzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxscy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbHN9O3ZhciBocz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXtpZih0LmNhbGwodGhpcyxyKSx0aGlzLl9zaGVsbD1udWxsLHRoaXMuX2hvbGVzPW51bGwsbnVsbD09PWUmJihlPXRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVhclJpbmcoKSksbnVsbD09PW4mJihuPVtdKSx0Lmhhc051bGxFbGVtZW50cyhuKSl0aHJvdyBuZXcgaGk7aWYoZS5pc0VtcHR5KCkmJnQuaGFzTm9uRW1wdHlFbGVtZW50cyhuKSl0aHJvdyBuZXcgaGk7dGhpcy5fc2hlbGw9ZSx0aGlzLl9ob2xlcz1ufXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hlbGwuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpfSxlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TT1JUSU5ERVhfUE9MWUdPTn0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm5bXTtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuZ2V0TnVtUG9pbnRzKCkpLmZpbGwobnVsbCksZT0tMSxuPXRoaXMuX3NoZWxsLmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGg7cisrKXRbKytlXT1uW3JdO2Zvcih2YXIgaT0wO2k8dGhpcy5faG9sZXMubGVuZ3RoO2krKylmb3IodmFyIG89dGhpcy5faG9sZXNbaV0uZ2V0Q29vcmRpbmF0ZXMoKSxzPTA7czxvLmxlbmd0aDtzKyspdFsrK2VdPW9bc107cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXt2YXIgdD0wO3QrPU1hdGguYWJzKGVvLnNpZ25lZEFyZWEodGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkpKTtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdC09TWF0aC5hYnMoZW8uc2lnbmVkQXJlYSh0aGlzLl9ob2xlc1tlXS5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSkpO3JldHVybiB0fSxlLnByb3RvdHlwZS5pc1JlY3RhbmdsZT1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmdldE51bUludGVyaW9yUmluZygpfHxudWxsPT09dGhpcy5fc2hlbGx8fDUhPT10aGlzLl9zaGVsbC5nZXROdW1Qb2ludHMoKSlyZXR1cm4hMTtmb3IodmFyIHQ9dGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksZT10aGlzLmdldEVudmVsb3BlSW50ZXJuYWwoKSxuPTA7bjw1O24rKyl7dmFyIHI9dC5nZXRYKG4pO2lmKHIhPT1lLmdldE1pblgoKSYmciE9PWUuZ2V0TWF4WCgpKXJldHVybiExO3ZhciBpPXQuZ2V0WShuKTtpZihpIT09ZS5nZXRNaW5ZKCkmJmkhPT1lLmdldE1heFkoKSlyZXR1cm4hMX1mb3IodmFyIG89dC5nZXRYKDApLHM9dC5nZXRZKDApLGE9MTthPD00O2ErKyl7dmFyIHU9dC5nZXRYKGEpLGM9dC5nZXRZKGEpO2lmKHUhPT1vPT09KGMhPT1zKSlyZXR1cm4hMTtvPXUscz1jfXJldHVybiEwfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYoIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkpcmV0dXJuITE7dmFyIHI9ZSxpPXRoaXMuX3NoZWxsLG89ci5fc2hlbGw7aWYoIWkuZXF1YWxzRXhhY3QobyxuKXx8dGhpcy5faG9sZXMubGVuZ3RoIT09ci5faG9sZXMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgcz0wO3M8dGhpcy5faG9sZXMubGVuZ3RoO3MrKylpZighdGhpcy5faG9sZXNbc10uZXF1YWxzRXhhY3Qoci5faG9sZXNbc10sbikpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe3RoaXMubm9ybWFsaXplKHRoaXMuX3NoZWxsLCEwKTtmb3IodmFyIHQ9MDt0PHRoaXMuX2hvbGVzLmxlbmd0aDt0KyspdGhpcy5ub3JtYWxpemUodGhpcy5faG9sZXNbdF0sITEpO1ZvLnNvcnQodGhpcy5faG9sZXMpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt2YXIgcj1uZXcgQXJyYXkoZS5nZXRDb29yZGluYXRlcygpLmxlbmd0aC0xKS5maWxsKG51bGwpO2tpLmFycmF5Y29weShlLmdldENvb3JkaW5hdGVzKCksMCxyLDAsci5sZW5ndGgpO3ZhciBpPURvLm1pbkNvb3JkaW5hdGUoZS5nZXRDb29yZGluYXRlcygpKTtEby5zY3JvbGwocixpKSxraS5hcnJheWNvcHkociwwLGUuZ2V0Q29vcmRpbmF0ZXMoKSwwLHIubGVuZ3RoKSxlLmdldENvb3JkaW5hdGVzKClbci5sZW5ndGhdPXJbMF0sZW8uaXNDQ1coZS5nZXRDb29yZGluYXRlcygpKT09PW4mJkRvLnJldmVyc2UoZS5nZXRDb29yZGluYXRlcygpKX19LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZSgpfSxlLnByb3RvdHlwZS5nZXROdW1JbnRlcmlvclJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faG9sZXMubGVuZ3RofSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMn0sZS5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9MDt0Kz10aGlzLl9zaGVsbC5nZXRMZW5ndGgoKTtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdCs9dGhpcy5faG9sZXNbZV0uZ2V0TGVuZ3RoKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9zaGVsbC5nZXROdW1Qb2ludHMoKSxlPTA7ZTx0aGlzLl9ob2xlcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2hvbGVzW2VdLmdldE51bVBvaW50cygpO3JldHVybiB0fSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb3B5KCk7dC5fc2hlbGw9dGhpcy5fc2hlbGwuY29weSgpLnJldmVyc2UoKSx0Ll9ob2xlcz1uZXcgQXJyYXkodGhpcy5faG9sZXMubGVuZ3RoKS5maWxsKG51bGwpO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0Ll9ob2xlc1tlXT10aGlzLl9ob2xlc1tlXS5jb3B5KCkucmV2ZXJzZSgpO3JldHVybiB0fSxlLnByb3RvdHlwZS5jb252ZXhIdWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RXh0ZXJpb3JSaW5nKCkuY29udmV4SHVsbCgpfSxlLnByb3RvdHlwZS5jb21wYXJlVG9TYW1lQ2xhc3M9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dGhpcy5fc2hlbGwsbj10Ll9zaGVsbDtyZXR1cm4gZS5jb21wYXJlVG9TYW1lQ2xhc3Mobil9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1swXSxvPXRoaXMuX3NoZWxsLHM9aS5fc2hlbGwsYT1vLmNvbXBhcmVUb1NhbWVDbGFzcyhzLHIpO2lmKDAhPT1hKXJldHVybiBhO2Zvcih2YXIgdT10aGlzLmdldE51bUludGVyaW9yUmluZygpLGM9aS5nZXROdW1JbnRlcmlvclJpbmcoKSxsPTA7bDx1JiZsPGM7KXt2YXIgaD10aGlzLmdldEludGVyaW9yUmluZ04obCksZj1pLmdldEludGVyaW9yUmluZ04obCkscD1oLmNvbXBhcmVUb1NhbWVDbGFzcyhmLHIpO2lmKDAhPT1wKXJldHVybiBwO2wrK31yZXR1cm4gbDx1PzE6bDxjPy0xOjB9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKEVpKHQsYW8pKXt0aGlzLl9zaGVsbC5hcHBseSh0KTtmb3IodmFyIG49MDtuPHRoaXMuX2hvbGVzLmxlbmd0aDtuKyspZS5faG9sZXNbbl0uYXBwbHkodCl9ZWxzZSBpZihFaSh0LFdvKSl7aWYodGhpcy5fc2hlbGwuYXBwbHkodCksIXQuaXNEb25lKCkpZm9yKHZhciByPTA7cjx0aGlzLl9ob2xlcy5sZW5ndGgmJihlLl9ob2xlc1tyXS5hcHBseSh0KSwhdC5pc0RvbmUoKSk7cisrKTt0LmlzR2VvbWV0cnlDaGFuZ2VkKCkmJnRoaXMuZ2VvbWV0cnlDaGFuZ2VkKCl9ZWxzZSBpZihFaSh0LFhvKSl0LmZpbHRlcih0aGlzKTtlbHNlIGlmKEVpKHQscm8pKXt0LmZpbHRlcih0aGlzKSx0aGlzLl9zaGVsbC5hcHBseSh0KTtmb3IodmFyIGk9MDtpPHRoaXMuX2hvbGVzLmxlbmd0aDtpKyspZS5faG9sZXNbaV0uYXBwbHkodCl9fSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoKTt2YXIgdD1uZXcgQXJyYXkodGhpcy5faG9sZXMubGVuZ3RoKzEpLmZpbGwobnVsbCk7dFswXT10aGlzLl9zaGVsbDtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdFtlKzFdPXRoaXMuX2hvbGVzW2VdO3JldHVybiB0Lmxlbmd0aDw9MT90aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lYXJSaW5nKHRbMF0uZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkpOnRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyh0KX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO2UuX3NoZWxsPXRoaXMuX3NoZWxsLmNsb25lKCksZS5faG9sZXM9bmV3IEFycmF5KHRoaXMuX2hvbGVzLmxlbmd0aCkuZmlsbChudWxsKTtmb3IodmFyIG49MDtuPHRoaXMuX2hvbGVzLmxlbmd0aDtuKyspZS5faG9sZXNbbl09dGhpcy5faG9sZXNbbl0uY2xvbmUoKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIlBvbHlnb24ifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3NoZWxsLmNvcHkoKSxuPW5ldyBBcnJheSh0aGlzLl9ob2xlcy5sZW5ndGgpLmZpbGwobnVsbCkscj0wO3I8bi5sZW5ndGg7cisrKW5bcl09dGhpcy5faG9sZXNbcl0uY29weSgpO3JldHVybiBuZXcgZSh0LG4sdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmdldEV4dGVyaW9yUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbH0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbC5pc0VtcHR5KCl9LGUucHJvdG90eXBlLmdldEludGVyaW9yUmluZ049ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2hvbGVzW3RdfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltsc119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHgzMDdmZmVmZDhkYzk3MjAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGlvKSxmcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gaW8uU09SVElOREVYX01VTFRJUE9JTlR9LGUucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0Q29vcmRpbmF0ZSgpfXJldHVybiB0LnByb3RvdHlwZS5nZXRDb29yZGluYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gR28uRkFMU0V9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAwfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obnVsbCl9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJNdWx0aVBvaW50In0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3VzXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDZmYjFlZDQxNjJlMGZjMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oSG8pLHBzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXtlIGluc3RhbmNlb2YgdmkmJm4gaW5zdGFuY2VvZiBJcyYmKGU9bi5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKGUpKSx0LmNhbGwodGhpcyxlLG4pLHRoaXMudmFsaWRhdGVDb25zdHJ1Y3Rpb24oKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17TUlOSU1VTV9WQUxJRF9TSVpFOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gaW8uU09SVElOREVYX0xJTkVBUlJJTkd9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIEdvLkZBTFNFfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5pc0VtcHR5KCl8fHQucHJvdG90eXBlLmlzQ2xvc2VkLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wb2ludHMuY29weSgpO3JldHVybiBzcy5yZXZlcnNlKHQpLHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVhclJpbmcodCl9LGUucHJvdG90eXBlLnZhbGlkYXRlQ29uc3RydWN0aW9uPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNFbXB0eSgpJiYhdC5wcm90b3R5cGUuaXNDbG9zZWQuY2FsbCh0aGlzKSl0aHJvdyBuZXcgaGk7aWYodGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2UoKS5zaXplKCk+PTEmJnRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkuc2l6ZSgpPGUuTUlOSU1VTV9WQUxJRF9TSVpFKXRocm93IG5ldyBoaSgiSW52YWxpZCBudW1iZXIgb2YgcG9pbnRzIGluIExpbmVhclJpbmcgKGZvdW5kICIrdGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2UoKS5zaXplKCkrIiAtIG11c3QgYmUgMCBvciA+PSA0KSIpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTGluZWFyUmluZyJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5fcG9pbnRzLmNvcHkoKSx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5NSU5JTVVNX1ZBTElEX1NJWkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDR9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHgzYjIyOWUyNjIzNjdhNjAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGFzKSxkcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gaW8uU09SVElOREVYX01VTFRJUE9MWUdPTn0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgsZT1uZXcgQXJyYXkodCkuZmlsbChudWxsKSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZVtuXT10aGlzLl9nZW9tZXRyaWVzW25dLnJldmVyc2UoKTtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlQb2x5Z29uKGUpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoKTtmb3IodmFyIHQ9bmV3IHhvLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKylmb3IodmFyIG49dGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRCb3VuZGFyeSgpLHI9MDtyPG4uZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl0LmFkZChuLmdldEdlb21ldHJ5TihyKSk7dmFyIGk9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcodC50b0FycmF5KGkpKX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIk11bHRpUG9seWdvbiJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPHQubGVuZ3RoO24rKyl0W25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY29weSgpO3JldHVybiBuZXcgZSh0LHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltsc119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHg3YTVhYTEzNjkxNzE5ODB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oSG8pLGdzPWZ1bmN0aW9uKHQpe3RoaXMuX2ZhY3Rvcnk9dHx8bnVsbCx0aGlzLl9pc1VzZXJEYXRhQ29waWVkPSExfSx5cz17Tm9PcEdlb21ldHJ5T3BlcmF0aW9uOntjb25maWd1cmFibGU6ITB9LENvb3JkaW5hdGVPcGVyYXRpb246e2NvbmZpZ3VyYWJsZTohMH0sQ29vcmRpbmF0ZVNlcXVlbmNlT3BlcmF0aW9uOntjb25maWd1cmFibGU6ITB9fTtncy5wcm90b3R5cGUuc2V0Q29weVVzZXJEYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX2lzVXNlckRhdGFDb3BpZWQ9dH0sZ3MucHJvdG90eXBlLmVkaXQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT09dClyZXR1cm4gbnVsbDt2YXIgbj10aGlzLmVkaXRJbnRlcm5hbCh0LGUpO3JldHVybiB0aGlzLl9pc1VzZXJEYXRhQ29waWVkJiZuLnNldFVzZXJEYXRhKHQuZ2V0VXNlckRhdGEoKSksbn0sZ3MucHJvdG90eXBlLmVkaXRJbnRlcm5hbD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT09dGhpcy5fZmFjdG9yeSYmKHRoaXMuX2ZhY3Rvcnk9dC5nZXRGYWN0b3J5KCkpLHQgaW5zdGFuY2VvZiBIbz90aGlzLmVkaXRHZW9tZXRyeUNvbGxlY3Rpb24odCxlKTp0IGluc3RhbmNlb2YgaHM/dGhpcy5lZGl0UG9seWdvbih0LGUpOnQgaW5zdGFuY2VvZiBjc3x8dCBpbnN0YW5jZW9mIGFzP2UuZWRpdCh0LHRoaXMuX2ZhY3RvcnkpOihaaS5zaG91bGROZXZlclJlYWNoSGVyZSgiVW5zdXBwb3J0ZWQgR2VvbWV0cnkgY2xhc3M6ICIrdC5nZXRDbGFzcygpLmdldE5hbWUoKSksbnVsbCl9LGdzLnByb3RvdHlwZS5lZGl0R2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuZWRpdCh0LHRoaXMuX2ZhY3RvcnkpLHI9bmV3IHhvLGk9MDtpPG4uZ2V0TnVtR2VvbWV0cmllcygpO2krKyl7dmFyIG89dGhpcy5lZGl0KG4uZ2V0R2VvbWV0cnlOKGkpLGUpO251bGw9PT1vfHxvLmlzRW1wdHkoKXx8ci5hZGQobyl9cmV0dXJuIG4uZ2V0Q2xhc3MoKT09PWZzP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTXVsdGlQb2ludChyLnRvQXJyYXkoW10pKTpuLmdldENsYXNzKCk9PT1abz90aGlzLl9mYWN0b3J5LmNyZWF0ZU11bHRpTGluZVN0cmluZyhyLnRvQXJyYXkoW10pKTpuLmdldENsYXNzKCk9PT1kcz90aGlzLl9mYWN0b3J5LmNyZWF0ZU11bHRpUG9seWdvbihyLnRvQXJyYXkoW10pKTp0aGlzLl9mYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihyLnRvQXJyYXkoW10pKX0sZ3MucHJvdG90eXBlLmVkaXRQb2x5Z29uPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5lZGl0KHQsdGhpcy5fZmFjdG9yeSk7aWYobnVsbD09PW4mJihuPXRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9seWdvbihudWxsKSksbi5pc0VtcHR5KCkpcmV0dXJuIG47dmFyIHI9dGhpcy5lZGl0KG4uZ2V0RXh0ZXJpb3JSaW5nKCksZSk7aWYobnVsbD09PXJ8fHIuaXNFbXB0eSgpKXJldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZVBvbHlnb24oKTtmb3IodmFyIGk9bmV3IHhvLG89MDtvPG4uZ2V0TnVtSW50ZXJpb3JSaW5nKCk7bysrKXt2YXIgcz10aGlzLmVkaXQobi5nZXRJbnRlcmlvclJpbmdOKG8pLGUpO251bGw9PT1zfHxzLmlzRW1wdHkoKXx8aS5hZGQocyl9cmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9seWdvbihyLGkudG9BcnJheShbXSkpfSxncy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZ3MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGdzfSxncy5HZW9tZXRyeUVkaXRvck9wZXJhdGlvbj1mdW5jdGlvbigpe30seXMuTm9PcEdlb21ldHJ5T3BlcmF0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiBtc30seXMuQ29vcmRpbmF0ZU9wZXJhdGlvbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdnN9LHlzLkNvb3JkaW5hdGVTZXF1ZW5jZU9wZXJhdGlvbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gX3N9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGdzLHlzKTt2YXIgbXM9ZnVuY3Rpb24oKXt9O21zLnByb3RvdHlwZS5lZGl0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR9LG1zLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltncy5HZW9tZXRyeUVkaXRvck9wZXJhdGlvbl19LG1zLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBtc307dmFyIHZzPWZ1bmN0aW9uKCl7fTt2cy5wcm90b3R5cGUuZWRpdD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZWRpdENvb3JkaW5hdGVzKHQuZ2V0Q29vcmRpbmF0ZXMoKSx0KTtyZXR1cm4gbnVsbD09PW4/dDp0IGluc3RhbmNlb2YgcHM/ZS5jcmVhdGVMaW5lYXJSaW5nKG4pOnQgaW5zdGFuY2VvZiBhcz9lLmNyZWF0ZUxpbmVTdHJpbmcobik6dCBpbnN0YW5jZW9mIGNzP24ubGVuZ3RoPjA/ZS5jcmVhdGVQb2ludChuWzBdKTplLmNyZWF0ZVBvaW50KCk6dH0sdnMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2dzLkdlb21ldHJ5RWRpdG9yT3BlcmF0aW9uXX0sdnMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHZzfTt2YXIgX3M9ZnVuY3Rpb24oKXt9O19zLnByb3RvdHlwZS5lZGl0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBwcz9lLmNyZWF0ZUxpbmVhclJpbmcodGhpcy5lZGl0KHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCkpOnQgaW5zdGFuY2VvZiBhcz9lLmNyZWF0ZUxpbmVTdHJpbmcodGhpcy5lZGl0KHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCkpOnQgaW5zdGFuY2VvZiBjcz9lLmNyZWF0ZVBvaW50KHRoaXMuZWRpdCh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpKTp0fSxfcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZ3MuR2VvbWV0cnlFZGl0b3JPcGVyYXRpb25dfSxfcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gX3N9O3ZhciB4cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5fZGltZW5zaW9uPTMsdGhpcy5fY29vcmRpbmF0ZXM9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl0aGlzLl9jb29yZGluYXRlcz1hcmd1bWVudHNbMF0sdGhpcy5fZGltZW5zaW9uPTM7ZWxzZSBpZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoZSkuZmlsbChudWxsKTtmb3IodmFyIG49MDtuPGU7bisrKXQuX2Nvb3JkaW5hdGVzW25dPW5ldyB2aX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxMaSkpe3ZhciByPWFyZ3VtZW50c1swXTtpZihudWxsPT09cilyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXM9bmV3IEFycmF5KDApLmZpbGwobnVsbCksbnVsbDt0aGlzLl9kaW1lbnNpb249ci5nZXREaW1lbnNpb24oKSx0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoci5zaXplKCkpLmZpbGwobnVsbCk7Zm9yKHZhciBpPTA7aTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7aSsrKXQuX2Nvb3JkaW5hdGVzW2ldPXIuZ2V0Q29vcmRpbmF0ZUNvcHkoaSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMV0pKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV07dGhpcy5fY29vcmRpbmF0ZXM9byx0aGlzLl9kaW1lbnNpb249cyxudWxsPT09byYmKHRoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheSgwKS5maWxsKG51bGwpKX1lbHNlIGlmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSYmTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMV0pKXt2YXIgYT1hcmd1bWVudHNbMF0sdT1hcmd1bWVudHNbMV07dGhpcy5fY29vcmRpbmF0ZXM9bmV3IEFycmF5KGEpLmZpbGwobnVsbCksdGhpcy5fZGltZW5zaW9uPXU7Zm9yKHZhciBjPTA7YzxhO2MrKyl0Ll9jb29yZGluYXRlc1tjXT1uZXcgdml9fSx3cz17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07eHMucHJvdG90eXBlLnNldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSxuKXtzd2l0Y2goZSl7Y2FzZSBMaS5YOnRoaXMuX2Nvb3JkaW5hdGVzW3RdLng9bjticmVhaztjYXNlIExpLlk6dGhpcy5fY29vcmRpbmF0ZXNbdF0ueT1uO2JyZWFrO2Nhc2UgTGkuWjp0aGlzLl9jb29yZGluYXRlc1t0XS56PW47YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgaGl9fSx4cy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGh9LHhzLnByb3RvdHlwZS5nZXRPcmRpbmF0ZT1mdW5jdGlvbih0LGUpe3N3aXRjaChlKXtjYXNlIExpLlg6cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLng7Y2FzZSBMaS5ZOnJldHVybiB0aGlzLl9jb29yZGluYXRlc1t0XS55O2Nhc2UgTGkuWjpyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0uen1yZXR1cm4gZmkuTmFOfSx4cy5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07bi54PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLngsbi55PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLnksbi56PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLnp9fSx4cy5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZUNvcHk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB2aSh0aGlzLl9jb29yZGluYXRlc1t0XSl9LHhzLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGltZW5zaW9ufSx4cy5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0ueH0seHMucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSkuZmlsbChudWxsKSxlPTA7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXRbZV09dGhpcy5fY29vcmRpbmF0ZXNbZV0uY2xvbmUoKTtyZXR1cm4gbmV3IHhzKHQsdGhpcy5fZGltZW5zaW9uKX0seHMucHJvdG90eXBlLmV4cGFuZEVudmVsb3BlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2UrKyl0LmV4cGFuZFRvSW5jbHVkZSh0aGlzLl9jb29yZGluYXRlc1tlXSk7cmV0dXJuIHR9LHhzLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSkuZmlsbChudWxsKSxlPTA7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXRbZV09dGhpcy5fY29vcmRpbmF0ZXNbZV0uY29weSgpO3JldHVybiBuZXcgeHModCx0aGlzLl9kaW1lbnNpb24pfSx4cy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg+MCl7dmFyIHQ9bmV3IEFpKDE3KnRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aCk7dC5hcHBlbmQoIigiKSx0LmFwcGVuZCh0aGlzLl9jb29yZGluYXRlc1swXSk7Zm9yKHZhciBlPTE7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXQuYXBwZW5kKCIsICIpLHQuYXBwZW5kKHRoaXMuX2Nvb3JkaW5hdGVzW2VdKTtyZXR1cm4gdC5hcHBlbmQoIikiKSx0LnRvU3RyaW5nKCl9cmV0dXJuIigpIn0seHMucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLnl9LHhzLnByb3RvdHlwZS50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlc30seHMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0xpLG1pXX0seHMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHhzfSx3cy5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weGNiNDRhNzc4ZGIxOGUwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeHMsd3MpO3ZhciBicz1mdW5jdGlvbigpe30sRHM9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0saW5zdGFuY2VPYmplY3Q6e2NvbmZpZ3VyYWJsZTohMH19O2JzLnByb3RvdHlwZS5yZWFkUmVzb2x2ZT1mdW5jdGlvbigpe3JldHVybiBicy5pbnN0YW5jZSgpfSxicy5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIG5ldyB4cyhhcmd1bWVudHNbMF0pO2lmKEVpKGFyZ3VtZW50c1swXSxMaSkpcmV0dXJuIG5ldyB4cyhhcmd1bWVudHNbMF0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtyZXR1cm4gZT4zJiYoZT0zKSxlPDI/bmV3IHhzKHQpOm5ldyB4cyh0LGUpfX0sYnMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3dpLG1pXX0sYnMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGJzfSxicy5pbnN0YW5jZT1mdW5jdGlvbigpe3JldHVybiBicy5pbnN0YW5jZU9iamVjdH0sRHMuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHgzOGU0OWZhNmNmNmYyZTAwfSxEcy5pbnN0YW5jZU9iamVjdC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGJzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhicyxEcyk7dmFyIEVzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5tYXBfPW5ldyBNYXB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tYXBfLmdldCh0KXx8bnVsbH0sZS5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubWFwXy5zZXQodCxlKSxlfSxlLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IHhvLGU9dGhpcy5tYXBfLnZhbHVlcygpLG49ZS5uZXh0KCk7IW4uZG9uZTspdC5hZGQobi52YWx1ZSksbj1lLm5leHQoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZW50cnlTZXQ9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRm87cmV0dXJuIHRoaXMubWFwXy5lbnRyaWVzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuYWRkKGUpfSkpLHR9LGUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXBfLnNpemUoKX0sZX0oQW8pLENzPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9tb2RlbFR5cGU9bnVsbCx0aGlzLl9zY2FsZT1udWxsLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuX21vZGVsVHlwZT10LkZMT0FUSU5HO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcyl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX21vZGVsVHlwZT1lLGU9PT10LkZJWEVEJiZ0aGlzLnNldFNjYWxlKDEpfWVsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLl9tb2RlbFR5cGU9dC5GSVhFRCx0aGlzLnNldFNjYWxlKG4pfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0KXt2YXIgcj1hcmd1bWVudHNbMF07dGhpcy5fbW9kZWxUeXBlPXIuX21vZGVsVHlwZSx0aGlzLl9zY2FsZT1yLl9zY2FsZX19LFNzPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LG1heGltdW1QcmVjaXNlVmFsdWU6e2NvbmZpZ3VyYWJsZTohMH19O0NzLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2YgQ3MpKXJldHVybiExO3ZhciBlPXQ7cmV0dXJuIHRoaXMuX21vZGVsVHlwZT09PWUuX21vZGVsVHlwZSYmdGhpcy5fc2NhbGU9PT1lLl9zY2FsZX0sQ3MucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10LG49dGhpcy5nZXRNYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMoKSxyPWUuZ2V0TWF4aW11bVNpZ25pZmljYW50RGlnaXRzKCk7cmV0dXJuIG5ldyBOaShuKS5jb21wYXJlVG8obmV3IE5pKHIpKX0sQ3MucHJvdG90eXBlLmdldFNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjYWxlfSxDcy5wcm90b3R5cGUuaXNGbG9hdGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElOR3x8dGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkdfU0lOR0xFfSxDcy5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RlbFR5cGV9LENzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PSJVTktOT1dOIjtyZXR1cm4gdGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkc/dD0iRmxvYXRpbmciOnRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HX1NJTkdMRT90PSJGbG9hdGluZy1TaW5nbGUiOnRoaXMuX21vZGVsVHlwZT09PUNzLkZJWEVEJiYodD0iRml4ZWQgKFNjYWxlPSIrdGhpcy5nZXRTY2FsZSgpKyIpIiksdH0sQ3MucHJvdG90eXBlLm1ha2VQcmVjaXNlPWZ1bmN0aW9uKCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gZmkuaXNOYU4odCl8fHRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HX1NJTkdMRT90OnRoaXMuX21vZGVsVHlwZT09PUNzLkZJWEVEP01hdGgucm91bmQodCp0aGlzLl9zY2FsZSkvdGhpcy5fc2NhbGU6dH1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07aWYodGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkcpcmV0dXJuIG51bGw7ZS54PXRoaXMubWFrZVByZWNpc2UoZS54KSxlLnk9dGhpcy5tYWtlUHJlY2lzZShlLnkpfX0sQ3MucHJvdG90eXBlLmdldE1heGltdW1TaWduaWZpY2FudERpZ2l0cz1mdW5jdGlvbigpe3ZhciB0PTE2O3JldHVybiB0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElORz90PTE2OnRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HX1NJTkdMRT90PTY6dGhpcy5fbW9kZWxUeXBlPT09Q3MuRklYRUQmJih0PTErTWF0aC50cnVuYyhNYXRoLmNlaWwoTWF0aC5sb2codGhpcy5nZXRTY2FsZSgpKS9NYXRoLmxvZygxMCkpKSksdH0sQ3MucHJvdG90eXBlLnNldFNjYWxlPWZ1bmN0aW9uKHQpe3RoaXMuX3NjYWxlPU1hdGguYWJzKHQpfSxDcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbWksZGldfSxDcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQ3N9LENzLm1vc3RQcmVjaXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY29tcGFyZVRvKGUpPj0wP3Q6ZX0sU3Muc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg2YmVlNjQwNGU5YTI1YzAwfSxTcy5tYXhpbXVtUHJlY2lzZVZhbHVlLmdldD1mdW5jdGlvbigpe3JldHVybiA5MDA3MTk5MjU0NzQwOTkyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDcyxTcyk7dmFyIEFzPWZ1bmN0aW9uIHQoZSl7dGhpcy5fbmFtZT1lfHxudWxsLHQubmFtZVRvVHlwZU1hcC5wdXQoZSx0aGlzKX0sTnM9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0sbmFtZVRvVHlwZU1hcDp7Y29uZmlndXJhYmxlOiEwfX07QXMucHJvdG90eXBlLnJlYWRSZXNvbHZlPWZ1bmN0aW9uKCl7cmV0dXJuIEFzLm5hbWVUb1R5cGVNYXAuZ2V0KHRoaXMuX25hbWUpfSxBcy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmFtZX0sQXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW21pXX0sQXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEFzfSxOcy5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi01NTI4NjAyNjMxNzMxNTllNH0sTnMubmFtZVRvVHlwZU1hcC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEVzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBcyxOcyksQ3MuVHlwZT1BcyxDcy5GSVhFRD1uZXcgQXMoIkZJWEVEIiksQ3MuRkxPQVRJTkc9bmV3IEFzKCJGTE9BVElORyIpLENzLkZMT0FUSU5HX1NJTkdMRT1uZXcgQXMoIkZMT0FUSU5HIFNJTkdMRSIpO3ZhciBJcz1mdW5jdGlvbiB0KCl7dGhpcy5fcHJlY2lzaW9uTW9kZWw9bmV3IENzLHRoaXMuX1NSSUQ9MCx0aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PXQuZ2V0RGVmYXVsdENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKSwwPT09YXJndW1lbnRzLmxlbmd0aHx8KDE9PT1hcmd1bWVudHMubGVuZ3RoP0VpKGFyZ3VtZW50c1swXSx3aSk/dGhpcy5fY29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeT1hcmd1bWVudHNbMF06YXJndW1lbnRzWzBdaW5zdGFuY2VvZiBDcyYmKHRoaXMuX3ByZWNpc2lvbk1vZGVsPWFyZ3VtZW50c1swXSk6Mj09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3ByZWNpc2lvbk1vZGVsPWFyZ3VtZW50c1swXSx0aGlzLl9TUklEPWFyZ3VtZW50c1sxXSk6Mz09PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLl9wcmVjaXNpb25Nb2RlbD1hcmd1bWVudHNbMF0sdGhpcy5fU1JJRD1hcmd1bWVudHNbMV0sdGhpcy5fY29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeT1hcmd1bWVudHNbMl0pKX0sTXM9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O0lzLnByb3RvdHlwZS50b0dlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0LmlzTnVsbCgpP3RoaXMuY3JlYXRlUG9pbnQobnVsbCk6dC5nZXRNaW5YKCk9PT10LmdldE1heFgoKSYmdC5nZXRNaW5ZKCk9PT10LmdldE1heFkoKT90aGlzLmNyZWF0ZVBvaW50KG5ldyB2aSh0LmdldE1pblgoKSx0LmdldE1pblkoKSkpOnQuZ2V0TWluWCgpPT09dC5nZXRNYXhYKCl8fHQuZ2V0TWluWSgpPT09dC5nZXRNYXhZKCk/dGhpcy5jcmVhdGVMaW5lU3RyaW5nKFtuZXcgdmkodC5nZXRNaW5YKCksdC5nZXRNaW5ZKCkpLG5ldyB2aSh0LmdldE1heFgoKSx0LmdldE1heFkoKSldKTp0aGlzLmNyZWF0ZVBvbHlnb24odGhpcy5jcmVhdGVMaW5lYXJSaW5nKFtuZXcgdmkodC5nZXRNaW5YKCksdC5nZXRNaW5ZKCkpLG5ldyB2aSh0LmdldE1pblgoKSx0LmdldE1heFkoKSksbmV3IHZpKHQuZ2V0TWF4WCgpLHQuZ2V0TWF4WSgpKSxuZXcgdmkodC5nZXRNYXhYKCksdC5nZXRNaW5ZKCkpLG5ldyB2aSh0LmdldE1pblgoKSx0LmdldE1pblkoKSldKSxudWxsKX0sSXMucHJvdG90eXBlLmNyZWF0ZUxpbmVTdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dCBpbnN0YW5jZW9mIEFycmF5P25ldyBhcyh0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUodCksdGhpcyk6RWkodCxMaSk/bmV3IGFzKHQsdGhpcyk6dm9pZCAwOm5ldyBhcyh0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoW10pLHRoaXMpfSxJcy5wcm90b3R5cGUuY3JlYXRlTXVsdGlMaW5lU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBabyhudWxsLHRoaXMpOjE9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBabyhhcmd1bWVudHNbMF0sdGhpcyk6dm9pZCAwfSxJcy5wcm90b3R5cGUuYnVpbGRHZW9tZXRyeT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bnVsbCxuPSExLHI9ITEsaT10Lml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKSxzPW8uZ2V0Q2xhc3MoKTtudWxsPT09ZSYmKGU9cykscyE9PWUmJihuPSEwKSxvLmlzR2VvbWV0cnlDb2xsZWN0aW9uT3JEZXJpdmVkKCkmJihyPSEwKX1pZihudWxsPT09ZSlyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oKTtpZihufHxyKXJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihJcy50b0dlb21ldHJ5QXJyYXkodCkpO3ZhciBhPXQuaXRlcmF0b3IoKS5uZXh0KCk7aWYodC5zaXplKCk+MSl7aWYoYSBpbnN0YW5jZW9mIGhzKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9seWdvbihJcy50b1BvbHlnb25BcnJheSh0KSk7aWYoYSBpbnN0YW5jZW9mIGFzKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpTGluZVN0cmluZyhJcy50b0xpbmVTdHJpbmdBcnJheSh0KSk7aWYoYSBpbnN0YW5jZW9mIGNzKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9pbnQoSXMudG9Qb2ludEFycmF5KHQpKTtaaS5zaG91bGROZXZlclJlYWNoSGVyZSgiVW5oYW5kbGVkIGNsYXNzOiAiK2EuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpfXJldHVybiBhfSxJcy5wcm90b3R5cGUuY3JlYXRlTXVsdGlQb2ludEZyb21Db29yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChudWxsIT09dD90aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUodCk6bnVsbCl9LElzLnByb3RvdHlwZS5jcmVhdGVQb2ludD1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmNyZWF0ZVBvaW50KHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlUG9pbnQobnVsbCE9PXQ/dGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFt0XSk6bnVsbCl9aWYoRWkoYXJndW1lbnRzWzBdLExpKSlyZXR1cm4gbmV3IGNzKGFyZ3VtZW50c1swXSx0aGlzKX19LElzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnl9LElzLnByb3RvdHlwZS5jcmVhdGVQb2x5Z29uPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG5ldyBocyhudWxsLG51bGwsdGhpcyk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKEVpKGFyZ3VtZW50c1swXSxMaSkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVQb2x5Z29uKHRoaXMuY3JlYXRlTGluZWFyUmluZyh0KSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNyZWF0ZVBvbHlnb24odGhpcy5jcmVhdGVMaW5lYXJSaW5nKGUpKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHBzKXt2YXIgbj1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlUG9seWdvbihuLG51bGwpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtyZXR1cm4gbmV3IGhzKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sdGhpcyl9fSxJcy5wcm90b3R5cGUuZ2V0U1JJRD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9TUklEfSxJcy5wcm90b3R5cGUuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBIbyhudWxsLHRoaXMpOjE9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBIbyhhcmd1bWVudHNbMF0sdGhpcyk6dm9pZCAwfSxJcy5wcm90b3R5cGUuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBncyh0aGlzKS5lZGl0KHQse2VkaXQ6ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5LmNyZWF0ZSh0KX19fSl9LElzLnByb3RvdHlwZS5nZXRQcmVjaXNpb25Nb2RlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVjaXNpb25Nb2RlbH0sSXMucHJvdG90eXBlLmNyZWF0ZUxpbmVhclJpbmc9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5jcmVhdGVMaW5lYXJSaW5nKHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlTGluZWFyUmluZyhudWxsIT09dD90aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUodCk6bnVsbCl9aWYoRWkoYXJndW1lbnRzWzBdLExpKSlyZXR1cm4gbmV3IHBzKGFyZ3VtZW50c1swXSx0aGlzKX19LElzLnByb3RvdHlwZS5jcmVhdGVNdWx0aVBvbHlnb249ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IGRzKG51bGwsdGhpcyk6MT09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IGRzKGFyZ3VtZW50c1swXSx0aGlzKTp2b2lkIDB9LElzLnByb3RvdHlwZS5jcmVhdGVNdWx0aVBvaW50PWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG5ldyBmcyhudWxsLHRoaXMpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXJldHVybiBuZXcgZnMoYXJndW1lbnRzWzBdLHRoaXMpO2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvaW50KG51bGwhPT10P3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KTpudWxsKX1pZihFaShhcmd1bWVudHNbMF0sTGkpKXt2YXIgZT1hcmd1bWVudHNbMF07aWYobnVsbD09PWUpcmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChuZXcgQXJyYXkoMCkuZmlsbChudWxsKSk7Zm9yKHZhciBuPW5ldyBBcnJheShlLnNpemUoKSkuZmlsbChudWxsKSxyPTA7cjxlLnNpemUoKTtyKyspe3ZhciBpPXRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSgxLGUuZ2V0RGltZW5zaW9uKCkpO3NzLmNvcHkoZSxyLGksMCwxKSxuW3JdPXRoaXMuY3JlYXRlUG9pbnQoaSl9cmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChuKX19fSxJcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbWldfSxJcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSXN9LElzLnRvTXVsdGlQb2x5Z29uQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLnRvR2VvbWV0cnlBcnJheT1mdW5jdGlvbih0KXtpZihudWxsPT09dClyZXR1cm4gbnVsbDt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMuZ2V0RGVmYXVsdENvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9ZnVuY3Rpb24oKXtyZXR1cm4gYnMuaW5zdGFuY2UoKX0sSXMudG9NdWx0aUxpbmVTdHJpbmdBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMudG9MaW5lU3RyaW5nQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLnRvTXVsdGlQb2ludEFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy50b0xpbmVhclJpbmdBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMudG9Qb2ludEFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy50b1BvbHlnb25BcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMuY3JlYXRlUG9pbnRGcm9tSW50ZXJuYWxDb29yZD1mdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFByZWNpc2lvbk1vZGVsKCkubWFrZVByZWNpc2UodCksZS5nZXRGYWN0b3J5KCkuY3JlYXRlUG9pbnQodCl9LE1zLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4NWVhNzVmMjA1MWVlYjQwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSXMsTXMpO3ZhciBGcz1mdW5jdGlvbigpe30sVHM9e09OOntjb25maWd1cmFibGU6ITB9LExFRlQ6e2NvbmZpZ3VyYWJsZTohMH0sUklHSFQ6e2NvbmZpZ3VyYWJsZTohMH19O2Z1bmN0aW9uIE9zKHQpe3RoaXMubWVzc2FnZT10fHwiIn1mdW5jdGlvbiBMcygpe3RoaXMuYXJyYXlfPVtdfUZzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxGcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRnN9LEZzLm9wcG9zaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09RnMuTEVGVD9Gcy5SSUdIVDp0PT09RnMuUklHSFQ/RnMuTEVGVDp0fSxUcy5PTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sVHMuTEVGVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sVHMuUklHSFQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZzLFRzKSxPcy5wcm90b3R5cGU9bmV3IEVycm9yLE9zLnByb3RvdHlwZS5uYW1lPSJFbXB0eVN0YWNrRXhjZXB0aW9uIixMcy5wcm90b3R5cGU9bmV3IHZvLExzLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXJyYXlfLnB1c2godCksITB9LExzLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYodDwwfHx0Pj10aGlzLnNpemUoKSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMuYXJyYXlfW3RdfSxMcy5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hcnJheV8ucHVzaCh0KSx0fSxMcy5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmFycmF5Xy5sZW5ndGgpdGhyb3cgbmV3IE9zO3JldHVybiB0aGlzLmFycmF5Xy5wb3AoKX0sTHMucHJvdG90eXBlLnBlZWs9ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5hcnJheV8ubGVuZ3RoKXRocm93IG5ldyBPcztyZXR1cm4gdGhpcy5hcnJheV9bdGhpcy5hcnJheV8ubGVuZ3RoLTFdfSxMcy5wcm90b3R5cGUuZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuYXJyYXlfLmxlbmd0aH0sTHMucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbXB0eSgpfSxMcy5wcm90b3R5cGUuc2VhcmNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFycmF5Xy5pbmRleE9mKHQpfSxMcy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5Xy5sZW5ndGh9LExzLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXQucHVzaCh0aGlzLmFycmF5X1tlXSk7cmV0dXJuIHR9O3ZhciBQcz1mdW5jdGlvbigpe3RoaXMuX21pbkluZGV4PS0xLHRoaXMuX21pbkNvb3JkPW51bGwsdGhpcy5fbWluRGU9bnVsbCx0aGlzLl9vcmllbnRlZERlPW51bGx9O1BzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbkNvb3JkfSxQcy5wcm90b3R5cGUuZ2V0UmlnaHRtb3N0U2lkZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0UmlnaHRtb3N0U2lkZU9mU2VnbWVudCh0LGUpO3JldHVybiBuPDAmJihuPXRoaXMuZ2V0UmlnaHRtb3N0U2lkZU9mU2VnbWVudCh0LGUtMSkpLG48MCYmKHRoaXMuX21pbkNvb3JkPW51bGwsdGhpcy5jaGVja0ZvclJpZ2h0bW9zdENvb3JkaW5hdGUodCkpLG59LFBzLnByb3RvdHlwZS5maW5kUmlnaHRtb3N0RWRnZUF0VmVydGV4PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWluRGUuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCk7WmkuaXNUcnVlKHRoaXMuX21pbkluZGV4PjAmJnRoaXMuX21pbkluZGV4PHQubGVuZ3RoLCJyaWdodG1vc3QgcG9pbnQgZXhwZWN0ZWQgdG8gYmUgaW50ZXJpb3IgdmVydGV4IG9mIGVkZ2UiKTt2YXIgZT10W3RoaXMuX21pbkluZGV4LTFdLG49dFt0aGlzLl9taW5JbmRleCsxXSxyPWVvLmNvbXB1dGVPcmllbnRhdGlvbih0aGlzLl9taW5Db29yZCxuLGUpLGk9ITE7KGUueTx0aGlzLl9taW5Db29yZC55JiZuLnk8dGhpcy5fbWluQ29vcmQueSYmcj09PWVvLkNPVU5URVJDTE9DS1dJU0V8fGUueT50aGlzLl9taW5Db29yZC55JiZuLnk+dGhpcy5fbWluQ29vcmQueSYmcj09PWVvLkNMT0NLV0lTRSkmJihpPSEwKSxpJiYodGhpcy5fbWluSW5kZXg9dGhpcy5fbWluSW5kZXgtMSl9LFBzLnByb3RvdHlwZS5nZXRSaWdodG1vc3RTaWRlT2ZTZWdtZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKTtpZihlPDB8fGUrMT49bi5sZW5ndGh8fG5bZV0ueT09PW5bZSsxXS55KXJldHVybi0xO3ZhciByPUZzLkxFRlQ7cmV0dXJuIG5bZV0ueTxuW2UrMV0ueSYmKHI9RnMuUklHSFQpLHJ9LFBzLnByb3RvdHlwZS5nZXRFZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGVkRGV9LFBzLnByb3RvdHlwZS5jaGVja0ZvclJpZ2h0bW9zdENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10LmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoLTE7cisrKShudWxsPT09ZS5fbWluQ29vcmR8fG5bcl0ueD5lLl9taW5Db29yZC54KSYmKGUuX21pbkRlPXQsZS5fbWluSW5kZXg9cixlLl9taW5Db29yZD1uW3JdKX0sUHMucHJvdG90eXBlLmZpbmRSaWdodG1vc3RFZGdlQXROb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWluRGUuZ2V0Tm9kZSgpLmdldEVkZ2VzKCk7dGhpcy5fbWluRGU9dC5nZXRSaWdodG1vc3RFZGdlKCksdGhpcy5fbWluRGUuaXNGb3J3YXJkKCl8fCh0aGlzLl9taW5EZT10aGlzLl9taW5EZS5nZXRTeW0oKSx0aGlzLl9taW5JbmRleD10aGlzLl9taW5EZS5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKS5sZW5ndGgtMSl9LFBzLnByb3RvdHlwZS5maW5kRWRnZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7IW4uaXNGb3J3YXJkKCl8fHRoaXMuY2hlY2tGb3JSaWdodG1vc3RDb29yZGluYXRlKG4pfVppLmlzVHJ1ZSgwIT09dGhpcy5fbWluSW5kZXh8fHRoaXMuX21pbkNvb3JkLmVxdWFscyh0aGlzLl9taW5EZS5nZXRDb29yZGluYXRlKCkpLCJpbmNvbnNpc3RlbmN5IGluIHJpZ2h0bW9zdCBwcm9jZXNzaW5nIiksMD09PXRoaXMuX21pbkluZGV4P3RoaXMuZmluZFJpZ2h0bW9zdEVkZ2VBdE5vZGUoKTp0aGlzLmZpbmRSaWdodG1vc3RFZGdlQXRWZXJ0ZXgoKSx0aGlzLl9vcmllbnRlZERlPXRoaXMuX21pbkRlLHRoaXMuZ2V0UmlnaHRtb3N0U2lkZSh0aGlzLl9taW5EZSx0aGlzLl9taW5JbmRleCk9PT1Gcy5MRUZUJiYodGhpcy5fb3JpZW50ZWREZT10aGlzLl9taW5EZS5nZXRTeW0oKSl9LFBzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxQcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUHN9O3ZhciBScz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4scil7dC5jYWxsKHRoaXMsZS5tc2dXaXRoQ29vcmQobixyKSksdGhpcy5wdD1yP25ldyB2aShyKTpudWxsLHRoaXMubmFtZT0iVG9wb2xvZ3lFeGNlcHRpb24ifXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHR9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGUubXNnV2l0aENvb3JkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU/dDp0KyIgWyAiK2UrIiBdIn0sZX0oV2kpLEJzPWZ1bmN0aW9uKCl7dGhpcy5hcnJheV89W119O0JzLnByb3RvdHlwZS5hZGRMYXN0PWZ1bmN0aW9uKHQpe3RoaXMuYXJyYXlfLnB1c2godCl9LEJzLnByb3RvdHlwZS5yZW1vdmVGaXJzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5Xy5zaGlmdCgpfSxCcy5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofTt2YXIga3M9ZnVuY3Rpb24oKXt0aGlzLl9maW5kZXI9bnVsbCx0aGlzLl9kaXJFZGdlTGlzdD1uZXcgeG8sdGhpcy5fbm9kZXM9bmV3IHhvLHRoaXMuX3JpZ2h0TW9zdENvb3JkPW51bGwsdGhpcy5fZW52PW51bGwsdGhpcy5fZmluZGVyPW5ldyBQc307a3MucHJvdG90eXBlLmNsZWFyVmlzaXRlZEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2RpckVkZ2VMaXN0Lml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt0Lm5leHQoKS5zZXRWaXNpdGVkKCExKX19LGtzLnByb3RvdHlwZS5nZXRSaWdodG1vc3RDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JpZ2h0TW9zdENvb3JkfSxrcy5wcm90b3R5cGUuY29tcHV0ZU5vZGVEZXB0aD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bnVsbCxuPXQuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYoci5pc1Zpc2l0ZWQoKXx8ci5nZXRTeW0oKS5pc1Zpc2l0ZWQoKSl7ZT1yO2JyZWFrfX1pZihudWxsPT09ZSl0aHJvdyBuZXcgUnMoInVuYWJsZSB0byBmaW5kIGVkZ2UgdG8gY29tcHV0ZSBkZXB0aHMgYXQgIit0LmdldENvb3JkaW5hdGUoKSk7dC5nZXRFZGdlcygpLmNvbXB1dGVEZXB0aHMoZSk7Zm9yKHZhciBpPXQuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7by5zZXRWaXNpdGVkKCEwKSx0aGlzLmNvcHlTeW1EZXB0aHMobyl9fSxrcy5wcm90b3R5cGUuY29tcHV0ZURlcHRoPWZ1bmN0aW9uKHQpe3RoaXMuY2xlYXJWaXNpdGVkRWRnZXMoKTt2YXIgZT10aGlzLl9maW5kZXIuZ2V0RWRnZSgpO2Uuc2V0RWRnZURlcHRocyhGcy5SSUdIVCx0KSx0aGlzLmNvcHlTeW1EZXB0aHMoZSksdGhpcy5jb21wdXRlRGVwdGhzKGUpfSxrcy5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3RoaXMuYWRkUmVhY2hhYmxlKHQpLHRoaXMuX2ZpbmRlci5maW5kRWRnZSh0aGlzLl9kaXJFZGdlTGlzdCksdGhpcy5fcmlnaHRNb3N0Q29vcmQ9dGhpcy5fZmluZGVyLmdldENvb3JkaW5hdGUoKX0sa3MucHJvdG90eXBlLmZpbmRSZXN1bHRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9kaXJFZGdlTGlzdC5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCk7ZS5nZXREZXB0aChGcy5SSUdIVCk+PTEmJmUuZ2V0RGVwdGgoRnMuTEVGVCk8PTAmJiFlLmlzSW50ZXJpb3JBcmVhRWRnZSgpJiZlLnNldEluUmVzdWx0KCEwKX19LGtzLnByb3RvdHlwZS5jb21wdXRlRGVwdGhzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBGbyxuPW5ldyBCcyxyPXQuZ2V0Tm9kZSgpO2ZvcihuLmFkZExhc3QociksZS5hZGQociksdC5zZXRWaXNpdGVkKCEwKTshbi5pc0VtcHR5KCk7KXt2YXIgaT1uLnJlbW92ZUZpcnN0KCk7ZS5hZGQoaSksdGhpcy5jb21wdXRlTm9kZURlcHRoKGkpO2Zvcih2YXIgbz1pLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpLmdldFN5bSgpO2lmKCFzLmlzVmlzaXRlZCgpKXt2YXIgYT1zLmdldE5vZGUoKTtlLmNvbnRhaW5zKGEpfHwobi5hZGRMYXN0KGEpLGUuYWRkKGEpKX19fX0sa3MucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl9yaWdodE1vc3RDb29yZC54PGUuX3JpZ2h0TW9zdENvb3JkLng/LTE6dGhpcy5fcmlnaHRNb3N0Q29vcmQueD5lLl9yaWdodE1vc3RDb29yZC54PzE6MH0sa3MucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2Vudil7Zm9yKHZhciB0PW5ldyBqaSxlPXRoaXMuX2RpckVkZ2VMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KWZvcih2YXIgbj1lLm5leHQoKS5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKSxyPTA7cjxuLmxlbmd0aC0xO3IrKyl0LmV4cGFuZFRvSW5jbHVkZShuW3JdKTt0aGlzLl9lbnY9dH1yZXR1cm4gdGhpcy5fZW52fSxrcy5wcm90b3R5cGUuYWRkUmVhY2hhYmxlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBMcztmb3IoZS5hZGQodCk7IWUuZW1wdHkoKTspe3ZhciBuPWUucG9wKCk7dGhpcy5hZGQobixlKX19LGtzLnByb3RvdHlwZS5jb3B5U3ltRGVwdGhzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0U3ltKCk7ZS5zZXREZXB0aChGcy5MRUZULHQuZ2V0RGVwdGgoRnMuUklHSFQpKSxlLnNldERlcHRoKEZzLlJJR0hULHQuZ2V0RGVwdGgoRnMuTEVGVCkpfSxrcy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dC5zZXRWaXNpdGVkKCEwKSx0aGlzLl9ub2Rlcy5hZGQodCk7Zm9yKHZhciBuPXQuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7dGhpcy5fZGlyRWRnZUxpc3QuYWRkKHIpO3ZhciBpPXIuZ2V0U3ltKCkuZ2V0Tm9kZSgpO2kuaXNWaXNpdGVkKCl8fGUucHVzaChpKX19LGtzLnByb3RvdHlwZS5nZXROb2Rlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2Rlc30sa3MucHJvdG90eXBlLmdldERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlyRWRnZUxpc3R9LGtzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LGtzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBrc307dmFyIHpzPWZ1bmN0aW9uIHQoKXtpZih0aGlzLmxvY2F0aW9uPW51bGwsMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmluaXQoZS5sZW5ndGgpfWVsc2UgaWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pKXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5pbml0KDEpLHRoaXMubG9jYXRpb25bRnMuT05dPW59ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciByPWFyZ3VtZW50c1swXTtpZih0aGlzLmluaXQoci5sb2NhdGlvbi5sZW5ndGgpLG51bGwhPT1yKWZvcih2YXIgaT0wO2k8dGhpcy5sb2NhdGlvbi5sZW5ndGg7aSsrKXRoaXMubG9jYXRpb25baV09ci5sb2NhdGlvbltpXX19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9YXJndW1lbnRzWzJdO3RoaXMuaW5pdCgzKSx0aGlzLmxvY2F0aW9uW0ZzLk9OXT1vLHRoaXMubG9jYXRpb25bRnMuTEVGVF09cyx0aGlzLmxvY2F0aW9uW0ZzLlJJR0hUXT1hfX07enMucHJvdG90eXBlLnNldEFsbExvY2F0aW9ucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMubG9jYXRpb24ubGVuZ3RoO2UrKyl0aGlzLmxvY2F0aW9uW2VdPXR9LHpzLnByb3RvdHlwZS5pc051bGw9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMubG9jYXRpb24ubGVuZ3RoO3QrKylpZih0aGlzLmxvY2F0aW9uW3RdIT09YmkuTk9ORSlyZXR1cm4hMTtyZXR1cm4hMH0senMucHJvdG90eXBlLnNldEFsbExvY2F0aW9uc0lmTnVsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMubG9jYXRpb24ubGVuZ3RoO2UrKyl0aGlzLmxvY2F0aW9uW2VdPT09YmkuTk9ORSYmKHRoaXMubG9jYXRpb25bZV09dCl9LHpzLnByb3RvdHlwZS5pc0xpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMubG9jYXRpb24ubGVuZ3RofSx6cy5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24odCl7aWYodC5sb2NhdGlvbi5sZW5ndGg+dGhpcy5sb2NhdGlvbi5sZW5ndGgpe3ZhciBlPW5ldyBBcnJheSgzKS5maWxsKG51bGwpO2VbRnMuT05dPXRoaXMubG9jYXRpb25bRnMuT05dLGVbRnMuTEVGVF09YmkuTk9ORSxlW0ZzLlJJR0hUXT1iaS5OT05FLHRoaXMubG9jYXRpb249ZX1mb3IodmFyIG49MDtuPHRoaXMubG9jYXRpb24ubGVuZ3RoO24rKyl0aGlzLmxvY2F0aW9uW25dPT09YmkuTk9ORSYmbjx0LmxvY2F0aW9uLmxlbmd0aCYmKHRoaXMubG9jYXRpb25bbl09dC5sb2NhdGlvbltuXSl9LHpzLnByb3RvdHlwZS5nZXRMb2NhdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhdGlvbn0senMucHJvdG90eXBlLmZsaXA9ZnVuY3Rpb24oKXtpZih0aGlzLmxvY2F0aW9uLmxlbmd0aDw9MSlyZXR1cm4gbnVsbDt2YXIgdD10aGlzLmxvY2F0aW9uW0ZzLkxFRlRdO3RoaXMubG9jYXRpb25bRnMuTEVGVF09dGhpcy5sb2NhdGlvbltGcy5SSUdIVF0sdGhpcy5sb2NhdGlvbltGcy5SSUdIVF09dH0senMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFpO3JldHVybiB0aGlzLmxvY2F0aW9uLmxlbmd0aD4xJiZ0LmFwcGVuZChiaS50b0xvY2F0aW9uU3ltYm9sKHRoaXMubG9jYXRpb25bRnMuTEVGVF0pKSx0LmFwcGVuZChiaS50b0xvY2F0aW9uU3ltYm9sKHRoaXMubG9jYXRpb25bRnMuT05dKSksdGhpcy5sb2NhdGlvbi5sZW5ndGg+MSYmdC5hcHBlbmQoYmkudG9Mb2NhdGlvblN5bWJvbCh0aGlzLmxvY2F0aW9uW0ZzLlJJR0hUXSkpLHQudG9TdHJpbmcoKX0senMucHJvdG90eXBlLnNldExvY2F0aW9ucz1mdW5jdGlvbih0LGUsbil7dGhpcy5sb2NhdGlvbltGcy5PTl09dCx0aGlzLmxvY2F0aW9uW0ZzLkxFRlRdPWUsdGhpcy5sb2NhdGlvbltGcy5SSUdIVF09bn0senMucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdDx0aGlzLmxvY2F0aW9uLmxlbmd0aD90aGlzLmxvY2F0aW9uW3RdOmJpLk5PTkV9LHpzLnByb3RvdHlwZS5pc0FyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhdGlvbi5sZW5ndGg+MX0senMucHJvdG90eXBlLmlzQW55TnVsbD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5sb2NhdGlvbi5sZW5ndGg7dCsrKWlmKHRoaXMubG9jYXRpb25bdF09PT1iaS5OT05FKXJldHVybiEwO3JldHVybiExfSx6cy5wcm90b3R5cGUuc2V0TG9jYXRpb249ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0TG9jYXRpb24oRnMuT04sdCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMubG9jYXRpb25bZV09bn19LHpzLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe3RoaXMubG9jYXRpb249bmV3IEFycmF5KHQpLmZpbGwobnVsbCksdGhpcy5zZXRBbGxMb2NhdGlvbnMoYmkuTk9ORSl9LHpzLnByb3RvdHlwZS5pc0VxdWFsT25TaWRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubG9jYXRpb25bZV09PT10LmxvY2F0aW9uW2VdfSx6cy5wcm90b3R5cGUuYWxsUG9zaXRpb25zRXF1YWw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmxvY2F0aW9uLmxlbmd0aDtlKyspaWYodGhpcy5sb2NhdGlvbltlXSE9PXQpcmV0dXJuITE7cmV0dXJuITB9LHpzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx6cy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4genN9O3ZhciBqcz1mdW5jdGlvbiB0KCl7aWYodGhpcy5lbHQ9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuZWx0WzBdPW5ldyB6cyhlKSx0aGlzLmVsdFsxXT1uZXcgenMoZSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLmVsdFswXT1uZXcgenMobi5lbHRbMF0pLHRoaXMuZWx0WzFdPW5ldyB6cyhuLmVsdFsxXSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTt0aGlzLmVsdFswXT1uZXcgenMoYmkuTk9ORSksdGhpcy5lbHRbMV09bmV3IHpzKGJpLk5PTkUpLHRoaXMuZWx0W3JdLnNldExvY2F0aW9uKGkpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXTt0aGlzLmVsdFswXT1uZXcgenMobyxzLGEpLHRoaXMuZWx0WzFdPW5ldyB6cyhvLHMsYSl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHU9YXJndW1lbnRzWzBdLGM9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdLGg9YXJndW1lbnRzWzNdO3RoaXMuZWx0WzBdPW5ldyB6cyhiaS5OT05FLGJpLk5PTkUsYmkuTk9ORSksdGhpcy5lbHRbMV09bmV3IHpzKGJpLk5PTkUsYmkuTk9ORSxiaS5OT05FKSx0aGlzLmVsdFt1XS5zZXRMb2NhdGlvbnMoYyxsLGgpfX07anMucHJvdG90eXBlLmdldEdlb21ldHJ5Q291bnQ9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLmVsdFswXS5pc051bGwoKXx8dCsrLHRoaXMuZWx0WzFdLmlzTnVsbCgpfHx0KyssdH0sanMucHJvdG90eXBlLnNldEFsbExvY2F0aW9ucz1mdW5jdGlvbih0LGUpe3RoaXMuZWx0W3RdLnNldEFsbExvY2F0aW9ucyhlKX0sanMucHJvdG90eXBlLmlzTnVsbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbHRbdF0uaXNOdWxsKCl9LGpzLnByb3RvdHlwZS5zZXRBbGxMb2NhdGlvbnNJZk51bGw9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0QWxsTG9jYXRpb25zSWZOdWxsKDAsdCksdGhpcy5zZXRBbGxMb2NhdGlvbnNJZk51bGwoMSx0KX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5lbHRbZV0uc2V0QWxsTG9jYXRpb25zSWZOdWxsKG4pfX0sanMucHJvdG90eXBlLmlzTGluZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbHRbdF0uaXNMaW5lKCl9LGpzLnByb3RvdHlwZS5tZXJnZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPTA7bjwyO24rKyludWxsPT09ZS5lbHRbbl0mJm51bGwhPT10LmVsdFtuXT9lLmVsdFtuXT1uZXcgenModC5lbHRbbl0pOmUuZWx0W25dLm1lcmdlKHQuZWx0W25dKX0sanMucHJvdG90eXBlLmZsaXA9ZnVuY3Rpb24oKXt0aGlzLmVsdFswXS5mbGlwKCksdGhpcy5lbHRbMV0uZmxpcCgpfSxqcy5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmVsdFt0XS5nZXQoRnMuT04pfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuZWx0W2VdLmdldChuKX19LGpzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PW5ldyBBaTtyZXR1cm4gbnVsbCE9PXRoaXMuZWx0WzBdJiYodC5hcHBlbmQoIkE6IiksdC5hcHBlbmQodGhpcy5lbHRbMF0udG9TdHJpbmcoKSkpLG51bGwhPT10aGlzLmVsdFsxXSYmKHQuYXBwZW5kKCIgQjoiKSx0LmFwcGVuZCh0aGlzLmVsdFsxXS50b1N0cmluZygpKSksdC50b1N0cmluZygpfSxqcy5wcm90b3R5cGUuaXNBcmVhPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuZWx0WzBdLmlzQXJlYSgpfHx0aGlzLmVsdFsxXS5pc0FyZWEoKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmVsdFt0XS5pc0FyZWEoKX19LGpzLnByb3RvdHlwZS5pc0FueU51bGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWx0W3RdLmlzQW55TnVsbCgpfSxqcy5wcm90b3R5cGUuc2V0TG9jYXRpb249ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuZWx0W3RdLnNldExvY2F0aW9uKEZzLk9OLGUpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTt0aGlzLmVsdFtuXS5zZXRMb2NhdGlvbihyLGkpfX0sanMucHJvdG90eXBlLmlzRXF1YWxPblNpZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lbHRbMF0uaXNFcXVhbE9uU2lkZSh0LmVsdFswXSxlKSYmdGhpcy5lbHRbMV0uaXNFcXVhbE9uU2lkZSh0LmVsdFsxXSxlKX0sanMucHJvdG90eXBlLmFsbFBvc2l0aW9uc0VxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWx0W3RdLmFsbFBvc2l0aW9uc0VxdWFsKGUpfSxqcy5wcm90b3R5cGUudG9MaW5lPWZ1bmN0aW9uKHQpe3RoaXMuZWx0W3RdLmlzQXJlYSgpJiYodGhpcy5lbHRbdF09bmV3IHpzKHRoaXMuZWx0W3RdLmxvY2F0aW9uWzBdKSl9LGpzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxqcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4ganN9LGpzLnRvTGluZUxhYmVsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcganMoYmkuTk9ORSksbj0wO248MjtuKyspZS5zZXRMb2NhdGlvbihuLHQuZ2V0TG9jYXRpb24obikpO3JldHVybiBlfTt2YXIgVXM9ZnVuY3Rpb24oKXt0aGlzLl9zdGFydERlPW51bGwsdGhpcy5fbWF4Tm9kZURlZ3JlZT0tMSx0aGlzLl9lZGdlcz1uZXcgeG8sdGhpcy5fcHRzPW5ldyB4byx0aGlzLl9sYWJlbD1uZXcganMoYmkuTk9ORSksdGhpcy5fcmluZz1udWxsLHRoaXMuX2lzSG9sZT1udWxsLHRoaXMuX3NoZWxsPW51bGwsdGhpcy5faG9sZXM9bmV3IHhvLHRoaXMuX2dlb21ldHJ5RmFjdG9yeT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9ZSx0aGlzLmNvbXB1dGVQb2ludHModCksdGhpcy5jb21wdXRlUmluZygpfTtVcy5wcm90b3R5cGUuY29tcHV0ZVJpbmc9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5fcmluZylyZXR1cm4gbnVsbDtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX3B0cy5zaXplKCkpLmZpbGwobnVsbCksZT0wO2U8dGhpcy5fcHRzLnNpemUoKTtlKyspdFtlXT10aGlzLl9wdHMuZ2V0KGUpO3RoaXMuX3Jpbmc9dGhpcy5fZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcodCksdGhpcy5faXNIb2xlPWVvLmlzQ0NXKHRoaXMuX3JpbmcuZ2V0Q29vcmRpbmF0ZXMoKSl9LFVzLnByb3RvdHlwZS5pc0lzb2xhdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLl9sYWJlbC5nZXRHZW9tZXRyeUNvdW50KCl9LFVzLnByb3RvdHlwZS5jb21wdXRlUG9pbnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5fc3RhcnREZT10O3ZhciBuPXQscj0hMDtkb3tpZihudWxsPT09bil0aHJvdyBuZXcgUnMoIkZvdW5kIG51bGwgRGlyZWN0ZWRFZGdlIik7aWYobi5nZXRFZGdlUmluZygpPT09ZSl0aHJvdyBuZXcgUnMoIkRpcmVjdGVkIEVkZ2UgdmlzaXRlZCB0d2ljZSBkdXJpbmcgcmluZy1idWlsZGluZyBhdCAiK24uZ2V0Q29vcmRpbmF0ZSgpKTtlLl9lZGdlcy5hZGQobik7dmFyIGk9bi5nZXRMYWJlbCgpO1ppLmlzVHJ1ZShpLmlzQXJlYSgpKSxlLm1lcmdlTGFiZWwoaSksZS5hZGRQb2ludHMobi5nZXRFZGdlKCksbi5pc0ZvcndhcmQoKSxyKSxyPSExLGUuc2V0RWRnZVJpbmcobixlKSxuPWUuZ2V0TmV4dChuKX13aGlsZShuIT09dGhpcy5fc3RhcnREZSl9LFVzLnByb3RvdHlwZS5nZXRMaW5lYXJSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jpbmd9LFVzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdHMuZ2V0KHQpfSxVcy5wcm90b3R5cGUuY29tcHV0ZU1heE5vZGVEZWdyZWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX21heE5vZGVEZWdyZWU9MDt2YXIgZT10aGlzLl9zdGFydERlO2Rve3ZhciBuPWUuZ2V0Tm9kZSgpLmdldEVkZ2VzKCkuZ2V0T3V0Z29pbmdEZWdyZWUodCk7bj50Ll9tYXhOb2RlRGVncmVlJiYodC5fbWF4Tm9kZURlZ3JlZT1uKSxlPXQuZ2V0TmV4dChlKX13aGlsZShlIT09dGhpcy5fc3RhcnREZSk7dGhpcy5fbWF4Tm9kZURlZ3JlZSo9Mn0sVXMucHJvdG90eXBlLmFkZFBvaW50cz1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRDb29yZGluYXRlcygpO2lmKGUpe3ZhciBpPTE7biYmKGk9MCk7Zm9yKHZhciBvPWk7bzxyLmxlbmd0aDtvKyspdGhpcy5fcHRzLmFkZChyW29dKX1lbHNle3ZhciBzPXIubGVuZ3RoLTI7biYmKHM9ci5sZW5ndGgtMSk7Zm9yKHZhciBhPXM7YT49MDthLS0pdGhpcy5fcHRzLmFkZChyW2FdKX19LFVzLnByb3RvdHlwZS5pc0hvbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNIb2xlfSxVcy5wcm90b3R5cGUuc2V0SW5SZXN1bHQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdGFydERlO2Rve3QuZ2V0RWRnZSgpLnNldEluUmVzdWx0KCEwKSx0PXQuZ2V0TmV4dCgpfXdoaWxlKHQhPT10aGlzLl9zdGFydERlKX0sVXMucHJvdG90eXBlLmNvbnRhaW5zUG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRMaW5lYXJSaW5nKCk7aWYoIWUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmNvbnRhaW5zKHQpfHwhZW8uaXNQb2ludEluUmluZyh0LGUuZ2V0Q29vcmRpbmF0ZXMoKSkpcmV0dXJuITE7Zm9yKHZhciBuPXRoaXMuX2hvbGVzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXtpZihuLm5leHQoKS5jb250YWluc1BvaW50KHQpKXJldHVybiExfXJldHVybiEwfSxVcy5wcm90b3R5cGUuYWRkSG9sZT1mdW5jdGlvbih0KXt0aGlzLl9ob2xlcy5hZGQodCl9LFVzLnByb3RvdHlwZS5pc1NoZWxsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9zaGVsbH0sVXMucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxVcy5wcm90b3R5cGUuZ2V0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXN9LFVzLnByb3RvdHlwZS5nZXRNYXhOb2RlRGVncmVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heE5vZGVEZWdyZWU8MCYmdGhpcy5jb21wdXRlTWF4Tm9kZURlZ3JlZSgpLHRoaXMuX21heE5vZGVEZWdyZWV9LFVzLnByb3RvdHlwZS5nZXRTaGVsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbH0sVXMucHJvdG90eXBlLm1lcmdlTGFiZWw9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMubWVyZ2VMYWJlbCh0LDApLHRoaXMubWVyZ2VMYWJlbCh0LDEpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1swXS5nZXRMb2NhdGlvbihlLEZzLlJJR0hUKTtpZihuPT09YmkuTk9ORSlyZXR1cm4gbnVsbDtpZih0aGlzLl9sYWJlbC5nZXRMb2NhdGlvbihlKT09PWJpLk5PTkUpcmV0dXJuIHRoaXMuX2xhYmVsLnNldExvY2F0aW9uKGUsbiksbnVsbH19LFVzLnByb3RvdHlwZS5zZXRTaGVsbD1mdW5jdGlvbih0KXt0aGlzLl9zaGVsbD10LG51bGwhPT10JiZ0LmFkZEhvbGUodGhpcyl9LFVzLnByb3RvdHlwZS50b1BvbHlnb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0aGlzLl9ob2xlcy5zaXplKCkpLmZpbGwobnVsbCksbj0wO248dGhpcy5faG9sZXMuc2l6ZSgpO24rKyllW25dPXRoaXMuX2hvbGVzLmdldChuKS5nZXRMaW5lYXJSaW5nKCk7cmV0dXJuIHQuY3JlYXRlUG9seWdvbih0aGlzLmdldExpbmVhclJpbmcoKSxlKX0sVXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFVzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBVc307dmFyIHFzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuc2V0RWRnZVJpbmc9ZnVuY3Rpb24odCxlKXt0LnNldE1pbkVkZ2VSaW5nKGUpfSxlLnByb3RvdHlwZS5nZXROZXh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE5leHRNaW4oKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oVXMpLFZzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuYnVpbGRNaW5pbWFsUmluZ3M9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgeG8sZT10aGlzLl9zdGFydERlO2Rve2lmKG51bGw9PT1lLmdldE1pbkVkZ2VSaW5nKCkpe3ZhciBuPW5ldyBxcyhlLHRoaXMuX2dlb21ldHJ5RmFjdG9yeSk7dC5hZGQobil9ZT1lLmdldE5leHQoKX13aGlsZShlIT09dGhpcy5fc3RhcnREZSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLnNldEVkZ2VSaW5nPWZ1bmN0aW9uKHQsZSl7dC5zZXRFZGdlUmluZyhlKX0sZS5wcm90b3R5cGUubGlua0RpcmVjdGVkRWRnZXNGb3JNaW5pbWFsRWRnZVJpbmdzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3RhcnREZTtkb3t0LmdldE5vZGUoKS5nZXRFZGdlcygpLmxpbmtNaW5pbWFsRGlyZWN0ZWRFZGdlcyh0aGlzKSx0PXQuZ2V0TmV4dCgpfXdoaWxlKHQhPT10aGlzLl9zdGFydERlKX0sZS5wcm90b3R5cGUuZ2V0TmV4dD1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXROZXh0KCl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KFVzKSxHcz1mdW5jdGlvbigpe2lmKHRoaXMuX2xhYmVsPW51bGwsdGhpcy5faXNJblJlc3VsdD0hMSx0aGlzLl9pc0NvdmVyZWQ9ITEsdGhpcy5faXNDb3ZlcmVkU2V0PSExLHRoaXMuX2lzVmlzaXRlZD0hMSwwIT09YXJndW1lbnRzLmxlbmd0aCYmMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9sYWJlbD10fX07R3MucHJvdG90eXBlLnNldFZpc2l0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNWaXNpdGVkPXR9LEdzLnByb3RvdHlwZS5zZXRJblJlc3VsdD1mdW5jdGlvbih0KXt0aGlzLl9pc0luUmVzdWx0PXR9LEdzLnByb3RvdHlwZS5pc0NvdmVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNDb3ZlcmVkfSxHcy5wcm90b3R5cGUuaXNDb3ZlcmVkU2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQ292ZXJlZFNldH0sR3MucHJvdG90eXBlLnNldExhYmVsPWZ1bmN0aW9uKHQpe3RoaXMuX2xhYmVsPXR9LEdzLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sR3MucHJvdG90eXBlLnNldENvdmVyZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNDb3ZlcmVkPXQsdGhpcy5faXNDb3ZlcmVkU2V0PSEwfSxHcy5wcm90b3R5cGUudXBkYXRlSU09ZnVuY3Rpb24odCl7WmkuaXNUcnVlKHRoaXMuX2xhYmVsLmdldEdlb21ldHJ5Q291bnQoKT49MiwiZm91bmQgcGFydGlhbCBsYWJlbCIpLHRoaXMuY29tcHV0ZUlNKHQpfSxHcy5wcm90b3R5cGUuaXNJblJlc3VsdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0luUmVzdWx0fSxHcy5wcm90b3R5cGUuaXNWaXNpdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmlzaXRlZH0sR3MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEdzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBHc307dmFyIFlzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5fY29vcmQ9bnVsbCx0aGlzLl9lZGdlcz1udWxsO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZD1lLHRoaXMuX2VkZ2VzPW4sdGhpcy5fbGFiZWw9bmV3IGpzKDAsYmkuTk9ORSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzSW5jaWRlbnRFZGdlSW5SZXN1bHQ9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nZXRFZGdlcygpLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe2lmKHQubmV4dCgpLmdldEVkZ2UoKS5pc0luUmVzdWx0KCkpcmV0dXJuITB9cmV0dXJuITF9LGUucHJvdG90eXBlLmlzSXNvbGF0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMuX2xhYmVsLmdldEdlb21ldHJ5Q291bnQoKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZH0sZS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludGxuKCJub2RlICIrdGhpcy5fY29vcmQrIiBsYmw6ICIrdGhpcy5fbGFiZWwpfSxlLnByb3RvdHlwZS5jb21wdXRlSU09ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5jb21wdXRlTWVyZ2VkTG9jYXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj1iaS5OT05FO2lmKG49dGhpcy5fbGFiZWwuZ2V0TG9jYXRpb24oZSksIXQuaXNOdWxsKGUpKXt2YXIgcj10LmdldExvY2F0aW9uKGUpO24hPT1iaS5CT1VOREFSWSYmKG49cil9cmV0dXJuIG59LGUucHJvdG90eXBlLnNldExhYmVsPWZ1bmN0aW9uKCl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQucHJvdG90eXBlLnNldExhYmVsLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07bnVsbD09PXRoaXMuX2xhYmVsP3RoaXMuX2xhYmVsPW5ldyBqcyhlLG4pOnRoaXMuX2xhYmVsLnNldExvY2F0aW9uKGUsbil9LGUucHJvdG90eXBlLmdldEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzfSxlLnByb3RvdHlwZS5tZXJnZUxhYmVsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGUpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLm1lcmdlTGFiZWwobi5fbGFiZWwpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBqcylmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9MDtpPDI7aSsrKXt2YXIgbz10LmNvbXB1dGVNZXJnZWRMb2NhdGlvbihyLGkpO3QuX2xhYmVsLmdldExvY2F0aW9uKGkpPT09YmkuTk9ORSYmdC5fbGFiZWwuc2V0TG9jYXRpb24oaSxvKX19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt0aGlzLl9lZGdlcy5pbnNlcnQodCksdC5zZXROb2RlKHRoaXMpfSxlLnByb3RvdHlwZS5zZXRMYWJlbEJvdW5kYXJ5PWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10aGlzLl9sYWJlbClyZXR1cm4gbnVsbDt2YXIgZT1iaS5OT05FO251bGwhPT10aGlzLl9sYWJlbCYmKGU9dGhpcy5fbGFiZWwuZ2V0TG9jYXRpb24odCkpO3ZhciBuPW51bGw7aWYoZT09PWJpLkJPVU5EQVJZKW49YmkuSU5URVJJT1I7ZWxzZSBuPWJpLkJPVU5EQVJZO3RoaXMuX2xhYmVsLnNldExvY2F0aW9uKHQsbil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KEdzKSxYcz1mdW5jdGlvbigpe3RoaXMubm9kZU1hcD1uZXcga28sdGhpcy5ub2RlRmFjdD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLm5vZGVGYWN0PXR9O1hzLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm5vZGVNYXAuZ2V0KHQpfSxYcy5wcm90b3R5cGUuYWRkTm9kZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXRoaXMubm9kZU1hcC5nZXQodCk7cmV0dXJuIG51bGw9PT1lJiYoZT10aGlzLm5vZGVGYWN0LmNyZWF0ZU5vZGUodCksdGhpcy5ub2RlTWFwLnB1dCh0LGUpKSxlfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgWXMpe3ZhciBuPWFyZ3VtZW50c1swXSxyPXRoaXMubm9kZU1hcC5nZXQobi5nZXRDb29yZGluYXRlKCkpO3JldHVybiBudWxsPT09cj8odGhpcy5ub2RlTWFwLnB1dChuLmdldENvb3JkaW5hdGUoKSxuKSxuKTooci5tZXJnZUxhYmVsKG4pLHIpfX0sWHMucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5wcmludCh0KX19LFhzLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVNYXAudmFsdWVzKCkuaXRlcmF0b3IoKX0sWHMucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVNYXAudmFsdWVzKCl9LFhzLnByb3RvdHlwZS5nZXRCb3VuZGFyeU5vZGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj10aGlzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtyLmdldExhYmVsKCkuZ2V0TG9jYXRpb24odCk9PT1iaS5CT1VOREFSWSYmZS5hZGQocil9cmV0dXJuIGV9LFhzLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRDb29yZGluYXRlKCk7dGhpcy5hZGROb2RlKGUpLmFkZCh0KX0sWHMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFhzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYc307dmFyIFdzPWZ1bmN0aW9uKCl7fSxIcz17TkU6e2NvbmZpZ3VyYWJsZTohMH0sTlc6e2NvbmZpZ3VyYWJsZTohMH0sU1c6e2NvbmZpZ3VyYWJsZTohMH0sU0U6e2NvbmZpZ3VyYWJsZTohMH19O1dzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxXcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gV3N9LFdzLmlzTm9ydGhlcm49ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1Xcy5ORXx8dD09PVdzLk5XfSxXcy5pc09wcG9zaXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQhPT1lJiYyPT09KHQtZSs0KSU0fSxXcy5jb21tb25IYWxmUGxhbmU9ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gdDtpZigyPT09KHQtZSs0KSU0KXJldHVybi0xO3ZhciBuPXQ8ZT90OmU7cmV0dXJuIDA9PT1uJiYzPT09KHQ+ZT90OmUpPzM6bn0sV3MuaXNJbkhhbGZQbGFuZT1mdW5jdGlvbih0LGUpe3JldHVybiBlPT09V3MuU0U/dD09PVdzLlNFfHx0PT09V3MuU1c6dD09PWV8fHQ9PT1lKzF9LFdzLnF1YWRyYW50PWZ1bmN0aW9uKCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYoMD09PXQmJjA9PT1lKXRocm93IG5ldyBoaTtyZXR1cm4gdD49MD9lPj0wP1dzLk5FOldzLlNFOmU+PTA/V3MuTlc6V3MuU1d9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO2lmKHIueD09PW4ueCYmci55PT09bi55KXRocm93IG5ldyBoaTtyZXR1cm4gci54Pj1uLng/ci55Pj1uLnk/V3MuTkU6V3MuU0U6ci55Pj1uLnk/V3MuTlc6V3MuU1d9fSxIcy5ORS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSHMuTlcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LEhzLlNXLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxIcy5TRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gM30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoV3MsSHMpO3ZhciBacz1mdW5jdGlvbigpe2lmKHRoaXMuX2VkZ2U9bnVsbCx0aGlzLl9sYWJlbD1udWxsLHRoaXMuX25vZGU9bnVsbCx0aGlzLl9wMD1udWxsLHRoaXMuX3AxPW51bGwsdGhpcy5fZHg9bnVsbCx0aGlzLl9keT1udWxsLHRoaXMuX3F1YWRyYW50PW51bGwsMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9lZGdlPXR9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO3RoaXMuX2VkZ2U9ZSx0aGlzLmluaXQobixyKSx0aGlzLl9sYWJlbD1udWxsfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1szXTt0aGlzLl9lZGdlPWksdGhpcy5pbml0KG8scyksdGhpcy5fbGFiZWw9YX19O1pzLnByb3RvdHlwZS5jb21wYXJlRGlyZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9keD09PXQuX2R4JiZ0aGlzLl9keT09PXQuX2R5PzA6dGhpcy5fcXVhZHJhbnQ+dC5fcXVhZHJhbnQ/MTp0aGlzLl9xdWFkcmFudDx0Ll9xdWFkcmFudD8tMTplby5jb21wdXRlT3JpZW50YXRpb24odC5fcDAsdC5fcDEsdGhpcy5fcDEpfSxacy5wcm90b3R5cGUuZ2V0RHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHl9LFpzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3AwfSxacy5wcm90b3R5cGUuc2V0Tm9kZT1mdW5jdGlvbih0KXt0aGlzLl9ub2RlPXR9LFpzLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLmF0YW4yKHRoaXMuX2R5LHRoaXMuX2R4KSxuPXRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkscj1uLmxhc3RJbmRleE9mKCIuIiksaT1uLnN1YnN0cmluZyhyKzEpO3QucHJpbnQoIiAgIitpKyI6ICIrdGhpcy5fcDArIiAtICIrdGhpcy5fcDErIiAiK3RoaXMuX3F1YWRyYW50KyI6IitlKyIgICAiK3RoaXMuX2xhYmVsKX0sWnMucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLmNvbXBhcmVEaXJlY3Rpb24oZSl9LFpzLnByb3RvdHlwZS5nZXREaXJlY3RlZENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcDF9LFpzLnByb3RvdHlwZS5nZXREeD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9keH0sWnMucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxacy5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxacy5wcm90b3R5cGUuZ2V0UXVhZHJhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcXVhZHJhbnR9LFpzLnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGV9LFpzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PU1hdGguYXRhbjIodGhpcy5fZHksdGhpcy5fZHgpLGU9dGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSxuPWUubGFzdEluZGV4T2YoIi4iKTtyZXR1cm4iICAiK2Uuc3Vic3RyaW5nKG4rMSkrIjogIit0aGlzLl9wMCsiIC0gIit0aGlzLl9wMSsiICIrdGhpcy5fcXVhZHJhbnQrIjoiK3QrIiAgICIrdGhpcy5fbGFiZWx9LFpzLnByb3RvdHlwZS5jb21wdXRlTGFiZWw9ZnVuY3Rpb24odCl7fSxacy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUpe3RoaXMuX3AwPXQsdGhpcy5fcDE9ZSx0aGlzLl9keD1lLngtdC54LHRoaXMuX2R5PWUueS10LnksdGhpcy5fcXVhZHJhbnQ9V3MucXVhZHJhbnQodGhpcy5fZHgsdGhpcy5fZHkpLFppLmlzVHJ1ZSghKDA9PT10aGlzLl9keCYmMD09PXRoaXMuX2R5KSwiRWRnZUVuZCB3aXRoIGlkZW50aWNhbCBlbmRwb2ludHMgZm91bmQiKX0sWnMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0sWnMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFpzfTt2YXIgS3M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0LmNhbGwodGhpcyxlKSx0aGlzLl9pc0ZvcndhcmQ9bnVsbCx0aGlzLl9pc0luUmVzdWx0PSExLHRoaXMuX2lzVmlzaXRlZD0hMSx0aGlzLl9zeW09bnVsbCx0aGlzLl9uZXh0PW51bGwsdGhpcy5fbmV4dE1pbj1udWxsLHRoaXMuX2VkZ2VSaW5nPW51bGwsdGhpcy5fbWluRWRnZVJpbmc9bnVsbCx0aGlzLl9kZXB0aD1bMCwtOTk5LC05OTldLHRoaXMuX2lzRm9yd2FyZD1uLG4pdGhpcy5pbml0KGUuZ2V0Q29vcmRpbmF0ZSgwKSxlLmdldENvb3JkaW5hdGUoMSkpO2Vsc2V7dmFyIHI9ZS5nZXROdW1Qb2ludHMoKS0xO3RoaXMuaW5pdChlLmdldENvb3JkaW5hdGUociksZS5nZXRDb29yZGluYXRlKHItMSkpfXRoaXMuY29tcHV0ZURpcmVjdGVkTGFiZWwoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0TmV4dE1pbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9uZXh0TWlufSxlLnByb3RvdHlwZS5nZXREZXB0aD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGVwdGhbdF19LGUucHJvdG90eXBlLnNldFZpc2l0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNWaXNpdGVkPXR9LGUucHJvdG90eXBlLmNvbXB1dGVEaXJlY3RlZExhYmVsPWZ1bmN0aW9uKCl7dGhpcy5fbGFiZWw9bmV3IGpzKHRoaXMuX2VkZ2UuZ2V0TGFiZWwoKSksdGhpcy5faXNGb3J3YXJkfHx0aGlzLl9sYWJlbC5mbGlwKCl9LGUucHJvdG90eXBlLmdldE5leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV4dH0sZS5wcm90b3R5cGUuc2V0RGVwdGg9ZnVuY3Rpb24odCxlKXtpZigtOTk5IT09dGhpcy5fZGVwdGhbdF0mJnRoaXMuX2RlcHRoW3RdIT09ZSl0aHJvdyBuZXcgUnMoImFzc2lnbmVkIGRlcHRocyBkbyBub3QgbWF0Y2giLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpKTt0aGlzLl9kZXB0aFt0XT1lfSxlLnByb3RvdHlwZS5pc0ludGVyaW9yQXJlYUVkZ2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPSEwLG49MDtuPDI7bisrKXQuX2xhYmVsLmlzQXJlYShuKSYmdC5fbGFiZWwuZ2V0TG9jYXRpb24obixGcy5MRUZUKT09PWJpLklOVEVSSU9SJiZ0Ll9sYWJlbC5nZXRMb2NhdGlvbihuLEZzLlJJR0hUKT09PWJpLklOVEVSSU9SfHwoZT0hMSk7cmV0dXJuIGV9LGUucHJvdG90eXBlLnNldE5leHRNaW49ZnVuY3Rpb24odCl7dGhpcy5fbmV4dE1pbj10fSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5wcmludC5jYWxsKHRoaXMsZSksZS5wcmludCgiICIrdGhpcy5fZGVwdGhbRnMuTEVGVF0rIi8iK3RoaXMuX2RlcHRoW0ZzLlJJR0hUXSksZS5wcmludCgiICgiK3RoaXMuZ2V0RGVwdGhEZWx0YSgpKyIpIiksdGhpcy5faXNJblJlc3VsdCYmZS5wcmludCgiIGluUmVzdWx0Iil9LGUucHJvdG90eXBlLnNldE1pbkVkZ2VSaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX21pbkVkZ2VSaW5nPXR9LGUucHJvdG90eXBlLmlzTGluZUVkZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9sYWJlbC5pc0xpbmUoMCl8fHRoaXMuX2xhYmVsLmlzTGluZSgxKSxlPSF0aGlzLl9sYWJlbC5pc0FyZWEoMCl8fHRoaXMuX2xhYmVsLmFsbFBvc2l0aW9uc0VxdWFsKDAsYmkuRVhURVJJT1IpLG49IXRoaXMuX2xhYmVsLmlzQXJlYSgxKXx8dGhpcy5fbGFiZWwuYWxsUG9zaXRpb25zRXF1YWwoMSxiaS5FWFRFUklPUik7cmV0dXJuIHQmJmUmJm59LGUucHJvdG90eXBlLnNldEVkZ2VSaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VSaW5nPXR9LGUucHJvdG90eXBlLmdldE1pbkVkZ2VSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbkVkZ2VSaW5nfSxlLnByb3RvdHlwZS5nZXREZXB0aERlbHRhPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWRnZS5nZXREZXB0aERlbHRhKCk7cmV0dXJuIHRoaXMuX2lzRm9yd2FyZHx8KHQ9LXQpLHR9LGUucHJvdG90eXBlLnNldEluUmVzdWx0PWZ1bmN0aW9uKHQpe3RoaXMuX2lzSW5SZXN1bHQ9dH0sZS5wcm90b3R5cGUuZ2V0U3ltPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bX0sZS5wcm90b3R5cGUuaXNGb3J3YXJkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRm9yd2FyZH0sZS5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxlLnByb3RvdHlwZS5wcmludEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5wcmludCh0KSx0LnByaW50KCIgIiksdGhpcy5faXNGb3J3YXJkP3RoaXMuX2VkZ2UucHJpbnQodCk6dGhpcy5fZWRnZS5wcmludFJldmVyc2UodCl9LGUucHJvdG90eXBlLnNldFN5bT1mdW5jdGlvbih0KXt0aGlzLl9zeW09dH0sZS5wcm90b3R5cGUuc2V0VmlzaXRlZEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5zZXRWaXNpdGVkKHQpLHRoaXMuX3N5bS5zZXRWaXNpdGVkKHQpfSxlLnByb3RvdHlwZS5zZXRFZGdlRGVwdGhzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRFZGdlKCkuZ2V0RGVwdGhEZWx0YSgpO3RoaXMuX2lzRm9yd2FyZHx8KG49LW4pO3ZhciByPTE7dD09PUZzLkxFRlQmJihyPS0xKTt2YXIgaT1Gcy5vcHBvc2l0ZSh0KSxvPWUrbipyO3RoaXMuc2V0RGVwdGgodCxlKSx0aGlzLnNldERlcHRoKGksbyl9LGUucHJvdG90eXBlLmdldEVkZ2VSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VSaW5nfSxlLnByb3RvdHlwZS5pc0luUmVzdWx0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSW5SZXN1bHR9LGUucHJvdG90eXBlLnNldE5leHQ9ZnVuY3Rpb24odCl7dGhpcy5fbmV4dD10fSxlLnByb3RvdHlwZS5pc1Zpc2l0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWaXNpdGVkfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmRlcHRoRmFjdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1iaS5FWFRFUklPUiYmZT09PWJpLklOVEVSSU9SPzE6dD09PWJpLklOVEVSSU9SJiZlPT09YmkuRVhURVJJT1I/LTE6MH0sZX0oWnMpLEpzPWZ1bmN0aW9uKCl7fTtKcy5wcm90b3R5cGUuY3JlYXRlTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFlzKHQsbnVsbCl9LEpzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxKcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSnN9O3ZhciBRcz1mdW5jdGlvbigpe2lmKHRoaXMuX2VkZ2VzPW5ldyB4byx0aGlzLl9ub2Rlcz1udWxsLHRoaXMuX2VkZ2VFbmRMaXN0PW5ldyB4bywwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLl9ub2Rlcz1uZXcgWHMobmV3IEpzKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbm9kZXM9bmV3IFhzKHQpfX07UXMucHJvdG90eXBlLnByaW50RWRnZXM9ZnVuY3Rpb24odCl7dC5wcmludGxuKCJFZGdlczoiKTtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VzLnNpemUoKTtlKyspe3QucHJpbnRsbigiZWRnZSAiK2UrIjoiKTt2YXIgbj10aGlzLl9lZGdlcy5nZXQoZSk7bi5wcmludCh0KSxuLmVpTGlzdC5wcmludCh0KX19LFFzLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ub2Rlcy5maW5kKHQpfSxRcy5wcm90b3R5cGUuYWRkTm9kZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgWXMpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fbm9kZXMuYWRkTm9kZSh0KX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX25vZGVzLmFkZE5vZGUoZSl9fSxRcy5wcm90b3R5cGUuZ2V0Tm9kZUl0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzLml0ZXJhdG9yKCl9LFFzLnByb3RvdHlwZS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ub2Rlcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcygpfX0sUXMucHJvdG90eXBlLmRlYnVnUHJpbnRsbj1mdW5jdGlvbih0KXtraS5vdXQucHJpbnRsbih0KX0sUXMucHJvdG90eXBlLmlzQm91bmRhcnlOb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZXMuZmluZChlKTtpZihudWxsPT09bilyZXR1cm4hMTt2YXIgcj1uLmdldExhYmVsKCk7cmV0dXJuIG51bGwhPT1yJiZyLmdldExvY2F0aW9uKHQpPT09YmkuQk9VTkRBUll9LFFzLnByb3RvdHlwZS5saW5rQWxsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ub2Rlcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5saW5rQWxsRGlyZWN0ZWRFZGdlcygpfX0sUXMucHJvdG90eXBlLm1hdGNoSW5TYW1lRGlyZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiEhdC5lcXVhbHMobikmJihlby5jb21wdXRlT3JpZW50YXRpb24odCxlLHIpPT09ZW8uQ09MTElORUFSJiZXcy5xdWFkcmFudCh0LGUpPT09V3MucXVhZHJhbnQobixyKSl9LFFzLnByb3RvdHlwZS5nZXRFZGdlRW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlRW5kTGlzdH0sUXMucHJvdG90eXBlLmRlYnVnUHJpbnQ9ZnVuY3Rpb24odCl7a2kub3V0LnByaW50KHQpfSxRcy5wcm90b3R5cGUuZ2V0RWRnZUl0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzLml0ZXJhdG9yKCl9LFFzLnByb3RvdHlwZS5maW5kRWRnZUluU2FtZURpcmVjdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLHI9MDtyPHRoaXMuX2VkZ2VzLnNpemUoKTtyKyspe3ZhciBpPW4uX2VkZ2VzLmdldChyKSxvPWkuZ2V0Q29vcmRpbmF0ZXMoKTtpZihuLm1hdGNoSW5TYW1lRGlyZWN0aW9uKHQsZSxvWzBdLG9bMV0pfHxuLm1hdGNoSW5TYW1lRGlyZWN0aW9uKHQsZSxvW28ubGVuZ3RoLTFdLG9bby5sZW5ndGgtMl0pKXJldHVybiBpfXJldHVybiBudWxsfSxRcy5wcm90b3R5cGUuaW5zZXJ0RWRnZT1mdW5jdGlvbih0KXt0aGlzLl9lZGdlcy5hZGQodCl9LFFzLnByb3RvdHlwZS5maW5kRWRnZUVuZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5nZXRFZGdlRW5kcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtpZihuLmdldEVkZ2UoKT09PXQpcmV0dXJuIG59cmV0dXJuIG51bGx9LFFzLnByb3RvdHlwZS5hZGRFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPXQuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2UuX2VkZ2VzLmFkZChyKTt2YXIgaT1uZXcgS3MociwhMCksbz1uZXcgS3MociwhMSk7aS5zZXRTeW0obyksby5zZXRTeW0oaSksZS5hZGQoaSksZS5hZGQobyl9fSxRcy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuX25vZGVzLmFkZCh0KSx0aGlzLl9lZGdlRW5kTGlzdC5hZGQodCl9LFFzLnByb3RvdHlwZS5nZXROb2Rlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2Rlcy52YWx1ZXMoKX0sUXMucHJvdG90eXBlLmZpbmRFZGdlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0aGlzLl9lZGdlcy5zaXplKCk7bisrKXt2YXIgcj10aGlzLl9lZGdlcy5nZXQobiksaT1yLmdldENvb3JkaW5hdGVzKCk7aWYodC5lcXVhbHMoaVswXSkmJmUuZXF1YWxzKGlbMV0pKXJldHVybiByfXJldHVybiBudWxsfSxRcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFFzfSxRcy5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkuZ2V0RWRnZXMoKS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcygpfX07dmFyICRzPWZ1bmN0aW9uKCl7dGhpcy5fZ2VvbWV0cnlGYWN0b3J5PW51bGwsdGhpcy5fc2hlbGxMaXN0PW5ldyB4bzt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZ2VvbWV0cnlGYWN0b3J5PXR9OyRzLnByb3RvdHlwZS5zb3J0U2hlbGxzQW5kSG9sZXM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10Lml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpLmlzSG9sZSgpP24uYWRkKGkpOmUuYWRkKGkpfX0sJHMucHJvdG90eXBlLmNvbXB1dGVQb2x5Z29ucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCkudG9Qb2x5Z29uKHRoaXMuX2dlb21ldHJ5RmFjdG9yeSk7ZS5hZGQocil9cmV0dXJuIGV9LCRzLnByb3RvdHlwZS5wbGFjZUZyZWVIb2xlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihudWxsPT09ci5nZXRTaGVsbCgpKXt2YXIgaT10aGlzLmZpbmRFZGdlUmluZ0NvbnRhaW5pbmcocix0KTtpZihudWxsPT09aSl0aHJvdyBuZXcgUnMoInVuYWJsZSB0byBhc3NpZ24gaG9sZSB0byBhIHNoZWxsIixyLmdldENvb3JkaW5hdGUoMCkpO3Iuc2V0U2hlbGwoaSl9fX0sJHMucHJvdG90eXBlLmJ1aWxkTWluaW1hbEVkZ2VSaW5ncz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW5ldyB4byxpPXQuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpO2lmKG8uZ2V0TWF4Tm9kZURlZ3JlZSgpPjIpe28ubGlua0RpcmVjdGVkRWRnZXNGb3JNaW5pbWFsRWRnZVJpbmdzKCk7dmFyIHM9by5idWlsZE1pbmltYWxSaW5ncygpLGE9dGhpcy5maW5kU2hlbGwocyk7bnVsbCE9PWE/KHRoaXMucGxhY2VQb2x5Z29uSG9sZXMoYSxzKSxlLmFkZChhKSk6bi5hZGRBbGwocyl9ZWxzZSByLmFkZChvKX1yZXR1cm4gcn0sJHMucHJvdG90eXBlLmNvbnRhaW5zUG9pbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3NoZWxsTGlzdC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7aWYoZS5uZXh0KCkuY29udGFpbnNQb2ludCh0KSlyZXR1cm4hMH1yZXR1cm4hMX0sJHMucHJvdG90eXBlLmJ1aWxkTWF4aW1hbEVkZ2VSaW5ncz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYoci5pc0luUmVzdWx0KCkmJnIuZ2V0TGFiZWwoKS5pc0FyZWEoKSYmbnVsbD09PXIuZ2V0RWRnZVJpbmcoKSl7dmFyIGk9bmV3IFZzKHIsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5KTtlLmFkZChpKSxpLnNldEluUmVzdWx0KCl9fXJldHVybiBlfSwkcy5wcm90b3R5cGUucGxhY2VQb2x5Z29uSG9sZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ci5pc0hvbGUoKSYmci5zZXRTaGVsbCh0KX19LCRzLnByb3RvdHlwZS5nZXRQb2x5Z29ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGVQb2x5Z29ucyh0aGlzLl9zaGVsbExpc3QpfSwkcy5wcm90b3R5cGUuZmluZEVkZ2VSaW5nQ29udGFpbmluZz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmdldExpbmVhclJpbmcoKSxyPW4uZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLGk9bi5nZXRDb29yZGluYXRlTigwKSxvPW51bGwscz1udWxsLGE9ZS5pdGVyYXRvcigpO2EuaGFzTmV4dCgpOyl7dmFyIHU9YS5uZXh0KCksYz11LmdldExpbmVhclJpbmcoKSxsPWMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpO251bGwhPT1vJiYocz1vLmdldExpbmVhclJpbmcoKS5nZXRFbnZlbG9wZUludGVybmFsKCkpO3ZhciBoPSExO2wuY29udGFpbnMocikmJmVvLmlzUG9pbnRJblJpbmcoaSxjLmdldENvb3JkaW5hdGVzKCkpJiYoaD0hMCksaCYmKG51bGw9PT1vfHxzLmNvbnRhaW5zKGwpKSYmKG89dSl9cmV0dXJuIG99LCRzLnByb3RvdHlwZS5maW5kU2hlbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj1udWxsLHI9dC5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7aS5pc0hvbGUoKXx8KG49aSxlKyspfXJldHVybiBaaS5pc1RydWUoZTw9MSwiZm91bmQgdHdvIHNoZWxscyBpbiBNaW5pbWFsRWRnZVJpbmcgbGlzdCIpLG59LCRzLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuYWRkKHQuZ2V0RWRnZUVuZHMoKSx0LmdldE5vZGVzKCkpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtRcy5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcyhhcmd1bWVudHNbMV0pO3ZhciBuPXRoaXMuYnVpbGRNYXhpbWFsRWRnZVJpbmdzKGUpLHI9bmV3IHhvLGk9dGhpcy5idWlsZE1pbmltYWxFZGdlUmluZ3Mobix0aGlzLl9zaGVsbExpc3Qscik7dGhpcy5zb3J0U2hlbGxzQW5kSG9sZXMoaSx0aGlzLl9zaGVsbExpc3QsciksdGhpcy5wbGFjZUZyZWVIb2xlcyh0aGlzLl9zaGVsbExpc3Qscil9fSwkcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sJHMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICRzfTt2YXIgdGE9ZnVuY3Rpb24oKXt9O3RhLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oKXt9LHRhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx0YS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGF9O3ZhciBlYT1mdW5jdGlvbigpe3RoaXMuX2JvdW5kcz1udWxsLHRoaXMuX2l0ZW09bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fYm91bmRzPXQsdGhpcy5faXRlbT1lfTtlYS5wcm90b3R5cGUuZ2V0SXRlbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pdGVtfSxlYS5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvdW5kc30sZWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3RhLG1pXX0sZWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGVhfTt2YXIgbmE9ZnVuY3Rpb24oKXt0aGlzLl9zaXplPW51bGwsdGhpcy5faXRlbXM9bnVsbCx0aGlzLl9zaXplPTAsdGhpcy5faXRlbXM9bmV3IHhvLHRoaXMuX2l0ZW1zLmFkZChudWxsKX07bmEucHJvdG90eXBlLnBvbGw9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt2YXIgdD10aGlzLl9pdGVtcy5nZXQoMSk7cmV0dXJuIHRoaXMuX2l0ZW1zLnNldCgxLHRoaXMuX2l0ZW1zLmdldCh0aGlzLl9zaXplKSksdGhpcy5fc2l6ZS09MSx0aGlzLnJlb3JkZXIoMSksdH0sbmEucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZX0sbmEucHJvdG90eXBlLnJlb3JkZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj1udWxsLHI9dGhpcy5faXRlbXMuZ2V0KHQpOzIqdDw9dGhpcy5fc2l6ZSYmKChuPTIqdCkhPT1lLl9zaXplJiZlLl9pdGVtcy5nZXQobisxKS5jb21wYXJlVG8oZS5faXRlbXMuZ2V0KG4pKTwwJiZuKyssZS5faXRlbXMuZ2V0KG4pLmNvbXBhcmVUbyhyKTwwKTt0PW4pZS5faXRlbXMuc2V0KHQsZS5faXRlbXMuZ2V0KG4pKTt0aGlzLl9pdGVtcy5zZXQodCxyKX0sbmEucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fc2l6ZT0wLHRoaXMuX2l0ZW1zLmNsZWFyKCl9LG5hLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9zaXplfSxuYS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuX2l0ZW1zLmFkZChudWxsKSx0aGlzLl9zaXplKz0xO3ZhciBlPXRoaXMuX3NpemU7Zm9yKHRoaXMuX2l0ZW1zLnNldCgwLHQpO3QuY29tcGFyZVRvKHRoaXMuX2l0ZW1zLmdldChNYXRoLnRydW5jKGUvMikpKTwwO2UvPTIpdGhpcy5faXRlbXMuc2V0KGUsdGhpcy5faXRlbXMuZ2V0KE1hdGgudHJ1bmMoZS8yKSkpO3RoaXMuX2l0ZW1zLnNldChlLHQpfSxuYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG5hfTt2YXIgcmE9ZnVuY3Rpb24oKXt9O3JhLnByb3RvdHlwZS52aXNpdEl0ZW09ZnVuY3Rpb24odCl7fSxyYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHJhfTt2YXIgaWE9ZnVuY3Rpb24oKXt9O2lhLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlKXt9LGlhLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCxlKXt9LGlhLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe30saWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGlhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBpYX07dmFyIG9hPWZ1bmN0aW9uKCl7aWYodGhpcy5fY2hpbGRCb3VuZGFibGVzPW5ldyB4byx0aGlzLl9ib3VuZHM9bnVsbCx0aGlzLl9sZXZlbD1udWxsLDAhPT1hcmd1bWVudHMubGVuZ3RoJiYxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xldmVsPXR9fSxzYT17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07b2EucHJvdG90eXBlLmdldExldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xldmVsfSxvYS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZEJvdW5kYWJsZXMuc2l6ZSgpfSxvYS5wcm90b3R5cGUuZ2V0Q2hpbGRCb3VuZGFibGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQm91bmRhYmxlc30sb2EucHJvdG90eXBlLmFkZENoaWxkQm91bmRhYmxlPWZ1bmN0aW9uKHQpe1ppLmlzVHJ1ZShudWxsPT09dGhpcy5fYm91bmRzKSx0aGlzLl9jaGlsZEJvdW5kYWJsZXMuYWRkKHQpfSxvYS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZEJvdW5kYWJsZXMuaXNFbXB0eSgpfSxvYS5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9ib3VuZHMmJih0aGlzLl9ib3VuZHM9dGhpcy5jb21wdXRlQm91bmRzKCkpLHRoaXMuX2JvdW5kc30sb2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3RhLG1pXX0sb2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG9hfSxzYS5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDVhMWU1NWVjNDEzNjk4MDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG9hLHNhKTt2YXIgYWE9ZnVuY3Rpb24oKXt9O2FhLnJldmVyc2VPcmRlcj1mdW5jdGlvbigpe3JldHVybntjb21wYXJlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuY29tcGFyZVRvKHQpfX19LGFhLm1pbj1mdW5jdGlvbih0KXtyZXR1cm4gYWEuc29ydCh0KSx0LmdldCgwKX0sYWEuc29ydD1mdW5jdGlvbih0LGUpe3ZhciBuPXQudG9BcnJheSgpO2U/Vm8uc29ydChuLGUpOlZvLnNvcnQobik7Zm9yKHZhciByPXQuaXRlcmF0b3IoKSxpPTAsbz1uLmxlbmd0aDtpPG87aSsrKXIubmV4dCgpLHIuc2V0KG5baV0pfSxhYS5zaW5nbGV0b25MaXN0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB4bztyZXR1cm4gZS5hZGQodCksZX07dmFyIHVhPWZ1bmN0aW9uKCl7dGhpcy5fYm91bmRhYmxlMT1udWxsLHRoaXMuX2JvdW5kYWJsZTI9bnVsbCx0aGlzLl9kaXN0YW5jZT1udWxsLHRoaXMuX2l0ZW1EaXN0YW5jZT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTt0aGlzLl9ib3VuZGFibGUxPXQsdGhpcy5fYm91bmRhYmxlMj1lLHRoaXMuX2l0ZW1EaXN0YW5jZT1uLHRoaXMuX2Rpc3RhbmNlPXRoaXMuZGlzdGFuY2UoKX07dWEucHJvdG90eXBlLmV4cGFuZFRvUXVldWU9ZnVuY3Rpb24odCxlKXt2YXIgbj11YS5pc0NvbXBvc2l0ZSh0aGlzLl9ib3VuZGFibGUxKSxyPXVhLmlzQ29tcG9zaXRlKHRoaXMuX2JvdW5kYWJsZTIpO2lmKG4mJnIpcmV0dXJuIHVhLmFyZWEodGhpcy5fYm91bmRhYmxlMSk+dWEuYXJlYSh0aGlzLl9ib3VuZGFibGUyKT8odGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMSx0aGlzLl9ib3VuZGFibGUyLHQsZSksbnVsbCk6KHRoaXMuZXhwYW5kKHRoaXMuX2JvdW5kYWJsZTIsdGhpcy5fYm91bmRhYmxlMSx0LGUpLG51bGwpO2lmKG4pcmV0dXJuIHRoaXMuZXhwYW5kKHRoaXMuX2JvdW5kYWJsZTEsdGhpcy5fYm91bmRhYmxlMix0LGUpLG51bGw7aWYocilyZXR1cm4gdGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMix0aGlzLl9ib3VuZGFibGUxLHQsZSksbnVsbDt0aHJvdyBuZXcgaGl9LHVhLnByb3RvdHlwZS5pc0xlYXZlcz1mdW5jdGlvbigpe3JldHVybiEodWEuaXNDb21wb3NpdGUodGhpcy5fYm91bmRhYmxlMSl8fHVhLmlzQ29tcG9zaXRlKHRoaXMuX2JvdW5kYWJsZTIpKX0sdWEucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl9kaXN0YW5jZTxlLl9kaXN0YW5jZT8tMTp0aGlzLl9kaXN0YW5jZT5lLl9kaXN0YW5jZT8xOjB9LHVhLnByb3RvdHlwZS5leHBhbmQ9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPXQuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpLHM9bmV3IHVhKG8sZSx0aGlzLl9pdGVtRGlzdGFuY2UpO3MuZ2V0RGlzdGFuY2UoKTxyJiZuLmFkZChzKX19LHVhLnByb3RvdHlwZS5nZXRCb3VuZGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10P3RoaXMuX2JvdW5kYWJsZTE6dGhpcy5fYm91bmRhYmxlMn0sdWEucHJvdG90eXBlLmdldERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlfSx1YS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0xlYXZlcygpP3RoaXMuX2l0ZW1EaXN0YW5jZS5kaXN0YW5jZSh0aGlzLl9ib3VuZGFibGUxLHRoaXMuX2JvdW5kYWJsZTIpOnRoaXMuX2JvdW5kYWJsZTEuZ2V0Qm91bmRzKCkuZGlzdGFuY2UodGhpcy5fYm91bmRhYmxlMi5nZXRCb3VuZHMoKSl9LHVhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LHVhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB1YX0sdWEuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRCb3VuZHMoKS5nZXRBcmVhKCl9LHVhLmlzQ29tcG9zaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygb2F9O3ZhciBjYT1mdW5jdGlvbiB0KCl7aWYodGhpcy5fcm9vdD1udWxsLHRoaXMuX2J1aWx0PSExLHRoaXMuX2l0ZW1Cb3VuZGFibGVzPW5ldyB4byx0aGlzLl9ub2RlQ2FwYWNpdHk9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9dC5ERUZBVUxUX05PREVfQ0FQQUNJVFk7dGhpcy5fbm9kZUNhcGFjaXR5PWV9ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO1ppLmlzVHJ1ZShuPjEsIk5vZGUgY2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSIpLHRoaXMuX25vZGVDYXBhY2l0eT1ufX0sbGE9e0ludGVyc2VjdHNPcDp7Y29uZmlndXJhYmxlOiEwfSxzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfTk9ERV9DQVBBQ0lUWTp7Y29uZmlndXJhYmxlOiEwfX07Y2EucHJvdG90eXBlLmdldE5vZGVDYXBhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlQ2FwYWNpdHl9LGNhLnByb3RvdHlwZS5sYXN0Tm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQodC5zaXplKCktMSl9LGNhLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuaXNFbXB0eSgpPzA6KHRoaXMuYnVpbGQoKSx0aGlzLnNpemUodGhpcy5fcm9vdCkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHQ9MCxlPWFyZ3VtZW50c1swXS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7biBpbnN0YW5jZW9mIG9hP3QrPXRoaXMuc2l6ZShuKTpuIGluc3RhbmNlb2YgZWEmJih0Kz0xKX1yZXR1cm4gdH19LGNhLnByb3RvdHlwZS5yZW1vdmVJdGVtPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW51bGwscj10LmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpIGluc3RhbmNlb2YgZWEmJmkuZ2V0SXRlbSgpPT09ZSYmKG49aSl9cmV0dXJuIG51bGwhPT1uJiYodC5nZXRDaGlsZEJvdW5kYWJsZXMoKS5yZW1vdmUobiksITApfSxjYS5wcm90b3R5cGUuaXRlbXNUcmVlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe3RoaXMuYnVpbGQoKTt2YXIgdD10aGlzLml0ZW1zVHJlZSh0aGlzLl9yb290KTtyZXR1cm4gbnVsbD09PXQ/bmV3IHhvOnR9aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj1uZXcgeG8scj1lLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpZihpIGluc3RhbmNlb2Ygb2Epe3ZhciBvPXRoaXMuaXRlbXNUcmVlKGkpO251bGwhPT1vJiZuLmFkZChvKX1lbHNlIGkgaW5zdGFuY2VvZiBlYT9uLmFkZChpLmdldEl0ZW0oKSk6Wmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoKX1yZXR1cm4gbi5zaXplKCk8PTA/bnVsbDpufX0sY2EucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUpe1ppLmlzVHJ1ZSghdGhpcy5fYnVpbHQsIkNhbm5vdCBpbnNlcnQgaXRlbXMgaW50byBhbiBTVFIgcGFja2VkIFItdHJlZSBhZnRlciBpdCBoYXMgYmVlbiBidWlsdC4iKSx0aGlzLl9pdGVtQm91bmRhYmxlcy5hZGQobmV3IGVhKHQsZSkpfSxjYS5wcm90b3R5cGUuYm91bmRhYmxlc0F0TGV2ZWw9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IHhvO3JldHVybiB0aGlzLmJvdW5kYWJsZXNBdExldmVsKHQsdGhpcy5fcm9vdCxlKSxlfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07aWYoWmkuaXNUcnVlKG4+LTIpLHIuZ2V0TGV2ZWwoKT09PW4pcmV0dXJuIGkuYWRkKHIpLG51bGw7Zm9yKHZhciBvPXIuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpO3MgaW5zdGFuY2VvZiBvYT90aGlzLmJvdW5kYWJsZXNBdExldmVsKG4scyxpKTooWmkuaXNUcnVlKHMgaW5zdGFuY2VvZiBlYSksLTE9PT1uJiZpLmFkZChzKSl9cmV0dXJuIG51bGx9fSxjYS5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5idWlsZCgpO3ZhciBuPW5ldyB4bztyZXR1cm4gdGhpcy5pc0VtcHR5KCl8fHRoaXMuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyh0aGlzLl9yb290LmdldEJvdW5kcygpLGUpJiZ0aGlzLnF1ZXJ5KGUsdGhpcy5fcm9vdCxuKSxufWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07aWYodGhpcy5idWlsZCgpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBudWxsO3RoaXMuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyh0aGlzLl9yb290LmdldEJvdW5kcygpLHIpJiZ0aGlzLnF1ZXJ5KHIsdGhpcy5fcm9vdCxpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKEVpKGFyZ3VtZW50c1syXSxyYSkmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0JiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIG9hKWZvcih2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbMV0uZ2V0Q2hpbGRCb3VuZGFibGVzKCksdT0wO3U8YS5zaXplKCk7dSsrKXt2YXIgYz1hLmdldCh1KTshdC5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKGMuZ2V0Qm91bmRzKCksbyl8fChjIGluc3RhbmNlb2Ygb2E/dC5xdWVyeShvLGMscyk6YyBpbnN0YW5jZW9mIGVhP3MudmlzaXRJdGVtKGMuZ2V0SXRlbSgpKTpaaS5zaG91bGROZXZlclJlYWNoSGVyZSgpKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1syXSx2bykmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0JiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIG9hKWZvcih2YXIgbD1hcmd1bWVudHNbMF0saD1hcmd1bWVudHNbMl0sZj1hcmd1bWVudHNbMV0uZ2V0Q2hpbGRCb3VuZGFibGVzKCkscD0wO3A8Zi5zaXplKCk7cCsrKXt2YXIgZD1mLmdldChwKTshdC5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKGQuZ2V0Qm91bmRzKCksbCl8fChkIGluc3RhbmNlb2Ygb2E/dC5xdWVyeShsLGQsaCk6ZCBpbnN0YW5jZW9mIGVhP2guYWRkKGQuZ2V0SXRlbSgpKTpaaS5zaG91bGROZXZlclJlYWNoSGVyZSgpKX19LGNhLnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbigpe2lmKHRoaXMuX2J1aWx0KXJldHVybiBudWxsO3RoaXMuX3Jvb3Q9dGhpcy5faXRlbUJvdW5kYWJsZXMuaXNFbXB0eSgpP3RoaXMuY3JlYXRlTm9kZSgwKTp0aGlzLmNyZWF0ZUhpZ2hlckxldmVscyh0aGlzLl9pdGVtQm91bmRhYmxlcywtMSksdGhpcy5faXRlbUJvdW5kYWJsZXM9bnVsbCx0aGlzLl9idWlsdD0hMH0sY2EucHJvdG90eXBlLmdldFJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWlsZCgpLHRoaXMuX3Jvb3R9LGNhLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmJ1aWxkKCksISF0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModGhpcy5fcm9vdC5nZXRCb3VuZHMoKSx0KSYmdGhpcy5yZW1vdmUodCx0aGlzLl9yb290LGUpfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl0sbz10aGlzLnJlbW92ZUl0ZW0ocixpKTtpZihvKXJldHVybiEwO2Zvcih2YXIgcz1udWxsLGE9ci5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO2EuaGFzTmV4dCgpOyl7dmFyIHU9YS5uZXh0KCk7aWYodGhpcy5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKHUuZ2V0Qm91bmRzKCksbikmJnUgaW5zdGFuY2VvZiBvYSYmKG89dGhpcy5yZW1vdmUobix1LGkpKSl7cz11O2JyZWFrfX1yZXR1cm4gbnVsbCE9PXMmJnMuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXNFbXB0eSgpJiZyLmdldENoaWxkQm91bmRhYmxlcygpLnJlbW92ZShzKSxvfX0sY2EucHJvdG90eXBlLmNyZWF0ZUhpZ2hlckxldmVscz1mdW5jdGlvbih0LGUpe1ppLmlzVHJ1ZSghdC5pc0VtcHR5KCkpO3ZhciBuPXRoaXMuY3JlYXRlUGFyZW50Qm91bmRhYmxlcyh0LGUrMSk7cmV0dXJuIDE9PT1uLnNpemUoKT9uLmdldCgwKTp0aGlzLmNyZWF0ZUhpZ2hlckxldmVscyhuLGUrMSl9LGNhLnByb3RvdHlwZS5kZXB0aD1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmlzRW1wdHkoKT8wOih0aGlzLmJ1aWxkKCksdGhpcy5kZXB0aCh0aGlzLl9yb290KSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD0wLGU9YXJndW1lbnRzWzBdLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtpZihuIGluc3RhbmNlb2Ygb2Epe3ZhciByPXRoaXMuZGVwdGgobik7cj50JiYodD1yKX19cmV0dXJuIHQrMX19LGNhLnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztaaS5pc1RydWUoIXQuaXNFbXB0eSgpKTt2YXIgcj1uZXcgeG87ci5hZGQodGhpcy5jcmVhdGVOb2RlKGUpKTt2YXIgaT1uZXcgeG8odCk7YWEuc29ydChpLHRoaXMuZ2V0Q29tcGFyYXRvcigpKTtmb3IodmFyIG89aS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCk7bi5sYXN0Tm9kZShyKS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5zaXplKCk9PT1uLmdldE5vZGVDYXBhY2l0eSgpJiZyLmFkZChuLmNyZWF0ZU5vZGUoZSkpLG4ubGFzdE5vZGUocikuYWRkQ2hpbGRCb3VuZGFibGUocyl9cmV0dXJuIHJ9LGNhLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1aWx0P3RoaXMuX3Jvb3QuaXNFbXB0eSgpOnRoaXMuX2l0ZW1Cb3VuZGFibGVzLmlzRW1wdHkoKX0sY2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW21pXX0sY2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGNhfSxjYS5jb21wYXJlRG91Ymxlcz1mdW5jdGlvbih0LGUpe3JldHVybiB0PmU/MTp0PGU/LTE6MH0sbGEuSW50ZXJzZWN0c09wLmdldD1mdW5jdGlvbigpe3JldHVybiBoYX0sbGEuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHgzNWVmNjRjODJkNGM1NDAwfSxsYS5ERUZBVUxUX05PREVfQ0FQQUNJVFkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDEwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjYSxsYSk7dmFyIGhhPWZ1bmN0aW9uKCl7fSxmYT1mdW5jdGlvbigpe307ZmEucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7fSxmYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGZhfTt2YXIgcGE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXtuPW58fGUuREVGQVVMVF9OT0RFX0NBUEFDSVRZLHQuY2FsbCh0aGlzLG4pfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtTVFJ0cmVlTm9kZTp7Y29uZmlndXJhYmxlOiEwfSxzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LHhDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LHlDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LGludGVyc2VjdHNPcDp7Y29uZmlndXJhYmxlOiEwfSxERUZBVUxUX05PREVfQ0FQQUNJVFk6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzRnJvbVZlcnRpY2FsU2xpY2VzPWZ1bmN0aW9uKHQsZSl7WmkuaXNUcnVlKHQubGVuZ3RoPjApO2Zvcih2YXIgbj1uZXcgeG8scj0wO3I8dC5sZW5ndGg7cisrKW4uYWRkQWxsKHRoaXMuY3JlYXRlUGFyZW50Qm91bmRhYmxlc0Zyb21WZXJ0aWNhbFNsaWNlKHRbcl0sZSkpO3JldHVybiBufSxlLnByb3RvdHlwZS5jcmVhdGVOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZGEodCl9LGUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dC5wcm90b3R5cGUuc2l6ZS5jYWxsKHRoaXMpOnQucHJvdG90eXBlLnNpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuaW5zZXJ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYoZS5pc051bGwoKSlyZXR1cm4gbnVsbDt0LnByb3RvdHlwZS5pbnNlcnQuY2FsbCh0aGlzLGUsbil9LGUucHJvdG90eXBlLmdldEludGVyc2VjdHNPcD1mdW5jdGlvbigpe3JldHVybiBlLmludGVyc2VjdHNPcH0sZS5wcm90b3R5cGUudmVydGljYWxTbGljZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49TWF0aC50cnVuYyhNYXRoLmNlaWwodC5zaXplKCkvZSkpLHI9bmV3IEFycmF5KGUpLmZpbGwobnVsbCksaT10Lml0ZXJhdG9yKCksbz0wO288ZTtvKyspe3Jbb109bmV3IHhvO2Zvcih2YXIgcz0wO2kuaGFzTmV4dCgpJiZzPG47KXt2YXIgYT1pLm5leHQoKTtyW29dLmFkZChhKSxzKyt9fXJldHVybiByfSxlLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHQucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxlKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3QucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxuLHIpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoRWkoYXJndW1lbnRzWzJdLHJhKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3QmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygb2Epe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXTt0LnByb3RvdHlwZS5xdWVyeS5jYWxsKHRoaXMsaSxvLHMpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzJdLHZvKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3QmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygb2Epe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxjPWFyZ3VtZW50c1syXTt0LnByb3RvdHlwZS5xdWVyeS5jYWxsKHRoaXMsYSx1LGMpfX0sZS5wcm90b3R5cGUuZ2V0Q29tcGFyYXRvcj1mdW5jdGlvbigpe3JldHVybiBlLnlDb21wYXJhdG9yfSxlLnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzRnJvbVZlcnRpY2FsU2xpY2U9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5wcm90b3R5cGUuY3JlYXRlUGFyZW50Qm91bmRhYmxlcy5jYWxsKHRoaXMsZSxuKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4gdC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyxlLG4pfXJldHVybiB0LnByb3RvdHlwZS5yZW1vdmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5kZXB0aD1mdW5jdGlvbigpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90LnByb3RvdHlwZS5kZXB0aC5jYWxsKHRoaXMpOnQucHJvdG90eXBlLmRlcHRoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuY3JlYXRlUGFyZW50Qm91bmRhYmxlcz1mdW5jdGlvbih0LG4pe1ppLmlzVHJ1ZSghdC5pc0VtcHR5KCkpO3ZhciByPU1hdGgudHJ1bmMoTWF0aC5jZWlsKHQuc2l6ZSgpL3RoaXMuZ2V0Tm9kZUNhcGFjaXR5KCkpKSxpPW5ldyB4byh0KTthYS5zb3J0KGksZS54Q29tcGFyYXRvcik7dmFyIG89dGhpcy52ZXJ0aWNhbFNsaWNlcyhpLE1hdGgudHJ1bmMoTWF0aC5jZWlsKE1hdGguc3FydChyKSkpKTtyZXR1cm4gdGhpcy5jcmVhdGVQYXJlbnRCb3VuZGFibGVzRnJvbVZlcnRpY2FsU2xpY2VzKG8sbil9LGUucHJvdG90eXBlLm5lYXJlc3ROZWlnaGJvdXI9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoRWkoYXJndW1lbnRzWzBdLGZhKSl7dmFyIHQ9YXJndW1lbnRzWzBdLG49bmV3IHVhKHRoaXMuZ2V0Um9vdCgpLHRoaXMuZ2V0Um9vdCgpLHQpO3JldHVybiB0aGlzLm5lYXJlc3ROZWlnaGJvdXIobil9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1YSl7dmFyIHI9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLm5lYXJlc3ROZWlnaGJvdXIocixmaS5QT1NJVElWRV9JTkZJTklUWSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgZSYmRWkoYXJndW1lbnRzWzFdLGZhKSl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9bmV3IHVhKHRoaXMuZ2V0Um9vdCgpLGkuZ2V0Um9vdCgpLG8pO3JldHVybiB0aGlzLm5lYXJlc3ROZWlnaGJvdXIocyl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1YSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxjPW51bGwsbD1uZXcgbmE7Zm9yKGwuYWRkKGEpOyFsLmlzRW1wdHkoKSYmdT4wOyl7dmFyIGg9bC5wb2xsKCksZj1oLmdldERpc3RhbmNlKCk7aWYoZj49dSlicmVhaztoLmlzTGVhdmVzKCk/KHU9ZixjPWgpOmguZXhwYW5kVG9RdWV1ZShsLHUpfXJldHVybltjLmdldEJvdW5kYWJsZSgwKS5nZXRJdGVtKCksYy5nZXRCb3VuZGFibGUoMSkuZ2V0SXRlbSgpXX19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHA9YXJndW1lbnRzWzJdLGQ9bmV3IGVhKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pLGc9bmV3IHVhKHRoaXMuZ2V0Um9vdCgpLGQscCk7cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihnKVswXX19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lhLG1pXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5jZW50cmVYPWZ1bmN0aW9uKHQpe3JldHVybiBlLmF2Zyh0LmdldE1pblgoKSx0LmdldE1heFgoKSl9LGUuYXZnPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQrZSkvMn0sZS5jZW50cmVZPWZ1bmN0aW9uKHQpe3JldHVybiBlLmF2Zyh0LmdldE1pblkoKSx0LmdldE1heFkoKSl9LG4uU1RSdHJlZU5vZGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGRhfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4Mzk5MjBmN2Q1ZjI2MWUwfSxuLnhDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybntpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVyblt5aV19LGNvbXBhcmU6ZnVuY3Rpb24obixyKXtyZXR1cm4gdC5jb21wYXJlRG91YmxlcyhlLmNlbnRyZVgobi5nZXRCb3VuZHMoKSksZS5jZW50cmVYKHIuZ2V0Qm91bmRzKCkpKX19fSxuLnlDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybntpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVyblt5aV19LGNvbXBhcmU6ZnVuY3Rpb24obixyKXtyZXR1cm4gdC5jb21wYXJlRG91YmxlcyhlLmNlbnRyZVkobi5nZXRCb3VuZHMoKSksZS5jZW50cmVZKHIuZ2V0Qm91bmRzKCkpKX19fSxuLmludGVyc2VjdHNPcC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm57aW50ZXJmYWNlc186ZnVuY3Rpb24oKXtyZXR1cm5bdC5JbnRlcnNlY3RzT3BdfSxpbnRlcnNlY3RzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaW50ZXJzZWN0cyhlKX19fSxuLkRFRkFVTFRfTk9ERV9DQVBBQ0lUWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oY2EpLGRhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1hcmd1bWVudHNbMF07dC5jYWxsKHRoaXMsZSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNvbXB1dGVCb3VuZHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bnVsbCxlPXRoaXMuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO251bGw9PT10P3Q9bmV3IGppKG4uZ2V0Qm91bmRzKCkpOnQuZXhwYW5kVG9JbmNsdWRlKG4uZ2V0Qm91bmRzKCkpfXJldHVybiB0fSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShvYSksZ2E9ZnVuY3Rpb24oKXt9O2dhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxnYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZ2F9LGdhLnJlbGF0aXZlU2lnbj1mdW5jdGlvbih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6MH0sZ2EuY29tcGFyZT1mdW5jdGlvbih0LGUsbil7aWYoZS5lcXVhbHMyRChuKSlyZXR1cm4gMDt2YXIgcj1nYS5yZWxhdGl2ZVNpZ24oZS54LG4ueCksaT1nYS5yZWxhdGl2ZVNpZ24oZS55LG4ueSk7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKHIsaSk7Y2FzZSAxOnJldHVybiBnYS5jb21wYXJlVmFsdWUoaSxyKTtjYXNlIDI6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZShpLC1yKTtjYXNlIDM6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZSgtcixpKTtjYXNlIDQ6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZSgtciwtaSk7Y2FzZSA1OnJldHVybiBnYS5jb21wYXJlVmFsdWUoLWksLXIpO2Nhc2UgNjpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKC1pLHIpO2Nhc2UgNzpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKHIsLWkpfXJldHVybiBaaS5zaG91bGROZXZlclJlYWNoSGVyZSgiaW52YWxpZCBvY3RhbnQgdmFsdWUiKSwwfSxnYS5jb21wYXJlVmFsdWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDwwPy0xOnQ+MD8xOmU8MD8tMTplPjA/MTowfTt2YXIgeWE9ZnVuY3Rpb24oKXt0aGlzLl9zZWdTdHJpbmc9bnVsbCx0aGlzLmNvb3JkPW51bGwsdGhpcy5zZWdtZW50SW5kZXg9bnVsbCx0aGlzLl9zZWdtZW50T2N0YW50PW51bGwsdGhpcy5faXNJbnRlcmlvcj1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPWFyZ3VtZW50c1szXTt0aGlzLl9zZWdTdHJpbmc9dCx0aGlzLmNvb3JkPW5ldyB2aShlKSx0aGlzLnNlZ21lbnRJbmRleD1uLHRoaXMuX3NlZ21lbnRPY3RhbnQ9cix0aGlzLl9pc0ludGVyaW9yPSFlLmVxdWFsczJEKHQuZ2V0Q29vcmRpbmF0ZShuKSl9O3lhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29vcmR9LHlhLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KHRoaXMuY29vcmQpLHQucHJpbnQoIiBzZWcgIyA9ICIrdGhpcy5zZWdtZW50SW5kZXgpfSx5YS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuc2VnbWVudEluZGV4PGUuc2VnbWVudEluZGV4Py0xOnRoaXMuc2VnbWVudEluZGV4PmUuc2VnbWVudEluZGV4PzE6dGhpcy5jb29yZC5lcXVhbHMyRChlLmNvb3JkKT8wOmdhLmNvbXBhcmUodGhpcy5fc2VnbWVudE9jdGFudCx0aGlzLmNvb3JkLGUuY29vcmQpfSx5YS5wcm90b3R5cGUuaXNFbmRQb2ludD1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuc2VnbWVudEluZGV4JiYhdGhpcy5faXNJbnRlcmlvcnx8dGhpcy5zZWdtZW50SW5kZXg9PT10fSx5YS5wcm90b3R5cGUuaXNJbnRlcmlvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0ludGVyaW9yfSx5YS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSx5YS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geWF9O3ZhciBtYT1mdW5jdGlvbigpe3RoaXMuX25vZGVNYXA9bmV3IGtvLHRoaXMuX2VkZ2U9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZWRnZT10fTttYS5wcm90b3R5cGUuZ2V0U3BsaXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3ZhciB0PW5ldyBibzt0aGlzLmFkZEVuZHBvaW50cygpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCksbj1lLm5leHQoKTtlLmhhc05leHQoKTspe3ZhciByPWUubmV4dCgpO3RoaXMuYWRkRWRnZUNvb3JkaW5hdGVzKG4scix0KSxuPXJ9cmV0dXJuIHQudG9Db29yZGluYXRlQXJyYXkoKX0sbWEucHJvdG90eXBlLmFkZENvbGxhcHNlZE5vZGVzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHhvO3RoaXMuZmluZENvbGxhcHNlc0Zyb21JbnNlcnRlZE5vZGVzKHQpLHRoaXMuZmluZENvbGxhcHNlc0Zyb21FeGlzdGluZ1ZlcnRpY2VzKHQpO2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKS5pbnRWYWx1ZSgpO3RoaXMuYWRkKHRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShuKSxuKX19LG1hLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50bG4oIkludGVyc2VjdGlvbnM6Iik7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0sbWEucHJvdG90eXBlLmZpbmRDb2xsYXBzZXNGcm9tRXhpc3RpbmdWZXJ0aWNlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2Uuc2l6ZSgpLTI7ZSsrKXt2YXIgbj10aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoZSkscj10aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoZSsyKTtuLmVxdWFsczJEKHIpJiZ0LmFkZChuZXcgTmkoZSsxKSl9fSxtYS5wcm90b3R5cGUuYWRkRWRnZUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoZS5zZWdtZW50SW5kZXgpLGk9ZS5pc0ludGVyaW9yKCl8fCFlLmNvb3JkLmVxdWFsczJEKHIpO24uYWRkKG5ldyB2aSh0LmNvb3JkKSwhMSk7Zm9yKHZhciBvPXQuc2VnbWVudEluZGV4KzE7bzw9ZS5zZWdtZW50SW5kZXg7bysrKW4uYWRkKHRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShvKSk7aSYmbi5hZGQobmV3IHZpKGUuY29vcmQpKX0sbWEucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVNYXAudmFsdWVzKCkuaXRlcmF0b3IoKX0sbWEucHJvdG90eXBlLmFkZFNwbGl0RWRnZXM9ZnVuY3Rpb24odCl7dGhpcy5hZGRFbmRwb2ludHMoKSx0aGlzLmFkZENvbGxhcHNlZE5vZGVzKCk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKSxuPWUubmV4dCgpO2UuaGFzTmV4dCgpOyl7dmFyIHI9ZS5uZXh0KCksaT10aGlzLmNyZWF0ZVNwbGl0RWRnZShuLHIpO3QuYWRkKGkpLG49cn19LG1hLnByb3RvdHlwZS5maW5kQ29sbGFwc2VJbmRleD1mdW5jdGlvbih0LGUsbil7aWYoIXQuY29vcmQuZXF1YWxzMkQoZS5jb29yZCkpcmV0dXJuITE7dmFyIHI9ZS5zZWdtZW50SW5kZXgtdC5zZWdtZW50SW5kZXg7cmV0dXJuIGUuaXNJbnRlcmlvcigpfHxyLS0sMT09PXImJihuWzBdPXQuc2VnbWVudEluZGV4KzEsITApfSxtYS5wcm90b3R5cGUuZmluZENvbGxhcHNlc0Zyb21JbnNlcnRlZE5vZGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkoMSkuZmlsbChudWxsKSxuPXRoaXMuaXRlcmF0b3IoKSxyPW4ubmV4dCgpO24uaGFzTmV4dCgpOyl7dmFyIGk9bi5uZXh0KCk7dGhpcy5maW5kQ29sbGFwc2VJbmRleChyLGksZSkmJnQuYWRkKG5ldyBOaShlWzBdKSkscj1pfX0sbWEucHJvdG90eXBlLmdldEVkZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZX0sbWEucHJvdG90eXBlLmFkZEVuZHBvaW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2VkZ2Uuc2l6ZSgpLTE7dGhpcy5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKDApLDApLHRoaXMuYWRkKHRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZSh0KSx0KX0sbWEucHJvdG90eXBlLmNyZWF0ZVNwbGl0RWRnZT1mdW5jdGlvbih0LGUpe3ZhciBuPWUuc2VnbWVudEluZGV4LXQuc2VnbWVudEluZGV4KzIscj10aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoZS5zZWdtZW50SW5kZXgpLGk9ZS5pc0ludGVyaW9yKCl8fCFlLmNvb3JkLmVxdWFsczJEKHIpO2l8fG4tLTt2YXIgbz1uZXcgQXJyYXkobikuZmlsbChudWxsKSxzPTA7b1tzKytdPW5ldyB2aSh0LmNvb3JkKTtmb3IodmFyIGE9dC5zZWdtZW50SW5kZXgrMTthPD1lLnNlZ21lbnRJbmRleDthKyspb1tzKytdPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShhKTtyZXR1cm4gaSYmKG9bc109bmV3IHZpKGUuY29vcmQpKSxuZXcgd2Eobyx0aGlzLl9lZGdlLmdldERhdGEoKSl9LG1hLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgeWEodGhpcy5fZWRnZSx0LGUsdGhpcy5fZWRnZS5nZXRTZWdtZW50T2N0YW50KGUpKSxyPXRoaXMuX25vZGVNYXAuZ2V0KG4pO3JldHVybiBudWxsIT09cj8oWmkuaXNUcnVlKHIuY29vcmQuZXF1YWxzMkQodCksIkZvdW5kIGVxdWFsIG5vZGVzIHdpdGggZGlmZmVyZW50IGNvb3JkaW5hdGVzIikscik6KHRoaXMuX25vZGVNYXAucHV0KG4sbiksbil9LG1hLnByb3RvdHlwZS5jaGVja1NwbGl0RWRnZXNDb3JyZWN0bmVzcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9lZGdlLmdldENvb3JkaW5hdGVzKCksbj10LmdldCgwKS5nZXRDb29yZGluYXRlKDApO2lmKCFuLmVxdWFsczJEKGVbMF0pKXRocm93IG5ldyBXaSgiYmFkIHNwbGl0IGVkZ2Ugc3RhcnQgcG9pbnQgYXQgIituKTt2YXIgcj10LmdldCh0LnNpemUoKS0xKS5nZXRDb29yZGluYXRlcygpLGk9cltyLmxlbmd0aC0xXTtpZighaS5lcXVhbHMyRChlW2UubGVuZ3RoLTFdKSl0aHJvdyBuZXcgV2koImJhZCBzcGxpdCBlZGdlIGVuZCBwb2ludCBhdCAiK2kpfSxtYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG1hfTt2YXIgdmE9ZnVuY3Rpb24oKXt9O3ZhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx2YS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdmF9LHZhLm9jdGFudD1mdW5jdGlvbigpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO2lmKDA9PT10JiYwPT09ZSl0aHJvdyBuZXcgaGk7dmFyIG49TWF0aC5hYnModCkscj1NYXRoLmFicyhlKTtyZXR1cm4gdD49MD9lPj0wP24+PXI/MDoxOm4+PXI/Nzo2OmU+PTA/bj49cj8zOjI6bj49cj80OjV9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9by54LWkueCxhPW8ueS1pLnk7aWYoMD09PXMmJjA9PT1hKXRocm93IG5ldyBoaTtyZXR1cm4gdmEub2N0YW50KHMsYSl9fTt2YXIgX2E9ZnVuY3Rpb24oKXt9O19hLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe30sX2EucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXt9LF9hLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe30sX2EucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7fSxfYS5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt9LF9hLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7fSxfYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sX2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIF9hfTt2YXIgeGE9ZnVuY3Rpb24oKXt9O3hhLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXt9LHhhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltfYV19LHhhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB4YX07dmFyIHdhPWZ1bmN0aW9uKCl7dGhpcy5fbm9kZUxpc3Q9bmV3IG1hKHRoaXMpLHRoaXMuX3B0cz1udWxsLHRoaXMuX2RhdGE9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHRzPXQsdGhpcy5fZGF0YT1lfTt3YS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRzfSx3YS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHMubGVuZ3RofSx3YS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHRzW3RdfSx3YS5wcm90b3R5cGUuaXNDbG9zZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRzWzBdLmVxdWFscyh0aGlzLl9wdHNbdGhpcy5fcHRzLmxlbmd0aC0xXSl9LHdhLnByb3RvdHlwZS5nZXRTZWdtZW50T2N0YW50PWZ1bmN0aW9uKHQpe3JldHVybiB0PT09dGhpcy5fcHRzLmxlbmd0aC0xPy0xOnRoaXMuc2FmZU9jdGFudCh0aGlzLmdldENvb3JkaW5hdGUodCksdGhpcy5nZXRDb29yZGluYXRlKHQrMSkpfSx3YS5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt0aGlzLl9kYXRhPXR9LHdhLnByb3RvdHlwZS5zYWZlT2N0YW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZXF1YWxzMkQoZSk/MDp2YS5vY3RhbnQodCxlKX0sd2EucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sd2EucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbj1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5hZGRJbnRlcnNlY3Rpb25Ob2RlKHQsZSl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzNdLGk9bmV3IHZpKGFyZ3VtZW50c1swXS5nZXRJbnRlcnNlY3Rpb24ocikpO3RoaXMuYWRkSW50ZXJzZWN0aW9uKGksbil9fSx3YS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWGkudG9MaW5lU3RyaW5nKG5ldyB4cyh0aGlzLl9wdHMpKX0sd2EucHJvdG90eXBlLmdldE5vZGVMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVMaXN0fSx3YS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9uTm9kZT1mdW5jdGlvbih0LGUpe3ZhciBuPWUscj1uKzE7aWYocjx0aGlzLl9wdHMubGVuZ3RoKXt2YXIgaT10aGlzLl9wdHNbcl07dC5lcXVhbHMyRChpKSYmKG49cil9cmV0dXJuIHRoaXMuX25vZGVMaXN0LmFkZCh0LG4pfSx3YS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTA7cjx0LmdldEludGVyc2VjdGlvbk51bSgpO3IrKyl0aGlzLmFkZEludGVyc2VjdGlvbih0LGUsbixyKX0sd2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3hhXX0sd2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHdhfSx3YS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IHhvO3JldHVybiB3YS5nZXROb2RlZFN1YnN0cmluZ3ModCxlKSxlfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3IubmV4dCgpLmdldE5vZGVMaXN0KCkuYWRkU3BsaXRFZGdlcyhuKX19O3ZhciBiYT1mdW5jdGlvbigpe2lmKHRoaXMucDA9bnVsbCx0aGlzLnAxPW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5wMD1uZXcgdmksdGhpcy5wMT1uZXcgdmk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMucDA9bmV3IHZpKHQucDApLHRoaXMucDE9bmV3IHZpKHQucDEpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5wMD1hcmd1bWVudHNbMF0sdGhpcy5wMT1hcmd1bWVudHNbMV07ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdLGk9YXJndW1lbnRzWzNdO3RoaXMucDA9bmV3IHZpKGUsbiksdGhpcy5wMT1uZXcgdmkocixpKX19LERhPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtiYS5wcm90b3R5cGUubWluWD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLnAwLngsdGhpcy5wMS54KX0sYmEucHJvdG90eXBlLm9yaWVudGF0aW9uSW5kZXg9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGJhKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1lby5vcmllbnRhdGlvbkluZGV4KHRoaXMucDAsdGhpcy5wMSx0LnAwKSxuPWVvLm9yaWVudGF0aW9uSW5kZXgodGhpcy5wMCx0aGlzLnAxLHQucDEpO3JldHVybiBlPj0wJiZuPj0wfHxlPD0wJiZuPD0wP01hdGgubWF4KGUsbik6MH1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgcj1hcmd1bWVudHNbMF07cmV0dXJuIGVvLm9yaWVudGF0aW9uSW5kZXgodGhpcy5wMCx0aGlzLnAxLHIpfX0sYmEucHJvdG90eXBlLnRvR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY3JlYXRlTGluZVN0cmluZyhbdGhpcy5wMCx0aGlzLnAxXSl9LGJhLnByb3RvdHlwZS5pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucDAueD09PXRoaXMucDEueH0sYmEucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBiYSkpcmV0dXJuITE7dmFyIGU9dDtyZXR1cm4gdGhpcy5wMC5lcXVhbHMoZS5wMCkmJnRoaXMucDEuZXF1YWxzKGUucDEpfSxiYS5wcm90b3R5cGUuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBRaTtyZXR1cm4gZS5jb21wdXRlSW50ZXJzZWN0aW9uKHRoaXMucDAsdGhpcy5wMSx0LnAwLHQucDEpLGUuaGFzSW50ZXJzZWN0aW9uKCk/ZS5nZXRJbnRlcnNlY3Rpb24oMCk6bnVsbH0sYmEucHJvdG90eXBlLnByb2plY3Q9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgdD1hcmd1bWVudHNbMF07aWYodC5lcXVhbHModGhpcy5wMCl8fHQuZXF1YWxzKHRoaXMucDEpKXJldHVybiBuZXcgdmkodCk7dmFyIGU9dGhpcy5wcm9qZWN0aW9uRmFjdG9yKHQpLG49bmV3IHZpO3JldHVybiBuLng9dGhpcy5wMC54K2UqKHRoaXMucDEueC10aGlzLnAwLngpLG4ueT10aGlzLnAwLnkrZSoodGhpcy5wMS55LXRoaXMucDAueSksbn1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGJhKXt2YXIgcj1hcmd1bWVudHNbMF0saT10aGlzLnByb2plY3Rpb25GYWN0b3Ioci5wMCksbz10aGlzLnByb2plY3Rpb25GYWN0b3Ioci5wMSk7aWYoaT49MSYmbz49MXx8aTw9MCYmbzw9MClyZXR1cm4gbnVsbDt2YXIgcz10aGlzLnByb2plY3Qoci5wMCk7aTwwJiYocz10aGlzLnAwKSxpPjEmJihzPXRoaXMucDEpO3ZhciBhPXRoaXMucHJvamVjdChyLnAxKTtyZXR1cm4gbzwwJiYoYT10aGlzLnAwKSxvPjEmJihhPXRoaXMucDEpLG5ldyBiYShzLGEpfX0sYmEucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe3RoaXMucDEuY29tcGFyZVRvKHRoaXMucDApPDAmJnRoaXMucmV2ZXJzZSgpfSxiYS5wcm90b3R5cGUuYW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnAxLnktdGhpcy5wMC55LHRoaXMucDEueC10aGlzLnAwLngpfSxiYS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXQ/dGhpcy5wMDp0aGlzLnAxfSxiYS5wcm90b3R5cGUuZGlzdGFuY2VQZXJwZW5kaWN1bGFyPWZ1bmN0aW9uKHQpe3JldHVybiBlby5kaXN0YW5jZVBvaW50TGluZVBlcnBlbmRpY3VsYXIodCx0aGlzLnAwLHRoaXMucDEpfSxiYS5wcm90b3R5cGUubWluWT1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLnAwLnksdGhpcy5wMS55KX0sYmEucHJvdG90eXBlLm1pZFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGJhLm1pZFBvaW50KHRoaXMucDAsdGhpcy5wMSl9LGJhLnByb3RvdHlwZS5wcm9qZWN0aW9uRmFjdG9yPWZ1bmN0aW9uKHQpe2lmKHQuZXF1YWxzKHRoaXMucDApKXJldHVybiAwO2lmKHQuZXF1YWxzKHRoaXMucDEpKXJldHVybiAxO3ZhciBlPXRoaXMucDEueC10aGlzLnAwLngsbj10aGlzLnAxLnktdGhpcy5wMC55LHI9ZSplK24qbjtyZXR1cm4gcjw9MD9maS5OYU46KCh0LngtdGhpcy5wMC54KSplKyh0LnktdGhpcy5wMC55KSpuKS9yfSxiYS5wcm90b3R5cGUuY2xvc2VzdFBvaW50cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmludGVyc2VjdGlvbih0KTtpZihudWxsIT09ZSlyZXR1cm5bZSxlXTt2YXIgbj1uZXcgQXJyYXkoMikuZmlsbChudWxsKSxyPWZpLk1BWF9WQUxVRSxpPW51bGwsbz10aGlzLmNsb3Nlc3RQb2ludCh0LnAwKTtyPW8uZGlzdGFuY2UodC5wMCksblswXT1vLG5bMV09dC5wMDt2YXIgcz10aGlzLmNsb3Nlc3RQb2ludCh0LnAxKTsoaT1zLmRpc3RhbmNlKHQucDEpKTxyJiYocj1pLG5bMF09cyxuWzFdPXQucDEpO3ZhciBhPXQuY2xvc2VzdFBvaW50KHRoaXMucDApOyhpPWEuZGlzdGFuY2UodGhpcy5wMCkpPHImJihyPWksblswXT10aGlzLnAwLG5bMV09YSk7dmFyIHU9dC5jbG9zZXN0UG9pbnQodGhpcy5wMSk7cmV0dXJuKGk9dS5kaXN0YW5jZSh0aGlzLnAxKSk8ciYmKHI9aSxuWzBdPXRoaXMucDEsblsxXT11KSxufSxiYS5wcm90b3R5cGUuY2xvc2VzdFBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHJvamVjdGlvbkZhY3Rvcih0KTtyZXR1cm4gZT4wJiZlPDE/dGhpcy5wcm9qZWN0KHQpOnRoaXMucDAuZGlzdGFuY2UodCk8dGhpcy5wMS5kaXN0YW5jZSh0KT90aGlzLnAwOnRoaXMucDF9LGJhLnByb3RvdHlwZS5tYXhYPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KHRoaXMucDAueCx0aGlzLnAxLngpfSxiYS5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucDAuZGlzdGFuY2UodGhpcy5wMSl9LGJhLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dCxuPXRoaXMucDAuY29tcGFyZVRvKGUucDApO3JldHVybiAwIT09bj9uOnRoaXMucDEuY29tcGFyZVRvKGUucDEpfSxiYS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucDA7dGhpcy5wMD10aGlzLnAxLHRoaXMucDE9dH0sYmEucHJvdG90eXBlLmVxdWFsc1RvcG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucDAuZXF1YWxzKHQucDApJiYodGhpcy5wMS5lcXVhbHModC5wMSl8fHRoaXMucDAuZXF1YWxzKHQucDEpKSYmdGhpcy5wMS5lcXVhbHModC5wMCl9LGJhLnByb3RvdHlwZS5saW5lSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gemkuaW50ZXJzZWN0aW9uKHRoaXMucDAsdGhpcy5wMSx0LnAwLHQucDEpfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIEJpKSl0aHJvdyB0fXJldHVybiBudWxsfSxiYS5wcm90b3R5cGUubWF4WT1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1heCh0aGlzLnAwLnksdGhpcy5wMS55KX0sYmEucHJvdG90eXBlLnBvaW50QWxvbmdPZmZzZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnAwLngrdCoodGhpcy5wMS54LXRoaXMucDAueCkscj10aGlzLnAwLnkrdCoodGhpcy5wMS55LXRoaXMucDAueSksaT10aGlzLnAxLngtdGhpcy5wMC54LG89dGhpcy5wMS55LXRoaXMucDAueSxzPU1hdGguc3FydChpKmkrbypvKSxhPTAsdT0wO2lmKDAhPT1lKXtpZihzPD0wKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbXB1dGUgb2Zmc2V0IGZyb20gemVyby1sZW5ndGggbGluZSBzZWdtZW50Iik7YT1lKmkvcyx1PWUqby9zfXJldHVybiBuZXcgdmkobi11LHIrYSl9LGJhLnByb3RvdHlwZS5zZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRDb29yZGluYXRlcyh0LnAwLHQucDEpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLnAwLng9ZS54LHRoaXMucDAueT1lLnksdGhpcy5wMS54PW4ueCx0aGlzLnAxLnk9bi55fX0sYmEucHJvdG90eXBlLnNlZ21lbnRGcmFjdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnByb2plY3Rpb25GYWN0b3IodCk7cmV0dXJuIGU8MD9lPTA6KGU+MXx8ZmkuaXNOYU4oZSkpJiYoZT0xKSxlfSxiYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iTElORVNUUklORyggIit0aGlzLnAwLngrIiAiK3RoaXMucDAueSsiLCAiK3RoaXMucDEueCsiICIrdGhpcy5wMS55KyIpIn0sYmEucHJvdG90eXBlLmlzSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnAwLnk9PT10aGlzLnAxLnl9LGJhLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgYmEpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gZW8uZGlzdGFuY2VMaW5lTGluZSh0aGlzLnAwLHRoaXMucDEsdC5wMCx0LnAxKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIGVvLmRpc3RhbmNlUG9pbnRMaW5lKGUsdGhpcy5wMCx0aGlzLnAxKX19LGJhLnByb3RvdHlwZS5wb2ludEFsb25nPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB2aTtyZXR1cm4gZS54PXRoaXMucDAueCt0Kih0aGlzLnAxLngtdGhpcy5wMC54KSxlLnk9dGhpcy5wMC55K3QqKHRoaXMucDEueS10aGlzLnAwLnkpLGV9LGJhLnByb3RvdHlwZS5oYXNoQ29kZT1mdW5jdGlvbigpe3ZhciB0PWZpLmRvdWJsZVRvTG9uZ0JpdHModGhpcy5wMC54KTt0Xj0zMSpmaS5kb3VibGVUb0xvbmdCaXRzKHRoaXMucDAueSk7dmFyIGU9TWF0aC50cnVuYyh0KV5NYXRoLnRydW5jKHQ+PjMyKSxuPWZpLmRvdWJsZVRvTG9uZ0JpdHModGhpcy5wMS54KTtyZXR1cm4gbl49MzEqZmkuZG91YmxlVG9Mb25nQml0cyh0aGlzLnAxLnkpLGVeKE1hdGgudHJ1bmMobileTWF0aC50cnVuYyhuPj4zMikpfSxiYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGksbWldfSxiYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYmF9LGJhLm1pZFBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyB2aSgodC54K2UueCkvMiwodC55K2UueSkvMil9LERhLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4MmQyMTcyMTM1ZjQxMWMwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYmEsRGEpO3ZhciBFYT1mdW5jdGlvbigpe3RoaXMudGVtcEVudjE9bmV3IGppLHRoaXMudGVtcEVudjI9bmV3IGppLHRoaXMuX292ZXJsYXBTZWcxPW5ldyBiYSx0aGlzLl9vdmVybGFwU2VnMj1uZXcgYmF9O0VhLnByb3RvdHlwZS5vdmVybGFwPWZ1bmN0aW9uKCl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgmJjQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMV0sZT1hcmd1bWVudHNbMl0sbj1hcmd1bWVudHNbM107YXJndW1lbnRzWzBdLmdldExpbmVTZWdtZW50KHQsdGhpcy5fb3ZlcmxhcFNlZzEpLGUuZ2V0TGluZVNlZ21lbnQobix0aGlzLl9vdmVybGFwU2VnMiksdGhpcy5vdmVybGFwKHRoaXMuX292ZXJsYXBTZWcxLHRoaXMuX292ZXJsYXBTZWcyKX19LEVhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxFYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRWF9O3ZhciBDYT1mdW5jdGlvbigpe3RoaXMuX3B0cz1udWxsLHRoaXMuX3N0YXJ0PW51bGwsdGhpcy5fZW5kPW51bGwsdGhpcy5fZW52PW51bGwsdGhpcy5fY29udGV4dD1udWxsLHRoaXMuX2lkPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9YXJndW1lbnRzWzNdO3RoaXMuX3B0cz10LHRoaXMuX3N0YXJ0PWUsdGhpcy5fZW5kPW4sdGhpcy5fY29udGV4dD1yfTtDYS5wcm90b3R5cGUuZ2V0TGluZVNlZ21lbnQ9ZnVuY3Rpb24odCxlKXtlLnAwPXRoaXMuX3B0c1t0XSxlLnAxPXRoaXMuX3B0c1t0KzFdfSxDYS5wcm90b3R5cGUuY29tcHV0ZVNlbGVjdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLl9wdHNbZV0sbz10aGlzLl9wdHNbbl07aWYoci50ZW1wRW52MS5pbml0KGksbyksbi1lPT0xKXJldHVybiByLnNlbGVjdCh0aGlzLGUpLG51bGw7aWYoIXQuaW50ZXJzZWN0cyhyLnRlbXBFbnYxKSlyZXR1cm4gbnVsbDt2YXIgcz1NYXRoLnRydW5jKChlK24pLzIpO2U8cyYmdGhpcy5jb21wdXRlU2VsZWN0KHQsZSxzLHIpLHM8biYmdGhpcy5jb21wdXRlU2VsZWN0KHQscyxuLHIpfSxDYS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX2VuZC10aGlzLl9zdGFydCsxKS5maWxsKG51bGwpLGU9MCxuPXRoaXMuX3N0YXJ0O248PXRoaXMuX2VuZDtuKyspdFtlKytdPXRoaXMuX3B0c1tuXTtyZXR1cm4gdH0sQ2EucHJvdG90eXBlLmNvbXB1dGVPdmVybGFwcz1mdW5jdGlvbih0LGUpe3RoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwodGhpcy5fc3RhcnQsdGhpcy5fZW5kLHQsdC5fc3RhcnQsdC5fZW5kLGUpfSxDYS5wcm90b3R5cGUuc2V0SWQ9ZnVuY3Rpb24odCl7dGhpcy5faWQ9dH0sQ2EucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbih0LGUpe3RoaXMuY29tcHV0ZVNlbGVjdCh0LHRoaXMuX3N0YXJ0LHRoaXMuX2VuZCxlKX0sQ2EucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2Vudil7dmFyIHQ9dGhpcy5fcHRzW3RoaXMuX3N0YXJ0XSxlPXRoaXMuX3B0c1t0aGlzLl9lbmRdO3RoaXMuX2Vudj1uZXcgamkodCxlKX1yZXR1cm4gdGhpcy5fZW52fSxDYS5wcm90b3R5cGUuZ2V0RW5kSW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW5kfSxDYS5wcm90b3R5cGUuZ2V0U3RhcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGFydH0sQ2EucHJvdG90eXBlLmdldENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGV4dH0sQ2EucHJvdG90eXBlLmdldElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lkfSxDYS5wcm90b3R5cGUuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWw9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBzPXRoaXMuX3B0c1t0XSxhPXRoaXMuX3B0c1tlXSx1PW4uX3B0c1tyXSxjPW4uX3B0c1tpXTtpZihlLXQ9PTEmJmktcj09MSlyZXR1cm4gby5vdmVybGFwKHRoaXMsdCxuLHIpLG51bGw7aWYoby50ZW1wRW52MS5pbml0KHMsYSksby50ZW1wRW52Mi5pbml0KHUsYyksIW8udGVtcEVudjEuaW50ZXJzZWN0cyhvLnRlbXBFbnYyKSlyZXR1cm4gbnVsbDt2YXIgbD1NYXRoLnRydW5jKCh0K2UpLzIpLGg9TWF0aC50cnVuYygocitpKS8yKTt0PGwmJihyPGgmJnRoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwodCxsLG4scixoLG8pLGg8aSYmdGhpcy5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbCh0LGwsbixoLGksbykpLGw8ZSYmKHI8aCYmdGhpcy5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbChsLGUsbixyLGgsbyksaDxpJiZ0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKGwsZSxuLGgsaSxvKSl9LENhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxDYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQ2F9O3ZhciBTYT1mdW5jdGlvbigpe307U2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFNhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBTYX0sU2EuZ2V0Q2hhaW5TdGFydEluZGljZXM9ZnVuY3Rpb24odCl7dmFyIGU9MCxuPW5ldyB4bztuLmFkZChuZXcgTmkoZSkpO2Rve3ZhciByPVNhLmZpbmRDaGFpbkVuZCh0LGUpO24uYWRkKG5ldyBOaShyKSksZT1yfXdoaWxlKGU8dC5sZW5ndGgtMSk7cmV0dXJuIFNhLnRvSW50QXJyYXkobil9LFNhLmZpbmRDaGFpbkVuZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lO248dC5sZW5ndGgtMSYmdFtuXS5lcXVhbHMyRCh0W24rMV0pOyluKys7aWYobj49dC5sZW5ndGgtMSlyZXR1cm4gdC5sZW5ndGgtMTtmb3IodmFyIHI9V3MucXVhZHJhbnQodFtuXSx0W24rMV0pLGk9ZSsxO2k8dC5sZW5ndGg7KXtpZighdFtpLTFdLmVxdWFsczJEKHRbaV0pKWlmKFdzLnF1YWRyYW50KHRbaS0xXSx0W2ldKSE9PXIpYnJlYWs7aSsrfXJldHVybiBpLTF9LFNhLmdldENoYWlucz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBTYS5nZXRDaGFpbnMoYXJndW1lbnRzWzBdLG51bGwpO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IHhvLHI9U2EuZ2V0Q2hhaW5TdGFydEluZGljZXModCksaT0wO2k8ci5sZW5ndGgtMTtpKyspe3ZhciBvPW5ldyBDYSh0LHJbaV0scltpKzFdLGUpO24uYWRkKG8pfXJldHVybiBufX0sU2EudG9JbnRBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpLG49MDtuPGUubGVuZ3RoO24rKyllW25dPXQuZ2V0KG4pLmludFZhbHVlKCk7cmV0dXJuIGV9O3ZhciBBYT1mdW5jdGlvbigpe307QWEucHJvdG90eXBlLmNvbXB1dGVOb2Rlcz1mdW5jdGlvbih0KXt9LEFhLnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXt9LEFhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxBYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQWF9O3ZhciBOYT1mdW5jdGlvbigpe2lmKHRoaXMuX3NlZ0ludD1udWxsLDAhPT1hcmd1bWVudHMubGVuZ3RoJiYxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0U2VnbWVudEludGVyc2VjdG9yKHQpfX07TmEucHJvdG90eXBlLnNldFNlZ21lbnRJbnRlcnNlY3Rvcj1mdW5jdGlvbih0KXt0aGlzLl9zZWdJbnQ9dH0sTmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0FhXX0sTmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE5hfTt2YXIgSWE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtlP3QuY2FsbCh0aGlzLGUpOnQuY2FsbCh0aGlzKSx0aGlzLl9tb25vQ2hhaW5zPW5ldyB4byx0aGlzLl9pbmRleD1uZXcgcGEsdGhpcy5faWRDb3VudGVyPTAsdGhpcy5fbm9kZWRTZWdTdHJpbmdzPW51bGwsdGhpcy5fbk92ZXJsYXBzPTB9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e1NlZ21lbnRPdmVybGFwQWN0aW9uOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuZ2V0TW9ub3RvbmVDaGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9ub0NoYWluc30sZS5wcm90b3R5cGUuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7cmV0dXJuIHdhLmdldE5vZGVkU3Vic3RyaW5ncyh0aGlzLl9ub2RlZFNlZ1N0cmluZ3MpfSxlLnByb3RvdHlwZS5nZXRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbmRleH0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49U2EuZ2V0Q2hhaW5zKHQuZ2V0Q29vcmRpbmF0ZXMoKSx0KS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ci5zZXRJZChlLl9pZENvdW50ZXIrKyksZS5faW5kZXguaW5zZXJ0KHIuZ2V0RW52ZWxvcGUoKSxyKSxlLl9tb25vQ2hhaW5zLmFkZChyKX19LGUucHJvdG90eXBlLmNvbXB1dGVOb2Rlcz1mdW5jdGlvbih0KXt0aGlzLl9ub2RlZFNlZ1N0cmluZ3M9dDtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSk7dGhpcy5pbnRlcnNlY3RDaGFpbnMoKX0sZS5wcm90b3R5cGUuaW50ZXJzZWN0Q2hhaW5zPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT1uZXcgTWEodGhpcy5fc2VnSW50KSxuPXRoaXMuX21vbm9DaGFpbnMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspZm9yKHZhciByPW4ubmV4dCgpLGk9dC5faW5kZXgucXVlcnkoci5nZXRFbnZlbG9wZSgpKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7aWYoby5nZXRJZCgpPnIuZ2V0SWQoKSYmKHIuY29tcHV0ZU92ZXJsYXBzKG8sZSksdC5fbk92ZXJsYXBzKyspLHQuX3NlZ0ludC5pc0RvbmUoKSlyZXR1cm4gbnVsbH19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uU2VnbWVudE92ZXJsYXBBY3Rpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KE5hKSxNYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX3NpPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX3NpPWV9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLm92ZXJsYXA9ZnVuY3Rpb24oKXtpZig0IT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUub3ZlcmxhcC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9YXJndW1lbnRzWzNdLGk9YXJndW1lbnRzWzBdLmdldENvbnRleHQoKSxvPW4uZ2V0Q29udGV4dCgpO3RoaXMuX3NpLnByb2Nlc3NJbnRlcnNlY3Rpb25zKGksZSxvLHIpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShFYSksRmE9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX3F1YWRyYW50U2VnbWVudHM9dC5ERUZBVUxUX1FVQURSQU5UX1NFR01FTlRTLHRoaXMuX2VuZENhcFN0eWxlPXQuQ0FQX1JPVU5ELHRoaXMuX2pvaW5TdHlsZT10LkpPSU5fUk9VTkQsdGhpcy5fbWl0cmVMaW1pdD10LkRFRkFVTFRfTUlUUkVfTElNSVQsdGhpcy5faXNTaW5nbGVTaWRlZD0hMSx0aGlzLl9zaW1wbGlmeUZhY3Rvcj10LkRFRkFVTFRfU0lNUExJRllfRkFDVE9SLDAhPT1hcmd1bWVudHMubGVuZ3RoKWlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5zZXRRdWFkcmFudFNlZ21lbnRzKGUpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLnNldFF1YWRyYW50U2VnbWVudHMobiksdGhpcy5zZXRFbmRDYXBTdHlsZShyKX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM107dGhpcy5zZXRRdWFkcmFudFNlZ21lbnRzKGkpLHRoaXMuc2V0RW5kQ2FwU3R5bGUobyksdGhpcy5zZXRKb2luU3R5bGUocyksdGhpcy5zZXRNaXRyZUxpbWl0KGEpfX0sVGE9e0NBUF9ST1VORDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfRkxBVDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfU1FVQVJFOntjb25maWd1cmFibGU6ITB9LEpPSU5fUk9VTkQ6e2NvbmZpZ3VyYWJsZTohMH0sSk9JTl9NSVRSRTp7Y29uZmlndXJhYmxlOiEwfSxKT0lOX0JFVkVMOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfUVVBRFJBTlRfU0VHTUVOVFM6e2NvbmZpZ3VyYWJsZTohMH0sREVGQVVMVF9NSVRSRV9MSU1JVDp7Y29uZmlndXJhYmxlOiEwfSxERUZBVUxUX1NJTVBMSUZZX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfX07RmEucHJvdG90eXBlLmdldEVuZENhcFN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZENhcFN0eWxlfSxGYS5wcm90b3R5cGUuaXNTaW5nbGVTaWRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1NpbmdsZVNpZGVkfSxGYS5wcm90b3R5cGUuc2V0UXVhZHJhbnRTZWdtZW50cz1mdW5jdGlvbih0KXt0aGlzLl9xdWFkcmFudFNlZ21lbnRzPXQsMD09PXRoaXMuX3F1YWRyYW50U2VnbWVudHMmJih0aGlzLl9qb2luU3R5bGU9RmEuSk9JTl9CRVZFTCksdGhpcy5fcXVhZHJhbnRTZWdtZW50czwwJiYodGhpcy5fam9pblN0eWxlPUZhLkpPSU5fTUlUUkUsdGhpcy5fbWl0cmVMaW1pdD1NYXRoLmFicyh0aGlzLl9xdWFkcmFudFNlZ21lbnRzKSksdDw9MCYmKHRoaXMuX3F1YWRyYW50U2VnbWVudHM9MSksdGhpcy5fam9pblN0eWxlIT09RmEuSk9JTl9ST1VORCYmKHRoaXMuX3F1YWRyYW50U2VnbWVudHM9RmEuREVGQVVMVF9RVUFEUkFOVF9TRUdNRU5UUyl9LEZhLnByb3RvdHlwZS5nZXRKb2luU3R5bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fam9pblN0eWxlfSxGYS5wcm90b3R5cGUuc2V0Sm9pblN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuX2pvaW5TdHlsZT10fSxGYS5wcm90b3R5cGUuc2V0U2ltcGxpZnlGYWN0b3I9ZnVuY3Rpb24odCl7dGhpcy5fc2ltcGxpZnlGYWN0b3I9dDwwPzA6dH0sRmEucHJvdG90eXBlLmdldFNpbXBsaWZ5RmFjdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NpbXBsaWZ5RmFjdG9yfSxGYS5wcm90b3R5cGUuZ2V0UXVhZHJhbnRTZWdtZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9xdWFkcmFudFNlZ21lbnRzfSxGYS5wcm90b3R5cGUuc2V0RW5kQ2FwU3R5bGU9ZnVuY3Rpb24odCl7dGhpcy5fZW5kQ2FwU3R5bGU9dH0sRmEucHJvdG90eXBlLmdldE1pdHJlTGltaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl0cmVMaW1pdH0sRmEucHJvdG90eXBlLnNldE1pdHJlTGltaXQ9ZnVuY3Rpb24odCl7dGhpcy5fbWl0cmVMaW1pdD10fSxGYS5wcm90b3R5cGUuc2V0U2luZ2xlU2lkZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNTaW5nbGVTaWRlZD10fSxGYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEZhfSxGYS5idWZmZXJEaXN0YW5jZUVycm9yPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguUEkvMi90O3JldHVybiAxLU1hdGguY29zKGUvMil9LFRhLkNBUF9ST1VORC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sVGEuQ0FQX0ZMQVQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LFRhLkNBUF9TUVVBUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LFRhLkpPSU5fUk9VTkQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LFRhLkpPSU5fTUlUUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LFRhLkpPSU5fQkVWRUwuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LFRhLkRFRkFVTFRfUVVBRFJBTlRfU0VHTUVOVFMuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDh9LFRhLkRFRkFVTFRfTUlUUkVfTElNSVQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDV9LFRhLkRFRkFVTFRfU0lNUExJRllfRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybi4wMX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRmEsVGEpO3ZhciBPYT1mdW5jdGlvbih0KXt0aGlzLl9kaXN0YW5jZVRvbD1udWxsLHRoaXMuX2lzRGVsZXRlZD1udWxsLHRoaXMuX2FuZ2xlT3JpZW50YXRpb249ZW8uQ09VTlRFUkNMT0NLV0lTRSx0aGlzLl9pbnB1dExpbmU9dHx8bnVsbH0sTGE9e0lOSVQ6e2NvbmZpZ3VyYWJsZTohMH0sREVMRVRFOntjb25maWd1cmFibGU6ITB9LEtFRVA6e2NvbmZpZ3VyYWJsZTohMH0sTlVNX1BUU19UT19DSEVDSzp7Y29uZmlndXJhYmxlOiEwfX07T2EucHJvdG90eXBlLmlzRGVsZXRhYmxlPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMuX2lucHV0TGluZVt0XSxvPXRoaXMuX2lucHV0TGluZVtlXSxzPXRoaXMuX2lucHV0TGluZVtuXTtyZXR1cm4hKCF0aGlzLmlzQ29uY2F2ZShpLG8scyl8fCF0aGlzLmlzU2hhbGxvdyhpLG8scyxyKSkmJnRoaXMuaXNTaGFsbG93U2FtcGxlZChpLG8sdCxuLHIpfSxPYS5wcm90b3R5cGUuZGVsZXRlU2hhbGxvd0NvbmNhdml0aWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT0xLG49dGhpcy5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChlKSxyPXRoaXMuZmluZE5leHROb25EZWxldGVkSW5kZXgobiksaT0hMTtyPHRoaXMuX2lucHV0TGluZS5sZW5ndGg7KXt2YXIgbz0hMTt0LmlzRGVsZXRhYmxlKGUsbixyLHQuX2Rpc3RhbmNlVG9sKSYmKHQuX2lzRGVsZXRlZFtuXT1PYS5ERUxFVEUsbz0hMCxpPSEwKSxlPW8/cjpuLG49dC5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChlKSxyPXQuZmluZE5leHROb25EZWxldGVkSW5kZXgobil9cmV0dXJuIGl9LE9hLnByb3RvdHlwZS5pc1NoYWxsb3dDb25jYXZpdHk9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGVvLmNvbXB1dGVPcmllbnRhdGlvbih0LGUsbik9PT10aGlzLl9hbmdsZU9yaWVudGF0aW9uJiZlby5kaXN0YW5jZVBvaW50TGluZShlLHQsbik8cn0sT2EucHJvdG90eXBlLmlzU2hhbGxvd1NhbXBsZWQ9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1NYXRoLnRydW5jKChyLW4pL09hLk5VTV9QVFNfVE9fQ0hFQ0spO288PTAmJihvPTEpO2Zvcih2YXIgcz1uO3M8cjtzKz1vKWlmKCF0aGlzLmlzU2hhbGxvdyh0LGUsdGhpcy5faW5wdXRMaW5lW3NdLGkpKXJldHVybiExO3JldHVybiEwfSxPYS5wcm90b3R5cGUuaXNDb25jYXZlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZW8uY29tcHV0ZU9yaWVudGF0aW9uKHQsZSxuKT09PXRoaXMuX2FuZ2xlT3JpZW50YXRpb259LE9hLnByb3RvdHlwZS5zaW1wbGlmeT1mdW5jdGlvbih0KXt0aGlzLl9kaXN0YW5jZVRvbD1NYXRoLmFicyh0KSx0PDAmJih0aGlzLl9hbmdsZU9yaWVudGF0aW9uPWVvLkNMT0NLV0lTRSksdGhpcy5faXNEZWxldGVkPW5ldyBBcnJheSh0aGlzLl9pbnB1dExpbmUubGVuZ3RoKS5maWxsKG51bGwpO3ZhciBlPSExO2Rve2U9dGhpcy5kZWxldGVTaGFsbG93Q29uY2F2aXRpZXMoKX13aGlsZShlKTtyZXR1cm4gdGhpcy5jb2xsYXBzZUxpbmUoKX0sT2EucHJvdG90eXBlLmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10KzE7ZTx0aGlzLl9pbnB1dExpbmUubGVuZ3RoJiZ0aGlzLl9pc0RlbGV0ZWRbZV09PT1PYS5ERUxFVEU7KWUrKztyZXR1cm4gZX0sT2EucHJvdG90eXBlLmlzU2hhbGxvdz1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gZW8uZGlzdGFuY2VQb2ludExpbmUoZSx0LG4pPHJ9LE9hLnByb3RvdHlwZS5jb2xsYXBzZUxpbmU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IGJvLGU9MDtlPHRoaXMuX2lucHV0TGluZS5sZW5ndGg7ZSsrKXRoaXMuX2lzRGVsZXRlZFtlXSE9PU9hLkRFTEVURSYmdC5hZGQodGhpcy5faW5wdXRMaW5lW2VdKTtyZXR1cm4gdC50b0Nvb3JkaW5hdGVBcnJheSgpfSxPYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sT2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE9hfSxPYS5zaW1wbGlmeT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgT2EodCkuc2ltcGxpZnkoZSl9LExhLklOSVQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LExhLkRFTEVURS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sTGEuS0VFUC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sTGEuTlVNX1BUU19UT19DSEVDSy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE9hLExhKTt2YXIgUGE9ZnVuY3Rpb24oKXt0aGlzLl9wdExpc3Q9bnVsbCx0aGlzLl9wcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX21pbmltaW1WZXJ0ZXhEaXN0YW5jZT0wLHRoaXMuX3B0TGlzdD1uZXcgeG99LFJhPXtDT09SRElOQVRFX0FSUkFZX1RZUEU6e2NvbmZpZ3VyYWJsZTohMH19O1BhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdExpc3QudG9BcnJheShQYS5DT09SRElOQVRFX0FSUkFZX1RZUEUpfSxQYS5wcm90b3R5cGUuc2V0UHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24odCl7dGhpcy5fcHJlY2lzaW9uTW9kZWw9dH0sUGEucHJvdG90eXBlLmFkZFB0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB2aSh0KTtpZih0aGlzLl9wcmVjaXNpb25Nb2RlbC5tYWtlUHJlY2lzZShlKSx0aGlzLmlzUmVkdW5kYW50KGUpKXJldHVybiBudWxsO3RoaXMuX3B0TGlzdC5hZGQoZSl9LFBhLnByb3RvdHlwZS5yZXZlcmU9ZnVuY3Rpb24oKXt9LFBhLnByb3RvdHlwZS5hZGRQdHM9ZnVuY3Rpb24odCxlKXtpZihlKWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRoaXMuYWRkUHQodFtuXSk7ZWxzZSBmb3IodmFyIHI9dC5sZW5ndGgtMTtyPj0wO3ItLSl0aGlzLmFkZFB0KHRbcl0pfSxQYS5wcm90b3R5cGUuaXNSZWR1bmRhbnQ9ZnVuY3Rpb24odCl7aWYodGhpcy5fcHRMaXN0LnNpemUoKTwxKXJldHVybiExO3ZhciBlPXRoaXMuX3B0TGlzdC5nZXQodGhpcy5fcHRMaXN0LnNpemUoKS0xKTtyZXR1cm4gdC5kaXN0YW5jZShlKTx0aGlzLl9taW5pbWltVmVydGV4RGlzdGFuY2V9LFBhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybihuZXcgSXMpLmNyZWF0ZUxpbmVTdHJpbmcodGhpcy5nZXRDb29yZGluYXRlcygpKS50b1N0cmluZygpfSxQYS5wcm90b3R5cGUuY2xvc2VSaW5nPWZ1bmN0aW9uKCl7aWYodGhpcy5fcHRMaXN0LnNpemUoKTwxKXJldHVybiBudWxsO3ZhciB0PW5ldyB2aSh0aGlzLl9wdExpc3QuZ2V0KDApKSxlPXRoaXMuX3B0TGlzdC5nZXQodGhpcy5fcHRMaXN0LnNpemUoKS0xKTtpZih0LmVxdWFscyhlKSlyZXR1cm4gbnVsbDt0aGlzLl9wdExpc3QuYWRkKHQpfSxQYS5wcm90b3R5cGUuc2V0TWluaW11bVZlcnRleERpc3RhbmNlPWZ1bmN0aW9uKHQpe3RoaXMuX21pbmltaW1WZXJ0ZXhEaXN0YW5jZT10fSxQYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUGEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFBhfSxSYS5DT09SRElOQVRFX0FSUkFZX1RZUEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBcnJheSgwKS5maWxsKG51bGwpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhQYSxSYSk7dmFyIEJhPWZ1bmN0aW9uKCl7fSxrYT17UElfVElNRVNfMjp7Y29uZmlndXJhYmxlOiEwfSxQSV9PVkVSXzI6e2NvbmZpZ3VyYWJsZTohMH0sUElfT1ZFUl80Ontjb25maWd1cmFibGU6ITB9LENPVU5URVJDTE9DS1dJU0U6e2NvbmZpZ3VyYWJsZTohMH0sQ0xPQ0tXSVNFOntjb25maWd1cmFibGU6ITB9LE5PTkU6e2NvbmZpZ3VyYWJsZTohMH19O0JhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxCYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQmF9LEJhLnRvRGVncmVlcz1mdW5jdGlvbih0KXtyZXR1cm4gMTgwKnQvTWF0aC5QSX0sQmEubm9ybWFsaXplPWZ1bmN0aW9uKHQpe2Zvcig7dD5NYXRoLlBJOyl0LT1CYS5QSV9USU1FU18yO2Zvcig7dDw9LU1hdGguUEk7KXQrPUJhLlBJX1RJTUVTXzI7cmV0dXJuIHR9LEJhLmFuZ2xlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gTWF0aC5hdGFuMih0LnksdC54KX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9bi54LWUueCxpPW4ueS1lLnk7cmV0dXJuIE1hdGguYXRhbjIoaSxyKX19LEJhLmlzQWN1dGU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQueC1lLngsaT10LnktZS55O3JldHVybiByKihuLngtZS54KStpKihuLnktZS55KT4wfSxCYS5pc09idHVzZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC54LWUueCxpPXQueS1lLnk7cmV0dXJuIHIqKG4ueC1lLngpK2kqKG4ueS1lLnkpPDB9LEJhLmludGVyaW9yQW5nbGU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPUJhLmFuZ2xlKGUsdCksaT1CYS5hbmdsZShlLG4pO3JldHVybiBNYXRoLmFicyhpLXIpfSxCYS5ub3JtYWxpemVQb3NpdGl2ZT1mdW5jdGlvbih0KXtpZih0PDApe2Zvcig7dDwwOyl0Kz1CYS5QSV9USU1FU18yO3Q+PUJhLlBJX1RJTUVTXzImJih0PTApfWVsc2V7Zm9yKDt0Pj1CYS5QSV9USU1FU18yOyl0LT1CYS5QSV9USU1FU18yO3Q8MCYmKHQ9MCl9cmV0dXJuIHR9LEJhLmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUsbil7dmFyIHI9QmEuYW5nbGUoZSx0KSxpPUJhLmFuZ2xlKGUsbik7cmV0dXJuIEJhLmRpZmYocixpKX0sQmEuZGlmZj1mdW5jdGlvbih0LGUpe3ZhciBuPW51bGw7cmV0dXJuKG49dDxlP2UtdDp0LWUpPk1hdGguUEkmJihuPTIqTWF0aC5QSS1uKSxufSxCYS50b1JhZGlhbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHQqTWF0aC5QSS8xODB9LEJhLmdldFR1cm49ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNpbihlLXQpO3JldHVybiBuPjA/QmEuQ09VTlRFUkNMT0NLV0lTRTpuPDA/QmEuQ0xPQ0tXSVNFOkJhLk5PTkV9LEJhLmFuZ2xlQmV0d2Vlbk9yaWVudGVkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1CYS5hbmdsZShlLHQpLGk9QmEuYW5nbGUoZSxuKS1yO3JldHVybiBpPD0tTWF0aC5QST9pK0JhLlBJX1RJTUVTXzI6aT5NYXRoLlBJP2ktQmEuUElfVElNRVNfMjppfSxrYS5QSV9USU1FU18yLmdldD1mdW5jdGlvbigpe3JldHVybiAyKk1hdGguUEl9LGthLlBJX09WRVJfMi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5QSS8yfSxrYS5QSV9PVkVSXzQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguUEkvNH0sa2EuQ09VTlRFUkNMT0NLV0lTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uQ09VTlRFUkNMT0NLV0lTRX0sa2EuQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybiBlby5DTE9DS1dJU0V9LGthLk5PTkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGVvLkNPTExJTkVBUn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmEsa2EpO3ZhciB6YT1mdW5jdGlvbiB0KCl7dGhpcy5fbWF4Q3VydmVTZWdtZW50RXJyb3I9MCx0aGlzLl9maWxsZXRBbmdsZVF1YW50dW09bnVsbCx0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yPTEsdGhpcy5fc2VnTGlzdD1udWxsLHRoaXMuX2Rpc3RhbmNlPTAsdGhpcy5fcHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9idWZQYXJhbXM9bnVsbCx0aGlzLl9saT1udWxsLHRoaXMuX3MwPW51bGwsdGhpcy5fczE9bnVsbCx0aGlzLl9zMj1udWxsLHRoaXMuX3NlZzA9bmV3IGJhLHRoaXMuX3NlZzE9bmV3IGJhLHRoaXMuX29mZnNldDA9bmV3IGJhLHRoaXMuX29mZnNldDE9bmV3IGJhLHRoaXMuX3NpZGU9MCx0aGlzLl9oYXNOYXJyb3dDb25jYXZlQW5nbGU9ITE7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO3RoaXMuX3ByZWNpc2lvbk1vZGVsPWUsdGhpcy5fYnVmUGFyYW1zPW4sdGhpcy5fbGk9bmV3IFFpLHRoaXMuX2ZpbGxldEFuZ2xlUXVhbnR1bT1NYXRoLlBJLzIvbi5nZXRRdWFkcmFudFNlZ21lbnRzKCksbi5nZXRRdWFkcmFudFNlZ21lbnRzKCk+PTgmJm4uZ2V0Sm9pblN0eWxlKCk9PT1GYS5KT0lOX1JPVU5EJiYodGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcj10Lk1BWF9DTE9TSU5HX1NFR19MRU5fRkFDVE9SKSx0aGlzLmluaXQocil9LGphPXtPRkZTRVRfU0VHTUVOVF9TRVBBUkFUSU9OX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfSxJTlNJREVfVFVSTl9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH0sQ1VSVkVfVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SOntjb25maWd1cmFibGU6ITB9LE1BWF9DTE9TSU5HX1NFR19MRU5fRkFDVE9SOntjb25maWd1cmFibGU6ITB9fTt6YS5wcm90b3R5cGUuYWRkTmV4dFNlZ21lbnQ9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9zMD10aGlzLl9zMSx0aGlzLl9zMT10aGlzLl9zMix0aGlzLl9zMj10LHRoaXMuX3NlZzAuc2V0Q29vcmRpbmF0ZXModGhpcy5fczAsdGhpcy5fczEpLHRoaXMuY29tcHV0ZU9mZnNldFNlZ21lbnQodGhpcy5fc2VnMCx0aGlzLl9zaWRlLHRoaXMuX2Rpc3RhbmNlLHRoaXMuX29mZnNldDApLHRoaXMuX3NlZzEuc2V0Q29vcmRpbmF0ZXModGhpcy5fczEsdGhpcy5fczIpLHRoaXMuY29tcHV0ZU9mZnNldFNlZ21lbnQodGhpcy5fc2VnMSx0aGlzLl9zaWRlLHRoaXMuX2Rpc3RhbmNlLHRoaXMuX29mZnNldDEpLHRoaXMuX3MxLmVxdWFscyh0aGlzLl9zMikpcmV0dXJuIG51bGw7dmFyIG49ZW8uY29tcHV0ZU9yaWVudGF0aW9uKHRoaXMuX3MwLHRoaXMuX3MxLHRoaXMuX3MyKSxyPW49PT1lby5DTE9DS1dJU0UmJnRoaXMuX3NpZGU9PT1Gcy5MRUZUfHxuPT09ZW8uQ09VTlRFUkNMT0NLV0lTRSYmdGhpcy5fc2lkZT09PUZzLlJJR0hUOzA9PT1uP3RoaXMuYWRkQ29sbGluZWFyKGUpOnI/dGhpcy5hZGRPdXRzaWRlVHVybihuLGUpOnRoaXMuYWRkSW5zaWRlVHVybihuLGUpfSx6YS5wcm90b3R5cGUuYWRkTGluZUVuZENhcD1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBiYSh0LGUpLHI9bmV3IGJhO3RoaXMuY29tcHV0ZU9mZnNldFNlZ21lbnQobixGcy5MRUZULHRoaXMuX2Rpc3RhbmNlLHIpO3ZhciBpPW5ldyBiYTt0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KG4sRnMuUklHSFQsdGhpcy5fZGlzdGFuY2UsaSk7dmFyIG89ZS54LXQueCxzPWUueS10LnksYT1NYXRoLmF0YW4yKHMsbyk7c3dpdGNoKHRoaXMuX2J1ZlBhcmFtcy5nZXRFbmRDYXBTdHlsZSgpKXtjYXNlIEZhLkNBUF9ST1VORDp0aGlzLl9zZWdMaXN0LmFkZFB0KHIucDEpLHRoaXMuYWRkRmlsbGV0QXJjKGUsYStNYXRoLlBJLzIsYS1NYXRoLlBJLzIsZW8uQ0xPQ0tXSVNFLHRoaXMuX2Rpc3RhbmNlKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGkucDEpO2JyZWFrO2Nhc2UgRmEuQ0FQX0ZMQVQ6dGhpcy5fc2VnTGlzdC5hZGRQdChyLnAxKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGkucDEpO2JyZWFrO2Nhc2UgRmEuQ0FQX1NRVUFSRTp2YXIgdT1uZXcgdmk7dS54PU1hdGguYWJzKHRoaXMuX2Rpc3RhbmNlKSpNYXRoLmNvcyhhKSx1Lnk9TWF0aC5hYnModGhpcy5fZGlzdGFuY2UpKk1hdGguc2luKGEpO3ZhciBjPW5ldyB2aShyLnAxLngrdS54LHIucDEueSt1LnkpLGw9bmV3IHZpKGkucDEueCt1LngsaS5wMS55K3UueSk7dGhpcy5fc2VnTGlzdC5hZGRQdChjKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGwpfX0semEucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NlZ0xpc3QuZ2V0Q29vcmRpbmF0ZXMoKX0semEucHJvdG90eXBlLmFkZE1pdHJlSm9pbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT0hMCxvPW51bGw7dHJ5e289emkuaW50ZXJzZWN0aW9uKGUucDAsZS5wMSxuLnAwLG4ucDEpLChyPD0wPzE6by5kaXN0YW5jZSh0KS9NYXRoLmFicyhyKSk+dGhpcy5fYnVmUGFyYW1zLmdldE1pdHJlTGltaXQoKSYmKGk9ITEpfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIEJpKSl0aHJvdyB0O289bmV3IHZpKDAsMCksaT0hMX1pP3RoaXMuX3NlZ0xpc3QuYWRkUHQobyk6dGhpcy5hZGRMaW1pdGVkTWl0cmVKb2luKGUsbixyLHRoaXMuX2J1ZlBhcmFtcy5nZXRNaXRyZUxpbWl0KCkpfSx6YS5wcm90b3R5cGUuYWRkRmlsbGV0Q29ybmVyPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89ZS54LXQueCxzPWUueS10LnksYT1NYXRoLmF0YW4yKHMsbyksdT1uLngtdC54LGM9bi55LXQueSxsPU1hdGguYXRhbjIoYyx1KTtyPT09ZW8uQ0xPQ0tXSVNFP2E8PWwmJihhKz0yKk1hdGguUEkpOmE+PWwmJihhLT0yKk1hdGguUEkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoZSksdGhpcy5hZGRGaWxsZXRBcmModCxhLGwscixpKSx0aGlzLl9zZWdMaXN0LmFkZFB0KG4pfSx6YS5wcm90b3R5cGUuYWRkT3V0c2lkZVR1cm49ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9vZmZzZXQwLnAxLmRpc3RhbmNlKHRoaXMuX29mZnNldDEucDApPHRoaXMuX2Rpc3RhbmNlKnphLk9GRlNFVF9TRUdNRU5UX1NFUEFSQVRJT05fRkFDVE9SKXJldHVybiB0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDAucDEpLG51bGw7dGhpcy5fYnVmUGFyYW1zLmdldEpvaW5TdHlsZSgpPT09RmEuSk9JTl9NSVRSRT90aGlzLmFkZE1pdHJlSm9pbih0aGlzLl9zMSx0aGlzLl9vZmZzZXQwLHRoaXMuX29mZnNldDEsdGhpcy5fZGlzdGFuY2UpOnRoaXMuX2J1ZlBhcmFtcy5nZXRKb2luU3R5bGUoKT09PUZhLkpPSU5fQkVWRUw/dGhpcy5hZGRCZXZlbEpvaW4odGhpcy5fb2Zmc2V0MCx0aGlzLl9vZmZzZXQxKTooZSYmdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKSx0aGlzLmFkZEZpbGxldENvcm5lcih0aGlzLl9zMSx0aGlzLl9vZmZzZXQwLnAxLHRoaXMuX29mZnNldDEucDAsdCx0aGlzLl9kaXN0YW5jZSksdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAwKSl9LHphLnByb3RvdHlwZS5jcmVhdGVTcXVhcmU9ZnVuY3Rpb24odCl7dGhpcy5fc2VnTGlzdC5hZGRQdChuZXcgdmkodC54K3RoaXMuX2Rpc3RhbmNlLHQueSt0aGlzLl9kaXN0YW5jZSkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobmV3IHZpKHQueCt0aGlzLl9kaXN0YW5jZSx0LnktdGhpcy5fZGlzdGFuY2UpKSx0aGlzLl9zZWdMaXN0LmFkZFB0KG5ldyB2aSh0LngtdGhpcy5fZGlzdGFuY2UsdC55LXRoaXMuX2Rpc3RhbmNlKSksdGhpcy5fc2VnTGlzdC5hZGRQdChuZXcgdmkodC54LXRoaXMuX2Rpc3RhbmNlLHQueSt0aGlzLl9kaXN0YW5jZSkpLHRoaXMuX3NlZ0xpc3QuY2xvc2VSaW5nKCl9LHphLnByb3RvdHlwZS5hZGRTZWdtZW50cz1mdW5jdGlvbih0LGUpe3RoaXMuX3NlZ0xpc3QuYWRkUHRzKHQsZSl9LHphLnByb3RvdHlwZS5hZGRGaXJzdFNlZ21lbnQ9ZnVuY3Rpb24oKXt0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDEucDApfSx6YS5wcm90b3R5cGUuYWRkTGFzdFNlZ21lbnQ9ZnVuY3Rpb24oKXt0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDEucDEpfSx6YS5wcm90b3R5cGUuaW5pdFNpZGVTZWdtZW50cz1mdW5jdGlvbih0LGUsbil7dGhpcy5fczE9dCx0aGlzLl9zMj1lLHRoaXMuX3NpZGU9bix0aGlzLl9zZWcxLnNldENvb3JkaW5hdGVzKHQsZSksdGhpcy5jb21wdXRlT2Zmc2V0U2VnbWVudCh0aGlzLl9zZWcxLG4sdGhpcy5fZGlzdGFuY2UsdGhpcy5fb2Zmc2V0MSl9LHphLnByb3RvdHlwZS5hZGRMaW1pdGVkTWl0cmVKb2luPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMuX3NlZzAucDEsbz1CYS5hbmdsZShpLHRoaXMuX3NlZzAucDApLHM9QmEuYW5nbGVCZXR3ZWVuT3JpZW50ZWQodGhpcy5fc2VnMC5wMCxpLHRoaXMuX3NlZzEucDEpLzIsYT1CYS5ub3JtYWxpemUobytzKSx1PUJhLm5vcm1hbGl6ZShhK01hdGguUEkpLGM9cipuLGw9bi1jKk1hdGguYWJzKE1hdGguc2luKHMpKSxoPWkueCtjKk1hdGguY29zKHUpLGY9aS55K2MqTWF0aC5zaW4odSkscD1uZXcgdmkoaCxmKSxkPW5ldyBiYShpLHApLGc9ZC5wb2ludEFsb25nT2Zmc2V0KDEsbCkseT1kLnBvaW50QWxvbmdPZmZzZXQoMSwtbCk7dGhpcy5fc2lkZT09PUZzLkxFRlQ/KHRoaXMuX3NlZ0xpc3QuYWRkUHQoZyksdGhpcy5fc2VnTGlzdC5hZGRQdCh5KSk6KHRoaXMuX3NlZ0xpc3QuYWRkUHQoeSksdGhpcy5fc2VnTGlzdC5hZGRQdChnKSl9LHphLnByb3RvdHlwZS5jb21wdXRlT2Zmc2V0U2VnbWVudD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1lPT09RnMuTEVGVD8xOi0xLG89dC5wMS54LXQucDAueCxzPXQucDEueS10LnAwLnksYT1NYXRoLnNxcnQobypvK3MqcyksdT1pKm4qby9hLGM9aSpuKnMvYTtyLnAwLng9dC5wMC54LWMsci5wMC55PXQucDAueSt1LHIucDEueD10LnAxLngtYyxyLnAxLnk9dC5wMS55K3V9LHphLnByb3RvdHlwZS5hZGRGaWxsZXRBcmM9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1yPT09ZW8uQ0xPQ0tXSVNFPy0xOjEscz1NYXRoLmFicyhlLW4pLGE9TWF0aC50cnVuYyhzL3RoaXMuX2ZpbGxldEFuZ2xlUXVhbnR1bSsuNSk7aWYoYTwxKXJldHVybiBudWxsO2Zvcih2YXIgdT1zL2EsYz0wLGw9bmV3IHZpO2M8czspe3ZhciBoPWUrbypjO2wueD10LngraSpNYXRoLmNvcyhoKSxsLnk9dC55K2kqTWF0aC5zaW4oaCksdGhpcy5fc2VnTGlzdC5hZGRQdChsKSxjKz11fX0semEucHJvdG90eXBlLmFkZEluc2lkZVR1cm49ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHRoaXMuX29mZnNldDAucDAsdGhpcy5fb2Zmc2V0MC5wMSx0aGlzLl9vZmZzZXQxLnAwLHRoaXMuX29mZnNldDEucDEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpKXRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uKDApKTtlbHNlIGlmKHRoaXMuX2hhc05hcnJvd0NvbmNhdmVBbmdsZT0hMCx0aGlzLl9vZmZzZXQwLnAxLmRpc3RhbmNlKHRoaXMuX29mZnNldDEucDApPHRoaXMuX2Rpc3RhbmNlKnphLklOU0lERV9UVVJOX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUil0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDAucDEpO2Vsc2V7aWYodGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKSx0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yPjApe3ZhciBuPW5ldyB2aSgodGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcip0aGlzLl9vZmZzZXQwLnAxLngrdGhpcy5fczEueCkvKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IrMSksKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IqdGhpcy5fb2Zmc2V0MC5wMS55K3RoaXMuX3MxLnkpLyh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKzEpKTt0aGlzLl9zZWdMaXN0LmFkZFB0KG4pO3ZhciByPW5ldyB2aSgodGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcip0aGlzLl9vZmZzZXQxLnAwLngrdGhpcy5fczEueCkvKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IrMSksKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IqdGhpcy5fb2Zmc2V0MS5wMC55K3RoaXMuX3MxLnkpLyh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKzEpKTt0aGlzLl9zZWdMaXN0LmFkZFB0KHIpfWVsc2UgdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9zMSk7dGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAwKX19LHphLnByb3RvdHlwZS5jcmVhdGVDaXJjbGU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHZpKHQueCt0aGlzLl9kaXN0YW5jZSx0LnkpO3RoaXMuX3NlZ0xpc3QuYWRkUHQoZSksdGhpcy5hZGRGaWxsZXRBcmModCwwLDIqTWF0aC5QSSwtMSx0aGlzLl9kaXN0YW5jZSksdGhpcy5fc2VnTGlzdC5jbG9zZVJpbmcoKX0semEucHJvdG90eXBlLmFkZEJldmVsSm9pbj1mdW5jdGlvbih0LGUpe3RoaXMuX3NlZ0xpc3QuYWRkUHQodC5wMSksdGhpcy5fc2VnTGlzdC5hZGRQdChlLnAwKX0semEucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCl7dGhpcy5fZGlzdGFuY2U9dCx0aGlzLl9tYXhDdXJ2ZVNlZ21lbnRFcnJvcj10KigxLU1hdGguY29zKHRoaXMuX2ZpbGxldEFuZ2xlUXVhbnR1bS8yKSksdGhpcy5fc2VnTGlzdD1uZXcgUGEsdGhpcy5fc2VnTGlzdC5zZXRQcmVjaXNpb25Nb2RlbCh0aGlzLl9wcmVjaXNpb25Nb2RlbCksdGhpcy5fc2VnTGlzdC5zZXRNaW5pbXVtVmVydGV4RGlzdGFuY2UodCp6YS5DVVJWRV9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1IpfSx6YS5wcm90b3R5cGUuYWRkQ29sbGluZWFyPWZ1bmN0aW9uKHQpe3RoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odGhpcy5fczAsdGhpcy5fczEsdGhpcy5fczEsdGhpcy5fczIpLHRoaXMuX2xpLmdldEludGVyc2VjdGlvbk51bSgpPj0yJiYodGhpcy5fYnVmUGFyYW1zLmdldEpvaW5TdHlsZSgpPT09RmEuSk9JTl9CRVZFTHx8dGhpcy5fYnVmUGFyYW1zLmdldEpvaW5TdHlsZSgpPT09RmEuSk9JTl9NSVRSRT8odCYmdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKSx0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDEucDApKTp0aGlzLmFkZEZpbGxldENvcm5lcih0aGlzLl9zMSx0aGlzLl9vZmZzZXQwLnAxLHRoaXMuX29mZnNldDEucDAsZW8uQ0xPQ0tXSVNFLHRoaXMuX2Rpc3RhbmNlKSl9LHphLnByb3RvdHlwZS5jbG9zZVJpbmc9ZnVuY3Rpb24oKXt0aGlzLl9zZWdMaXN0LmNsb3NlUmluZygpfSx6YS5wcm90b3R5cGUuaGFzTmFycm93Q29uY2F2ZUFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc05hcnJvd0NvbmNhdmVBbmdsZX0semEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHphLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB6YX0samEuT0ZGU0VUX1NFR01FTlRfU0VQQVJBVElPTl9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLjAwMX0samEuSU5TSURFX1RVUk5fVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybi4wMDF9LGphLkNVUlZFX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtNn0samEuTUFYX0NMT1NJTkdfU0VHX0xFTl9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDgwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh6YSxqYSk7dmFyIFVhPWZ1bmN0aW9uKCl7dGhpcy5fZGlzdGFuY2U9MCx0aGlzLl9wcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX2J1ZlBhcmFtcz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wcmVjaXNpb25Nb2RlbD10LHRoaXMuX2J1ZlBhcmFtcz1lfTtVYS5wcm90b3R5cGUuZ2V0T2Zmc2V0Q3VydmU9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9kaXN0YW5jZT1lLDA9PT1lKXJldHVybiBudWxsO3ZhciBuPWU8MCxyPU1hdGguYWJzKGUpLGk9dGhpcy5nZXRTZWdHZW4ocik7dC5sZW5ndGg8PTE/dGhpcy5jb21wdXRlUG9pbnRDdXJ2ZSh0WzBdLGkpOnRoaXMuY29tcHV0ZU9mZnNldEN1cnZlKHQsbixpKTt2YXIgbz1pLmdldENvb3JkaW5hdGVzKCk7cmV0dXJuIG4mJkRvLnJldmVyc2Uobyksb30sVWEucHJvdG90eXBlLmNvbXB1dGVTaW5nbGVTaWRlZEJ1ZmZlckN1cnZlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnNpbXBsaWZ5VG9sZXJhbmNlKHRoaXMuX2Rpc3RhbmNlKTtpZihlKXtuLmFkZFNlZ21lbnRzKHQsITApO3ZhciBpPU9hLnNpbXBsaWZ5KHQsLXIpLG89aS5sZW5ndGgtMTtuLmluaXRTaWRlU2VnbWVudHMoaVtvXSxpW28tMV0sRnMuTEVGVCksbi5hZGRGaXJzdFNlZ21lbnQoKTtmb3IodmFyIHM9by0yO3M+PTA7cy0tKW4uYWRkTmV4dFNlZ21lbnQoaVtzXSwhMCl9ZWxzZXtuLmFkZFNlZ21lbnRzKHQsITEpO3ZhciBhPU9hLnNpbXBsaWZ5KHQsciksdT1hLmxlbmd0aC0xO24uaW5pdFNpZGVTZWdtZW50cyhhWzBdLGFbMV0sRnMuTEVGVCksbi5hZGRGaXJzdFNlZ21lbnQoKTtmb3IodmFyIGM9MjtjPD11O2MrKyluLmFkZE5leHRTZWdtZW50KGFbY10sITApfW4uYWRkTGFzdFNlZ21lbnQoKSxuLmNsb3NlUmluZygpfSxVYS5wcm90b3R5cGUuY29tcHV0ZVJpbmdCdWZmZXJDdXJ2ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5zaW1wbGlmeVRvbGVyYW5jZSh0aGlzLl9kaXN0YW5jZSk7ZT09PUZzLlJJR0hUJiYocj0tcik7dmFyIGk9T2Euc2ltcGxpZnkodCxyKSxvPWkubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGlbby0xXSxpWzBdLGUpO2Zvcih2YXIgcz0xO3M8PW87cysrKXt2YXIgYT0xIT09cztuLmFkZE5leHRTZWdtZW50KGlbc10sYSl9bi5jbG9zZVJpbmcoKX0sVWEucHJvdG90eXBlLmNvbXB1dGVMaW5lQnVmZmVyQ3VydmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnNpbXBsaWZ5VG9sZXJhbmNlKHRoaXMuX2Rpc3RhbmNlKSxyPU9hLnNpbXBsaWZ5KHQsbiksaT1yLmxlbmd0aC0xO2UuaW5pdFNpZGVTZWdtZW50cyhyWzBdLHJbMV0sRnMuTEVGVCk7Zm9yKHZhciBvPTI7bzw9aTtvKyspZS5hZGROZXh0U2VnbWVudChyW29dLCEwKTtlLmFkZExhc3RTZWdtZW50KCksZS5hZGRMaW5lRW5kQ2FwKHJbaS0xXSxyW2ldKTt2YXIgcz1PYS5zaW1wbGlmeSh0LC1uKSxhPXMubGVuZ3RoLTE7ZS5pbml0U2lkZVNlZ21lbnRzKHNbYV0sc1thLTFdLEZzLkxFRlQpO2Zvcih2YXIgdT1hLTI7dT49MDt1LS0pZS5hZGROZXh0U2VnbWVudChzW3VdLCEwKTtlLmFkZExhc3RTZWdtZW50KCksZS5hZGRMaW5lRW5kQ2FwKHNbMV0sc1swXSksZS5jbG9zZVJpbmcoKX0sVWEucHJvdG90eXBlLmNvbXB1dGVQb2ludEN1cnZlPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX2J1ZlBhcmFtcy5nZXRFbmRDYXBTdHlsZSgpKXtjYXNlIEZhLkNBUF9ST1VORDplLmNyZWF0ZUNpcmNsZSh0KTticmVhaztjYXNlIEZhLkNBUF9TUVVBUkU6ZS5jcmVhdGVTcXVhcmUodCl9fSxVYS5wcm90b3R5cGUuZ2V0TGluZUN1cnZlPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fZGlzdGFuY2U9ZSxlPDAmJiF0aGlzLl9idWZQYXJhbXMuaXNTaW5nbGVTaWRlZCgpfHwwPT09ZSlyZXR1cm4gbnVsbDt2YXIgbj1NYXRoLmFicyhlKSxyPXRoaXMuZ2V0U2VnR2VuKG4pO2lmKHQubGVuZ3RoPD0xKXRoaXMuY29tcHV0ZVBvaW50Q3VydmUodFswXSxyKTtlbHNlIGlmKHRoaXMuX2J1ZlBhcmFtcy5pc1NpbmdsZVNpZGVkKCkpe3ZhciBpPWU8MDt0aGlzLmNvbXB1dGVTaW5nbGVTaWRlZEJ1ZmZlckN1cnZlKHQsaSxyKX1lbHNlIHRoaXMuY29tcHV0ZUxpbmVCdWZmZXJDdXJ2ZSh0LHIpO3JldHVybiByLmdldENvb3JkaW5hdGVzKCl9LFVhLnByb3RvdHlwZS5nZXRCdWZmZXJQYXJhbWV0ZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZlBhcmFtc30sVWEucHJvdG90eXBlLnNpbXBsaWZ5VG9sZXJhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuX2J1ZlBhcmFtcy5nZXRTaW1wbGlmeUZhY3RvcigpfSxVYS5wcm90b3R5cGUuZ2V0UmluZ0N1cnZlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLl9kaXN0YW5jZT1uLHQubGVuZ3RoPD0yKXJldHVybiB0aGlzLmdldExpbmVDdXJ2ZSh0LG4pO2lmKDA9PT1uKXJldHVybiBVYS5jb3B5Q29vcmRpbmF0ZXModCk7dmFyIHI9dGhpcy5nZXRTZWdHZW4obik7cmV0dXJuIHRoaXMuY29tcHV0ZVJpbmdCdWZmZXJDdXJ2ZSh0LGUsciksci5nZXRDb29yZGluYXRlcygpfSxVYS5wcm90b3R5cGUuY29tcHV0ZU9mZnNldEN1cnZlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnNpbXBsaWZ5VG9sZXJhbmNlKHRoaXMuX2Rpc3RhbmNlKTtpZihlKXt2YXIgaT1PYS5zaW1wbGlmeSh0LC1yKSxvPWkubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGlbb10saVtvLTFdLEZzLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBzPW8tMjtzPj0wO3MtLSluLmFkZE5leHRTZWdtZW50KGlbc10sITApfWVsc2V7dmFyIGE9T2Euc2ltcGxpZnkodCxyKSx1PWEubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGFbMF0sYVsxXSxGcy5MRUZUKSxuLmFkZEZpcnN0U2VnbWVudCgpO2Zvcih2YXIgYz0yO2M8PXU7YysrKW4uYWRkTmV4dFNlZ21lbnQoYVtjXSwhMCl9bi5hZGRMYXN0U2VnbWVudCgpfSxVYS5wcm90b3R5cGUuZ2V0U2VnR2VuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgemEodGhpcy5fcHJlY2lzaW9uTW9kZWwsdGhpcy5fYnVmUGFyYW1zLHQpfSxVYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFVhfSxVYS5jb3B5Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT1uZXcgdmkodFtuXSk7cmV0dXJuIGV9O3ZhciBxYT1mdW5jdGlvbigpe3RoaXMuX3N1YmdyYXBocz1udWxsLHRoaXMuX3NlZz1uZXcgYmEsdGhpcy5fY2dhPW5ldyBlbzt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fc3ViZ3JhcGhzPXR9LFZhPXtEZXB0aFNlZ21lbnQ6e2NvbmZpZ3VyYWJsZTohMH19O3FhLnByb3RvdHlwZS5maW5kU3RhYmJlZFNlZ21lbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPW5ldyB4byxyPXRoaXMuX3N1YmdyYXBocy5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCksbz1pLmdldEVudmVsb3BlKCk7ZS55PG8uZ2V0TWluWSgpfHxlLnk+by5nZXRNYXhZKCl8fHQuZmluZFN0YWJiZWRTZWdtZW50cyhlLGkuZ2V0RGlyZWN0ZWRFZGdlcygpLG4pfXJldHVybiBufWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKEVpKGFyZ3VtZW50c1syXSx2bykmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgS3MpZm9yKHZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXSx1PWFyZ3VtZW50c1syXSxjPWEuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCksbD0wO2w8Yy5sZW5ndGgtMTtsKyspe2lmKHQuX3NlZy5wMD1jW2xdLHQuX3NlZy5wMT1jW2wrMV0sdC5fc2VnLnAwLnk+dC5fc2VnLnAxLnkmJnQuX3NlZy5yZXZlcnNlKCksIShNYXRoLm1heCh0Ll9zZWcucDAueCx0Ll9zZWcucDEueCk8cy54fHx0Ll9zZWcuaXNIb3Jpem9udGFsKCl8fHMueTx0Ll9zZWcucDAueXx8cy55PnQuX3NlZy5wMS55fHxlby5jb21wdXRlT3JpZW50YXRpb24odC5fc2VnLnAwLHQuX3NlZy5wMSxzKT09PWVvLlJJR0hUKSl7dmFyIGg9YS5nZXREZXB0aChGcy5MRUZUKTt0Ll9zZWcucDAuZXF1YWxzKGNbbF0pfHwoaD1hLmdldERlcHRoKEZzLlJJR0hUKSk7dmFyIGY9bmV3IEdhKHQuX3NlZyxoKTt1LmFkZChmKX19ZWxzZSBpZihFaShhcmd1bWVudHNbMl0sdm8pJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZFaShhcmd1bWVudHNbMV0sdm8pKWZvcih2YXIgcD1hcmd1bWVudHNbMF0sZD1hcmd1bWVudHNbMl0sZz1hcmd1bWVudHNbMV0uaXRlcmF0b3IoKTtnLmhhc05leHQoKTspe3ZhciB5PWcubmV4dCgpOyF5LmlzRm9yd2FyZCgpfHx0LmZpbmRTdGFiYmVkU2VnbWVudHMocCx5LGQpfX0scWEucHJvdG90eXBlLmdldERlcHRoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZmluZFN0YWJiZWRTZWdtZW50cyh0KTtyZXR1cm4gMD09PWUuc2l6ZSgpPzA6YWEubWluKGUpLl9sZWZ0RGVwdGh9LHFhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxxYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcWF9LFZhLkRlcHRoU2VnbWVudC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gR2F9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHFhLFZhKTt2YXIgR2E9ZnVuY3Rpb24oKXt0aGlzLl91cHdhcmRTZWc9bnVsbCx0aGlzLl9sZWZ0RGVwdGg9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fdXB3YXJkU2VnPW5ldyBiYSh0KSx0aGlzLl9sZWZ0RGVwdGg9ZX07R2EucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O2lmKHRoaXMuX3Vwd2FyZFNlZy5taW5YKCk+PWUuX3Vwd2FyZFNlZy5tYXhYKCkpcmV0dXJuIDE7aWYodGhpcy5fdXB3YXJkU2VnLm1heFgoKTw9ZS5fdXB3YXJkU2VnLm1pblgoKSlyZXR1cm4tMTt2YXIgbj10aGlzLl91cHdhcmRTZWcub3JpZW50YXRpb25JbmRleChlLl91cHdhcmRTZWcpO3JldHVybiAwIT09bnx8MCE9PShuPS0xKmUuX3Vwd2FyZFNlZy5vcmllbnRhdGlvbkluZGV4KHRoaXMuX3Vwd2FyZFNlZykpP246dGhpcy5fdXB3YXJkU2VnLmNvbXBhcmVUbyhlLl91cHdhcmRTZWcpfSxHYS5wcm90b3R5cGUuY29tcGFyZVg9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnAwLmNvbXBhcmVUbyhlLnAwKTtyZXR1cm4gMCE9PW4/bjp0LnAxLmNvbXBhcmVUbyhlLnAxKX0sR2EucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Vwd2FyZFNlZy50b1N0cmluZygpfSxHYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSxHYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gR2F9O3ZhciBZYT1mdW5jdGlvbih0LGUsbil7dGhpcy5wMD10fHxudWxsLHRoaXMucDE9ZXx8bnVsbCx0aGlzLnAyPW58fG51bGx9O1lhLnByb3RvdHlwZS5hcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLmFyZWEodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuc2lnbmVkQXJlYT1mdW5jdGlvbigpe3JldHVybiBZYS5zaWduZWRBcmVhKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmludGVycG9sYXRlWj1mdW5jdGlvbih0KXtpZihudWxsPT09dCl0aHJvdyBuZXcgaGk7cmV0dXJuIFlhLmludGVycG9sYXRlWih0LHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmxvbmdlc3RTaWRlTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLmxvbmdlc3RTaWRlTGVuZ3RoKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmlzQWN1dGU9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuaXNBY3V0ZSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5jaXJjdW1jZW50cmU9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuY2lyY3VtY2VudHJlKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmFyZWEzRD1mdW5jdGlvbigpe3JldHVybiBZYS5hcmVhM0QodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuY2VudHJvaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuY2VudHJvaWQodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuaW5DZW50cmU9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuaW5DZW50cmUodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFlhfSxZYS5hcmVhPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5hYnMoKChuLngtdC54KSooZS55LXQueSktKGUueC10LngpKihuLnktdC55KSkvMil9LFlhLnNpZ25lZEFyZWE9ZnVuY3Rpb24odCxlLG4pe3JldHVybigobi54LXQueCkqKGUueS10LnkpLShlLngtdC54KSoobi55LXQueSkpLzJ9LFlhLmRldD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdCpyLWUqbn0sWWEuaW50ZXJwb2xhdGVaPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWUueCxvPWUueSxzPW4ueC1pLGE9ci54LWksdT1uLnktbyxjPXIueS1vLGw9cypjLWEqdSxoPXQueC1pLGY9dC55LW8scD0oYypoLWEqZikvbCxkPSgtdSpoK3MqZikvbDtyZXR1cm4gZS56K3AqKG4uei1lLnopK2QqKHIuei1lLnopfSxZYS5sb25nZXN0U2lkZUxlbmd0aD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5kaXN0YW5jZShlKSxpPWUuZGlzdGFuY2Uobiksbz1uLmRpc3RhbmNlKHQpLHM9cjtyZXR1cm4gaT5zJiYocz1pKSxvPnMmJihzPW8pLHN9LFlhLmlzQWN1dGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiEoIUJhLmlzQWN1dGUodCxlLG4pfHwhQmEuaXNBY3V0ZShlLG4sdCl8fCFCYS5pc0FjdXRlKG4sdCxlKSl9LFlhLmNpcmN1bWNlbnRyZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bi54LGk9bi55LG89dC54LXIscz10LnktaSxhPWUueC1yLHU9ZS55LWksYz0yKllhLmRldChvLHMsYSx1KSxsPVlhLmRldChzLG8qbytzKnMsdSxhKmErdSp1KSxoPVlhLmRldChvLG8qbytzKnMsYSxhKmErdSp1KTtyZXR1cm4gbmV3IHZpKHItbC9jLGkraC9jKX0sWWEucGVycGVuZGljdWxhckJpc2VjdG9yPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS54LXQueCxyPWUueS10LnksaT1uZXcgemkodC54K24vMix0Lnkrci8yLDEpLG89bmV3IHppKHQueC1yK24vMix0LnkrbityLzIsMSk7cmV0dXJuIG5ldyB6aShpLG8pfSxZYS5hbmdsZUJpc2VjdG9yPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmRpc3RhbmNlKHQpLGk9ci8ocitlLmRpc3RhbmNlKG4pKSxvPW4ueC10Lngscz1uLnktdC55O3JldHVybiBuZXcgdmkodC54K2kqbyx0LnkraSpzKX0sWWEuYXJlYTNEPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLngtdC54LGk9ZS55LXQueSxvPWUuei10Lnoscz1uLngtdC54LGE9bi55LXQueSx1PW4uei10LnosYz1pKnUtbyphLGw9bypzLXIqdSxoPXIqYS1pKnMsZj1jKmMrbCpsK2gqaDtyZXR1cm4gTWF0aC5zcXJ0KGYpLzJ9LFlhLmNlbnRyb2lkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0odC54K2UueCtuLngpLzMsaT0odC55K2UueStuLnkpLzM7cmV0dXJuIG5ldyB2aShyLGkpfSxZYS5pbkNlbnRyZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5kaXN0YW5jZShuKSxpPXQuZGlzdGFuY2Uobiksbz10LmRpc3RhbmNlKGUpLHM9citpK28sYT0ocip0LngraSplLngrbypuLngpL3MsdT0ocip0LnkraSplLnkrbypuLnkpL3M7cmV0dXJuIG5ldyB2aShhLHUpfTt2YXIgWGE9ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEdlb209bnVsbCx0aGlzLl9kaXN0YW5jZT1udWxsLHRoaXMuX2N1cnZlQnVpbGRlcj1udWxsLHRoaXMuX2N1cnZlTGlzdD1uZXcgeG87dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX2lucHV0R2VvbT10LHRoaXMuX2Rpc3RhbmNlPWUsdGhpcy5fY3VydmVCdWlsZGVyPW59O1hhLnByb3RvdHlwZS5hZGRQb2ludD1mdW5jdGlvbih0KXtpZih0aGlzLl9kaXN0YW5jZTw9MClyZXR1cm4gbnVsbDt2YXIgZT10LmdldENvb3JkaW5hdGVzKCksbj10aGlzLl9jdXJ2ZUJ1aWxkZXIuZ2V0TGluZUN1cnZlKGUsdGhpcy5fZGlzdGFuY2UpO3RoaXMuYWRkQ3VydmUobixiaS5FWFRFUklPUixiaS5JTlRFUklPUil9LFhhLnByb3RvdHlwZS5hZGRQb2x5Z29uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLl9kaXN0YW5jZSxyPUZzLkxFRlQ7dGhpcy5fZGlzdGFuY2U8MCYmKG49LXRoaXMuX2Rpc3RhbmNlLHI9RnMuUklHSFQpO3ZhciBpPXQuZ2V0RXh0ZXJpb3JSaW5nKCksbz1Eby5yZW1vdmVSZXBlYXRlZFBvaW50cyhpLmdldENvb3JkaW5hdGVzKCkpO2lmKHRoaXMuX2Rpc3RhbmNlPDAmJnRoaXMuaXNFcm9kZWRDb21wbGV0ZWx5KGksdGhpcy5fZGlzdGFuY2UpfHx0aGlzLl9kaXN0YW5jZTw9MCYmby5sZW5ndGg8MylyZXR1cm4gbnVsbDt0aGlzLmFkZFBvbHlnb25SaW5nKG8sbixyLGJpLkVYVEVSSU9SLGJpLklOVEVSSU9SKTtmb3IodmFyIHM9MDtzPHQuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7cysrKXt2YXIgYT10LmdldEludGVyaW9yUmluZ04ocyksdT1Eby5yZW1vdmVSZXBlYXRlZFBvaW50cyhhLmdldENvb3JkaW5hdGVzKCkpO2UuX2Rpc3RhbmNlPjAmJmUuaXNFcm9kZWRDb21wbGV0ZWx5KGEsLWUuX2Rpc3RhbmNlKXx8ZS5hZGRQb2x5Z29uUmluZyh1LG4sRnMub3Bwb3NpdGUociksYmkuSU5URVJJT1IsYmkuRVhURVJJT1IpfX0sWGEucHJvdG90eXBlLmlzVHJpYW5nbGVFcm9kZWRDb21wbGV0ZWx5PWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IFlhKHRbMF0sdFsxXSx0WzJdKSxyPW4uaW5DZW50cmUoKTtyZXR1cm4gZW8uZGlzdGFuY2VQb2ludExpbmUocixuLnAwLG4ucDEpPE1hdGguYWJzKGUpfSxYYS5wcm90b3R5cGUuYWRkTGluZVN0cmluZz1mdW5jdGlvbih0KXtpZih0aGlzLl9kaXN0YW5jZTw9MCYmIXRoaXMuX2N1cnZlQnVpbGRlci5nZXRCdWZmZXJQYXJhbWV0ZXJzKCkuaXNTaW5nbGVTaWRlZCgpKXJldHVybiBudWxsO3ZhciBlPURvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKHQuZ2V0Q29vcmRpbmF0ZXMoKSksbj10aGlzLl9jdXJ2ZUJ1aWxkZXIuZ2V0TGluZUN1cnZlKGUsdGhpcy5fZGlzdGFuY2UpO3RoaXMuYWRkQ3VydmUobixiaS5FWFRFUklPUixiaS5JTlRFUklPUil9LFhhLnByb3RvdHlwZS5hZGRDdXJ2ZT1mdW5jdGlvbih0LGUsbil7aWYobnVsbD09PXR8fHQubGVuZ3RoPDIpcmV0dXJuIG51bGw7dmFyIHI9bmV3IHdhKHQsbmV3IGpzKDAsYmkuQk9VTkRBUlksZSxuKSk7dGhpcy5fY3VydmVMaXN0LmFkZChyKX0sWGEucHJvdG90eXBlLmdldEN1cnZlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZCh0aGlzLl9pbnB1dEdlb20pLHRoaXMuX2N1cnZlTGlzdH0sWGEucHJvdG90eXBlLmFkZFBvbHlnb25SaW5nPWZ1bmN0aW9uKHQsZSxuLHIsaSl7aWYoMD09PWUmJnQubGVuZ3RoPHBzLk1JTklNVU1fVkFMSURfU0laRSlyZXR1cm4gbnVsbDt2YXIgbz1yLHM9aTt0Lmxlbmd0aD49cHMuTUlOSU1VTV9WQUxJRF9TSVpFJiZlby5pc0NDVyh0KSYmKG89aSxzPXIsbj1Gcy5vcHBvc2l0ZShuKSk7dmFyIGE9dGhpcy5fY3VydmVCdWlsZGVyLmdldFJpbmdDdXJ2ZSh0LG4sZSk7dGhpcy5hZGRDdXJ2ZShhLG8scyl9LFhhLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7aWYodC5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dCBpbnN0YW5jZW9mIGhzP3RoaXMuYWRkUG9seWdvbih0KTp0IGluc3RhbmNlb2YgYXM/dGhpcy5hZGRMaW5lU3RyaW5nKHQpOnQgaW5zdGFuY2VvZiBjcz90aGlzLmFkZFBvaW50KHQpOih0IGluc3RhbmNlb2YgZnN8fHQgaW5zdGFuY2VvZiBab3x8dCBpbnN0YW5jZW9mIGRzfHx0IGluc3RhbmNlb2YgSG8pJiZ0aGlzLmFkZENvbGxlY3Rpb24odCl9LFhhLnByb3RvdHlwZS5pc0Vyb2RlZENvbXBsZXRlbHk9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldENvb3JkaW5hdGVzKCk7aWYobi5sZW5ndGg8NClyZXR1cm4gZTwwO2lmKDQ9PT1uLmxlbmd0aClyZXR1cm4gdGhpcy5pc1RyaWFuZ2xlRXJvZGVkQ29tcGxldGVseShuLGUpO3ZhciByPXQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLGk9TWF0aC5taW4oci5nZXRIZWlnaHQoKSxyLmdldFdpZHRoKCkpO3JldHVybiBlPDAmJjIqTWF0aC5hYnMoZSk+aX0sWGEucHJvdG90eXBlLmFkZENvbGxlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0LmdldE51bUdlb21ldHJpZXMoKTtlKyspe3ZhciBuPXQuZ2V0R2VvbWV0cnlOKGUpO3RoaXMuYWRkKG4pfX0sWGEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFhhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYYX07dmFyIFdhPWZ1bmN0aW9uKCl7fTtXYS5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQpe30sV2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFdhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBXYX07dmFyIEhhPWZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50PW51bGwsdGhpcy5fYXRTdGFydD1udWxsLHRoaXMuX21heD1udWxsLHRoaXMuX2luZGV4PW51bGwsdGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX3BhcmVudD10LHRoaXMuX2F0U3RhcnQ9ITAsdGhpcy5faW5kZXg9MCx0aGlzLl9tYXg9dC5nZXROdW1HZW9tZXRyaWVzKCl9O0hhLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5fYXRTdGFydClyZXR1cm4gdGhpcy5fYXRTdGFydD0hMSxIYS5pc0F0b21pYyh0aGlzLl9wYXJlbnQpJiZ0aGlzLl9pbmRleCsrLHRoaXMuX3BhcmVudDtpZihudWxsIT09dGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yKXtpZih0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKXJldHVybiB0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3IubmV4dCgpO3RoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcj1udWxsfWlmKHRoaXMuX2luZGV4Pj10aGlzLl9tYXgpdGhyb3cgbmV3IF9vO3ZhciB0PXRoaXMuX3BhcmVudC5nZXRHZW9tZXRyeU4odGhpcy5faW5kZXgrKyk7cmV0dXJuIHQgaW5zdGFuY2VvZiBIbz8odGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yPW5ldyBIYSh0KSx0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3IubmV4dCgpKTp0fSxIYS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpfSxIYS5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe2lmKHRoaXMuX2F0U3RhcnQpcmV0dXJuITA7aWYobnVsbCE9PXRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcil7aWYodGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yLmhhc05leHQoKSlyZXR1cm4hMDt0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3I9bnVsbH1yZXR1cm4hKHRoaXMuX2luZGV4Pj10aGlzLl9tYXgpfSxIYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbW9dfSxIYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSGF9LEhhLmlzQXRvbWljPWZ1bmN0aW9uKHQpe3JldHVybiEodCBpbnN0YW5jZW9mIEhvKX07dmFyIFphPWZ1bmN0aW9uKCl7dGhpcy5fZ2VvbT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9nZW9tPXR9O1phLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIFphLmxvY2F0ZSh0LHRoaXMuX2dlb20pfSxaYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bV2FdfSxaYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWmF9LFphLmlzUG9pbnRJblJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4hIWUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmludGVyc2VjdHModCkmJmVvLmlzUG9pbnRJblJpbmcodCxlLmdldENvb3JkaW5hdGVzKCkpfSxaYS5jb250YWluc1BvaW50SW5Qb2x5Z29uPWZ1bmN0aW9uKHQsZSl7aWYoZS5pc0VtcHR5KCkpcmV0dXJuITE7dmFyIG49ZS5nZXRFeHRlcmlvclJpbmcoKTtpZighWmEuaXNQb2ludEluUmluZyh0LG4pKXJldHVybiExO2Zvcih2YXIgcj0wO3I8ZS5nZXROdW1JbnRlcmlvclJpbmcoKTtyKyspe3ZhciBpPWUuZ2V0SW50ZXJpb3JSaW5nTihyKTtpZihaYS5pc1BvaW50SW5SaW5nKHQsaSkpcmV0dXJuITF9cmV0dXJuITB9LFphLmNvbnRhaW5zUG9pbnQ9ZnVuY3Rpb24odCxlKXtpZihlIGluc3RhbmNlb2YgaHMpcmV0dXJuIFphLmNvbnRhaW5zUG9pbnRJblBvbHlnb24odCxlKTtpZihlIGluc3RhbmNlb2YgSG8pZm9yKHZhciBuPW5ldyBIYShlKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2lmKHIhPT1lJiZaYS5jb250YWluc1BvaW50KHQscikpcmV0dXJuITB9cmV0dXJuITF9LFphLmxvY2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBlLmlzRW1wdHkoKT9iaS5FWFRFUklPUjpaYS5jb250YWluc1BvaW50KHQsZSk/YmkuSU5URVJJT1I6YmkuRVhURVJJT1J9O3ZhciBLYT1mdW5jdGlvbigpe3RoaXMuX2VkZ2VNYXA9bmV3IGtvLHRoaXMuX2VkZ2VMaXN0PW51bGwsdGhpcy5fcHRJbkFyZWFMb2NhdGlvbj1bYmkuTk9ORSxiaS5OT05FXX07S2EucHJvdG90eXBlLmdldE5leHRDVz1mdW5jdGlvbih0KXt0aGlzLmdldEVkZ2VzKCk7dmFyIGU9dGhpcy5fZWRnZUxpc3QuaW5kZXhPZih0KSxuPWUtMTtyZXR1cm4gMD09PWUmJihuPXRoaXMuX2VkZ2VMaXN0LnNpemUoKS0xKSx0aGlzLl9lZGdlTGlzdC5nZXQobil9LEthLnByb3RvdHlwZS5wcm9wYWdhdGVTaWRlTGFiZWxzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1iaS5OT05FLG49dGhpcy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCkuZ2V0TGFiZWwoKTtyLmlzQXJlYSh0KSYmci5nZXRMb2NhdGlvbih0LEZzLkxFRlQpIT09YmkuTk9ORSYmKGU9ci5nZXRMb2NhdGlvbih0LEZzLkxFRlQpKX1pZihlPT09YmkuTk9ORSlyZXR1cm4gbnVsbDtmb3IodmFyIGk9ZSxvPXRoaXMuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpLGE9cy5nZXRMYWJlbCgpO2lmKGEuZ2V0TG9jYXRpb24odCxGcy5PTik9PT1iaS5OT05FJiZhLnNldExvY2F0aW9uKHQsRnMuT04saSksYS5pc0FyZWEodCkpe3ZhciB1PWEuZ2V0TG9jYXRpb24odCxGcy5MRUZUKSxjPWEuZ2V0TG9jYXRpb24odCxGcy5SSUdIVCk7aWYoYyE9PWJpLk5PTkUpe2lmKGMhPT1pKXRocm93IG5ldyBScygic2lkZSBsb2NhdGlvbiBjb25mbGljdCIscy5nZXRDb29yZGluYXRlKCkpO3U9PT1iaS5OT05FJiZaaS5zaG91bGROZXZlclJlYWNoSGVyZSgiZm91bmQgc2luZ2xlIG51bGwgc2lkZSAoYXQgIitzLmdldENvb3JkaW5hdGUoKSsiKSIpLGk9dX1lbHNlIFppLmlzVHJ1ZShhLmdldExvY2F0aW9uKHQsRnMuTEVGVCk9PT1iaS5OT05FLCJmb3VuZCBzaW5nbGUgbnVsbCBzaWRlIiksYS5zZXRMb2NhdGlvbih0LEZzLlJJR0hULGkpLGEuc2V0TG9jYXRpb24odCxGcy5MRUZULGkpfX19LEthLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pdGVyYXRvcigpO3JldHVybiB0Lmhhc05leHQoKT90Lm5leHQoKS5nZXRDb29yZGluYXRlKCk6bnVsbH0sS2EucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe2tpLm91dC5wcmludGxuKCJFZGdlRW5kU3RhcjogICAiK3RoaXMuZ2V0Q29vcmRpbmF0ZSgpKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkucHJpbnQodCl9fSxLYS5wcm90b3R5cGUuaXNBcmVhTGFiZWxzQ29uc2lzdGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wdXRlRWRnZUVuZExhYmVscyh0LmdldEJvdW5kYXJ5Tm9kZVJ1bGUoKSksdGhpcy5jaGVja0FyZWFMYWJlbHNDb25zaXN0ZW50KDApfSxLYS5wcm90b3R5cGUuY2hlY2tBcmVhTGFiZWxzQ29uc2lzdGVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEVkZ2VzKCk7aWYoZS5zaXplKCk8PTApcmV0dXJuITA7dmFyIG49ZS5zaXplKCktMSxyPWUuZ2V0KG4pLmdldExhYmVsKCkuZ2V0TG9jYXRpb24odCxGcy5MRUZUKTtaaS5pc1RydWUociE9PWJpLk5PTkUsIkZvdW5kIHVubGFiZWxsZWQgYXJlYSBlZGdlIik7Zm9yKHZhciBpPXIsbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKS5nZXRMYWJlbCgpO1ppLmlzVHJ1ZShzLmlzQXJlYSh0KSwiRm91bmQgbm9uLWFyZWEgZWRnZSIpO3ZhciBhPXMuZ2V0TG9jYXRpb24odCxGcy5MRUZUKSx1PXMuZ2V0TG9jYXRpb24odCxGcy5SSUdIVCk7aWYoYT09PXV8fHUhPT1pKXJldHVybiExO2k9YX1yZXR1cm4hMH0sS2EucHJvdG90eXBlLmZpbmRJbmRleD1mdW5jdGlvbih0KXt0aGlzLml0ZXJhdG9yKCk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9lZGdlTGlzdC5zaXplKCk7ZSsrKXtpZih0aGlzLl9lZGdlTGlzdC5nZXQoZSk9PT10KXJldHVybiBlfXJldHVybi0xfSxLYS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFZGdlcygpLml0ZXJhdG9yKCl9LEthLnByb3RvdHlwZS5nZXRFZGdlcz1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fZWRnZUxpc3QmJih0aGlzLl9lZGdlTGlzdD1uZXcgeG8odGhpcy5fZWRnZU1hcC52YWx1ZXMoKSkpLHRoaXMuX2VkZ2VMaXN0fSxLYS5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLl9wdEluQXJlYUxvY2F0aW9uW3RdPT09YmkuTk9ORSYmKHRoaXMuX3B0SW5BcmVhTG9jYXRpb25bdF09WmEubG9jYXRlKGUsblt0XS5nZXRHZW9tZXRyeSgpKSksdGhpcy5fcHRJbkFyZWFMb2NhdGlvblt0XX0sS2EucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFpO3QuYXBwZW5kKCJFZGdlRW5kU3RhcjogICAiK3RoaXMuZ2V0Q29vcmRpbmF0ZSgpKSx0LmFwcGVuZCgiXG4iKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dC5hcHBlbmQobiksdC5hcHBlbmQoIlxuIil9cmV0dXJuIHQudG9TdHJpbmcoKX0sS2EucHJvdG90eXBlLmNvbXB1dGVFZGdlRW5kTGFiZWxzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5jb21wdXRlTGFiZWwodCl9fSxLYS5wcm90b3R5cGUuY29tcHV0ZUxhYmVsbGluZz1mdW5jdGlvbih0KXt0aGlzLmNvbXB1dGVFZGdlRW5kTGFiZWxzKHRbMF0uZ2V0Qm91bmRhcnlOb2RlUnVsZSgpKSx0aGlzLnByb3BhZ2F0ZVNpZGVMYWJlbHMoMCksdGhpcy5wcm9wYWdhdGVTaWRlTGFiZWxzKDEpO2Zvcih2YXIgZT1bITEsITFdLG49dGhpcy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOylmb3IodmFyIHI9bi5uZXh0KCkuZ2V0TGFiZWwoKSxpPTA7aTwyO2krKylyLmlzTGluZShpKSYmci5nZXRMb2NhdGlvbihpKT09PWJpLkJPVU5EQVJZJiYoZVtpXT0hMCk7Zm9yKHZhciBvPXRoaXMuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspZm9yKHZhciBzPW8ubmV4dCgpLGE9cy5nZXRMYWJlbCgpLHU9MDt1PDI7dSsrKWlmKGEuaXNBbnlOdWxsKHUpKXt2YXIgYz1iaS5OT05FO2lmKGVbdV0pYz1iaS5FWFRFUklPUjtlbHNle3ZhciBsPXMuZ2V0Q29vcmRpbmF0ZSgpO2M9dGhpcy5nZXRMb2NhdGlvbih1LGwsdCl9YS5zZXRBbGxMb2NhdGlvbnNJZk51bGwodSxjKX19LEthLnByb3RvdHlwZS5nZXREZWdyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZU1hcC5zaXplKCl9LEthLnByb3RvdHlwZS5pbnNlcnRFZGdlRW5kPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZWRnZU1hcC5wdXQodCxlKSx0aGlzLl9lZGdlTGlzdD1udWxsfSxLYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEthfTt2YXIgSmE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3Q9bnVsbCx0aGlzLl9sYWJlbD1udWxsLHRoaXMuX1NDQU5OSU5HX0ZPUl9JTkNPTUlORz0xLHRoaXMuX0xJTktJTkdfVE9fT1VUR09JTkc9Mn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUubGlua1Jlc3VsdERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuZ2V0UmVzdWx0QXJlYUVkZ2VzKCk7Zm9yKHZhciBlPW51bGwsbj1udWxsLHI9dGhpcy5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HLGk9MDtpPHRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdC5zaXplKCk7aSsrKXt2YXIgbz10Ll9yZXN1bHRBcmVhRWRnZUxpc3QuZ2V0KGkpLHM9by5nZXRTeW0oKTtpZihvLmdldExhYmVsKCkuaXNBcmVhKCkpc3dpdGNoKG51bGw9PT1lJiZvLmlzSW5SZXN1bHQoKSYmKGU9bykscil7Y2FzZSB0Ll9TQ0FOTklOR19GT1JfSU5DT01JTkc6aWYoIXMuaXNJblJlc3VsdCgpKWNvbnRpbnVlO249cyxyPXQuX0xJTktJTkdfVE9fT1VUR09JTkc7YnJlYWs7Y2FzZSB0Ll9MSU5LSU5HX1RPX09VVEdPSU5HOmlmKCFvLmlzSW5SZXN1bHQoKSljb250aW51ZTtuLnNldE5leHQobykscj10Ll9TQ0FOTklOR19GT1JfSU5DT01JTkd9fWlmKHI9PT10aGlzLl9MSU5LSU5HX1RPX09VVEdPSU5HKXtpZihudWxsPT09ZSl0aHJvdyBuZXcgUnMoIm5vIG91dGdvaW5nIGRpckVkZ2UgZm91bmQiLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpKTtaaS5pc1RydWUoZS5pc0luUmVzdWx0KCksInVuYWJsZSB0byBsaW5rIGxhc3QgaW5jb21pbmcgZGlyRWRnZSIpLG4uc2V0TmV4dChlKX19LGUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0KXt2YXIgZT10O3RoaXMuaW5zZXJ0RWRnZUVuZChlLGUpfSxlLnByb3RvdHlwZS5nZXRSaWdodG1vc3RFZGdlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRFZGdlcygpLGU9dC5zaXplKCk7aWYoZTwxKXJldHVybiBudWxsO3ZhciBuPXQuZ2V0KDApO2lmKDE9PT1lKXJldHVybiBuO3ZhciByPXQuZ2V0KGUtMSksaT1uLmdldFF1YWRyYW50KCksbz1yLmdldFF1YWRyYW50KCk7cmV0dXJuIFdzLmlzTm9ydGhlcm4oaSkmJldzLmlzTm9ydGhlcm4obyk/bjpXcy5pc05vcnRoZXJuKGkpfHxXcy5pc05vcnRoZXJuKG8pPzAhPT1uLmdldER5KCk/bjowIT09ci5nZXREeSgpP3I6KFppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJmb3VuZCB0d28gaG9yaXpvbnRhbCBlZGdlcyBpbmNpZGVudCBvbiBub2RlIiksbnVsbCk6cn0sZS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7a2kub3V0LnByaW50bG4oIkRpcmVjdGVkRWRnZVN0YXI6ICIrdGhpcy5nZXRDb29yZGluYXRlKCkpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0LnByaW50KCJvdXQgIiksbi5wcmludCh0KSx0LnByaW50bG4oKSx0LnByaW50KCJpbiAiKSxuLmdldFN5bSgpLnByaW50KHQpLHQucHJpbnRsbigpfX0sZS5wcm90b3R5cGUuZ2V0UmVzdWx0QXJlYUVkZ2VzPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdClyZXR1cm4gdGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0O3RoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdD1uZXcgeG87Zm9yKHZhciB0PXRoaXMuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpOyhlLmlzSW5SZXN1bHQoKXx8ZS5nZXRTeW0oKS5pc0luUmVzdWx0KCkpJiZ0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3QuYWRkKGUpfXJldHVybiB0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3R9LGUucHJvdG90eXBlLnVwZGF0ZUxhYmVsbGluZz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkuZ2V0TGFiZWwoKTtuLnNldEFsbExvY2F0aW9uc0lmTnVsbCgwLHQuZ2V0TG9jYXRpb24oMCkpLG4uc2V0QWxsTG9jYXRpb25zSWZOdWxsKDEsdC5nZXRMb2NhdGlvbigxKSl9fSxlLnByb3RvdHlwZS5saW5rQWxsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3RoaXMuZ2V0RWRnZXMoKTtmb3IodmFyIHQ9bnVsbCxlPW51bGwsbj10aGlzLl9lZGdlTGlzdC5zaXplKCktMTtuPj0wO24tLSl7dmFyIHI9dGhpcy5fZWRnZUxpc3QuZ2V0KG4pLGk9ci5nZXRTeW0oKTtudWxsPT09ZSYmKGU9aSksbnVsbCE9PXQmJmkuc2V0TmV4dCh0KSx0PXJ9ZS5zZXROZXh0KHQpfSxlLnByb3RvdHlwZS5jb21wdXRlRGVwdGhzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXRoaXMuZmluZEluZGV4KHQpLG49dC5nZXREZXB0aChGcy5MRUZUKSxyPXQuZ2V0RGVwdGgoRnMuUklHSFQpLGk9dGhpcy5jb21wdXRlRGVwdGhzKGUrMSx0aGlzLl9lZGdlTGlzdC5zaXplKCksbik7aWYodGhpcy5jb21wdXRlRGVwdGhzKDAsZSxpKSE9PXIpdGhyb3cgbmV3IFJzKCJkZXB0aCBtaXNtYXRjaCBhdCAiK3QuZ2V0Q29vcmRpbmF0ZSgpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzBdO2E8bzthKyspe3ZhciB1PXRoaXMuX2VkZ2VMaXN0LmdldChhKTt1LnNldEVkZ2VEZXB0aHMoRnMuUklHSFQscykscz11LmdldERlcHRoKEZzLkxFRlQpfXJldHVybiBzfX0sZS5wcm90b3R5cGUubWVyZ2VTeW1MYWJlbHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCk7ZS5nZXRMYWJlbCgpLm1lcmdlKGUuZ2V0U3ltKCkuZ2V0TGFiZWwoKSl9fSxlLnByb3RvdHlwZS5saW5rTWluaW1hbERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj1udWxsLHI9bnVsbCxpPXRoaXMuX1NDQU5OSU5HX0ZPUl9JTkNPTUlORyxvPXRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdC5zaXplKCktMTtvPj0wO28tLSl7dmFyIHM9ZS5fcmVzdWx0QXJlYUVkZ2VMaXN0LmdldChvKSxhPXMuZ2V0U3ltKCk7c3dpdGNoKG51bGw9PT1uJiZzLmdldEVkZ2VSaW5nKCk9PT10JiYobj1zKSxpKXtjYXNlIGUuX1NDQU5OSU5HX0ZPUl9JTkNPTUlORzppZihhLmdldEVkZ2VSaW5nKCkhPT10KWNvbnRpbnVlO3I9YSxpPWUuX0xJTktJTkdfVE9fT1VUR09JTkc7YnJlYWs7Y2FzZSBlLl9MSU5LSU5HX1RPX09VVEdPSU5HOmlmKHMuZ2V0RWRnZVJpbmcoKSE9PXQpY29udGludWU7ci5zZXROZXh0TWluKHMpLGk9ZS5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HfX1pPT09dGhpcy5fTElOS0lOR19UT19PVVRHT0lORyYmKFppLmlzVHJ1ZShudWxsIT09biwiZm91bmQgbnVsbCBmb3IgZmlyc3Qgb3V0Z29pbmcgZGlyRWRnZSIpLFppLmlzVHJ1ZShuLmdldEVkZ2VSaW5nKCk9PT10LCJ1bmFibGUgdG8gbGluayBsYXN0IGluY29taW5nIGRpckVkZ2UiKSxyLnNldE5leHRNaW4obikpfSxlLnByb3RvdHlwZS5nZXRPdXRnb2luZ0RlZ3JlZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHQ9MCxlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLmlzSW5SZXN1bHQoKSYmdCsrfXJldHVybiB0fWlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIG49YXJndW1lbnRzWzBdLHI9MCxpPXRoaXMuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe2kubmV4dCgpLmdldEVkZ2VSaW5nKCk9PT1uJiZyKyt9cmV0dXJuIHJ9fSxlLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sZS5wcm90b3R5cGUuZmluZENvdmVyZWRMaW5lRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YmkuTk9ORSxlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLHI9bi5nZXRTeW0oKTtpZighbi5pc0xpbmVFZGdlKCkpe2lmKG4uaXNJblJlc3VsdCgpKXt0PWJpLklOVEVSSU9SO2JyZWFrfWlmKHIuaXNJblJlc3VsdCgpKXt0PWJpLkVYVEVSSU9SO2JyZWFrfX19aWYodD09PWJpLk5PTkUpcmV0dXJuIG51bGw7Zm9yKHZhciBpPXQsbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKSxhPXMuZ2V0U3ltKCk7cy5pc0xpbmVFZGdlKCk/cy5nZXRFZGdlKCkuc2V0Q292ZXJlZChpPT09YmkuSU5URVJJT1IpOihzLmlzSW5SZXN1bHQoKSYmKGk9YmkuRVhURVJJT1IpLGEuaXNJblJlc3VsdCgpJiYoaT1iaS5JTlRFUklPUikpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUxhYmVsbGluZz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nLmNhbGwodGhpcyxlKSx0aGlzLl9sYWJlbD1uZXcganMoYmkuTk9ORSk7Zm9yKHZhciBuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspZm9yKHZhciByPW4ubmV4dCgpLmdldEVkZ2UoKS5nZXRMYWJlbCgpLGk9MDtpPDI7aSsrKXt2YXIgbz1yLmdldExvY2F0aW9uKGkpOyhvPT09YmkuSU5URVJJT1J8fG89PT1iaS5CT1VOREFSWSkmJnRoaXMuX2xhYmVsLnNldExvY2F0aW9uKGksYmkuSU5URVJJT1IpfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oS2EpLFFhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY3JlYXRlTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFlzKHQsbmV3IEphKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oSnMpLCRhPWZ1bmN0aW9uIHQoKXt0aGlzLl9wdHM9bnVsbCx0aGlzLl9vcmllbnRhdGlvbj1udWxsO3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9wdHM9ZSx0aGlzLl9vcmllbnRhdGlvbj10Lm9yaWVudGF0aW9uKGUpfTskYS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuICRhLmNvbXBhcmVPcmllbnRlZCh0aGlzLl9wdHMsdGhpcy5fb3JpZW50YXRpb24sZS5fcHRzLGUuX29yaWVudGF0aW9uKX0sJGEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0sJGEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICRhfSwkYS5vcmllbnRhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gMT09PURvLmluY3JlYXNpbmdEaXJlY3Rpb24odCl9LCRhLmNvbXBhcmVPcmllbnRlZD1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9ZT8xOi0xLG89cj8xOi0xLHM9ZT90Lmxlbmd0aDotMSxhPXI/bi5sZW5ndGg6LTEsdT1lPzA6dC5sZW5ndGgtMSxjPXI/MDpuLmxlbmd0aC0xOzspe3ZhciBsPXRbdV0uY29tcGFyZVRvKG5bY10pO2lmKDAhPT1sKXJldHVybiBsO3ZhciBoPSh1Kz1pKT09PXMsZj0oYys9byk9PT1hO2lmKGgmJiFmKXJldHVybi0xO2lmKCFoJiZmKXJldHVybiAxO2lmKGgmJmYpcmV0dXJuIDB9fTt2YXIgdHU9ZnVuY3Rpb24oKXt0aGlzLl9lZGdlcz1uZXcgeG8sdGhpcy5fb2NhTWFwPW5ldyBrb307dHUucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnQoIk1VTFRJTElORVNUUklORyAoICIpO2Zvcih2YXIgZT0wO2U8dGhpcy5fZWRnZXMuc2l6ZSgpO2UrKyl7dmFyIG49dGhpcy5fZWRnZXMuZ2V0KGUpO2U+MCYmdC5wcmludCgiLCIpLHQucHJpbnQoIigiKTtmb3IodmFyIHI9bi5nZXRDb29yZGluYXRlcygpLGk9MDtpPHIubGVuZ3RoO2krKylpPjAmJnQucHJpbnQoIiwiKSx0LnByaW50KHJbaV0ueCsiICIrcltpXS55KTt0LnByaW50bG4oIikiKX10LnByaW50KCIpICAiKX0sdHUucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSl9LHR1LnByb3RvdHlwZS5maW5kRWRnZUluZGV4PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fZWRnZXMuc2l6ZSgpO2UrKylpZih0aGlzLl9lZGdlcy5nZXQoZSkuZXF1YWxzKHQpKXJldHVybiBlO3JldHVybi0xfSx0dS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXMuaXRlcmF0b3IoKX0sdHUucHJvdG90eXBlLmdldEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzfSx0dS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9lZGdlcy5nZXQodCl9LHR1LnByb3RvdHlwZS5maW5kRXF1YWxFZGdlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyAkYSh0LmdldENvb3JkaW5hdGVzKCkpO3JldHVybiB0aGlzLl9vY2FNYXAuZ2V0KGUpfSx0dS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VzLmFkZCh0KTt2YXIgZT1uZXcgJGEodC5nZXRDb29yZGluYXRlcygpKTt0aGlzLl9vY2FNYXAucHV0KGUsdCl9LHR1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx0dS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdHV9O3ZhciBldT1mdW5jdGlvbigpe307ZXUucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe30sZXUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe30sZXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGV1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBldX07dmFyIG51PWZ1bmN0aW9uKCl7dGhpcy5faGFzSW50ZXJzZWN0aW9uPSExLHRoaXMuX2hhc1Byb3Blcj0hMSx0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcj0hMSx0aGlzLl9oYXNJbnRlcmlvcj0hMSx0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD1udWxsLHRoaXMuX2xpPW51bGwsdGhpcy5faXNTZWxmSW50ZXJzZWN0aW9uPW51bGwsdGhpcy5udW1JbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1JbnRlcmlvckludGVyc2VjdGlvbnM9MCx0aGlzLm51bVByb3BlckludGVyc2VjdGlvbnM9MCx0aGlzLm51bVRlc3RzPTA7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xpPXR9O251LnByb3RvdHlwZS5pc1RyaXZpYWxJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7aWYodD09PW4mJjE9PT10aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKSl7aWYobnUuaXNBZGphY2VudFNlZ21lbnRzKGUscikpcmV0dXJuITA7aWYodC5pc0Nsb3NlZCgpKXt2YXIgaT10LnNpemUoKS0xO2lmKDA9PT1lJiZyPT09aXx8MD09PXImJmU9PT1pKXJldHVybiEwfX1yZXR1cm4hMX0sbnUucHJvdG90eXBlLmdldFByb3BlckludGVyc2VjdGlvblBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlckludGVyc2VjdGlvblBvaW50fSxudS5wcm90b3R5cGUuaGFzUHJvcGVySW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzUHJvcGVySW50ZXJpb3J9LG51LnByb3RvdHlwZS5nZXRMaW5lSW50ZXJzZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGl9LG51LnByb3RvdHlwZS5oYXNQcm9wZXJJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzUHJvcGVyfSxudS5wcm90b3R5cGUucHJvY2Vzc0ludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4scil7aWYodD09PW4mJmU9PT1yKXJldHVybiBudWxsO3RoaXMubnVtVGVzdHMrKzt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO3RoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJih0aGlzLm51bUludGVyc2VjdGlvbnMrKyx0aGlzLl9saS5pc0ludGVyaW9ySW50ZXJzZWN0aW9uKCkmJih0aGlzLm51bUludGVyaW9ySW50ZXJzZWN0aW9ucysrLHRoaXMuX2hhc0ludGVyaW9yPSEwKSx0aGlzLmlzVHJpdmlhbEludGVyc2VjdGlvbih0LGUsbixyKXx8KHRoaXMuX2hhc0ludGVyc2VjdGlvbj0hMCx0LmFkZEludGVyc2VjdGlvbnModGhpcy5fbGksZSwwKSxuLmFkZEludGVyc2VjdGlvbnModGhpcy5fbGksciwxKSx0aGlzLl9saS5pc1Byb3BlcigpJiYodGhpcy5udW1Qcm9wZXJJbnRlcnNlY3Rpb25zKyssdGhpcy5faGFzUHJvcGVyPSEwLHRoaXMuX2hhc1Byb3BlckludGVyaW9yPSEwKSkpfSxudS5wcm90b3R5cGUuaGFzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc0ludGVyc2VjdGlvbn0sbnUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSxudS5wcm90b3R5cGUuaGFzSW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzSW50ZXJpb3J9LG51LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltldV19LG51LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBudX0sbnUuaXNBZGphY2VudFNlZ21lbnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDE9PT1NYXRoLmFicyh0LWUpfTt2YXIgcnU9ZnVuY3Rpb24oKXt0aGlzLmNvb3JkPW51bGwsdGhpcy5zZWdtZW50SW5kZXg9bnVsbCx0aGlzLmRpc3Q9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07dGhpcy5jb29yZD1uZXcgdmkodCksdGhpcy5zZWdtZW50SW5kZXg9ZSx0aGlzLmRpc3Q9bn07cnUucHJvdG90eXBlLmdldFNlZ21lbnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlZ21lbnRJbmRleH0scnUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb29yZH0scnUucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnQodGhpcy5jb29yZCksdC5wcmludCgiIHNlZyAjID0gIit0aGlzLnNlZ21lbnRJbmRleCksdC5wcmludGxuKCIgZGlzdCA9ICIrdGhpcy5kaXN0KX0scnUucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLmNvbXBhcmUoZS5zZWdtZW50SW5kZXgsZS5kaXN0KX0scnUucHJvdG90eXBlLmlzRW5kUG9pbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLnNlZ21lbnRJbmRleCYmMD09PXRoaXMuZGlzdHx8dGhpcy5zZWdtZW50SW5kZXg9PT10fSxydS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb29yZCsiIHNlZyAjID0gIit0aGlzLnNlZ21lbnRJbmRleCsiIGRpc3QgPSAiK3RoaXMuZGlzdH0scnUucHJvdG90eXBlLmdldERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzdH0scnUucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zZWdtZW50SW5kZXg8dD8tMTp0aGlzLnNlZ21lbnRJbmRleD50PzE6dGhpcy5kaXN0PGU/LTE6dGhpcy5kaXN0PmU/MTowfSxydS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSxydS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcnV9O3ZhciBpdT1mdW5jdGlvbigpe3RoaXMuX25vZGVNYXA9bmV3IGtvLHRoaXMuZWRnZT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmVkZ2U9dH07aXUucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnRsbigiSW50ZXJzZWN0aW9uczoiKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkucHJpbnQodCl9fSxpdS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpfSxpdS5wcm90b3R5cGUuYWRkU3BsaXRFZGdlcz1mdW5jdGlvbih0KXt0aGlzLmFkZEVuZHBvaW50cygpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCksbj1lLm5leHQoKTtlLmhhc05leHQoKTspe3ZhciByPWUubmV4dCgpLGk9dGhpcy5jcmVhdGVTcGxpdEVkZ2UobixyKTt0LmFkZChpKSxuPXJ9fSxpdS5wcm90b3R5cGUuYWRkRW5kcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lZGdlLnB0cy5sZW5ndGgtMTt0aGlzLmFkZCh0aGlzLmVkZ2UucHRzWzBdLDAsMCksdGhpcy5hZGQodGhpcy5lZGdlLnB0c1t0XSx0LDApfSxpdS5wcm90b3R5cGUuY3JlYXRlU3BsaXRFZGdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5zZWdtZW50SW5kZXgtdC5zZWdtZW50SW5kZXgrMixyPXRoaXMuZWRnZS5wdHNbZS5zZWdtZW50SW5kZXhdLGk9ZS5kaXN0PjB8fCFlLmNvb3JkLmVxdWFsczJEKHIpO2l8fG4tLTt2YXIgbz1uZXcgQXJyYXkobikuZmlsbChudWxsKSxzPTA7b1tzKytdPW5ldyB2aSh0LmNvb3JkKTtmb3IodmFyIGE9dC5zZWdtZW50SW5kZXgrMTthPD1lLnNlZ21lbnRJbmRleDthKyspb1tzKytdPXRoaXMuZWRnZS5wdHNbYV07cmV0dXJuIGkmJihvW3NdPWUuY29vcmQpLG5ldyBjdShvLG5ldyBqcyh0aGlzLmVkZ2UuX2xhYmVsKSl9LGl1LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBydSh0LGUsbiksaT10aGlzLl9ub2RlTWFwLmdldChyKTtyZXR1cm4gbnVsbCE9PWk/aToodGhpcy5fbm9kZU1hcC5wdXQocixyKSxyKX0saXUucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtpZihlLm5leHQoKS5jb29yZC5lcXVhbHModCkpcmV0dXJuITB9cmV0dXJuITF9LGl1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxpdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaXV9O3ZhciBvdT1mdW5jdGlvbigpe307b3UucHJvdG90eXBlLmdldENoYWluU3RhcnRJbmRpY2VzPWZ1bmN0aW9uKHQpe3ZhciBlPTAsbj1uZXcgeG87bi5hZGQobmV3IE5pKGUpKTtkb3t2YXIgcj10aGlzLmZpbmRDaGFpbkVuZCh0LGUpO24uYWRkKG5ldyBOaShyKSksZT1yfXdoaWxlKGU8dC5sZW5ndGgtMSk7cmV0dXJuIG91LnRvSW50QXJyYXkobil9LG91LnByb3RvdHlwZS5maW5kQ2hhaW5FbmQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49V3MucXVhZHJhbnQodFtlXSx0W2UrMV0pLHI9ZSsxO3I8dC5sZW5ndGg7KXtpZihXcy5xdWFkcmFudCh0W3ItMV0sdFtyXSkhPT1uKWJyZWFrO3IrK31yZXR1cm4gci0xfSxvdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sb3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG91fSxvdS50b0ludEFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCksbj0wO248ZS5sZW5ndGg7bisrKWVbbl09dC5nZXQobikuaW50VmFsdWUoKTtyZXR1cm4gZX07dmFyIHN1PWZ1bmN0aW9uKCl7dGhpcy5lPW51bGwsdGhpcy5wdHM9bnVsbCx0aGlzLnN0YXJ0SW5kZXg9bnVsbCx0aGlzLmVudjE9bmV3IGppLHRoaXMuZW52Mj1uZXcgamk7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuZT10LHRoaXMucHRzPXQuZ2V0Q29vcmRpbmF0ZXMoKTt2YXIgZT1uZXcgb3U7dGhpcy5zdGFydEluZGV4PWUuZ2V0Q2hhaW5TdGFydEluZGljZXModGhpcy5wdHMpfTtzdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdHN9LHN1LnByb3RvdHlwZS5nZXRNYXhYPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHRzW3RoaXMuc3RhcnRJbmRleFt0XV0ueCxuPXRoaXMucHRzW3RoaXMuc3RhcnRJbmRleFt0KzFdXS54O3JldHVybiBlPm4/ZTpufSxzdS5wcm90b3R5cGUuZ2V0TWluWD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnB0c1t0aGlzLnN0YXJ0SW5kZXhbdF1dLngsbj10aGlzLnB0c1t0aGlzLnN0YXJ0SW5kZXhbdCsxXV0ueDtyZXR1cm4gZTxuP2U6bn0sc3UucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW49ZnVuY3Rpb24oKXtpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9YXJndW1lbnRzWzNdO3RoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbih0aGlzLnN0YXJ0SW5kZXhbdF0sdGhpcy5zdGFydEluZGV4W3QrMV0sZSxlLnN0YXJ0SW5kZXhbbl0sZS5zdGFydEluZGV4W24rMV0scil9ZWxzZSBpZig2PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdLHU9YXJndW1lbnRzWzRdLGM9YXJndW1lbnRzWzVdLGw9dGhpcy5wdHNbaV0saD10aGlzLnB0c1tvXSxmPXMucHRzW2FdLHA9cy5wdHNbdV07aWYoby1pPT0xJiZ1LWE9PTEpcmV0dXJuIGMuYWRkSW50ZXJzZWN0aW9ucyh0aGlzLmUsaSxzLmUsYSksbnVsbDtpZih0aGlzLmVudjEuaW5pdChsLGgpLHRoaXMuZW52Mi5pbml0KGYscCksIXRoaXMuZW52MS5pbnRlcnNlY3RzKHRoaXMuZW52MikpcmV0dXJuIG51bGw7dmFyIGQ9TWF0aC50cnVuYygoaStvKS8yKSxnPU1hdGgudHJ1bmMoKGErdSkvMik7aTxkJiYoYTxnJiZ0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4oaSxkLHMsYSxnLGMpLGc8dSYmdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKGksZCxzLGcsdSxjKSksZDxvJiYoYTxnJiZ0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4oZCxvLHMsYSxnLGMpLGc8dSYmdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKGQsbyxzLGcsdSxjKSl9fSxzdS5wcm90b3R5cGUuZ2V0U3RhcnRJbmRleGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnRJbmRleH0sc3UucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3RzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0aGlzLnN0YXJ0SW5kZXgubGVuZ3RoLTE7bisrKWZvcih2YXIgcj0wO3I8dC5zdGFydEluZGV4Lmxlbmd0aC0xO3IrKyl0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4obix0LHIsZSl9LHN1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxzdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gc3V9O3ZhciBhdT1mdW5jdGlvbiB0KCl7dGhpcy5fZGVwdGg9QXJyYXkoMikuZmlsbCgpLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkoMyl9KSk7Zm9yKHZhciBlPTA7ZTwyO2UrKylmb3IodmFyIG49MDtuPDM7bisrKXRoaXMuX2RlcHRoW2VdW25dPXQuTlVMTF9WQUxVRX0sdXU9e05VTExfVkFMVUU6e2NvbmZpZ3VyYWJsZTohMH19O2F1LnByb3RvdHlwZS5nZXREZXB0aD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kZXB0aFt0XVtlXX0sYXUucHJvdG90eXBlLnNldERlcHRoPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9kZXB0aFt0XVtlXT1ufSxhdS5wcm90b3R5cGUuaXNOdWxsPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD0wO3Q8Mjt0KyspZm9yKHZhciBlPTA7ZTwzO2UrKylpZih0aGlzLl9kZXB0aFt0XVtlXSE9PWF1Lk5VTExfVkFMVUUpcmV0dXJuITE7cmV0dXJuITB9aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fZGVwdGhbbl1bMV09PT1hdS5OVUxMX1ZBTFVFfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuX2RlcHRoW3JdW2ldPT09YXUuTlVMTF9WQUxVRX19LGF1LnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTA7ZTwyO2UrKylpZighdC5pc051bGwoZSkpe3ZhciBuPXQuX2RlcHRoW2VdWzFdO3QuX2RlcHRoW2VdWzJdPG4mJihuPXQuX2RlcHRoW2VdWzJdKSxuPDAmJihuPTApO2Zvcih2YXIgcj0xO3I8MztyKyspe3ZhciBpPTA7dC5fZGVwdGhbZV1bcl0+biYmKGk9MSksdC5fZGVwdGhbZV1bcl09aX19fSxhdS5wcm90b3R5cGUuZ2V0RGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RlcHRoW3RdW0ZzLlJJR0hUXS10aGlzLl9kZXB0aFt0XVtGcy5MRUZUXX0sYXUucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2RlcHRoW3RdW2VdPD0wP2JpLkVYVEVSSU9SOmJpLklOVEVSSU9SfSxhdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQTogIit0aGlzLl9kZXB0aFswXVsxXSsiLCIrdGhpcy5fZGVwdGhbMF1bMl0rIiBCOiAiK3RoaXMuX2RlcHRoWzFdWzFdKyIsIit0aGlzLl9kZXB0aFsxXVsyXX0sYXUucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPTA7bjwyO24rKylmb3IodmFyIHI9MTtyPDM7cisrKXt2YXIgaT1lLmdldExvY2F0aW9uKG4scik7KGk9PT1iaS5FWFRFUklPUnx8aT09PWJpLklOVEVSSU9SKSYmKHQuaXNOdWxsKG4scik/dC5fZGVwdGhbbl1bcl09YXUuZGVwdGhBdExvY2F0aW9uKGkpOnQuX2RlcHRoW25dW3JdKz1hdS5kZXB0aEF0TG9jYXRpb24oaSkpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXTthcmd1bWVudHNbMl09PT1iaS5JTlRFUklPUiYmdGhpcy5fZGVwdGhbb11bc10rK319LGF1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxhdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYXV9LGF1LmRlcHRoQXRMb2NhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdD09PWJpLkVYVEVSSU9SPzA6dD09PWJpLklOVEVSSU9SPzE6YXUuTlVMTF9WQUxVRX0sdXUuTlVMTF9WQUxVRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYXUsdXUpO3ZhciBjdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7aWYodC5jYWxsKHRoaXMpLHRoaXMucHRzPW51bGwsdGhpcy5fZW52PW51bGwsdGhpcy5laUxpc3Q9bmV3IGl1KHRoaXMpLHRoaXMuX25hbWU9bnVsbCx0aGlzLl9tY2U9bnVsbCx0aGlzLl9pc0lzb2xhdGVkPSEwLHRoaXMuX2RlcHRoPW5ldyBhdSx0aGlzLl9kZXB0aERlbHRhPTAsMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXTtlLmNhbGwodGhpcyxuLG51bGwpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTt0aGlzLnB0cz1yLHRoaXMuX2xhYmVsPWl9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXREZXB0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXB0aH0sZS5wcm90b3R5cGUuZ2V0Q29sbGFwc2VkRWRnZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSgyKS5maWxsKG51bGwpO3JldHVybiB0WzBdPXRoaXMucHRzWzBdLHRbMV09dGhpcy5wdHNbMV0sbmV3IGUodCxqcy50b0xpbmVMYWJlbCh0aGlzLl9sYWJlbCkpfSxlLnByb3RvdHlwZS5pc0lzb2xhdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSXNvbGF0ZWR9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzfSxlLnByb3RvdHlwZS5zZXRJc29sYXRlZD1mdW5jdGlvbih0KXt0aGlzLl9pc0lzb2xhdGVkPXR9LGUucHJvdG90eXBlLnNldE5hbWU9ZnVuY3Rpb24odCl7dGhpcy5fbmFtZT10fSxlLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2YgZSkpcmV0dXJuITE7dmFyIG49dDtpZih0aGlzLnB0cy5sZW5ndGghPT1uLnB0cy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciByPSEwLGk9ITAsbz10aGlzLnB0cy5sZW5ndGgscz0wO3M8dGhpcy5wdHMubGVuZ3RoO3MrKylpZih0aGlzLnB0c1tzXS5lcXVhbHMyRChuLnB0c1tzXSl8fChyPSExKSx0aGlzLnB0c1tzXS5lcXVhbHMyRChuLnB0c1stLW9dKXx8KGk9ITEpLCFyJiYhaSlyZXR1cm4hMTtyZXR1cm4hMH0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLnB0cy5sZW5ndGg+MD90aGlzLnB0c1swXTpudWxsO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMucHRzW3RdfX0sZS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludCgiZWRnZSAiK3RoaXMuX25hbWUrIjogIiksdC5wcmludCgiTElORVNUUklORyAoIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnB0cy5sZW5ndGg7ZSsrKWU+MCYmdC5wcmludCgiLCIpLHQucHJpbnQodGhpcy5wdHNbZV0ueCsiICIrdGhpcy5wdHNbZV0ueSk7dC5wcmludCgiKSAgIit0aGlzLl9sYWJlbCsiICIrdGhpcy5fZGVwdGhEZWx0YSl9LGUucHJvdG90eXBlLmNvbXB1dGVJTT1mdW5jdGlvbih0KXtlLnVwZGF0ZUlNKHRoaXMuX2xhYmVsLHQpfSxlLnByb3RvdHlwZS5pc0NvbGxhcHNlZD1mdW5jdGlvbigpe3JldHVybiEoIXRoaXMuX2xhYmVsLmlzQXJlYSgpfHwzIT09dGhpcy5wdHMubGVuZ3RoKSYmISF0aGlzLnB0c1swXS5lcXVhbHModGhpcy5wdHNbMl0pfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0c1swXS5lcXVhbHModGhpcy5wdHNbdGhpcy5wdHMubGVuZ3RoLTFdKX0sZS5wcm90b3R5cGUuZ2V0TWF4aW11bVNlZ21lbnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0cy5sZW5ndGgtMX0sZS5wcm90b3R5cGUuZ2V0RGVwdGhEZWx0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXB0aERlbHRhfSxlLnByb3RvdHlwZS5nZXROdW1Qb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdHMubGVuZ3RofSxlLnByb3RvdHlwZS5wcmludFJldmVyc2U9ZnVuY3Rpb24odCl7dC5wcmludCgiZWRnZSAiK3RoaXMuX25hbWUrIjogIik7Zm9yKHZhciBlPXRoaXMucHRzLmxlbmd0aC0xO2U+PTA7ZS0tKXQucHJpbnQodGhpcy5wdHNbZV0rIiAiKTt0LnByaW50bG4oIiIpfSxlLnByb3RvdHlwZS5nZXRNb25vdG9uZUNoYWluRWRnZT1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fbWNlJiYodGhpcy5fbWNlPW5ldyBzdSh0aGlzKSksdGhpcy5fbWNlfSxlLnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9lbnYpe3RoaXMuX2Vudj1uZXcgamk7Zm9yKHZhciB0PTA7dDx0aGlzLnB0cy5sZW5ndGg7dCsrKXRoaXMuX2Vudi5leHBhbmRUb0luY2x1ZGUodGhpcy5wdHNbdF0pfXJldHVybiB0aGlzLl9lbnZ9LGUucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uZXcgdmkodC5nZXRJbnRlcnNlY3Rpb24ocikpLG89ZSxzPXQuZ2V0RWRnZURpc3RhbmNlKG4sciksYT1vKzE7aWYoYTx0aGlzLnB0cy5sZW5ndGgpe3ZhciB1PXRoaXMucHRzW2FdO2kuZXF1YWxzMkQodSkmJihvPWEscz0wKX10aGlzLmVpTGlzdC5hZGQoaSxvLHMpfSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PW5ldyBBaTt0LmFwcGVuZCgiZWRnZSAiK3RoaXMuX25hbWUrIjogIiksdC5hcHBlbmQoIkxJTkVTVFJJTkcgKCIpO2Zvcih2YXIgZT0wO2U8dGhpcy5wdHMubGVuZ3RoO2UrKyllPjAmJnQuYXBwZW5kKCIsIiksdC5hcHBlbmQodGhpcy5wdHNbZV0ueCsiICIrdGhpcy5wdHNbZV0ueSk7cmV0dXJuIHQuYXBwZW5kKCIpICAiK3RoaXMuX2xhYmVsKyIgIit0aGlzLl9kZXB0aERlbHRhKSx0LnRvU3RyaW5nKCl9LGUucHJvdG90eXBlLmlzUG9pbnR3aXNlRXF1YWw9ZnVuY3Rpb24odCl7aWYodGhpcy5wdHMubGVuZ3RoIT09dC5wdHMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZT0wO2U8dGhpcy5wdHMubGVuZ3RoO2UrKylpZighdGhpcy5wdHNbZV0uZXF1YWxzMkQodC5wdHNbZV0pKXJldHVybiExO3JldHVybiEwfSxlLnByb3RvdHlwZS5zZXREZXB0aERlbHRhPWZ1bmN0aW9uKHQpe3RoaXMuX2RlcHRoRGVsdGE9dH0sZS5wcm90b3R5cGUuZ2V0RWRnZUludGVyc2VjdGlvbkxpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5laUxpc3R9LGUucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wO3I8dC5nZXRJbnRlcnNlY3Rpb25OdW0oKTtyKyspdGhpcy5hZGRJbnRlcnNlY3Rpb24odCxlLG4scil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGUudXBkYXRlSU09ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUudXBkYXRlSU0uYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtuLnNldEF0TGVhc3RJZlZhbGlkKGUuZ2V0TG9jYXRpb24oMCxGcy5PTiksZS5nZXRMb2NhdGlvbigxLEZzLk9OKSwxKSxlLmlzQXJlYSgpJiYobi5zZXRBdExlYXN0SWZWYWxpZChlLmdldExvY2F0aW9uKDAsRnMuTEVGVCksZS5nZXRMb2NhdGlvbigxLEZzLkxFRlQpLDIpLG4uc2V0QXRMZWFzdElmVmFsaWQoZS5nZXRMb2NhdGlvbigwLEZzLlJJR0hUKSxlLmdldExvY2F0aW9uKDEsRnMuUklHSFQpLDIpKX0sZX0oR3MpLGx1PWZ1bmN0aW9uKHQpe3RoaXMuX3dvcmtpbmdQcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX3dvcmtpbmdOb2Rlcj1udWxsLHRoaXMuX2dlb21GYWN0PW51bGwsdGhpcy5fZ3JhcGg9bnVsbCx0aGlzLl9lZGdlTGlzdD1uZXcgdHUsdGhpcy5fYnVmUGFyYW1zPXR8fG51bGx9O2x1LnByb3RvdHlwZS5zZXRXb3JraW5nUHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24odCl7dGhpcy5fd29ya2luZ1ByZWNpc2lvbk1vZGVsPXR9LGx1LnByb3RvdHlwZS5pbnNlcnRVbmlxdWVFZGdlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2VkZ2VMaXN0LmZpbmRFcXVhbEVkZ2UodCk7aWYobnVsbCE9PWUpe3ZhciBuPWUuZ2V0TGFiZWwoKSxyPXQuZ2V0TGFiZWwoKTtlLmlzUG9pbnR3aXNlRXF1YWwodCl8fChyPW5ldyBqcyh0LmdldExhYmVsKCkpKS5mbGlwKCksbi5tZXJnZShyKTt2YXIgaT1sdS5kZXB0aERlbHRhKHIpLG89ZS5nZXREZXB0aERlbHRhKCkraTtlLnNldERlcHRoRGVsdGEobyl9ZWxzZSB0aGlzLl9lZGdlTGlzdC5hZGQodCksdC5zZXREZXB0aERlbHRhKGx1LmRlcHRoRGVsdGEodC5nZXRMYWJlbCgpKSl9LGx1LnByb3RvdHlwZS5idWlsZFN1YmdyYXBocz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgeG8scj10Lml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKSxvPWkuZ2V0UmlnaHRtb3N0Q29vcmRpbmF0ZSgpLHM9bmV3IHFhKG4pLmdldERlcHRoKG8pO2kuY29tcHV0ZURlcHRoKHMpLGkuZmluZFJlc3VsdEVkZ2VzKCksbi5hZGQoaSksZS5hZGQoaS5nZXREaXJlY3RlZEVkZ2VzKCksaS5nZXROb2RlcygpKX19LGx1LnByb3RvdHlwZS5jcmVhdGVTdWJncmFwaHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPXQuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYoIXIuaXNWaXNpdGVkKCkpe3ZhciBpPW5ldyBrcztpLmNyZWF0ZShyKSxlLmFkZChpKX19cmV0dXJuIGFhLnNvcnQoZSxhYS5yZXZlcnNlT3JkZXIoKSksZX0sbHUucHJvdG90eXBlLmNyZWF0ZUVtcHR5UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2VvbUZhY3QuY3JlYXRlUG9seWdvbigpfSxsdS5wcm90b3R5cGUuZ2V0Tm9kZXI9ZnVuY3Rpb24odCl7aWYobnVsbCE9PXRoaXMuX3dvcmtpbmdOb2RlcilyZXR1cm4gdGhpcy5fd29ya2luZ05vZGVyO3ZhciBlPW5ldyBJYSxuPW5ldyBRaTtyZXR1cm4gbi5zZXRQcmVjaXNpb25Nb2RlbCh0KSxlLnNldFNlZ21lbnRJbnRlcnNlY3RvcihuZXcgbnUobikpLGV9LGx1LnByb3RvdHlwZS5idWZmZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl93b3JraW5nUHJlY2lzaW9uTW9kZWw7bnVsbD09PW4mJihuPXQuZ2V0UHJlY2lzaW9uTW9kZWwoKSksdGhpcy5fZ2VvbUZhY3Q9dC5nZXRGYWN0b3J5KCk7dmFyIHI9bmV3IFVhKG4sdGhpcy5fYnVmUGFyYW1zKSxpPW5ldyBYYSh0LGUscikuZ2V0Q3VydmVzKCk7aWYoaS5zaXplKCk8PTApcmV0dXJuIHRoaXMuY3JlYXRlRW1wdHlSZXN1bHRHZW9tZXRyeSgpO3RoaXMuY29tcHV0ZU5vZGVkRWRnZXMoaSxuKSx0aGlzLl9ncmFwaD1uZXcgUXMobmV3IFFhKSx0aGlzLl9ncmFwaC5hZGRFZGdlcyh0aGlzLl9lZGdlTGlzdC5nZXRFZGdlcygpKTt2YXIgbz10aGlzLmNyZWF0ZVN1YmdyYXBocyh0aGlzLl9ncmFwaCkscz1uZXcgJHModGhpcy5fZ2VvbUZhY3QpO3RoaXMuYnVpbGRTdWJncmFwaHMobyxzKTt2YXIgYT1zLmdldFBvbHlnb25zKCk7cmV0dXJuIGEuc2l6ZSgpPD0wP3RoaXMuY3JlYXRlRW1wdHlSZXN1bHRHZW9tZXRyeSgpOnRoaXMuX2dlb21GYWN0LmJ1aWxkR2VvbWV0cnkoYSl9LGx1LnByb3RvdHlwZS5jb21wdXRlTm9kZWRFZGdlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0Tm9kZXIoZSk7bi5jb21wdXRlTm9kZXModCk7Zm9yKHZhciByPW4uZ2V0Tm9kZWRTdWJzdHJpbmdzKCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpLG89aS5nZXRDb29yZGluYXRlcygpO2lmKDIhPT1vLmxlbmd0aHx8IW9bMF0uZXF1YWxzMkQob1sxXSkpe3ZhciBzPWkuZ2V0RGF0YSgpLGE9bmV3IGN1KGkuZ2V0Q29vcmRpbmF0ZXMoKSxuZXcganMocykpO3RoaXMuaW5zZXJ0VW5pcXVlRWRnZShhKX19fSxsdS5wcm90b3R5cGUuc2V0Tm9kZXI9ZnVuY3Rpb24odCl7dGhpcy5fd29ya2luZ05vZGVyPXR9LGx1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxsdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbHV9LGx1LmRlcHRoRGVsdGE9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRMb2NhdGlvbigwLEZzLkxFRlQpLG49dC5nZXRMb2NhdGlvbigwLEZzLlJJR0hUKTtyZXR1cm4gZT09PWJpLklOVEVSSU9SJiZuPT09YmkuRVhURVJJT1I/MTplPT09YmkuRVhURVJJT1ImJm49PT1iaS5JTlRFUklPUj8tMTowfSxsdS5jb252ZXJ0U2VnU3RyaW5ncz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IElzLG49bmV3IHhvO3QuaGFzTmV4dCgpOyl7dmFyIHI9dC5uZXh0KCksaT1lLmNyZWF0ZUxpbmVTdHJpbmcoci5nZXRDb29yZGluYXRlcygpKTtuLmFkZChpKX1yZXR1cm4gZS5idWlsZEdlb21ldHJ5KG4pfTt2YXIgaHU9ZnVuY3Rpb24oKXtpZih0aGlzLl9ub2Rlcj1udWxsLHRoaXMuX3NjYWxlRmFjdG9yPW51bGwsdGhpcy5fb2Zmc2V0WD1udWxsLHRoaXMuX29mZnNldFk9bnVsbCx0aGlzLl9pc1NjYWxlZD0hMSwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX25vZGVyPXQsdGhpcy5fc2NhbGVGYWN0b3I9ZSx0aGlzLl9vZmZzZXRYPTAsdGhpcy5fb2Zmc2V0WT0wLHRoaXMuX2lzU2NhbGVkPSF0aGlzLmlzSW50ZWdlclByZWNpc2lvbigpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXSxvPWFyZ3VtZW50c1szXTt0aGlzLl9ub2Rlcj1uLHRoaXMuX3NjYWxlRmFjdG9yPXIsdGhpcy5fb2Zmc2V0WD1pLHRoaXMuX29mZnNldFk9byx0aGlzLl9pc1NjYWxlZD0hdGhpcy5pc0ludGVnZXJQcmVjaXNpb24oKX19O2h1LnByb3RvdHlwZS5yZXNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihFaShhcmd1bWVudHNbMF0sZ28pKWZvcih2YXIgZT1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3QucmVzY2FsZShuLmdldENvb3JkaW5hdGVzKCkpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciByPWFyZ3VtZW50c1swXSxpPTA7aTxyLmxlbmd0aDtpKyspcltpXS54PXJbaV0ueC90Ll9zY2FsZUZhY3Rvcit0Ll9vZmZzZXRYLHJbaV0ueT1yW2ldLnkvdC5fc2NhbGVGYWN0b3IrdC5fb2Zmc2V0WTsyPT09ci5sZW5ndGgmJnJbMF0uZXF1YWxzMkQoclsxXSkmJmtpLm91dC5wcmludGxuKHIpfX0saHUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihFaShhcmd1bWVudHNbMF0sZ28pKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49bmV3IHhvLHI9ZS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7bi5hZGQobmV3IHdhKHQuc2NhbGUoaS5nZXRDb29yZGluYXRlcygpKSxpLmdldERhdGEoKSkpfXJldHVybiBufWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgbz1hcmd1bWVudHNbMF0scz1uZXcgQXJyYXkoby5sZW5ndGgpLmZpbGwobnVsbCksYT0wO2E8by5sZW5ndGg7YSsrKXNbYV09bmV3IHZpKE1hdGgucm91bmQoKG9bYV0ueC10Ll9vZmZzZXRYKSp0Ll9zY2FsZUZhY3RvciksTWF0aC5yb3VuZCgob1thXS55LXQuX29mZnNldFkpKnQuX3NjYWxlRmFjdG9yKSxvW2FdLnopO3JldHVybiBEby5yZW1vdmVSZXBlYXRlZFBvaW50cyhzKX19LGh1LnByb3RvdHlwZS5pc0ludGVnZXJQcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMuX3NjYWxlRmFjdG9yfSxodS5wcm90b3R5cGUuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbm9kZXIuZ2V0Tm9kZWRTdWJzdHJpbmdzKCk7cmV0dXJuIHRoaXMuX2lzU2NhbGVkJiZ0aGlzLnJlc2NhbGUodCksdH0saHUucHJvdG90eXBlLmNvbXB1dGVOb2Rlcz1mdW5jdGlvbih0KXt2YXIgZT10O3RoaXMuX2lzU2NhbGVkJiYoZT10aGlzLnNjYWxlKHQpKSx0aGlzLl9ub2Rlci5jb21wdXRlTm9kZXMoZSl9LGh1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltBYV19LGh1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBodX07dmFyIGZ1PWZ1bmN0aW9uKCl7dGhpcy5fbGk9bmV3IFFpLHRoaXMuX3NlZ1N0cmluZ3M9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fc2VnU3RyaW5ncz10fSxwdT17ZmFjdDp7Y29uZmlndXJhYmxlOiEwfX07ZnUucHJvdG90eXBlLmNoZWNrRW5kUHRWZXJ0ZXhJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGU9dGhpcy5fc2VnU3RyaW5ncy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkuZ2V0Q29vcmRpbmF0ZXMoKTt0LmNoZWNrRW5kUHRWZXJ0ZXhJbnRlcnNlY3Rpb25zKG5bMF0sdC5fc2VnU3RyaW5ncyksdC5jaGVja0VuZFB0VmVydGV4SW50ZXJzZWN0aW9ucyhuW24ubGVuZ3RoLTFdLHQuX3NlZ1N0cmluZ3MpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOylmb3IodmFyIG89aS5uZXh0KCkuZ2V0Q29vcmRpbmF0ZXMoKSxzPTE7czxvLmxlbmd0aC0xO3MrKylpZihvW3NdLmVxdWFscyhyKSl0aHJvdyBuZXcgV2koImZvdW5kIGVuZHB0L2ludGVyaW9yIHB0IGludGVyc2VjdGlvbiBhdCBpbmRleCAiK3MrIiA6cHQgIityKX0sZnUucHJvdG90eXBlLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciB0PXRoaXMuX3NlZ1N0cmluZ3MuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspZm9yKHZhciBlPXQubmV4dCgpLG49dGhpcy5fc2VnU3RyaW5ncy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7dGhpcy5jaGVja0ludGVyaW9ySW50ZXJzZWN0aW9ucyhlLHIpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWkuZ2V0Q29vcmRpbmF0ZXMoKSxhPW8uZ2V0Q29vcmRpbmF0ZXMoKSx1PTA7dTxzLmxlbmd0aC0xO3UrKylmb3IodmFyIGM9MDtjPGEubGVuZ3RoLTE7YysrKXRoaXMuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnMoaSx1LG8sYyk7ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGw9YXJndW1lbnRzWzBdLGg9YXJndW1lbnRzWzFdLGY9YXJndW1lbnRzWzJdLHA9YXJndW1lbnRzWzNdO2lmKGw9PT1mJiZoPT09cClyZXR1cm4gbnVsbDt2YXIgZD1sLmdldENvb3JkaW5hdGVzKClbaF0sZz1sLmdldENvb3JkaW5hdGVzKClbaCsxXSx5PWYuZ2V0Q29vcmRpbmF0ZXMoKVtwXSxtPWYuZ2V0Q29vcmRpbmF0ZXMoKVtwKzFdO2lmKHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oZCxnLHksbSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJih0aGlzLl9saS5pc1Byb3BlcigpfHx0aGlzLmhhc0ludGVyaW9ySW50ZXJzZWN0aW9uKHRoaXMuX2xpLGQsZyl8fHRoaXMuaGFzSW50ZXJpb3JJbnRlcnNlY3Rpb24odGhpcy5fbGkseSxtKSkpdGhyb3cgbmV3IFdpKCJmb3VuZCBub24tbm9kZWQgaW50ZXJzZWN0aW9uIGF0ICIrZCsiLSIrZysiIGFuZCAiK3krIi0iK20pfX0sZnUucHJvdG90eXBlLmNoZWNrVmFsaWQ9ZnVuY3Rpb24oKXt0aGlzLmNoZWNrRW5kUHRWZXJ0ZXhJbnRlcnNlY3Rpb25zKCksdGhpcy5jaGVja0ludGVyaW9ySW50ZXJzZWN0aW9ucygpLHRoaXMuY2hlY2tDb2xsYXBzZXMoKX0sZnUucHJvdG90eXBlLmNoZWNrQ29sbGFwc2VzPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciB0PXRoaXMuX3NlZ1N0cmluZ3MuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpO3RoaXMuY2hlY2tDb2xsYXBzZXMoZSl9ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIG49YXJndW1lbnRzWzBdLmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGgtMjtyKyspdGhpcy5jaGVja0NvbGxhcHNlKG5bcl0sbltyKzFdLG5bcisyXSl9LGZ1LnByb3RvdHlwZS5oYXNJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTA7cjx0LmdldEludGVyc2VjdGlvbk51bSgpO3IrKyl7dmFyIGk9dC5nZXRJbnRlcnNlY3Rpb24ocik7aWYoIWkuZXF1YWxzKGUpJiYhaS5lcXVhbHMobikpcmV0dXJuITB9cmV0dXJuITF9LGZ1LnByb3RvdHlwZS5jaGVja0NvbGxhcHNlPWZ1bmN0aW9uKHQsZSxuKXtpZih0LmVxdWFscyhuKSl0aHJvdyBuZXcgV2koImZvdW5kIG5vbi1ub2RlZCBjb2xsYXBzZSBhdCAiK2Z1LmZhY3QuY3JlYXRlTGluZVN0cmluZyhbdCxlLG5dKSl9LGZ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxmdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZnV9LHB1LmZhY3QuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBJc30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZnUscHUpO3ZhciBkdT1mdW5jdGlvbigpe3RoaXMuX2xpPW51bGwsdGhpcy5fcHQ9bnVsbCx0aGlzLl9vcmlnaW5hbFB0PW51bGwsdGhpcy5fcHRTY2FsZWQ9bnVsbCx0aGlzLl9wMFNjYWxlZD1udWxsLHRoaXMuX3AxU2NhbGVkPW51bGwsdGhpcy5fc2NhbGVGYWN0b3I9bnVsbCx0aGlzLl9taW54PW51bGwsdGhpcy5fbWF4eD1udWxsLHRoaXMuX21pbnk9bnVsbCx0aGlzLl9tYXh5PW51bGwsdGhpcy5fY29ybmVyPW5ldyBBcnJheSg0KS5maWxsKG51bGwpLHRoaXMuX3NhZmVFbnY9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07aWYodGhpcy5fb3JpZ2luYWxQdD10LHRoaXMuX3B0PXQsdGhpcy5fc2NhbGVGYWN0b3I9ZSx0aGlzLl9saT1uLGU8PTApdGhyb3cgbmV3IGhpOzEhPT1lJiYodGhpcy5fcHQ9bmV3IHZpKHRoaXMuc2NhbGUodC54KSx0aGlzLnNjYWxlKHQueSkpLHRoaXMuX3AwU2NhbGVkPW5ldyB2aSx0aGlzLl9wMVNjYWxlZD1uZXcgdmkpLHRoaXMuaW5pdENvcm5lcnModGhpcy5fcHQpfSxndT17U0FGRV9FTlZfRVhQQU5TSU9OX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfX07ZHUucHJvdG90eXBlLmludGVyc2VjdHNTY2FsZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLm1pbih0LngsZS54KSxyPU1hdGgubWF4KHQueCxlLngpLGk9TWF0aC5taW4odC55LGUueSksbz1NYXRoLm1heCh0LnksZS55KSxzPXRoaXMuX21heHg8bnx8dGhpcy5fbWlueD5yfHx0aGlzLl9tYXh5PGl8fHRoaXMuX21pbnk+bztpZihzKXJldHVybiExO3ZhciBhPXRoaXMuaW50ZXJzZWN0c1RvbGVyYW5jZVNxdWFyZSh0LGUpO3JldHVybiBaaS5pc1RydWUoIShzJiZhKSwiRm91bmQgYmFkIGVudmVsb3BlIHRlc3QiKSxhfSxkdS5wcm90b3R5cGUuaW5pdENvcm5lcnM9ZnVuY3Rpb24odCl7dmFyIGU9LjU7dGhpcy5fbWlueD10LngtZSx0aGlzLl9tYXh4PXQueCtlLHRoaXMuX21pbnk9dC55LWUsdGhpcy5fbWF4eT10LnkrZSx0aGlzLl9jb3JuZXJbMF09bmV3IHZpKHRoaXMuX21heHgsdGhpcy5fbWF4eSksdGhpcy5fY29ybmVyWzFdPW5ldyB2aSh0aGlzLl9taW54LHRoaXMuX21heHkpLHRoaXMuX2Nvcm5lclsyXT1uZXcgdmkodGhpcy5fbWlueCx0aGlzLl9taW55KSx0aGlzLl9jb3JuZXJbM109bmV3IHZpKHRoaXMuX21heHgsdGhpcy5fbWlueSl9LGR1LnByb3RvdHlwZS5pbnRlcnNlY3RzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDE9PT10aGlzLl9zY2FsZUZhY3Rvcj90aGlzLmludGVyc2VjdHNTY2FsZWQodCxlKToodGhpcy5jb3B5U2NhbGVkKHQsdGhpcy5fcDBTY2FsZWQpLHRoaXMuY29weVNjYWxlZChlLHRoaXMuX3AxU2NhbGVkKSx0aGlzLmludGVyc2VjdHNTY2FsZWQodGhpcy5fcDBTY2FsZWQsdGhpcy5fcDFTY2FsZWQpKX0sZHUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQqdGhpcy5fc2NhbGVGYWN0b3IpfSxkdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmlnaW5hbFB0fSxkdS5wcm90b3R5cGUuY29weVNjYWxlZD1mdW5jdGlvbih0LGUpe2UueD10aGlzLnNjYWxlKHQueCksZS55PXRoaXMuc2NhbGUodC55KX0sZHUucHJvdG90eXBlLmdldFNhZmVFbnZlbG9wZT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9zYWZlRW52KXt2YXIgdD1kdS5TQUZFX0VOVl9FWFBBTlNJT05fRkFDVE9SL3RoaXMuX3NjYWxlRmFjdG9yO3RoaXMuX3NhZmVFbnY9bmV3IGppKHRoaXMuX29yaWdpbmFsUHQueC10LHRoaXMuX29yaWdpbmFsUHQueCt0LHRoaXMuX29yaWdpbmFsUHQueS10LHRoaXMuX29yaWdpbmFsUHQueSt0KX1yZXR1cm4gdGhpcy5fc2FmZUVudn0sZHUucHJvdG90eXBlLmludGVyc2VjdHNQaXhlbENsb3N1cmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzBdLHRoaXMuX2Nvcm5lclsxXSksISEodGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCl8fCh0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMV0sdGhpcy5fY29ybmVyWzJdKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSl8fCh0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMl0sdGhpcy5fY29ybmVyWzNdKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSl8fCh0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbM10sdGhpcy5fY29ybmVyWzBdKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSkpfSxkdS5wcm90b3R5cGUuaW50ZXJzZWN0c1RvbGVyYW5jZVNxdWFyZT1mdW5jdGlvbih0LGUpe3ZhciBuPSExLHI9ITE7cmV0dXJuIHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclswXSx0aGlzLl9jb3JuZXJbMV0pLCEhKHRoaXMuX2xpLmlzUHJvcGVyKCl8fCh0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMV0sdGhpcy5fY29ybmVyWzJdKSx0aGlzLl9saS5pc1Byb3BlcigpKXx8KHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYobj0hMCksdGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzJdLHRoaXMuX2Nvcm5lclszXSksdGhpcy5fbGkuaXNQcm9wZXIoKSl8fCh0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmKHI9ITApLHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclszXSx0aGlzLl9jb3JuZXJbMF0pLHRoaXMuX2xpLmlzUHJvcGVyKCkpfHxuJiZyfHx0LmVxdWFscyh0aGlzLl9wdCl8fGUuZXF1YWxzKHRoaXMuX3B0KSl9LGR1LnByb3RvdHlwZS5hZGRTbmFwcGVkTm9kZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0Q29vcmRpbmF0ZShlKSxyPXQuZ2V0Q29vcmRpbmF0ZShlKzEpO3JldHVybiEhdGhpcy5pbnRlcnNlY3RzKG4scikmJih0LmFkZEludGVyc2VjdGlvbih0aGlzLmdldENvb3JkaW5hdGUoKSxlKSwhMCl9LGR1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxkdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZHV9LGd1LlNBRkVfRU5WX0VYUEFOU0lPTl9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLjc1fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkdSxndSk7dmFyIHl1PWZ1bmN0aW9uKCl7dGhpcy50ZW1wRW52MT1uZXcgamksdGhpcy5zZWxlY3RlZFNlZ21lbnQ9bmV3IGJhfTt5dS5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKCl7aWYoMSE9PWFyZ3VtZW50cy5sZW5ndGgmJjI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMV07YXJndW1lbnRzWzBdLmdldExpbmVTZWdtZW50KHQsdGhpcy5zZWxlY3RlZFNlZ21lbnQpLHRoaXMuc2VsZWN0KHRoaXMuc2VsZWN0ZWRTZWdtZW50KX19LHl1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx5dS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geXV9O3ZhciBtdT1mdW5jdGlvbigpe3RoaXMuX2luZGV4PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2luZGV4PXR9LHZ1PXtIb3RQaXhlbFNuYXBBY3Rpb246e2NvbmZpZ3VyYWJsZTohMH19O211LnByb3RvdHlwZS5zbmFwPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zbmFwKHQsbnVsbCwtMSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXSxpPWUuZ2V0U2FmZUVudmVsb3BlKCksbz1uZXcgX3UoZSxuLHIpO3JldHVybiB0aGlzLl9pbmRleC5xdWVyeShpLHtpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVybltyYV19LHZpc2l0SXRlbTpmdW5jdGlvbih0KXt0LnNlbGVjdChpLG8pfX0pLG8uaXNOb2RlQWRkZWQoKX19LG11LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxtdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbXV9LHZ1LkhvdFBpeGVsU25hcEFjdGlvbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gX3V9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG11LHZ1KTt2YXIgX3U9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9ob3RQaXhlbD1udWxsLHRoaXMuX3BhcmVudEVkZ2U9bnVsbCx0aGlzLl9ob3RQaXhlbFZlcnRleEluZGV4PW51bGwsdGhpcy5faXNOb2RlQWRkZWQ9ITE7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO3RoaXMuX2hvdFBpeGVsPWUsdGhpcy5fcGFyZW50RWRnZT1uLHRoaXMuX2hvdFBpeGVsVmVydGV4SW5kZXg9cn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaXNOb2RlQWRkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNOb2RlQWRkZWR9LGUucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1swXS5nZXRDb250ZXh0KCk7aWYobnVsbCE9PXRoaXMuX3BhcmVudEVkZ2UmJm49PT10aGlzLl9wYXJlbnRFZGdlJiZlPT09dGhpcy5faG90UGl4ZWxWZXJ0ZXhJbmRleClyZXR1cm4gbnVsbDt0aGlzLl9pc05vZGVBZGRlZD10aGlzLl9ob3RQaXhlbC5hZGRTbmFwcGVkTm9kZShuLGUpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfSh5dSkseHU9ZnVuY3Rpb24oKXt0aGlzLl9saT1udWxsLHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ucz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9saT10LHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ucz1uZXcgeG99O3h1LnByb3RvdHlwZS5wcm9jZXNzSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbixyKXtpZih0PT09biYmZT09PXIpcmV0dXJuIG51bGw7dmFyIGk9dC5nZXRDb29yZGluYXRlcygpW2VdLG89dC5nZXRDb29yZGluYXRlcygpW2UrMV0scz1uLmdldENvb3JkaW5hdGVzKClbcl0sYT1uLmdldENvb3JkaW5hdGVzKClbcisxXTtpZih0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiZ0aGlzLl9saS5pc0ludGVyaW9ySW50ZXJzZWN0aW9uKCkpe2Zvcih2YXIgdT0wO3U8dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uTnVtKCk7dSsrKXRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ucy5hZGQodGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uKHUpKTt0LmFkZEludGVyc2VjdGlvbnModGhpcy5fbGksZSwwKSxuLmFkZEludGVyc2VjdGlvbnModGhpcy5fbGksciwxKX19LHh1LnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0seHUucHJvdG90eXBlLmdldEludGVyaW9ySW50ZXJzZWN0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbnN9LHh1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltldV19LHh1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB4dX07dmFyIHd1PWZ1bmN0aW9uKCl7dGhpcy5fcG09bnVsbCx0aGlzLl9saT1udWxsLHRoaXMuX3NjYWxlRmFjdG9yPW51bGwsdGhpcy5fbm9kZXI9bnVsbCx0aGlzLl9wb2ludFNuYXBwZXI9bnVsbCx0aGlzLl9ub2RlZFNlZ1N0cmluZ3M9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fcG09dCx0aGlzLl9saT1uZXcgUWksdGhpcy5fbGkuc2V0UHJlY2lzaW9uTW9kZWwodCksdGhpcy5fc2NhbGVGYWN0b3I9dC5nZXRTY2FsZSgpfTt3dS5wcm90b3R5cGUuY2hlY2tDb3JyZWN0bmVzcz1mdW5jdGlvbih0KXt2YXIgZT13YS5nZXROb2RlZFN1YnN0cmluZ3ModCksbj1uZXcgZnUoZSk7dHJ5e24uY2hlY2tWYWxpZCgpfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIFJpKSl0aHJvdyB0O3QucHJpbnRTdGFja1RyYWNlKCl9fSx3dS5wcm90b3R5cGUuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7cmV0dXJuIHdhLmdldE5vZGVkU3Vic3RyaW5ncyh0aGlzLl9ub2RlZFNlZ1N0cmluZ3MpfSx3dS5wcm90b3R5cGUuc25hcFJvdW5kPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5maW5kSW50ZXJpb3JJbnRlcnNlY3Rpb25zKHQsZSk7dGhpcy5jb21wdXRlSW50ZXJzZWN0aW9uU25hcHMobiksdGhpcy5jb21wdXRlVmVydGV4U25hcHModCl9LHd1LnByb3RvdHlwZS5maW5kSW50ZXJpb3JJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IHh1KGUpO3JldHVybiB0aGlzLl9ub2Rlci5zZXRTZWdtZW50SW50ZXJzZWN0b3IobiksdGhpcy5fbm9kZXIuY29tcHV0ZU5vZGVzKHQpLG4uZ2V0SW50ZXJpb3JJbnRlcnNlY3Rpb25zKCl9LHd1LnByb3RvdHlwZS5jb21wdXRlVmVydGV4U25hcHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKEVpKGFyZ3VtZW50c1swXSxnbykpZm9yKHZhciBlPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dC5jb21wdXRlVmVydGV4U25hcHMobil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHdhKWZvcih2YXIgcj1hcmd1bWVudHNbMF0saT1yLmdldENvb3JkaW5hdGVzKCksbz0wO288aS5sZW5ndGg7bysrKXt2YXIgcz1uZXcgZHUoaVtvXSx0Ll9zY2FsZUZhY3Rvcix0Ll9saSk7dC5fcG9pbnRTbmFwcGVyLnNuYXAocyxyLG8pJiZyLmFkZEludGVyc2VjdGlvbihpW29dLG8pfX0sd3UucHJvdG90eXBlLmNvbXB1dGVOb2Rlcz1mdW5jdGlvbih0KXt0aGlzLl9ub2RlZFNlZ1N0cmluZ3M9dCx0aGlzLl9ub2Rlcj1uZXcgSWEsdGhpcy5fcG9pbnRTbmFwcGVyPW5ldyBtdSh0aGlzLl9ub2Rlci5nZXRJbmRleCgpKSx0aGlzLnNuYXBSb3VuZCh0LHRoaXMuX2xpKX0sd3UucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb25TbmFwcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPXQuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLGk9bmV3IGR1KHIsZS5fc2NhbGVGYWN0b3IsZS5fbGkpO2UuX3BvaW50U25hcHBlci5zbmFwKGkpfX0sd3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0FhXX0sd3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHd1fTt2YXIgYnU9ZnVuY3Rpb24oKXtpZih0aGlzLl9hcmdHZW9tPW51bGwsdGhpcy5fZGlzdGFuY2U9bnVsbCx0aGlzLl9idWZQYXJhbXM9bmV3IEZhLHRoaXMuX3Jlc3VsdEdlb21ldHJ5PW51bGwsdGhpcy5fc2F2ZUV4Y2VwdGlvbj1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fYXJnR2VvbT10fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9hcmdHZW9tPWUsdGhpcy5fYnVmUGFyYW1zPW59fSxEdT17Q0FQX1JPVU5EOntjb25maWd1cmFibGU6ITB9LENBUF9CVVRUOntjb25maWd1cmFibGU6ITB9LENBUF9GTEFUOntjb25maWd1cmFibGU6ITB9LENBUF9TUVVBUkU6e2NvbmZpZ3VyYWJsZTohMH0sTUFYX1BSRUNJU0lPTl9ESUdJVFM6e2NvbmZpZ3VyYWJsZTohMH19O2J1LnByb3RvdHlwZS5idWZmZXJGaXhlZFByZWNpc2lvbj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgaHUobmV3IHd1KG5ldyBDcygxKSksdC5nZXRTY2FsZSgpKSxuPW5ldyBsdSh0aGlzLl9idWZQYXJhbXMpO24uc2V0V29ya2luZ1ByZWNpc2lvbk1vZGVsKHQpLG4uc2V0Tm9kZXIoZSksdGhpcy5fcmVzdWx0R2VvbWV0cnk9bi5idWZmZXIodGhpcy5fYXJnR2VvbSx0aGlzLl9kaXN0YW5jZSl9LGJ1LnByb3RvdHlwZS5idWZmZXJSZWR1Y2VkUHJlY2lzaW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWJ1Lk1BWF9QUkVDSVNJT05fRElHSVRTO2U+PTA7ZS0tKXt0cnl7dC5idWZmZXJSZWR1Y2VkUHJlY2lzaW9uKGUpfWNhdGNoKGUpe2lmKCEoZSBpbnN0YW5jZW9mIFJzKSl0aHJvdyBlO3QuX3NhdmVFeGNlcHRpb249ZX1pZihudWxsIT09dC5fcmVzdWx0R2VvbWV0cnkpcmV0dXJuIG51bGx9dGhyb3cgdGhpcy5fc2F2ZUV4Y2VwdGlvbn1pZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YnUucHJlY2lzaW9uU2NhbGVGYWN0b3IodGhpcy5fYXJnR2VvbSx0aGlzLl9kaXN0YW5jZSxuKSxpPW5ldyBDcyhyKTt0aGlzLmJ1ZmZlckZpeGVkUHJlY2lzaW9uKGkpfX0sYnUucHJvdG90eXBlLmNvbXB1dGVHZW9tZXRyeT1mdW5jdGlvbigpe2lmKHRoaXMuYnVmZmVyT3JpZ2luYWxQcmVjaXNpb24oKSxudWxsIT09dGhpcy5fcmVzdWx0R2VvbWV0cnkpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5fYXJnR2VvbS5nZXRGYWN0b3J5KCkuZ2V0UHJlY2lzaW9uTW9kZWwoKTt0LmdldFR5cGUoKT09PUNzLkZJWEVEP3RoaXMuYnVmZmVyRml4ZWRQcmVjaXNpb24odCk6dGhpcy5idWZmZXJSZWR1Y2VkUHJlY2lzaW9uKCl9LGJ1LnByb3RvdHlwZS5zZXRRdWFkcmFudFNlZ21lbnRzPWZ1bmN0aW9uKHQpe3RoaXMuX2J1ZlBhcmFtcy5zZXRRdWFkcmFudFNlZ21lbnRzKHQpfSxidS5wcm90b3R5cGUuYnVmZmVyT3JpZ2luYWxQcmVjaXNpb249ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9bmV3IGx1KHRoaXMuX2J1ZlBhcmFtcyk7dGhpcy5fcmVzdWx0R2VvbWV0cnk9dC5idWZmZXIodGhpcy5fYXJnR2VvbSx0aGlzLl9kaXN0YW5jZSl9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgV2kpKXRocm93IHQ7dGhpcy5fc2F2ZUV4Y2VwdGlvbj10fX0sYnUucHJvdG90eXBlLmdldFJlc3VsdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kaXN0YW5jZT10LHRoaXMuY29tcHV0ZUdlb21ldHJ5KCksdGhpcy5fcmVzdWx0R2VvbWV0cnl9LGJ1LnByb3RvdHlwZS5zZXRFbmRDYXBTdHlsZT1mdW5jdGlvbih0KXt0aGlzLl9idWZQYXJhbXMuc2V0RW5kQ2FwU3R5bGUodCl9LGJ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxidS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYnV9LGJ1LmJ1ZmZlck9wPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1sxXTtyZXR1cm4gbmV3IGJ1KGFyZ3VtZW50c1swXSkuZ2V0UmVzdWx0R2VvbWV0cnkodCl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzJdKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPW5ldyBidShhcmd1bWVudHNbMF0pO3JldHVybiByLnNldFF1YWRyYW50U2VnbWVudHMobiksci5nZXRSZXN1bHRHZW9tZXRyeShlKX1pZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEZhJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIGk9YXJndW1lbnRzWzFdO3JldHVybiBuZXcgYnUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1syXSkuZ2V0UmVzdWx0R2VvbWV0cnkoaSl9fWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1szXSx1PW5ldyBidShhcmd1bWVudHNbMF0pO3JldHVybiB1LnNldFF1YWRyYW50U2VnbWVudHMocyksdS5zZXRFbmRDYXBTdHlsZShhKSx1LmdldFJlc3VsdEdlb21ldHJ5KG8pfX0sYnUucHJlY2lzaW9uU2NhbGVGYWN0b3I9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLGk9Q2kubWF4KE1hdGguYWJzKHIuZ2V0TWF4WCgpKSxNYXRoLmFicyhyLmdldE1heFkoKSksTWF0aC5hYnMoci5nZXRNaW5YKCkpLE1hdGguYWJzKHIuZ2V0TWluWSgpKSkrMiooZT4wP2U6MCksbz1uLU1hdGgudHJ1bmMoTWF0aC5sb2coaSkvTWF0aC5sb2coMTApKzEpO3JldHVybiBNYXRoLnBvdygxMCxvKX0sRHUuQ0FQX1JPVU5ELmdldD1mdW5jdGlvbigpe3JldHVybiBGYS5DQVBfUk9VTkR9LER1LkNBUF9CVVRULmdldD1mdW5jdGlvbigpe3JldHVybiBGYS5DQVBfRkxBVH0sRHUuQ0FQX0ZMQVQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEZhLkNBUF9GTEFUfSxEdS5DQVBfU1FVQVJFLmdldD1mdW5jdGlvbigpe3JldHVybiBGYS5DQVBfU1FVQVJFfSxEdS5NQVhfUFJFQ0lTSU9OX0RJR0lUUy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJ1LER1KTt2YXIgRXU9ZnVuY3Rpb24oKXt0aGlzLl9wdD1bbmV3IHZpLG5ldyB2aV0sdGhpcy5fZGlzdGFuY2U9ZmkuTmFOLHRoaXMuX2lzTnVsbD0hMH07RXUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0fSxFdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHRbdF19LEV1LnByb3RvdHlwZS5zZXRNaW5pbXVtPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldE1pbmltdW0odC5fcHRbMF0sdC5fcHRbMV0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLl9pc051bGwpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShlLG4pLG51bGw7dmFyIHI9ZS5kaXN0YW5jZShuKTtyPHRoaXMuX2Rpc3RhbmNlJiZ0aGlzLmluaXRpYWxpemUoZSxuLHIpfX0sRXUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLl9pc051bGw9ITA7ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX3B0WzBdLnNldENvb3JkaW5hdGUodCksdGhpcy5fcHRbMV0uc2V0Q29vcmRpbmF0ZShlKSx0aGlzLl9kaXN0YW5jZT10LmRpc3RhbmNlKGUpLHRoaXMuX2lzTnVsbD0hMX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07dGhpcy5fcHRbMF0uc2V0Q29vcmRpbmF0ZShuKSx0aGlzLl9wdFsxXS5zZXRDb29yZGluYXRlKHIpLHRoaXMuX2Rpc3RhbmNlPWksdGhpcy5faXNOdWxsPSExfX0sRXUucHJvdG90eXBlLmdldERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlfSxFdS5wcm90b3R5cGUuc2V0TWF4aW11bT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRNYXhpbXVtKHQuX3B0WzBdLHQuX3B0WzFdKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYodGhpcy5faXNOdWxsKXJldHVybiB0aGlzLmluaXRpYWxpemUoZSxuKSxudWxsO3ZhciByPWUuZGlzdGFuY2Uobik7cj50aGlzLl9kaXN0YW5jZSYmdGhpcy5pbml0aWFsaXplKGUsbixyKX19LEV1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxFdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRXV9O3ZhciBDdT1mdW5jdGlvbigpe307Q3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEN1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDdX0sQ3UuY29tcHV0ZURpc3RhbmNlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBFdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBhcyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSlmb3IodmFyIHQ9YXJndW1lbnRzWzFdLGU9YXJndW1lbnRzWzJdLG49YXJndW1lbnRzWzBdLmdldENvb3JkaW5hdGVzKCkscj1uZXcgYmEsaT0wO2k8bi5sZW5ndGgtMTtpKyspe3Iuc2V0Q29vcmRpbmF0ZXMobltpXSxuW2krMV0pO3ZhciBvPXIuY2xvc2VzdFBvaW50KHQpO2Uuc2V0TWluaW11bShvLHQpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBFdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBocyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdLHU9YXJndW1lbnRzWzJdO0N1LmNvbXB1dGVEaXN0YW5jZShzLmdldEV4dGVyaW9yUmluZygpLGEsdSk7Zm9yKHZhciBjPTA7YzxzLmdldE51bUludGVyaW9yUmluZygpO2MrKylDdS5jb21wdXRlRGlzdGFuY2Uocy5nZXRJbnRlcmlvclJpbmdOKGMpLGEsdSl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEV1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgbD1hcmd1bWVudHNbMF0saD1hcmd1bWVudHNbMV0sZj1hcmd1bWVudHNbMl07aWYobCBpbnN0YW5jZW9mIGFzKUN1LmNvbXB1dGVEaXN0YW5jZShsLGgsZik7ZWxzZSBpZihsIGluc3RhbmNlb2YgaHMpQ3UuY29tcHV0ZURpc3RhbmNlKGwsaCxmKTtlbHNlIGlmKGwgaW5zdGFuY2VvZiBIbylmb3IodmFyIHA9bCxkPTA7ZDxwLmdldE51bUdlb21ldHJpZXMoKTtkKyspe3ZhciBnPXAuZ2V0R2VvbWV0cnlOKGQpO0N1LmNvbXB1dGVEaXN0YW5jZShnLGgsZil9ZWxzZSBmLnNldE1pbmltdW0obC5nZXRDb29yZGluYXRlKCksaCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEV1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGJhJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgeT1hcmd1bWVudHNbMV0sbT1hcmd1bWVudHNbMl0sdj1hcmd1bWVudHNbMF0uY2xvc2VzdFBvaW50KHkpO20uc2V0TWluaW11bSh2LHkpfX07dmFyIFN1PWZ1bmN0aW9uKHQpe3RoaXMuX21heFB0RGlzdD1uZXcgRXUsdGhpcy5faW5wdXRHZW9tPXR8fG51bGx9LEF1PXtNYXhQb2ludERpc3RhbmNlRmlsdGVyOntjb25maWd1cmFibGU6ITB9LE1heE1pZHBvaW50RGlzdGFuY2VGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O1N1LnByb3RvdHlwZS5jb21wdXRlTWF4TWlkcG9pbnREaXN0YW5jZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgSXUodGhpcy5faW5wdXRHZW9tKTt0LmFwcGx5KGUpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKGUuZ2V0TWF4UG9pbnREaXN0YW5jZSgpKX0sU3UucHJvdG90eXBlLmNvbXB1dGVNYXhWZXJ0ZXhEaXN0YW5jZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgTnUodGhpcy5faW5wdXRHZW9tKTt0LmFwcGx5KGUpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKGUuZ2V0TWF4UG9pbnREaXN0YW5jZSgpKX0sU3UucHJvdG90eXBlLmZpbmREaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wdXRlTWF4VmVydGV4RGlzdGFuY2UodCksdGhpcy5jb21wdXRlTWF4TWlkcG9pbnREaXN0YW5jZSh0KSx0aGlzLl9tYXhQdERpc3QuZ2V0RGlzdGFuY2UoKX0sU3UucHJvdG90eXBlLmdldERpc3RhbmNlUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0sU3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFN1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBTdX0sQXUuTWF4UG9pbnREaXN0YW5jZUZpbHRlci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTnV9LEF1Lk1heE1pZHBvaW50RGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEl1fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhTdSxBdSk7dmFyIE51PWZ1bmN0aW9uKHQpe3RoaXMuX21heFB0RGlzdD1uZXcgRXUsdGhpcy5fbWluUHREaXN0PW5ldyBFdSx0aGlzLl9nZW9tPXR8fG51bGx9O051LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dGhpcy5fbWluUHREaXN0LmluaXRpYWxpemUoKSxDdS5jb21wdXRlRGlzdGFuY2UodGhpcy5fZ2VvbSx0LHRoaXMuX21pblB0RGlzdCksdGhpcy5fbWF4UHREaXN0LnNldE1heGltdW0odGhpcy5fbWluUHREaXN0KX0sTnUucHJvdG90eXBlLmdldE1heFBvaW50RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4UHREaXN0fSxOdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYW9dfSxOdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTnV9O3ZhciBJdT1mdW5jdGlvbih0KXt0aGlzLl9tYXhQdERpc3Q9bmV3IEV1LHRoaXMuX21pblB0RGlzdD1uZXcgRXUsdGhpcy5fZ2VvbT10fHxudWxsfTtJdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQsZSl7aWYoMD09PWUpcmV0dXJuIG51bGw7dmFyIG49dC5nZXRDb29yZGluYXRlKGUtMSkscj10LmdldENvb3JkaW5hdGUoZSksaT1uZXcgdmkoKG4ueCtyLngpLzIsKG4ueStyLnkpLzIpO3RoaXMuX21pblB0RGlzdC5pbml0aWFsaXplKCksQ3UuY29tcHV0ZURpc3RhbmNlKHRoaXMuX2dlb20saSx0aGlzLl9taW5QdERpc3QpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKHRoaXMuX21pblB0RGlzdCl9LEl1LnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSXUucHJvdG90eXBlLmlzR2VvbWV0cnlDaGFuZ2VkPWZ1bmN0aW9uKCl7cmV0dXJuITF9LEl1LnByb3RvdHlwZS5nZXRNYXhQb2ludERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0sSXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1dvXX0sSXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEl1fTt2YXIgTXU9ZnVuY3Rpb24odCl7dGhpcy5fY29tcHM9dHx8bnVsbH07TXUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgaHMmJnRoaXMuX2NvbXBzLmFkZCh0KX0sTXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1hvXX0sTXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE11fSxNdS5nZXRQb2x5Z29ucz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBNdS5nZXRQb2x5Z29ucyhhcmd1bWVudHNbMF0sbmV3IHhvKTtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3JldHVybiB0IGluc3RhbmNlb2YgaHM/ZS5hZGQodCk6dCBpbnN0YW5jZW9mIEhvJiZ0LmFwcGx5KG5ldyBNdShlKSksZX19O3ZhciBGdT1mdW5jdGlvbigpe2lmKHRoaXMuX2xpbmVzPW51bGwsdGhpcy5faXNGb3JjZWRUb0xpbmVTdHJpbmc9ITEsMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9saW5lcz10fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9saW5lcz1lLHRoaXMuX2lzRm9yY2VkVG9MaW5lU3RyaW5nPW59fTtGdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2lzRm9yY2VkVG9MaW5lU3RyaW5nJiZ0IGluc3RhbmNlb2YgcHMpe3ZhciBlPXQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcodC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSk7cmV0dXJuIHRoaXMuX2xpbmVzLmFkZChlKSxudWxsfXQgaW5zdGFuY2VvZiBhcyYmdGhpcy5fbGluZXMuYWRkKHQpfSxGdS5wcm90b3R5cGUuc2V0Rm9yY2VUb0xpbmVTdHJpbmc9ZnVuY3Rpb24odCl7dGhpcy5faXNGb3JjZWRUb0xpbmVTdHJpbmc9dH0sRnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3JvXX0sRnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEZ1fSxGdS5nZXRHZW9tZXRyeT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmJ1aWxkR2VvbWV0cnkoRnUuZ2V0TGluZXModCkpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuIGUuZ2V0RmFjdG9yeSgpLmJ1aWxkR2VvbWV0cnkoRnUuZ2V0TGluZXMoZSxuKSl9fSxGdS5nZXRMaW5lcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBGdS5nZXRMaW5lcyhhcmd1bWVudHNbMF0sITEpO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihFaShhcmd1bWVudHNbMF0sZ28pJiZFaShhcmd1bWVudHNbMV0sZ28pKXtmb3IodmFyIHQ9YXJndW1lbnRzWzFdLGU9YXJndW1lbnRzWzBdLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtGdS5nZXRMaW5lcyhuLHQpfXJldHVybiB0fWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJiJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89bmV3IHhvO3JldHVybiByLmFwcGx5KG5ldyBGdShvLGkpKSxvfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJkVpKGFyZ3VtZW50c1sxXSxnbykpe3ZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXTtyZXR1cm4gcyBpbnN0YW5jZW9mIGFzP2EuYWRkKHMpOnMuYXBwbHkobmV3IEZ1KGEpKSxhfX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJkVpKGFyZ3VtZW50c1swXSxnbykmJkVpKGFyZ3VtZW50c1sxXSxnbykpe2Zvcih2YXIgdT1hcmd1bWVudHNbMV0sYz1hcmd1bWVudHNbMl0sbD1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtsLmhhc05leHQoKTspe3ZhciBoPWwubmV4dCgpO0Z1LmdldExpbmVzKGgsdSxjKX1yZXR1cm4gdX1pZigiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJkVpKGFyZ3VtZW50c1sxXSxnbykpe3ZhciBmPWFyZ3VtZW50c1sxXSxwPWFyZ3VtZW50c1syXTtyZXR1cm4gYXJndW1lbnRzWzBdLmFwcGx5KG5ldyBGdShmLHApKSxmfX19O3ZhciBUdT1mdW5jdGlvbigpe2lmKHRoaXMuX2JvdW5kYXJ5UnVsZT11by5PR0NfU0ZTX0JPVU5EQVJZX1JVTEUsdGhpcy5faXNJbj1udWxsLHRoaXMuX251bUJvdW5kYXJpZXM9bnVsbCwwIT09YXJndW1lbnRzLmxlbmd0aCYmMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtpZihudWxsPT09dCl0aHJvdyBuZXcgaGk7dGhpcy5fYm91bmRhcnlSdWxlPXR9fTtUdS5wcm90b3R5cGUubG9jYXRlSW50ZXJuYWw9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIGhzKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYoZS5pc0VtcHR5KCkpcmV0dXJuIGJpLkVYVEVSSU9SO3ZhciBuPWUuZ2V0RXh0ZXJpb3JSaW5nKCkscj10aGlzLmxvY2F0ZUluUG9seWdvblJpbmcodCxuKTtpZihyPT09YmkuRVhURVJJT1IpcmV0dXJuIGJpLkVYVEVSSU9SO2lmKHI9PT1iaS5CT1VOREFSWSlyZXR1cm4gYmkuQk9VTkRBUlk7Zm9yKHZhciBpPTA7aTxlLmdldE51bUludGVyaW9yUmluZygpO2krKyl7dmFyIG89ZS5nZXRJbnRlcmlvclJpbmdOKGkpLHM9dGhpcy5sb2NhdGVJblBvbHlnb25SaW5nKHQsbyk7aWYocz09PWJpLklOVEVSSU9SKXJldHVybiBiaS5FWFRFUklPUjtpZihzPT09YmkuQk9VTkRBUlkpcmV0dXJuIGJpLkJPVU5EQVJZfXJldHVybiBiaS5JTlRFUklPUn1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIGFzKXt2YXIgYT1hcmd1bWVudHNbMF0sdT1hcmd1bWVudHNbMV07aWYoIXUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmludGVyc2VjdHMoYSkpcmV0dXJuIGJpLkVYVEVSSU9SO3ZhciBjPXUuZ2V0Q29vcmRpbmF0ZXMoKTtyZXR1cm4gdS5pc0Nsb3NlZCgpfHwhYS5lcXVhbHMoY1swXSkmJiFhLmVxdWFscyhjW2MubGVuZ3RoLTFdKT9lby5pc09uTGluZShhLGMpP2JpLklOVEVSSU9SOmJpLkVYVEVSSU9SOmJpLkJPVU5EQVJZfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgY3Mpe3ZhciBsPWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzFdLmdldENvb3JkaW5hdGUoKS5lcXVhbHMyRChsKT9iaS5JTlRFUklPUjpiaS5FWFRFUklPUn19LFR1LnByb3RvdHlwZS5sb2NhdGVJblBvbHlnb25SaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmludGVyc2VjdHModCk/ZW8ubG9jYXRlUG9pbnRJblJpbmcodCxlLmdldENvb3JkaW5hdGVzKCkpOmJpLkVYVEVSSU9SfSxUdS5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxvY2F0ZSh0LGUpIT09YmkuRVhURVJJT1J9LFR1LnByb3RvdHlwZS51cGRhdGVMb2NhdGlvbkluZm89ZnVuY3Rpb24odCl7dD09PWJpLklOVEVSSU9SJiYodGhpcy5faXNJbj0hMCksdD09PWJpLkJPVU5EQVJZJiZ0aGlzLl9udW1Cb3VuZGFyaWVzKyt9LFR1LnByb3RvdHlwZS5jb21wdXRlTG9jYXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKGUgaW5zdGFuY2VvZiBjcyYmdGhpcy51cGRhdGVMb2NhdGlvbkluZm8odGhpcy5sb2NhdGVJbnRlcm5hbCh0LGUpKSxlIGluc3RhbmNlb2YgYXMpdGhpcy51cGRhdGVMb2NhdGlvbkluZm8odGhpcy5sb2NhdGVJbnRlcm5hbCh0LGUpKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBocyl0aGlzLnVwZGF0ZUxvY2F0aW9uSW5mbyh0aGlzLmxvY2F0ZUludGVybmFsKHQsZSkpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIFpvKWZvcih2YXIgcj1lLGk9MDtpPHIuZ2V0TnVtR2VvbWV0cmllcygpO2krKyl7dmFyIG89ci5nZXRHZW9tZXRyeU4oaSk7bi51cGRhdGVMb2NhdGlvbkluZm8obi5sb2NhdGVJbnRlcm5hbCh0LG8pKX1lbHNlIGlmKGUgaW5zdGFuY2VvZiBkcylmb3IodmFyIHM9ZSxhPTA7YTxzLmdldE51bUdlb21ldHJpZXMoKTthKyspe3ZhciB1PXMuZ2V0R2VvbWV0cnlOKGEpO24udXBkYXRlTG9jYXRpb25JbmZvKG4ubG9jYXRlSW50ZXJuYWwodCx1KSl9ZWxzZSBpZihlIGluc3RhbmNlb2YgSG8pZm9yKHZhciBjPW5ldyBIYShlKTtjLmhhc05leHQoKTspe3ZhciBsPWMubmV4dCgpO2whPT1lJiZuLmNvbXB1dGVMb2NhdGlvbih0LGwpfX0sVHUucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBlLmlzRW1wdHkoKT9iaS5FWFRFUklPUjplIGluc3RhbmNlb2YgYXN8fGUgaW5zdGFuY2VvZiBocz90aGlzLmxvY2F0ZUludGVybmFsKHQsZSk6KHRoaXMuX2lzSW49ITEsdGhpcy5fbnVtQm91bmRhcmllcz0wLHRoaXMuY29tcHV0ZUxvY2F0aW9uKHQsZSksdGhpcy5fYm91bmRhcnlSdWxlLmlzSW5Cb3VuZGFyeSh0aGlzLl9udW1Cb3VuZGFyaWVzKT9iaS5CT1VOREFSWTp0aGlzLl9udW1Cb3VuZGFyaWVzPjB8fHRoaXMuX2lzSW4/YmkuSU5URVJJT1I6YmkuRVhURVJJT1IpfSxUdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFR1fTt2YXIgT3U9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX2NvbXBvbmVudD1udWxsLHRoaXMuX3NlZ0luZGV4PW51bGwsdGhpcy5fcHQ9bnVsbCwyPT09YXJndW1lbnRzLmxlbmd0aCl0LmNhbGwodGhpcyxhcmd1bWVudHNbMF0sdC5JTlNJREVfQVJFQSxhcmd1bWVudHNbMV0pO2Vsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9jb21wb25lbnQ9ZSx0aGlzLl9zZWdJbmRleD1uLHRoaXMuX3B0PXJ9fSxMdT17SU5TSURFX0FSRUE6e2NvbmZpZ3VyYWJsZTohMH19O091LnByb3RvdHlwZS5pc0luc2lkZUFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VnSW5kZXg9PT1PdS5JTlNJREVfQVJFQX0sT3UucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHR9LE91LnByb3RvdHlwZS5nZXRHZW9tZXRyeUNvbXBvbmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnR9LE91LnByb3RvdHlwZS5nZXRTZWdtZW50SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VnSW5kZXh9LE91LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxPdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gT3V9LEx1LklOU0lERV9BUkVBLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPdSxMdSk7dmFyIFB1PWZ1bmN0aW9uKHQpe3RoaXMuX3B0cz10fHxudWxsfTtQdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBjcyYmdGhpcy5fcHRzLmFkZCh0KX0sUHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1hvXX0sUHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFB1fSxQdS5nZXRQb2ludHM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0IGluc3RhbmNlb2YgY3M/YWEuc2luZ2xldG9uTGlzdCh0KTpQdS5nZXRQb2ludHModCxuZXcgeG8pfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuIGUgaW5zdGFuY2VvZiBjcz9uLmFkZChlKTplIGluc3RhbmNlb2YgSG8mJmUuYXBwbHkobmV3IFB1KG4pKSxufX07dmFyIFJ1PWZ1bmN0aW9uKCl7dGhpcy5fbG9jYXRpb25zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xvY2F0aW9ucz10fTtSdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpeyh0IGluc3RhbmNlb2YgY3N8fHQgaW5zdGFuY2VvZiBhc3x8dCBpbnN0YW5jZW9mIGhzKSYmdGhpcy5fbG9jYXRpb25zLmFkZChuZXcgT3UodCwwLHQuZ2V0Q29vcmRpbmF0ZSgpKSl9LFJ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltYb119LFJ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBSdX0sUnUuZ2V0TG9jYXRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB4bztyZXR1cm4gdC5hcHBseShuZXcgUnUoZSkpLGV9O3ZhciBCdT1mdW5jdGlvbigpe2lmKHRoaXMuX2dlb209bnVsbCx0aGlzLl90ZXJtaW5hdGVEaXN0YW5jZT0wLHRoaXMuX3B0TG9jYXRvcj1uZXcgVHUsdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbj1udWxsLHRoaXMuX21pbkRpc3RhbmNlPWZpLk1BWF9WQUxVRSwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2dlb209W3QsZV0sdGhpcy5fdGVybWluYXRlRGlzdGFuY2U9MH1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07dGhpcy5fZ2VvbT1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9nZW9tWzBdPW4sdGhpcy5fZ2VvbVsxXT1yLHRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlPWl9fTtCdS5wcm90b3R5cGUuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1uZXcgQXJyYXkoMikuZmlsbChudWxsKTtpZih0aGlzLmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKDAsZSksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsO3RoaXMuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UoMSxlKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT0xLW4sbz1NdS5nZXRQb2x5Z29ucyh0aGlzLl9nZW9tW25dKTtpZihvLnNpemUoKT4wKXt2YXIgcz1SdS5nZXRMb2NhdGlvbnModGhpcy5fZ2VvbVtpXSk7aWYodGhpcy5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZShzLG8sciksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiB0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uW2ldPXJbMF0sdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbltuXT1yWzFdLG51bGx9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmRWkoYXJndW1lbnRzWzBdLHZvKSYmRWkoYXJndW1lbnRzWzFdLHZvKSl7Zm9yKHZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxjPWFyZ3VtZW50c1syXSxsPTA7bDxhLnNpemUoKTtsKyspZm9yKHZhciBoPWEuZ2V0KGwpLGY9MDtmPHUuc2l6ZSgpO2YrKylpZih0LmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKGgsdS5nZXQoZiksYyksdC5fbWluRGlzdGFuY2U8PXQuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPdSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBocyl7dmFyIHA9YXJndW1lbnRzWzBdLGQ9YXJndW1lbnRzWzFdLGc9YXJndW1lbnRzWzJdLHk9cC5nZXRDb29yZGluYXRlKCk7aWYoYmkuRVhURVJJT1IhPT10aGlzLl9wdExvY2F0b3IubG9jYXRlKHksZCkpcmV0dXJuIHRoaXMuX21pbkRpc3RhbmNlPTAsZ1swXT1wLGdbMV09bmV3IE91KGQseSksbnVsbH19LEJ1LnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2VMaW5lc1BvaW50cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXRoaXMsaT0wO2k8dC5zaXplKCk7aSsrKWZvcih2YXIgbz10LmdldChpKSxzPTA7czxlLnNpemUoKTtzKyspe3ZhciBhPWUuZ2V0KHMpO2lmKHIuY29tcHV0ZU1pbkRpc3RhbmNlKG8sYSxuKSxyLl9taW5EaXN0YW5jZTw9ci5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fSxCdS5wcm90b3R5cGUuY29tcHV0ZUZhY2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQXJyYXkoMikuZmlsbChudWxsKSxlPUZ1LmdldExpbmVzKHRoaXMuX2dlb21bMF0pLG49RnUuZ2V0TGluZXModGhpcy5fZ2VvbVsxXSkscj1QdS5nZXRQb2ludHModGhpcy5fZ2VvbVswXSksaT1QdS5nZXRQb2ludHModGhpcy5fZ2VvbVsxXSk7aWYodGhpcy5jb21wdXRlTWluRGlzdGFuY2VMaW5lcyhlLG4sdCksdGhpcy51cGRhdGVNaW5EaXN0YW5jZSh0LCExKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2V8fCh0WzBdPW51bGwsdFsxXT1udWxsLHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlTGluZXNQb2ludHMoZSxpLHQpLHRoaXMudXBkYXRlTWluRGlzdGFuY2UodCwhMSksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKXx8KHRbMF09bnVsbCx0WzFdPW51bGwsdGhpcy5jb21wdXRlTWluRGlzdGFuY2VMaW5lc1BvaW50cyhuLHIsdCksdGhpcy51cGRhdGVNaW5EaXN0YW5jZSh0LCEwKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2UpKXJldHVybiBudWxsO3RbMF09bnVsbCx0WzFdPW51bGwsdGhpcy5jb21wdXRlTWluRGlzdGFuY2VQb2ludHMocixpLHQpLHRoaXMudXBkYXRlTWluRGlzdGFuY2UodCwhMSl9LEJ1LnByb3RvdHlwZS5uZWFyZXN0TG9jYXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlKCksdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbn0sQnUucHJvdG90eXBlLnVwZGF0ZU1pbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09PXRbMF0pcmV0dXJuIG51bGw7ZT8odGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvblswXT10WzFdLHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMV09dFswXSk6KHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMF09dFswXSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzFdPXRbMV0pfSxCdS5wcm90b3R5cGUubmVhcmVzdFBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZSgpLFt0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzBdLmdldENvb3JkaW5hdGUoKSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzFdLmdldENvb3JkaW5hdGUoKV19LEJ1LnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihudWxsIT09dGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbnx8KHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb249bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZSgpLHRoaXMuX21pbkRpc3RhbmNlPD10aGlzLl90ZXJtaW5hdGVEaXN0YW5jZSkpcmV0dXJuIG51bGw7dGhpcy5jb21wdXRlRmFjZXREaXN0YW5jZSgpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBhcyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBjcyl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKGUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmRpc3RhbmNlKG4uZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKT50aGlzLl9taW5EaXN0YW5jZSlyZXR1cm4gbnVsbDtmb3IodmFyIGk9ZS5nZXRDb29yZGluYXRlcygpLG89bi5nZXRDb29yZGluYXRlKCkscz0wO3M8aS5sZW5ndGgtMTtzKyspe3ZhciBhPWVvLmRpc3RhbmNlUG9pbnRMaW5lKG8saVtzXSxpW3MrMV0pO2lmKGE8dC5fbWluRGlzdGFuY2Upe3QuX21pbkRpc3RhbmNlPWE7dmFyIHU9bmV3IGJhKGlbc10saVtzKzFdKS5jbG9zZXN0UG9pbnQobyk7clswXT1uZXcgT3UoZSxzLHUpLHJbMV09bmV3IE91KG4sMCxvKX1pZih0Ll9taW5EaXN0YW5jZTw9dC5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBhcyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBhcyl7dmFyIGM9YXJndW1lbnRzWzBdLGw9YXJndW1lbnRzWzFdLGg9YXJndW1lbnRzWzJdO2lmKGMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmRpc3RhbmNlKGwuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKT50aGlzLl9taW5EaXN0YW5jZSlyZXR1cm4gbnVsbDtmb3IodmFyIGY9Yy5nZXRDb29yZGluYXRlcygpLHA9bC5nZXRDb29yZGluYXRlcygpLGQ9MDtkPGYubGVuZ3RoLTE7ZCsrKWZvcih2YXIgZz0wO2c8cC5sZW5ndGgtMTtnKyspe3ZhciB5PWVvLmRpc3RhbmNlTGluZUxpbmUoZltkXSxmW2QrMV0scFtnXSxwW2crMV0pO2lmKHk8dC5fbWluRGlzdGFuY2Upe3QuX21pbkRpc3RhbmNlPXk7dmFyIG09bmV3IGJhKGZbZF0sZltkKzFdKSx2PW5ldyBiYShwW2ddLHBbZysxXSksXz1tLmNsb3Nlc3RQb2ludHModik7aFswXT1uZXcgT3UoYyxkLF9bMF0pLGhbMV09bmV3IE91KGwsZyxfWzFdKX1pZih0Ll9taW5EaXN0YW5jZTw9dC5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fX0sQnUucHJvdG90eXBlLmNvbXB1dGVNaW5EaXN0YW5jZVBvaW50cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXRoaXMsaT0wO2k8dC5zaXplKCk7aSsrKWZvcih2YXIgbz10LmdldChpKSxzPTA7czxlLnNpemUoKTtzKyspe3ZhciBhPWUuZ2V0KHMpLHU9by5nZXRDb29yZGluYXRlKCkuZGlzdGFuY2UoYS5nZXRDb29yZGluYXRlKCkpO2lmKHU8ci5fbWluRGlzdGFuY2UmJihyLl9taW5EaXN0YW5jZT11LG5bMF09bmV3IE91KG8sMCxvLmdldENvb3JkaW5hdGUoKSksblsxXT1uZXcgT3UoYSwwLGEuZ2V0Q29vcmRpbmF0ZSgpKSksci5fbWluRGlzdGFuY2U8PXIuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfX0sQnUucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2dlb21bMF18fG51bGw9PT10aGlzLl9nZW9tWzFdKXRocm93IG5ldyBoaTtyZXR1cm4gdGhpcy5fZ2VvbVswXS5pc0VtcHR5KCl8fHRoaXMuX2dlb21bMV0uaXNFbXB0eSgpPzA6KHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlKCksdGhpcy5fbWluRGlzdGFuY2UpfSxCdS5wcm90b3R5cGUuY29tcHV0ZU1pbkRpc3RhbmNlTGluZXM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10aGlzLGk9MDtpPHQuc2l6ZSgpO2krKylmb3IodmFyIG89dC5nZXQoaSkscz0wO3M8ZS5zaXplKCk7cysrKXt2YXIgYT1lLmdldChzKTtpZihyLmNvbXB1dGVNaW5EaXN0YW5jZShvLGEsbiksci5fbWluRGlzdGFuY2U8PXIuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfX0sQnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEJ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBCdX0sQnUuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IEJ1KHQsZSkuZGlzdGFuY2UoKX0sQnUuaXNXaXRoaW5EaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBCdSh0LGUsbikuZGlzdGFuY2UoKTw9bn0sQnUubmVhcmVzdFBvaW50cz1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgQnUodCxlKS5uZWFyZXN0UG9pbnRzKCl9O3ZhciBrdT1mdW5jdGlvbigpe3RoaXMuX3B0PVtuZXcgdmksbmV3IHZpXSx0aGlzLl9kaXN0YW5jZT1maS5OYU4sdGhpcy5faXNOdWxsPSEwfTtrdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHR9LGt1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdFt0XX0sa3UucHJvdG90eXBlLnNldE1pbmltdW09ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0TWluaW11bSh0Ll9wdFswXSx0Ll9wdFsxXSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHRoaXMuX2lzTnVsbClyZXR1cm4gdGhpcy5pbml0aWFsaXplKGUsbiksbnVsbDt2YXIgcj1lLmRpc3RhbmNlKG4pO3I8dGhpcy5fZGlzdGFuY2UmJnRoaXMuaW5pdGlhbGl6ZShlLG4scil9fSxrdS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuX2lzTnVsbD0hMDtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHRbMF0uc2V0Q29vcmRpbmF0ZSh0KSx0aGlzLl9wdFsxXS5zZXRDb29yZGluYXRlKGUpLHRoaXMuX2Rpc3RhbmNlPXQuZGlzdGFuY2UoZSksdGhpcy5faXNOdWxsPSExfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTt0aGlzLl9wdFswXS5zZXRDb29yZGluYXRlKG4pLHRoaXMuX3B0WzFdLnNldENvb3JkaW5hdGUociksdGhpcy5fZGlzdGFuY2U9aSx0aGlzLl9pc051bGw9ITF9fSxrdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWGkudG9MaW5lU3RyaW5nKHRoaXMuX3B0WzBdLHRoaXMuX3B0WzFdKX0sa3UucHJvdG90eXBlLmdldERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlfSxrdS5wcm90b3R5cGUuc2V0TWF4aW11bT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRNYXhpbXVtKHQuX3B0WzBdLHQuX3B0WzFdKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYodGhpcy5faXNOdWxsKXJldHVybiB0aGlzLmluaXRpYWxpemUoZSxuKSxudWxsO3ZhciByPWUuZGlzdGFuY2Uobik7cj50aGlzLl9kaXN0YW5jZSYmdGhpcy5pbml0aWFsaXplKGUsbixyKX19LGt1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxrdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4ga3V9O3ZhciB6dT1mdW5jdGlvbigpe307enUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHp1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB6dX0senUuY29tcHV0ZURpc3RhbmNlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBrdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBhcyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSlmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9bmV3IGJhLGk9dC5nZXRDb29yZGluYXRlcygpLG89MDtvPGkubGVuZ3RoLTE7bysrKXtyLnNldENvb3JkaW5hdGVzKGlbb10saVtvKzFdKTt2YXIgcz1yLmNsb3Nlc3RQb2ludChlKTtuLnNldE1pbmltdW0ocyxlKX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2Yga3UmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaHMmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxjPWFyZ3VtZW50c1syXTt6dS5jb21wdXRlRGlzdGFuY2UoYS5nZXRFeHRlcmlvclJpbmcoKSx1LGMpO2Zvcih2YXIgbD0wO2w8YS5nZXROdW1JbnRlcmlvclJpbmcoKTtsKyspenUuY29tcHV0ZURpc3RhbmNlKGEuZ2V0SW50ZXJpb3JSaW5nTihsKSx1LGMpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBrdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIGg9YXJndW1lbnRzWzBdLGY9YXJndW1lbnRzWzFdLHA9YXJndW1lbnRzWzJdO2lmKGggaW5zdGFuY2VvZiBhcyl6dS5jb21wdXRlRGlzdGFuY2UoaCxmLHApO2Vsc2UgaWYoaCBpbnN0YW5jZW9mIGhzKXp1LmNvbXB1dGVEaXN0YW5jZShoLGYscCk7ZWxzZSBpZihoIGluc3RhbmNlb2YgSG8pZm9yKHZhciBkPWgsZz0wO2c8ZC5nZXROdW1HZW9tZXRyaWVzKCk7ZysrKXt2YXIgeT1kLmdldEdlb21ldHJ5TihnKTt6dS5jb21wdXRlRGlzdGFuY2UoeSxmLHApfWVsc2UgcC5zZXRNaW5pbXVtKGguZ2V0Q29vcmRpbmF0ZSgpLGYpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBrdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBiYSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIG09YXJndW1lbnRzWzFdLHY9YXJndW1lbnRzWzJdLF89YXJndW1lbnRzWzBdLmNsb3Nlc3RQb2ludChtKTt2LnNldE1pbmltdW0oXyxtKX19O3ZhciBqdT1mdW5jdGlvbigpe3RoaXMuX2cwPW51bGwsdGhpcy5fZzE9bnVsbCx0aGlzLl9wdERpc3Q9bmV3IGt1LHRoaXMuX2RlbnNpZnlGcmFjPTA7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2cwPXQsdGhpcy5fZzE9ZX0sVXU9e01heFBvaW50RGlzdGFuY2VGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH0sTWF4RGVuc2lmaWVkQnlGcmFjdGlvbkRpc3RhbmNlRmlsdGVyOntjb25maWd1cmFibGU6ITB9fTtqdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHREaXN0LmdldENvb3JkaW5hdGVzKCl9LGp1LnByb3RvdHlwZS5zZXREZW5zaWZ5RnJhY3Rpb249ZnVuY3Rpb24odCl7aWYodD4xfHx0PD0wKXRocm93IG5ldyBoaTt0aGlzLl9kZW5zaWZ5RnJhYz10fSxqdS5wcm90b3R5cGUuY29tcHV0ZT1mdW5jdGlvbih0LGUpe3RoaXMuY29tcHV0ZU9yaWVudGVkRGlzdGFuY2UodCxlLHRoaXMuX3B0RGlzdCksdGhpcy5jb21wdXRlT3JpZW50ZWREaXN0YW5jZShlLHQsdGhpcy5fcHREaXN0KX0sanUucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZSh0aGlzLl9nMCx0aGlzLl9nMSksdGhpcy5fcHREaXN0LmdldERpc3RhbmNlKCl9LGp1LnByb3RvdHlwZS5jb21wdXRlT3JpZW50ZWREaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IHF1KGUpO2lmKHQuYXBwbHkociksbi5zZXRNYXhpbXVtKHIuZ2V0TWF4UG9pbnREaXN0YW5jZSgpKSx0aGlzLl9kZW5zaWZ5RnJhYz4wKXt2YXIgaT1uZXcgVnUoZSx0aGlzLl9kZW5zaWZ5RnJhYyk7dC5hcHBseShpKSxuLnNldE1heGltdW0oaS5nZXRNYXhQb2ludERpc3RhbmNlKCkpfX0sanUucHJvdG90eXBlLm9yaWVudGVkRGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wdXRlT3JpZW50ZWREaXN0YW5jZSh0aGlzLl9nMCx0aGlzLl9nMSx0aGlzLl9wdERpc3QpLHRoaXMuX3B0RGlzdC5nZXREaXN0YW5jZSgpfSxqdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sanUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGp1fSxqdS5kaXN0YW5jZT1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBuZXcganUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSkuZGlzdGFuY2UoKTtpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzJdLGU9bmV3IGp1KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pO3JldHVybiBlLnNldERlbnNpZnlGcmFjdGlvbih0KSxlLmRpc3RhbmNlKCl9fSxVdS5NYXhQb2ludERpc3RhbmNlRmlsdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBxdX0sVXUuTWF4RGVuc2lmaWVkQnlGcmFjdGlvbkRpc3RhbmNlRmlsdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBWdX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoanUsVXUpO3ZhciBxdT1mdW5jdGlvbigpe3RoaXMuX21heFB0RGlzdD1uZXcga3UsdGhpcy5fbWluUHREaXN0PW5ldyBrdSx0aGlzLl9ldWNsaWRlYW5EaXN0PW5ldyB6dSx0aGlzLl9nZW9tPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2dlb209dH07cXUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt0aGlzLl9taW5QdERpc3QuaW5pdGlhbGl6ZSgpLHp1LmNvbXB1dGVEaXN0YW5jZSh0aGlzLl9nZW9tLHQsdGhpcy5fbWluUHREaXN0KSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bSh0aGlzLl9taW5QdERpc3QpfSxxdS5wcm90b3R5cGUuZ2V0TWF4UG9pbnREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LHF1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblthb119LHF1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxdX07dmFyIFZ1PWZ1bmN0aW9uKCl7dGhpcy5fbWF4UHREaXN0PW5ldyBrdSx0aGlzLl9taW5QdERpc3Q9bmV3IGt1LHRoaXMuX2dlb209bnVsbCx0aGlzLl9udW1TdWJTZWdzPTA7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2dlb209dCx0aGlzLl9udW1TdWJTZWdzPU1hdGgudHJ1bmMoTWF0aC5yb3VuZCgxL2UpKX07VnUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoMD09PWUpcmV0dXJuIG51bGw7Zm9yKHZhciByPXQuZ2V0Q29vcmRpbmF0ZShlLTEpLGk9dC5nZXRDb29yZGluYXRlKGUpLG89KGkueC1yLngpL3RoaXMuX251bVN1YlNlZ3Mscz0oaS55LXIueSkvdGhpcy5fbnVtU3ViU2VncyxhPTA7YTx0aGlzLl9udW1TdWJTZWdzO2ErKyl7dmFyIHU9ci54K2EqbyxjPXIueSthKnMsbD1uZXcgdmkodSxjKTtuLl9taW5QdERpc3QuaW5pdGlhbGl6ZSgpLHp1LmNvbXB1dGVEaXN0YW5jZShuLl9nZW9tLGwsbi5fbWluUHREaXN0KSxuLl9tYXhQdERpc3Quc2V0TWF4aW11bShuLl9taW5QdERpc3QpfX0sVnUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSxWdS5wcm90b3R5cGUuaXNHZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sVnUucHJvdG90eXBlLmdldE1heFBvaW50RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4UHREaXN0fSxWdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bV29dfSxWdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVnV9O3ZhciBHdT1mdW5jdGlvbih0LGUsbil7dGhpcy5fbWluVmFsaWREaXN0YW5jZT1udWxsLHRoaXMuX21heFZhbGlkRGlzdGFuY2U9bnVsbCx0aGlzLl9taW5EaXN0YW5jZUZvdW5kPW51bGwsdGhpcy5fbWF4RGlzdGFuY2VGb3VuZD1udWxsLHRoaXMuX2lzVmFsaWQ9ITAsdGhpcy5fZXJyTXNnPW51bGwsdGhpcy5fZXJyb3JMb2NhdGlvbj1udWxsLHRoaXMuX2Vycm9ySW5kaWNhdG9yPW51bGwsdGhpcy5faW5wdXQ9dHx8bnVsbCx0aGlzLl9idWZEaXN0YW5jZT1lfHxudWxsLHRoaXMuX3Jlc3VsdD1ufHxudWxsfSxZdT17VkVSQk9TRTp7Y29uZmlndXJhYmxlOiEwfSxNQVhfRElTVEFOQ0VfRElGRl9GUkFDOntjb25maWd1cmFibGU6ITB9fTtHdS5wcm90b3R5cGUuY2hlY2tNYXhpbXVtRGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBqdShlLHQpO2lmKHIuc2V0RGVuc2lmeUZyYWN0aW9uKC4yNSksdGhpcy5fbWF4RGlzdGFuY2VGb3VuZD1yLm9yaWVudGVkRGlzdGFuY2UoKSx0aGlzLl9tYXhEaXN0YW5jZUZvdW5kPm4pe3RoaXMuX2lzVmFsaWQ9ITE7dmFyIGk9ci5nZXRDb29yZGluYXRlcygpO3RoaXMuX2Vycm9yTG9jYXRpb249aVsxXSx0aGlzLl9lcnJvckluZGljYXRvcj10LmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lU3RyaW5nKGkpLHRoaXMuX2Vyck1zZz0iRGlzdGFuY2UgYmV0d2VlbiBidWZmZXIgY3VydmUgYW5kIGlucHV0IGlzIHRvbyBsYXJnZSAoIit0aGlzLl9tYXhEaXN0YW5jZUZvdW5kKyIgYXQgIitYaS50b0xpbmVTdHJpbmcoaVswXSxpWzFdKSsiKSJ9fSxHdS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3ZhciB0PU1hdGguYWJzKHRoaXMuX2J1ZkRpc3RhbmNlKSxlPUd1Lk1BWF9ESVNUQU5DRV9ESUZGX0ZSQUMqdDtyZXR1cm4gdGhpcy5fbWluVmFsaWREaXN0YW5jZT10LWUsdGhpcy5fbWF4VmFsaWREaXN0YW5jZT10K2UsISghdGhpcy5faW5wdXQuaXNFbXB0eSgpJiYhdGhpcy5fcmVzdWx0LmlzRW1wdHkoKSl8fCh0aGlzLl9idWZEaXN0YW5jZT4wP3RoaXMuY2hlY2tQb3NpdGl2ZVZhbGlkKCk6dGhpcy5jaGVja05lZ2F0aXZlVmFsaWQoKSxHdS5WRVJCT1NFJiZraS5vdXQucHJpbnRsbigiTWluIERpc3Q9ICIrdGhpcy5fbWluRGlzdGFuY2VGb3VuZCsiICBlcnI9ICIrKDEtdGhpcy5fbWluRGlzdGFuY2VGb3VuZC90aGlzLl9idWZEaXN0YW5jZSkrIiAgTWF4IERpc3Q9ICIrdGhpcy5fbWF4RGlzdGFuY2VGb3VuZCsiICBlcnI9ICIrKHRoaXMuX21heERpc3RhbmNlRm91bmQvdGhpcy5fYnVmRGlzdGFuY2UtMSkpLHRoaXMuX2lzVmFsaWQpfSxHdS5wcm90b3R5cGUuY2hlY2tOZWdhdGl2ZVZhbGlkPWZ1bmN0aW9uKCl7aWYoISh0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIGhzfHx0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIGRzfHx0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIEhvKSlyZXR1cm4gbnVsbDt2YXIgdD10aGlzLmdldFBvbHlnb25MaW5lcyh0aGlzLl9pbnB1dCk7aWYodGhpcy5jaGVja01pbmltdW1EaXN0YW5jZSh0LHRoaXMuX3Jlc3VsdCx0aGlzLl9taW5WYWxpZERpc3RhbmNlKSwhdGhpcy5faXNWYWxpZClyZXR1cm4gbnVsbDt0aGlzLmNoZWNrTWF4aW11bURpc3RhbmNlKHQsdGhpcy5fcmVzdWx0LHRoaXMuX21heFZhbGlkRGlzdGFuY2UpfSxHdS5wcm90b3R5cGUuZ2V0RXJyb3JJbmRpY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JJbmRpY2F0b3J9LEd1LnByb3RvdHlwZS5jaGVja01pbmltdW1EaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IEJ1KHQsZSxuKTtpZih0aGlzLl9taW5EaXN0YW5jZUZvdW5kPXIuZGlzdGFuY2UoKSx0aGlzLl9taW5EaXN0YW5jZUZvdW5kPG4pe3RoaXMuX2lzVmFsaWQ9ITE7dmFyIGk9ci5uZWFyZXN0UG9pbnRzKCk7dGhpcy5fZXJyb3JMb2NhdGlvbj1yLm5lYXJlc3RQb2ludHMoKVsxXSx0aGlzLl9lcnJvckluZGljYXRvcj10LmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lU3RyaW5nKGkpLHRoaXMuX2Vyck1zZz0iRGlzdGFuY2UgYmV0d2VlbiBidWZmZXIgY3VydmUgYW5kIGlucHV0IGlzIHRvbyBzbWFsbCAoIit0aGlzLl9taW5EaXN0YW5jZUZvdW5kKyIgYXQgIitYaS50b0xpbmVTdHJpbmcoaVswXSxpWzFdKSsiICkifX0sR3UucHJvdG90eXBlLmNoZWNrUG9zaXRpdmVWYWxpZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3Jlc3VsdC5nZXRCb3VuZGFyeSgpO2lmKHRoaXMuY2hlY2tNaW5pbXVtRGlzdGFuY2UodGhpcy5faW5wdXQsdCx0aGlzLl9taW5WYWxpZERpc3RhbmNlKSwhdGhpcy5faXNWYWxpZClyZXR1cm4gbnVsbDt0aGlzLmNoZWNrTWF4aW11bURpc3RhbmNlKHRoaXMuX2lucHV0LHQsdGhpcy5fbWF4VmFsaWREaXN0YW5jZSl9LEd1LnByb3RvdHlwZS5nZXRFcnJvckxvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vycm9yTG9jYXRpb259LEd1LnByb3RvdHlwZS5nZXRQb2x5Z29uTGluZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPW5ldyBGdShlKSxyPU11LmdldFBvbHlnb25zKHQpLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXtyLm5leHQoKS5hcHBseShuKX1yZXR1cm4gdC5nZXRGYWN0b3J5KCkuYnVpbGRHZW9tZXRyeShlKX0sR3UucHJvdG90eXBlLmdldEVycm9yTWVzc2FnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJNc2d9LEd1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxHdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gR3V9LFl1LlZFUkJPU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LFl1Lk1BWF9ESVNUQU5DRV9ESUZGX0ZSQUMuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLjAxMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoR3UsWXUpO3ZhciBYdT1mdW5jdGlvbih0LGUsbil7dGhpcy5faXNWYWxpZD0hMCx0aGlzLl9lcnJvck1zZz1udWxsLHRoaXMuX2Vycm9yTG9jYXRpb249bnVsbCx0aGlzLl9lcnJvckluZGljYXRvcj1udWxsLHRoaXMuX2lucHV0PXR8fG51bGwsdGhpcy5fZGlzdGFuY2U9ZXx8bnVsbCx0aGlzLl9yZXN1bHQ9bnx8bnVsbH0sV3U9e1ZFUkJPU0U6e2NvbmZpZ3VyYWJsZTohMH0sTUFYX0VOVl9ESUZGX0ZSQUM6e2NvbmZpZ3VyYWJsZTohMH19O1h1LnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hlY2tQb2x5Z29uYWwoKSx0aGlzLl9pc1ZhbGlkPyh0aGlzLmNoZWNrRXhwZWN0ZWRFbXB0eSgpLHRoaXMuX2lzVmFsaWQ/KHRoaXMuY2hlY2tFbnZlbG9wZSgpLHRoaXMuX2lzVmFsaWQ/KHRoaXMuY2hlY2tBcmVhKCksdGhpcy5faXNWYWxpZD8odGhpcy5jaGVja0Rpc3RhbmNlKCksdGhpcy5faXNWYWxpZCk6dGhpcy5faXNWYWxpZCk6dGhpcy5faXNWYWxpZCk6dGhpcy5faXNWYWxpZCk6dGhpcy5faXNWYWxpZH0sWHUucHJvdG90eXBlLmNoZWNrRW52ZWxvcGU9ZnVuY3Rpb24oKXtpZih0aGlzLl9kaXN0YW5jZTwwKXJldHVybiBudWxsO3ZhciB0PXRoaXMuX2Rpc3RhbmNlKlh1Lk1BWF9FTlZfRElGRl9GUkFDOzA9PT10JiYodD0uMDAxKTt2YXIgZT1uZXcgamkodGhpcy5faW5wdXQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKTtlLmV4cGFuZEJ5KHRoaXMuX2Rpc3RhbmNlKTt2YXIgbj1uZXcgamkodGhpcy5fcmVzdWx0LmdldEVudmVsb3BlSW50ZXJuYWwoKSk7bi5leHBhbmRCeSh0KSxuLmNvbnRhaW5zKGUpfHwodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz0iQnVmZmVyIGVudmVsb3BlIGlzIGluY29ycmVjdCIsdGhpcy5fZXJyb3JJbmRpY2F0b3I9dGhpcy5faW5wdXQuZ2V0RmFjdG9yeSgpLnRvR2VvbWV0cnkobikpLHRoaXMucmVwb3J0KCJFbnZlbG9wZSIpfSxYdS5wcm90b3R5cGUuY2hlY2tEaXN0YW5jZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBHdSh0aGlzLl9pbnB1dCx0aGlzLl9kaXN0YW5jZSx0aGlzLl9yZXN1bHQpO3QuaXNWYWxpZCgpfHwodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz10LmdldEVycm9yTWVzc2FnZSgpLHRoaXMuX2Vycm9yTG9jYXRpb249dC5nZXRFcnJvckxvY2F0aW9uKCksdGhpcy5fZXJyb3JJbmRpY2F0b3I9dC5nZXRFcnJvckluZGljYXRvcigpKSx0aGlzLnJlcG9ydCgiRGlzdGFuY2UiKX0sWHUucHJvdG90eXBlLmNoZWNrQXJlYT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2lucHV0LmdldEFyZWEoKSxlPXRoaXMuX3Jlc3VsdC5nZXRBcmVhKCk7dGhpcy5fZGlzdGFuY2U+MCYmdD5lJiYodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz0iQXJlYSBvZiBwb3NpdGl2ZSBidWZmZXIgaXMgc21hbGxlciB0aGFuIGlucHV0Iix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9yZXN1bHQpLHRoaXMuX2Rpc3RhbmNlPDAmJnQ8ZSYmKHRoaXMuX2lzVmFsaWQ9ITEsdGhpcy5fZXJyb3JNc2c9IkFyZWEgb2YgbmVnYXRpdmUgYnVmZmVyIGlzIGxhcmdlciB0aGFuIGlucHV0Iix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9yZXN1bHQpLHRoaXMucmVwb3J0KCJBcmVhIil9LFh1LnByb3RvdHlwZS5jaGVja1BvbHlnb25hbD1mdW5jdGlvbigpe3RoaXMuX3Jlc3VsdCBpbnN0YW5jZW9mIGhzfHx0aGlzLl9yZXN1bHQgaW5zdGFuY2VvZiBkc3x8KHRoaXMuX2lzVmFsaWQ9ITEpLHRoaXMuX2Vycm9yTXNnPSJSZXN1bHQgaXMgbm90IHBvbHlnb25hbCIsdGhpcy5fZXJyb3JJbmRpY2F0b3I9dGhpcy5fcmVzdWx0LHRoaXMucmVwb3J0KCJQb2x5Z29uYWwiKX0sWHUucHJvdG90eXBlLmdldEVycm9ySW5kaWNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vycm9ySW5kaWNhdG9yfSxYdS5wcm90b3R5cGUuZ2V0RXJyb3JMb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvckxvY2F0aW9ufSxYdS5wcm90b3R5cGUuY2hlY2tFeHBlY3RlZEVtcHR5PWZ1bmN0aW9uKCl7aWYodGhpcy5faW5wdXQuZ2V0RGltZW5zaW9uKCk+PTJ8fHRoaXMuX2Rpc3RhbmNlPjApcmV0dXJuIG51bGw7dGhpcy5fcmVzdWx0LmlzRW1wdHkoKXx8KHRoaXMuX2lzVmFsaWQ9ITEsdGhpcy5fZXJyb3JNc2c9IlJlc3VsdCBpcyBub24tZW1wdHkiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdGhpcy5yZXBvcnQoIkV4cGVjdGVkRW1wdHkiKX0sWHUucHJvdG90eXBlLnJlcG9ydD1mdW5jdGlvbih0KXtpZighWHUuVkVSQk9TRSlyZXR1cm4gbnVsbDtraS5vdXQucHJpbnRsbigiQ2hlY2sgIit0KyI6ICIrKHRoaXMuX2lzVmFsaWQ/InBhc3NlZCI6IkZBSUxFRCIpKX0sWHUucHJvdG90eXBlLmdldEVycm9yTWVzc2FnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvck1zZ30sWHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFh1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYdX0sWHUuaXNWYWxpZE1zZz1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IFh1KHQsZSxuKTtyZXR1cm4gci5pc1ZhbGlkKCk/bnVsbDpyLmdldEVycm9yTWVzc2FnZSgpfSxYdS5pc1ZhbGlkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIW5ldyBYdSh0LGUsbikuaXNWYWxpZCgpfSxXdS5WRVJCT1NFLmdldD1mdW5jdGlvbigpe3JldHVybiExfSxXdS5NQVhfRU5WX0RJRkZfRlJBQy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDEyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhYdSxXdSk7dmFyIEh1PWZ1bmN0aW9uKCl7dGhpcy5fcHRzPW51bGwsdGhpcy5fZGF0YT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wdHM9dCx0aGlzLl9kYXRhPWV9O0h1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHN9LEh1LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0cy5sZW5ndGh9LEh1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdHNbdF19LEh1LnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHNbMF0uZXF1YWxzKHRoaXMuX3B0c1t0aGlzLl9wdHMubGVuZ3RoLTFdKX0sSHUucHJvdG90eXBlLmdldFNlZ21lbnRPY3RhbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT10aGlzLl9wdHMubGVuZ3RoLTE/LTE6dmEub2N0YW50KHRoaXMuZ2V0Q29vcmRpbmF0ZSh0KSx0aGlzLmdldENvb3JkaW5hdGUodCsxKSl9LEh1LnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX2RhdGE9dH0sSHUucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sSHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFhpLnRvTGluZVN0cmluZyhuZXcgeHModGhpcy5fcHRzKSl9LEh1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltfYV19LEh1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBIdX07dmFyIFp1PWZ1bmN0aW9uKCl7dGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnM9ITEsdGhpcy5faXNDaGVja0VuZFNlZ21lbnRzT25seT0hMSx0aGlzLl9saT1udWxsLHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uPW51bGwsdGhpcy5faW50U2VnbWVudHM9bnVsbCx0aGlzLl9pbnRlcnNlY3Rpb25zPW5ldyB4byx0aGlzLl9pbnRlcnNlY3Rpb25Db3VudD0wLHRoaXMuX2tlZXBJbnRlcnNlY3Rpb25zPSEwO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9saT10LHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uPW51bGx9O1p1LnByb3RvdHlwZS5nZXRJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbn0sWnUucHJvdG90eXBlLnNldENoZWNrRW5kU2VnbWVudHNPbmx5PWZ1bmN0aW9uKHQpe3RoaXMuX2lzQ2hlY2tFbmRTZWdtZW50c09ubHk9dH0sWnUucHJvdG90eXBlLmdldEludGVyc2VjdGlvblNlZ21lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludFNlZ21lbnRzfSxadS5wcm90b3R5cGUuY291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW50ZXJzZWN0aW9uQ291bnR9LFp1LnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVyc2VjdGlvbnN9LFp1LnByb3RvdHlwZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz10fSxadS5wcm90b3R5cGUuc2V0S2VlcEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCl7dGhpcy5fa2VlcEludGVyc2VjdGlvbnM9dH0sWnUucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCF0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucyYmdGhpcy5oYXNJbnRlcnNlY3Rpb24oKXx8dD09PW4mJmU9PT1yKXJldHVybiBudWxsO2lmKHRoaXMuX2lzQ2hlY2tFbmRTZWdtZW50c09ubHkmJiEodGhpcy5pc0VuZFNlZ21lbnQodCxlKXx8dGhpcy5pc0VuZFNlZ21lbnQobixyKSkpcmV0dXJuIG51bGw7dmFyIGk9dC5nZXRDb29yZGluYXRlcygpW2VdLG89dC5nZXRDb29yZGluYXRlcygpW2UrMV0scz1uLmdldENvb3JkaW5hdGVzKClbcl0sYT1uLmdldENvb3JkaW5hdGVzKClbcisxXTt0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiZ0aGlzLl9saS5pc0ludGVyaW9ySW50ZXJzZWN0aW9uKCkmJih0aGlzLl9pbnRTZWdtZW50cz1uZXcgQXJyYXkoNCkuZmlsbChudWxsKSx0aGlzLl9pbnRTZWdtZW50c1swXT1pLHRoaXMuX2ludFNlZ21lbnRzWzFdPW8sdGhpcy5faW50U2VnbWVudHNbMl09cyx0aGlzLl9pbnRTZWdtZW50c1szXT1hLHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uPXRoaXMuX2xpLmdldEludGVyc2VjdGlvbigwKSx0aGlzLl9rZWVwSW50ZXJzZWN0aW9ucyYmdGhpcy5faW50ZXJzZWN0aW9ucy5hZGQodGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb24pLHRoaXMuX2ludGVyc2VjdGlvbkNvdW50KyspfSxadS5wcm90b3R5cGUuaXNFbmRTZWdtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PT1lfHxlPj10LnNpemUoKS0yfSxadS5wcm90b3R5cGUuaGFzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbn0sWnUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiF0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucyYmbnVsbCE9PXRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ufSxadS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZXVdfSxadS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWnV9LFp1LmNyZWF0ZUFsbEludGVyc2VjdGlvbnNGaW5kZXI9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFp1KHQpO3JldHVybiBlLnNldEZpbmRBbGxJbnRlcnNlY3Rpb25zKCEwKSxlfSxadS5jcmVhdGVBbnlJbnRlcnNlY3Rpb25GaW5kZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBadSh0KX0sWnUuY3JlYXRlSW50ZXJzZWN0aW9uQ291bnRlcj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgWnUodCk7cmV0dXJuIGUuc2V0RmluZEFsbEludGVyc2VjdGlvbnMoITApLGUuc2V0S2VlcEludGVyc2VjdGlvbnMoITEpLGV9O3ZhciBLdT1mdW5jdGlvbigpe3RoaXMuX2xpPW5ldyBRaSx0aGlzLl9zZWdTdHJpbmdzPW51bGwsdGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnM9ITEsdGhpcy5fc2VnSW50PW51bGwsdGhpcy5faXNWYWxpZD0hMDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fc2VnU3RyaW5ncz10fTtLdS5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLl9zZWdJbnQpcmV0dXJuIG51bGw7dGhpcy5jaGVja0ludGVyaW9ySW50ZXJzZWN0aW9ucygpfSxLdS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWdJbnQuZ2V0SW50ZXJzZWN0aW9ucygpfSxLdS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmV4ZWN1dGUoKSx0aGlzLl9pc1ZhbGlkfSxLdS5wcm90b3R5cGUuc2V0RmluZEFsbEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCl7dGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnM9dH0sS3UucHJvdG90eXBlLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7dGhpcy5faXNWYWxpZD0hMCx0aGlzLl9zZWdJbnQ9bmV3IFp1KHRoaXMuX2xpKSx0aGlzLl9zZWdJbnQuc2V0RmluZEFsbEludGVyc2VjdGlvbnModGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnMpO3ZhciB0PW5ldyBJYTtpZih0LnNldFNlZ21lbnRJbnRlcnNlY3Rvcih0aGlzLl9zZWdJbnQpLHQuY29tcHV0ZU5vZGVzKHRoaXMuX3NlZ1N0cmluZ3MpLHRoaXMuX3NlZ0ludC5oYXNJbnRlcnNlY3Rpb24oKSlyZXR1cm4gdGhpcy5faXNWYWxpZD0hMSxudWxsfSxLdS5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbigpe2lmKHRoaXMuZXhlY3V0ZSgpLCF0aGlzLl9pc1ZhbGlkKXRocm93IG5ldyBScyh0aGlzLmdldEVycm9yTWVzc2FnZSgpLHRoaXMuX3NlZ0ludC5nZXRJbnRlcmlvckludGVyc2VjdGlvbigpKX0sS3UucHJvdG90eXBlLmdldEVycm9yTWVzc2FnZT1mdW5jdGlvbigpe2lmKHRoaXMuX2lzVmFsaWQpcmV0dXJuIm5vIGludGVyc2VjdGlvbnMgZm91bmQiO3ZhciB0PXRoaXMuX3NlZ0ludC5nZXRJbnRlcnNlY3Rpb25TZWdtZW50cygpO3JldHVybiJmb3VuZCBub24tbm9kZWQgaW50ZXJzZWN0aW9uIGJldHdlZW4gIitYaS50b0xpbmVTdHJpbmcodFswXSx0WzFdKSsiIGFuZCAiK1hpLnRvTGluZVN0cmluZyh0WzJdLHRbM10pfSxLdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEt1fSxLdS5jb21wdXRlSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgS3UodCk7cmV0dXJuIGUuc2V0RmluZEFsbEludGVyc2VjdGlvbnMoITApLGUuaXNWYWxpZCgpLGUuZ2V0SW50ZXJzZWN0aW9ucygpfTt2YXIgSnU9ZnVuY3Rpb24gdCgpe3RoaXMuX252PW51bGw7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX252PW5ldyBLdSh0LnRvU2VnbWVudFN0cmluZ3MoZSkpfTtKdS5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbigpe3RoaXMuX252LmNoZWNrVmFsaWQoKX0sSnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEp1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBKdX0sSnUudG9TZWdtZW50U3RyaW5ncz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ZS5hZGQobmV3IEh1KHIuZ2V0Q29vcmRpbmF0ZXMoKSxyKSl9cmV0dXJuIGV9LEp1LmNoZWNrVmFsaWQ9ZnVuY3Rpb24odCl7bmV3IEp1KHQpLmNoZWNrVmFsaWQoKX07dmFyIFF1PWZ1bmN0aW9uKHQpe3RoaXMuX21hcE9wPXR9O1F1LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPTA7bjx0LmdldE51bUdlb21ldHJpZXMoKTtuKyspe3ZhciByPXRoaXMuX21hcE9wLm1hcCh0LmdldEdlb21ldHJ5TihuKSk7ci5pc0VtcHR5KCl8fGUuYWRkKHIpfXJldHVybiB0LmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oSXMudG9HZW9tZXRyeUFycmF5KGUpKX0sUXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFF1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBRdX0sUXUubWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBRdShlKS5tYXAodCl9O3ZhciAkdT1mdW5jdGlvbigpe3RoaXMuX29wPW51bGwsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PW51bGwsdGhpcy5fcHRMb2NhdG9yPW51bGwsdGhpcy5fbGluZUVkZ2VzTGlzdD1uZXcgeG8sdGhpcy5fcmVzdWx0TGluZUxpc3Q9bmV3IHhvO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTt0aGlzLl9vcD10LHRoaXMuX2dlb21ldHJ5RmFjdG9yeT1lLHRoaXMuX3B0TG9jYXRvcj1ufTskdS5wcm90b3R5cGUuY29sbGVjdExpbmVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49dGhpcy5fb3AuZ2V0R3JhcGgoKS5nZXRFZGdlRW5kcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtlLmNvbGxlY3RMaW5lRWRnZShyLHQsZS5fbGluZUVkZ2VzTGlzdCksZS5jb2xsZWN0Qm91bmRhcnlUb3VjaEVkZ2Uocix0LGUuX2xpbmVFZGdlc0xpc3QpfX0sJHUucHJvdG90eXBlLmxhYmVsSXNvbGF0ZWRMaW5lPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LmdldENvb3JkaW5hdGUoKSx0aGlzLl9vcC5nZXRBcmdHZW9tZXRyeShlKSk7dC5nZXRMYWJlbCgpLnNldExvY2F0aW9uKGUsbil9LCR1LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maW5kQ292ZXJlZExpbmVFZGdlcygpLHRoaXMuY29sbGVjdExpbmVzKHQpLHRoaXMuYnVpbGRMaW5lcyh0KSx0aGlzLl9yZXN1bHRMaW5lTGlzdH0sJHUucHJvdG90eXBlLmNvbGxlY3RMaW5lRWRnZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRMYWJlbCgpLGk9dC5nZXRFZGdlKCk7dC5pc0xpbmVFZGdlKCkmJiF0LmlzVmlzaXRlZCgpJiZPYy5pc1Jlc3VsdE9mT3AocixlKSYmIWkuaXNDb3ZlcmVkKCkmJihuLmFkZChpKSx0LnNldFZpc2l0ZWRFZGdlKCEwKSl9LCR1LnByb3RvdHlwZS5maW5kQ292ZXJlZExpbmVFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9vcC5nZXRHcmFwaCgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkuZmluZENvdmVyZWRMaW5lRWRnZXMoKX1mb3IodmFyIGU9dGhpcy5fb3AuZ2V0R3JhcGgoKS5nZXRFZGdlRW5kcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPW4uZ2V0RWRnZSgpO2lmKG4uaXNMaW5lRWRnZSgpJiYhci5pc0NvdmVyZWRTZXQoKSl7dmFyIGk9dGhpcy5fb3AuaXNDb3ZlcmVkQnlBKG4uZ2V0Q29vcmRpbmF0ZSgpKTtyLnNldENvdmVyZWQoaSl9fX0sJHUucHJvdG90eXBlLmxhYmVsSXNvbGF0ZWRMaW5lcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkscj1uLmdldExhYmVsKCk7bi5pc0lzb2xhdGVkKCkmJihyLmlzTnVsbCgwKT90aGlzLmxhYmVsSXNvbGF0ZWRMaW5lKG4sMCk6dGhpcy5sYWJlbElzb2xhdGVkTGluZShuLDEpKX19LCR1LnByb3RvdHlwZS5idWlsZExpbmVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9saW5lRWRnZXNMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPXRoaXMuX2dlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKG4uZ2V0Q29vcmRpbmF0ZXMoKSk7dGhpcy5fcmVzdWx0TGluZUxpc3QuYWRkKHIpLG4uc2V0SW5SZXN1bHQoITApfX0sJHUucHJvdG90eXBlLmNvbGxlY3RCb3VuZGFyeVRvdWNoRWRnZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRMYWJlbCgpO2lmKHQuaXNMaW5lRWRnZSgpfHx0LmlzVmlzaXRlZCgpfHx0LmlzSW50ZXJpb3JBcmVhRWRnZSgpfHx0LmdldEVkZ2UoKS5pc0luUmVzdWx0KCkpcmV0dXJuIG51bGw7WmkuaXNUcnVlKCEodC5pc0luUmVzdWx0KCl8fHQuZ2V0U3ltKCkuaXNJblJlc3VsdCgpKXx8IXQuZ2V0RWRnZSgpLmlzSW5SZXN1bHQoKSksT2MuaXNSZXN1bHRPZk9wKHIsZSkmJmU9PT1PYy5JTlRFUlNFQ1RJT04mJihuLmFkZCh0LmdldEVkZ2UoKSksdC5zZXRWaXNpdGVkRWRnZSghMCkpfSwkdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sJHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICR1fTt2YXIgdGM9ZnVuY3Rpb24oKXt0aGlzLl9vcD1udWxsLHRoaXMuX2dlb21ldHJ5RmFjdG9yeT1udWxsLHRoaXMuX3Jlc3VsdFBvaW50TGlzdD1uZXcgeG87dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX29wPXQsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PWV9O3RjLnByb3RvdHlwZS5maWx0ZXJDb3ZlcmVkTm9kZVRvUG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRDb29yZGluYXRlKCk7aWYoIXRoaXMuX29wLmlzQ292ZXJlZEJ5TEEoZSkpe3ZhciBuPXRoaXMuX2dlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2ludChlKTt0aGlzLl9yZXN1bHRQb2ludExpc3QuYWRkKG4pfX0sdGMucHJvdG90eXBlLmV4dHJhY3ROb25Db3ZlcmVkUmVzdWx0Tm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX29wLmdldEdyYXBoKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7aWYoIShuLmlzSW5SZXN1bHQoKXx8bi5pc0luY2lkZW50RWRnZUluUmVzdWx0KCl8fDAhPT1uLmdldEVkZ2VzKCkuZ2V0RGVncmVlKCkmJnQhPT1PYy5JTlRFUlNFQ1RJT04pKXt2YXIgcj1uLmdldExhYmVsKCk7T2MuaXNSZXN1bHRPZk9wKHIsdCkmJnRoaXMuZmlsdGVyQ292ZXJlZE5vZGVUb1BvaW50KG4pfX19LHRjLnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5leHRyYWN0Tm9uQ292ZXJlZFJlc3VsdE5vZGVzKHQpLHRoaXMuX3Jlc3VsdFBvaW50TGlzdH0sdGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHRjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0Y307dmFyIGVjPWZ1bmN0aW9uKCl7dGhpcy5faW5wdXRHZW9tPW51bGwsdGhpcy5fZmFjdG9yeT1udWxsLHRoaXMuX3BydW5lRW1wdHlHZW9tZXRyeT0hMCx0aGlzLl9wcmVzZXJ2ZUdlb21ldHJ5Q29sbGVjdGlvblR5cGU9ITAsdGhpcy5fcHJlc2VydmVDb2xsZWN0aW9ucz0hMSx0aGlzLl9wcmVzZXJ2ZVR5cGU9ITF9O2VjLnByb3RvdHlwZS50cmFuc2Zvcm1Qb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZVBvaW50KHRoaXMudHJhbnNmb3JtQ29vcmRpbmF0ZXModC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSl9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1Qb2x5Z29uPWZ1bmN0aW9uKHQsZSl7dmFyIG49ITAscj10aGlzLnRyYW5zZm9ybUxpbmVhclJpbmcodC5nZXRFeHRlcmlvclJpbmcoKSx0KTsobnVsbD09PXJ8fCEociBpbnN0YW5jZW9mIHBzKXx8ci5pc0VtcHR5KCkpJiYobj0hMSk7Zm9yKHZhciBpPW5ldyB4byxvPTA7bzx0LmdldE51bUludGVyaW9yUmluZygpO28rKyl7dmFyIHM9dGhpcy50cmFuc2Zvcm1MaW5lYXJSaW5nKHQuZ2V0SW50ZXJpb3JSaW5nTihvKSx0KTtudWxsPT09c3x8cy5pc0VtcHR5KCl8fChzIGluc3RhbmNlb2YgcHN8fChuPSExKSxpLmFkZChzKSl9aWYobilyZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVQb2x5Z29uKHIsaS50b0FycmF5KFtdKSk7dmFyIGE9bmV3IHhvO3JldHVybiBudWxsIT09ciYmYS5hZGQociksYS5hZGRBbGwoaSksdGhpcy5fZmFjdG9yeS5idWlsZEdlb21ldHJ5KGEpfSxlYy5wcm90b3R5cGUuY3JlYXRlQ29vcmRpbmF0ZVNlcXVlbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9mYWN0b3J5LmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUodCl9LGVjLnByb3RvdHlwZS5nZXRJbnB1dEdlb21ldHJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lucHV0R2VvbX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybU11bHRpTGluZVN0cmluZz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgeG8scj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10aGlzLnRyYW5zZm9ybUxpbmVTdHJpbmcodC5nZXRHZW9tZXRyeU4ociksdCk7bnVsbCE9PWkmJihpLmlzRW1wdHkoKXx8bi5hZGQoaSkpfXJldHVybiB0aGlzLl9mYWN0b3J5LmJ1aWxkR2VvbWV0cnkobil9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1Db29yZGluYXRlcz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvcHkodCl9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1MaW5lU3RyaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlTGluZVN0cmluZyh0aGlzLnRyYW5zZm9ybUNvb3JkaW5hdGVzKHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCkpfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtTXVsdGlQb2ludD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgeG8scj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10aGlzLnRyYW5zZm9ybVBvaW50KHQuZ2V0R2VvbWV0cnlOKHIpLHQpO251bGwhPT1pJiYoaS5pc0VtcHR5KCl8fG4uYWRkKGkpKX1yZXR1cm4gdGhpcy5fZmFjdG9yeS5idWlsZEdlb21ldHJ5KG4pfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtTXVsdGlQb2x5Z29uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyB4byxyPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPXRoaXMudHJhbnNmb3JtUG9seWdvbih0LmdldEdlb21ldHJ5TihyKSx0KTtudWxsIT09aSYmKGkuaXNFbXB0eSgpfHxuLmFkZChpKSl9cmV0dXJuIHRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShuKX0sZWMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtR2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyB4byxyPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPXRoaXMudHJhbnNmb3JtKHQuZ2V0R2VvbWV0cnlOKHIpKTtudWxsIT09aSYmKHRoaXMuX3BydW5lRW1wdHlHZW9tZXRyeSYmaS5pc0VtcHR5KCl8fG4uYWRkKGkpKX1yZXR1cm4gdGhpcy5fcHJlc2VydmVHZW9tZXRyeUNvbGxlY3Rpb25UeXBlP3RoaXMuX2ZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKElzLnRvR2VvbWV0cnlBcnJheShuKSk6dGhpcy5fZmFjdG9yeS5idWlsZEdlb21ldHJ5KG4pfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2lucHV0R2VvbT10LHRoaXMuX2ZhY3Rvcnk9dC5nZXRGYWN0b3J5KCksdCBpbnN0YW5jZW9mIGNzKXJldHVybiB0aGlzLnRyYW5zZm9ybVBvaW50KHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIGZzKXJldHVybiB0aGlzLnRyYW5zZm9ybU11bHRpUG9pbnQodCxudWxsKTtpZih0IGluc3RhbmNlb2YgcHMpcmV0dXJuIHRoaXMudHJhbnNmb3JtTGluZWFyUmluZyh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBhcylyZXR1cm4gdGhpcy50cmFuc2Zvcm1MaW5lU3RyaW5nKHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIFpvKXJldHVybiB0aGlzLnRyYW5zZm9ybU11bHRpTGluZVN0cmluZyh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBocylyZXR1cm4gdGhpcy50cmFuc2Zvcm1Qb2x5Z29uKHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIGRzKXJldHVybiB0aGlzLnRyYW5zZm9ybU11bHRpUG9seWdvbih0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBIbylyZXR1cm4gdGhpcy50cmFuc2Zvcm1HZW9tZXRyeUNvbGxlY3Rpb24odCxudWxsKTt0aHJvdyBuZXcgaGkoIlVua25vd24gR2VvbWV0cnkgc3VidHlwZTogIit0LmdldENsYXNzKCkuZ2V0TmFtZSgpKX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybUxpbmVhclJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnRyYW5zZm9ybUNvb3JkaW5hdGVzKHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCk7aWYobnVsbD09PW4pcmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhudWxsKTt2YXIgcj1uLnNpemUoKTtyZXR1cm4gcj4wJiZyPDQmJiF0aGlzLl9wcmVzZXJ2ZVR5cGU/dGhpcy5fZmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKG4pOnRoaXMuX2ZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhuKX0sZWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGVjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlY307dmFyIG5jPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9zbmFwVG9sZXJhbmNlPTAsdGhpcy5fc3JjUHRzPW51bGwsdGhpcy5fc2VnPW5ldyBiYSx0aGlzLl9hbGxvd1NuYXBwaW5nVG9Tb3VyY2VWZXJ0aWNlcz0hMSx0aGlzLl9pc0Nsb3NlZD0hMSxhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGFzJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIGU9YXJndW1lbnRzWzFdO3QuY2FsbCh0aGlzLGFyZ3VtZW50c1swXS5nZXRDb29yZGluYXRlcygpLGUpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLl9zcmNQdHM9bix0aGlzLl9pc0Nsb3NlZD10LmlzQ2xvc2VkKG4pLHRoaXMuX3NuYXBUb2xlcmFuY2U9cn19O25jLnByb3RvdHlwZS5zbmFwVmVydGljZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5faXNDbG9zZWQ/dC5zaXplKCktMTp0LnNpemUoKSxyPTA7cjxuO3IrKyl7dmFyIGk9dC5nZXQociksbz10aGlzLmZpbmRTbmFwRm9yVmVydGV4KGksZSk7bnVsbCE9PW8mJih0LnNldChyLG5ldyB2aShvKSksMD09PXImJnRoaXMuX2lzQ2xvc2VkJiZ0LnNldCh0LnNpemUoKS0xLG5ldyB2aShvKSkpfX0sbmMucHJvdG90eXBlLmZpbmRTbmFwRm9yVmVydGV4PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe2lmKHQuZXF1YWxzMkQoZVtuXSkpcmV0dXJuIG51bGw7aWYodC5kaXN0YW5jZShlW25dKTx0aGlzLl9zbmFwVG9sZXJhbmNlKXJldHVybiBlW25dfXJldHVybiBudWxsfSxuYy5wcm90b3R5cGUuc25hcFRvPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBibyh0aGlzLl9zcmNQdHMpO3JldHVybiB0aGlzLnNuYXBWZXJ0aWNlcyhlLHQpLHRoaXMuc25hcFNlZ21lbnRzKGUsdCksZS50b0Nvb3JkaW5hdGVBcnJheSgpfSxuYy5wcm90b3R5cGUuc25hcFNlZ21lbnRzPWZ1bmN0aW9uKHQsZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiBudWxsO3ZhciBuPWUubGVuZ3RoO2VbMF0uZXF1YWxzMkQoZVtlLmxlbmd0aC0xXSkmJihuPWUubGVuZ3RoLTEpO2Zvcih2YXIgcj0wO3I8bjtyKyspe3ZhciBpPWVbcl0sbz10aGlzLmZpbmRTZWdtZW50SW5kZXhUb1NuYXAoaSx0KTtvPj0wJiZ0LmFkZChvKzEsbmV3IHZpKGkpLCExKX19LG5jLnByb3RvdHlwZS5maW5kU2VnbWVudEluZGV4VG9TbmFwPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMscj1maS5NQVhfVkFMVUUsaT0tMSxvPTA7bzxlLnNpemUoKS0xO28rKyl7aWYobi5fc2VnLnAwPWUuZ2V0KG8pLG4uX3NlZy5wMT1lLmdldChvKzEpLG4uX3NlZy5wMC5lcXVhbHMyRCh0KXx8bi5fc2VnLnAxLmVxdWFsczJEKHQpKXtpZihuLl9hbGxvd1NuYXBwaW5nVG9Tb3VyY2VWZXJ0aWNlcyljb250aW51ZTtyZXR1cm4tMX12YXIgcz1uLl9zZWcuZGlzdGFuY2UodCk7czxuLl9zbmFwVG9sZXJhbmNlJiZzPHImJihyPXMsaT1vKX1yZXR1cm4gaX0sbmMucHJvdG90eXBlLnNldEFsbG93U25hcHBpbmdUb1NvdXJjZVZlcnRpY2VzPWZ1bmN0aW9uKHQpe3RoaXMuX2FsbG93U25hcHBpbmdUb1NvdXJjZVZlcnRpY2VzPXR9LG5jLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxuYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbmN9LG5jLmlzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiEodC5sZW5ndGg8PTEpJiZ0WzBdLmVxdWFsczJEKHRbdC5sZW5ndGgtMV0pfTt2YXIgcmM9ZnVuY3Rpb24odCl7dGhpcy5fc3JjR2VvbT10fHxudWxsfSxpYz17U05BUF9QUkVDSVNJT05fRkFDVE9SOntjb25maWd1cmFibGU6ITB9fTtyYy5wcm90b3R5cGUuc25hcFRvPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5leHRyYWN0VGFyZ2V0Q29vcmRpbmF0ZXModCk7cmV0dXJuIG5ldyBvYyhlLG4pLnRyYW5zZm9ybSh0aGlzLl9zcmNHZW9tKX0scmMucHJvdG90eXBlLnNuYXBUb1NlbGY9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmV4dHJhY3RUYXJnZXRDb29yZGluYXRlcyh0aGlzLl9zcmNHZW9tKSxyPW5ldyBvYyh0LG4sITApLnRyYW5zZm9ybSh0aGlzLl9zcmNHZW9tKSxpPXI7cmV0dXJuIGUmJkVpKGksbHMpJiYoaT1yLmJ1ZmZlcigwKSksaX0scmMucHJvdG90eXBlLmNvbXB1dGVTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbXB1dGVNaW5pbXVtU2VnbWVudExlbmd0aCh0KS8xMH0scmMucHJvdG90eXBlLmV4dHJhY3RUYXJnZXRDb29yZGluYXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IFVvLG49dC5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoO3IrKyllLmFkZChuW3JdKTtyZXR1cm4gZS50b0FycmF5KG5ldyBBcnJheSgwKS5maWxsKG51bGwpKX0scmMucHJvdG90eXBlLmNvbXB1dGVNaW5pbXVtU2VnbWVudExlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIGU9ZmkuTUFYX1ZBTFVFLG49MDtuPHQubGVuZ3RoLTE7bisrKXt2YXIgcj10W25dLmRpc3RhbmNlKHRbbisxXSk7cjxlJiYoZT1yKX1yZXR1cm4gZX0scmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHJjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiByY30scmMuc25hcD1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksaT1uZXcgcmModCk7clswXT1pLnNuYXBUbyhlLG4pO3ZhciBvPW5ldyByYyhlKTtyZXR1cm4gclsxXT1vLnNuYXBUbyhyWzBdLG4pLHJ9LHJjLmNvbXB1dGVPdmVybGF5U25hcFRvbGVyYW5jZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1yYy5jb21wdXRlU2l6ZUJhc2VkU25hcFRvbGVyYW5jZSh0KSxuPXQuZ2V0UHJlY2lzaW9uTW9kZWwoKTtpZihuLmdldFR5cGUoKT09PUNzLkZJWEVEKXt2YXIgcj0xL24uZ2V0U2NhbGUoKSoyLzEuNDE1O3I+ZSYmKGU9cil9cmV0dXJuIGV9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXTtyZXR1cm4gTWF0aC5taW4ocmMuY29tcHV0ZU92ZXJsYXlTbmFwVG9sZXJhbmNlKGkpLHJjLmNvbXB1dGVPdmVybGF5U25hcFRvbGVyYW5jZShvKSl9fSxyYy5jb21wdXRlU2l6ZUJhc2VkU25hcFRvbGVyYW5jZT1mdW5jdGlvbih0KXt2YXIgZT10LmdldEVudmVsb3BlSW50ZXJuYWwoKTtyZXR1cm4gTWF0aC5taW4oZS5nZXRIZWlnaHQoKSxlLmdldFdpZHRoKCkpKnJjLlNOQVBfUFJFQ0lTSU9OX0ZBQ1RPUn0scmMuc25hcFRvU2VsZj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyByYyh0KS5zbmFwVG9TZWxmKGUsbil9LGljLlNOQVBfUFJFQ0lTSU9OX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtOX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmMsaWMpO3ZhciBvYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt0LmNhbGwodGhpcyksdGhpcy5fc25hcFRvbGVyYW5jZT1lfHxudWxsLHRoaXMuX3NuYXBQdHM9bnx8bnVsbCx0aGlzLl9pc1NlbGZTbmFwPXZvaWQgMCE9PXImJnJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnNuYXBMaW5lPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IG5jKHQsdGhpcy5fc25hcFRvbGVyYW5jZSk7cmV0dXJuIG4uc2V0QWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXModGhpcy5faXNTZWxmU25hcCksbi5zbmFwVG8oZSl9LGUucHJvdG90eXBlLnRyYW5zZm9ybUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC50b0Nvb3JkaW5hdGVBcnJheSgpLHI9dGhpcy5zbmFwTGluZShuLHRoaXMuX3NuYXBQdHMpO3JldHVybiB0aGlzLl9mYWN0b3J5LmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUocil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KGVjKSxzYz1mdW5jdGlvbigpe3RoaXMuX2lzRmlyc3Q9ITAsdGhpcy5fY29tbW9uTWFudGlzc2FCaXRzQ291bnQ9NTMsdGhpcy5fY29tbW9uQml0cz0wLHRoaXMuX2NvbW1vblNpZ25FeHA9bnVsbH07c2MucHJvdG90eXBlLmdldENvbW1vbj1mdW5jdGlvbigpe3JldHVybiBmaS5sb25nQml0c1RvRG91YmxlKHRoaXMuX2NvbW1vbkJpdHMpfSxzYy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3ZhciBlPWZpLmRvdWJsZVRvTG9uZ0JpdHModCk7cmV0dXJuIHRoaXMuX2lzRmlyc3Q/KHRoaXMuX2NvbW1vbkJpdHM9ZSx0aGlzLl9jb21tb25TaWduRXhwPXNjLnNpZ25FeHBCaXRzKHRoaXMuX2NvbW1vbkJpdHMpLHRoaXMuX2lzRmlyc3Q9ITEsbnVsbCk6c2Muc2lnbkV4cEJpdHMoZSkhPT10aGlzLl9jb21tb25TaWduRXhwPyh0aGlzLl9jb21tb25CaXRzPTAsbnVsbCk6KHRoaXMuX2NvbW1vbk1hbnRpc3NhQml0c0NvdW50PXNjLm51bUNvbW1vbk1vc3RTaWdNYW50aXNzYUJpdHModGhpcy5fY29tbW9uQml0cyxlKSx2b2lkKHRoaXMuX2NvbW1vbkJpdHM9c2MuemVyb0xvd2VyQml0cyh0aGlzLl9jb21tb25CaXRzLDY0LSgxMit0aGlzLl9jb21tb25NYW50aXNzYUJpdHNDb3VudCkpKSl9LHNjLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1maS5sb25nQml0c1RvRG91YmxlKHQpLG49IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiK2ZpLnRvQmluYXJ5U3RyaW5nKHQpLHI9bi5zdWJzdHJpbmcobi5sZW5ndGgtNjQpO3JldHVybiByLnN1YnN0cmluZygwLDEpKyIgICIrci5zdWJzdHJpbmcoMSwxMikrIihleHApICIrci5zdWJzdHJpbmcoMTIpKyIgWyAiK2UrIiBdIn19LHNjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxzYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gc2N9LHNjLmdldEJpdD1mdW5jdGlvbih0LGUpe3JldHVybiB0JjE8PGU/MTowfSxzYy5zaWduRXhwQml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4+NTJ9LHNjLnplcm9Mb3dlckJpdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCZ+KCgxPDxlKS0xKX0sc2MubnVtQ29tbW9uTW9zdFNpZ01hbnRpc3NhQml0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9NTI7cj49MDtyLS0pe2lmKHNjLmdldEJpdCh0LHIpIT09c2MuZ2V0Qml0KGUscikpcmV0dXJuIG47bisrfXJldHVybiA1Mn07dmFyIGFjPWZ1bmN0aW9uKCl7dGhpcy5fY29tbW9uQ29vcmQ9bnVsbCx0aGlzLl9jY0ZpbHRlcj1uZXcgY2N9LHVjPXtDb21tb25Db29yZGluYXRlRmlsdGVyOntjb25maWd1cmFibGU6ITB9LFRyYW5zbGF0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O2FjLnByb3RvdHlwZS5hZGRDb21tb25CaXRzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBsYyh0aGlzLl9jb21tb25Db29yZCk7dC5hcHBseShlKSx0Lmdlb21ldHJ5Q2hhbmdlZCgpfSxhYy5wcm90b3R5cGUucmVtb3ZlQ29tbW9uQml0cz1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5fY29tbW9uQ29vcmQueCYmMD09PXRoaXMuX2NvbW1vbkNvb3JkLnkpcmV0dXJuIHQ7dmFyIGU9bmV3IHZpKHRoaXMuX2NvbW1vbkNvb3JkKTtlLng9LWUueCxlLnk9LWUueTt2YXIgbj1uZXcgbGMoZSk7cmV0dXJuIHQuYXBwbHkobiksdC5nZW9tZXRyeUNoYW5nZWQoKSx0fSxhYy5wcm90b3R5cGUuZ2V0Q29tbW9uQ29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tb25Db29yZH0sYWMucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt0LmFwcGx5KHRoaXMuX2NjRmlsdGVyKSx0aGlzLl9jb21tb25Db29yZD10aGlzLl9jY0ZpbHRlci5nZXRDb21tb25Db29yZGluYXRlKCl9LGFjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxhYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYWN9LHVjLkNvbW1vbkNvb3JkaW5hdGVGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGNjfSx1Yy5UcmFuc2xhdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBsY30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYWMsdWMpO3ZhciBjYz1mdW5jdGlvbigpe3RoaXMuX2NvbW1vbkJpdHNYPW5ldyBzYyx0aGlzLl9jb21tb25CaXRzWT1uZXcgc2N9O2NjLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dGhpcy5fY29tbW9uQml0c1guYWRkKHQueCksdGhpcy5fY29tbW9uQml0c1kuYWRkKHQueSl9LGNjLnByb3RvdHlwZS5nZXRDb21tb25Db29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2aSh0aGlzLl9jb21tb25CaXRzWC5nZXRDb21tb24oKSx0aGlzLl9jb21tb25CaXRzWS5nZXRDb21tb24oKSl9LGNjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblthb119LGNjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBjY307dmFyIGxjPWZ1bmN0aW9uKCl7dGhpcy50cmFucz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnRyYW5zPXR9O2xjLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldE9yZGluYXRlKGUsMCkrdGhpcy50cmFucy54LHI9dC5nZXRPcmRpbmF0ZShlLDEpK3RoaXMudHJhbnMueTt0LnNldE9yZGluYXRlKGUsMCxuKSx0LnNldE9yZGluYXRlKGUsMSxyKX0sbGMucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSxsYy5wcm90b3R5cGUuaXNHZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1dvXX0sbGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGxjfTt2YXIgaGM9ZnVuY3Rpb24odCxlKXt0aGlzLl9nZW9tPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX3NuYXBUb2xlcmFuY2U9bnVsbCx0aGlzLl9jYnI9bnVsbCx0aGlzLl9nZW9tWzBdPXQsdGhpcy5fZ2VvbVsxXT1lLHRoaXMuY29tcHV0ZVNuYXBUb2xlcmFuY2UoKX07aGMucHJvdG90eXBlLnNlbGZTbmFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcmModCkuc25hcFRvKHQsdGhpcy5fc25hcFRvbGVyYW5jZSl9LGhjLnByb3RvdHlwZS5yZW1vdmVDb21tb25CaXRzPWZ1bmN0aW9uKHQpe3RoaXMuX2Nicj1uZXcgYWMsdGhpcy5fY2JyLmFkZCh0WzBdKSx0aGlzLl9jYnIuYWRkKHRbMV0pO3ZhciBlPW5ldyBBcnJheSgyKS5maWxsKG51bGwpO3JldHVybiBlWzBdPXRoaXMuX2Nici5yZW1vdmVDb21tb25CaXRzKHRbMF0uY29weSgpKSxlWzFdPXRoaXMuX2Nici5yZW1vdmVDb21tb25CaXRzKHRbMV0uY29weSgpKSxlfSxoYy5wcm90b3R5cGUucHJlcGFyZVJlc3VsdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2JyLmFkZENvbW1vbkJpdHModCksdH0saGMucHJvdG90eXBlLmdldFJlc3VsdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc25hcCh0aGlzLl9nZW9tKSxuPU9jLm92ZXJsYXlPcChlWzBdLGVbMV0sdCk7cmV0dXJuIHRoaXMucHJlcGFyZVJlc3VsdChuKX0saGMucHJvdG90eXBlLmNoZWNrVmFsaWQ9ZnVuY3Rpb24odCl7dC5pc1ZhbGlkKCl8fGtpLm91dC5wcmludGxuKCJTbmFwcGVkIGdlb21ldHJ5IGlzIGludmFsaWQiKX0saGMucHJvdG90eXBlLmNvbXB1dGVTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKCl7dGhpcy5fc25hcFRvbGVyYW5jZT1yYy5jb21wdXRlT3ZlcmxheVNuYXBUb2xlcmFuY2UodGhpcy5fZ2VvbVswXSx0aGlzLl9nZW9tWzFdKX0saGMucHJvdG90eXBlLnNuYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZW1vdmVDb21tb25CaXRzKHQpO3JldHVybiByYy5zbmFwKGVbMF0sZVsxXSx0aGlzLl9zbmFwVG9sZXJhbmNlKX0saGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGhjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBoY30saGMub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IGhjKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LGhjLnVuaW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhjLm92ZXJsYXlPcCh0LGUsT2MuVU5JT04pfSxoYy5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gaGMub3ZlcmxheU9wKHQsZSxPYy5JTlRFUlNFQ1RJT04pfSxoYy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhjLm92ZXJsYXlPcCh0LGUsT2MuU1lNRElGRkVSRU5DRSl9LGhjLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaGMub3ZlcmxheU9wKHQsZSxPYy5ESUZGRVJFTkNFKX07dmFyIGZjPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZ2VvbT1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9nZW9tWzBdPXQsdGhpcy5fZ2VvbVsxXT1lfTtmYy5wcm90b3R5cGUuZ2V0UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbCxuPSExLHI9bnVsbDt0cnl7ZT1PYy5vdmVybGF5T3AodGhpcy5fZ2VvbVswXSx0aGlzLl9nZW9tWzFdLHQpO249ITB9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgV2kpKXRocm93IHQ7cj10fWlmKCFuKXRyeXtlPWhjLm92ZXJsYXlPcCh0aGlzLl9nZW9tWzBdLHRoaXMuX2dlb21bMV0sdCl9Y2F0Y2godCl7dGhyb3cgdCBpbnN0YW5jZW9mIFdpP3I6dH1yZXR1cm4gZX0sZmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGZjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBmY30sZmMub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IGZjKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LGZjLnVuaW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZjLm92ZXJsYXlPcCh0LGUsT2MuVU5JT04pfSxmYy5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmMub3ZlcmxheU9wKHQsZSxPYy5JTlRFUlNFQ1RJT04pfSxmYy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZjLm92ZXJsYXlPcCh0LGUsT2MuU1lNRElGRkVSRU5DRSl9LGZjLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmMub3ZlcmxheU9wKHQsZSxPYy5ESUZGRVJFTkNFKX07dmFyIHBjPWZ1bmN0aW9uKCl7dGhpcy5tY2U9bnVsbCx0aGlzLmNoYWluSW5kZXg9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5tY2U9dCx0aGlzLmNoYWluSW5kZXg9ZX07cGMucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSl7dGhpcy5tY2UuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbih0aGlzLmNoYWluSW5kZXgsdC5tY2UsdC5jaGFpbkluZGV4LGUpfSxwYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBjfTt2YXIgZGM9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX2xhYmVsPW51bGwsdGhpcy5feFZhbHVlPW51bGwsdGhpcy5fZXZlbnRUeXBlPW51bGwsdGhpcy5faW5zZXJ0RXZlbnQ9bnVsbCx0aGlzLl9kZWxldGVFdmVudEluZGV4PW51bGwsdGhpcy5fb2JqPW51bGwsMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9ldmVudFR5cGU9dC5ERUxFVEUsdGhpcy5feFZhbHVlPWUsdGhpcy5faW5zZXJ0RXZlbnQ9bn1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07dGhpcy5fZXZlbnRUeXBlPXQuSU5TRVJULHRoaXMuX2xhYmVsPXIsdGhpcy5feFZhbHVlPWksdGhpcy5fb2JqPW99fSxnYz17SU5TRVJUOntjb25maWd1cmFibGU6ITB9LERFTEVURTp7Y29uZmlndXJhYmxlOiEwfX07ZGMucHJvdG90eXBlLmlzRGVsZXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50VHlwZT09PWRjLkRFTEVURX0sZGMucHJvdG90eXBlLnNldERlbGV0ZUV2ZW50SW5kZXg9ZnVuY3Rpb24odCl7dGhpcy5fZGVsZXRlRXZlbnRJbmRleD10fSxkYy5wcm90b3R5cGUuZ2V0T2JqZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29ian0sZGMucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl94VmFsdWU8ZS5feFZhbHVlPy0xOnRoaXMuX3hWYWx1ZT5lLl94VmFsdWU/MTp0aGlzLl9ldmVudFR5cGU8ZS5fZXZlbnRUeXBlPy0xOnRoaXMuX2V2ZW50VHlwZT5lLl9ldmVudFR5cGU/MTowfSxkYy5wcm90b3R5cGUuZ2V0SW5zZXJ0RXZlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5zZXJ0RXZlbnR9LGRjLnByb3RvdHlwZS5pc0luc2VydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudFR5cGU9PT1kYy5JTlNFUlR9LGRjLnByb3RvdHlwZS5pc1NhbWVMYWJlbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXRoaXMuX2xhYmVsJiZ0aGlzLl9sYWJlbD09PXQuX2xhYmVsfSxkYy5wcm90b3R5cGUuZ2V0RGVsZXRlRXZlbnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWxldGVFdmVudEluZGV4fSxkYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSxkYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZGN9LGdjLklOU0VSVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZ2MuREVMRVRFLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkYyxnYyk7dmFyIHljPWZ1bmN0aW9uKCl7fTt5Yy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0seWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHljfTt2YXIgbWM9ZnVuY3Rpb24oKXt0aGlzLl9oYXNJbnRlcnNlY3Rpb249ITEsdGhpcy5faGFzUHJvcGVyPSExLHRoaXMuX2hhc1Byb3BlckludGVyaW9yPSExLHRoaXMuX3Byb3BlckludGVyc2VjdGlvblBvaW50PW51bGwsdGhpcy5fbGk9bnVsbCx0aGlzLl9pbmNsdWRlUHJvcGVyPW51bGwsdGhpcy5fcmVjb3JkSXNvbGF0ZWQ9bnVsbCx0aGlzLl9pc1NlbGZJbnRlcnNlY3Rpb249bnVsbCx0aGlzLl9udW1JbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1UZXN0cz0wLHRoaXMuX2JkeU5vZGVzPW51bGwsdGhpcy5faXNEb25lPSExLHRoaXMuX2lzRG9uZVdoZW5Qcm9wZXJJbnQ9ITE7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX2xpPXQsdGhpcy5faW5jbHVkZVByb3Blcj1lLHRoaXMuX3JlY29yZElzb2xhdGVkPW59O21jLnByb3RvdHlwZS5pc1RyaXZpYWxJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7aWYodD09PW4mJjE9PT10aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKSl7aWYobWMuaXNBZGphY2VudFNlZ21lbnRzKGUscikpcmV0dXJuITA7aWYodC5pc0Nsb3NlZCgpKXt2YXIgaT10LmdldE51bVBvaW50cygpLTE7aWYoMD09PWUmJnI9PT1pfHwwPT09ciYmZT09PWkpcmV0dXJuITB9fXJldHVybiExfSxtYy5wcm90b3R5cGUuZ2V0UHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnR9LG1jLnByb3RvdHlwZS5zZXRJc0RvbmVJZlByb3BlckludD1mdW5jdGlvbih0KXt0aGlzLl9pc0RvbmVXaGVuUHJvcGVySW50PXR9LG1jLnByb3RvdHlwZS5oYXNQcm9wZXJJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcn0sbWMucHJvdG90eXBlLmlzQm91bmRhcnlQb2ludEludGVybmFsPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLmdldENvb3JkaW5hdGUoKTtpZih0LmlzSW50ZXJzZWN0aW9uKHIpKXJldHVybiEwfXJldHVybiExfSxtYy5wcm90b3R5cGUuaGFzUHJvcGVySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3Blcn0sbWMucHJvdG90eXBlLmhhc0ludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNJbnRlcnNlY3Rpb259LG1jLnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNEb25lfSxtYy5wcm90b3R5cGUuaXNCb3VuZGFyeVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPT1lJiYhKCF0aGlzLmlzQm91bmRhcnlQb2ludEludGVybmFsKHQsZVswXSkmJiF0aGlzLmlzQm91bmRhcnlQb2ludEludGVybmFsKHQsZVsxXSkpfSxtYy5wcm90b3R5cGUuc2V0Qm91bmRhcnlOb2Rlcz1mdW5jdGlvbih0LGUpe3RoaXMuX2JkeU5vZGVzPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX2JkeU5vZGVzWzBdPXQsdGhpcy5fYmR5Tm9kZXNbMV09ZX0sbWMucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4scil7aWYodD09PW4mJmU9PT1yKXJldHVybiBudWxsO3RoaXMubnVtVGVzdHMrKzt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO3RoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJih0aGlzLl9yZWNvcmRJc29sYXRlZCYmKHQuc2V0SXNvbGF0ZWQoITEpLG4uc2V0SXNvbGF0ZWQoITEpKSx0aGlzLl9udW1JbnRlcnNlY3Rpb25zKyssdGhpcy5pc1RyaXZpYWxJbnRlcnNlY3Rpb24odCxlLG4scil8fCh0aGlzLl9oYXNJbnRlcnNlY3Rpb249ITAsKHRoaXMuX2luY2x1ZGVQcm9wZXJ8fCF0aGlzLl9saS5pc1Byb3BlcigpKSYmKHQuYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxlLDApLG4uYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxyLDEpKSx0aGlzLl9saS5pc1Byb3BlcigpJiYodGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uKDApLmNvcHkoKSx0aGlzLl9oYXNQcm9wZXI9ITAsdGhpcy5faXNEb25lV2hlblByb3BlckludCYmKHRoaXMuX2lzRG9uZT0hMCksdGhpcy5pc0JvdW5kYXJ5UG9pbnQodGhpcy5fbGksdGhpcy5fYmR5Tm9kZXMpfHwodGhpcy5faGFzUHJvcGVySW50ZXJpb3I9ITApKSkpfSxtYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG1jfSxtYy5pc0FkamFjZW50U2VnbWVudHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMT09PU1hdGguYWJzKHQtZSl9O3ZhciB2Yz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuZXZlbnRzPW5ldyB4byx0aGlzLm5PdmVybGFwcz1udWxsfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5wcmVwYXJlRXZlbnRzPWZ1bmN0aW9uKCl7YWEuc29ydCh0aGlzLmV2ZW50cyk7Zm9yKHZhciB0PTA7dDx0aGlzLmV2ZW50cy5zaXplKCk7dCsrKXt2YXIgZT10aGlzLmV2ZW50cy5nZXQodCk7ZS5pc0RlbGV0ZSgpJiZlLmdldEluc2VydEV2ZW50KCkuc2V0RGVsZXRlRXZlbnRJbmRleCh0KX19LGUucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLm5PdmVybGFwcz0wLHRoaXMucHJlcGFyZUV2ZW50cygpO2Zvcih2YXIgZT0wO2U8dGhpcy5ldmVudHMuc2l6ZSgpO2UrKyl7dmFyIG49dGhpcy5ldmVudHMuZ2V0KGUpO2lmKG4uaXNJbnNlcnQoKSYmdGhpcy5wcm9jZXNzT3ZlcmxhcHMoZSxuLmdldERlbGV0ZUV2ZW50SW5kZXgoKSxuLHQpLHQuaXNEb25lKCkpYnJlYWt9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBtYyYmRWkoYXJndW1lbnRzWzBdLHZvKSYmRWkoYXJndW1lbnRzWzFdLHZvKSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO3RoaXMuYWRkRWRnZXMocixyKSx0aGlzLmFkZEVkZ2VzKGksaSksdGhpcy5jb21wdXRlSW50ZXJzZWN0aW9ucyhvKX1lbHNlIGlmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmRWkoYXJndW1lbnRzWzBdLHZvKSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBtYyl7dmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdO2FyZ3VtZW50c1syXT90aGlzLmFkZEVkZ2VzKHMsbnVsbCk6dGhpcy5hZGRFZGdlcyhzKSx0aGlzLmNvbXB1dGVJbnRlcnNlY3Rpb25zKGEpfX0sZS5wcm90b3R5cGUuYWRkRWRnZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmdldE1vbm90b25lQ2hhaW5FZGdlKCkscj1uLmdldFN0YXJ0SW5kZXhlcygpLGk9MDtpPHIubGVuZ3RoLTE7aSsrKXt2YXIgbz1uZXcgcGMobixpKSxzPW5ldyBkYyhlLG4uZ2V0TWluWChpKSxvKTt0aGlzLmV2ZW50cy5hZGQocyksdGhpcy5ldmVudHMuYWRkKG5ldyBkYyhuLmdldE1heFgoaSkscykpfX0sZS5wcm90b3R5cGUucHJvY2Vzc092ZXJsYXBzPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT1uLmdldE9iamVjdCgpLG89dDtvPGU7bysrKXt2YXIgcz10aGlzLmV2ZW50cy5nZXQobyk7aWYocy5pc0luc2VydCgpKXt2YXIgYT1zLmdldE9iamVjdCgpO24uaXNTYW1lTGFiZWwocyl8fChpLmNvbXB1dGVJbnRlcnNlY3Rpb25zKGEsciksdGhpcy5uT3ZlcmxhcHMrKyl9fX0sZS5wcm90b3R5cGUuYWRkRWRnZXM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHQ9YXJndW1lbnRzWzBdLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTt0aGlzLmFkZEVkZ2UoZSxlKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO3RoaXMuYWRkRWRnZShpLG4pfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oeWMpLF9jPWZ1bmN0aW9uKCl7dGhpcy5fbWluPWZpLlBPU0lUSVZFX0lORklOSVRZLHRoaXMuX21heD1maS5ORUdBVElWRV9JTkZJTklUWX0seGM9e05vZGVDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9fTtfYy5wcm90b3R5cGUuZ2V0TWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbn0sX2MucHJvdG90eXBlLmludGVyc2VjdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4hKHRoaXMuX21pbj5lfHx0aGlzLl9tYXg8dCl9LF9jLnByb3RvdHlwZS5nZXRNYXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4fSxfYy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWGkudG9MaW5lU3RyaW5nKG5ldyB2aSh0aGlzLl9taW4sMCksbmV3IHZpKHRoaXMuX21heCwwKSl9LF9jLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxfYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gX2N9LHhjLk5vZGVDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiB3Y30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoX2MseGMpO3ZhciB3Yz1mdW5jdGlvbigpe307d2MucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZSxpPShuLl9taW4rbi5fbWF4KS8yLG89KHIuX21pbityLl9tYXgpLzI7cmV0dXJuIGk8bz8tMTppPm8/MTowfSx3Yy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5beWldfSx3Yy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gd2N9O3ZhciBiYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX2l0ZW09bnVsbDt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fbWluPWUsdGhpcy5fbWF4PW4sdGhpcy5faXRlbT1yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuaW50ZXJzZWN0cyh0LGUpKXJldHVybiBudWxsO24udmlzaXRJdGVtKHRoaXMuX2l0ZW0pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShfYyksRGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9ub2RlMT1udWxsLHRoaXMuX25vZGUyPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX25vZGUxPWUsdGhpcy5fbm9kZTI9bix0aGlzLmJ1aWxkRXh0ZW50KHRoaXMuX25vZGUxLHRoaXMuX25vZGUyKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuYnVpbGRFeHRlbnQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9taW49TWF0aC5taW4odC5fbWluLGUuX21pbiksdGhpcy5fbWF4PU1hdGgubWF4KHQuX21heCxlLl9tYXgpfSxlLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuaW50ZXJzZWN0cyh0LGUpKXJldHVybiBudWxsO251bGwhPT10aGlzLl9ub2RlMSYmdGhpcy5fbm9kZTEucXVlcnkodCxlLG4pLG51bGwhPT10aGlzLl9ub2RlMiYmdGhpcy5fbm9kZTIucXVlcnkodCxlLG4pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShfYyksRWM9ZnVuY3Rpb24oKXt0aGlzLl9sZWF2ZXM9bmV3IHhvLHRoaXMuX3Jvb3Q9bnVsbCx0aGlzLl9sZXZlbD0wfTtFYy5wcm90b3R5cGUuYnVpbGRUcmVlPWZ1bmN0aW9uKCl7YWEuc29ydCh0aGlzLl9sZWF2ZXMsbmV3IF9jLk5vZGVDb21wYXJhdG9yKTtmb3IodmFyIHQ9dGhpcy5fbGVhdmVzLGU9bnVsbCxuPW5ldyB4bzs7KXtpZih0aGlzLmJ1aWxkTGV2ZWwodCxuKSwxPT09bi5zaXplKCkpcmV0dXJuIG4uZ2V0KDApO2U9dCx0PW4sbj1lfX0sRWMucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUsbil7aWYobnVsbCE9PXRoaXMuX3Jvb3QpdGhyb3cgbmV3IEVycm9yKCJJbmRleCBjYW5ub3QgYmUgYWRkZWQgdG8gb25jZSBpdCBoYXMgYmVlbiBxdWVyaWVkIik7dGhpcy5fbGVhdmVzLmFkZChuZXcgYmModCxlLG4pKX0sRWMucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmluaXQoKSx0aGlzLl9yb290LnF1ZXJ5KHQsZSxuKX0sRWMucHJvdG90eXBlLmJ1aWxkUm9vdD1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLl9yb290KXJldHVybiBudWxsO3RoaXMuX3Jvb3Q9dGhpcy5idWlsZFRyZWUoKX0sRWMucHJvdG90eXBlLnByaW50Tm9kZT1mdW5jdGlvbih0KXtraS5vdXQucHJpbnRsbihYaS50b0xpbmVTdHJpbmcobmV3IHZpKHQuX21pbix0aGlzLl9sZXZlbCksbmV3IHZpKHQuX21heCx0aGlzLl9sZXZlbCkpKX0sRWMucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5fcm9vdClyZXR1cm4gbnVsbDt0aGlzLmJ1aWxkUm9vdCgpfSxFYy5wcm90b3R5cGUuYnVpbGRMZXZlbD1mdW5jdGlvbih0LGUpe3RoaXMuX2xldmVsKyssZS5jbGVhcigpO2Zvcih2YXIgbj0wO248dC5zaXplKCk7bis9Mil7dmFyIHI9dC5nZXQobik7aWYobnVsbD09PShuKzE8dC5zaXplKCk/dC5nZXQobik6bnVsbCkpZS5hZGQocik7ZWxzZXt2YXIgaT1uZXcgRGModC5nZXQobiksdC5nZXQobisxKSk7ZS5hZGQoaSl9fX0sRWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEVjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBFY307dmFyIENjPWZ1bmN0aW9uKCl7dGhpcy5faXRlbXM9bmV3IHhvfTtDYy5wcm90b3R5cGUudmlzaXRJdGVtPWZ1bmN0aW9uKHQpe3RoaXMuX2l0ZW1zLmFkZCh0KX0sQ2MucHJvdG90eXBlLmdldEl0ZW1zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2l0ZW1zfSxDYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bcmFdfSxDYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQ2N9O3ZhciBTYz1mdW5jdGlvbigpe3RoaXMuX2luZGV4PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKCFFaSh0LGxzKSl0aHJvdyBuZXcgaGk7dGhpcy5faW5kZXg9bmV3IEljKHQpfSxBYz17U2VnbWVudFZpc2l0b3I6e2NvbmZpZ3VyYWJsZTohMH0sSW50ZXJ2YWxJbmRleGVkR2VvbWV0cnk6e2NvbmZpZ3VyYWJsZTohMH19O1NjLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHRvKHQpLG49bmV3IE5jKGUpO3JldHVybiB0aGlzLl9pbmRleC5xdWVyeSh0LnksdC55LG4pLGUuZ2V0TG9jYXRpb24oKX0sU2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1dhXX0sU2MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFNjfSxBYy5TZWdtZW50VmlzaXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTmN9LEFjLkludGVydmFsSW5kZXhlZEdlb21ldHJ5LmdldD1mdW5jdGlvbigpe3JldHVybiBJY30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2MsQWMpO3ZhciBOYz1mdW5jdGlvbigpe3RoaXMuX2NvdW50ZXI9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fY291bnRlcj10fTtOYy5wcm90b3R5cGUudmlzaXRJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7dGhpcy5fY291bnRlci5jb3VudFNlZ21lbnQoZS5nZXRDb29yZGluYXRlKDApLGUuZ2V0Q29vcmRpbmF0ZSgxKSl9LE5jLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltyYV19LE5jLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBOY307dmFyIEljPWZ1bmN0aW9uKCl7dGhpcy5faW5kZXg9bmV3IEVjO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmluaXQodCl9O0ljLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1GdS5nZXRMaW5lcyh0KS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkuZ2V0Q29vcmRpbmF0ZXMoKTt0aGlzLmFkZExpbmUobil9fSxJYy5wcm90b3R5cGUuYWRkTGluZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPHQubGVuZ3RoO2UrKyl7dmFyIG49bmV3IGJhKHRbZS0xXSx0W2VdKSxyPU1hdGgubWluKG4ucDAueSxuLnAxLnkpLGk9TWF0aC5tYXgobi5wMC55LG4ucDEueSk7dGhpcy5faW5kZXguaW5zZXJ0KHIsaSxuKX19LEljLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1uZXcgQ2M7cmV0dXJuIHRoaXMuX2luZGV4LnF1ZXJ5KHQsZSxuKSxuLmdldEl0ZW1zKCl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXTt0aGlzLl9pbmRleC5xdWVyeShyLGksbyl9fSxJYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEljfTt2YXIgTWM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe2lmKHQuY2FsbCh0aGlzKSx0aGlzLl9wYXJlbnRHZW9tPW51bGwsdGhpcy5fbGluZUVkZ2VNYXA9bmV3IEVzLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9bnVsbCx0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlPSEwLHRoaXMuX2FyZ0luZGV4PW51bGwsdGhpcy5fYm91bmRhcnlOb2Rlcz1udWxsLHRoaXMuX2hhc1Rvb0Zld1BvaW50cz0hMSx0aGlzLl9pbnZhbGlkUG9pbnQ9bnVsbCx0aGlzLl9hcmVhUHRMb2NhdG9yPW51bGwsdGhpcy5fcHRMb2NhdG9yPW5ldyBUdSwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9dW8uT0dDX1NGU19CT1VOREFSWV9SVUxFO3RoaXMuX2FyZ0luZGV4PWUsdGhpcy5fcGFyZW50R2VvbT1uLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9cixudWxsIT09biYmdGhpcy5hZGQobil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO3RoaXMuX2FyZ0luZGV4PWksdGhpcy5fcGFyZW50R2VvbT1vLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9cyxudWxsIT09byYmdGhpcy5hZGQobyl9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pbnNlcnRCb3VuZGFyeVBvaW50PWZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcy5fbm9kZXMuYWRkTm9kZShuKS5nZXRMYWJlbCgpLGk9MTtyLmdldExvY2F0aW9uKHQsRnMuT04pPT09YmkuQk9VTkRBUlkmJmkrKzt2YXIgbz1lLmRldGVybWluZUJvdW5kYXJ5KHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGUsaSk7ci5zZXRMb2NhdGlvbih0LG8pfSxlLnByb3RvdHlwZS5jb21wdXRlU2VsZk5vZGVzPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5jb21wdXRlU2VsZk5vZGVzKHQsZSwhMSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXSxpPW5ldyBtYyhhcmd1bWVudHNbMF0sITAsITEpO2kuc2V0SXNEb25lSWZQcm9wZXJJbnQocik7dmFyIG89dGhpcy5jcmVhdGVFZGdlU2V0SW50ZXJzZWN0b3IoKSxzPXRoaXMuX3BhcmVudEdlb20gaW5zdGFuY2VvZiBwc3x8dGhpcy5fcGFyZW50R2VvbSBpbnN0YW5jZW9mIGhzfHx0aGlzLl9wYXJlbnRHZW9tIGluc3RhbmNlb2YgZHMsYT1ufHwhcztyZXR1cm4gby5jb21wdXRlSW50ZXJzZWN0aW9ucyh0aGlzLl9lZGdlcyxpLGEpLHRoaXMuYWRkU2VsZkludGVyc2VjdGlvbk5vZGVzKHRoaXMuX2FyZ0luZGV4KSxpfX0sZS5wcm90b3R5cGUuY29tcHV0ZVNwbGl0RWRnZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2VkZ2VzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5laUxpc3QuYWRkU3BsaXRFZGdlcyh0KX19LGUucHJvdG90eXBlLmNvbXB1dGVFZGdlSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IG1jKGUsbiwhMCk7cmV0dXJuIHIuc2V0Qm91bmRhcnlOb2Rlcyh0aGlzLmdldEJvdW5kYXJ5Tm9kZXMoKSx0LmdldEJvdW5kYXJ5Tm9kZXMoKSksdGhpcy5jcmVhdGVFZGdlU2V0SW50ZXJzZWN0b3IoKS5jb21wdXRlSW50ZXJzZWN0aW9ucyh0aGlzLl9lZGdlcyx0Ll9lZGdlcyxyKSxyfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXJlbnRHZW9tfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeU5vZGVSdWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGV9LGUucHJvdG90eXBlLmhhc1Rvb0Zld1BvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNUb29GZXdQb2ludHN9LGUucHJvdG90eXBlLmFkZFBvaW50PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBjcyl7dmFyIHQ9YXJndW1lbnRzWzBdLmdldENvb3JkaW5hdGUoKTt0aGlzLmluc2VydFBvaW50KHRoaXMuX2FyZ0luZGV4LHQsYmkuSU5URVJJT1IpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsZSxiaS5JTlRFUklPUil9fSxlLnByb3RvdHlwZS5hZGRQb2x5Z29uPWZ1bmN0aW9uKHQpe3RoaXMuYWRkUG9seWdvblJpbmcodC5nZXRFeHRlcmlvclJpbmcoKSxiaS5FWFRFUklPUixiaS5JTlRFUklPUik7Zm9yKHZhciBlPTA7ZTx0LmdldE51bUludGVyaW9yUmluZygpO2UrKyl7dmFyIG49dC5nZXRJbnRlcmlvclJpbmdOKGUpO3RoaXMuYWRkUG9seWdvblJpbmcobixiaS5JTlRFUklPUixiaS5FWFRFUklPUil9fSxlLnByb3RvdHlwZS5hZGRFZGdlPWZ1bmN0aW9uKHQpe3RoaXMuaW5zZXJ0RWRnZSh0KTt2YXIgZT10LmdldENvb3JkaW5hdGVzKCk7dGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCxlWzBdLGJpLkJPVU5EQVJZKSx0aGlzLmluc2VydFBvaW50KHRoaXMuX2FyZ0luZGV4LGVbZS5sZW5ndGgtMV0sYmkuQk9VTkRBUlkpfSxlLnByb3RvdHlwZS5hZGRMaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPURvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKHQuZ2V0Q29vcmRpbmF0ZXMoKSk7aWYoZS5sZW5ndGg8MilyZXR1cm4gdGhpcy5faGFzVG9vRmV3UG9pbnRzPSEwLHRoaXMuX2ludmFsaWRQb2ludD1lWzBdLG51bGw7dmFyIG49bmV3IGN1KGUsbmV3IGpzKHRoaXMuX2FyZ0luZGV4LGJpLklOVEVSSU9SKSk7dGhpcy5fbGluZUVkZ2VNYXAucHV0KHQsbiksdGhpcy5pbnNlcnRFZGdlKG4pLFppLmlzVHJ1ZShlLmxlbmd0aD49MiwiZm91bmQgTGluZVN0cmluZyB3aXRoIHNpbmdsZSBwb2ludCIpLHRoaXMuaW5zZXJ0Qm91bmRhcnlQb2ludCh0aGlzLl9hcmdJbmRleCxlWzBdKSx0aGlzLmluc2VydEJvdW5kYXJ5UG9pbnQodGhpcy5fYXJnSW5kZXgsZVtlLmxlbmd0aC0xXSl9LGUucHJvdG90eXBlLmdldEludmFsaWRQb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnZhbGlkUG9pbnR9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5UG9pbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZ2V0Qm91bmRhcnlOb2RlcygpLGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpLG49MCxyPXQuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2VbbisrXT1pLmdldENvb3JkaW5hdGUoKS5jb3B5KCl9cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5Tm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX2JvdW5kYXJ5Tm9kZXMmJih0aGlzLl9ib3VuZGFyeU5vZGVzPXRoaXMuX25vZGVzLmdldEJvdW5kYXJ5Tm9kZXModGhpcy5fYXJnSW5kZXgpKSx0aGlzLl9ib3VuZGFyeU5vZGVzfSxlLnByb3RvdHlwZS5hZGRTZWxmSW50ZXJzZWN0aW9uTm9kZT1mdW5jdGlvbih0LGUsbil7aWYodGhpcy5pc0JvdW5kYXJ5Tm9kZSh0LGUpKXJldHVybiBudWxsO249PT1iaS5CT1VOREFSWSYmdGhpcy5fdXNlQm91bmRhcnlEZXRlcm1pbmF0aW9uUnVsZT90aGlzLmluc2VydEJvdW5kYXJ5UG9pbnQodCxlKTp0aGlzLmluc2VydFBvaW50KHQsZSxuKX0sZS5wcm90b3R5cGUuYWRkUG9seWdvblJpbmc9ZnVuY3Rpb24odCxlLG4pe2lmKHQuaXNFbXB0eSgpKXJldHVybiBudWxsO3ZhciByPURvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKHQuZ2V0Q29vcmRpbmF0ZXMoKSk7aWYoci5sZW5ndGg8NClyZXR1cm4gdGhpcy5faGFzVG9vRmV3UG9pbnRzPSEwLHRoaXMuX2ludmFsaWRQb2ludD1yWzBdLG51bGw7dmFyIGk9ZSxvPW47ZW8uaXNDQ1cocikmJihpPW4sbz1lKTt2YXIgcz1uZXcgY3UocixuZXcganModGhpcy5fYXJnSW5kZXgsYmkuQk9VTkRBUlksaSxvKSk7dGhpcy5fbGluZUVkZ2VNYXAucHV0KHQscyksdGhpcy5pbnNlcnRFZGdlKHMpLHRoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsclswXSxiaS5CT1VOREFSWSl9LGUucHJvdG90eXBlLmluc2VydFBvaW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLl9ub2Rlcy5hZGROb2RlKGUpLGk9ci5nZXRMYWJlbCgpO251bGw9PT1pP3IuX2xhYmVsPW5ldyBqcyh0LG4pOmkuc2V0TG9jYXRpb24odCxuKX0sZS5wcm90b3R5cGUuY3JlYXRlRWRnZVNldEludGVyc2VjdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2Y30sZS5wcm90b3R5cGUuYWRkU2VsZkludGVyc2VjdGlvbk5vZGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9lZGdlcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOylmb3IodmFyIG49ZS5uZXh0KCkscj1uLmdldExhYmVsKCkuZ2V0TG9jYXRpb24odCksaT1uLmVpTGlzdC5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7dGhpcy5hZGRTZWxmSW50ZXJzZWN0aW9uTm9kZSh0LG8uY29vcmQscil9fSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXtpZigxIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuYWRkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF07aWYoZS5pc0VtcHR5KCkpcmV0dXJuIG51bGw7aWYoZSBpbnN0YW5jZW9mIGRzJiYodGhpcy5fdXNlQm91bmRhcnlEZXRlcm1pbmF0aW9uUnVsZT0hMSksZSBpbnN0YW5jZW9mIGhzKXRoaXMuYWRkUG9seWdvbihlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBhcyl0aGlzLmFkZExpbmVTdHJpbmcoZSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgY3MpdGhpcy5hZGRQb2ludChlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBmcyl0aGlzLmFkZENvbGxlY3Rpb24oZSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgWm8pdGhpcy5hZGRDb2xsZWN0aW9uKGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGRzKXRoaXMuYWRkQ29sbGVjdGlvbihlKTtlbHNle2lmKCEoZSBpbnN0YW5jZW9mIEhvKSl0aHJvdyBuZXcgRXJyb3IoZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7dGhpcy5hZGRDb2xsZWN0aW9uKGUpfX0sZS5wcm90b3R5cGUuYWRkQ29sbGVjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuZ2V0TnVtR2VvbWV0cmllcygpO2UrKyl7dmFyIG49dC5nZXRHZW9tZXRyeU4oZSk7dGhpcy5hZGQobil9fSxlLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIEVpKHRoaXMuX3BhcmVudEdlb20sbHMpJiZ0aGlzLl9wYXJlbnRHZW9tLmdldE51bUdlb21ldHJpZXMoKT41MD8obnVsbD09PXRoaXMuX2FyZWFQdExvY2F0b3ImJih0aGlzLl9hcmVhUHRMb2NhdG9yPW5ldyBTYyh0aGlzLl9wYXJlbnRHZW9tKSksdGhpcy5fYXJlYVB0TG9jYXRvci5sb2NhdGUodCkpOnRoaXMuX3B0TG9jYXRvci5sb2NhdGUodCx0aGlzLl9wYXJlbnRHZW9tKX0sZS5wcm90b3R5cGUuZmluZEVkZ2U9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9saW5lRWRnZU1hcC5nZXQoZSl9cmV0dXJuIHQucHJvdG90eXBlLmZpbmRFZGdlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5kZXRlcm1pbmVCb3VuZGFyeT1mdW5jdGlvbih0LGUpe3JldHVybiB0LmlzSW5Cb3VuZGFyeShlKT9iaS5CT1VOREFSWTpiaS5JTlRFUklPUn0sZX0oUXMpLEZjPWZ1bmN0aW9uKCl7aWYodGhpcy5fbGk9bmV3IFFpLHRoaXMuX3Jlc3VsdFByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fYXJnPW51bGwsMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldENvbXB1dGF0aW9uUHJlY2lzaW9uKHQuZ2V0UHJlY2lzaW9uTW9kZWwoKSksdGhpcy5fYXJnPW5ldyBBcnJheSgxKS5maWxsKG51bGwpLHRoaXMuX2FyZ1swXT1uZXcgTWMoMCx0KX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj11by5PR0NfU0ZTX0JPVU5EQVJZX1JVTEU7ZS5nZXRQcmVjaXNpb25Nb2RlbCgpLmNvbXBhcmVUbyhuLmdldFByZWNpc2lvbk1vZGVsKCkpPj0wP3RoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24oZS5nZXRQcmVjaXNpb25Nb2RlbCgpKTp0aGlzLnNldENvbXB1dGF0aW9uUHJlY2lzaW9uKG4uZ2V0UHJlY2lzaW9uTW9kZWwoKSksdGhpcy5fYXJnPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX2FyZ1swXT1uZXcgTWMoMCxlLHIpLHRoaXMuX2FyZ1sxXT1uZXcgTWMoMSxuLHIpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXTtpLmdldFByZWNpc2lvbk1vZGVsKCkuY29tcGFyZVRvKG8uZ2V0UHJlY2lzaW9uTW9kZWwoKSk+PTA/dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbihpLmdldFByZWNpc2lvbk1vZGVsKCkpOnRoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24oby5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9hcmc9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fYXJnWzBdPW5ldyBNYygwLGkscyksdGhpcy5fYXJnWzFdPW5ldyBNYygxLG8scyl9fTtGYy5wcm90b3R5cGUuZ2V0QXJnR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FyZ1t0XS5nZXRHZW9tZXRyeSgpfSxGYy5wcm90b3R5cGUuc2V0Q29tcHV0YXRpb25QcmVjaXNpb249ZnVuY3Rpb24odCl7dGhpcy5fcmVzdWx0UHJlY2lzaW9uTW9kZWw9dCx0aGlzLl9saS5zZXRQcmVjaXNpb25Nb2RlbCh0aGlzLl9yZXN1bHRQcmVjaXNpb25Nb2RlbCl9LEZjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxGYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRmN9O3ZhciBUYz1mdW5jdGlvbigpe307VGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFRjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBUY30sVGMubWFwPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmRWkoYXJndW1lbnRzWzFdLFRjLk1hcE9wKSl7Zm9yKHZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPW5ldyB4byxyPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPWUubWFwKHQuZ2V0R2VvbWV0cnlOKHIpKTtudWxsIT09aSYmbi5hZGQoaSl9cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmJ1aWxkR2VvbWV0cnkobil9aWYoRWkoYXJndW1lbnRzWzBdLGdvKSYmRWkoYXJndW1lbnRzWzFdLFRjLk1hcE9wKSl7Zm9yKHZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPW5ldyB4byx1PW8uaXRlcmF0b3IoKTt1Lmhhc05leHQoKTspe3ZhciBjPXUubmV4dCgpLGw9cy5tYXAoYyk7bnVsbCE9PWwmJmEuYWRkKGwpfXJldHVybiBhfX0sVGMuTWFwT3A9ZnVuY3Rpb24oKXt9O3ZhciBPYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3QuY2FsbCh0aGlzLGUsbiksdGhpcy5fcHRMb2NhdG9yPW5ldyBUdSx0aGlzLl9nZW9tRmFjdD1udWxsLHRoaXMuX3Jlc3VsdEdlb209bnVsbCx0aGlzLl9ncmFwaD1udWxsLHRoaXMuX2VkZ2VMaXN0PW5ldyB0dSx0aGlzLl9yZXN1bHRQb2x5TGlzdD1uZXcgeG8sdGhpcy5fcmVzdWx0TGluZUxpc3Q9bmV3IHhvLHRoaXMuX3Jlc3VsdFBvaW50TGlzdD1uZXcgeG8sdGhpcy5fZ3JhcGg9bmV3IFFzKG5ldyBRYSksdGhpcy5fZ2VvbUZhY3Q9ZS5nZXRGYWN0b3J5KCl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmluc2VydFVuaXF1ZUVkZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZWRnZUxpc3QuZmluZEVxdWFsRWRnZSh0KTtpZihudWxsIT09ZSl7dmFyIG49ZS5nZXRMYWJlbCgpLHI9dC5nZXRMYWJlbCgpO2UuaXNQb2ludHdpc2VFcXVhbCh0KXx8KHI9bmV3IGpzKHQuZ2V0TGFiZWwoKSkpLmZsaXAoKTt2YXIgaT1lLmdldERlcHRoKCk7aS5pc051bGwoKSYmaS5hZGQobiksaS5hZGQociksbi5tZXJnZShyKX1lbHNlIHRoaXMuX2VkZ2VMaXN0LmFkZCh0KX0sZS5wcm90b3R5cGUuZ2V0R3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ3JhcGh9LGUucHJvdG90eXBlLmNhbmNlbER1cGxpY2F0ZVJlc3VsdEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyYXBoLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpLG49ZS5nZXRTeW0oKTtlLmlzSW5SZXN1bHQoKSYmbi5pc0luUmVzdWx0KCkmJihlLnNldEluUmVzdWx0KCExKSxuLnNldEluUmVzdWx0KCExKSl9fSxlLnByb3RvdHlwZS5pc0NvdmVyZWRCeUxBPWZ1bmN0aW9uKHQpe3JldHVybiEoIXRoaXMuaXNDb3ZlcmVkKHQsdGhpcy5fcmVzdWx0TGluZUxpc3QpJiYhdGhpcy5pc0NvdmVyZWQodCx0aGlzLl9yZXN1bHRQb2x5TGlzdCkpfSxlLnByb3RvdHlwZS5jb21wdXRlR2VvbWV0cnk9ZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89bmV3IHhvO3JldHVybiBvLmFkZEFsbCh0KSxvLmFkZEFsbChuKSxvLmFkZEFsbChyKSxvLmlzRW1wdHkoKT9lLmNyZWF0ZUVtcHR5UmVzdWx0KGksdGhpcy5fYXJnWzBdLmdldEdlb21ldHJ5KCksdGhpcy5fYXJnWzFdLmdldEdlb21ldHJ5KCksdGhpcy5fZ2VvbUZhY3QpOnRoaXMuX2dlb21GYWN0LmJ1aWxkR2VvbWV0cnkobyl9LGUucHJvdG90eXBlLm1lcmdlU3ltTGFiZWxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyYXBoLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkubWVyZ2VTeW1MYWJlbHMoKX19LGUucHJvdG90eXBlLmlzQ292ZXJlZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZih0aGlzLl9wdExvY2F0b3IubG9jYXRlKHQscikhPT1iaS5FWFRFUklPUilyZXR1cm4hMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUucmVwbGFjZUNvbGxhcHNlZEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyB4byxlPXRoaXMuX2VkZ2VMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtuLmlzQ29sbGFwc2VkKCkmJihlLnJlbW92ZSgpLHQuYWRkKG4uZ2V0Q29sbGFwc2VkRWRnZSgpKSl9dGhpcy5fZWRnZUxpc3QuYWRkQWxsKHQpfSxlLnByb3RvdHlwZS51cGRhdGVOb2RlTGFiZWxsaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyYXBoLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpLG49ZS5nZXRFZGdlcygpLmdldExhYmVsKCk7ZS5nZXRMYWJlbCgpLm1lcmdlKG4pfX0sZS5wcm90b3R5cGUuZ2V0UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZU92ZXJsYXkodCksdGhpcy5fcmVzdWx0R2VvbX0sZS5wcm90b3R5cGUuaW5zZXJ0VW5pcXVlRWRnZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3RoaXMuaW5zZXJ0VW5pcXVlRWRnZShuKX19LGUucHJvdG90eXBlLmNvbXB1dGVPdmVybGF5PWZ1bmN0aW9uKHQpe3RoaXMuY29weVBvaW50cygwKSx0aGlzLmNvcHlQb2ludHMoMSksdGhpcy5fYXJnWzBdLmNvbXB1dGVTZWxmTm9kZXModGhpcy5fbGksITEpLHRoaXMuX2FyZ1sxXS5jb21wdXRlU2VsZk5vZGVzKHRoaXMuX2xpLCExKSx0aGlzLl9hcmdbMF0uY29tcHV0ZUVkZ2VJbnRlcnNlY3Rpb25zKHRoaXMuX2FyZ1sxXSx0aGlzLl9saSwhMCk7dmFyIGU9bmV3IHhvO3RoaXMuX2FyZ1swXS5jb21wdXRlU3BsaXRFZGdlcyhlKSx0aGlzLl9hcmdbMV0uY29tcHV0ZVNwbGl0RWRnZXMoZSksdGhpcy5pbnNlcnRVbmlxdWVFZGdlcyhlKSx0aGlzLmNvbXB1dGVMYWJlbHNGcm9tRGVwdGhzKCksdGhpcy5yZXBsYWNlQ29sbGFwc2VkRWRnZXMoKSxKdS5jaGVja1ZhbGlkKHRoaXMuX2VkZ2VMaXN0LmdldEVkZ2VzKCkpLHRoaXMuX2dyYXBoLmFkZEVkZ2VzKHRoaXMuX2VkZ2VMaXN0LmdldEVkZ2VzKCkpLHRoaXMuY29tcHV0ZUxhYmVsbGluZygpLHRoaXMubGFiZWxJbmNvbXBsZXRlTm9kZXMoKSx0aGlzLmZpbmRSZXN1bHRBcmVhRWRnZXModCksdGhpcy5jYW5jZWxEdXBsaWNhdGVSZXN1bHRFZGdlcygpO3ZhciBuPW5ldyAkcyh0aGlzLl9nZW9tRmFjdCk7bi5hZGQodGhpcy5fZ3JhcGgpLHRoaXMuX3Jlc3VsdFBvbHlMaXN0PW4uZ2V0UG9seWdvbnMoKTt2YXIgcj1uZXcgJHUodGhpcyx0aGlzLl9nZW9tRmFjdCx0aGlzLl9wdExvY2F0b3IpO3RoaXMuX3Jlc3VsdExpbmVMaXN0PXIuYnVpbGQodCk7dmFyIGk9bmV3IHRjKHRoaXMsdGhpcy5fZ2VvbUZhY3QsdGhpcy5fcHRMb2NhdG9yKTt0aGlzLl9yZXN1bHRQb2ludExpc3Q9aS5idWlsZCh0KSx0aGlzLl9yZXN1bHRHZW9tPXRoaXMuY29tcHV0ZUdlb21ldHJ5KHRoaXMuX3Jlc3VsdFBvaW50TGlzdCx0aGlzLl9yZXN1bHRMaW5lTGlzdCx0aGlzLl9yZXN1bHRQb2x5TGlzdCx0KX0sZS5wcm90b3R5cGUubGFiZWxJbmNvbXBsZXRlTm9kZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3B0TG9jYXRvci5sb2NhdGUodC5nZXRDb29yZGluYXRlKCksdGhpcy5fYXJnW2VdLmdldEdlb21ldHJ5KCkpO3QuZ2V0TGFiZWwoKS5zZXRMb2NhdGlvbihlLG4pfSxlLnByb3RvdHlwZS5jb3B5UG9pbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9hcmdbdF0uZ2V0Tm9kZUl0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0aGlzLl9ncmFwaC5hZGROb2RlKG4uZ2V0Q29vcmRpbmF0ZSgpKS5zZXRMYWJlbCh0LG4uZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0KSl9fSxlLnByb3RvdHlwZS5maW5kUmVzdWx0QXJlYUVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncmFwaC5nZXRFZGdlRW5kcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKSxpPXIuZ2V0TGFiZWwoKTtpLmlzQXJlYSgpJiYhci5pc0ludGVyaW9yQXJlYUVkZ2UoKSYmZS5pc1Jlc3VsdE9mT3AoaS5nZXRMb2NhdGlvbigwLEZzLlJJR0hUKSxpLmdldExvY2F0aW9uKDEsRnMuUklHSFQpLHQpJiZyLnNldEluUmVzdWx0KCEwKX19LGUucHJvdG90eXBlLmNvbXB1dGVMYWJlbHNGcm9tRGVwdGhzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2VkZ2VMaXN0Lml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKSxuPWUuZ2V0TGFiZWwoKSxyPWUuZ2V0RGVwdGgoKTtpZighci5pc051bGwoKSl7ci5ub3JtYWxpemUoKTtmb3IodmFyIGk9MDtpPDI7aSsrKSFuLmlzTnVsbChpKSYmbi5pc0FyZWEoKSYmIXIuaXNOdWxsKGkpJiYoMD09PXIuZ2V0RGVsdGEoaSk/bi50b0xpbmUoaSk6KFppLmlzVHJ1ZSghci5pc051bGwoaSxGcy5MRUZUKSwiZGVwdGggb2YgTEVGVCBzaWRlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCIpLG4uc2V0TG9jYXRpb24oaSxGcy5MRUZULHIuZ2V0TG9jYXRpb24oaSxGcy5MRUZUKSksWmkuaXNUcnVlKCFyLmlzTnVsbChpLEZzLlJJR0hUKSwiZGVwdGggb2YgUklHSFQgc2lkZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQiKSxuLnNldExvY2F0aW9uKGksRnMuUklHSFQsci5nZXRMb2NhdGlvbihpLEZzLlJJR0hUKSkpKX19fSxlLnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyYXBoLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkuY29tcHV0ZUxhYmVsbGluZyh0aGlzLl9hcmcpfXRoaXMubWVyZ2VTeW1MYWJlbHMoKSx0aGlzLnVwZGF0ZU5vZGVMYWJlbGxpbmcoKX0sZS5wcm90b3R5cGUubGFiZWxJbmNvbXBsZXRlTm9kZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldExhYmVsKCk7ZS5pc0lzb2xhdGVkKCkmJihuLmlzTnVsbCgwKT90aGlzLmxhYmVsSW5jb21wbGV0ZU5vZGUoZSwwKTp0aGlzLmxhYmVsSW5jb21wbGV0ZU5vZGUoZSwxKSksZS5nZXRFZGdlcygpLnVwZGF0ZUxhYmVsbGluZyhuKX19LGUucHJvdG90eXBlLmlzQ292ZXJlZEJ5QT1mdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuaXNDb3ZlcmVkKHQsdGhpcy5fcmVzdWx0UG9seUxpc3QpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShGYyk7T2Mub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IE9jKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LE9jLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe2lmKHQuaXNFbXB0eSgpfHxlLmlzRW1wdHkoKSlyZXR1cm4gT2MuY3JlYXRlRW1wdHlSZXN1bHQoT2MuSU5URVJTRUNUSU9OLHQsZSx0LmdldEZhY3RvcnkoKSk7aWYodC5pc0dlb21ldHJ5Q29sbGVjdGlvbigpKXt2YXIgbj1lO3JldHVybiBRdS5tYXAodCx7aW50ZXJmYWNlc186ZnVuY3Rpb24oKXtyZXR1cm5bVGMuTWFwT3BdfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaW50ZXJzZWN0aW9uKG4pfX0pfXJldHVybiB0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHQpLHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24oZSksZmMub3ZlcmxheU9wKHQsZSxPYy5JTlRFUlNFQ1RJT04pfSxPYy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7aWYodC5pc0VtcHR5KCl8fGUuaXNFbXB0eSgpKXtpZih0LmlzRW1wdHkoKSYmZS5pc0VtcHR5KCkpcmV0dXJuIE9jLmNyZWF0ZUVtcHR5UmVzdWx0KE9jLlNZTURJRkZFUkVOQ0UsdCxlLHQuZ2V0RmFjdG9yeSgpKTtpZih0LmlzRW1wdHkoKSlyZXR1cm4gZS5jb3B5KCk7aWYoZS5pc0VtcHR5KCkpcmV0dXJuIHQuY29weSgpfXJldHVybiB0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHQpLHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24oZSksZmMub3ZlcmxheU9wKHQsZSxPYy5TWU1ESUZGRVJFTkNFKX0sT2MucmVzdWx0RGltZW5zaW9uPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmdldERpbWVuc2lvbigpLGk9bi5nZXREaW1lbnNpb24oKSxvPS0xO3N3aXRjaCh0KXtjYXNlIE9jLklOVEVSU0VDVElPTjpvPU1hdGgubWluKHIsaSk7YnJlYWs7Y2FzZSBPYy5VTklPTjpvPU1hdGgubWF4KHIsaSk7YnJlYWs7Y2FzZSBPYy5ESUZGRVJFTkNFOm89cjticmVhaztjYXNlIE9jLlNZTURJRkZFUkVOQ0U6bz1NYXRoLm1heChyLGkpfXJldHVybiBvfSxPYy5jcmVhdGVFbXB0eVJlc3VsdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1udWxsO3N3aXRjaChPYy5yZXN1bHREaW1lbnNpb24odCxlLG4pKXtjYXNlLTE6aT1yLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihuZXcgQXJyYXkoMCkuZmlsbChudWxsKSk7YnJlYWs7Y2FzZSAwOmk9ci5jcmVhdGVQb2ludCgpO2JyZWFrO2Nhc2UgMTppPXIuY3JlYXRlTGluZVN0cmluZygpO2JyZWFrO2Nhc2UgMjppPXIuY3JlYXRlUG9seWdvbigpfXJldHVybiBpfSxPYy5kaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaXNFbXB0eSgpP09jLmNyZWF0ZUVtcHR5UmVzdWx0KE9jLkRJRkZFUkVOQ0UsdCxlLHQuZ2V0RmFjdG9yeSgpKTplLmlzRW1wdHkoKT90LmNvcHkoKToodC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0KSx0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKGUpLGZjLm92ZXJsYXlPcCh0LGUsT2MuRElGRkVSRU5DRSkpfSxPYy5pc1Jlc3VsdE9mT3A9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49dC5nZXRMb2NhdGlvbigwKSxyPXQuZ2V0TG9jYXRpb24oMSk7cmV0dXJuIE9jLmlzUmVzdWx0T2ZPcChuLHIsZSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXTtzd2l0Y2goaT09PWJpLkJPVU5EQVJZJiYoaT1iaS5JTlRFUklPUiksbz09PWJpLkJPVU5EQVJZJiYobz1iaS5JTlRFUklPUiksYXJndW1lbnRzWzJdKXtjYXNlIE9jLklOVEVSU0VDVElPTjpyZXR1cm4gaT09PWJpLklOVEVSSU9SJiZvPT09YmkuSU5URVJJT1I7Y2FzZSBPYy5VTklPTjpyZXR1cm4gaT09PWJpLklOVEVSSU9SfHxvPT09YmkuSU5URVJJT1I7Y2FzZSBPYy5ESUZGRVJFTkNFOnJldHVybiBpPT09YmkuSU5URVJJT1ImJm8hPT1iaS5JTlRFUklPUjtjYXNlIE9jLlNZTURJRkZFUkVOQ0U6cmV0dXJuIGk9PT1iaS5JTlRFUklPUiYmbyE9PWJpLklOVEVSSU9SfHxpIT09YmkuSU5URVJJT1ImJm89PT1iaS5JTlRFUklPUn1yZXR1cm4hMX19LE9jLklOVEVSU0VDVElPTj0xLE9jLlVOSU9OPTIsT2MuRElGRkVSRU5DRT0zLE9jLlNZTURJRkZFUkVOQ0U9NDt2YXIgTGM9ZnVuY3Rpb24oKXt0aGlzLl9nPW51bGwsdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT1udWxsLHRoaXMuX2xpbmV3b3JrPW51bGwsdGhpcy5fcHRMb2NhdG9yPW5ldyBUdSx0aGlzLl9zZWc9bmV3IGJhO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9nPXQsdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT1lLHRoaXMuX2xpbmV3b3JrPXRoaXMuZXh0cmFjdExpbmV3b3JrKHQpfTtMYy5wcm90b3R5cGUuaXNXaXRoaW5Ub2xlcmFuY2VPZkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49MDtuPHRoaXMuX2xpbmV3b3JrLmdldE51bUdlb21ldHJpZXMoKTtuKyspZm9yKHZhciByPWUuX2xpbmV3b3JrLmdldEdlb21ldHJ5TihuKS5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSxpPTA7aTxyLnNpemUoKS0xO2krKyl7aWYoci5nZXRDb29yZGluYXRlKGksZS5fc2VnLnAwKSxyLmdldENvb3JkaW5hdGUoaSsxLGUuX3NlZy5wMSksZS5fc2VnLmRpc3RhbmNlKHQpPD1lLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKXJldHVybiEwfXJldHVybiExfSxMYy5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNXaXRoaW5Ub2xlcmFuY2VPZkJvdW5kYXJ5KHQpP2JpLkJPVU5EQVJZOnRoaXMuX3B0TG9jYXRvci5sb2NhdGUodCx0aGlzLl9nKX0sTGMucHJvdG90eXBlLmV4dHJhY3RMaW5ld29yaz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgUGM7dC5hcHBseShlKTt2YXIgbj1lLmdldExpbmV3b3JrKCkscj1Jcy50b0xpbmVTdHJpbmdBcnJheShuKTtyZXR1cm4gdC5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKHIpfSxMYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sTGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIExjfTt2YXIgUGM9ZnVuY3Rpb24oKXt0aGlzLl9saW5ld29yaz1udWxsLHRoaXMuX2xpbmV3b3JrPW5ldyB4b307UGMucHJvdG90eXBlLmdldExpbmV3b3JrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xpbmV3b3JrfSxQYy5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBocyl7dmFyIGU9dDt0aGlzLl9saW5ld29yay5hZGQoZS5nZXRFeHRlcmlvclJpbmcoKSk7Zm9yKHZhciBuPTA7bjxlLmdldE51bUludGVyaW9yUmluZygpO24rKyl0aGlzLl9saW5ld29yay5hZGQoZS5nZXRJbnRlcmlvclJpbmdOKG4pKX19LFBjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltYb119LFBjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBQY307dmFyIFJjPWZ1bmN0aW9uKCl7dGhpcy5fZz1udWxsLHRoaXMuX2RvTGVmdD0hMCx0aGlzLl9kb1JpZ2h0PSEwO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9nPXR9O1JjLnByb3RvdHlwZS5leHRyYWN0UG9pbnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9dC5nZXRDb29yZGluYXRlcygpLGk9MDtpPHIubGVuZ3RoLTE7aSsrKXRoaXMuY29tcHV0ZU9mZnNldFBvaW50cyhyW2ldLHJbaSsxXSxlLG4pfSxSYy5wcm90b3R5cGUuc2V0U2lkZXNUb0dlbmVyYXRlPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZG9MZWZ0PXQsdGhpcy5fZG9SaWdodD1lfSxSYy5wcm90b3R5cGUuZ2V0UG9pbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj1GdS5nZXRMaW5lcyh0aGlzLl9nKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7dGhpcy5leHRyYWN0UG9pbnRzKHIsdCxlKX1yZXR1cm4gZX0sUmMucHJvdG90eXBlLmNvbXB1dGVPZmZzZXRQb2ludHM9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZS54LXQueCxvPWUueS10Lnkscz1NYXRoLnNxcnQoaSppK28qbyksYT1uKmkvcyx1PW4qby9zLGM9KGUueCt0LngpLzIsbD0oZS55K3QueSkvMjtpZih0aGlzLl9kb0xlZnQpe3ZhciBoPW5ldyB2aShjLXUsbCthKTtyLmFkZChoKX1pZih0aGlzLl9kb1JpZ2h0KXt2YXIgZj1uZXcgdmkoYyt1LGwtYSk7ci5hZGQoZil9fSxSYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFJjfTt2YXIgQmM9ZnVuY3Rpb24gdCgpe3RoaXMuX2dlb209bnVsbCx0aGlzLl9sb2NGaW5kZXI9bnVsbCx0aGlzLl9sb2NhdGlvbj1uZXcgQXJyYXkoMykuZmlsbChudWxsKSx0aGlzLl9pbnZhbGlkTG9jYXRpb249bnVsbCx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlPXQuVE9MRVJBTkNFLHRoaXMuX3Rlc3RDb29yZHM9bmV3IHhvO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlPXQuY29tcHV0ZUJvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UoZSxuKSx0aGlzLl9nZW9tPVtlLG4scl0sdGhpcy5fbG9jRmluZGVyPVtuZXcgTGModGhpcy5fZ2VvbVswXSx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKSxuZXcgTGModGhpcy5fZ2VvbVsxXSx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKSxuZXcgTGModGhpcy5fZ2VvbVsyXSx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKV19LGtjPXtUT0xFUkFOQ0U6e2NvbmZpZ3VyYWJsZTohMH19O0JjLnByb3RvdHlwZS5yZXBvcnRSZXN1bHQ9ZnVuY3Rpb24odCxlLG4pe2tpLm91dC5wcmludGxuKCJPdmVybGF5IHJlc3VsdCBpbnZhbGlkIC0gQToiK2JpLnRvTG9jYXRpb25TeW1ib2woZVswXSkrIiBCOiIrYmkudG9Mb2NhdGlvblN5bWJvbChlWzFdKSsiIGV4cGVjdGVkOiIrKG4/ImkiOiJlIikrIiBhY3R1YWw6IitiaS50b0xvY2F0aW9uU3ltYm9sKGVbMl0pKX0sQmMucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkVGVzdFB0cyh0aGlzLl9nZW9tWzBdKSx0aGlzLmFkZFRlc3RQdHModGhpcy5fZ2VvbVsxXSksdGhpcy5jaGVja1ZhbGlkKHQpfSxCYy5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj0wO248dGhpcy5fdGVzdENvb3Jkcy5zaXplKCk7bisrKXt2YXIgcj10Ll90ZXN0Q29vcmRzLmdldChuKTtpZighdC5jaGVja1ZhbGlkKGUscikpcmV0dXJuIHQuX2ludmFsaWRMb2NhdGlvbj1yLCExfXJldHVybiEwfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuX2xvY2F0aW9uWzBdPXRoaXMuX2xvY0ZpbmRlclswXS5nZXRMb2NhdGlvbihvKSx0aGlzLl9sb2NhdGlvblsxXT10aGlzLl9sb2NGaW5kZXJbMV0uZ2V0TG9jYXRpb24obyksdGhpcy5fbG9jYXRpb25bMl09dGhpcy5fbG9jRmluZGVyWzJdLmdldExvY2F0aW9uKG8pLCEhQmMuaGFzTG9jYXRpb24odGhpcy5fbG9jYXRpb24sYmkuQk9VTkRBUlkpfHx0aGlzLmlzVmFsaWRSZXN1bHQoaSx0aGlzLl9sb2NhdGlvbil9fSxCYy5wcm90b3R5cGUuYWRkVGVzdFB0cz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgUmModCk7dGhpcy5fdGVzdENvb3Jkcy5hZGRBbGwoZS5nZXRQb2ludHMoNSp0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKSl9LEJjLnByb3RvdHlwZS5pc1ZhbGlkUmVzdWx0PWZ1bmN0aW9uKHQsZSl7dmFyIG49T2MuaXNSZXN1bHRPZk9wKGVbMF0sZVsxXSx0KSxyPSEobl5lWzJdPT09YmkuSU5URVJJT1IpO3JldHVybiByfHx0aGlzLnJlcG9ydFJlc3VsdCh0LGUsbikscn0sQmMucHJvdG90eXBlLmdldEludmFsaWRMb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnZhbGlkTG9jYXRpb259LEJjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxCYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQmN9LEJjLmhhc0xvY2F0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjwzO24rKylpZih0W25dPT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sQmMuY29tcHV0ZUJvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5taW4ocmMuY29tcHV0ZVNpemVCYXNlZFNuYXBUb2xlcmFuY2UodCkscmMuY29tcHV0ZVNpemVCYXNlZFNuYXBUb2xlcmFuY2UoZSkpfSxCYy5pc1ZhbGlkPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBuZXcgQmModCxlLHIpLmlzVmFsaWQobil9LGtjLlRPTEVSQU5DRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtNn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmMsa2MpO3ZhciB6Yz1mdW5jdGlvbiB0KGUpe3RoaXMuX2dlb21GYWN0b3J5PW51bGwsdGhpcy5fc2tpcEVtcHR5PSExLHRoaXMuX2lucHV0R2VvbXM9bnVsbCx0aGlzLl9nZW9tRmFjdG9yeT10LmV4dHJhY3RGYWN0b3J5KGUpLHRoaXMuX2lucHV0R2VvbXM9ZX07emMucHJvdG90eXBlLmV4dHJhY3RFbGVtZW50cz1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10KXJldHVybiBudWxsO2Zvcih2YXIgbj0wO248dC5nZXROdW1HZW9tZXRyaWVzKCk7bisrKXt2YXIgcj10LmdldEdlb21ldHJ5TihuKTt0aGlzLl9za2lwRW1wdHkmJnIuaXNFbXB0eSgpfHxlLmFkZChyKX19LHpjLnByb3RvdHlwZS5jb21iaW5lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyB4byxlPXRoaXMuX2lucHV0R2VvbXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3RoaXMuZXh0cmFjdEVsZW1lbnRzKG4sdCl9cmV0dXJuIDA9PT10LnNpemUoKT9udWxsIT09dGhpcy5fZ2VvbUZhY3Rvcnk/dGhpcy5fZ2VvbUZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKG51bGwpOm51bGw6dGhpcy5fZ2VvbUZhY3RvcnkuYnVpbGRHZW9tZXRyeSh0KX0semMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHpjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB6Y30semMuY29tYmluZT1mdW5jdGlvbigpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgemMoYXJndW1lbnRzWzBdKS5jb21iaW5lKCk6Mj09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IHpjKHpjLmNyZWF0ZUxpc3QoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSkpLmNvbWJpbmUoKTozPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgemMoemMuY3JlYXRlTGlzdChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSkpLmNvbWJpbmUoKTp2b2lkIDB9LHpjLmV4dHJhY3RGYWN0b3J5PWZ1bmN0aW9uKHQpe3JldHVybiB0LmlzRW1wdHkoKT9udWxsOnQuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RmFjdG9yeSgpfSx6Yy5jcmVhdGVMaXN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPW5ldyB4bztyZXR1cm4gbi5hZGQodCksbi5hZGQoZSksbn1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdLHM9bmV3IHhvO3JldHVybiBzLmFkZChyKSxzLmFkZChpKSxzLmFkZChvKSxzfX07dmFyIGpjPWZ1bmN0aW9uKCl7dGhpcy5faW5wdXRQb2x5cz1udWxsLHRoaXMuX2dlb21GYWN0b3J5PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2lucHV0UG9seXM9dCxudWxsPT09dGhpcy5faW5wdXRQb2x5cyYmKHRoaXMuX2lucHV0UG9seXM9bmV3IHhvKX0sVWM9e1NUUlRSRUVfTk9ERV9DQVBBQ0lUWTp7Y29uZmlndXJhYmxlOiEwfX07amMucHJvdG90eXBlLnJlZHVjZVRvR2VvbWV0cmllcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCksaT1udWxsO0VpKHIsdm8pP2k9dGhpcy51bmlvblRyZWUocik6ciBpbnN0YW5jZW9mIGlvJiYoaT1yKSxlLmFkZChpKX1yZXR1cm4gZX0samMucHJvdG90eXBlLmV4dHJhY3RCeUVudmVsb3BlPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bmV3IHhvLGk9MDtpPGUuZ2V0TnVtR2VvbWV0cmllcygpO2krKyl7dmFyIG89ZS5nZXRHZW9tZXRyeU4oaSk7by5nZXRFbnZlbG9wZUludGVybmFsKCkuaW50ZXJzZWN0cyh0KT9yLmFkZChvKTpuLmFkZChvKX1yZXR1cm4gdGhpcy5fZ2VvbUZhY3RvcnkuYnVpbGRHZW9tZXRyeShyKX0samMucHJvdG90eXBlLnVuaW9uT3B0aW1pemVkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRFbnZlbG9wZUludGVybmFsKCkscj1lLmdldEVudmVsb3BlSW50ZXJuYWwoKTtpZighbi5pbnRlcnNlY3RzKHIpKXJldHVybiB6Yy5jb21iaW5lKHQsZSk7aWYodC5nZXROdW1HZW9tZXRyaWVzKCk8PTEmJmUuZ2V0TnVtR2VvbWV0cmllcygpPD0xKXJldHVybiB0aGlzLnVuaW9uQWN0dWFsKHQsZSk7dmFyIGk9bi5pbnRlcnNlY3Rpb24ocik7cmV0dXJuIHRoaXMudW5pb25Vc2luZ0VudmVsb3BlSW50ZXJzZWN0aW9uKHQsZSxpKX0samMucHJvdG90eXBlLnVuaW9uPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2lucHV0UG9seXMpdGhyb3cgbmV3IEVycm9yKCJ1bmlvbigpIG1ldGhvZCBjYW5ub3QgYmUgY2FsbGVkIHR3aWNlIik7aWYodGhpcy5faW5wdXRQb2x5cy5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dGhpcy5fZ2VvbUZhY3Rvcnk9dGhpcy5faW5wdXRQb2x5cy5pdGVyYXRvcigpLm5leHQoKS5nZXRGYWN0b3J5KCk7Zm9yKHZhciB0PW5ldyBwYShqYy5TVFJUUkVFX05PREVfQ0FQQUNJVFkpLGU9dGhpcy5faW5wdXRQb2x5cy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dC5pbnNlcnQobi5nZXRFbnZlbG9wZUludGVybmFsKCksbil9dGhpcy5faW5wdXRQb2x5cz1udWxsO3ZhciByPXQuaXRlbXNUcmVlKCk7cmV0dXJuIHRoaXMudW5pb25UcmVlKHIpfSxqYy5wcm90b3R5cGUuYmluYXJ5VW5pb249ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmJpbmFyeVVuaW9uKHQsMCx0LnNpemUoKSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTtpZihyLW48PTEpe3ZhciBpPWpjLmdldEdlb21ldHJ5KGUsbik7cmV0dXJuIHRoaXMudW5pb25TYWZlKGksbnVsbCl9aWYoci1uPT0yKXJldHVybiB0aGlzLnVuaW9uU2FmZShqYy5nZXRHZW9tZXRyeShlLG4pLGpjLmdldEdlb21ldHJ5KGUsbisxKSk7dmFyIG89TWF0aC50cnVuYygocituKS8yKSxzPXRoaXMuYmluYXJ5VW5pb24oZSxuLG8pLGE9dGhpcy5iaW5hcnlVbmlvbihlLG8scik7cmV0dXJuIHRoaXMudW5pb25TYWZlKHMsYSl9fSxqYy5wcm90b3R5cGUucmVwZWF0ZWRVbmlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9bnVsbCxuPXQuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2U9bnVsbD09PWU/ci5jb3B5KCk6ZS51bmlvbihyKX1yZXR1cm4gZX0samMucHJvdG90eXBlLnVuaW9uU2FmZT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT09dCYmbnVsbD09PWU/bnVsbDpudWxsPT09dD9lLmNvcHkoKTpudWxsPT09ZT90LmNvcHkoKTp0aGlzLnVuaW9uT3B0aW1pemVkKHQsZSl9LGpjLnByb3RvdHlwZS51bmlvbkFjdHVhbD1mdW5jdGlvbih0LGUpe3JldHVybiBqYy5yZXN0cmljdFRvUG9seWdvbnModC51bmlvbihlKSl9LGpjLnByb3RvdHlwZS51bmlvblRyZWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZWR1Y2VUb0dlb21ldHJpZXModCk7cmV0dXJuIHRoaXMuYmluYXJ5VW5pb24oZSl9LGpjLnByb3RvdHlwZS51bmlvblVzaW5nRW52ZWxvcGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyB4byxpPXRoaXMuZXh0cmFjdEJ5RW52ZWxvcGUobix0LHIpLG89dGhpcy5leHRyYWN0QnlFbnZlbG9wZShuLGUscikscz10aGlzLnVuaW9uQWN0dWFsKGksbyk7cmV0dXJuIHIuYWRkKHMpLHpjLmNvbWJpbmUocil9LGpjLnByb3RvdHlwZS5idWZmZXJVbmlvbj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHQuZ2V0KDApLmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KHQpLmJ1ZmZlcigwKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiBlLmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oW2Usbl0pLmJ1ZmZlcigwKX19LGpjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxqYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gamN9LGpjLnJlc3RyaWN0VG9Qb2x5Z29ucz1mdW5jdGlvbih0KXtpZihFaSh0LGxzKSlyZXR1cm4gdDt2YXIgZT1NdS5nZXRQb2x5Z29ucyh0KTtyZXR1cm4gMT09PWUuc2l6ZSgpP2UuZ2V0KDApOnQuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpUG9seWdvbihJcy50b1BvbHlnb25BcnJheShlKSl9LGpjLmdldEdlb21ldHJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU+PXQuc2l6ZSgpP251bGw6dC5nZXQoZSl9LGpjLnVuaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgamModCkudW5pb24oKX0sVWMuU1RSVFJFRV9OT0RFX0NBUEFDSVRZLmdldD1mdW5jdGlvbigpe3JldHVybiA0fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqYyxVYyk7dmFyIHFjPWZ1bmN0aW9uKCl7fTtxYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHFjfSxxYy51bmlvbj1mdW5jdGlvbih0LGUpe2lmKHQuaXNFbXB0eSgpfHxlLmlzRW1wdHkoKSl7aWYodC5pc0VtcHR5KCkmJmUuaXNFbXB0eSgpKXJldHVybiBPYy5jcmVhdGVFbXB0eVJlc3VsdChPYy5VTklPTix0LGUsdC5nZXRGYWN0b3J5KCkpO2lmKHQuaXNFbXB0eSgpKXJldHVybiBlLmNvcHkoKTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gdC5jb3B5KCl9cmV0dXJuIHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24odCksdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbihlKSxmYy5vdmVybGF5T3AodCxlLE9jLlVOSU9OKX07dmFyIFZjPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBHY307ZnVuY3Rpb24gR2MoKXt0aGlzLnJlc2V0KCl9R2MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpHYyxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sYWRkOmZ1bmN0aW9uKHQpe1hjKFljLHQsdGhpcy50KSxYYyh0aGlzLFljLnMsdGhpcy5zKSx0aGlzLnM/dGhpcy50Kz1ZYy50OnRoaXMucz1ZYy50fSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciBZYz1uZXcgR2M7ZnVuY3Rpb24gWGModCxlLG4pe3ZhciByPXQucz1lK24saT1yLWUsbz1yLWk7dC50PWUtbysobi1pKX12YXIgV2M9TWF0aC5QSSxIYz0yKldjO2Z1bmN0aW9uIFpjKHQsZSl7cmV0dXJuW3Q+V2M/dC1IYzp0PC1XYz90K0hjOnQsZV19VmMoKSxWYygpLFZjKCksWmMuaW52ZXJ0PVpjO3ZhciBLYyxKYyxRYywkYyx0bCxlbCxubCxybCxpbCxvbCxzbCxhbCx1bCxjbCxsbCxobCxmbCxwbCxkbCxnbCx5bCxtbCx2bCxfbCx4bCx3bCxibCxEbCxFbCxDbCxTbCxBbCxObCxJbCxNbCxGbCxUbCxPbCxMbCxQbCxSbCxCbD1mdW5jdGlvbih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn07ZnVuY3Rpb24ga2woKXt9ZnVuY3Rpb24gemwodCxlLG4pe3ZhciByPXZvaWQgMD09PWU/bnVsbDplLGk9ZnVuY3Rpb24odCxlKXt2YXIgbj1hdG9iKHQpO2lmKGUpe2Zvcih2YXIgcj1uZXcgVWludDhBcnJheShuLmxlbmd0aCksaT0wLG89bi5sZW5ndGg7aTxvOysraSlyW2ldPW4uY2hhckNvZGVBdChpKTtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50MTZBcnJheShyLmJ1ZmZlcikpfXJldHVybiBufSh0LHZvaWQgMCE9PW4mJm4pLG89aS5pbmRleE9mKCJcbiIsMTApKzEscz1pLnN1YnN0cmluZyhvKSsocj8iLy8jIHNvdXJjZU1hcHBpbmdVUkw9IityOiIiKSxhPW5ldyBCbG9iKFtzXSx7dHlwZToiYXBwbGljYXRpb24vamF2YXNjcmlwdCJ9KTtyZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChhKX1mdW5jdGlvbiBqbCh0PTgsZT02Mil7Y29uc3Qgbj0iMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKSxyPVtdO2xldCBpO2lmKGU9ZXx8bi5sZW5ndGgsdClmb3IoaT0wO2k8dDtpKyspcltpXT1uWzB8TWF0aC5yYW5kb20oKSplXTtlbHNle2xldCB0O2ZvcihyWzhdPXJbMTNdPXJbMThdPXJbMjNdPSItIixyWzE0XT0iNCIsaT0wO2k8MzY7aSsrKXJbaV18fCh0PTB8MTYqTWF0aC5yYW5kb20oKSxyW2ldPW5bMTk9PT1pPzMmdHw4OnRdKX1yZXR1cm4gci5qb2luKCIiKX0oZnVuY3Rpb24odCl7MT09PXQubGVuZ3RoJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gQmwodChlKSxuKX19KHQpKX0pKEJsKSxWYygpLFZjKCksVmMoKSxWYygpLFZjKCksa2wucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjprbCxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuc3RyZWFtLnBvaW50KHQsZSl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fSxmdW5jdGlvbih0KXt0LlBvaW50Q2xvdWQ9InBvaW50Q2xvdWRUb29sIn0oS2N8fChLYz17fSkpLGZ1bmN0aW9uKHQpe3QuVmlkZW9UZXh0VG9vbD0idmlkZW9UZXh0VG9vbCIsdC5WaWRlb1RhZ1Rvb2w9InZpZGVvVGFnVG9vbCIsdC5WaWRlb0NsaXBUb29sPSJ2aWRlb0NsaXBUb29sIn0oSmN8fChKYz17fSkpLGZ1bmN0aW9uKHQpe3QuQXVkaW9UZXh0VG9vbD0iYXVkaW9UZXh0VG9vbCJ9KFFjfHwoUWM9e30pKSxmdW5jdGlvbih0KXt0W3QuUmVjdD0wXT0iUmVjdCIsdFt0LlRhZz0xXT0iVGFnIn0oJGN8fCgkYz17fSkpLGZ1bmN0aW9uKHQpe3QuUmVjdD0icmVjdFRvb2wiLHQuVGFnPSJ0YWdUb29sIix0LlBvaW50PSJwb2ludFRvb2wiLHQuUG9pbnRNYXJrZXI9InBvaW50TWFya2VyVG9vbCIsdC5TZWdtZW50YXRpb249InNlZ21lbnRhdGlvblRvb2wiLHQuRmlsdGVyPSJmaWx0ZXJUb29sIix0LlRleHQ9InRleHRUb29sIix0LlBvbHlnb249InBvbHlnb25Ub29sIix0LkxpbmU9ImxpbmVUb29sIix0LkxpbmVNYXJrZXI9ImxpbmVNYXJrZXJUb29sIix0LkVtcHR5PSJlbXB0eVRvb2wiLHQuRm9sZGVyVGFnPSJmb2xkZXJUYWdUb29sIix0LlJlY3RUcmFjaz0icmVjdFRyYWNrVG9vbCIsdC5TY3JpYmJsZVRvb2w9InNjcmliYmxlVG9vbCIsdC5GYWNlPSJmYWNlVG9vbCIsdC5DbGllbnRBdHRyaWJ1dGU9ImNsaWVudEF0dHJpYnV0ZVRvb2wiLHQuT0NSUmVsYXRpb249Ik9DUlJlbGF0aW9uVG9vbCIsdC5TZWdtZW50QnlSZWN0PSJzZWdtZW50QnlSZWN0VG9vbCIsdC5DdWJvaWQ9ImN1Ym9pZFRvb2wiLHQuUG9pbnRDbG91ZFBvbHlnb249InBvaW50Q2xvdWRQb2x5Z29uIix0LkxMTT0iTExNVG9vbCIsdC5OTFA9Ik5MUFRvb2wiLHQuTExNTXVsdGlXaGVlbD0iTExNTXVsdGlXaGVlbFRvb2wifSh0bHx8KHRsPXt9KSksZnVuY3Rpb24odCl7dC5DaGVjaz0iY2hlY2sifShlbHx8KGVsPXt9KSksZnVuY3Rpb24odCl7dFt0Lm5vdGhpbmc9MF09Im5vdGhpbmciLHRbdC5SZWN0Qkc9MV09IlJlY3RCRyIsdFt0LnNob3dPcmRlcj0yXT0ic2hvd09yZGVyIn0obmx8fChubD17fSkpLHRsLlJlY3QsdGwuVGFnLHRsLlBvaW50LHRsLlBvaW50TWFya2VyLHRsLlNlZ21lbnRhdGlvbix0bC5GaWx0ZXIsdGwuVGV4dCx0bC5Qb2x5Z29uLHRsLkxpbmUsdGwuTGluZU1hcmtlcix0bC5Gb2xkZXJUYWcsdGwuUmVjdFRyYWNrLHRsLkZhY2UsdGwuQ2xpZW50QXR0cmlidXRlLHRsLk9DUlJlbGF0aW9uLHRsLlNlZ21lbnRCeVJlY3QsSmMuVmlkZW9UZXh0VG9vbCxKYy5WaWRlb1RhZ1Rvb2wsSmMuVmlkZW9DbGlwVG9vbCxLYy5Qb2ludENsb3VkLHRsLkN1Ym9pZCx0bC5MTE0sdGwuTkxQLHRsLkxMTU11bHRpV2hlZWwsdGwuUmVjdCx0bC5UYWcsdGwuUG9pbnQsdGwuUG9pbnRNYXJrZXIsdGwuU2VnbWVudGF0aW9uLHRsLkZpbHRlcix0bC5UZXh0LHRsLlBvbHlnb24sdGwuTGluZSx0bC5MaW5lTWFya2VyLHRsLkZvbGRlclRhZyx0bC5SZWN0VHJhY2ssdGwuRmFjZSx0bC5DbGllbnRBdHRyaWJ1dGUsdGwuT0NSUmVsYXRpb24sdGwuU2VnbWVudEJ5UmVjdCxKYy5WaWRlb1RleHRUb29sLEpjLlZpZGVvVGFnVG9vbCxKYy5WaWRlb0NsaXBUb29sLEtjLlBvaW50Q2xvdWQsdGwuQ3Vib2lkLHRsLkxMTSx0bC5OTFAsdGwuTExNTXVsdGlXaGVlbCxmdW5jdGlvbih0KXt0W3Qubm9EZXBlbmQ9MV09Im5vRGVwZW5kIix0W3QuZGVwZW5kT3JpZ2luPTJdPSJkZXBlbmRPcmlnaW4iLHRbdC5kZXBlbmRTaGFwZT0zXT0iZGVwZW5kU2hhcGUiLHRbdC5kZXBlbmRMaW5lPTRdPSJkZXBlbmRMaW5lIix0W3QuZGVwZW5kUG9seWdvbj01XT0iZGVwZW5kUG9seWdvbiIsdFt0LmRlcGVuZFByZVNoYXBlPTEwMV09ImRlcGVuZFByZVNoYXBlIix0W3QuZGVwZW5kUHJlTGluZT0xMDJdPSJkZXBlbmRQcmVMaW5lIix0W3QuZGVwZW5kUHJlUG9seWdvbj0xMDNdPSJkZXBlbmRQcmVQb2x5Z29uIn0ocmx8fChybD17fSkpLGZ1bmN0aW9uKHQpe3QubGM9ImxlZnRDbGljayIsdC5yYz0icmlnaHRDbGljayIsdC5jbGM9ImN0cmxMZWZ0Q2xpY2siLHQuY3JjPSJjdHJsUmlnaHRDbGljayJ9KGlsfHwoaWw9e30pKSxmdW5jdGlvbih0KXt0W3QuTm9ybWFsPTFdPSJOb3JtYWwiLHRbdC5Nb2RpZnk9Ml09Ik1vZGlmeSJ9KG9sfHwob2w9e30pKSxmdW5jdGlvbih0KXt0W3QuTGluZT0wXT0iTGluZSIsdFt0LkN1cnZlPTFdPSJDdXJ2ZSJ9KHNsfHwoc2w9e30pKSxmdW5jdGlvbih0KXt0W3QuU2luZ2xlQ29sb3I9MF09IlNpbmdsZUNvbG9yIix0W3QuTXVsdGlDb2xvcj0xXT0iTXVsdGlDb2xvciJ9KGFsfHwoYWw9e30pKSxmdW5jdGlvbih0KXt0W3QuRm9ybT0xXT0iRm9ybSIsdFt0Lkpzb249Ml09Ikpzb24ifSh1bHx8KHVsPXt9KSksZnVuY3Rpb24odCl7dFt0LlBvaW50PTBdPSJQb2ludCIsdFt0LkxpbmU9MV09IkxpbmUiLHRbdC5QbGFuZT0yXT0iUGxhbmUifShjbHx8KGNsPXt9KSksZnVuY3Rpb24odCl7dFt0Lk5vbmU9MF09Ik5vbmUiLHRbdC5EcmF3aW5nPTFdPSJEcmF3aW5nIix0W3QuRWRpdD0yXT0iRWRpdCJ9KGxsfHwobGw9e30pKSxmdW5jdGlvbih0KXt0W3QuQmFja3dhcmQ9MF09IkJhY2t3YXJkIix0W3QuRm9yd2FyZD0xXT0iRm9yd2FyZCIsdFt0Lkp1bXBTa2lwPTJdPSJKdW1wU2tpcCIsdFt0Lk5vbmU9M109Ik5vbmUifShobHx8KGhsPXt9KSksZnVuY3Rpb24odCl7dFt0LldhaXQ9MF09IldhaXQiLHRbdC5QYXNzPTFdPSJQYXNzIix0W3QuRmFpbD0yXT0iRmFpbCIsdFt0LkxvYWRpbmc9M109IkxvYWRpbmcifShmbHx8KGZsPXt9KSksZnVuY3Rpb24odCl7dFt0LkFueVN0cmluZz0wXT0iQW55U3RyaW5nIix0W3QuT3JkZXI9MV09Ik9yZGVyIix0W3QuRW5nbGlzaE9ubHk9Ml09IkVuZ2xpc2hPbmx5Iix0W3QuTnVtYmVyT25seT0zXT0iTnVtYmVyT25seSIsdFt0LkN1c3RvbUZvcm1hdD00XT0iQ3VzdG9tRm9ybWF0In0ocGx8fChwbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5JbWdMaXN0PTFlM109IkltZ0xpc3QiLHRbdC5UcmFja1ByZWRpY3Rpb249MTAwMV09IlRyYWNrUHJlZGljdGlvbiIsdFt0LkltZ1NlYXJjaD0xMDAyXT0iSW1nU2VhcmNoIn0oZGx8fChkbD17fSkpLEtjLlBvaW50Q2xvdWQsdGwuQ2xpZW50QXR0cmlidXRlLHRsLkZhY2UsdGwuT0NSUmVsYXRpb24sS2MuUG9pbnRDbG91ZCx0bC5DbGllbnRBdHRyaWJ1dGUsdGwuRmFjZSx0bC5PQ1JSZWxhdGlvbixmdW5jdGlvbih0KXt0W3QuTm9ybWFsPTBdPSJOb3JtYWwiLHRbdC5SZWN0PTFdPSJSZWN0In0oZ2x8fChnbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5TY3JpYmJsZT0xXT0iU2NyaWJibGUiLHRbdC5FcmFzZT0yXT0iRXJhc2UifSh5bHx8KHlsPXt9KSksZnVuY3Rpb24odCl7dFt0LkdlbmVyYWw9MV09IkdlbmVyYWwiLHRbdC5NdWx0aU1vdmU9Ml09Ik11bHRpTW92ZSJ9KG1sfHwobWw9e30pKSxmdW5jdGlvbih0KXt0LlRocmVlUG9pbnRzPSJ0aHJlZV9wb2ludHMiLHQuVHdvUG9pbnRzPSJ0d29fcG9pbnRzIn0odmx8fCh2bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5BTk5PVEFUSU9OPTFdPSJBTk5PVEFUSU9OIix0W3QuUVVBTElUWV9JTlNQRUNUSU9OPTJdPSJRVUFMSVRZX0lOU1BFQ1RJT04iLHRbdC5QUkVfQU5OT1RBVElPTj0zXT0iUFJFX0FOTk9UQVRJT04iLHRbdC5NQU5VQUxfQ09SUkVDVElPTj00XT0iTUFOVUFMX0NPUlJFQ1RJT04ifShfbHx8KF9sPXt9KSksZnVuY3Rpb24odCl7dFt0LkJhY2t3YXJkPTBdPSJCYWNrd2FyZCIsdFt0LkZvcndhcmQ9MV09IkZvcndhcmQiLHRbdC5KdW1wU2tpcD0yXT0iSnVtcFNraXAiLHRbdC5Ob25lPTNdPSJOb25lIn0oeGx8fCh4bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5TdGFydD0wXT0iU3RhcnQiLHRbdC5TdG9wPTFdPSJTdG9wIix0W3QuV2FpdD0yXT0iV2FpdCIsdFt0Lk1vdmU9M109Ik1vdmUifSh3bHx8KHdsPXt9KSksZnVuY3Rpb24odCl7dFt0LlBvaW50PTBdPSJQb2ludCIsdFt0LkxpbmU9MV09IkxpbmUiLHRbdC5QbGFuZT0yXT0iUGxhbmUiLHRbdC5DdWJvaWQ9M109IkN1Ym9pZCJ9KGJsfHwoYmw9e30pKSxmdW5jdGlvbih0KXt0W3QuYXNjZW5kPTBdPSJhc2NlbmQiLHRbdC5kZXNjZW5kPTFdPSJkZXNjZW5kIn0oRGx8fChEbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5JbnRlbGxpZ2VuY2U9MF09IkludGVsbGlnZW5jZSIsdFt0LkxpbmVhcj0xXT0iTGluZWFyIn0oRWx8fChFbD17fSkpLGZ1bmN0aW9uKHQpe3QuWmg9InpoX0NOIix0LlVTPSJlbl9VUyJ9KENsfHwoQ2w9e30pKSxmdW5jdGlvbih0KXt0W3QuQ2xvY2t3aXNlPTBdPSJDbG9ja3dpc2UiLHRbdC5BbnRpY2xvY2t3aXNlPTFdPSJBbnRpY2xvY2t3aXNlIn0oU2x8fChTbD17fSkpLGZ1bmN0aW9uKHQpe3QuRnJvbnQ9ImZyb250Iix0LkJhY2s9ImJhY2siLHQuU2lkZT0ic2lkZSJ9KEFsfHwoQWw9e30pKSxmdW5jdGlvbih0KXt0LlRMPSJ0bCIsdC5UUj0idHIiLHQuQkw9ImJsIix0LkJSPSJiciJ9KE5sfHwoTmw9e30pKSxmdW5jdGlvbih0KXt0LkZyb250PSJmcm9udCIsdC5CYWNrPSJiYWNrIix0LkxlZnQ9ImxlZnQiLHQuUmlnaHQ9InJpZ2h0Iix0LlRvcD0idG9wIn0oSWx8fChJbD17fSkpLGZ1bmN0aW9uKHQpe3QuUm93PSJyb3ciLHQuQ29sdW1uPSJjb2x1bW4ifShNbHx8KE1sPXt9KSksTmwuVEwsTmwuVFIsTmwuVFIsTmwuVEwsTmwuQkwsTmwuQlIsTmwuQlIsTmwuQkwsTmwuVEwsTmwuQkwsTmwuVFIsTmwuQlIsTmwuQkwsTmwuVEwsTmwuQlIsTmwuVFIsZnVuY3Rpb24odCl7dFt0LkE9NjVdPSJBIix0W3QuQj02Nl09IkIiLHRbdC5DPTY3XT0iQyIsdFt0LkQ9NjhdPSJEIix0W3QuRT02OV09IkUiLHRbdC5GPTcwXT0iRiIsdFt0Lkc9NzFdPSJHIix0W3QuSD03Ml09IkgiLHRbdC5JPTczXT0iSSIsdFt0Lk89NzldPSJPIix0W3QuTD03Nl09IkwiLHRbdC5SPTgyXT0iUiIsdFt0Llo9OTBdPSJaIix0W3QuVz04N109IlciLHRbdC5YPTg4XT0iWCIsdFt0Llk9ODldPSJZIix0W3QuUz04M109IlMiLHRbdC5RPTgxXT0iUSIsdFt0LlA9ODBdPSJQIix0W3QuT25lPTQ5XT0iT25lIix0W3QuVHdvPTUwXT0iVHdvIix0W3QuVGhyZWU9NTFdPSJUaHJlZSIsdFt0LkRlbGV0ZT00Nl09IkRlbGV0ZSIsdFt0LkYxMT0xMjJdPSJGMTEiLHRbdC5TcGFjZT0zMl09IlNwYWNlIix0W3QuRXNjPTI3XT0iRXNjIix0W3QuTGVmdD0zN109IkxlZnQiLHRbdC5VcD0zOF09IlVwIix0W3QuUmlnaHQ9MzldPSJSaWdodCIsdFt0LkRvd249NDBdPSJEb3duIix0W3QuRW50ZXI9MTNdPSJFbnRlciIsdFt0LkN0cmw9MTddPSJDdHJsIix0W3QuQWx0PTE4XT0iQWx0Iix0W3QuU2hpZnQ9MTZdPSJTaGlmdCIsdFt0LlRhYj05XT0iVGFiIix0W3QuQmFja1NwYWNlPThdPSJCYWNrU3BhY2UiLHRbdC5NaW51cz0xODldPSJNaW51cyIsdFt0LkVxdWFsPTE4N109IkVxdWFsIn0oRmx8fChGbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5DcmVhdGU9MF09IkNyZWF0ZSIsdFt0LkFjdGl2ZT0xXT0iQWN0aXZlIix0W3QuRWRpdD0xXT0iRWRpdCIsdFt0Lk5vbmU9Ml09Ik5vbmUifShUbHx8KFRsPXt9KSksZnVuY3Rpb24odCl7dC5BY3RpdmVBcmVhPSIjQjNCOEZGIn0oT2x8fChPbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5PdXRzaWRlPTBdPSJPdXRzaWRlIix0W3QuUGFydGlhbGx5SW5zaWRlPTFdPSJQYXJ0aWFsbHlJbnNpZGUiLHRbdC5GdWxseUluc2lkZT0yXT0iRnVsbHlJbnNpZGUifShMbHx8KExsPXt9KSksZnVuY3Rpb24odCl7dC5Ob1JvdGF0ZU5vdGljZT0ibm9Sb3RhdGVOb3RpY2UiLHQuUmVjdEVycm9yU2l6ZU5vdGljZT0icmVjdEVycm9yU2l6ZU5vdGljZSIsdC5UZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZT0idGV4dENoZWNrTnVtYmVyRXJyb3JOb3RpY2UiLHQuVGV4dENoZWNrRW5nbGlzaEVycm9yTm90aWNlPSJ0ZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2UiLHQuVGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2U9InRleHRDaGVja0N1c3RvbUVycm9yTm90aWNlIix0LlVwcGVyTGltaXRFcnJvck5vdGljZT0iVXBwZXJMaW1pdEVycm9yTm90aWNlIix0Lkxvd2VyTGltaXRFcnJvck5vdGljZT0iTG93ZXJMaW1pdEVycm9yTm90aWNlIix0Lk1pbkFyZWFMaW1pdEVycm9yTm90aWNlPSJNaW5BcmVhTGltaXRFcnJvck5vdGljZSIsdC5NaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlPSJNaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlIix0LkludmFsaWRJbWFnZT0iSW52YWxpZEltYWdlIix0LkRpc2FibGVEZWxldGU9IkRpc2FibGVEZWxldGUiLHQuQ2xlYXJQYXJ0aWFsRGF0YT0iQ2xlYXJQYXJ0aWFsRGF0YSIsdC5NYXJrZXJGaW5pc2g9Ik1hcmtlckZpbmlzaCIsdC5Mb3dlckxpbWl0UG9pbnQ9Ikxvd2VyTGltaXRQb2ludCIsdC5Ob1JvdGF0ZUluRGVwZW5kZW5jZT0ibm9Sb3RhdGVJbkRlcGVuZGVuY2UiLHQuVW5hYmxlVG9SZWFubm90YXRpb249InVuYWJsZVRvUmVhbm5vdGF0aW9uIix0LkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5PSJGb3JiaWRkZW5DcmVhdGlvbk91dHNpZGVCb3VuZGFyeSIsdC5TdWNjZXNzZnVsRWRnZUFkc29ycHRpb249IlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbiIsdC5Gb3JiaWRBZGROZXdQb2ludD0iRm9yYmlkQWRkTmV3UG9pbnQifShQbHx8KFBsPXt9KSksUGwuTm9Sb3RhdGVOb3RpY2UsUGwuUmVjdEVycm9yU2l6ZU5vdGljZSxQbC5UZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZSxQbC5UZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2UsUGwuVGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2UsUGwuVXBwZXJMaW1pdEVycm9yTm90aWNlLFBsLkxvd2VyTGltaXRFcnJvck5vdGljZSxQbC5NaW5BcmVhTGltaXRFcnJvck5vdGljZSxQbC5NaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlLFBsLkludmFsaWRJbWFnZSxQbC5EaXNhYmxlRGVsZXRlLFBsLkNsZWFyUGFydGlhbERhdGEsUGwuTWFya2VyRmluaXNoLFBsLkxvd2VyTGltaXRQb2ludCxQbC5Ob1JvdGF0ZUluRGVwZW5kZW5jZSxQbC5VbmFibGVUb1JlYW5ub3RhdGlvbixQbC5Gb3JiaWRkZW5DcmVhdGlvbk91dHNpZGVCb3VuZGFyeSxQbC5TdWNjZXNzZnVsRWRnZUFkc29ycHRpb24sUGwuRm9yYmlkQWRkTmV3UG9pbnQsUGwuTm9Sb3RhdGVOb3RpY2UsUGwuUmVjdEVycm9yU2l6ZU5vdGljZSxQbC5UZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZSxQbC5UZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2UsUGwuVGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2UsUGwuVXBwZXJMaW1pdEVycm9yTm90aWNlLFBsLkxvd2VyTGltaXRFcnJvck5vdGljZSxQbC5NaW5BcmVhTGltaXRFcnJvck5vdGljZSxQbC5NaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlLFBsLkludmFsaWRJbWFnZSxQbC5EaXNhYmxlRGVsZXRlLFBsLkNsZWFyUGFydGlhbERhdGEsUGwuTWFya2VyRmluaXNoLFBsLkxvd2VyTGltaXRQb2ludCxQbC5Ob1JvdGF0ZUluRGVwZW5kZW5jZSxQbC5VbmFibGVUb1JlYW5ub3RhdGlvbixQbC5Gb3JiaWRkZW5DcmVhdGlvbk91dHNpZGVCb3VuZGFyeSxQbC5TdWNjZXNzZnVsRWRnZUFkc29ycHRpb24sUGwuRm9yYmlkQWRkTmV3UG9pbnQsaWwubGMsaWwucmMsaWwuY2xjLGlsLmNyYyxbMSw1LDEwLDIwLDMwLDUwLDgwLDEwMF0uY29uY2F0KEFycmF5LmZyb20oe2xlbmd0aDo5fSkubWFwKCgodCxlKT0+MTAwKihlKzIpKSkpLENsLlpoLENsLlVTLGZ1bmN0aW9uKHQpe3RbdC5DcmVhdGU9MF09IkNyZWF0ZSIsdFt0LkFjdGl2ZT0xXT0iQWN0aXZlIix0W3QuTm9uZT0yXT0iTm9uZSJ9KFJsfHwoUmw9e30pKTtjb25zdCBVbD0xMDAxLHFsPSJzcmdiIixWbD0ic3JnYi1saW5lYXIiLEdsPSJsaW5lYXIiLFlsPSJzcmdiIixYbD0yZTM7Y2xhc3MgV2x7YWRkRXZlbnRMaXN0ZW5lcih0LGUpe3ZvaWQgMD09PXRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycz17fSk7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7dm9pZCAwPT09blt0XSYmKG5bdF09W10pLC0xPT09blt0XS5pbmRleE9mKGUpJiZuW3RdLnB1c2goZSl9aGFzRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiB2b2lkIDAhPT1uJiYodm9pZCAwIT09blt0XSYmLTEhPT1uW3RdLmluZGV4T2YoZSkpfXJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKXtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztpZih2b2lkIDA9PT1uKXJldHVybjtjb25zdCByPW5bdF07aWYodm9pZCAwIT09cil7Y29uc3QgdD1yLmluZGV4T2YoZSk7LTEhPT10JiZyLnNwbGljZSh0LDEpfX1kaXNwYXRjaEV2ZW50KHQpe2NvbnN0IGU9dGhpcy5fbGlzdGVuZXJzO2lmKHZvaWQgMD09PWUpcmV0dXJuO2NvbnN0IG49ZVt0LnR5cGVdO2lmKHZvaWQgMCE9PW4pe3QudGFyZ2V0PXRoaXM7Y29uc3QgZT1uLnNsaWNlKDApO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyllW25dLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgSGw9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2Z1bmN0aW9uIFpsKCl7Y29uc3QgdD00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxlPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLG49NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAscj00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4oSGxbMjU1JnRdK0hsW3Q+PjgmMjU1XStIbFt0Pj4xNiYyNTVdK0hsW3Q+PjI0JjI1NV0rIi0iK0hsWzI1NSZlXStIbFtlPj44JjI1NV0rIi0iK0hsW2U+PjE2JjE1fDY0XStIbFtlPj4yNCYyNTVdKyItIitIbFs2MyZufDEyOF0rSGxbbj4+OCYyNTVdKyItIitIbFtuPj4xNiYyNTVdK0hsW24+PjI0JjI1NV0rSGxbMjU1JnJdK0hsW3I+PjgmMjU1XStIbFtyPj4xNiYyNTVdK0hsW3I+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gS2wodCxlLG4pe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKG4sdCkpfWZ1bmN0aW9uIEpsKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX1jbGFzcyBRbHtjb25zdHJ1Y3Rvcih0PTAsZT0wKXtRbC5wcm90b3R5cGUuaXNWZWN0b3IyPSEwLHRoaXMueD10LHRoaXMueT1lfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnh9c2V0IHdpZHRoKHQpe3RoaXMueD10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy55fXNldCBoZWlnaHQodCl7dGhpcy55PXR9c2V0KHQsZSl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbM10qbityWzZdLHRoaXMueT1yWzFdKmUrcls0XSpuK3JbN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9S2wodGhpcy54LHQueCxlLngpLHRoaXMueT1LbCh0aGlzLnksdC55LGUueSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9S2wodGhpcy54LHQsZSksdGhpcy55PUtsKHRoaXMueSx0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKEtsKG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0Lnl9Y3Jvc3ModCl7cmV0dXJuIHRoaXMueCp0LnktdGhpcy55KnQueH1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfWFuZ2xlKCl7cmV0dXJuIE1hdGguYXRhbjIoLXRoaXMueSwtdGhpcy54KStNYXRoLlBJfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoMD09PWUpcmV0dXJuIE1hdGguUEkvMjtjb25zdCBuPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhLbChuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueTtyZXR1cm4gZSplK24qbn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnl9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBuPU1hdGguY29zKGUpLHI9TWF0aC5zaW4oZSksaT10aGlzLngtdC54LG89dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PWkqbi1vKnIrdC54LHRoaXMueT1pKnIrbypuK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnl9fWNsYXNzICRse2NvbnN0cnVjdG9yKHQsZSxuLHIsaSxvLHMsYSx1KXskbC5wcm90b3R5cGUuaXNNYXRyaXgzPSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXSx2b2lkIDAhPT10JiZ0aGlzLnNldCh0LGUsbixyLGksbyxzLGEsdSl9c2V0KHQsZSxuLHIsaSxvLHMsYSx1KXtjb25zdCBjPXRoaXMuZWxlbWVudHM7cmV0dXJuIGNbMF09dCxjWzFdPXIsY1syXT1zLGNbM109ZSxjWzRdPWksY1s1XT1hLGNbNl09bixjWzddPW8sY1s4XT11LHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDIpLHRoaXN9c2V0RnJvbU1hdHJpeDQodCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbNF0sZVs4XSxlWzFdLGVbNV0sZVs5XSxlWzJdLGVbNl0sZVsxMF0pLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgbj10LmVsZW1lbnRzLHI9ZS5lbGVtZW50cyxpPXRoaXMuZWxlbWVudHMsbz1uWzBdLHM9blszXSxhPW5bNl0sdT1uWzFdLGM9bls0XSxsPW5bN10saD1uWzJdLGY9bls1XSxwPW5bOF0sZD1yWzBdLGc9clszXSx5PXJbNl0sbT1yWzFdLHY9cls0XSxfPXJbN10seD1yWzJdLHc9cls1XSxiPXJbOF07cmV0dXJuIGlbMF09bypkK3MqbSthKngsaVszXT1vKmcrcyp2K2EqdyxpWzZdPW8qeStzKl8rYSpiLGlbMV09dSpkK2MqbStsKngsaVs0XT11KmcrYyp2K2wqdyxpWzddPXUqeStjKl8rbCpiLGlbMl09aCpkK2YqbStwKngsaVs1XT1oKmcrZip2K3AqdyxpWzhdPWgqeStmKl8rcCpiLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbM10qPXQsZVs2XSo9dCxlWzFdKj10LGVbNF0qPXQsZVs3XSo9dCxlWzJdKj10LGVbNV0qPXQsZVs4XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scj10WzJdLGk9dFszXSxvPXRbNF0scz10WzVdLGE9dFs2XSx1PXRbN10sYz10WzhdO3JldHVybiBlKm8qYy1lKnMqdS1uKmkqYytuKnMqYStyKmkqdS1yKm8qYX1pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdLG89dFs0XSxzPXRbNV0sYT10WzZdLHU9dFs3XSxjPXRbOF0sbD1jKm8tcyp1LGg9cyphLWMqaSxmPXUqaS1vKmEscD1lKmwrbipoK3IqZjtpZigwPT09cClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IGQ9MS9wO3JldHVybiB0WzBdPWwqZCx0WzFdPShyKnUtYypuKSpkLHRbMl09KHMqbi1yKm8pKmQsdFszXT1oKmQsdFs0XT0oYyplLXIqYSkqZCx0WzVdPShyKmktcyplKSpkLHRbNl09ZipkLHRbN109KG4qYS11KmUpKmQsdFs4XT0obyplLW4qaSkqZCx0aGlzfXRyYW5zcG9zZSgpe2xldCB0O2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdD1lWzFdLGVbMV09ZVszXSxlWzNdPXQsdD1lWzJdLGVbMl09ZVs2XSxlWzZdPXQsdD1lWzVdLGVbNV09ZVs3XSxlWzddPXQsdGhpc31nZXROb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQodCkuaW52ZXJ0KCkudHJhbnNwb3NlKCl9dHJhbnNwb3NlSW50b0FycmF5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF0sdGhpc31zZXRVdlRyYW5zZm9ybSh0LGUsbixyLGksbyxzKXtjb25zdCBhPU1hdGguY29zKGkpLHU9TWF0aC5zaW4oaSk7cmV0dXJuIHRoaXMuc2V0KG4qYSxuKnUsLW4qKGEqbyt1KnMpK28rdCwtcip1LHIqYSwtciooLXUqbythKnMpK3MrZSwwLDAsMSksdGhpc31zY2FsZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KHRoLm1ha2VTY2FsZSh0LGUpKSx0aGlzfXJvdGF0ZSh0KXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseSh0aC5tYWtlUm90YXRpb24oLXQpKSx0aGlzfXRyYW5zbGF0ZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KHRoLm1ha2VUcmFuc2xhdGlvbih0LGUpKSx0aGlzfW1ha2VUcmFuc2xhdGlvbih0LGUpe3JldHVybiB0LmlzVmVjdG9yMj90aGlzLnNldCgxLDAsdC54LDAsMSx0LnksMCwwLDEpOnRoaXMuc2V0KDEsMCx0LDAsMSxlLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbih0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLW4sMCxuLGUsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCxlLDAsMCwwLDEpLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCB0PTA7dDw5O3QrKylpZihlW3RdIT09blt0XSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdH1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfX1jb25zdCB0aD1uZXcgJGw7ZnVuY3Rpb24gZWgodCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsdCl9Y29uc3Qgbmg9KG5ldyAkbCkuc2V0KC40MTIzOTA4LC4zNTc1ODQzLC4xODA0ODA4LC4yMTI2MzksLjcxNTE2ODcsLjA3MjE5MjMsLjAxOTMzMDgsLjExOTE5NDgsLjk1MDUzMjIpLHJoPShuZXcgJGwpLnNldCgzLjI0MDk2OTksLTEuNTM3MzgzMiwtLjQ5ODYxMDgsLS45NjkyNDM2LDEuODc1OTY3NSwuMDQxNTU1MSwuMDU1NjMwMSwtLjIwMzk3NywxLjA1Njk3MTUpO2NvbnN0IGloPWZ1bmN0aW9uKCl7Y29uc3QgdD17ZW5hYmxlZDohMCx3b3JraW5nQ29sb3JTcGFjZTpWbCxzcGFjZXM6e30sY29udmVydDpmdW5jdGlvbih0LGUsbil7cmV0dXJuITE9PT10aGlzLmVuYWJsZWR8fGU9PT1ufHwhZXx8IW58fCh0aGlzLnNwYWNlc1tlXS50cmFuc2Zlcj09PVlsJiYodC5yPW9oKHQuciksdC5nPW9oKHQuZyksdC5iPW9oKHQuYikpLHRoaXMuc3BhY2VzW2VdLnByaW1hcmllcyE9PXRoaXMuc3BhY2VzW25dLnByaW1hcmllcyYmKHQuYXBwbHlNYXRyaXgzKHRoaXMuc3BhY2VzW2VdLnRvWFlaKSx0LmFwcGx5TWF0cml4Myh0aGlzLnNwYWNlc1tuXS5mcm9tWFlaKSksdGhpcy5zcGFjZXNbbl0udHJhbnNmZXI9PT1ZbCYmKHQucj1zaCh0LnIpLHQuZz1zaCh0LmcpLHQuYj1zaCh0LmIpKSksdH0sZnJvbVdvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29udmVydCh0LHRoaXMud29ya2luZ0NvbG9yU3BhY2UsZSl9LHRvV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb252ZXJ0KHQsZSx0aGlzLndvcmtpbmdDb2xvclNwYWNlKX0sZ2V0UHJpbWFyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNwYWNlc1t0XS5wcmltYXJpZXN9LGdldFRyYW5zZmVyOmZ1bmN0aW9uKHQpe3JldHVybiIiPT09dD9HbDp0aGlzLnNwYWNlc1t0XS50cmFuc2Zlcn0sZ2V0THVtaW5hbmNlQ29lZmZpY2llbnRzOmZ1bmN0aW9uKHQsZT10aGlzLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gdC5mcm9tQXJyYXkodGhpcy5zcGFjZXNbZV0ubHVtaW5hbmNlQ29lZmZpY2llbnRzKX0sZGVmaW5lOmZ1bmN0aW9uKHQpe09iamVjdC5hc3NpZ24odGhpcy5zcGFjZXMsdCl9LF9nZXRNYXRyaXg6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0LmNvcHkodGhpcy5zcGFjZXNbZV0udG9YWVopLm11bHRpcGx5KHRoaXMuc3BhY2VzW25dLmZyb21YWVopfSxfZ2V0RHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3BhY2VzW3RdLm91dHB1dENvbG9yU3BhY2VDb25maWcuZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2V9LF9nZXRVbnBhY2tDb2xvclNwYWNlOmZ1bmN0aW9uKHQ9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMuc3BhY2VzW3RdLndvcmtpbmdDb2xvclNwYWNlQ29uZmlnLnVucGFja0NvbG9yU3BhY2V9fSxlPVsuNjQsLjMzLC4zLC42LC4xNSwuMDZdLG49Wy4yMTI2LC43MTUyLC4wNzIyXSxyPVsuMzEyNywuMzI5XTtyZXR1cm4gdC5kZWZpbmUoe1tWbF06e3ByaW1hcmllczplLHdoaXRlUG9pbnQ6cix0cmFuc2ZlcjpHbCx0b1hZWjpuaCxmcm9tWFlaOnJoLGx1bWluYW5jZUNvZWZmaWNpZW50czpuLHdvcmtpbmdDb2xvclNwYWNlQ29uZmlnOnt1bnBhY2tDb2xvclNwYWNlOnFsfSxvdXRwdXRDb2xvclNwYWNlQ29uZmlnOntkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTpxbH19LFtxbF06e3ByaW1hcmllczplLHdoaXRlUG9pbnQ6cix0cmFuc2ZlcjpZbCx0b1hZWjpuaCxmcm9tWFlaOnJoLGx1bWluYW5jZUNvZWZmaWNpZW50czpuLG91dHB1dENvbG9yU3BhY2VDb25maWc6e2RyYXdpbmdCdWZmZXJDb2xvclNwYWNlOnFsfX19KSx0fSgpO2Z1bmN0aW9uIG9oKHQpe3JldHVybiB0PC4wNDA0NT8uMDc3Mzk5MzgwOCp0Ok1hdGgucG93KC45NDc4NjcyOTg2KnQrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBzaCh0KXtyZXR1cm4gdDwuMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsLjQxNjY2KS0uMDU1fWxldCBhaDtjbGFzcyB1aHtzdGF0aWMgZ2V0RGF0YVVSTCh0KXtpZigvXmRhdGE6L2kudGVzdCh0LnNyYyl8fCJ1bmRlZmluZWQiPT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQpcmV0dXJuIHQuc3JjO2xldCBlO2lmKHQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCllPXQ7ZWxzZXt2b2lkIDA9PT1haCYmKGFoPWVoKCJjYW52YXMiKSksYWgud2lkdGg9dC53aWR0aCxhaC5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgbj1haC5nZXRDb250ZXh0KCIyZCIpO3QgaW5zdGFuY2VvZiBJbWFnZURhdGE/bi5wdXRJbWFnZURhdGEodCwwLDApOm4uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGU9YWh9cmV0dXJuIGUudG9EYXRhVVJMKCJpbWFnZS9wbmciKX1zdGF0aWMgc1JHQlRvTGluZWFyKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZUJpdG1hcCYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwKXtjb25zdCBlPWVoKCJjYW52YXMiKTtlLndpZHRoPXQud2lkdGgsZS5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgbj1lLmdldENvbnRleHQoIjJkIik7bi5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCk7Y29uc3Qgcj1uLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCksaT1yLmRhdGE7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0KyspaVt0XT0yNTUqb2goaVt0XS8yNTUpO3JldHVybiBuLnB1dEltYWdlRGF0YShyLDAsMCksZX1pZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVt0XT1NYXRoLmZsb29yKDI1NSpvaChlW3RdLzI1NSkpOmVbdF09b2goZVt0XSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19cmV0dXJuIHR9fWxldCBjaD0wO2NsYXNzIGxoe2NvbnN0cnVjdG9yKHQ9bnVsbCl7dGhpcy5pc1NvdXJjZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpjaCsrfSksdGhpcy51dWlkPVpsKCksdGhpcy5kYXRhPXQsdGhpcy5kYXRhUmVhZHk9ITAsdGhpcy52ZXJzaW9uPTB9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0O2lmKCFlJiZ2b2lkIDAhPT10LmltYWdlc1t0aGlzLnV1aWRdKXJldHVybiB0LmltYWdlc1t0aGlzLnV1aWRdO2NvbnN0IG49e3V1aWQ6dGhpcy51dWlkLHVybDoiIn0scj10aGlzLmRhdGE7aWYobnVsbCE9PXIpe2xldCB0O2lmKEFycmF5LmlzQXJyYXkocikpe3Q9W107Zm9yKGxldCBlPTAsbj1yLmxlbmd0aDtlPG47ZSsrKXJbZV0uaXNEYXRhVGV4dHVyZT90LnB1c2goaGgocltlXS5pbWFnZSkpOnQucHVzaChoaChyW2VdKSl9ZWxzZSB0PWhoKHIpO24udXJsPXR9cmV0dXJuIGV8fCh0LmltYWdlc1t0aGlzLnV1aWRdPW4pLG59fWZ1bmN0aW9uIGhoKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZUJpdG1hcCYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwP3VoLmdldERhdGFVUkwodCk6dC5kYXRhP3tkYXRhOkFycmF5LmZyb20odC5kYXRhKSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodCx0eXBlOnQuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTp7fX1sZXQgZmg9MDtjbGFzcyBwaCBleHRlbmRzIFdse2NvbnN0cnVjdG9yKHQ9cGguREVGQVVMVF9JTUFHRSxlPXBoLkRFRkFVTFRfTUFQUElORyxuPVVsLHI9VWwsaT0xMDA2LG89MTAwOCxzPTEwMjMsYT0xMDA5LHU9cGguREVGQVVMVF9BTklTT1RST1BZLGM9IiIpe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6ZmgrK30pLHRoaXMudXVpZD1abCgpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgbGgodCksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz1lLHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPXIsdGhpcy5tYWdGaWx0ZXI9aSx0aGlzLm1pbkZpbHRlcj1vLHRoaXMuYW5pc290cm9weT11LHRoaXMuZm9ybWF0PXMsdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1hLHRoaXMub2Zmc2V0PW5ldyBRbCgwLDApLHRoaXMucmVwZWF0PW5ldyBRbCgxLDEpLHRoaXMuY2VudGVyPW5ldyBRbCgwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3ICRsLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5jb2xvclNwYWNlPWMsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5yZW5kZXJUYXJnZXQ9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMSx0aGlzLnBtcmVtVmVyc2lvbj0wfWdldCBpbWFnZSgpe3JldHVybiB0aGlzLnNvdXJjZS5kYXRhfXNldCBpbWFnZSh0PW51bGwpe3RoaXMuc291cmNlLmRhdGE9dH11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSh0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuc291cmNlPXQuc291cmNlLHRoaXMubWlwbWFwcz10Lm1pcG1hcHMuc2xpY2UoMCksdGhpcy5tYXBwaW5nPXQubWFwcGluZyx0aGlzLmNoYW5uZWw9dC5jaGFubmVsLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmNvbG9yU3BhY2U9dC5jb2xvclNwYWNlLHRoaXMucmVuZGVyVGFyZ2V0PXQucmVuZGVyVGFyZ2V0LHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpcy5uZWVkc1VwZGF0ZT0hMCx0aGlzfXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdDtpZighZSYmdm9pZCAwIT09dC50ZXh0dXJlc1t0aGlzLnV1aWRdKXJldHVybiB0LnRleHR1cmVzW3RoaXMudXVpZF07Y29uc3Qgbj17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxpbWFnZTp0aGlzLnNvdXJjZS50b0pTT04odCkudXVpZCxtYXBwaW5nOnRoaXMubWFwcGluZyxjaGFubmVsOnRoaXMuY2hhbm5lbCxyZXBlYXQ6W3RoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueV0sb2Zmc2V0Olt0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnldLGNlbnRlcjpbdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55XSxyb3RhdGlvbjp0aGlzLnJvdGF0aW9uLHdyYXA6W3RoaXMud3JhcFMsdGhpcy53cmFwVF0sZm9ybWF0OnRoaXMuZm9ybWF0LGludGVybmFsRm9ybWF0OnRoaXMuaW50ZXJuYWxGb3JtYXQsdHlwZTp0aGlzLnR5cGUsY29sb3JTcGFjZTp0aGlzLmNvbG9yU3BhY2UsbWluRmlsdGVyOnRoaXMubWluRmlsdGVyLG1hZ0ZpbHRlcjp0aGlzLm1hZ0ZpbHRlcixhbmlzb3Ryb3B5OnRoaXMuYW5pc290cm9weSxmbGlwWTp0aGlzLmZsaXBZLGdlbmVyYXRlTWlwbWFwczp0aGlzLmdlbmVyYXRlTWlwbWFwcyxwcmVtdWx0aXBseUFscGhhOnRoaXMucHJlbXVsdGlwbHlBbHBoYSx1bnBhY2tBbGlnbm1lbnQ6dGhpcy51bnBhY2tBbGlnbm1lbnR9O3JldHVybiBPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSksZXx8KHQudGV4dHVyZXNbdGhpcy51dWlkXT1uKSxufWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9dHJhbnNmb3JtVXYodCl7aWYoMzAwIT09dGhpcy5tYXBwaW5nKXJldHVybiB0O2lmKHQuYXBwbHlNYXRyaXgzKHRoaXMubWF0cml4KSx0Lng8MHx8dC54PjEpc3dpdGNoKHRoaXMud3JhcFMpe2Nhc2UgMWUzOnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrO2Nhc2UgVWw6dC54PXQueDwwPzA6MTticmVhaztjYXNlIDEwMDI6MT09PU1hdGguYWJzKE1hdGguZmxvb3IodC54KSUyKT90Lng9TWF0aC5jZWlsKHQueCktdC54OnQueD10LngtTWF0aC5mbG9vcih0LngpfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxZTM6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWs7Y2FzZSBVbDp0Lnk9dC55PDA/MDoxO2JyZWFrO2Nhc2UgMTAwMjoxPT09TWF0aC5hYnMoTWF0aC5mbG9vcih0LnkpJTIpP3QueT1NYXRoLmNlaWwodC55KS10Lnk6dC55PXQueS1NYXRoLmZsb29yKHQueSl9cmV0dXJuIHRoaXMuZmxpcFkmJih0Lnk9MS10LnkpLHR9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmKHRoaXMudmVyc2lvbisrLHRoaXMuc291cmNlLm5lZWRzVXBkYXRlPSEwKX1zZXQgbmVlZHNQTVJFTVVwZGF0ZSh0KXshMD09PXQmJnRoaXMucG1yZW1WZXJzaW9uKyt9fXBoLkRFRkFVTFRfSU1BR0U9bnVsbCxwaC5ERUZBVUxUX01BUFBJTkc9MzAwLHBoLkRFRkFVTFRfQU5JU09UUk9QWT0xO2NsYXNzIGRoe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHI9MSl7ZGgucHJvdG90eXBlLmlzVmVjdG9yND0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9cn1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy56fXNldCB3aWR0aCh0KXt0aGlzLno9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMud31zZXQgaGVpZ2h0KHQpe3RoaXMudz10fXNldCh0LGUsbixyKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PXIsdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXMuej10LHRoaXMudz10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldFoodCl7cmV0dXJuIHRoaXMuej10LHRoaXN9c2V0Vyh0KXtyZXR1cm4gdGhpcy53PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7Y2FzZSAzOnRoaXMudz1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtjYXNlIDM6cmV0dXJuIHRoaXMudztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXMudz12b2lkIDAhPT10Lnc/dC53OjEsdGhpc31hZGQodCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMueis9dC56LHRoaXMudys9dC53LHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXMueis9dCx0aGlzLncrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXMudz10LncrZS53LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXMudys9dC53KmUsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMuei09dC56LHRoaXMudy09dC53LHRoaXN9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXMuei09dCx0aGlzLnctPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXMudz10LnctZS53LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXMudyo9dC53LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXMudyo9dCx0aGlzfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxyPXRoaXMueixpPXRoaXMudyxvPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1vWzBdKmUrb1s0XSpuK29bOF0qcitvWzEyXSppLHRoaXMueT1vWzFdKmUrb1s1XSpuK29bOV0qcitvWzEzXSppLHRoaXMuej1vWzJdKmUrb1s2XSpuK29bMTBdKnIrb1sxNF0qaSx0aGlzLnc9b1szXSplK29bN10qbitvWzExXSpyK29bMTVdKmksdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXMudy89dC53LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24odCl7dGhpcy53PTIqTWF0aC5hY29zKHQudyk7Y29uc3QgZT1NYXRoLnNxcnQoMS10LncqdC53KTtyZXR1cm4gZTwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD10LngvZSx0aGlzLnk9dC55L2UsdGhpcy56PXQuei9lKSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZSxuLHIsaTtjb25zdCBvPS4wMSxzPS4xLGE9dC5lbGVtZW50cyx1PWFbMF0sYz1hWzRdLGw9YVs4XSxoPWFbMV0sZj1hWzVdLHA9YVs5XSxkPWFbMl0sZz1hWzZdLHk9YVsxMF07aWYoTWF0aC5hYnMoYy1oKTxvJiZNYXRoLmFicyhsLWQpPG8mJk1hdGguYWJzKHAtZyk8byl7aWYoTWF0aC5hYnMoYytoKTxzJiZNYXRoLmFicyhsK2QpPHMmJk1hdGguYWJzKHArZyk8cyYmTWF0aC5hYnModStmK3ktMyk8cylyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3QgdD0odSsxKS8yLGE9KGYrMSkvMixtPSh5KzEpLzIsdj0oYytoKS80LF89KGwrZCkvNCx4PShwK2cpLzQ7cmV0dXJuIHQ+YSYmdD5tP3Q8bz8obj0wLHI9LjcwNzEwNjc4MSxpPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh0KSxyPXYvbixpPV8vbik6YT5tP2E8bz8obj0uNzA3MTA2NzgxLHI9MCxpPS43MDcxMDY3ODEpOihyPU1hdGguc3FydChhKSxuPXYvcixpPXgvcik6bTxvPyhuPS43MDcxMDY3ODEscj0uNzA3MTA2NzgxLGk9MCk6KGk9TWF0aC5zcXJ0KG0pLG49Xy9pLHI9eC9pKSx0aGlzLnNldChuLHIsaSxlKSx0aGlzfWxldCBtPU1hdGguc3FydCgoZy1wKSooZy1wKSsobC1kKSoobC1kKSsoaC1jKSooaC1jKSk7cmV0dXJuIE1hdGguYWJzKG0pPC4wMDEmJihtPTEpLHRoaXMueD0oZy1wKS9tLHRoaXMueT0obC1kKS9tLHRoaXMuej0oaC1jKS9tLHRoaXMudz1NYXRoLmFjb3MoKHUrZit5LTEpLzIpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpcy53PWVbMTVdLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1LbCh0aGlzLngsdC54LGUueCksdGhpcy55PUtsKHRoaXMueSx0LnksZS55KSx0aGlzLno9S2wodGhpcy56LHQueixlLnopLHRoaXMudz1LbCh0aGlzLncsdC53LGUudyksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9S2wodGhpcy54LHQsZSksdGhpcy55PUtsKHRoaXMueSx0LGUpLHRoaXMuej1LbCh0aGlzLnosdCxlKSx0aGlzLnc9S2wodGhpcy53LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoS2wobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpcy53PU1hdGgudHJ1bmModGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXMudz10LncrKGUudy10LncpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpcy53PXRbZSszXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpcy53PXQuZ2V0VyhlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzLnc9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56LHlpZWxkIHRoaXMud319Y2xhc3MgZ2h7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscj0xKXt0aGlzLmlzUXVhdGVybmlvbj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PXJ9c3RhdGljIHNsZXJwRmxhdCh0LGUsbixyLGksbyxzKXtsZXQgYT1uW3IrMF0sdT1uW3IrMV0sYz1uW3IrMl0sbD1uW3IrM107Y29uc3QgaD1pW28rMF0sZj1pW28rMV0scD1pW28rMl0sZD1pW28rM107aWYoMD09PXMpcmV0dXJuIHRbZSswXT1hLHRbZSsxXT11LHRbZSsyXT1jLHZvaWQodFtlKzNdPWwpO2lmKDE9PT1zKXJldHVybiB0W2UrMF09aCx0W2UrMV09Zix0W2UrMl09cCx2b2lkKHRbZSszXT1kKTtpZihsIT09ZHx8YSE9PWh8fHUhPT1mfHxjIT09cCl7bGV0IHQ9MS1zO2NvbnN0IGU9YSpoK3UqZitjKnArbCpkLG49ZT49MD8xOi0xLHI9MS1lKmU7aWYocj5OdW1iZXIuRVBTSUxPTil7Y29uc3QgaT1NYXRoLnNxcnQociksbz1NYXRoLmF0YW4yKGksZSpuKTt0PU1hdGguc2luKHQqbykvaSxzPU1hdGguc2luKHMqbykvaX1jb25zdCBpPXMqbjtpZihhPWEqdCtoKmksdT11KnQrZippLGM9Yyp0K3AqaSxsPWwqdCtkKmksdD09PTEtcyl7Y29uc3QgdD0xL01hdGguc3FydChhKmErdSp1K2MqYytsKmwpO2EqPXQsdSo9dCxjKj10LGwqPXR9fXRbZV09YSx0W2UrMV09dSx0W2UrMl09Yyx0W2UrM109bH1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLG4scixpLG8pe2NvbnN0IHM9bltyXSxhPW5bcisxXSx1PW5bcisyXSxjPW5bciszXSxsPWlbb10saD1pW28rMV0sZj1pW28rMl0scD1pW28rM107cmV0dXJuIHRbZV09cypwK2MqbCthKmYtdSpoLHRbZSsxXT1hKnArYypoK3UqbC1zKmYsdFtlKzJdPXUqcCtjKmYrcypoLWEqbCx0W2UrM109YypwLXMqbC1hKmgtdSpmLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixyKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1yLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGU9ITApe2NvbnN0IG49dC5feCxyPXQuX3ksaT10Ll96LG89dC5fb3JkZXIscz1NYXRoLmNvcyxhPU1hdGguc2luLHU9cyhuLzIpLGM9cyhyLzIpLGw9cyhpLzIpLGg9YShuLzIpLGY9YShyLzIpLHA9YShpLzIpO3N3aXRjaChvKXtjYXNlIlhZWiI6dGhpcy5feD1oKmMqbCt1KmYqcCx0aGlzLl95PXUqZipsLWgqYypwLHRoaXMuX3o9dSpjKnAraCpmKmwsdGhpcy5fdz11KmMqbC1oKmYqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1oKmMqbCt1KmYqcCx0aGlzLl95PXUqZipsLWgqYypwLHRoaXMuX3o9dSpjKnAtaCpmKmwsdGhpcy5fdz11KmMqbCtoKmYqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1oKmMqbC11KmYqcCx0aGlzLl95PXUqZipsK2gqYypwLHRoaXMuX3o9dSpjKnAraCpmKmwsdGhpcy5fdz11KmMqbC1oKmYqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1oKmMqbC11KmYqcCx0aGlzLl95PXUqZipsK2gqYypwLHRoaXMuX3o9dSpjKnAtaCpmKmwsdGhpcy5fdz11KmMqbCtoKmYqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1oKmMqbCt1KmYqcCx0aGlzLl95PXUqZipsK2gqYypwLHRoaXMuX3o9dSpjKnAtaCpmKmwsdGhpcy5fdz11KmMqbC1oKmYqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1oKmMqbC11KmYqcCx0aGlzLl95PXUqZipsLWgqYypwLHRoaXMuX3o9dSpjKnAraCpmKmwsdGhpcy5fdz11KmMqbCtoKmYqcH1yZXR1cm4hMD09PWUmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21BeGlzQW5nbGUodCxlKXtjb25zdCBuPWUvMixyPU1hdGguc2luKG4pO3JldHVybiB0aGlzLl94PXQueCpyLHRoaXMuX3k9dC55KnIsdGhpcy5fej10Lnoqcix0aGlzLl93PU1hdGguY29zKG4pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KXtjb25zdCBlPXQuZWxlbWVudHMsbj1lWzBdLHI9ZVs0XSxpPWVbOF0sbz1lWzFdLHM9ZVs1XSxhPWVbOV0sdT1lWzJdLGM9ZVs2XSxsPWVbMTBdLGg9bitzK2w7aWYoaD4wKXtjb25zdCB0PS41L01hdGguc3FydChoKzEpO3RoaXMuX3c9LjI1L3QsdGhpcy5feD0oYy1hKSp0LHRoaXMuX3k9KGktdSkqdCx0aGlzLl96PShvLXIpKnR9ZWxzZSBpZihuPnMmJm4+bCl7Y29uc3QgdD0yKk1hdGguc3FydCgxK24tcy1sKTt0aGlzLl93PShjLWEpL3QsdGhpcy5feD0uMjUqdCx0aGlzLl95PShyK28pL3QsdGhpcy5fej0oaSt1KS90fWVsc2UgaWYocz5sKXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErcy1uLWwpO3RoaXMuX3c9KGktdSkvdCx0aGlzLl94PShyK28pL3QsdGhpcy5feT0uMjUqdCx0aGlzLl96PShhK2MpL3R9ZWxzZXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErbC1uLXMpO3RoaXMuX3c9KG8tcikvdCx0aGlzLl94PShpK3UpL3QsdGhpcy5feT0oYStjKS90LHRoaXMuX3o9LjI1KnR9cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Vbml0VmVjdG9ycyh0LGUpe2xldCBuPXQuZG90KGUpKzE7cmV0dXJuIG48TnVtYmVyLkVQU0lMT04/KG49MCxNYXRoLmFicyh0LngpPk1hdGguYWJzKHQueik/KHRoaXMuX3g9LXQueSx0aGlzLl95PXQueCx0aGlzLl96PTAsdGhpcy5fdz1uKToodGhpcy5feD0wLHRoaXMuX3k9LXQueix0aGlzLl96PXQueSx0aGlzLl93PW4pKToodGhpcy5feD10LnkqZS56LXQueiplLnksdGhpcy5feT10LnoqZS54LXQueCplLnosdGhpcy5fej10LngqZS55LXQueSplLngsdGhpcy5fdz1uKSx0aGlzLm5vcm1hbGl6ZSgpfWFuZ2xlVG8odCl7cmV0dXJuIDIqTWF0aC5hY29zKE1hdGguYWJzKEtsKHRoaXMuZG90KHQpLC0xLDEpKSl9cm90YXRlVG93YXJkcyh0LGUpe2NvbnN0IG49dGhpcy5hbmdsZVRvKHQpO2lmKDA9PT1uKXJldHVybiB0aGlzO2NvbnN0IHI9TWF0aC5taW4oMSxlL24pO3JldHVybiB0aGlzLnNsZXJwKHQsciksdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgwLDAsMCwxKX1pbnZlcnQoKXtyZXR1cm4gdGhpcy5jb25qdWdhdGUoKX1jb25qdWdhdGUoKXtyZXR1cm4gdGhpcy5feCo9LTEsdGhpcy5feSo9LTEsdGhpcy5feio9LTEsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLl94KnQuX3grdGhpcy5feSp0Ll95K3RoaXMuX3oqdC5feit0aGlzLl93KnQuX3d9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93KX1ub3JtYWxpemUoKXtsZXQgdD10aGlzLmxlbmd0aCgpO3JldHVybiAwPT09dD8odGhpcy5feD0wLHRoaXMuX3k9MCx0aGlzLl96PTAsdGhpcy5fdz0xKToodD0xL3QsdGhpcy5feD10aGlzLl94KnQsdGhpcy5feT10aGlzLl95KnQsdGhpcy5fej10aGlzLl96KnQsdGhpcy5fdz10aGlzLl93KnQpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHQsdGhpcyl9bXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpe2NvbnN0IG49dC5feCxyPXQuX3ksaT10Ll96LG89dC5fdyxzPWUuX3gsYT1lLl95LHU9ZS5feixjPWUuX3c7cmV0dXJuIHRoaXMuX3g9bipjK28qcytyKnUtaSphLHRoaXMuX3k9cipjK28qYStpKnMtbip1LHRoaXMuX3o9aSpjK28qdStuKmEtcipzLHRoaXMuX3c9bypjLW4qcy1yKmEtaSp1LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwKHQsZSl7aWYoMD09PWUpcmV0dXJuIHRoaXM7aWYoMT09PWUpcmV0dXJuIHRoaXMuY29weSh0KTtjb25zdCBuPXRoaXMuX3gscj10aGlzLl95LGk9dGhpcy5feixvPXRoaXMuX3c7bGV0IHM9byp0Ll93K24qdC5feCtyKnQuX3kraSp0Ll96O2lmKHM8MD8odGhpcy5fdz0tdC5fdyx0aGlzLl94PS10Ll94LHRoaXMuX3k9LXQuX3ksdGhpcy5fej0tdC5feixzPS1zKTp0aGlzLmNvcHkodCkscz49MSlyZXR1cm4gdGhpcy5fdz1vLHRoaXMuX3g9bix0aGlzLl95PXIsdGhpcy5fej1pLHRoaXM7Y29uc3QgYT0xLXMqcztpZihhPD1OdW1iZXIuRVBTSUxPTil7Y29uc3QgdD0xLWU7cmV0dXJuIHRoaXMuX3c9dCpvK2UqdGhpcy5fdyx0aGlzLl94PXQqbitlKnRoaXMuX3gsdGhpcy5feT10KnIrZSp0aGlzLl95LHRoaXMuX3o9dCppK2UqdGhpcy5feix0aGlzLm5vcm1hbGl6ZSgpLHRoaXN9Y29uc3QgdT1NYXRoLnNxcnQoYSksYz1NYXRoLmF0YW4yKHUscyksbD1NYXRoLnNpbigoMS1lKSpjKS91LGg9TWF0aC5zaW4oZSpjKS91O3JldHVybiB0aGlzLl93PW8qbCt0aGlzLl93KmgsdGhpcy5feD1uKmwrdGhpcy5feCpoLHRoaXMuX3k9cipsK3RoaXMuX3kqaCx0aGlzLl96PWkqbCt0aGlzLl96KmgsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2xlcnBRdWF0ZXJuaW9ucyh0LGUsbil7cmV0dXJuIHRoaXMuY29weSh0KS5zbGVycChlLG4pfXJhbmRvbSgpe2NvbnN0IHQ9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksZT0yKk1hdGguUEkqTWF0aC5yYW5kb20oKSxuPU1hdGgucmFuZG9tKCkscj1NYXRoLnNxcnQoMS1uKSxpPU1hdGguc3FydChuKTtyZXR1cm4gdGhpcy5zZXQocipNYXRoLnNpbih0KSxyKk1hdGguY29zKHQpLGkqTWF0aC5zaW4oZSksaSpNYXRoLmNvcyhlKSl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll93PT09dGhpcy5fd31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLl94PXRbZV0sdGhpcy5feT10W2UrMV0sdGhpcy5fej10W2UrMl0sdGhpcy5fdz10W2UrM10sdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5feCx0W2UrMV09dGhpcy5feSx0W2UrMl09dGhpcy5feix0W2UrM109dGhpcy5fdyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5feD10LmdldFgoZSksdGhpcy5feT10LmdldFkoZSksdGhpcy5fej10LmdldFooZSksdGhpcy5fdz10LmdldFcoZSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9BcnJheSgpfV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fd319Y2xhc3MgeWh7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe3loLnByb3RvdHlwZS5pc1ZlY3RvcjM9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW59c2V0KHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKHZoLnNldEZyb21FdWxlcih0KSl9YXBwbHlBeGlzQW5nbGUodCxlKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24odmguc2V0RnJvbUF4aXNBbmdsZSh0LGUpKX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbM10qbitpWzZdKnIsdGhpcy55PWlbMV0qZStpWzRdKm4raVs3XSpyLHRoaXMuej1pWzJdKmUraVs1XSpuK2lbOF0qcix0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10LmVsZW1lbnRzLG89MS8oaVszXSplK2lbN10qbitpWzExXSpyK2lbMTVdKTtyZXR1cm4gdGhpcy54PShpWzBdKmUraVs0XSpuK2lbOF0qcitpWzEyXSkqbyx0aGlzLnk9KGlbMV0qZStpWzVdKm4raVs5XSpyK2lbMTNdKSpvLHRoaXMuej0oaVsyXSplK2lbNl0qbitpWzEwXSpyK2lbMTRdKSpvLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dGhpcy56LGk9dC54LG89dC55LHM9dC56LGE9dC53LHU9MioobypyLXMqbiksYz0yKihzKmUtaSpyKSxsPTIqKGkqbi1vKmUpO3JldHVybiB0aGlzLng9ZSthKnUrbypsLXMqYyx0aGlzLnk9bithKmMrcyp1LWkqbCx0aGlzLno9cithKmwraSpjLW8qdSx0aGlzfXByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbNF0qbitpWzhdKnIsdGhpcy55PWlbMV0qZStpWzVdKm4raVs5XSpyLHRoaXMuej1pWzJdKmUraVs2XSpuK2lbMTBdKnIsdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9S2wodGhpcy54LHQueCxlLngpLHRoaXMueT1LbCh0aGlzLnksdC55LGUueSksdGhpcy56PUtsKHRoaXMueix0LnosZS56KSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1LbCh0aGlzLngsdCxlKSx0aGlzLnk9S2wodGhpcy55LHQsZSksdGhpcy56PUtsKHRoaXMueix0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKEtsKG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpcy56PU1hdGgudHJ1bmModGhpcy56KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0Lnp9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnp9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueil9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXMuej10LnorKGUuei10LnopKm4sdGhpc31jcm9zcyh0KXtyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnModGhpcyx0KX1jcm9zc1ZlY3RvcnModCxlKXtjb25zdCBuPXQueCxyPXQueSxpPXQueixvPWUueCxzPWUueSxhPWUuejtyZXR1cm4gdGhpcy54PXIqYS1pKnMsdGhpcy55PWkqby1uKmEsdGhpcy56PW4qcy1yKm8sdGhpc31wcm9qZWN0T25WZWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aFNxKCk7aWYoMD09PWUpcmV0dXJuIHRoaXMuc2V0KDAsMCwwKTtjb25zdCBuPXQuZG90KHRoaXMpL2U7cmV0dXJuIHRoaXMuY29weSh0KS5tdWx0aXBseVNjYWxhcihuKX1wcm9qZWN0T25QbGFuZSh0KXtyZXR1cm4gbWguY29weSh0aGlzKS5wcm9qZWN0T25WZWN0b3IodCksdGhpcy5zdWIobWgpfXJlZmxlY3QodCl7cmV0dXJuIHRoaXMuc3ViKG1oLmNvcHkodCkubXVsdGlwbHlTY2FsYXIoMip0aGlzLmRvdCh0KSkpfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoMD09PWUpcmV0dXJuIE1hdGguUEkvMjtjb25zdCBuPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhLbChuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxyPXRoaXMuei10Lno7cmV0dXJuIGUqZStuKm4rcipyfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxuKXtjb25zdCByPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1yKk1hdGguc2luKG4pLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1yKk1hdGguY29zKG4pLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PW4sdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCkscj10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PW4sdGhpcy56PXIsdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsNCplKX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDMqZSl9c2V0RnJvbUV1bGVyKHQpe3JldHVybiB0aGlzLng9dC5feCx0aGlzLnk9dC5feSx0aGlzLno9dC5feix0aGlzfXNldEZyb21Db2xvcih0KXtyZXR1cm4gdGhpcy54PXQucix0aGlzLnk9dC5nLHRoaXMuej10LmIsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnp9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc31yYW5kb21EaXJlY3Rpb24oKXtjb25zdCB0PU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLGU9MipNYXRoLnJhbmRvbSgpLTEsbj1NYXRoLnNxcnQoMS1lKmUpO3JldHVybiB0aGlzLng9bipNYXRoLmNvcyh0KSx0aGlzLnk9ZSx0aGlzLno9bipNYXRoLnNpbih0KSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56fX1jb25zdCBtaD1uZXcgeWgsdmg9bmV3IGdoO2NsYXNzIF9oe2NvbnN0cnVjdG9yKHQ9bmV3IHloKDEvMCwxLzAsMS8wKSxlPW5ldyB5aCgtMS8wLC0xLzAsLTEvMCkpe3RoaXMuaXNCb3gzPSEwLHRoaXMubWluPXQsdGhpcy5tYXg9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXN9c2V0RnJvbUFycmF5KHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSs9Myl0aGlzLmV4cGFuZEJ5UG9pbnQod2guZnJvbUFycmF5KHQsZSkpO3JldHVybiB0aGlzfXNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQod2guZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IG49d2guY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7cmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKG4pLHRoaXMubWF4LmNvcHkodCkuYWRkKG4pLHRoaXN9c2V0RnJvbU9iamVjdCh0LGU9ITEpe3JldHVybiB0aGlzLm1ha2VFbXB0eSgpLHRoaXMuZXhwYW5kQnlPYmplY3QodCxlKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQubWluKSx0aGlzLm1heC5jb3B5KHQubWF4KSx0aGlzfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLm1pbi54PXRoaXMubWluLnk9dGhpcy5taW4uej0xLzAsdGhpcy5tYXgueD10aGlzLm1heC55PXRoaXMubWF4Lno9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl8fHRoaXMubWF4Lno8dGhpcy5taW4uen1nZXRDZW50ZXIodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX1nZXRTaXplKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KHQpe3JldHVybiB0aGlzLm1pbi5taW4odCksdGhpcy5tYXgubWF4KHQpLHRoaXN9ZXhwYW5kQnlWZWN0b3IodCl7cmV0dXJuIHRoaXMubWluLnN1Yih0KSx0aGlzLm1heC5hZGQodCksdGhpc31leHBhbmRCeVNjYWxhcih0KXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC10KSx0aGlzLm1heC5hZGRTY2FsYXIodCksdGhpc31leHBhbmRCeU9iamVjdCh0LGU9ITEpe3QudXBkYXRlV29ybGRNYXRyaXgoITEsITEpO2NvbnN0IG49dC5nZW9tZXRyeTtpZih2b2lkIDAhPT1uKXtjb25zdCByPW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKCEwPT09ZSYmdm9pZCAwIT09ciYmITAhPT10LmlzSW5zdGFuY2VkTWVzaClmb3IobGV0IGU9MCxuPXIuY291bnQ7ZTxuO2UrKykhMD09PXQuaXNNZXNoP3QuZ2V0VmVydGV4UG9zaXRpb24oZSx3aCk6d2guZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLGUpLHdoLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLmV4cGFuZEJ5UG9pbnQod2gpO2Vsc2Ugdm9pZCAwIT09dC5ib3VuZGluZ0JveD8obnVsbD09PXQuYm91bmRpbmdCb3gmJnQuY29tcHV0ZUJvdW5kaW5nQm94KCksYmguY29weSh0LmJvdW5kaW5nQm94KSk6KG51bGw9PT1uLmJvdW5kaW5nQm94JiZuLmNvbXB1dGVCb3VuZGluZ0JveCgpLGJoLmNvcHkobi5ib3VuZGluZ0JveCkpLGJoLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLnVuaW9uKGJoKX1jb25zdCByPXQuY2hpbGRyZW47Zm9yKGxldCB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKXRoaXMuZXhwYW5kQnlPYmplY3Qoclt0XSxlKTtyZXR1cm4gdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0Lng+PXRoaXMubWluLngmJnQueDw9dGhpcy5tYXgueCYmdC55Pj10aGlzLm1pbi55JiZ0Lnk8PXRoaXMubWF4LnkmJnQuej49dGhpcy5taW4ueiYmdC56PD10aGlzLm1heC56fWNvbnRhaW5zQm94KHQpe3JldHVybiB0aGlzLm1pbi54PD10Lm1pbi54JiZ0Lm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD10Lm1pbi55JiZ0Lm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD10Lm1pbi56JiZ0Lm1heC56PD10aGlzLm1heC56fWdldFBhcmFtZXRlcih0LGUpe3JldHVybiBlLnNldCgodC54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLCh0LnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKHQuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5tYXgueD49dGhpcy5taW4ueCYmdC5taW4ueDw9dGhpcy5tYXgueCYmdC5tYXgueT49dGhpcy5taW4ueSYmdC5taW4ueTw9dGhpcy5tYXgueSYmdC5tYXguej49dGhpcy5taW4ueiYmdC5taW4uejw9dGhpcy5tYXguen1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodC5jZW50ZXIsd2gpLHdoLmRpc3RhbmNlVG9TcXVhcmVkKHQuY2VudGVyKTw9dC5yYWRpdXMqdC5yYWRpdXN9aW50ZXJzZWN0c1BsYW5lKHQpe2xldCBlLG47cmV0dXJuIHQubm9ybWFsLng+MD8oZT10Lm5vcm1hbC54KnRoaXMubWluLngsbj10Lm5vcm1hbC54KnRoaXMubWF4LngpOihlPXQubm9ybWFsLngqdGhpcy5tYXgueCxuPXQubm9ybWFsLngqdGhpcy5taW4ueCksdC5ub3JtYWwueT4wPyhlKz10Lm5vcm1hbC55KnRoaXMubWluLnksbis9dC5ub3JtYWwueSp0aGlzLm1heC55KTooZSs9dC5ub3JtYWwueSp0aGlzLm1heC55LG4rPXQubm9ybWFsLnkqdGhpcy5taW4ueSksdC5ub3JtYWwuej4wPyhlKz10Lm5vcm1hbC56KnRoaXMubWluLnosbis9dC5ub3JtYWwueip0aGlzLm1heC56KTooZSs9dC5ub3JtYWwueip0aGlzLm1heC56LG4rPXQubm9ybWFsLnoqdGhpcy5taW4ueiksZTw9LXQuY29uc3RhbnQmJm4+PS10LmNvbnN0YW50fWludGVyc2VjdHNUcmlhbmdsZSh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4hMTt0aGlzLmdldENlbnRlcihJaCksTWguc3ViVmVjdG9ycyh0aGlzLm1heCxJaCksRGguc3ViVmVjdG9ycyh0LmEsSWgpLEVoLnN1YlZlY3RvcnModC5iLEloKSxDaC5zdWJWZWN0b3JzKHQuYyxJaCksU2guc3ViVmVjdG9ycyhFaCxEaCksQWguc3ViVmVjdG9ycyhDaCxFaCksTmguc3ViVmVjdG9ycyhEaCxDaCk7bGV0IGU9WzAsLVNoLnosU2gueSwwLC1BaC56LEFoLnksMCwtTmgueixOaC55LFNoLnosMCwtU2gueCxBaC56LDAsLUFoLngsTmgueiwwLC1OaC54LC1TaC55LFNoLngsMCwtQWgueSxBaC54LDAsLU5oLnksTmgueCwwXTtyZXR1cm4hKCFPaChlLERoLEVoLENoLE1oKXx8KGU9WzEsMCwwLDAsMSwwLDAsMCwxXSwhT2goZSxEaCxFaCxDaCxNaCkpKSYmKEZoLmNyb3NzVmVjdG9ycyhTaCxBaCksZT1bRmgueCxGaC55LEZoLnpdLE9oKGUsRGgsRWgsQ2gsTWgpKX1jbGFtcFBvaW50KHQsZSl7cmV0dXJuIGUuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodCx3aCkuZGlzdGFuY2VUbyh0KX1nZXRCb3VuZGluZ1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5tYWtlRW1wdHkoKToodGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLHQucmFkaXVzPS41KnRoaXMuZ2V0U2l6ZSh3aCkubGVuZ3RoKCkpLHR9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKXx8KHhoWzBdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLHhoWzFdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLHhoWzJdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLHhoWzNdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLHhoWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLHhoWzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLHhoWzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLHhoWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0RnJvbVBvaW50cyh4aCkpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLm1pbi5hZGQodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm1pbi5lcXVhbHModGhpcy5taW4pJiZ0Lm1heC5lcXVhbHModGhpcy5tYXgpfX1jb25zdCB4aD1bbmV3IHloLG5ldyB5aCxuZXcgeWgsbmV3IHloLG5ldyB5aCxuZXcgeWgsbmV3IHloLG5ldyB5aF0sd2g9bmV3IHloLGJoPW5ldyBfaCxEaD1uZXcgeWgsRWg9bmV3IHloLENoPW5ldyB5aCxTaD1uZXcgeWgsQWg9bmV3IHloLE5oPW5ldyB5aCxJaD1uZXcgeWgsTWg9bmV3IHloLEZoPW5ldyB5aCxUaD1uZXcgeWg7ZnVuY3Rpb24gT2godCxlLG4scixpKXtmb3IobGV0IG89MCxzPXQubGVuZ3RoLTM7bzw9cztvKz0zKXtUaC5mcm9tQXJyYXkodCxvKTtjb25zdCBzPWkueCpNYXRoLmFicyhUaC54KStpLnkqTWF0aC5hYnMoVGgueSkraS56Kk1hdGguYWJzKFRoLnopLGE9ZS5kb3QoVGgpLHU9bi5kb3QoVGgpLGM9ci5kb3QoVGgpO2lmKE1hdGgubWF4KC1NYXRoLm1heChhLHUsYyksTWF0aC5taW4oYSx1LGMpKT5zKXJldHVybiExfXJldHVybiEwfWNvbnN0IExoPW5ldyBfaCxQaD1uZXcgeWgsUmg9bmV3IHloO2NsYXNzIEJoe2NvbnN0cnVjdG9yKHQ9bmV3IHloLGU9LTEpe3RoaXMuaXNTcGhlcmU9ITAsdGhpcy5jZW50ZXI9dCx0aGlzLnJhZGl1cz1lfXNldCh0LGUpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPWUsdGhpc31zZXRGcm9tUG9pbnRzKHQsZSl7Y29uc3Qgbj10aGlzLmNlbnRlcjt2b2lkIDAhPT1lP24uY29weShlKTpMaC5zZXRGcm9tUG9pbnRzKHQpLmdldENlbnRlcihuKTtsZXQgcj0wO2ZvcihsZXQgZT0wLGk9dC5sZW5ndGg7ZTxpO2UrKylyPU1hdGgubWF4KHIsbi5kaXN0YW5jZVRvU3F1YXJlZCh0W2VdKSk7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChyKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLnJhZGl1czwwfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLmNlbnRlci5zZXQoMCwwLDApLHRoaXMucmFkaXVzPS0xLHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXRoaXMucmFkaXVzKnRoaXMucmFkaXVzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS10aGlzLnJhZGl1c31pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5yYWRpdXMrdC5yYWRpdXM7cmV0dXJuIHQuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9ZSplfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX1pbnRlcnNlY3RzUGxhbmUodCl7cmV0dXJuIE1hdGguYWJzKHQuZGlzdGFuY2VUb1BvaW50KHRoaXMuY2VudGVyKSk8PXRoaXMucmFkaXVzfWNsYW1wUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHQpO3JldHVybiBlLmNvcHkodCksbj50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyYmKGUuc3ViKHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKSxlLm11bHRpcGx5U2NhbGFyKHRoaXMucmFkaXVzKS5hZGQodGhpcy5jZW50ZXIpKSxlfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8odC5tYWtlRW1wdHkoKSx0KToodC5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpLHQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpLHQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KHQpLHRoaXMucmFkaXVzPXRoaXMucmFkaXVzKnQuZ2V0TWF4U2NhbGVPbkF4aXMoKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYWRkKHQpLHRoaXN9ZXhwYW5kQnlQb2ludCh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz0wLHRoaXM7UGguc3ViVmVjdG9ycyh0LHRoaXMuY2VudGVyKTtjb25zdCBlPVBoLmxlbmd0aFNxKCk7aWYoZT50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyl7Y29uc3QgdD1NYXRoLnNxcnQoZSksbj0uNSoodC10aGlzLnJhZGl1cyk7dGhpcy5jZW50ZXIuYWRkU2NhbGVkVmVjdG9yKFBoLG4vdCksdGhpcy5yYWRpdXMrPW59cmV0dXJuIHRoaXN9dW5pb24odCl7cmV0dXJuIHQuaXNFbXB0eSgpP3RoaXM6dGhpcy5pc0VtcHR5KCk/KHRoaXMuY29weSh0KSx0aGlzKTooITA9PT10aGlzLmNlbnRlci5lcXVhbHModC5jZW50ZXIpP3RoaXMucmFkaXVzPU1hdGgubWF4KHRoaXMucmFkaXVzLHQucmFkaXVzKTooUmguc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLmNlbnRlcikuc2V0TGVuZ3RoKHQucmFkaXVzKSx0aGlzLmV4cGFuZEJ5UG9pbnQoUGguY29weSh0LmNlbnRlcikuYWRkKFJoKSksdGhpcy5leHBhbmRCeVBvaW50KFBoLmNvcHkodC5jZW50ZXIpLnN1YihSaCkpKSx0aGlzKX1lcXVhbHModCl7cmV0dXJuIHQuY2VudGVyLmVxdWFscyh0aGlzLmNlbnRlcikmJnQucmFkaXVzPT09dGhpcy5yYWRpdXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fWNvbnN0IGtoPW5ldyB5aCx6aD1uZXcgeWgsamg9bmV3IHloLFVoPW5ldyB5aCxxaD1uZXcgeWgsVmg9bmV3IHloLEdoPW5ldyB5aDtjbGFzcyBZaHtjb25zdHJ1Y3Rvcih0LGUsbixyLGksbyxzLGEsdSxjLGwsaCxmLHAsZCxnKXtZaC5wcm90b3R5cGUuaXNNYXRyaXg0PSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLHZvaWQgMCE9PXQmJnRoaXMuc2V0KHQsZSxuLHIsaSxvLHMsYSx1LGMsbCxoLGYscCxkLGcpfXNldCh0LGUsbixyLGksbyxzLGEsdSxjLGwsaCxmLHAsZCxnKXtjb25zdCB5PXRoaXMuZWxlbWVudHM7cmV0dXJuIHlbMF09dCx5WzRdPWUseVs4XT1uLHlbMTJdPXIseVsxXT1pLHlbNV09byx5WzldPXMseVsxM109YSx5WzJdPXUseVs2XT1jLHlbMTBdPWwseVsxNF09aCx5WzNdPWYseVs3XT1wLHlbMTFdPWQseVsxNV09Zyx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IFloKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSxlWzldPW5bOV0sZVsxMF09blsxMF0sZVsxMV09blsxMV0sZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sZVsxNV09blsxNV0sdGhpc31jb3B5UG9zaXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sdGhpc31zZXRGcm9tTWF0cml4Myh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVszXSxlWzZdLDAsZVsxXSxlWzRdLGVbN10sMCxlWzJdLGVbNV0sZVs4XSwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMiksdGhpc31tYWtlQmFzaXModCxlLG4pe3JldHVybiB0aGlzLnNldCh0LngsZS54LG4ueCwwLHQueSxlLnksbi55LDAsdC56LGUueixuLnosMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RSb3RhdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzLHI9MS9YaC5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCksaT0xL1hoLnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxvPTEvWGguc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiBlWzBdPW5bMF0qcixlWzFdPW5bMV0qcixlWzJdPW5bMl0qcixlWzNdPTAsZVs0XT1uWzRdKmksZVs1XT1uWzVdKmksZVs2XT1uWzZdKmksZVs3XT0wLGVbOF09bls4XSpvLGVbOV09bls5XSpvLGVbMTBdPW5bMTBdKm8sZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbUV1bGVyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxyPXQueSxpPXQueixvPU1hdGguY29zKG4pLHM9TWF0aC5zaW4obiksYT1NYXRoLmNvcyhyKSx1PU1hdGguc2luKHIpLGM9TWF0aC5jb3MoaSksbD1NYXRoLnNpbihpKTtpZigiWFlaIj09PXQub3JkZXIpe2NvbnN0IHQ9bypjLG49bypsLHI9cypjLGk9cypsO2VbMF09YSpjLGVbNF09LWEqbCxlWzhdPXUsZVsxXT1uK3IqdSxlWzVdPXQtaSp1LGVbOV09LXMqYSxlWzJdPWktdCp1LGVbNl09cituKnUsZVsxMF09byphfWVsc2UgaWYoIllYWiI9PT10Lm9yZGVyKXtjb25zdCB0PWEqYyxuPWEqbCxyPXUqYyxpPXUqbDtlWzBdPXQraSpzLGVbNF09cipzLW4sZVs4XT1vKnUsZVsxXT1vKmwsZVs1XT1vKmMsZVs5XT0tcyxlWzJdPW4qcy1yLGVbNl09aSt0KnMsZVsxMF09byphfWVsc2UgaWYoIlpYWSI9PT10Lm9yZGVyKXtjb25zdCB0PWEqYyxuPWEqbCxyPXUqYyxpPXUqbDtlWzBdPXQtaSpzLGVbNF09LW8qbCxlWzhdPXIrbipzLGVbMV09bityKnMsZVs1XT1vKmMsZVs5XT1pLXQqcyxlWzJdPS1vKnUsZVs2XT1zLGVbMTBdPW8qYX1lbHNlIGlmKCJaWVgiPT09dC5vcmRlcil7Y29uc3QgdD1vKmMsbj1vKmwscj1zKmMsaT1zKmw7ZVswXT1hKmMsZVs0XT1yKnUtbixlWzhdPXQqdStpLGVbMV09YSpsLGVbNV09aSp1K3QsZVs5XT1uKnUtcixlWzJdPS11LGVbNl09cyphLGVbMTBdPW8qYX1lbHNlIGlmKCJZWlgiPT09dC5vcmRlcil7Y29uc3QgdD1vKmEsbj1vKnUscj1zKmEsaT1zKnU7ZVswXT1hKmMsZVs0XT1pLXQqbCxlWzhdPXIqbCtuLGVbMV09bCxlWzVdPW8qYyxlWzldPS1zKmMsZVsyXT0tdSpjLGVbNl09bipsK3IsZVsxMF09dC1pKmx9ZWxzZSBpZigiWFpZIj09PXQub3JkZXIpe2NvbnN0IHQ9byphLG49byp1LHI9cyphLGk9cyp1O2VbMF09YSpjLGVbNF09LWwsZVs4XT11KmMsZVsxXT10KmwraSxlWzVdPW8qYyxlWzldPW4qbC1yLGVbMl09cipsLW4sZVs2XT1zKmMsZVsxMF09aSpsK3R9cmV0dXJuIGVbM109MCxlWzddPTAsZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMuY29tcG9zZShIaCx0LFpoKX1sb29rQXQodCxlLG4pe2NvbnN0IHI9dGhpcy5lbGVtZW50cztyZXR1cm4gUWguc3ViVmVjdG9ycyh0LGUpLDA9PT1RaC5sZW5ndGhTcSgpJiYoUWguej0xKSxRaC5ub3JtYWxpemUoKSxLaC5jcm9zc1ZlY3RvcnMobixRaCksMD09PUtoLmxlbmd0aFNxKCkmJigxPT09TWF0aC5hYnMobi56KT9RaC54Kz0xZS00OlFoLnorPTFlLTQsUWgubm9ybWFsaXplKCksS2guY3Jvc3NWZWN0b3JzKG4sUWgpKSxLaC5ub3JtYWxpemUoKSxKaC5jcm9zc1ZlY3RvcnMoUWgsS2gpLHJbMF09S2gueCxyWzRdPUpoLngscls4XT1RaC54LHJbMV09S2gueSxyWzVdPUpoLnkscls5XT1RaC55LHJbMl09S2gueixyWzZdPUpoLnosclsxMF09UWgueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxyPWUuZWxlbWVudHMsaT10aGlzLmVsZW1lbnRzLG89blswXSxzPW5bNF0sYT1uWzhdLHU9blsxMl0sYz1uWzFdLGw9bls1XSxoPW5bOV0sZj1uWzEzXSxwPW5bMl0sZD1uWzZdLGc9blsxMF0seT1uWzE0XSxtPW5bM10sdj1uWzddLF89blsxMV0seD1uWzE1XSx3PXJbMF0sYj1yWzRdLEQ9cls4XSxFPXJbMTJdLEM9clsxXSxTPXJbNV0sQT1yWzldLE49clsxM10sST1yWzJdLE09cls2XSxGPXJbMTBdLFQ9clsxNF0sTz1yWzNdLEw9cls3XSxQPXJbMTFdLFI9clsxNV07cmV0dXJuIGlbMF09byp3K3MqQythKkkrdSpPLGlbNF09bypiK3MqUythKk0rdSpMLGlbOF09bypEK3MqQSthKkYrdSpQLGlbMTJdPW8qRStzKk4rYSpUK3UqUixpWzFdPWMqdytsKkMraCpJK2YqTyxpWzVdPWMqYitsKlMraCpNK2YqTCxpWzldPWMqRCtsKkEraCpGK2YqUCxpWzEzXT1jKkUrbCpOK2gqVCtmKlIsaVsyXT1wKncrZCpDK2cqSSt5Kk8saVs2XT1wKmIrZCpTK2cqTSt5KkwsaVsxMF09cCpEK2QqQStnKkYreSpQLGlbMTRdPXAqRStkKk4rZypUK3kqUixpWzNdPW0qdyt2KkMrXypJK3gqTyxpWzddPW0qYit2KlMrXypNK3gqTCxpWzExXT1tKkQrdipBK18qRit4KlAsaVsxNV09bSpFK3YqTitfKlQreCpSLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFs0XSxyPXRbOF0saT10WzEyXSxvPXRbMV0scz10WzVdLGE9dFs5XSx1PXRbMTNdLGM9dFsyXSxsPXRbNl0saD10WzEwXSxmPXRbMTRdO3JldHVybiB0WzNdKigraSphKmwtcip1KmwtaSpzKmgrbip1KmgrcipzKmYtbiphKmYpK3RbN10qKCtlKmEqZi1lKnUqaCtpKm8qaC1yKm8qZityKnUqYy1pKmEqYykrdFsxMV0qKCtlKnUqbC1lKnMqZi1pKm8qbCtuKm8qZitpKnMqYy1uKnUqYykrdFsxNV0qKC1yKnMqYy1lKmEqbCtlKnMqaCtyKm8qbC1uKm8qaCtuKmEqYyl9dHJhbnNwb3NlKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzO2xldCBlO3JldHVybiBlPXRbMV0sdFsxXT10WzRdLHRbNF09ZSxlPXRbMl0sdFsyXT10WzhdLHRbOF09ZSxlPXRbNl0sdFs2XT10WzldLHRbOV09ZSxlPXRbM10sdFszXT10WzEyXSx0WzEyXT1lLGU9dFs3XSx0WzddPXRbMTNdLHRbMTNdPWUsZT10WzExXSx0WzExXT10WzE0XSx0WzE0XT1lLHRoaXN9c2V0UG9zaXRpb24odCxlLG4pe2NvbnN0IHI9dGhpcy5lbGVtZW50cztyZXR1cm4gdC5pc1ZlY3RvcjM/KHJbMTJdPXQueCxyWzEzXT10LnksclsxNF09dC56KTooclsxMl09dCxyWzEzXT1lLHJbMTRdPW4pLHRoaXN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scj10WzJdLGk9dFszXSxvPXRbNF0scz10WzVdLGE9dFs2XSx1PXRbN10sYz10WzhdLGw9dFs5XSxoPXRbMTBdLGY9dFsxMV0scD10WzEyXSxkPXRbMTNdLGc9dFsxNF0seT10WzE1XSxtPWwqZyp1LWQqaCp1K2QqYSpmLXMqZypmLWwqYSp5K3MqaCp5LHY9cCpoKnUtYypnKnUtcCphKmYrbypnKmYrYyphKnktbypoKnksXz1jKmQqdS1wKmwqdStwKnMqZi1vKmQqZi1jKnMqeStvKmwqeSx4PXAqbCphLWMqZCphLXAqcypoK28qZCpoK2MqcypnLW8qbCpnLHc9ZSptK24qdityKl8raSp4O2lmKDA9PT13KXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCBiPTEvdztyZXR1cm4gdFswXT1tKmIsdFsxXT0oZCpoKmktbCpnKmktZCpyKmYrbipnKmYrbCpyKnktbipoKnkpKmIsdFsyXT0ocypnKmktZCphKmkrZCpyKnUtbipnKnUtcypyKnkrbiphKnkpKmIsdFszXT0obCphKmktcypoKmktbCpyKnUrbipoKnUrcypyKmYtbiphKmYpKmIsdFs0XT12KmIsdFs1XT0oYypnKmktcCpoKmkrcCpyKmYtZSpnKmYtYypyKnkrZSpoKnkpKmIsdFs2XT0ocCphKmktbypnKmktcCpyKnUrZSpnKnUrbypyKnktZSphKnkpKmIsdFs3XT0obypoKmktYyphKmkrYypyKnUtZSpoKnUtbypyKmYrZSphKmYpKmIsdFs4XT1fKmIsdFs5XT0ocCpsKmktYypkKmktcCpuKmYrZSpkKmYrYypuKnktZSpsKnkpKmIsdFsxMF09KG8qZCppLXAqcyppK3Aqbip1LWUqZCp1LW8qbip5K2Uqcyp5KSpiLHRbMTFdPShjKnMqaS1vKmwqaS1jKm4qdStlKmwqdStvKm4qZi1lKnMqZikqYix0WzEyXT14KmIsdFsxM109KGMqZCpyLXAqbCpyK3AqbipoLWUqZCpoLWMqbipnK2UqbCpnKSpiLHRbMTRdPShwKnMqci1vKmQqci1wKm4qYStlKmQqYStvKm4qZy1lKnMqZykqYix0WzE1XT0obypsKnItYypzKnIrYypuKmEtZSpsKmEtbypuKmgrZSpzKmgpKmIsdGhpc31zY2FsZSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10Lngscj10LnksaT10Lno7cmV0dXJuIGVbMF0qPW4sZVs0XSo9cixlWzhdKj1pLGVbMV0qPW4sZVs1XSo9cixlWzldKj1pLGVbMl0qPW4sZVs2XSo9cixlWzEwXSo9aSxlWzNdKj1uLGVbN10qPXIsZVsxMV0qPWksdGhpc31nZXRNYXhTY2FsZU9uQXhpcygpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdLG49dFs0XSp0WzRdK3RbNV0qdFs1XSt0WzZdKnRbNl0scj10WzhdKnRbOF0rdFs5XSp0WzldK3RbMTBdKnRbMTBdO3JldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoZSxuLHIpKX1tYWtlVHJhbnNsYXRpb24odCxlLG4pe3JldHVybiB0LmlzVmVjdG9yMz90aGlzLnNldCgxLDAsMCx0LngsMCwxLDAsdC55LDAsMCwxLHQueiwwLDAsMCwxKTp0aGlzLnNldCgxLDAsMCx0LDAsMSwwLGUsMCwwLDEsbiwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblgodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsZSwtbiwwLDAsbixlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25ZKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwwLG4sMCwwLDEsMCwwLC1uLDAsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWih0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbkF4aXModCxlKXtjb25zdCBuPU1hdGguY29zKGUpLHI9TWF0aC5zaW4oZSksaT0xLW4sbz10Lngscz10LnksYT10LnosdT1pKm8sYz1pKnM7cmV0dXJuIHRoaXMuc2V0KHUqbytuLHUqcy1yKmEsdSphK3IqcywwLHUqcytyKmEsYypzK24sYyphLXIqbywwLHUqYS1yKnMsYyphK3IqbyxpKmEqYStuLDAsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlLG4pe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLDAsZSwwLDAsMCwwLG4sMCwwLDAsMCwxKSx0aGlzfW1ha2VTaGVhcih0LGUsbixyLGksbyl7cmV0dXJuIHRoaXMuc2V0KDEsbixpLDAsdCwxLG8sMCxlLHIsMSwwLDAsMCwwLDEpLHRoaXN9Y29tcG9zZSh0LGUsbil7Y29uc3Qgcj10aGlzLmVsZW1lbnRzLGk9ZS5feCxvPWUuX3kscz1lLl96LGE9ZS5fdyx1PWkraSxjPW8rbyxsPXMrcyxoPWkqdSxmPWkqYyxwPWkqbCxkPW8qYyxnPW8qbCx5PXMqbCxtPWEqdSx2PWEqYyxfPWEqbCx4PW4ueCx3PW4ueSxiPW4uejtyZXR1cm4gclswXT0oMS0oZCt5KSkqeCxyWzFdPShmK18pKngsclsyXT0ocC12KSp4LHJbM109MCxyWzRdPShmLV8pKncscls1XT0oMS0oaCt5KSkqdyxyWzZdPShnK20pKncscls3XT0wLHJbOF09KHArdikqYixyWzldPShnLW0pKmIsclsxMF09KDEtKGgrZCkpKmIsclsxMV09MCxyWzEyXT10LngsclsxM109dC55LHJbMTRdPXQueixyWzE1XT0xLHRoaXN9ZGVjb21wb3NlKHQsZSxuKXtjb25zdCByPXRoaXMuZWxlbWVudHM7bGV0IGk9WGguc2V0KHJbMF0sclsxXSxyWzJdKS5sZW5ndGgoKTtjb25zdCBvPVhoLnNldChyWzRdLHJbNV0scls2XSkubGVuZ3RoKCkscz1YaC5zZXQocls4XSxyWzldLHJbMTBdKS5sZW5ndGgoKTt0aGlzLmRldGVybWluYW50KCk8MCYmKGk9LWkpLHQueD1yWzEyXSx0Lnk9clsxM10sdC56PXJbMTRdLFdoLmNvcHkodGhpcyk7Y29uc3QgYT0xL2ksdT0xL28sYz0xL3M7cmV0dXJuIFdoLmVsZW1lbnRzWzBdKj1hLFdoLmVsZW1lbnRzWzFdKj1hLFdoLmVsZW1lbnRzWzJdKj1hLFdoLmVsZW1lbnRzWzRdKj11LFdoLmVsZW1lbnRzWzVdKj11LFdoLmVsZW1lbnRzWzZdKj11LFdoLmVsZW1lbnRzWzhdKj1jLFdoLmVsZW1lbnRzWzldKj1jLFdoLmVsZW1lbnRzWzEwXSo9YyxlLnNldEZyb21Sb3RhdGlvbk1hdHJpeChXaCksbi54PWksbi55PW8sbi56PXMsdGhpc31tYWtlUGVyc3BlY3RpdmUodCxlLG4scixpLG8scz1YbCl7Y29uc3QgYT10aGlzLmVsZW1lbnRzLHU9MippLyhlLXQpLGM9MippLyhuLXIpLGw9KGUrdCkvKGUtdCksaD0obityKS8obi1yKTtsZXQgZixwO2lmKHM9PT1YbClmPS0obytpKS8oby1pKSxwPS0yKm8qaS8oby1pKTtlbHNle2lmKDIwMDEhPT1zKXRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlUGVyc3BlY3RpdmUoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogIitzKTtmPS1vLyhvLWkpLHA9LW8qaS8oby1pKX1yZXR1cm4gYVswXT11LGFbNF09MCxhWzhdPWwsYVsxMl09MCxhWzFdPTAsYVs1XT1jLGFbOV09aCxhWzEzXT0wLGFbMl09MCxhWzZdPTAsYVsxMF09ZixhWzE0XT1wLGFbM109MCxhWzddPTAsYVsxMV09LTEsYVsxNV09MCx0aGlzfW1ha2VPcnRob2dyYXBoaWModCxlLG4scixpLG8scz1YbCl7Y29uc3QgYT10aGlzLmVsZW1lbnRzLHU9MS8oZS10KSxjPTEvKG4tciksbD0xLyhvLWkpLGg9KGUrdCkqdSxmPShuK3IpKmM7bGV0IHAsZDtpZihzPT09WGwpcD0obytpKSpsLGQ9LTIqbDtlbHNle2lmKDIwMDEhPT1zKXRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlT3J0aG9ncmFwaGljKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrcyk7cD1pKmwsZD0tMSpsfXJldHVybiBhWzBdPTIqdSxhWzRdPTAsYVs4XT0wLGFbMTJdPS1oLGFbMV09MCxhWzVdPTIqYyxhWzldPTAsYVsxM109LWYsYVsyXT0wLGFbNl09MCxhWzEwXT1kLGFbMTRdPS1wLGFbM109MCxhWzddPTAsYVsxMV09MCxhWzE1XT0xLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCB0PTA7dDwxNjt0KyspaWYoZVt0XSE9PW5bdF0pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDE2O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0W2UrOV09bls5XSx0W2UrMTBdPW5bMTBdLHRbZSsxMV09blsxMV0sdFtlKzEyXT1uWzEyXSx0W2UrMTNdPW5bMTNdLHRbZSsxNF09blsxNF0sdFtlKzE1XT1uWzE1XSx0fX1jb25zdCBYaD1uZXcgeWgsV2g9bmV3IFloLEhoPW5ldyB5aCgwLDAsMCksWmg9bmV3IHloKDEsMSwxKSxLaD1uZXcgeWgsSmg9bmV3IHloLFFoPW5ldyB5aCwkaD1uZXcgWWgsdGY9bmV3IGdoO2NsYXNzIGVme2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHI9ZWYuREVGQVVMVF9PUkRFUil7dGhpcy5pc0V1bGVyPSEwLHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPXJ9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IG9yZGVyKCl7cmV0dXJuIHRoaXMuX29yZGVyfXNldCBvcmRlcih0KXt0aGlzLl9vcmRlcj10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4scj10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC5feCx0aGlzLl95PXQuX3ksdGhpcy5fej10Ll96LHRoaXMuX29yZGVyPXQuX29yZGVyLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0LGU9dGhpcy5fb3JkZXIsbj0hMCl7Y29uc3Qgcj10LmVsZW1lbnRzLGk9clswXSxvPXJbNF0scz1yWzhdLGE9clsxXSx1PXJbNV0sYz1yWzldLGw9clsyXSxoPXJbNl0sZj1yWzEwXTtzd2l0Y2goZSl7Y2FzZSJYWVoiOnRoaXMuX3k9TWF0aC5hc2luKEtsKHMsLTEsMSkpLE1hdGguYWJzKHMpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWMsZiksdGhpcy5fej1NYXRoLmF0YW4yKC1vLGkpKToodGhpcy5feD1NYXRoLmF0YW4yKGgsdSksdGhpcy5fej0wKTticmVhaztjYXNlIllYWiI6dGhpcy5feD1NYXRoLmFzaW4oLUtsKGMsLTEsMSkpLE1hdGguYWJzKGMpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIocyxmKSx0aGlzLl96PU1hdGguYXRhbjIoYSx1KSk6KHRoaXMuX3k9TWF0aC5hdGFuMigtbCxpKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PU1hdGguYXNpbihLbChoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKC1sLGYpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyx1KSk6KHRoaXMuX3k9MCx0aGlzLl96PU1hdGguYXRhbjIoYSxpKSk7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3k9TWF0aC5hc2luKC1LbChsLC0xLDEpKSxNYXRoLmFicyhsKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGgsZiksdGhpcy5fej1NYXRoLmF0YW4yKGEsaSkpOih0aGlzLl94PTAsdGhpcy5fej1NYXRoLmF0YW4yKC1vLHUpKTticmVhaztjYXNlIllaWCI6dGhpcy5fej1NYXRoLmFzaW4oS2woYSwtMSwxKSksTWF0aC5hYnMoYSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtYyx1KSx0aGlzLl95PU1hdGguYXRhbjIoLWwsaSkpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKHMsZikpO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl96PU1hdGguYXNpbigtS2wobywtMSwxKSksTWF0aC5hYnMobyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihoLHUpLHRoaXMuX3k9TWF0aC5hdGFuMihzLGkpKToodGhpcy5feD1NYXRoLmF0YW4yKC1jLGYpLHRoaXMuX3k9MCl9cmV0dXJuIHRoaXMuX29yZGVyPWUsITA9PT1uJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUXVhdGVybmlvbih0LGUsbil7cmV0dXJuICRoLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCRoLGUsbil9c2V0RnJvbVZlY3RvcjModCxlPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5zZXQodC54LHQueSx0LnosZSl9cmVvcmRlcih0KXtyZXR1cm4gdGYuc2V0RnJvbUV1bGVyKHRoaXMpLHRoaXMuc2V0RnJvbVF1YXRlcm5pb24odGYsdCl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll9vcmRlcj09PXRoaXMuX29yZGVyfWZyb21BcnJheSh0KXtyZXR1cm4gdGhpcy5feD10WzBdLHRoaXMuX3k9dFsxXSx0aGlzLl96PXRbMl0sdm9pZCAwIT09dFszXSYmKHRoaXMuX29yZGVyPXRbM10pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl9vcmRlcn19ZWYuREVGQVVMVF9PUkRFUj0iWFlaIjtjbGFzcyBuZntjb25zdHJ1Y3Rvcigpe3RoaXMubWFzaz0xfXNldCh0KXt0aGlzLm1hc2s9MTw8dD4+PjB9ZW5hYmxlKHQpe3RoaXMubWFza3w9MTw8dH1lbmFibGVBbGwoKXt0aGlzLm1hc2s9LTF9dG9nZ2xlKHQpe3RoaXMubWFza149MTw8dH1kaXNhYmxlKHQpe3RoaXMubWFzayY9figxPDx0KX1kaXNhYmxlQWxsKCl7dGhpcy5tYXNrPTB9dGVzdCh0KXtyZXR1cm4hISh0aGlzLm1hc2smdC5tYXNrKX1pc0VuYWJsZWQodCl7cmV0dXJuISEodGhpcy5tYXNrJjE8PHQpfX1sZXQgcmY9MDtjb25zdCBvZj1uZXcgeWgsc2Y9bmV3IGdoLGFmPW5ldyBZaCx1Zj1uZXcgeWgsY2Y9bmV3IHloLGxmPW5ldyB5aCxoZj1uZXcgZ2gsZmY9bmV3IHloKDEsMCwwKSxwZj1uZXcgeWgoMCwxLDApLGRmPW5ldyB5aCgwLDAsMSksZ2Y9e3R5cGU6ImFkZGVkIn0seWY9e3R5cGU6InJlbW92ZWQifSxtZj17dHlwZToiY2hpbGRhZGRlZCIsY2hpbGQ6bnVsbH0sdmY9e3R5cGU6ImNoaWxkcmVtb3ZlZCIsY2hpbGQ6bnVsbH07Y2xhc3MgX2YgZXh0ZW5kcyBXbHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc09iamVjdDNEPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOnJmKyt9KSx0aGlzLnV1aWQ9WmwoKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJPYmplY3QzRCIsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudXA9X2YuREVGQVVMVF9VUC5jbG9uZSgpO2NvbnN0IHQ9bmV3IHloLGU9bmV3IGVmLG49bmV3IGdoLHI9bmV3IHloKDEsMSwxKTtlLl9vbkNoYW5nZSgoZnVuY3Rpb24oKXtuLnNldEZyb21FdWxlcihlLCExKX0pKSxuLl9vbkNoYW5nZSgoZnVuY3Rpb24oKXtlLnNldEZyb21RdWF0ZXJuaW9uKG4sdm9pZCAwLCExKX0pKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb3NpdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dH0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpyfSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyBZaH0sbm9ybWFsTWF0cml4Ont2YWx1ZTpuZXcgJGx9fSksdGhpcy5tYXRyaXg9bmV3IFloLHRoaXMubWF0cml4V29ybGQ9bmV3IFloLHRoaXMubWF0cml4QXV0b1VwZGF0ZT1fZi5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT1fZi5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdGhpcy5sYXllcnM9bmV3IG5mLHRoaXMudmlzaWJsZT0hMCx0aGlzLmNhc3RTaGFkb3c9ITEsdGhpcy5yZWNlaXZlU2hhZG93PSExLHRoaXMuZnJ1c3R1bUN1bGxlZD0hMCx0aGlzLnJlbmRlck9yZGVyPTAsdGhpcy5hbmltYXRpb25zPVtdLHRoaXMudXNlckRhdGE9e319b25CZWZvcmVTaGFkb3coKXt9b25BZnRlclNoYWRvdygpe31vbkJlZm9yZVJlbmRlcigpe31vbkFmdGVyUmVuZGVyKCl7fWFwcGx5TWF0cml4NCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXgucHJlbXVsdGlwbHkodCksdGhpcy5tYXRyaXguZGVjb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHQpLHRoaXN9c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlKHQsZSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodCxlKX1zZXRSb3RhdGlvbkZyb21FdWxlcih0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKHQsITApfXNldFJvdGF0aW9uRnJvbU1hdHJpeCh0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpfXNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7dGhpcy5xdWF0ZXJuaW9uLmNvcHkodCl9cm90YXRlT25BeGlzKHQsZSl7cmV0dXJuIHNmLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoc2YpLHRoaXN9cm90YXRlT25Xb3JsZEF4aXModCxlKXtyZXR1cm4gc2Yuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShzZiksdGhpc31yb3RhdGVYKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhmZix0KX1yb3RhdGVZKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhwZix0KX1yb3RhdGVaKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhkZix0KX10cmFuc2xhdGVPbkF4aXModCxlKXtyZXR1cm4gb2YuY29weSh0KS5hcHBseVF1YXRlcm5pb24odGhpcy5xdWF0ZXJuaW9uKSx0aGlzLnBvc2l0aW9uLmFkZChvZi5tdWx0aXBseVNjYWxhcihlKSksdGhpc310cmFuc2xhdGVYKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhmZix0KX10cmFuc2xhdGVZKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhwZix0KX10cmFuc2xhdGVaKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhkZix0KX1sb2NhbFRvV29ybGQodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfXdvcmxkVG9Mb2NhbCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQoYWYuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSl9bG9va0F0KHQsZSxuKXt0LmlzVmVjdG9yMz91Zi5jb3B5KHQpOnVmLnNldCh0LGUsbik7Y29uc3Qgcj10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxjZi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCksdGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P2FmLmxvb2tBdChjZix1Zix0aGlzLnVwKTphZi5sb29rQXQodWYsY2YsdGhpcy51cCksdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChhZiksciYmKGFmLmV4dHJhY3RSb3RhdGlvbihyLm1hdHJpeFdvcmxkKSxzZi5zZXRGcm9tUm90YXRpb25NYXRyaXgoYWYpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShzZi5pbnZlcnQoKSkpfWFkZCh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdGhpcy5hZGQoYXJndW1lbnRzW3RdKTtyZXR1cm4gdGhpc31yZXR1cm4gdD09PXRoaXN8fHQmJnQuaXNPYmplY3QzRCYmKHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQuZGlzcGF0Y2hFdmVudChnZiksbWYuY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQobWYpLG1mLmNoaWxkPW51bGwpLHRoaXN9cmVtb3ZlKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl0aGlzLnJlbW92ZShhcmd1bWVudHNbdF0pO3JldHVybiB0aGlzfWNvbnN0IGU9dGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpO3JldHVybi0xIT09ZSYmKHQucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbi5zcGxpY2UoZSwxKSx0LmRpc3BhdGNoRXZlbnQoeWYpLHZmLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KHZmKSx2Zi5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCB0PXRoaXMucGFyZW50O3JldHVybiBudWxsIT09dCYmdC5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKX1hdHRhY2godCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGFmLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksbnVsbCE9PXQucGFyZW50JiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGFmLm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQoYWYpLHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHQuZGlzcGF0Y2hFdmVudChnZiksbWYuY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQobWYpLG1mLmNoaWxkPW51bGwsdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgbj0wLHI9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxyO24rKyl7Y29uc3Qgcj10aGlzLmNoaWxkcmVuW25dLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZih2b2lkIDAhPT1yKXJldHVybiByfX1nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUsbj1bXSl7dGhpc1t0XT09PWUmJm4ucHVzaCh0aGlzKTtjb25zdCByPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBpPTAsbz1yLmxlbmd0aDtpPG87aSsrKXJbaV0uZ2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG4pO3JldHVybiBufWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoY2YsdCxsZiksdH1nZXRXb3JsZFNjYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShjZixoZix0KSx0fWdldFdvcmxkRGlyZWN0aW9uKHQpe3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gdC5zZXQoZVs4XSxlWzldLGVbMTBdKS5ub3JtYWxpemUoKX1yYXljYXN0KCl7fXRyYXZlcnNlKHQpe3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyllW25dLnRyYXZlcnNlKHQpfXRyYXZlcnNlVmlzaWJsZSh0KXtpZighMT09PXRoaXMudmlzaWJsZSlyZXR1cm47dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0udHJhdmVyc2VWaXNpYmxlKHQpfXRyYXZlcnNlQW5jZXN0b3JzKHQpe2NvbnN0IGU9dGhpcy5wYXJlbnQ7bnVsbCE9PWUmJih0KGUpLGUudHJhdmVyc2VBbmNlc3RvcnModCkpfXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSwodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHx0KSYmKCEwPT09dGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUmJihudWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyllW25dLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgbj10aGlzLnBhcmVudDtpZighMD09PXQmJm51bGwhPT1uJiZuLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksITA9PT10aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSYmKG51bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLCEwPT09ZSl7Y29uc3QgdD10aGlzLmNoaWxkcmVuO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0W2VdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0LG49e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e30sbm9kZXM6e319LG4ubWV0YWRhdGE9e3ZlcnNpb246NC42LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3Qgcj17fTtmdW5jdGlvbiBpKGUsbil7cmV0dXJuIHZvaWQgMD09PWVbbi51dWlkXSYmKGVbbi51dWlkXT1uLnRvSlNPTih0KSksbi51dWlkfWlmKHIudXVpZD10aGlzLnV1aWQsci50eXBlPXRoaXMudHlwZSwiIiE9PXRoaXMubmFtZSYmKHIubmFtZT10aGlzLm5hbWUpLCEwPT09dGhpcy5jYXN0U2hhZG93JiYoci5jYXN0U2hhZG93PSEwKSwhMD09PXRoaXMucmVjZWl2ZVNoYWRvdyYmKHIucmVjZWl2ZVNoYWRvdz0hMCksITE9PT10aGlzLnZpc2libGUmJihyLnZpc2libGU9ITEpLCExPT09dGhpcy5mcnVzdHVtQ3VsbGVkJiYoci5mcnVzdHVtQ3VsbGVkPSExKSwwIT09dGhpcy5yZW5kZXJPcmRlciYmKHIucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlciksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihyLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLHIubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2ssci5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpLHIudXA9dGhpcy51cC50b0FycmF5KCksITE9PT10aGlzLm1hdHJpeEF1dG9VcGRhdGUmJihyLm1hdHJpeEF1dG9VcGRhdGU9ITEpLHRoaXMuaXNJbnN0YW5jZWRNZXNoJiYoci50eXBlPSJJbnN0YW5jZWRNZXNoIixyLmNvdW50PXRoaXMuY291bnQsci5pbnN0YW5jZU1hdHJpeD10aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpLG51bGwhPT10aGlzLmluc3RhbmNlQ29sb3ImJihyLmluc3RhbmNlQ29sb3I9dGhpcy5pbnN0YW5jZUNvbG9yLnRvSlNPTigpKSksdGhpcy5pc0JhdGNoZWRNZXNoJiYoci50eXBlPSJCYXRjaGVkTWVzaCIsci5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkPXRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCxyLnNvcnRPYmplY3RzPXRoaXMuc29ydE9iamVjdHMsci5kcmF3UmFuZ2VzPXRoaXMuX2RyYXdSYW5nZXMsci5yZXNlcnZlZFJhbmdlcz10aGlzLl9yZXNlcnZlZFJhbmdlcyxyLnZpc2liaWxpdHk9dGhpcy5fdmlzaWJpbGl0eSxyLmFjdGl2ZT10aGlzLl9hY3RpdmUsci5ib3VuZHM9dGhpcy5fYm91bmRzLm1hcCgodD0+KHtib3hJbml0aWFsaXplZDp0LmJveEluaXRpYWxpemVkLGJveE1pbjp0LmJveC5taW4udG9BcnJheSgpLGJveE1heDp0LmJveC5tYXgudG9BcnJheSgpLHNwaGVyZUluaXRpYWxpemVkOnQuc3BoZXJlSW5pdGlhbGl6ZWQsc3BoZXJlUmFkaXVzOnQuc3BoZXJlLnJhZGl1cyxzcGhlcmVDZW50ZXI6dC5zcGhlcmUuY2VudGVyLnRvQXJyYXkoKX0pKSksci5tYXhJbnN0YW5jZUNvdW50PXRoaXMuX21heEluc3RhbmNlQ291bnQsci5tYXhWZXJ0ZXhDb3VudD10aGlzLl9tYXhWZXJ0ZXhDb3VudCxyLm1heEluZGV4Q291bnQ9dGhpcy5fbWF4SW5kZXhDb3VudCxyLmdlb21ldHJ5SW5pdGlhbGl6ZWQ9dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCxyLmdlb21ldHJ5Q291bnQ9dGhpcy5fZ2VvbWV0cnlDb3VudCxyLm1hdHJpY2VzVGV4dHVyZT10aGlzLl9tYXRyaWNlc1RleHR1cmUudG9KU09OKHQpLG51bGwhPT10aGlzLl9jb2xvcnNUZXh0dXJlJiYoci5jb2xvcnNUZXh0dXJlPXRoaXMuX2NvbG9yc1RleHR1cmUudG9KU09OKHQpKSxudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmKHIuYm91bmRpbmdTcGhlcmU9e2NlbnRlcjpyLmJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCkscmFkaXVzOnIuYm91bmRpbmdTcGhlcmUucmFkaXVzfSksbnVsbCE9PXRoaXMuYm91bmRpbmdCb3gmJihyLmJvdW5kaW5nQm94PXttaW46ci5ib3VuZGluZ0JveC5taW4udG9BcnJheSgpLG1heDpyLmJvdW5kaW5nQm94Lm1heC50b0FycmF5KCl9KSksdGhpcy5pc1NjZW5lKXRoaXMuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZC5pc0NvbG9yP3IuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKCk6dGhpcy5iYWNrZ3JvdW5kLmlzVGV4dHVyZSYmKHIuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKHQpLnV1aWQpKSx0aGlzLmVudmlyb25tZW50JiZ0aGlzLmVudmlyb25tZW50LmlzVGV4dHVyZSYmITAhPT10aGlzLmVudmlyb25tZW50LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSYmKHIuZW52aXJvbm1lbnQ9dGhpcy5lbnZpcm9ubWVudC50b0pTT04odCkudXVpZCk7ZWxzZSBpZih0aGlzLmlzTWVzaHx8dGhpcy5pc0xpbmV8fHRoaXMuaXNQb2ludHMpe3IuZ2VvbWV0cnk9aSh0Lmdlb21ldHJpZXMsdGhpcy5nZW9tZXRyeSk7Y29uc3QgZT10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09ZSYmdm9pZCAwIT09ZS5zaGFwZXMpe2NvbnN0IG49ZS5zaGFwZXM7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IobGV0IGU9MCxyPW4ubGVuZ3RoO2U8cjtlKyspe2NvbnN0IHI9bltlXTtpKHQuc2hhcGVzLHIpfWVsc2UgaSh0LnNoYXBlcyxuKX19aWYodGhpcy5pc1NraW5uZWRNZXNoJiYoci5iaW5kTW9kZT10aGlzLmJpbmRNb2RlLHIuYmluZE1hdHJpeD10aGlzLmJpbmRNYXRyaXgudG9BcnJheSgpLHZvaWQgMCE9PXRoaXMuc2tlbGV0b24mJihpKHQuc2tlbGV0b25zLHRoaXMuc2tlbGV0b24pLHIuc2tlbGV0b249dGhpcy5za2VsZXRvbi51dWlkKSksdm9pZCAwIT09dGhpcy5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLHI9dGhpcy5tYXRlcmlhbC5sZW5ndGg7bjxyO24rKyllLnB1c2goaSh0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsW25dKSk7ci5tYXRlcmlhbD1lfWVsc2Ugci5tYXRlcmlhbD1pKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWwpO2lmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoPjApe3IuY2hpbGRyZW49W107Zm9yKGxldCBlPTA7ZTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtlKyspci5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bZV0udG9KU09OKHQpLm9iamVjdCl9aWYodGhpcy5hbmltYXRpb25zLmxlbmd0aD4wKXtyLmFuaW1hdGlvbnM9W107Zm9yKGxldCBlPTA7ZTx0aGlzLmFuaW1hdGlvbnMubGVuZ3RoO2UrKyl7Y29uc3Qgbj10aGlzLmFuaW1hdGlvbnNbZV07ci5hbmltYXRpb25zLnB1c2goaSh0LmFuaW1hdGlvbnMsbikpfX1pZihlKXtjb25zdCBlPW8odC5nZW9tZXRyaWVzKSxyPW8odC5tYXRlcmlhbHMpLGk9byh0LnRleHR1cmVzKSxzPW8odC5pbWFnZXMpLGE9byh0LnNoYXBlcyksdT1vKHQuc2tlbGV0b25zKSxjPW8odC5hbmltYXRpb25zKSxsPW8odC5ub2Rlcyk7ZS5sZW5ndGg+MCYmKG4uZ2VvbWV0cmllcz1lKSxyLmxlbmd0aD4wJiYobi5tYXRlcmlhbHM9ciksaS5sZW5ndGg+MCYmKG4udGV4dHVyZXM9aSkscy5sZW5ndGg+MCYmKG4uaW1hZ2VzPXMpLGEubGVuZ3RoPjAmJihuLnNoYXBlcz1hKSx1Lmxlbmd0aD4wJiYobi5za2VsZXRvbnM9dSksYy5sZW5ndGg+MCYmKG4uYW5pbWF0aW9ucz1jKSxsLmxlbmd0aD4wJiYobi5ub2Rlcz1sKX1yZXR1cm4gbi5vYmplY3Q9cixuO2Z1bmN0aW9uIG8odCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgbiBpbiB0KXtjb25zdCByPXRbbl07ZGVsZXRlIHIubWV0YWRhdGEsZS5wdXNoKHIpfXJldHVybiBlfX1jbG9uZSh0KXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyx0KX1jb3B5KHQsZT0hMCl7aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT10Lm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLmFuaW1hdGlvbnM9dC5hbmltYXRpb25zLnNsaWNlKCksdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSwhMD09PWUpZm9yKGxldCBlPTA7ZTx0LmNoaWxkcmVuLmxlbmd0aDtlKyspe2NvbnN0IG49dC5jaGlsZHJlbltlXTt0aGlzLmFkZChuLmNsb25lKCkpfXJldHVybiB0aGlzfX1fZi5ERUZBVUxUX1VQPW5ldyB5aCgwLDEsMCksX2YuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEU9ITAsX2YuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEU9ITA7Y29uc3QgeGY9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0sd2Y9e2g6MCxzOjAsbDowfSxiZj17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIERmKHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbjwxLzY/dCs2KihlLXQpKm46bjwuNT9lOm48Mi8zP3QrNiooZS10KSooMi8zLW4pOnR9Y2xhc3MgRWZ7Y29uc3RydWN0b3IodCxlLG4pe3JldHVybiB0aGlzLmlzQ29sb3I9ITAsdGhpcy5yPTEsdGhpcy5nPTEsdGhpcy5iPTEsdGhpcy5zZXQodCxlLG4pfXNldCh0LGUsbil7aWYodm9pZCAwPT09ZSYmdm9pZCAwPT09bil7Y29uc3QgZT10O2UmJmUuaXNDb2xvcj90aGlzLmNvcHkoZSk6Im51bWJlciI9PXR5cGVvZiBlP3RoaXMuc2V0SGV4KGUpOiJzdHJpbmciPT10eXBlb2YgZSYmdGhpcy5zZXRTdHlsZShlKX1lbHNlIHRoaXMuc2V0UkdCKHQsZSxuKTtyZXR1cm4gdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz10LHRoaXMuYj10LHRoaXN9c2V0SGV4KHQsZT1xbCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSx0aGlzLnI9KHQ+PjE2JjI1NSkvMjU1LHRoaXMuZz0odD4+OCYyNTUpLzI1NSx0aGlzLmI9KDI1NSZ0KS8yNTUsaWgudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLGUpLHRoaXN9c2V0UkdCKHQsZSxuLHI9aWgud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9bixpaC50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsciksdGhpc31zZXRIU0wodCxlLG4scj1paC53b3JraW5nQ29sb3JTcGFjZSl7aWYodD1mdW5jdGlvbih0LGUpe3JldHVybih0JWUrZSklZX0odCwxKSxlPUtsKGUsMCwxKSxuPUtsKG4sMCwxKSwwPT09ZSl0aGlzLnI9dGhpcy5nPXRoaXMuYj1uO2Vsc2V7Y29uc3Qgcj1uPD0uNT9uKigxK2UpOm4rZS1uKmUsaT0yKm4tcjt0aGlzLnI9RGYoaSxyLHQrMS8zKSx0aGlzLmc9RGYoaSxyLHQpLHRoaXMuYj1EZihpLHIsdC0xLzMpfXJldHVybiBpaC50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsciksdGhpc31zZXRTdHlsZSh0LGU9cWwpe2Z1bmN0aW9uIG4odCl7dm9pZCAwIT09dCYmcGFyc2VGbG9hdCh0KX1sZXQgcjtpZihyPS9eKFx3KylcKChbXlwpXSopXCkvLmV4ZWModCkpe2xldCB0O2NvbnN0IGk9clsxXSxvPXJbMl07c3dpdGNoKGkpe2Nhc2UicmdiIjpjYXNlInJnYmEiOmlmKHQ9L15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSlyZXR1cm4gbih0WzRdKSx0aGlzLnNldFJHQihNYXRoLm1pbigyNTUscGFyc2VJbnQodFsxXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQodFsyXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQodFszXSwxMCkpLzI1NSxlKTtpZih0PS9eXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpcmV0dXJuIG4odFs0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMTAwLHBhcnNlSW50KHRbMV0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHRbMl0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHRbM10sMTApKS8xMDAsZSk7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYodD0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCpcLj9cZCspXCVccyosXHMqKFxkKlwuP1xkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSlyZXR1cm4gbih0WzRdKSx0aGlzLnNldEhTTChwYXJzZUZsb2F0KHRbMV0pLzM2MCxwYXJzZUZsb2F0KHRbMl0pLzEwMCxwYXJzZUZsb2F0KHRbM10pLzEwMCxlKX19ZWxzZSBpZihyPS9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyh0KSl7Y29uc3QgdD1yWzFdLG49dC5sZW5ndGg7aWYoMz09PW4pcmV0dXJuIHRoaXMuc2V0UkdCKHBhcnNlSW50KHQuY2hhckF0KDApLDE2KS8xNSxwYXJzZUludCh0LmNoYXJBdCgxKSwxNikvMTUscGFyc2VJbnQodC5jaGFyQXQoMiksMTYpLzE1LGUpO2lmKDY9PT1uKXJldHVybiB0aGlzLnNldEhleChwYXJzZUludCh0LDE2KSxlKX1lbHNlIGlmKHQmJnQubGVuZ3RoPjApcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHQsZSk7cmV0dXJuIHRoaXN9c2V0Q29sb3JOYW1lKHQsZT1xbCl7Y29uc3Qgbj14Zlt0LnRvTG93ZXJDYXNlKCldO3JldHVybiB2b2lkIDAhPT1uJiZ0aGlzLnNldEhleChuLGUpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPW9oKHQuciksdGhpcy5nPW9oKHQuZyksdGhpcy5iPW9oKHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9c2godC5yKSx0aGlzLmc9c2godC5nKSx0aGlzLmI9c2godC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgodD1xbCl7cmV0dXJuIGloLmZyb21Xb3JraW5nQ29sb3JTcGFjZShDZi5jb3B5KHRoaXMpLHQpLDY1NTM2Kk1hdGgucm91bmQoS2woMjU1KkNmLnIsMCwyNTUpKSsyNTYqTWF0aC5yb3VuZChLbCgyNTUqQ2YuZywwLDI1NSkpK01hdGgucm91bmQoS2woMjU1KkNmLmIsMCwyNTUpKX1nZXRIZXhTdHJpbmcodD1xbCl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KHQpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0LGU9aWgud29ya2luZ0NvbG9yU3BhY2Upe2loLmZyb21Xb3JraW5nQ29sb3JTcGFjZShDZi5jb3B5KHRoaXMpLGUpO2NvbnN0IG49Q2YucixyPUNmLmcsaT1DZi5iLG89TWF0aC5tYXgobixyLGkpLHM9TWF0aC5taW4obixyLGkpO2xldCBhLHU7Y29uc3QgYz0ocytvKS8yO2lmKHM9PT1vKWE9MCx1PTA7ZWxzZXtjb25zdCB0PW8tcztzd2l0Y2godT1jPD0uNT90LyhvK3MpOnQvKDItby1zKSxvKXtjYXNlIG46YT0oci1pKS90KyhyPGk/NjowKTticmVhaztjYXNlIHI6YT0oaS1uKS90KzI7YnJlYWs7Y2FzZSBpOmE9KG4tcikvdCs0fWEvPTZ9cmV0dXJuIHQuaD1hLHQucz11LHQubD1jLHR9Z2V0UkdCKHQsZT1paC53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIGloLmZyb21Xb3JraW5nQ29sb3JTcGFjZShDZi5jb3B5KHRoaXMpLGUpLHQucj1DZi5yLHQuZz1DZi5nLHQuYj1DZi5iLHR9Z2V0U3R5bGUodD1xbCl7aWguZnJvbVdvcmtpbmdDb2xvclNwYWNlKENmLmNvcHkodGhpcyksdCk7Y29uc3QgZT1DZi5yLG49Q2YuZyxyPUNmLmI7cmV0dXJuIHQhPT1xbD9gY29sb3IoJHt0fSAke2UudG9GaXhlZCgzKX0gJHtuLnRvRml4ZWQoMyl9ICR7ci50b0ZpeGVkKDMpfSlgOmByZ2IoJHtNYXRoLnJvdW5kKDI1NSplKX0sJHtNYXRoLnJvdW5kKDI1NSpuKX0sJHtNYXRoLnJvdW5kKDI1NSpyKX0pYH1vZmZzZXRIU0wodCxlLG4pe3JldHVybiB0aGlzLmdldEhTTCh3ZiksdGhpcy5zZXRIU0wod2YuaCt0LHdmLnMrZSx3Zi5sK24pfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqbix0aGlzLmc9dC5nKyhlLmctdC5nKSpuLHRoaXMuYj10LmIrKGUuYi10LmIpKm4sdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0wod2YpLHQuZ2V0SFNMKGJmKTtjb25zdCBuPUpsKHdmLmgsYmYuaCxlKSxyPUpsKHdmLnMsYmYucyxlKSxpPUpsKHdmLmwsYmYubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wobixyLGkpLHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMucj10LngsdGhpcy5nPXQueSx0aGlzLmI9dC56LHRoaXN9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy5yLG49dGhpcy5nLHI9dGhpcy5iLGk9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5yPWlbMF0qZStpWzNdKm4raVs2XSpyLHRoaXMuZz1pWzFdKmUraVs0XSpuK2lbN10qcix0aGlzLmI9aVsyXSplK2lbNV0qbitpWzhdKnIsdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLnIseWllbGQgdGhpcy5nLHlpZWxkIHRoaXMuYn19Y29uc3QgQ2Y9bmV3IEVmO0VmLk5BTUVTPXhmO25ldyB5aCxuZXcgUWw7bmV3IFloLG5ldyBfZixuZXcgeWgsbmV3IF9oLG5ldyBfaCxuZXcgeWg7bmV3IFloLG5ldyBjbGFzc3tjb25zdHJ1Y3Rvcih0PW5ldyB5aCxlPW5ldyB5aCgwLDAsLTEpKXt0aGlzLm9yaWdpbj10LHRoaXMuZGlyZWN0aW9uPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodCksdGhpcy5kaXJlY3Rpb24uY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodC5vcmlnaW4pLHRoaXMuZGlyZWN0aW9uLmNvcHkodC5kaXJlY3Rpb24pLHRoaXN9YXQodCxlKXtyZXR1cm4gZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sdCl9bG9va0F0KHQpe3JldHVybiB0aGlzLmRpcmVjdGlvbi5jb3B5KHQpLnN1Yih0aGlzLm9yaWdpbikubm9ybWFsaXplKCksdGhpc31yZWNhc3QodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodGhpcy5hdCh0LGtoKSksdGhpc31jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7ZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pO2NvbnN0IG49ZS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBuPDA/ZS5jb3B5KHRoaXMub3JpZ2luKTplLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixuKX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQpKX1kaXN0YW5jZVNxVG9Qb2ludCh0KXtjb25zdCBlPWtoLnN1YlZlY3RvcnModCx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gZTwwP3RoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKHQpOihraC5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sZSksa2guZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlU3FUb1NlZ21lbnQodCxlLG4scil7emguY29weSh0KS5hZGQoZSkubXVsdGlwbHlTY2FsYXIoLjUpLGpoLmNvcHkoZSkuc3ViKHQpLm5vcm1hbGl6ZSgpLFVoLmNvcHkodGhpcy5vcmlnaW4pLnN1Yih6aCk7Y29uc3QgaT0uNSp0LmRpc3RhbmNlVG8oZSksbz0tdGhpcy5kaXJlY3Rpb24uZG90KGpoKSxzPVVoLmRvdCh0aGlzLmRpcmVjdGlvbiksYT0tVWguZG90KGpoKSx1PVVoLmxlbmd0aFNxKCksYz1NYXRoLmFicygxLW8qbyk7bGV0IGwsaCxmLHA7aWYoYz4wKWlmKGw9byphLXMsaD1vKnMtYSxwPWkqYyxsPj0wKWlmKGg+PS1wKWlmKGg8PXApe2NvbnN0IHQ9MS9jO2wqPXQsaCo9dCxmPWwqKGwrbypoKzIqcykraCoobypsK2grMiphKSt1fWVsc2UgaD1pLGw9TWF0aC5tYXgoMCwtKG8qaCtzKSksZj0tbCpsK2gqKGgrMiphKSt1O2Vsc2UgaD0taSxsPU1hdGgubWF4KDAsLShvKmgrcykpLGY9LWwqbCtoKihoKzIqYSkrdTtlbHNlIGg8PS1wPyhsPU1hdGgubWF4KDAsLSgtbyppK3MpKSxoPWw+MD8taTpNYXRoLm1pbihNYXRoLm1heCgtaSwtYSksaSksZj0tbCpsK2gqKGgrMiphKSt1KTpoPD1wPyhsPTAsaD1NYXRoLm1pbihNYXRoLm1heCgtaSwtYSksaSksZj1oKihoKzIqYSkrdSk6KGw9TWF0aC5tYXgoMCwtKG8qaStzKSksaD1sPjA/aTpNYXRoLm1pbihNYXRoLm1heCgtaSwtYSksaSksZj0tbCpsK2gqKGgrMiphKSt1KTtlbHNlIGg9bz4wPy1pOmksbD1NYXRoLm1heCgwLC0obypoK3MpKSxmPS1sKmwraCooaCsyKmEpK3U7cmV0dXJuIG4mJm4uY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGwpLHImJnIuY29weSh6aCkuYWRkU2NhbGVkVmVjdG9yKGpoLGgpLGZ9aW50ZXJzZWN0U3BoZXJlKHQsZSl7a2guc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLm9yaWdpbik7Y29uc3Qgbj1raC5kb3QodGhpcy5kaXJlY3Rpb24pLHI9a2guZG90KGtoKS1uKm4saT10LnJhZGl1cyp0LnJhZGl1cztpZihyPmkpcmV0dXJuIG51bGw7Y29uc3Qgbz1NYXRoLnNxcnQoaS1yKSxzPW4tbyxhPW4rbztyZXR1cm4gYTwwP251bGw6czwwP3RoaXMuYXQoYSxlKTp0aGlzLmF0KHMsZSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWRpc3RhbmNlVG9QbGFuZSh0KXtjb25zdCBlPXQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbik7aWYoMD09PWUpcmV0dXJuIDA9PT10LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik/MDpudWxsO2NvbnN0IG49LSh0aGlzLm9yaWdpbi5kb3QodC5ub3JtYWwpK3QuY29uc3RhbnQpL2U7cmV0dXJuIG4+PTA/bjpudWxsfWludGVyc2VjdFBsYW5lKHQsZSl7Y29uc3Qgbj10aGlzLmRpc3RhbmNlVG9QbGFuZSh0KTtyZXR1cm4gbnVsbD09PW4/bnVsbDp0aGlzLmF0KG4sZSl9aW50ZXJzZWN0c1BsYW5lKHQpe2NvbnN0IGU9dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pO3JldHVybiAwPT09ZXx8dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKSplPDB9aW50ZXJzZWN0Qm94KHQsZSl7bGV0IG4scixpLG8scyxhO2NvbnN0IHU9MS90aGlzLmRpcmVjdGlvbi54LGM9MS90aGlzLmRpcmVjdGlvbi55LGw9MS90aGlzLmRpcmVjdGlvbi56LGg9dGhpcy5vcmlnaW47cmV0dXJuIHU+PTA/KG49KHQubWluLngtaC54KSp1LHI9KHQubWF4LngtaC54KSp1KToobj0odC5tYXgueC1oLngpKnUscj0odC5taW4ueC1oLngpKnUpLGM+PTA/KGk9KHQubWluLnktaC55KSpjLG89KHQubWF4LnktaC55KSpjKTooaT0odC5tYXgueS1oLnkpKmMsbz0odC5taW4ueS1oLnkpKmMpLG4+b3x8aT5yfHwoKGk+bnx8aXNOYU4obikpJiYobj1pKSwobzxyfHxpc05hTihyKSkmJihyPW8pLGw+PTA/KHM9KHQubWluLnotaC56KSpsLGE9KHQubWF4LnotaC56KSpsKToocz0odC5tYXguei1oLnopKmwsYT0odC5taW4uei1oLnopKmwpLG4+YXx8cz5yKXx8KChzPm58fG4hPW4pJiYobj1zKSwoYTxyfHxyIT1yKSYmKHI9YSkscjwwKT9udWxsOnRoaXMuYXQobj49MD9uOnIsZSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gbnVsbCE9PXRoaXMuaW50ZXJzZWN0Qm94KHQsa2gpfWludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLHIsaSl7cWguc3ViVmVjdG9ycyhlLHQpLFZoLnN1YlZlY3RvcnMobix0KSxHaC5jcm9zc1ZlY3RvcnMocWgsVmgpO2xldCBvLHM9dGhpcy5kaXJlY3Rpb24uZG90KEdoKTtpZihzPjApe2lmKHIpcmV0dXJuIG51bGw7bz0xfWVsc2V7aWYoIShzPDApKXJldHVybiBudWxsO289LTEscz0tc31VaC5zdWJWZWN0b3JzKHRoaXMub3JpZ2luLHQpO2NvbnN0IGE9byp0aGlzLmRpcmVjdGlvbi5kb3QoVmguY3Jvc3NWZWN0b3JzKFVoLFZoKSk7aWYoYTwwKXJldHVybiBudWxsO2NvbnN0IHU9byp0aGlzLmRpcmVjdGlvbi5kb3QocWguY3Jvc3MoVWgpKTtpZih1PDB8fGErdT5zKXJldHVybiBudWxsO2NvbnN0IGM9LW8qVWguZG90KEdoKTtyZXR1cm4gYzwwP251bGw6dGhpcy5hdChjL3MsaSl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQodCksdGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm9yaWdpbi5lcXVhbHModGhpcy5vcmlnaW4pJiZ0LmRpcmVjdGlvbi5lcXVhbHModGhpcy5kaXJlY3Rpb24pfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX0sbmV3IEJoLG5ldyB5aDtjb25zdCBTZj1uZXcgY2xhc3N7Y29uc3RydWN0b3IodCxlLG4pe2NvbnN0IHI9dGhpcztsZXQgaSxvPSExLHM9MCxhPTA7Y29uc3QgdT1bXTt0aGlzLm9uU3RhcnQ9dm9pZCAwLHRoaXMub25Mb2FkPXQsdGhpcy5vblByb2dyZXNzPWUsdGhpcy5vbkVycm9yPW4sdGhpcy5pdGVtU3RhcnQ9ZnVuY3Rpb24odCl7YSsrLCExPT09byYmdm9pZCAwIT09ci5vblN0YXJ0JiZyLm9uU3RhcnQodCxzLGEpLG89ITB9LHRoaXMuaXRlbUVuZD1mdW5jdGlvbih0KXtzKyssdm9pZCAwIT09ci5vblByb2dyZXNzJiZyLm9uUHJvZ3Jlc3ModCxzLGEpLHM9PT1hJiYobz0hMSx2b2lkIDAhPT1yLm9uTG9hZCYmci5vbkxvYWQoKSl9LHRoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXIub25FcnJvciYmci5vbkVycm9yKHQpfSx0aGlzLnJlc29sdmVVUkw9ZnVuY3Rpb24odCl7cmV0dXJuIGk/aSh0KTp0fSx0aGlzLnNldFVSTE1vZGlmaWVyPWZ1bmN0aW9uKHQpe3JldHVybiBpPXQsdGhpc30sdGhpcy5hZGRIYW5kbGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUucHVzaCh0LGUpLHRoaXN9LHRoaXMucmVtb3ZlSGFuZGxlcj1mdW5jdGlvbih0KXtjb25zdCBlPXUuaW5kZXhPZih0KTtyZXR1cm4tMSE9PWUmJnUuc3BsaWNlKGUsMiksdGhpc30sdGhpcy5nZXRIYW5kbGVyPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wLG49dS5sZW5ndGg7ZTxuO2UrPTIpe2NvbnN0IG49dVtlXSxyPXVbZSsxXTtpZihuLmdsb2JhbCYmKG4ubGFzdEluZGV4PTApLG4udGVzdCh0KSlyZXR1cm4gcn1yZXR1cm4gbnVsbH19fTtjbGFzcyBBZntjb25zdHJ1Y3Rvcih0KXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09dD90OlNmLHRoaXMuY3Jvc3NPcmlnaW49ImFub255bW91cyIsdGhpcy53aXRoQ3JlZGVudGlhbHM9ITEsdGhpcy5wYXRoPSIiLHRoaXMucmVzb3VyY2VQYXRoPSIiLHRoaXMucmVxdWVzdEhlYWRlcj17fX1sb2FkKCl7fWxvYWRBc3luYyh0LGUpe2NvbnN0IG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsaSl7bi5sb2FkKHQscixlLGkpfSkpfXBhcnNlKCl7fXNldENyb3NzT3JpZ2luKHQpe3JldHVybiB0aGlzLmNyb3NzT3JpZ2luPXQsdGhpc31zZXRXaXRoQ3JlZGVudGlhbHModCl7cmV0dXJuIHRoaXMud2l0aENyZWRlbnRpYWxzPXQsdGhpc31zZXRQYXRoKHQpe3JldHVybiB0aGlzLnBhdGg9dCx0aGlzfXNldFJlc291cmNlUGF0aCh0KXtyZXR1cm4gdGhpcy5yZXNvdXJjZVBhdGg9dCx0aGlzfXNldFJlcXVlc3RIZWFkZXIodCl7cmV0dXJuIHRoaXMucmVxdWVzdEhlYWRlcj10LHRoaXN9fUFmLkRFRkFVTFRfTUFURVJJQUxfTkFNRT0iX19ERUZBVUxUIjtFcnJvcjtmdW5jdGlvbiBOZigpe3JldHVybiBOZj1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPWFyZ3VtZW50c1tlXTtmb3IodmFyIHIgaW4gbikoe30pLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKHRbcl09bltyXSl9cmV0dXJuIHR9LE5mLmFwcGx5KG51bGwsYXJndW1lbnRzKX0idW5kZWZpbmVkIiE9dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZWdpc3RlciIse2RldGFpbDp7cmV2aXNpb246IjE3NCJ9fSkpLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93Ll9fVEhSRUVfX3x8KHdpbmRvdy5fX1RIUkVFX189IjE3NCIpKTt2YXIgSWY9e2Vwc2lsb246MWUtMTIsbWF0cml4OiJNYXRyaXgiLG51bWJlcjoibnVtYmVyIixwcmVjaXNpb246NjQscHJlZGljdGFibGU6ITEscmFuZG9tU2VlZDpudWxsfTtmdW5jdGlvbiBNZih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR9ZnVuY3Rpb24gRmYodCl7cmV0dXJuISghdHx8Im9iamVjdCIhPXR5cGVvZiB0fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5jb25zdHJ1Y3RvcikmJighMD09PXQuaXNCaWdOdW1iZXImJiJvYmplY3QiPT10eXBlb2YgdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNCaWdOdW1iZXJ8fCJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yLmlzRGVjaW1hbCYmITA9PT10LmNvbnN0cnVjdG9yLmlzRGVjaW1hbCh0KSl9ZnVuY3Rpb24gVGYodCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmITA9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCkuaXNDb21wbGV4fHwhMX1mdW5jdGlvbiBPZih0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0JiYhMD09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0KS5pc0ZyYWN0aW9ufHwhMX1mdW5jdGlvbiBMZih0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc1VuaXR8fCExfWZ1bmN0aW9uIFJmKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdH12YXIgQmY9QXJyYXkuaXNBcnJheTtmdW5jdGlvbiBrZih0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc01hdHJpeHx8ITF9ZnVuY3Rpb24gemYodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl8fGtmKHQpfWZ1bmN0aW9uIGpmKHQpe3JldHVybiB0JiZ0LmlzRGVuc2VNYXRyaXgmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNNYXRyaXh8fCExfWZ1bmN0aW9uIFVmKHQpe3JldHVybiB0JiZ0LmlzU3BhcnNlTWF0cml4JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTWF0cml4fHwhMX1mdW5jdGlvbiBxZih0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc1JhbmdlfHwhMX1mdW5jdGlvbiBWZih0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc0luZGV4fHwhMX1mdW5jdGlvbiBHZih0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIFlmKHQpe3JldHVybiB0JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzUmVzdWx0U2V0fHwhMX1mdW5jdGlvbiBYZih0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc0hlbHB8fCExfWZ1bmN0aW9uIFdmKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIEhmKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZX1mdW5jdGlvbiBaZih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFJlZ0V4cH1mdW5jdGlvbiBLZih0KXtyZXR1cm4hKCF0fHwib2JqZWN0IiE9dHlwZW9mIHR8fHQuY29uc3RydWN0b3IhPT1PYmplY3R8fFRmKHQpfHxPZih0KSl9ZnVuY3Rpb24gSmYodCl7cmV0dXJuIG51bGw9PT10fWZ1bmN0aW9uIFFmKHQpe3JldHVybiB2b2lkIDA9PT10fWZ1bmN0aW9uICRmKHQpe3JldHVybiB0JiYhMD09PXQuaXNBY2Nlc3Nvck5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiB0cCh0KXtyZXR1cm4gdCYmITA9PT10LmlzQXJyYXlOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gZXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0Fzc2lnbm1lbnROb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gbnAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0Jsb2NrTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIHJwKHQpe3JldHVybiB0JiYhMD09PXQuaXNDb25kaXRpb25hbE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBpcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzQ29uc3RhbnROb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gb3AodCl7cmV0dXJuIHQmJiEwPT09dC5pc0Z1bmN0aW9uQXNzaWdubWVudE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBzcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzRnVuY3Rpb25Ob2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gYXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0luZGV4Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIHVwKHQpe3JldHVybiB0JiYhMD09PXQuaXNOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gY3AodCl7cmV0dXJuIHQmJiEwPT09dC5pc09iamVjdE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBscCh0KXtyZXR1cm4gdCYmITA9PT10LmlzT3BlcmF0b3JOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gaHAodCl7cmV0dXJuIHQmJiEwPT09dC5pc1BhcmVudGhlc2lzTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGZwKHQpe3JldHVybiB0JiYhMD09PXQuaXNSYW5nZU5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBwcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzUmVsYXRpb25hbE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBkcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzU3ltYm9sTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGdwKHQpe3JldHVybiB0JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzQ2hhaW58fCExfWZ1bmN0aW9uIHlwKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJvYmplY3QiPT09ZT9udWxsPT09dD8ibnVsbCI6RmYodCk/IkJpZ051bWJlciI6dC5jb25zdHJ1Y3RvciYmdC5jb25zdHJ1Y3Rvci5uYW1lP3QuY29uc3RydWN0b3IubmFtZToiT2JqZWN0IjplfWZ1bmN0aW9uIG1wKHQpe3ZhciBlPXR5cGVvZiB0O2lmKCJudW1iZXIiPT09ZXx8InN0cmluZyI9PT1lfHwiYm9vbGVhbiI9PT1lfHxudWxsPT10KXJldHVybiB0O2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LmNsb25lKXJldHVybiB0LmNsb25lKCk7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBtcCh0KX0pKTtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gbmV3IERhdGUodC52YWx1ZU9mKCkpO2lmKEZmKHQpKXJldHVybiB0O2lmKHQgaW5zdGFuY2VvZiBSZWdFeHApdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNsb25lICIrdCk7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciByIGluIHQpX3AodCxyKSYmKG5bcl09ZSh0W3JdKSk7cmV0dXJuIG59KHQsbXApfWZ1bmN0aW9uIHZwKHQsZSl7dmFyIG4scixpO2lmKEFycmF5LmlzQXJyYXkodCkpe2lmKCFBcnJheS5pc0FycmF5KGUpfHx0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2ZvcihyPTAsaT10Lmxlbmd0aDtyPGk7cisrKWlmKCF2cCh0W3JdLGVbcl0pKXJldHVybiExO3JldHVybiEwfWlmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiB0PT09ZTtpZih0IGluc3RhbmNlb2YgT2JqZWN0KXtpZihBcnJheS5pc0FycmF5KGUpfHwhKGUgaW5zdGFuY2VvZiBPYmplY3QpKXJldHVybiExO2ZvcihuIGluIHQpaWYoIShuIGluIGUpfHwhdnAodFtuXSxlW25dKSlyZXR1cm4hMTtmb3IobiBpbiBlKWlmKCEobiBpbiB0KSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdD09PWV9ZnVuY3Rpb24gX3AodCxlKXtyZXR1cm4gdCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxlKX12YXIgeHA9ZnVuY3Rpb24odCl7aWYodCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBnbG9iYWwgY29uZmlnIGlzIHJlYWRvbmx5LiBcblBsZWFzZSBjcmVhdGUgYSBtYXRoanMgaW5zdGFuY2UgaWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uIFxuRXhhbXBsZTpcblxuICBpbXBvcnQgeyBjcmVhdGUsIGFsbCB9IGZyb20gJ21hdGhqcyc7XG4gIGNvbnN0IG1hdGhqcyA9IGNyZWF0ZShhbGwpO1xuICBtYXRoanMuY29uZmlnKHsgbnVtYmVyOiAnQmlnTnVtYmVyJyB9KTtcbiIpO3JldHVybiBPYmplY3QuZnJlZXplKElmKX07ZnVuY3Rpb24gd3AoKXtyZXR1cm4hMH1mdW5jdGlvbiBicCgpe3JldHVybiExfWZ1bmN0aW9uIERwKCl7fU5mKHhwLElmLHtNQVRSSVhfT1BUSU9OUzpbIk1hdHJpeCIsIkFycmF5Il0sTlVNQkVSX09QVElPTlM6WyJudW1iZXIiLCJCaWdOdW1iZXIiLCJGcmFjdGlvbiJdfSk7Y29uc3QgRXA9IkFyZ3VtZW50IGlzIG5vdCBhIHR5cGVkLWZ1bmN0aW9uLiI7dmFyIENwPWZ1bmN0aW9uIHQoKXtmdW5jdGlvbiBlKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQmJnQuY29uc3RydWN0b3I9PT1PYmplY3R9Y29uc3Qgbj1be25hbWU6Im51bWJlciIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR9fSx7bmFtZToic3RyaW5nIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdH19LHtuYW1lOiJib29sZWFuIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR9fSx7bmFtZToiRnVuY3Rpb24iLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9fSx7bmFtZToiQXJyYXkiLHRlc3Q6QXJyYXkuaXNBcnJheX0se25hbWU6IkRhdGUiLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlfX0se25hbWU6IlJlZ0V4cCIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFJlZ0V4cH19LHtuYW1lOiJPYmplY3QiLHRlc3Q6ZX0se25hbWU6Im51bGwiLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10fX0se25hbWU6InVuZGVmaW5lZCIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dH19XSxyPXtuYW1lOiJhbnkiLHRlc3Q6d3AsaXNBbnk6ITB9O2xldCBpLG8scz0wLGE9e2NyZWF0ZUNvdW50OjB9O2Z1bmN0aW9uIHUodCl7Y29uc3QgZT1pLmdldCh0KTtpZihlKXJldHVybiBlO2xldCBuPSdVbmtub3duIHR5cGUgIicrdCsnIic7Y29uc3Qgcj10LnRvTG93ZXJDYXNlKCk7bGV0IHM7Zm9yKHMgb2YgbylpZihzLnRvTG93ZXJDYXNlKCk9PT1yKXtuKz0nLiBEaWQgeW91IG1lYW4gIicrcysnIiA/JzticmVha310aHJvdyBuZXcgVHlwZUVycm9yKG4pfWZ1bmN0aW9uIGModCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJhbnkiO2NvbnN0IG49ZT91KGUpLmluZGV4Om8ubGVuZ3RoLHI9W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDsrK2Upe2lmKCF0W2VdfHwic3RyaW5nIiE9dHlwZW9mIHRbZV0ubmFtZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbZV0udGVzdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHtuYW1lOiBzdHJpbmcsIHRlc3Q6IGZ1bmN0aW9ufSBleHBlY3RlZCIpO2NvbnN0IG89dFtlXS5uYW1lO2lmKGkuaGFzKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJ0R1cGxpY2F0ZSB0eXBlIG5hbWUgIicrbysnIicpO3IucHVzaChvKSxpLnNldChvLHtuYW1lOm8sdGVzdDp0W2VdLnRlc3QsaXNBbnk6dFtlXS5pc0FueSxpbmRleDpuK2UsY29udmVyc2lvbnNUbzpbXX0pfWNvbnN0IHM9by5zbGljZShuKTtvPW8uc2xpY2UoMCxuKS5jb25jYXQocikuY29uY2F0KHMpO2ZvcihsZXQgdD1uK3IubGVuZ3RoO3Q8by5sZW5ndGg7Kyt0KWkuZ2V0KG9bdF0pLmluZGV4PXR9ZnVuY3Rpb24gbCgpe2k9bmV3IE1hcCxvPVtdLHM9MCxjKFtyXSwhMSl9ZnVuY3Rpb24gaCh0KXtjb25zdCBlPW8uZmlsdGVyKChlPT57Y29uc3Qgbj1pLmdldChlKTtyZXR1cm4hbi5pc0FueSYmbi50ZXN0KHQpfSkpO3JldHVybiBlLmxlbmd0aD9lOlsiYW55Il19ZnVuY3Rpb24gZih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJiJfdHlwZWRGdW5jdGlvbkRhdGEiaW4gdH1mdW5jdGlvbiBwKHQsZSxuKXtpZighZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKEVwKTtjb25zdCByPW4mJm4uZXhhY3QsaT12KEFycmF5LmlzQXJyYXkoZSk/ZS5qb2luKCIsIik6ZSksbz1kKGkpO2lmKCFyfHxvIGluIHQuc2lnbmF0dXJlcyl7Y29uc3QgZT10Ll90eXBlZEZ1bmN0aW9uRGF0YS5zaWduYXR1cmVNYXAuZ2V0KG8pO2lmKGUpcmV0dXJuIGV9Y29uc3Qgcz1pLmxlbmd0aDtsZXQgYSx1O2lmKHIpe2xldCBlO2ZvcihlIGluIGE9W10sdC5zaWduYXR1cmVzKWEucHVzaCh0Ll90eXBlZEZ1bmN0aW9uRGF0YS5zaWduYXR1cmVNYXAuZ2V0KGUpKX1lbHNlIGE9dC5fdHlwZWRGdW5jdGlvbkRhdGEuc2lnbmF0dXJlcztmb3IobGV0IHQ9MDt0PHM7Kyt0KXtjb25zdCBlPWlbdF0sbj1bXTtsZXQgcjtmb3IociBvZiBhKXtjb25zdCBpPWIoci5wYXJhbXMsdCk7aWYoaSYmKCFlLnJlc3RQYXJhbXx8aS5yZXN0UGFyYW0pKXtpZighaS5oYXNBbnkpe2NvbnN0IHQ9bShpKTtpZihlLnR5cGVzLnNvbWUoKGU9PiF0LmhhcyhlLm5hbWUpKSkpY29udGludWV9bi5wdXNoKHIpfX1pZihhPW4sMD09PWEubGVuZ3RoKWJyZWFrfWZvcih1IG9mIGEpaWYodS5wYXJhbXMubGVuZ3RoPD1zKXJldHVybiB1O3Rocm93IG5ldyBUeXBlRXJyb3IoIlNpZ25hdHVyZSBub3QgZm91bmQgKHNpZ25hdHVyZTogIisodC5uYW1lfHwidW5uYW1lZCIpKyIoIitkKGksIiwgIikrIikpIil9ZnVuY3Rpb24gZCh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiwiO3JldHVybiB0Lm1hcCgodD0+dC5uYW1lKSkuam9pbihlKX1mdW5jdGlvbiBnKHQpe2NvbnN0IGU9MD09PXQuaW5kZXhPZigiLi4uIiksbj0oZT90Lmxlbmd0aD4zP3Quc2xpY2UoMyk6ImFueSI6dCkuc3BsaXQoInwiKS5tYXAoKHQ9PnUodC50cmltKCkpKSk7bGV0IHI9ITEsaT1lPyIuLi4iOiIiO3JldHVybnt0eXBlczpuLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHI9dC5pc0FueXx8cixpKz10Lm5hbWUrInwiLHtuYW1lOnQubmFtZSx0eXBlSW5kZXg6dC5pbmRleCx0ZXN0OnQudGVzdCxpc0FueTp0LmlzQW55LGNvbnZlcnNpb246bnVsbCxjb252ZXJzaW9uSW5kZXg6LTF9fSkpLG5hbWU6aS5zbGljZSgwLC0xKSxoYXNBbnk6cixoYXNDb252ZXJzaW9uOiExLHJlc3RQYXJhbTplfX1mdW5jdGlvbiB5KHQpe2NvbnN0IGU9ZnVuY3Rpb24odCl7aWYoMD09PXQubGVuZ3RoKXJldHVybltdO2NvbnN0IGU9dC5tYXAodSk7dC5sZW5ndGg+MSYmZS5zb3J0KCgodCxlKT0+dC5pbmRleC1lLmluZGV4KSk7bGV0IG49ZVswXS5jb252ZXJzaW9uc1RvO2lmKDE9PT10Lmxlbmd0aClyZXR1cm4gbjtuPW4uY29uY2F0KFtdKTtjb25zdCByPW5ldyBTZXQodCk7Zm9yKGxldCB0PTE7dDxlLmxlbmd0aDsrK3Qpe2xldCBpO2ZvcihpIG9mIGVbdF0uY29udmVyc2lvbnNUbylyLmhhcyhpLmZyb20pfHwobi5wdXNoKGkpLHIuYWRkKGkuZnJvbSkpfXJldHVybiBufSh0LnR5cGVzLm1hcCgodD0+dC5uYW1lKSkpO2xldCBuPXQuaGFzQW55LHI9dC5uYW1lO2NvbnN0IGk9ZS5tYXAoKGZ1bmN0aW9uKHQpe2NvbnN0IGU9dSh0LmZyb20pO3JldHVybiBuPWUuaXNBbnl8fG4scis9InwiK3QuZnJvbSx7bmFtZTp0LmZyb20sdHlwZUluZGV4OmUuaW5kZXgsdGVzdDplLnRlc3QsaXNBbnk6ZS5pc0FueSxjb252ZXJzaW9uOnQsY29udmVyc2lvbkluZGV4OnQuaW5kZXh9fSkpO3JldHVybnt0eXBlczp0LnR5cGVzLmNvbmNhdChpKSxuYW1lOnIsaGFzQW55Om4saGFzQ29udmVyc2lvbjppLmxlbmd0aD4wLHJlc3RQYXJhbTp0LnJlc3RQYXJhbX19ZnVuY3Rpb24gbSh0KXtyZXR1cm4gdC50eXBlU2V0fHwodC50eXBlU2V0PW5ldyBTZXQsdC50eXBlcy5mb3JFYWNoKChlPT50LnR5cGVTZXQuYWRkKGUubmFtZSkpKSksdC50eXBlU2V0fWZ1bmN0aW9uIHYodCl7Y29uc3QgZT1bXTtpZigic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2lnbmF0dXJlcyBtdXN0IGJlIHN0cmluZ3MiKTtjb25zdCBuPXQudHJpbSgpO2lmKCIiPT09bilyZXR1cm4gZTtjb25zdCByPW4uc3BsaXQoIiwiKTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoOysrdCl7Y29uc3Qgbj1nKHJbdF0udHJpbSgpKTtpZihuLnJlc3RQYXJhbSYmdCE9PXIubGVuZ3RoLTEpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdVbmV4cGVjdGVkIHJlc3QgcGFyYW1ldGVyICInK3JbdF0rJyI6IG9ubHkgYWxsb3dlZCBmb3IgdGhlIGxhc3QgcGFyYW1ldGVyJyk7aWYoMD09PW4udHlwZXMubGVuZ3RoKXJldHVybiBudWxsO2UucHVzaChuKX1yZXR1cm4gZX1mdW5jdGlvbiBfKHQpe2NvbnN0IGU9aih0KTtyZXR1cm4hIWUmJmUucmVzdFBhcmFtfWZ1bmN0aW9uIHgodCl7aWYoIXR8fDA9PT10LnR5cGVzLmxlbmd0aClyZXR1cm4gd3A7aWYoMT09PXQudHlwZXMubGVuZ3RoKXJldHVybiB1KHQudHlwZXNbMF0ubmFtZSkudGVzdDtpZigyPT09dC50eXBlcy5sZW5ndGgpe2NvbnN0IGU9dSh0LnR5cGVzWzBdLm5hbWUpLnRlc3Qsbj11KHQudHlwZXNbMV0ubmFtZSkudGVzdDtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUodCl8fG4odCl9fXtjb25zdCBlPXQudHlwZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdSh0Lm5hbWUpLnRlc3R9KSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWlmKGVbbl0odCkpcmV0dXJuITA7cmV0dXJuITF9fX1mdW5jdGlvbiB3KHQpe2xldCBlLG4scjtpZihfKHQpKXtlPXoodCkubWFwKHgpO2NvbnN0IG49ZS5sZW5ndGgscj14KGoodCkpLGk9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPW47ZTx0Lmxlbmd0aDtlKyspaWYoIXIodFtlXSkpcmV0dXJuITE7cmV0dXJuITB9O3JldHVybiBmdW5jdGlvbih0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylpZighZVtuXSh0W25dKSlyZXR1cm4hMTtyZXR1cm4gaSh0KSYmdC5sZW5ndGg+PW4rMX19cmV0dXJuIDA9PT10Lmxlbmd0aD9mdW5jdGlvbih0KXtyZXR1cm4gMD09PXQubGVuZ3RofToxPT09dC5sZW5ndGg/KG49eCh0WzBdKSxmdW5jdGlvbih0KXtyZXR1cm4gbih0WzBdKSYmMT09PXQubGVuZ3RofSk6Mj09PXQubGVuZ3RoPyhuPXgodFswXSkscj14KHRbMV0pLGZ1bmN0aW9uKHQpe3JldHVybiBuKHRbMF0pJiZyKHRbMV0pJiYyPT09dC5sZW5ndGh9KTooZT10Lm1hcCh4KSxmdW5jdGlvbih0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylpZighZVtuXSh0W25dKSlyZXR1cm4hMTtyZXR1cm4gdC5sZW5ndGg9PT1lLmxlbmd0aH0pfWZ1bmN0aW9uIGIodCxlKXtyZXR1cm4gZTx0Lmxlbmd0aD90W2VdOl8odCk/aih0KTpudWxsfWZ1bmN0aW9uIEQodCxlKXtjb25zdCBuPWIodCxlKTtyZXR1cm4gbj9tKG4pOm5ldyBTZXR9ZnVuY3Rpb24gRSh0KXtyZXR1cm4gbnVsbD09PXQuY29udmVyc2lvbnx8dm9pZCAwPT09dC5jb252ZXJzaW9ufWZ1bmN0aW9uIEModCxlKXtjb25zdCBuPW5ldyBTZXQ7cmV0dXJuIHQuZm9yRWFjaCgodD0+e2NvbnN0IHI9RCh0LnBhcmFtcyxlKTtsZXQgaTtmb3IoaSBvZiByKW4uYWRkKGkpfSkpLG4uaGFzKCJhbnkiKT9bImFueSJdOkFycmF5LmZyb20obil9ZnVuY3Rpb24gUyh0LGUsbil7bGV0IHIsaTtjb25zdCBvPXR8fCJ1bm5hbWVkIjtsZXQgcyxhPW47Zm9yKHM9MDtzPGUubGVuZ3RoO3MrKyl7Y29uc3QgdD1bXTtpZihhLmZvckVhY2goKG49Pntjb25zdCByPXgoYihuLnBhcmFtcyxzKSk7KHM8bi5wYXJhbXMubGVuZ3RofHxfKG4ucGFyYW1zKSkmJnIoZVtzXSkmJnQucHVzaChuKX0pKSwwPT09dC5sZW5ndGgpe2lmKGk9QyhhLHMpLGkubGVuZ3RoPjApe2NvbnN0IHQ9aChlW3NdKTtyZXR1cm4gcj1uZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIHR5cGUgb2YgYXJndW1lbnQgaW4gZnVuY3Rpb24gIitvKyIgKGV4cGVjdGVkOiAiK2kuam9pbigiIG9yICIpKyIsIGFjdHVhbDogIit0LmpvaW4oIiB8ICIpKyIsIGluZGV4OiAiK3MrIikiKSxyLmRhdGE9e2NhdGVnb3J5OiJ3cm9uZ1R5cGUiLGZuOm8saW5kZXg6cyxhY3R1YWw6dCxleHBlY3RlZDppfSxyfX1lbHNlIGE9dH1jb25zdCB1PWEubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gXyh0LnBhcmFtcyk/MS8wOnQucGFyYW1zLmxlbmd0aH0pKTtpZihlLmxlbmd0aDxNYXRoLm1pbi5hcHBseShudWxsLHUpKXJldHVybiBpPUMoYSxzKSxyPW5ldyBUeXBlRXJyb3IoIlRvbyBmZXcgYXJndW1lbnRzIGluIGZ1bmN0aW9uICIrbysiIChleHBlY3RlZDogIitpLmpvaW4oIiBvciAiKSsiLCBpbmRleDogIitlLmxlbmd0aCsiKSIpLHIuZGF0YT17Y2F0ZWdvcnk6InRvb0Zld0FyZ3MiLGZuOm8saW5kZXg6ZS5sZW5ndGgsZXhwZWN0ZWQ6aX0scjtjb25zdCBjPU1hdGgubWF4LmFwcGx5KG51bGwsdSk7aWYoZS5sZW5ndGg+YylyZXR1cm4gcj1uZXcgVHlwZUVycm9yKCJUb28gbWFueSBhcmd1bWVudHMgaW4gZnVuY3Rpb24gIitvKyIgKGV4cGVjdGVkOiAiK2MrIiwgYWN0dWFsOiAiK2UubGVuZ3RoKyIpIiksci5kYXRhPXtjYXRlZ29yeToidG9vTWFueUFyZ3MiLGZuOm8saW5kZXg6ZS5sZW5ndGgsZXhwZWN0ZWRMZW5ndGg6Y30scjtjb25zdCBsPVtdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7Kyt0KWwucHVzaChoKGVbdF0pLmpvaW4oInwiKSk7cmV0dXJuIHI9bmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG9mIHR5cGUgIicrbC5qb2luKCIsICIpKyciIGRvIG5vdCBtYXRjaCBhbnkgb2YgdGhlIGRlZmluZWQgc2lnbmF0dXJlcyBvZiBmdW5jdGlvbiAnK28rIi4iKSxyLmRhdGE9e2NhdGVnb3J5OiJtaXNtYXRjaCIsYWN0dWFsOmx9LHJ9ZnVuY3Rpb24gQSh0KXtsZXQgZT1vLmxlbmd0aCsxO2ZvcihsZXQgbj0wO248dC50eXBlcy5sZW5ndGg7bisrKUUodC50eXBlc1tuXSkmJihlPU1hdGgubWluKGUsdC50eXBlc1tuXS50eXBlSW5kZXgpKTtyZXR1cm4gZX1mdW5jdGlvbiBOKHQpe2xldCBlPXMrMTtmb3IobGV0IG49MDtuPHQudHlwZXMubGVuZ3RoO24rKylFKHQudHlwZXNbbl0pfHwoZT1NYXRoLm1pbihlLHQudHlwZXNbbl0uY29udmVyc2lvbkluZGV4KSk7cmV0dXJuIGV9ZnVuY3Rpb24gSSh0LGUpe2lmKHQuaGFzQW55KXtpZighZS5oYXNBbnkpcmV0dXJuIDF9ZWxzZSBpZihlLmhhc0FueSlyZXR1cm4tMTtpZih0LnJlc3RQYXJhbSl7aWYoIWUucmVzdFBhcmFtKXJldHVybiAxfWVsc2UgaWYoZS5yZXN0UGFyYW0pcmV0dXJuLTE7aWYodC5oYXNDb252ZXJzaW9uKXtpZighZS5oYXNDb252ZXJzaW9uKXJldHVybiAxfWVsc2UgaWYoZS5oYXNDb252ZXJzaW9uKXJldHVybi0xO2NvbnN0IG49QSh0KS1BKGUpO2lmKG48MClyZXR1cm4tMTtpZihuPjApcmV0dXJuIDE7Y29uc3Qgcj1OKHQpLU4oZSk7cmV0dXJuIHI8MD8tMTpyPjA/MTowfWZ1bmN0aW9uIE0odCxlKXtjb25zdCBuPXQucGFyYW1zLHI9ZS5wYXJhbXMsaT1qKG4pLG89aihyKSxzPV8obiksYT1fKHIpO2lmKHMmJmkuaGFzQW55KXtpZighYXx8IW8uaGFzQW55KXJldHVybiAxfWVsc2UgaWYoYSYmby5oYXNBbnkpcmV0dXJuLTE7bGV0IHUsYz0wLGw9MDtmb3IodSBvZiBuKXUuaGFzQW55JiYrK2MsdS5oYXNDb252ZXJzaW9uJiYrK2w7bGV0IGg9MCxmPTA7Zm9yKHUgb2Ygcil1Lmhhc0FueSYmKytoLHUuaGFzQ29udmVyc2lvbiYmKytmO2lmKGMhPT1oKXJldHVybiBjLWg7aWYocyYmaS5oYXNDb252ZXJzaW9uKXtpZighYXx8IW8uaGFzQ29udmVyc2lvbilyZXR1cm4gMX1lbHNlIGlmKGEmJm8uaGFzQ29udmVyc2lvbilyZXR1cm4tMTtpZihsIT09ZilyZXR1cm4gbC1mO2lmKHMpe2lmKCFhKXJldHVybiAxfWVsc2UgaWYoYSlyZXR1cm4tMTtjb25zdCBwPShuLmxlbmd0aC1yLmxlbmd0aCkqKHM/LTE6MSk7aWYoMCE9PXApcmV0dXJuIHA7Y29uc3QgZD1bXTtsZXQgZyx5PTA7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDsrK3Qpe2NvbnN0IGU9SShuW3RdLHJbdF0pO2QucHVzaChlKSx5Kz1lfWlmKDAhPT15KXJldHVybiB5O2ZvcihnIG9mIGQpaWYoMCE9PWcpcmV0dXJuIGc7cmV0dXJuIDB9ZnVuY3Rpb24gRih0LGUpe2xldCBuPWU7aWYodC5zb21lKCh0PT50Lmhhc0NvbnZlcnNpb24pKSl7Y29uc3Qgcj1fKHQpLGk9dC5tYXAoVCk7bj1mdW5jdGlvbigpe2NvbnN0IHQ9W10sbj1yP2FyZ3VtZW50cy5sZW5ndGgtMTphcmd1bWVudHMubGVuZ3RoO2ZvcihsZXQgZT0wO2U8bjtlKyspdFtlXT1pW2VdKGFyZ3VtZW50c1tlXSk7cmV0dXJuIHImJih0W25dPWFyZ3VtZW50c1tuXS5tYXAoaVtuXSkpLGUuYXBwbHkodGhpcyx0KX19bGV0IHI9bjtpZihfKHQpKXtjb25zdCBlPXQubGVuZ3RoLTE7cj1mdW5jdGlvbigpe3JldHVybiBuLmFwcGx5KHRoaXMsVShhcmd1bWVudHMsMCxlKS5jb25jYXQoW1UoYXJndW1lbnRzLGUpXSkpfX1yZXR1cm4gcn1mdW5jdGlvbiBUKHQpe2xldCBlLG4scixpO2NvbnN0IG89W10scz1bXTtzd2l0Y2godC50eXBlcy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmNvbnZlcnNpb24mJihvLnB1c2godSh0LmNvbnZlcnNpb24uZnJvbSkudGVzdCkscy5wdXNoKHQuY29udmVyc2lvbi5jb252ZXJ0KSl9KSkscy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHR9O2Nhc2UgMTpyZXR1cm4gZT1vWzBdLHI9c1swXSxmdW5jdGlvbih0KXtyZXR1cm4gZSh0KT9yKHQpOnR9O2Nhc2UgMjpyZXR1cm4gZT1vWzBdLG49b1sxXSxyPXNbMF0saT1zWzFdLGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpP3IodCk6bih0KT9pKHQpOnR9O2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8cy5sZW5ndGg7ZSsrKWlmKG9bZV0odCkpcmV0dXJuIHNbZV0odCk7cmV0dXJuIHR9fX1mdW5jdGlvbiBPKHQpe3JldHVybiBmdW5jdGlvbiB0KGUsbixyKXtpZihuPGUubGVuZ3RoKXtjb25zdCBpPWVbbl07bGV0IG89W107aWYoaS5yZXN0UGFyYW0pe2NvbnN0IHQ9aS50eXBlcy5maWx0ZXIoRSk7dC5sZW5ndGg8aS50eXBlcy5sZW5ndGgmJm8ucHVzaCh7dHlwZXM6dCxuYW1lOiIuLi4iK3QubWFwKCh0PT50Lm5hbWUpKS5qb2luKCJ8IiksaGFzQW55OnQuc29tZSgodD0+dC5pc0FueSkpLGhhc0NvbnZlcnNpb246ITEscmVzdFBhcmFtOiEwfSksby5wdXNoKGkpfWVsc2Ugbz1pLnR5cGVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3R5cGVzOlt0XSxuYW1lOnQubmFtZSxoYXNBbnk6dC5pc0FueSxoYXNDb252ZXJzaW9uOnQuY29udmVyc2lvbixyZXN0UGFyYW06ITF9fSkpO3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLHQubWFwKGUpKX0obywoZnVuY3Rpb24oaSl7cmV0dXJuIHQoZSxuKzEsci5jb25jYXQoW2ldKSl9KSl9cmV0dXJuW3JdfSh0LDAsW10pfWZ1bmN0aW9uIEwodCxlKXtjb25zdCBuPU1hdGgubWF4KHQubGVuZ3RoLGUubGVuZ3RoKTtmb3IobGV0IHI9MDtyPG47cisrKXtjb25zdCBuPUQodCxyKSxpPUQoZSxyKTtsZXQgbyxzPSExO2ZvcihvIG9mIGkpaWYobi5oYXMobykpe3M9ITA7YnJlYWt9aWYoIXMpcmV0dXJuITF9Y29uc3Qgcj10Lmxlbmd0aCxpPWUubGVuZ3RoLG89Xyh0KSxzPV8oZSk7cmV0dXJuIG8/cz9yPT09aTppPj1yOnM/cj49aTpyPT09aX1mdW5jdGlvbiBQKHQsZSxuKXtjb25zdCByPVtdO2xldCBpO2ZvcihpIG9mIHQpe2xldCB0PW5baV07aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIGRlZmluaXRpb24gZm9yIHJlZmVyZW5jZWQgc2lnbmF0dXJlICInK2krJyInKTtpZih0PWVbdF0sImZ1bmN0aW9uIiE9dHlwZW9mIHQpcmV0dXJuITE7ci5wdXNoKHQpfXJldHVybiByfWZ1bmN0aW9uIFIodCxlLG4pe2NvbnN0IHI9ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKCh0PT5ZKHQpP1YodC5yZWZlclRvU2VsZi5jYWxsYmFjayk6Ryh0KT9xKHQucmVmZXJUby5yZWZlcmVuY2VzLHQucmVmZXJUby5jYWxsYmFjayk6dCkpfSh0KSxpPW5ldyBBcnJheShyLmxlbmd0aCkuZmlsbCghMSk7bGV0IG89ITA7Zm9yKDtvOyl7bz0hMTtsZXQgdD0hMDtmb3IobGV0IHM9MDtzPHIubGVuZ3RoOysrcyl7aWYoaVtzXSljb250aW51ZTtjb25zdCBhPXJbc107aWYoWShhKSlyW3NdPWEucmVmZXJUb1NlbGYuY2FsbGJhY2sobikscltzXS5yZWZlclRvU2VsZj1hLnJlZmVyVG9TZWxmLGlbc109ITAsdD0hMTtlbHNlIGlmKEcoYSkpe2NvbnN0IG49UChhLnJlZmVyVG8ucmVmZXJlbmNlcyxyLGUpO24/KHJbc109YS5yZWZlclRvLmNhbGxiYWNrLmFwcGx5KHRoaXMsbikscltzXS5yZWZlclRvPWEucmVmZXJUbyxpW3NdPSEwLHQ9ITEpOm89ITB9fWlmKHQmJm8pdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gcmVzb2x2aW5nIHR5cGVkLnJlZmVyVG8iKX1yZXR1cm4gcn1mdW5jdGlvbiBCKHQsZSl7aWYoYS5jcmVhdGVDb3VudCsrLDA9PT1PYmplY3Qua2V5cyhlKS5sZW5ndGgpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJObyBzaWduYXR1cmVzIHByb3ZpZGVkIik7YS53YXJuQWdhaW5zdERlcHJlY2F0ZWRUaGlzJiZmdW5jdGlvbih0KXtjb25zdCBlPS9cYnRoaXMoXCh8XC5zaWduYXR1cmVzXGIpLztPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChuPT57Y29uc3Qgcj10W25dO2lmKGUudGVzdChyLnRvU3RyaW5nKCkpKXRocm93IG5ldyBTeW50YXhFcnJvcigiVXNpbmcgYHRoaXNgIHRvIHNlbGYtcmVmZXJlbmNlIGEgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBzaW5jZSB0eXBlZC1mdW5jdGlvbkAzLiBVc2UgdHlwZWQucmVmZXJUbyBhbmQgdHlwZWQucmVmZXJUb1NlbGYgaW5zdGVhZC4iKX0pKX0oZSk7Y29uc3Qgbj1bXSxyPVtdLGk9e30sbz1bXTtsZXQgcztmb3IocyBpbiBlKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscykpY29udGludWU7Y29uc3QgdD12KHMpO2lmKCF0KWNvbnRpbnVlO24uZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoTChlLHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbmZsaWN0aW5nIHNpZ25hdHVyZXMgIicrZChlKSsnIiBhbmQgIicrZCh0KSsnIi4nKX0pKSxuLnB1c2godCk7Y29uc3QgYT1yLmxlbmd0aDtyLnB1c2goZVtzXSk7Y29uc3QgdT10Lm1hcCh5KTtsZXQgYztmb3IoYyBvZiBPKHUpKXtjb25zdCB0PWQoYyk7by5wdXNoKHtwYXJhbXM6YyxuYW1lOnQsZm46YX0pLGMuZXZlcnkoKHQ9PiF0Lmhhc0NvbnZlcnNpb24pKSYmKGlbdF09YSl9fW8uc29ydChNKTtjb25zdCB1PVIocixpLG90KTtsZXQgYztmb3IoYyBpbiBpKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLGMpJiYoaVtjXT11W2lbY11dKTtjb25zdCBsPVtdLGg9bmV3IE1hcDtmb3IoYyBvZiBvKWguaGFzKGMubmFtZSl8fChjLmZuPXVbYy5mbl0sbC5wdXNoKGMpLGguc2V0KGMubmFtZSxjKSk7Y29uc3QgZj1sWzBdJiZsWzBdLnBhcmFtcy5sZW5ndGg8PTImJiFfKGxbMF0ucGFyYW1zKSxwPWxbMV0mJmxbMV0ucGFyYW1zLmxlbmd0aDw9MiYmIV8obFsxXS5wYXJhbXMpLGc9bFsyXSYmbFsyXS5wYXJhbXMubGVuZ3RoPD0yJiYhXyhsWzJdLnBhcmFtcyksbT1sWzNdJiZsWzNdLnBhcmFtcy5sZW5ndGg8PTImJiFfKGxbM10ucGFyYW1zKSxiPWxbNF0mJmxbNF0ucGFyYW1zLmxlbmd0aDw9MiYmIV8obFs0XS5wYXJhbXMpLEQ9bFs1XSYmbFs1XS5wYXJhbXMubGVuZ3RoPD0yJiYhXyhsWzVdLnBhcmFtcyksRT1mJiZwJiZnJiZtJiZiJiZEO2ZvcihsZXQgdD0wO3Q8bC5sZW5ndGg7Kyt0KWxbdF0udGVzdD13KGxbdF0ucGFyYW1zKTtjb25zdCBDPWY/eChsWzBdLnBhcmFtc1swXSk6YnAsUz1wP3gobFsxXS5wYXJhbXNbMF0pOmJwLEE9Zz94KGxbMl0ucGFyYW1zWzBdKTpicCxOPW0/eChsWzNdLnBhcmFtc1swXSk6YnAsST1iP3gobFs0XS5wYXJhbXNbMF0pOmJwLFQ9RD94KGxbNV0ucGFyYW1zWzBdKTpicCxQPWY/eChsWzBdLnBhcmFtc1sxXSk6YnAsQj1wP3gobFsxXS5wYXJhbXNbMV0pOmJwLGs9Zz94KGxbMl0ucGFyYW1zWzFdKTpicCx6PW0/eChsWzNdLnBhcmFtc1sxXSk6YnAsaj1iP3gobFs0XS5wYXJhbXNbMV0pOmJwLFU9RD94KGxbNV0ucGFyYW1zWzFdKTpicDtmb3IobGV0IHQ9MDt0PGwubGVuZ3RoOysrdClsW3RdLmltcGxlbWVudGF0aW9uPUYobFt0XS5wYXJhbXMsbFt0XS5mbik7Y29uc3QgcT1mP2xbMF0uaW1wbGVtZW50YXRpb246RHAsVj1wP2xbMV0uaW1wbGVtZW50YXRpb246RHAsRz1nP2xbMl0uaW1wbGVtZW50YXRpb246RHAsWT1tP2xbM10uaW1wbGVtZW50YXRpb246RHAsWD1iP2xbNF0uaW1wbGVtZW50YXRpb246RHAsVz1EP2xbNV0uaW1wbGVtZW50YXRpb246RHAsSD1mP2xbMF0ucGFyYW1zLmxlbmd0aDotMSxaPXA/bFsxXS5wYXJhbXMubGVuZ3RoOi0xLEs9Zz9sWzJdLnBhcmFtcy5sZW5ndGg6LTEsSj1tP2xbM10ucGFyYW1zLmxlbmd0aDotMSxRPWI/bFs0XS5wYXJhbXMubGVuZ3RoOi0xLCQ9RD9sWzVdLnBhcmFtcy5sZW5ndGg6LTEsdHQ9RT82OjAsZXQ9bC5sZW5ndGgsbnQ9bC5tYXAoKHQ9PnQudGVzdCkpLHJ0PWwubWFwKCh0PT50LmltcGxlbWVudGF0aW9uKSksaXQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9dHQ7dDxldDt0KyspaWYobnRbdF0oYXJndW1lbnRzKSlyZXR1cm4gcnRbdF0uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBhLm9uTWlzbWF0Y2godCxhcmd1bWVudHMsbCl9O2Z1bmN0aW9uIG90KHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT1IJiZDKHQpJiZQKGUpP3EuYXBwbHkodGhpcyxhcmd1bWVudHMpOmFyZ3VtZW50cy5sZW5ndGg9PT1aJiZTKHQpJiZCKGUpP1YuYXBwbHkodGhpcyxhcmd1bWVudHMpOmFyZ3VtZW50cy5sZW5ndGg9PT1LJiZBKHQpJiZrKGUpP0cuYXBwbHkodGhpcyxhcmd1bWVudHMpOmFyZ3VtZW50cy5sZW5ndGg9PT1KJiZOKHQpJiZ6KGUpP1kuYXBwbHkodGhpcyxhcmd1bWVudHMpOmFyZ3VtZW50cy5sZW5ndGg9PT1RJiZJKHQpJiZqKGUpP1guYXBwbHkodGhpcyxhcmd1bWVudHMpOmFyZ3VtZW50cy5sZW5ndGg9PT0kJiZUKHQpJiZVKGUpP1cuYXBwbHkodGhpcyxhcmd1bWVudHMpOml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX10cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KG90LCJuYW1lIix7dmFsdWU6dH0pfWNhdGNoKHQpe31yZXR1cm4gb3Quc2lnbmF0dXJlcz1pLG90Ll90eXBlZEZ1bmN0aW9uRGF0YT17c2lnbmF0dXJlczpsLHNpZ25hdHVyZU1hcDpofSxvdH1mdW5jdGlvbiBrKHQsZSxuKXt0aHJvdyBTKHQsZSxuKX1mdW5jdGlvbiB6KHQpe3JldHVybiBVKHQsMCx0Lmxlbmd0aC0xKX1mdW5jdGlvbiBqKHQpe3JldHVybiB0W3QubGVuZ3RoLTFdfWZ1bmN0aW9uIFUodCxlLG4pe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LGUsbil9ZnVuY3Rpb24gcSh0LGUpe3JldHVybntyZWZlclRvOntyZWZlcmVuY2VzOnQsY2FsbGJhY2s6ZX19fWZ1bmN0aW9uIFYodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2FsbGJhY2sgZnVuY3Rpb24gZXhwZWN0ZWQgYXMgZmlyc3QgYXJndW1lbnQiKTtyZXR1cm57cmVmZXJUb1NlbGY6e2NhbGxiYWNrOnR9fX1mdW5jdGlvbiBHKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQucmVmZXJUbyYmQXJyYXkuaXNBcnJheSh0LnJlZmVyVG8ucmVmZXJlbmNlcykmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlZmVyVG8uY2FsbGJhY2t9ZnVuY3Rpb24gWSh0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0LnJlZmVyVG9TZWxmJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWZlclRvU2VsZi5jYWxsYmFja31mdW5jdGlvbiBYKHQsZSl7aWYoIXQpcmV0dXJuIGU7aWYoZSYmZSE9PXQpe2NvbnN0IG49bmV3IEVycm9yKCJGdW5jdGlvbiBuYW1lcyBkbyBub3QgbWF0Y2ggKGV4cGVjdGVkOiAiK3QrIiwgYWN0dWFsOiAiK2UrIikiKTt0aHJvdyBuLmRhdGE9e2FjdHVhbDplLGV4cGVjdGVkOnR9LG59cmV0dXJuIHR9ZnVuY3Rpb24gVyh0KXtsZXQgZTtmb3IoY29uc3QgbiBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZih0W25dKXx8InN0cmluZyI9PXR5cGVvZiB0W25dLnNpZ25hdHVyZSkmJihlPVgoZSx0W25dLm5hbWUpKTtyZXR1cm4gZX1mdW5jdGlvbiBIKHQsZSl7bGV0IG47Zm9yKG4gaW4gZSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSl7aWYobiBpbiB0JiZlW25dIT09dFtuXSl7Y29uc3Qgcj1uZXcgRXJyb3IoJ1NpZ25hdHVyZSAiJytuKyciIGlzIGRlZmluZWQgdHdpY2UnKTt0aHJvdyByLmRhdGE9e3NpZ25hdHVyZTpuLHNvdXJjZUZ1bmN0aW9uOmVbbl0sZGVzdEZ1bmN0aW9uOnRbbl19LHJ9dFtuXT1lW25dfX1sKCksYyhuKTtjb25zdCBaPWE7ZnVuY3Rpb24gSyh0KXtpZighdHx8InN0cmluZyIhPXR5cGVvZiB0LmZyb218fCJzdHJpbmciIT10eXBlb2YgdC50b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29udmVydCl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHtmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGNvbnZlcnQ6IGZ1bmN0aW9ufSBleHBlY3RlZCIpO2lmKHQudG89PT10LmZyb20pdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbGxlZ2FsIHRvIGRlZmluZSBjb252ZXJzaW9uIGZyb20gIicrdC5mcm9tKyciIHRvIGl0c2VsZi4nKX1yZXR1cm4gYT1mdW5jdGlvbih0KXtjb25zdCBuPSJzdHJpbmciPT10eXBlb2YgdDtsZXQgcj1uP3Q6IiI7Y29uc3QgaT17fTtmb3IobGV0IHQ9bj8xOjA7dDxhcmd1bWVudHMubGVuZ3RoOysrdCl7Y29uc3Qgbz1hcmd1bWVudHNbdF07bGV0IHMsYT17fTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbz8ocz1vLm5hbWUsInN0cmluZyI9PXR5cGVvZiBvLnNpZ25hdHVyZT9hW28uc2lnbmF0dXJlXT1vOmYobykmJihhPW8uc2lnbmF0dXJlcykpOmUobykmJihhPW8sbnx8KHM9VyhvKSkpLDA9PT1PYmplY3Qua2V5cyhhKS5sZW5ndGgpe2NvbnN0IGU9bmV3IFR5cGVFcnJvcigiQXJndW1lbnQgdG8gJ3R5cGVkJyBhdCBpbmRleCAiK3QrIiBpcyBub3QgYSAodHlwZWQpIGZ1bmN0aW9uLCBub3IgYW4gb2JqZWN0IHdpdGggc2lnbmF0dXJlcyBhcyBrZXlzIGFuZCBmdW5jdGlvbnMgYXMgdmFsdWVzLiIpO3Rocm93IGUuZGF0YT17aW5kZXg6dCxhcmd1bWVudDpvfSxlfW58fChyPVgocixzKSksSChpLGEpfXJldHVybiBCKHJ8fCIiLGkpfSxhLmNyZWF0ZT10LGEuY3JlYXRlQ291bnQ9Wi5jcmVhdGVDb3VudCxhLm9uTWlzbWF0Y2g9ayxhLnRocm93TWlzbWF0Y2hFcnJvcj1rLGEuY3JlYXRlRXJyb3I9UyxhLmNsZWFyPWwsYS5jbGVhckNvbnZlcnNpb25zPWZ1bmN0aW9uKCl7bGV0IHQ7Zm9yKHQgb2YgbylpLmdldCh0KS5jb252ZXJzaW9uc1RvPVtdO3M9MH0sYS5hZGRUeXBlcz1jLGEuX2ZpbmRUeXBlPXUsYS5yZWZlclRvPWZ1bmN0aW9uKCl7Y29uc3QgdD16KGFyZ3VtZW50cykubWFwKCh0PT5kKHYodCkpKSksZT1qKGFyZ3VtZW50cyk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2FsbGJhY2sgZnVuY3Rpb24gZXhwZWN0ZWQgYXMgbGFzdCBhcmd1bWVudCIpO3JldHVybiBxKHQsZSl9LGEucmVmZXJUb1NlbGY9VixhLmNvbnZlcnQ9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXUoZSk7aWYobi50ZXN0KHQpKXJldHVybiB0O2NvbnN0IHI9bi5jb252ZXJzaW9uc1RvO2lmKDA9PT1yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoZXJlIGFyZSBubyBjb252ZXJzaW9ucyB0byAiK2UrIiBkZWZpbmVkLiIpO2ZvcihsZXQgZT0wO2U8ci5sZW5ndGg7ZSsrKWlmKHUocltlXS5mcm9tKS50ZXN0KHQpKXJldHVybiByW2VdLmNvbnZlcnQodCk7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29udmVydCAiK3QrIiB0byAiK2UpfSxhLmZpbmRTaWduYXR1cmU9cCxhLmZpbmQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBwKHQsZSxuKS5pbXBsZW1lbnRhdGlvbn0sYS5pc1R5cGVkRnVuY3Rpb249ZixhLndhcm5BZ2FpbnN0RGVwcmVjYXRlZFRoaXM9ITAsYS5hZGRUeXBlPWZ1bmN0aW9uKHQsZSl7bGV0IG49ImFueSI7ITEhPT1lJiZpLmhhcygiT2JqZWN0IikmJihuPSJPYmplY3QiKSxhLmFkZFR5cGVzKFt0XSxuKX0sYS5hZGRDb252ZXJzaW9uPWZ1bmN0aW9uKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7b3ZlcnJpZGU6ITF9O0sodCk7Y29uc3Qgbj11KHQudG8pLHI9bi5jb252ZXJzaW9uc1RvLmZpbmQoKGU9PmUuZnJvbT09PXQuZnJvbSkpO2lmKHIpe2lmKCFlfHwhZS5vdmVycmlkZSl0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIGFscmVhZHkgYSBjb252ZXJzaW9uIGZyb20gIicrdC5mcm9tKyciIHRvICInK24ubmFtZSsnIicpO2EucmVtb3ZlQ29udmVyc2lvbih7ZnJvbTpyLmZyb20sdG86dC50byxjb252ZXJ0OnIuY29udmVydH0pfW4uY29udmVyc2lvbnNUby5wdXNoKHtmcm9tOnQuZnJvbSxjb252ZXJ0OnQuY29udmVydCxpbmRleDpzKyt9KX0sYS5hZGRDb252ZXJzaW9ucz1mdW5jdGlvbih0LGUpe3QuZm9yRWFjaCgodD0+YS5hZGRDb252ZXJzaW9uKHQsZSkpKX0sYS5yZW1vdmVDb252ZXJzaW9uPWZ1bmN0aW9uKHQpe0sodCk7Y29uc3QgZT11KHQudG8pLG49ZnVuY3Rpb24odCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZihlKHRbbl0pKXJldHVybiB0W25dfShlLmNvbnZlcnNpb25zVG8sKGU9PmUuZnJvbT09PXQuZnJvbSkpO2lmKCFuKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdCB0byByZW1vdmUgbm9uZXhpc3RlbnQgY29udmVyc2lvbiBmcm9tICIrdC5mcm9tKyIgdG8gIit0LnRvKTtpZihuLmNvbnZlcnQhPT10LmNvbnZlcnQpdGhyb3cgbmV3IEVycm9yKCJDb252ZXJzaW9uIHRvIHJlbW92ZSBkb2VzIG5vdCBtYXRjaCBleGlzdGluZyBjb252ZXJzaW9uIik7Y29uc3Qgcj1lLmNvbnZlcnNpb25zVG8uaW5kZXhPZihuKTtlLmNvbnZlcnNpb25zVG8uc3BsaWNlKHIsMSl9LGEucmVzb2x2ZT1mdW5jdGlvbih0LGUpe2lmKCFmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoRXApO2NvbnN0IG49dC5fdHlwZWRGdW5jdGlvbkRhdGEuc2lnbmF0dXJlcztmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoOysrdClpZihuW3RdLnRlc3QoZSkpcmV0dXJuIG5bdF07cmV0dXJuIG51bGx9LGF9KCk7ZnVuY3Rpb24gU3AodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdHx8ISFpc0Zpbml0ZSh0KSYmdD09PU1hdGgucm91bmQodCl9ZnVuY3Rpb24gQXAodCxlLG4pe3ZhciByPXsyOiIwYiIsODoiMG8iLDE2OiIweCJ9W2VdLGk9IiI7aWYobil7aWYobjwxKXRocm93IG5ldyBFcnJvcigic2l6ZSBtdXN0IGJlIGluIGdyZWF0ZXIgdGhhbiAwIik7aWYoIVNwKG4pKXRocm93IG5ldyBFcnJvcigic2l6ZSBtdXN0IGJlIGFuIGludGVnZXIiKTtpZih0PlBmKDIsbi0xKS0xfHx0PC1QZigyLG4tMSkpdGhyb3cgbmV3IEVycm9yKCJWYWx1ZSBtdXN0IGJlIGluIHJhbmdlIFstMl4iLmNvbmNhdChuLTEsIiwgMl4iKS5jb25jYXQobi0xLCItMV0iKSk7aWYoIVNwKHQpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyIik7dDwwJiYodCs9UGYoMixuKSksaT0iaSIuY29uY2F0KG4pfXZhciBvPSIiO3JldHVybiB0PDAmJih0PS10LG89Ii0iKSwiIi5jb25jYXQobykuY29uY2F0KHIpLmNvbmNhdCh0LnRvU3RyaW5nKGUpKS5jb25jYXQoaSl9ZnVuY3Rpb24gTnAodCxlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSlyZXR1cm4gZSh0KTtpZih0PT09MS8wKXJldHVybiJJbmZpbml0eSI7aWYodD09PS0xLzApcmV0dXJuIi1JbmZpbml0eSI7aWYoaXNOYU4odCkpcmV0dXJuIk5hTiI7dmFyIG4scixpPSJhdXRvIjtpZihlJiYoZS5ub3RhdGlvbiYmKGk9ZS5ub3RhdGlvbiksTWYoZSk/bj1lOk1mKGUucHJlY2lzaW9uKSYmKG49ZS5wcmVjaXNpb24pLGUud29yZFNpemUmJiJudW1iZXIiIT10eXBlb2Yocj1lLndvcmRTaXplKSkpdGhyb3cgbmV3IEVycm9yKCdPcHRpb24gIndvcmRTaXplIiBtdXN0IGJlIGEgbnVtYmVyJyk7c3dpdGNoKGkpe2Nhc2UiZml4ZWQiOnJldHVybiBmdW5jdGlvbih0LGUpe2lmKGlzTmFOKHQpfHwhaXNGaW5pdGUodCkpcmV0dXJuIFN0cmluZyh0KTt2YXIgbj1JcCh0KSxyPSJudW1iZXIiPT10eXBlb2YgZT9GcChuLG4uZXhwb25lbnQrMStlKTpuLGk9ci5jb2VmZmljaWVudHMsbz1yLmV4cG9uZW50KzEscz1vKyhlfHwwKTtyZXR1cm4gaS5sZW5ndGg8cyYmKGk9aS5jb25jYXQoVHAocy1pLmxlbmd0aCkpKSxvPDAmJihpPVRwKDEtbykuY29uY2F0KGkpLG89MSksbzxpLmxlbmd0aCYmaS5zcGxpY2UobywwLDA9PT1vPyIwLiI6Ii4iKSxyLnNpZ24raS5qb2luKCIiKX0odCxuKTtjYXNlImV4cG9uZW50aWFsIjpyZXR1cm4gTXAodCxuKTtjYXNlImVuZ2luZWVyaW5nIjpyZXR1cm4gZnVuY3Rpb24odCxlKXtpZihpc05hTih0KXx8IWlzRmluaXRlKHQpKXJldHVybiBTdHJpbmcodCk7dmFyIG49SXAodCkscj1GcChuLGUpLGk9ci5leHBvbmVudCxvPXIuY29lZmZpY2llbnRzLHM9aSUzPT0wP2k6aTwwP2ktMy1pJTM6aS1pJTM7aWYoTWYoZSkpZm9yKDtlPm8ubGVuZ3RofHxpLXMrMT5vLmxlbmd0aDspby5wdXNoKDApO2Vsc2UgZm9yKHZhciBhPU1hdGguYWJzKGktcyktKG8ubGVuZ3RoLTEpLHU9MDt1PGE7dSsrKW8ucHVzaCgwKTtmb3IodmFyIGM9TWF0aC5hYnMoaS1zKSxsPTE7Yz4wOylsKyssYy0tO3ZhciBoPW8uc2xpY2UobCkuam9pbigiIiksZj1NZihlKSYmaC5sZW5ndGh8fGgubWF0Y2goL1sxLTldLyk/Ii4iK2g6IiIscD1vLnNsaWNlKDAsbCkuam9pbigiIikrZisiZSIrKGk+PTA/IisiOiIiKStzLnRvU3RyaW5nKCk7cmV0dXJuIHIuc2lnbitwfSh0LG4pO2Nhc2UiYmluIjpyZXR1cm4gQXAodCwyLHIpO2Nhc2Uib2N0IjpyZXR1cm4gQXAodCw4LHIpO2Nhc2UiaGV4IjpyZXR1cm4gQXAodCwxNixyKTtjYXNlImF1dG8iOnJldHVybiBmdW5jdGlvbih0LGUsbil7aWYoaXNOYU4odCl8fCFpc0Zpbml0ZSh0KSlyZXR1cm4gU3RyaW5nKHQpO3ZhciByPW4mJnZvaWQgMCE9PW4ubG93ZXJFeHA/bi5sb3dlckV4cDotMyxpPW4mJnZvaWQgMCE9PW4udXBwZXJFeHA/bi51cHBlckV4cDo1LG89SXAodCkscz1lP0ZwKG8sZSk6bztpZihzLmV4cG9uZW50PHJ8fHMuZXhwb25lbnQ+PWkpcmV0dXJuIE1wKHQsZSk7dmFyIGE9cy5jb2VmZmljaWVudHMsdT1zLmV4cG9uZW50O2EubGVuZ3RoPGUmJihhPWEuY29uY2F0KFRwKGUtYS5sZW5ndGgpKSksYT1hLmNvbmNhdChUcCh1LWEubGVuZ3RoKzErKGEubGVuZ3RoPGU/ZS1hLmxlbmd0aDowKSkpLGE9VHAoLXUpLmNvbmNhdChhKTt2YXIgYz11PjA/dTowO3JldHVybiBjPGEubGVuZ3RoLTEmJmEuc3BsaWNlKGMrMSwwLCIuIikscy5zaWduK2Euam9pbigiIil9KHQsbixlJiZlKS5yZXBsYWNlKC8oKFwuXGQqPykoMCspKSgkfGUpLywoZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMl0sZT1hcmd1bWVudHNbNF07cmV0dXJuIi4iIT09dD90K2U6ZX0pKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcignVW5rbm93biBub3RhdGlvbiAiJytpKyciLiBDaG9vc2UgImF1dG8iLCAiZXhwb25lbnRpYWwiLCAiZml4ZWQiLCAiYmluIiwgIm9jdCIsIG9yICJoZXguJyl9fWZ1bmN0aW9uIElwKHQpe3ZhciBlPVN0cmluZyh0KS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9eKC0/KShcZCtcLj9cZCopKGUoWystXT9cZCspKT8kLyk7aWYoIWUpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJJbnZhbGlkIG51bWJlciAiK3QpO3ZhciBuPWVbMV0scj1lWzJdLGk9cGFyc2VGbG9hdChlWzRdfHwiMCIpLG89ci5pbmRleE9mKCIuIik7aSs9LTEhPT1vP28tMTpyLmxlbmd0aC0xO3ZhciBzPXIucmVwbGFjZSgiLiIsIiIpLnJlcGxhY2UoL14wKi8sKGZ1bmN0aW9uKHQpe3JldHVybiBpLT10Lmxlbmd0aCwiIn0pKS5yZXBsYWNlKC8wKiQvLCIiKS5zcGxpdCgiIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VJbnQodCl9KSk7cmV0dXJuIDA9PT1zLmxlbmd0aCYmKHMucHVzaCgwKSxpKyspLHtzaWduOm4sY29lZmZpY2llbnRzOnMsZXhwb25lbnQ6aX19ZnVuY3Rpb24gTXAodCxlKXtpZihpc05hTih0KXx8IWlzRmluaXRlKHQpKXJldHVybiBTdHJpbmcodCk7dmFyIG49SXAodCkscj1lP0ZwKG4sZSk6bixpPXIuY29lZmZpY2llbnRzLG89ci5leHBvbmVudDtpLmxlbmd0aDxlJiYoaT1pLmNvbmNhdChUcChlLWkubGVuZ3RoKSkpO3ZhciBzPWkuc2hpZnQoKTtyZXR1cm4gci5zaWduK3MrKGkubGVuZ3RoPjA/Ii4iK2kuam9pbigiIik6IiIpKyJlIisobz49MD8iKyI6IiIpK299ZnVuY3Rpb24gRnAodCxlKXtmb3IodmFyIG49e3NpZ246dC5zaWduLGNvZWZmaWNpZW50czp0LmNvZWZmaWNpZW50cyxleHBvbmVudDp0LmV4cG9uZW50fSxyPW4uY29lZmZpY2llbnRzO2U8PTA7KXIudW5zaGlmdCgwKSxuLmV4cG9uZW50KyssZSsrO2lmKHIubGVuZ3RoPmUmJnIuc3BsaWNlKGUsci5sZW5ndGgtZSlbMF0+PTUpe3ZhciBpPWUtMTtmb3IocltpXSsrOzEwPT09cltpXTspci5wb3AoKSwwPT09aSYmKHIudW5zaGlmdCgwKSxuLmV4cG9uZW50KyssaSsrKSxyWy0taV0rK31yZXR1cm4gbn1mdW5jdGlvbiBUcCh0KXtmb3IodmFyIGU9W10sbj0wO248dDtuKyspZS5wdXNoKDApO3JldHVybiBlfXZhciBPcD1OdW1iZXIuRVBTSUxPTnx8MjIyMDQ0NjA0OTI1MDMxM2UtMzE7ZnVuY3Rpb24gTHAodCxlLG4pe2lmKG51bGw9PW4pcmV0dXJuIHQ9PT1lO2lmKHQ9PT1lKXJldHVybiEwO2lmKGlzTmFOKHQpfHxpc05hTihlKSlyZXR1cm4hMTtpZihpc0Zpbml0ZSh0KSYmaXNGaW5pdGUoZSkpe3ZhciByPU1hdGguYWJzKHQtZSk7cmV0dXJuIHI8T3B8fHI8PU1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKSpufXJldHVybiExfWZ1bmN0aW9uIFBwKHQsZSxuKXt2YXIgcj1uZXcoMCx0LmNvbnN0cnVjdG9yKSgyKSxpPSIiO2lmKG4pe2lmKG48MSl0aHJvdyBuZXcgRXJyb3IoInNpemUgbXVzdCBiZSBpbiBncmVhdGVyIHRoYW4gMCIpO2lmKCFTcChuKSl0aHJvdyBuZXcgRXJyb3IoInNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYodC5ncmVhdGVyVGhhbihyLnBvdyhuLTEpLnN1YigxKSl8fHQubGVzc1RoYW4oci5wb3cobi0xKS5tdWwoLTEpKSl0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIG11c3QgYmUgaW4gcmFuZ2UgWy0yXiIuY29uY2F0KG4tMSwiLCAyXiIpLmNvbmNhdChuLTEsIi0xXSIpKTtpZighdC5pc0ludGVnZXIoKSl0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciIpO3QubGVzc1RoYW4oMCkmJih0PXQuYWRkKHIucG93KG4pKSksaT0iaSIuY29uY2F0KG4pfXN3aXRjaChlKXtjYXNlIDI6cmV0dXJuIiIuY29uY2F0KHQudG9CaW5hcnkoKSkuY29uY2F0KGkpO2Nhc2UgODpyZXR1cm4iIi5jb25jYXQodC50b09jdGFsKCkpLmNvbmNhdChpKTtjYXNlIDE2OnJldHVybiIiLmNvbmNhdCh0LnRvSGV4YWRlY2ltYWwoKSkuY29uY2F0KGkpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJCYXNlICIuY29uY2F0KGUsIiBub3Qgc3VwcG9ydGVkICIpKX19ZnVuY3Rpb24gUnAodCxlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSlyZXR1cm4gZSh0KTtpZighdC5pc0Zpbml0ZSgpKXJldHVybiB0LmlzTmFOKCk/Ik5hTiI6dC5ndCgwKT8iSW5maW5pdHkiOiItSW5maW5pdHkiO3ZhciBuLHIsaT0iYXV0byI7aWYodm9pZCAwIT09ZSYmKGUubm90YXRpb24mJihpPWUubm90YXRpb24pLCJudW1iZXIiPT10eXBlb2YgZT9uPWU6dm9pZCAwIT09ZS5wcmVjaXNpb24mJihuPWUucHJlY2lzaW9uKSxlLndvcmRTaXplJiYibnVtYmVyIiE9dHlwZW9mKHI9ZS53b3JkU2l6ZSkpKXRocm93IG5ldyBFcnJvcignT3B0aW9uICJ3b3JkU2l6ZSIgbXVzdCBiZSBhIG51bWJlcicpO3N3aXRjaChpKXtjYXNlImZpeGVkIjpyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0ZpeGVkKGUpfSh0LG4pO2Nhc2UiZXhwb25lbnRpYWwiOnJldHVybiBCcCh0LG4pO2Nhc2UiZW5naW5lZXJpbmciOnJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPXQuZSxyPW4lMz09MD9uOm48MD9uLTMtbiUzOm4tbiUzLGk9dC5tdWwoTWF0aC5wb3coMTAsLXIpKSxvPWkudG9QcmVjaXNpb24oZSk7aWYoLTEhPT1vLmluZGV4T2YoImUiKSl7bz1uZXcoMCx0LmNvbnN0cnVjdG9yKShvKS50b0ZpeGVkKCl9cmV0dXJuIG8rImUiKyhuPj0wPyIrIjoiIikrci50b1N0cmluZygpfSh0LG4pO2Nhc2UiYmluIjpyZXR1cm4gUHAodCwyLHIpO2Nhc2Uib2N0IjpyZXR1cm4gUHAodCw4LHIpO2Nhc2UiaGV4IjpyZXR1cm4gUHAodCwxNixyKTtjYXNlImF1dG8iOnZhciBvPWUmJnZvaWQgMCE9PWUubG93ZXJFeHA/ZS5sb3dlckV4cDotMyxzPWUmJnZvaWQgMCE9PWUudXBwZXJFeHA/ZS51cHBlckV4cDo1O2lmKHQuaXNaZXJvKCkpcmV0dXJuIjAiO3ZhciBhPXQudG9TaWduaWZpY2FudERpZ2l0cyhuKSx1PWEuZTtyZXR1cm4odT49byYmdTxzP2EudG9GaXhlZCgpOkJwKHQsbikpLnJlcGxhY2UoLygoXC5cZCo/KSgwKykpKCR8ZSkvLChmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50c1syXSxlPWFyZ3VtZW50c1s0XTtyZXR1cm4iLiIhPT10P3QrZTplfSkpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG5vdGF0aW9uICInK2krJyIuIENob29zZSAiYXV0byIsICJleHBvbmVudGlhbCIsICJmaXhlZCIsICJiaW4iLCAib2N0Iiwgb3IgImhleC4nKX19ZnVuY3Rpb24gQnAodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT90LnRvRXhwb25lbnRpYWwoZS0xKTp0LnRvRXhwb25lbnRpYWwoKX1mdW5jdGlvbiBrcCh0LGUpe3ZhciBuPWZ1bmN0aW9uKHQsZSl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiBOcCh0LGUpO2lmKEZmKHQpKXJldHVybiBScCh0LGUpO2lmKGZ1bmN0aW9uKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJiJudW1iZXIiPT10eXBlb2YgdC5zJiYibnVtYmVyIj09dHlwZW9mIHQubiYmIm51bWJlciI9PXR5cGVvZiB0LmR8fCExfSh0KSlyZXR1cm4gZSYmImRlY2ltYWwiPT09ZS5mcmFjdGlvbj90LnRvU3RyaW5nKCk6dC5zKnQubisiLyIrdC5kO2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHpwKHQsZSk7aWYoUmYodCkpcmV0dXJuJyInK3QrJyInO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiB0LnN5bnRheD9TdHJpbmcodC5zeW50YXgpOiJmdW5jdGlvbiI7aWYodCYmIm9iamVjdCI9PXR5cGVvZiB0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5mb3JtYXQ/dC5mb3JtYXQoZSk6dCYmdC50b1N0cmluZyhlKSE9PXt9LnRvU3RyaW5nKCk/dC50b1N0cmluZyhlKToieyIrT2JqZWN0LmtleXModCkubWFwKChuPT4nIicrbisnIjogJytrcCh0W25dLGUpKSkuam9pbigiLCAiKSsifSJ9cmV0dXJuIFN0cmluZyh0KX0odCxlKTtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYidHJ1bmNhdGUiaW4gZSYmbi5sZW5ndGg+ZS50cnVuY2F0ZT9uLnN1YnN0cmluZygwLGUudHJ1bmNhdGUtMykrIi4uLiI6bn1mdW5jdGlvbiB6cCh0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgbj0iWyIscj10Lmxlbmd0aCxpPTA7aTxyO2krKykwIT09aSYmKG4rPSIsICIpLG4rPXpwKHRbaV0sZSk7cmV0dXJuIG4rPSJdIn1yZXR1cm4ga3AodCxlKX1mdW5jdGlvbiBqcCh0LGUsbil7aWYoISh0aGlzIGluc3RhbmNlb2YganApKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7dGhpcy5hY3R1YWw9dCx0aGlzLmV4cGVjdGVkPWUsdGhpcy5yZWxhdGlvbj1uLHRoaXMubWVzc2FnZT0iRGltZW5zaW9uIG1pc21hdGNoICgiKyhBcnJheS5pc0FycmF5KHQpPyJbIit0LmpvaW4oIiwgIikrIl0iOnQpKyIgIisodGhpcy5yZWxhdGlvbnx8IiE9IikrIiAiKyhBcnJheS5pc0FycmF5KGUpPyJbIitlLmpvaW4oIiwgIikrIl0iOmUpKyIpIix0aGlzLnN0YWNrPShuZXcgRXJyb3IpLnN0YWNrfWZ1bmN0aW9uIFVwKHQsZSxuKXtpZighKHRoaXMgaW5zdGFuY2VvZiBVcCkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKTt0aGlzLmluZGV4PXQsYXJndW1lbnRzLmxlbmd0aDwzPyh0aGlzLm1pbj0wLHRoaXMubWF4PWUpOih0aGlzLm1pbj1lLHRoaXMubWF4PW4pLHZvaWQgMCE9PXRoaXMubWluJiZ0aGlzLmluZGV4PHRoaXMubWluP3RoaXMubWVzc2FnZT0iSW5kZXggb3V0IG9mIHJhbmdlICgiK3RoaXMuaW5kZXgrIiA8ICIrdGhpcy5taW4rIikiOnZvaWQgMCE9PXRoaXMubWF4JiZ0aGlzLmluZGV4Pj10aGlzLm1heD90aGlzLm1lc3NhZ2U9IkluZGV4IG91dCBvZiByYW5nZSAoIit0aGlzLmluZGV4KyIgPiAiKyh0aGlzLm1heC0xKSsiKSI6dGhpcy5tZXNzYWdlPSJJbmRleCBvdXQgb2YgcmFuZ2UgKCIrdGhpcy5pbmRleCsiKSIsdGhpcy5zdGFjaz0obmV3IEVycm9yKS5zdGFja31mdW5jdGlvbiBxcCh0KXtmb3IodmFyIGU9W107QXJyYXkuaXNBcnJheSh0KTspZS5wdXNoKHQubGVuZ3RoKSx0PXRbMF07cmV0dXJuIGV9ZnVuY3Rpb24gVnAodCxlLG4pe3ZhciByLGk9dC5sZW5ndGg7aWYoaSE9PWVbbl0pdGhyb3cgbmV3IGpwKGksZVtuXSk7aWYobjxlLmxlbmd0aC0xKXt2YXIgbz1uKzE7Zm9yKHI9MDtyPGk7cisrKXt2YXIgcz10W3JdO2lmKCFBcnJheS5pc0FycmF5KHMpKXRocm93IG5ldyBqcChlLmxlbmd0aC0xLGUubGVuZ3RoLCI8Iik7VnAodFtyXSxlLG8pfX1lbHNlIGZvcihyPTA7cjxpO3IrKylpZihBcnJheS5pc0FycmF5KHRbcl0pKXRocm93IG5ldyBqcChlLmxlbmd0aCsxLGUubGVuZ3RoLCI+Iil9ZnVuY3Rpb24gR3AodCxlKXtpZigwPT09ZS5sZW5ndGgpe2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IGpwKHQubGVuZ3RoLDApfWVsc2UgVnAodCxlLDApfWZ1bmN0aW9uIFlwKHQsZSl7aWYoIU1mKHQpfHwhU3AodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyICh2YWx1ZTogIit0KyIpIik7aWYodDwwfHwibnVtYmVyIj09dHlwZW9mIGUmJnQ+PWUpdGhyb3cgbmV3IFVwKHQsZSl9ZnVuY3Rpb24gWHAodCxlLG4pe2lmKCFBcnJheS5pc0FycmF5KHQpfHwhQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCIpO2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlJlc2l6aW5nIHRvIHNjYWxhciBpcyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIU1mKHQpfHwhU3AodCl8fHQ8MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIHNpemUsIG11c3QgY29udGFpbiBwb3NpdGl2ZSBpbnRlZ2VycyAoc2l6ZTogIitrcChlKSsiKSIpfSkpLFdwKHQsZSwwLHZvaWQgMCE9PW4/bjowKSx0fWZ1bmN0aW9uIFdwKHQsZSxuLHIpe3ZhciBpLG8scz10Lmxlbmd0aCxhPWVbbl0sdT1NYXRoLm1pbihzLGEpO2lmKHQubGVuZ3RoPWEsbjxlLmxlbmd0aC0xKXt2YXIgYz1uKzE7Zm9yKGk9MDtpPHU7aSsrKW89dFtpXSxBcnJheS5pc0FycmF5KG8pfHwobz1bb10sdFtpXT1vKSxXcChvLGUsYyxyKTtmb3IoaT11O2k8YTtpKyspbz1bXSx0W2ldPW8sV3AobyxlLGMscil9ZWxzZXtmb3IoaT0wO2k8dTtpKyspZm9yKDtBcnJheS5pc0FycmF5KHRbaV0pOyl0W2ldPXRbaV1bMF07Zm9yKGk9dTtpPGE7aSsrKXRbaV09cn19ZnVuY3Rpb24gSHAodCxlKXt2YXIgbj1mdW5jdGlvbih0KXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdDt2YXIgZT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbiB0KG4pe0FycmF5LmlzQXJyYXkobik/bi5mb3JFYWNoKHQpOmUucHVzaChuKX0pKSxlfSh0KSxyPW4ubGVuZ3RoO2lmKCFBcnJheS5pc0FycmF5KHQpfHwhQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCIpO2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcganAoMCxyLCIhPSIpO3ZhciBpPUtwKGU9WnAoZSxyKSk7aWYociE9PWkpdGhyb3cgbmV3IGpwKGksciwiIT0iKTt0cnl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHI9dCxpPWUubGVuZ3RoLTE7aT4wO2ktLSl7dmFyIG89ZVtpXTtuPVtdO2Zvcih2YXIgcz1yLmxlbmd0aC9vLGE9MDthPHM7YSsrKW4ucHVzaChyLnNsaWNlKGEqbywoYSsxKSpvKSk7cj1ufXJldHVybiByfShuLGUpfWNhdGNoKHQpe3Rocm93IHQgaW5zdGFuY2VvZiBqcD9uZXcganAoaSxyLCIhPSIpOnR9fWZ1bmN0aW9uIFpwKHQsZSl7dmFyIG49S3AodCkscj10LnNsaWNlKCksaT10LmluZGV4T2YoLTEpO2lmKHQuaW5kZXhPZigtMSxpKzEpPj0wKXRocm93IG5ldyBFcnJvcigiTW9yZSB0aGFuIG9uZSB3aWxkY2FyZCBpbiBzaXplcyIpO2lmKGk+PTApe2lmKCEoZSVuPT0wKSl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCByZXBsYWNlIHdpbGRjYXJkLCBzaW5jZSAiK2UrIiBpcyBubyBtdWx0aXBsZSBvZiAiKy1uKTtyW2ldPS1lL259cmV0dXJuIHJ9ZnVuY3Rpb24gS3AodCl7cmV0dXJuIHQucmVkdWNlKCgodCxlKT0+dCplKSwxKX1mdW5jdGlvbiBKcCh0LGUsbixyKXt2YXIgaT1yfHxxcCh0KTtpZihuKWZvcih2YXIgbz0wO288bjtvKyspdD1bdF0saS51bnNoaWZ0KDEpO2Zvcih0PVFwKHQsZSwwKTtpLmxlbmd0aDxlOylpLnB1c2goMSk7cmV0dXJuIHR9ZnVuY3Rpb24gUXAodCxlLG4pe3ZhciByLGk7aWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIG89bisxO2ZvcihyPTAsaT10Lmxlbmd0aDtyPGk7cisrKXRbcl09UXAodFtyXSxlLG8pfWVsc2UgZm9yKHZhciBzPW47czxlO3MrKyl0PVt0XTtyZXR1cm4gdH1mdW5jdGlvbiAkcCh0LGUpe2Zvcih2YXIgbixyPTAsaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbz10W2ldLHM9QXJyYXkuaXNBcnJheShvKTtpZigwPT09aSYmcyYmKHI9by5sZW5ndGgpLHMmJm8ubGVuZ3RoIT09cilyZXR1cm47dmFyIGE9cz8kcChvLGUpOmUobyk7aWYodm9pZCAwPT09biluPWE7ZWxzZSBpZihuIT09YSlyZXR1cm4ibWl4ZWQifXJldHVybiBufWZ1bmN0aW9uIHRkKHQsZSxuLHIpe2Z1bmN0aW9uIGkocil7dmFyIGk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49e30scj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdLG89dFtpXTt2b2lkIDAhPT1vJiYobltpXT1vKX1yZXR1cm4gbn0ocixlLm1hcChlZCkpO3JldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5maWx0ZXIoKHQ9PiFmdW5jdGlvbih0KXtyZXR1cm4gdCYmIj8iPT09dFswXX0odCkpKS5ldmVyeSgodD0+dm9pZCAwIT09blt0XSkpO2lmKCFyKXt2YXIgaT1lLmZpbHRlcigodD0+dm9pZCAwPT09blt0XSkpO3Rocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBmdW5jdGlvbiAiJy5jb25jYXQodCwnIiwgJykrInNvbWUgZGVwZW5kZW5jaWVzIGFyZSBtaXNzaW5nOiAiLmNvbmNhdChpLm1hcCgodD0+JyInLmNvbmNhdCh0LCciJykpKS5qb2luKCIsICIpLCIuIikpfX0odCxlLHIpLG4oaSl9cmV0dXJuIGkuaXNGYWN0b3J5PSEwLGkuZm49dCxpLmRlcGVuZGVuY2llcz1lLnNsaWNlKCkuc29ydCgpLHImJihpLm1ldGE9ciksaX1mdW5jdGlvbiBlZCh0KXtyZXR1cm4gdCYmIj8iPT09dFswXT90LnNsaWNlKDEpOnR9ZnVuY3Rpb24gbmQodCxlKXtpZihvZCh0KSYmaWQodCxlKSlyZXR1cm4gdFtlXTt0aHJvdyJmdW5jdGlvbiI9PXR5cGVvZiB0W2VdJiZmdW5jdGlvbih0LGUpe3JldHVybiEobnVsbD09dHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbZV18fF9wKHQsZSkmJk9iamVjdC5nZXRQcm90b3R5cGVPZiYmZSBpbiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpJiYoISFfcChhZCxlKXx8IShlIGluIE9iamVjdC5wcm90b3R5cGV8fGUgaW4gRnVuY3Rpb24ucHJvdG90eXBlKSl9KHQsZSk/bmV3IEVycm9yKCdDYW5ub3QgYWNjZXNzIG1ldGhvZCAiJytlKyciIGFzIGEgcHJvcGVydHknKTpuZXcgRXJyb3IoJ05vIGFjY2VzcyB0byBwcm9wZXJ0eSAiJytlKyciJyl9ZnVuY3Rpb24gcmQodCxlLG4pe2lmKG9kKHQpJiZpZCh0LGUpKXJldHVybiB0W2VdPW4sbjt0aHJvdyBuZXcgRXJyb3IoJ05vIGFjY2VzcyB0byBwcm9wZXJ0eSAiJytlKyciJyl9ZnVuY3Rpb24gaWQodCxlKXtyZXR1cm4hKCF0fHwib2JqZWN0IiE9dHlwZW9mIHQpJiYoISFfcChzZCxlKXx8IShlIGluIE9iamVjdC5wcm90b3R5cGV8fGUgaW4gRnVuY3Rpb24ucHJvdG90eXBlKSl9ZnVuY3Rpb24gb2QodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZ0JiZ0LmNvbnN0cnVjdG9yPT09T2JqZWN0fWpwLnByb3RvdHlwZT1uZXcgUmFuZ2VFcnJvcixqcC5wcm90b3R5cGUuY29uc3RydWN0b3I9UmFuZ2VFcnJvcixqcC5wcm90b3R5cGUubmFtZT0iRGltZW5zaW9uRXJyb3IiLGpwLnByb3RvdHlwZS5pc0RpbWVuc2lvbkVycm9yPSEwLFVwLnByb3RvdHlwZT1uZXcgUmFuZ2VFcnJvcixVcC5wcm90b3R5cGUuY29uc3RydWN0b3I9UmFuZ2VFcnJvcixVcC5wcm90b3R5cGUubmFtZT0iSW5kZXhFcnJvciIsVXAucHJvdG90eXBlLmlzSW5kZXhFcnJvcj0hMDt2YXIgc2Q9e2xlbmd0aDohMCxuYW1lOiEwfSxhZD17dG9TdHJpbmc6ITAsdmFsdWVPZjohMCx0b0xvY2FsZVN0cmluZzohMH07Y2xhc3MgdWR7Y29uc3RydWN0b3IodCl7dGhpcy53cmFwcGVkT2JqZWN0PXR9a2V5cygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLndyYXBwZWRPYmplY3QpfWdldCh0KXtyZXR1cm4gbmQodGhpcy53cmFwcGVkT2JqZWN0LHQpfXNldCh0LGUpe3JldHVybiByZCh0aGlzLndyYXBwZWRPYmplY3QsdCxlKSx0aGlzfWhhcyh0KXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gZSBpbiB0fSh0aGlzLndyYXBwZWRPYmplY3QsdCl9fWZ1bmN0aW9uIGNkKHQpe3JldHVybiEhdCYmKHQgaW5zdGFuY2VvZiBNYXB8fHQgaW5zdGFuY2VvZiB1ZHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuc2V0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5nZXQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmtleXMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lmhhcyl9dmFyIGxkPWZ1bmN0aW9uKCl7cmV0dXJuIGxkPUNwLmNyZWF0ZSxDcH0saGQ9dGQoInR5cGVkIixbIj9CaWdOdW1iZXIiLCI/Q29tcGxleCIsIj9EZW5zZU1hdHJpeCIsIj9GcmFjdGlvbiJdLChmdW5jdGlvbih0KXt2YXJ7QmlnTnVtYmVyOmUsQ29tcGxleDpuLERlbnNlTWF0cml4OnIsRnJhY3Rpb246aX09dCxvPWxkKCk7cmV0dXJuIG8uY2xlYXIoKSxvLmFkZFR5cGVzKFt7bmFtZToibnVtYmVyIix0ZXN0Ok1mfSx7bmFtZToiQ29tcGxleCIsdGVzdDpUZn0se25hbWU6IkJpZ051bWJlciIsdGVzdDpGZn0se25hbWU6IkZyYWN0aW9uIix0ZXN0Ok9mfSx7bmFtZToiVW5pdCIsdGVzdDpMZn0se25hbWU6ImlkZW50aWZpZXIiLHRlc3Q6dD0+UmYmJi9eKD86W0EtWmEtelx4QUFceEI1XHhCQVx4QzAtXHhENlx4RDgtXHhGNlx4RjgtXHUwMkMxXHUwMkM2LVx1MDJEMVx1MDJFMC1cdTAyRTRcdTAyRUNcdTAyRUVcdTAzNzAtXHUwMzc0XHUwMzc2XHUwMzc3XHUwMzdBLVx1MDM3RFx1MDM3Rlx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNGNVx1MDNGNy1cdTA0ODFcdTA0OEEtXHUwNTJGXHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MC1cdTA1ODhcdTA1RDAtXHUwNUVBXHUwNUVGLVx1MDVGMlx1MDYyMC1cdTA2NEFcdTA2NkVcdTA2NkZcdTA2NzEtXHUwNkQzXHUwNkQ1XHUwNkU1XHUwNkU2XHUwNkVFXHUwNkVGXHUwNkZBLVx1MDZGQ1x1MDZGRlx1MDcxMFx1MDcxMi1cdTA3MkZcdTA3NEQtXHUwN0E1XHUwN0IxXHUwN0NBLVx1MDdFQVx1MDdGNFx1MDdGNVx1MDdGQVx1MDgwMC1cdTA4MTVcdTA4MUFcdTA4MjRcdTA4MjhcdTA4NDAtXHUwODU4XHUwODYwLVx1MDg2QVx1MDg3MC1cdTA4ODdcdTA4ODktXHUwODhFXHUwOEEwLVx1MDhDOVx1MDkwNC1cdTA5MzlcdTA5M0RcdTA5NTBcdTA5NTgtXHUwOTYxXHUwOTcxLVx1MDk4MFx1MDk4NS1cdTA5OENcdTA5OEZcdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5QkRcdTA5Q0VcdTA5RENcdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwXHUwOUYxXHUwOUZDXHUwQTA1LVx1MEEwQVx1MEEwRlx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyXHUwQTMzXHUwQTM1XHUwQTM2XHUwQTM4XHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFEMFx1MEFFMFx1MEFFMVx1MEFGOVx1MEIwNS1cdTBCMENcdTBCMEZcdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMlx1MEIzM1x1MEIzNS1cdTBCMzlcdTBCM0RcdTBCNUNcdTBCNURcdTBCNUYtXHUwQjYxXHUwQjcxXHUwQjgzXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5XHUwQjlBXHUwQjlDXHUwQjlFXHUwQjlGXHUwQkEzXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjlcdTBCRDBcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzM5XHUwQzNEXHUwQzU4LVx1MEM1QVx1MEM1RFx1MEM2MFx1MEM2MVx1MEM4MFx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0JEXHUwQ0REXHUwQ0RFXHUwQ0UwXHUwQ0UxXHUwQ0YxXHUwQ0YyXHUwRDA0LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDNBXHUwRDNEXHUwRDRFXHUwRDU0LVx1MEQ1Nlx1MEQ1Ri1cdTBENjFcdTBEN0EtXHUwRDdGXHUwRDg1LVx1MEQ5Nlx1MEQ5QS1cdTBEQjFcdTBEQjMtXHUwREJCXHUwREJEXHUwREMwLVx1MERDNlx1MEUwMS1cdTBFMzBcdTBFMzJcdTBFMzNcdTBFNDAtXHUwRTQ2XHUwRTgxXHUwRTgyXHUwRTg0XHUwRTg2LVx1MEU4QVx1MEU4Qy1cdTBFQTNcdTBFQTVcdTBFQTctXHUwRUIwXHUwRUIyXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVEQy1cdTBFREZcdTBGMDBcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY4OC1cdTBGOENcdTEwMDAtXHUxMDJBXHUxMDNGXHUxMDUwLVx1MTA1NVx1MTA1QS1cdTEwNURcdTEwNjFcdTEwNjVcdTEwNjZcdTEwNkUtXHUxMDcwXHUxMDc1LVx1MTA4MVx1MTA4RVx1MTBBMC1cdTEwQzVcdTEwQzdcdTEwQ0RcdTEwRDAtXHUxMEZBXHUxMEZDLVx1MTI0OFx1MTI0QS1cdTEyNERcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVBLVx1MTI1RFx1MTI2MC1cdTEyODhcdTEyOEEtXHUxMjhEXHUxMjkwLVx1MTJCMFx1MTJCMi1cdTEyQjVcdTEyQjgtXHUxMkJFXHUxMkMwXHUxMkMyLVx1MTJDNVx1MTJDOC1cdTEyRDZcdTEyRDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNUFcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkYxLVx1MTZGOFx1MTcwMC1cdTE3MTFcdTE3MUYtXHUxNzMxXHUxNzQwLVx1MTc1MVx1MTc2MC1cdTE3NkNcdTE3NkUtXHUxNzcwXHUxNzgwLVx1MTdCM1x1MTdEN1x1MTdEQ1x1MTgyMC1cdTE4NzhcdTE4ODAtXHUxODg0XHUxODg3LVx1MThBOFx1MThBQVx1MThCMC1cdTE4RjVcdTE5MDAtXHUxOTFFXHUxOTUwLVx1MTk2RFx1MTk3MC1cdTE5NzRcdTE5ODAtXHUxOUFCXHUxOUIwLVx1MTlDOVx1MUEwMC1cdTFBMTZcdTFBMjAtXHUxQTU0XHUxQUE3XHUxQjA1LVx1MUIzM1x1MUI0NS1cdTFCNENcdTFCODMtXHUxQkEwXHUxQkFFXHUxQkFGXHUxQkJBLVx1MUJFNVx1MUMwMC1cdTFDMjNcdTFDNEQtXHUxQzRGXHUxQzVBLVx1MUM3RFx1MUM4MC1cdTFDODhcdTFDOTAtXHUxQ0JBXHUxQ0JELVx1MUNCRlx1MUNFOS1cdTFDRUNcdTFDRUUtXHUxQ0YzXHUxQ0Y1XHUxQ0Y2XHUxQ0ZBXHUxRDAwLVx1MURCRlx1MUUwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjA3MVx1MjA3Rlx1MjA5MC1cdTIwOUNcdTIxMDJcdTIxMDdcdTIxMEEtXHUyMTEzXHUyMTE1XHUyMTE5LVx1MjExRFx1MjEyNFx1MjEyNlx1MjEyOFx1MjEyQS1cdTIxMkRcdTIxMkYtXHUyMTM5XHUyMTNDLVx1MjEzRlx1MjE0NS1cdTIxNDlcdTIxNEVcdTIxODNcdTIxODRcdTJDMDAtXHUyQ0U0XHUyQ0VCLVx1MkNFRVx1MkNGMlx1MkNGM1x1MkQwMC1cdTJEMjVcdTJEMjdcdTJEMkRcdTJEMzAtXHUyRDY3XHUyRDZGXHUyRDgwLVx1MkQ5Nlx1MkRBMC1cdTJEQTZcdTJEQTgtXHUyREFFXHUyREIwLVx1MkRCNlx1MkRCOC1cdTJEQkVcdTJEQzAtXHUyREM2XHUyREM4LVx1MkRDRVx1MkREMC1cdTJERDZcdTJERDgtXHUyRERFXHUyRTJGXHUzMDA1XHUzMDA2XHUzMDMxLVx1MzAzNVx1MzAzQlx1MzAzQ1x1MzA0MS1cdTMwOTZcdTMwOUQtXHUzMDlGXHUzMEExLVx1MzBGQVx1MzBGQy1cdTMwRkZcdTMxMDUtXHUzMTJGXHUzMTMxLVx1MzE4RVx1MzFBMC1cdTMxQkZcdTMxRjAtXHUzMUZGXHUzNDAwLVx1NERCRlx1NEUwMC1cdUE0OENcdUE0RDAtXHVBNEZEXHVBNTAwLVx1QTYwQ1x1QTYxMC1cdUE2MUZcdUE2MkFcdUE2MkJcdUE2NDAtXHVBNjZFXHVBNjdGLVx1QTY5RFx1QTZBMC1cdUE2RTVcdUE3MTctXHVBNzFGXHVBNzIyLVx1QTc4OFx1QTc4Qi1cdUE3Q0FcdUE3RDBcdUE3RDFcdUE3RDNcdUE3RDUtXHVBN0Q5XHVBN0YyLVx1QTgwMVx1QTgwMy1cdUE4MDVcdUE4MDctXHVBODBBXHVBODBDLVx1QTgyMlx1QTg0MC1cdUE4NzNcdUE4ODItXHVBOEIzXHVBOEYyLVx1QThGN1x1QThGQlx1QThGRFx1QThGRVx1QTkwQS1cdUE5MjVcdUE5MzAtXHVBOTQ2XHVBOTYwLVx1QTk3Q1x1QTk4NC1cdUE5QjJcdUE5Q0ZcdUE5RTAtXHVBOUU0XHVBOUU2LVx1QTlFRlx1QTlGQS1cdUE5RkVcdUFBMDAtXHVBQTI4XHVBQTQwLVx1QUE0Mlx1QUE0NC1cdUFBNEJcdUFBNjAtXHVBQTc2XHVBQTdBXHVBQTdFLVx1QUFBRlx1QUFCMVx1QUFCNVx1QUFCNlx1QUFCOS1cdUFBQkRcdUFBQzBcdUFBQzJcdUFBREItXHVBQUREXHVBQUUwLVx1QUFFQVx1QUFGMi1cdUFBRjRcdUFCMDEtXHVBQjA2XHVBQjA5LVx1QUIwRVx1QUIxMS1cdUFCMTZcdUFCMjAtXHVBQjI2XHVBQjI4LVx1QUIyRVx1QUIzMC1cdUFCNUFcdUFCNUMtXHVBQjY5XHVBQjcwLVx1QUJFMlx1QUMwMC1cdUQ3QTNcdUQ3QjAtXHVEN0M2XHVEN0NCLVx1RDdGQlx1RjkwMC1cdUZBNkRcdUZBNzAtXHVGQUQ5XHVGQjAwLVx1RkIwNlx1RkIxMy1cdUZCMTdcdUZCMURcdUZCMUYtXHVGQjI4XHVGQjJBLVx1RkIzNlx1RkIzOC1cdUZCM0NcdUZCM0VcdUZCNDBcdUZCNDFcdUZCNDNcdUZCNDRcdUZCNDYtXHVGQkIxXHVGQkQzLVx1RkQzRFx1RkQ1MC1cdUZEOEZcdUZEOTItXHVGREM3XHVGREYwLVx1RkRGQlx1RkU3MC1cdUZFNzRcdUZFNzYtXHVGRUZDXHVGRjIxLVx1RkYzQVx1RkY0MS1cdUZGNUFcdUZGNjYtXHVGRkJFXHVGRkMyLVx1RkZDN1x1RkZDQS1cdUZGQ0ZcdUZGRDItXHVGRkQ3XHVGRkRBLVx1RkZEQ118XHVEODAwW1x1REMwMC1cdURDMEJcdURDMEQtXHVEQzI2XHVEQzI4LVx1REMzQVx1REMzQ1x1REMzRFx1REMzRi1cdURDNERcdURDNTAtXHVEQzVEXHVEQzgwLVx1RENGQVx1REU4MC1cdURFOUNcdURFQTAtXHVERUQwXHVERjAwLVx1REYxRlx1REYyRC1cdURGNDBcdURGNDItXHVERjQ5XHVERjUwLVx1REY3NVx1REY4MC1cdURGOURcdURGQTAtXHVERkMzXHVERkM4LVx1REZDRl18XHVEODAxW1x1REMwMC1cdURDOURcdURDQjAtXHVEQ0QzXHVEQ0Q4LVx1RENGQlx1REQwMC1cdUREMjdcdUREMzAtXHVERDYzXHVERDcwLVx1REQ3QVx1REQ3Qy1cdUREOEFcdUREOEMtXHVERDkyXHVERDk0XHVERDk1XHVERDk3LVx1RERBMVx1RERBMy1cdUREQjFcdUREQjMtXHVEREI5XHVEREJCXHVEREJDXHVERTAwLVx1REYzNlx1REY0MC1cdURGNTVcdURGNjAtXHVERjY3XHVERjgwLVx1REY4NVx1REY4Ny1cdURGQjBcdURGQjItXHVERkJBXXxcdUQ4MDJbXHVEQzAwLVx1REMwNVx1REMwOFx1REMwQS1cdURDMzVcdURDMzdcdURDMzhcdURDM0NcdURDM0YtXHVEQzU1XHVEQzYwLVx1REM3Nlx1REM4MC1cdURDOUVcdURDRTAtXHVEQ0YyXHVEQ0Y0XHVEQ0Y1XHVERDAwLVx1REQxNVx1REQyMC1cdUREMzlcdUREODAtXHVEREI3XHVEREJFXHVEREJGXHVERTAwXHVERTEwLVx1REUxM1x1REUxNS1cdURFMTdcdURFMTktXHVERTM1XHVERTYwLVx1REU3Q1x1REU4MC1cdURFOUNcdURFQzAtXHVERUM3XHVERUM5LVx1REVFNFx1REYwMC1cdURGMzVcdURGNDAtXHVERjU1XHVERjYwLVx1REY3Mlx1REY4MC1cdURGOTFdfFx1RDgwM1tcdURDMDAtXHVEQzQ4XHVEQzgwLVx1RENCMlx1RENDMC1cdURDRjJcdUREMDAtXHVERDIzXHVERTgwLVx1REVBOVx1REVCMFx1REVCMVx1REYwMC1cdURGMUNcdURGMjdcdURGMzAtXHVERjQ1XHVERjcwLVx1REY4MVx1REZCMC1cdURGQzRcdURGRTAtXHVERkY2XXxcdUQ4MDRbXHVEQzAzLVx1REMzN1x1REM3MVx1REM3Mlx1REM3NVx1REM4My1cdURDQUZcdURDRDAtXHVEQ0U4XHVERDAzLVx1REQyNlx1REQ0NFx1REQ0N1x1REQ1MC1cdURENzJcdURENzZcdUREODMtXHVEREIyXHVEREMxLVx1RERDNFx1REREQVx1REREQ1x1REUwMC1cdURFMTFcdURFMTMtXHVERTJCXHVERTNGXHVERTQwXHVERTgwLVx1REU4Nlx1REU4OFx1REU4QS1cdURFOERcdURFOEYtXHVERTlEXHVERTlGLVx1REVBOFx1REVCMC1cdURFREVcdURGMDUtXHVERjBDXHVERjBGXHVERjEwXHVERjEzLVx1REYyOFx1REYyQS1cdURGMzBcdURGMzJcdURGMzNcdURGMzUtXHVERjM5XHVERjNEXHVERjUwXHVERjVELVx1REY2MV18XHVEODA1W1x1REMwMC1cdURDMzRcdURDNDctXHVEQzRBXHVEQzVGLVx1REM2MVx1REM4MC1cdURDQUZcdURDQzRcdURDQzVcdURDQzdcdUREODAtXHVEREFFXHVEREQ4LVx1REREQlx1REUwMC1cdURFMkZcdURFNDRcdURFODAtXHVERUFBXHVERUI4XHVERjAwLVx1REYxQVx1REY0MC1cdURGNDZdfFx1RDgwNltcdURDMDAtXHVEQzJCXHVEQ0EwLVx1RENERlx1RENGRi1cdUREMDZcdUREMDlcdUREMEMtXHVERDEzXHVERDE1XHVERDE2XHVERDE4LVx1REQyRlx1REQzRlx1REQ0MVx1RERBMC1cdUREQTdcdUREQUEtXHVEREQwXHVEREUxXHVEREUzXHVERTAwXHVERTBCLVx1REUzMlx1REUzQVx1REU1MFx1REU1Qy1cdURFODlcdURFOURcdURFQjAtXHVERUY4XXxcdUQ4MDdbXHVEQzAwLVx1REMwOFx1REMwQS1cdURDMkVcdURDNDBcdURDNzItXHVEQzhGXHVERDAwLVx1REQwNlx1REQwOFx1REQwOVx1REQwQi1cdUREMzBcdURENDZcdURENjAtXHVERDY1XHVERDY3XHVERDY4XHVERDZBLVx1REQ4OVx1REQ5OFx1REVFMC1cdURFRjJcdURGMDJcdURGMDQtXHVERjEwXHVERjEyLVx1REYzM1x1REZCMF18XHVEODA4W1x1REMwMC1cdURGOTldfFx1RDgwOVtcdURDODAtXHVERDQzXXxcdUQ4MEJbXHVERjkwLVx1REZGMF18W1x1RDgwQ1x1RDgxQy1cdUQ4MjBcdUQ4MjJcdUQ4NDAtXHVEODY4XHVEODZBLVx1RDg2Q1x1RDg2Ri1cdUQ4NzJcdUQ4NzQtXHVEODc5XHVEODgwLVx1RDg4M1x1RDg4NS1cdUQ4ODddW1x1REMwMC1cdURGRkZdfFx1RDgwRFtcdURDMDAtXHVEQzJGXHVEQzQxLVx1REM0Nl18XHVEODExW1x1REMwMC1cdURFNDZdfFx1RDgxQVtcdURDMDAtXHVERTM4XHVERTQwLVx1REU1RVx1REU3MC1cdURFQkVcdURFRDAtXHVERUVEXHVERjAwLVx1REYyRlx1REY0MC1cdURGNDNcdURGNjMtXHVERjc3XHVERjdELVx1REY4Rl18XHVEODFCW1x1REU0MC1cdURFN0ZcdURGMDAtXHVERjRBXHVERjUwXHVERjkzLVx1REY5Rlx1REZFMFx1REZFMVx1REZFM118XHVEODIxW1x1REMwMC1cdURGRjddfFx1RDgyM1tcdURDMDAtXHVEQ0Q1XHVERDAwLVx1REQwOF18XHVEODJCW1x1REZGMC1cdURGRjNcdURGRjUtXHVERkZCXHVERkZEXHVERkZFXXxcdUQ4MkNbXHVEQzAwLVx1REQyMlx1REQzMlx1REQ1MC1cdURENTJcdURENTVcdURENjQtXHVERDY3XHVERDcwLVx1REVGQl18XHVEODJGW1x1REMwMC1cdURDNkFcdURDNzAtXHVEQzdDXHVEQzgwLVx1REM4OFx1REM5MC1cdURDOTldfFx1RDgzNVtcdURDMDAtXHVEQzU0XHVEQzU2LVx1REM5Q1x1REM5RVx1REM5Rlx1RENBMlx1RENBNVx1RENBNlx1RENBOS1cdURDQUNcdURDQUUtXHVEQ0I5XHVEQ0JCXHVEQ0JELVx1RENDM1x1RENDNS1cdUREMDVcdUREMDctXHVERDBBXHVERDBELVx1REQxNFx1REQxNi1cdUREMUNcdUREMUUtXHVERDM5XHVERDNCLVx1REQzRVx1REQ0MC1cdURENDRcdURENDZcdURENEEtXHVERDUwXHVERDUyLVx1REVBNVx1REVBOC1cdURFQzBcdURFQzItXHVERURBXHVERURDLVx1REVGQVx1REVGQy1cdURGMTRcdURGMTYtXHVERjM0XHVERjM2LVx1REY0RVx1REY1MC1cdURGNkVcdURGNzAtXHVERjg4XHVERjhBLVx1REZBOFx1REZBQS1cdURGQzJcdURGQzQtXHVERkNCXXxcdUQ4MzdbXHVERjAwLVx1REYxRVx1REYyNS1cdURGMkFdfFx1RDgzOFtcdURDMzAtXHVEQzZEXHVERDAwLVx1REQyQ1x1REQzNy1cdUREM0RcdURENEVcdURFOTAtXHVERUFEXHVERUMwLVx1REVFQl18XHVEODM5W1x1RENEMC1cdURDRUJcdURGRTAtXHVERkU2XHVERkU4LVx1REZFQlx1REZFRFx1REZFRVx1REZGMC1cdURGRkVdfFx1RDgzQVtcdURDMDAtXHVEQ0M0XHVERDAwLVx1REQ0M1x1REQ0Ql18XHVEODNCW1x1REUwMC1cdURFMDNcdURFMDUtXHVERTFGXHVERTIxXHVERTIyXHVERTI0XHVERTI3XHVERTI5LVx1REUzMlx1REUzNC1cdURFMzdcdURFMzlcdURFM0JcdURFNDJcdURFNDdcdURFNDlcdURFNEJcdURFNEQtXHVERTRGXHVERTUxXHVERTUyXHVERTU0XHVERTU3XHVERTU5XHVERTVCXHVERTVEXHVERTVGXHVERTYxXHVERTYyXHVERTY0XHVERTY3LVx1REU2QVx1REU2Qy1cdURFNzJcdURFNzQtXHVERTc3XHVERTc5LVx1REU3Q1x1REU3RVx1REU4MC1cdURFODlcdURFOEItXHVERTlCXHVERUExLVx1REVBM1x1REVBNS1cdURFQTlcdURFQUItXHVERUJCXXxcdUQ4NjlbXHVEQzAwLVx1REVERlx1REYwMC1cdURGRkZdfFx1RDg2RFtcdURDMDAtXHVERjM5XHVERjQwLVx1REZGRl18XHVEODZFW1x1REMwMC1cdURDMURcdURDMjAtXHVERkZGXXxcdUQ4NzNbXHVEQzAwLVx1REVBMVx1REVCMC1cdURGRkZdfFx1RDg3QVtcdURDMDAtXHVERkUwXXxcdUQ4N0VbXHVEQzAwLVx1REUxRF18XHVEODg0W1x1REMwMC1cdURGNEFcdURGNTAtXHVERkZGXXxcdUQ4ODhbXHVEQzAwLVx1REZBRl0pKD86WzAtOUEtWmEtelx4QUFceEI1XHhCQVx4QzAtXHhENlx4RDgtXHhGNlx4RjgtXHUwMkMxXHUwMkM2LVx1MDJEMVx1MDJFMC1cdTAyRTRcdTAyRUNcdTAyRUVcdTAzNzAtXHUwMzc0XHUwMzc2XHUwMzc3XHUwMzdBLVx1MDM3RFx1MDM3Rlx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNGNVx1MDNGNy1cdTA0ODFcdTA0OEEtXHUwNTJGXHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MC1cdTA1ODhcdTA1RDAtXHUwNUVBXHUwNUVGLVx1MDVGMlx1MDYyMC1cdTA2NEFcdTA2NkVcdTA2NkZcdTA2NzEtXHUwNkQzXHUwNkQ1XHUwNkU1XHUwNkU2XHUwNkVFXHUwNkVGXHUwNkZBLVx1MDZGQ1x1MDZGRlx1MDcxMFx1MDcxMi1cdTA3MkZcdTA3NEQtXHUwN0E1XHUwN0IxXHUwN0NBLVx1MDdFQVx1MDdGNFx1MDdGNVx1MDdGQVx1MDgwMC1cdTA4MTVcdTA4MUFcdTA4MjRcdTA4MjhcdTA4NDAtXHUwODU4XHUwODYwLVx1MDg2QVx1MDg3MC1cdTA4ODdcdTA4ODktXHUwODhFXHUwOEEwLVx1MDhDOVx1MDkwNC1cdTA5MzlcdTA5M0RcdTA5NTBcdTA5NTgtXHUwOTYxXHUwOTcxLVx1MDk4MFx1MDk4NS1cdTA5OENcdTA5OEZcdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5QkRcdTA5Q0VcdTA5RENcdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwXHUwOUYxXHUwOUZDXHUwQTA1LVx1MEEwQVx1MEEwRlx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyXHUwQTMzXHUwQTM1XHUwQTM2XHUwQTM4XHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFEMFx1MEFFMFx1MEFFMVx1MEFGOVx1MEIwNS1cdTBCMENcdTBCMEZcdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMlx1MEIzM1x1MEIzNS1cdTBCMzlcdTBCM0RcdTBCNUNcdTBCNURcdTBCNUYtXHUwQjYxXHUwQjcxXHUwQjgzXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5XHUwQjlBXHUwQjlDXHUwQjlFXHUwQjlGXHUwQkEzXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjlcdTBCRDBcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzM5XHUwQzNEXHUwQzU4LVx1MEM1QVx1MEM1RFx1MEM2MFx1MEM2MVx1MEM4MFx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0JEXHUwQ0REXHUwQ0RFXHUwQ0UwXHUwQ0UxXHUwQ0YxXHUwQ0YyXHUwRDA0LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDNBXHUwRDNEXHUwRDRFXHUwRDU0LVx1MEQ1Nlx1MEQ1Ri1cdTBENjFcdTBEN0EtXHUwRDdGXHUwRDg1LVx1MEQ5Nlx1MEQ5QS1cdTBEQjFcdTBEQjMtXHUwREJCXHUwREJEXHUwREMwLVx1MERDNlx1MEUwMS1cdTBFMzBcdTBFMzJcdTBFMzNcdTBFNDAtXHUwRTQ2XHUwRTgxXHUwRTgyXHUwRTg0XHUwRTg2LVx1MEU4QVx1MEU4Qy1cdTBFQTNcdTBFQTVcdTBFQTctXHUwRUIwXHUwRUIyXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVEQy1cdTBFREZcdTBGMDBcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY4OC1cdTBGOENcdTEwMDAtXHUxMDJBXHUxMDNGXHUxMDUwLVx1MTA1NVx1MTA1QS1cdTEwNURcdTEwNjFcdTEwNjVcdTEwNjZcdTEwNkUtXHUxMDcwXHUxMDc1LVx1MTA4MVx1MTA4RVx1MTBBMC1cdTEwQzVcdTEwQzdcdTEwQ0RcdTEwRDAtXHUxMEZBXHUxMEZDLVx1MTI0OFx1MTI0QS1cdTEyNERcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVBLVx1MTI1RFx1MTI2MC1cdTEyODhcdTEyOEEtXHUxMjhEXHUxMjkwLVx1MTJCMFx1MTJCMi1cdTEyQjVcdTEyQjgtXHUxMkJFXHUxMkMwXHUxMkMyLVx1MTJDNVx1MTJDOC1cdTEyRDZcdTEyRDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNUFcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkYxLVx1MTZGOFx1MTcwMC1cdTE3MTFcdTE3MUYtXHUxNzMxXHUxNzQwLVx1MTc1MVx1MTc2MC1cdTE3NkNcdTE3NkUtXHUxNzcwXHUxNzgwLVx1MTdCM1x1MTdEN1x1MTdEQ1x1MTgyMC1cdTE4NzhcdTE4ODAtXHUxODg0XHUxODg3LVx1MThBOFx1MThBQVx1MThCMC1cdTE4RjVcdTE5MDAtXHUxOTFFXHUxOTUwLVx1MTk2RFx1MTk3MC1cdTE5NzRcdTE5ODAtXHUxOUFCXHUxOUIwLVx1MTlDOVx1MUEwMC1cdTFBMTZcdTFBMjAtXHUxQTU0XHUxQUE3XHUxQjA1LVx1MUIzM1x1MUI0NS1cdTFCNENcdTFCODMtXHUxQkEwXHUxQkFFXHUxQkFGXHUxQkJBLVx1MUJFNVx1MUMwMC1cdTFDMjNcdTFDNEQtXHUxQzRGXHUxQzVBLVx1MUM3RFx1MUM4MC1cdTFDODhcdTFDOTAtXHUxQ0JBXHUxQ0JELVx1MUNCRlx1MUNFOS1cdTFDRUNcdTFDRUUtXHUxQ0YzXHUxQ0Y1XHUxQ0Y2XHUxQ0ZBXHUxRDAwLVx1MURCRlx1MUUwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjA3MVx1MjA3Rlx1MjA5MC1cdTIwOUNcdTIxMDJcdTIxMDdcdTIxMEEtXHUyMTEzXHUyMTE1XHUyMTE5LVx1MjExRFx1MjEyNFx1MjEyNlx1MjEyOFx1MjEyQS1cdTIxMkRcdTIxMkYtXHUyMTM5XHUyMTNDLVx1MjEzRlx1MjE0NS1cdTIxNDlcdTIxNEVcdTIxODNcdTIxODRcdTJDMDAtXHUyQ0U0XHUyQ0VCLVx1MkNFRVx1MkNGMlx1MkNGM1x1MkQwMC1cdTJEMjVcdTJEMjdcdTJEMkRcdTJEMzAtXHUyRDY3XHUyRDZGXHUyRDgwLVx1MkQ5Nlx1MkRBMC1cdTJEQTZcdTJEQTgtXHUyREFFXHUyREIwLVx1MkRCNlx1MkRCOC1cdTJEQkVcdTJEQzAtXHUyREM2XHUyREM4LVx1MkRDRVx1MkREMC1cdTJERDZcdTJERDgtXHUyRERFXHUyRTJGXHUzMDA1XHUzMDA2XHUzMDMxLVx1MzAzNVx1MzAzQlx1MzAzQ1x1MzA0MS1cdTMwOTZcdTMwOUQtXHUzMDlGXHUzMEExLVx1MzBGQVx1MzBGQy1cdTMwRkZcdTMxMDUtXHUzMTJGXHUzMTMxLVx1MzE4RVx1MzFBMC1cdTMxQkZcdTMxRjAtXHUzMUZGXHUzNDAwLVx1NERCRlx1NEUwMC1cdUE0OENcdUE0RDAtXHVBNEZEXHVBNTAwLVx1QTYwQ1x1QTYxMC1cdUE2MUZcdUE2MkFcdUE2MkJcdUE2NDAtXHVBNjZFXHVBNjdGLVx1QTY5RFx1QTZBMC1cdUE2RTVcdUE3MTctXHVBNzFGXHVBNzIyLVx1QTc4OFx1QTc4Qi1cdUE3Q0FcdUE3RDBcdUE3RDFcdUE3RDNcdUE3RDUtXHVBN0Q5XHVBN0YyLVx1QTgwMVx1QTgwMy1cdUE4MDVcdUE4MDctXHVBODBBXHVBODBDLVx1QTgyMlx1QTg0MC1cdUE4NzNcdUE4ODItXHVBOEIzXHVBOEYyLVx1QThGN1x1QThGQlx1QThGRFx1QThGRVx1QTkwQS1cdUE5MjVcdUE5MzAtXHVBOTQ2XHVBOTYwLVx1QTk3Q1x1QTk4NC1cdUE5QjJcdUE5Q0ZcdUE5RTAtXHVBOUU0XHVBOUU2LVx1QTlFRlx1QTlGQS1cdUE5RkVcdUFBMDAtXHVBQTI4XHVBQTQwLVx1QUE0Mlx1QUE0NC1cdUFBNEJcdUFBNjAtXHVBQTc2XHVBQTdBXHVBQTdFLVx1QUFBRlx1QUFCMVx1QUFCNVx1QUFCNlx1QUFCOS1cdUFBQkRcdUFBQzBcdUFBQzJcdUFBREItXHVBQUREXHVBQUUwLVx1QUFFQVx1QUFGMi1cdUFBRjRcdUFCMDEtXHVBQjA2XHVBQjA5LVx1QUIwRVx1QUIxMS1cdUFCMTZcdUFCMjAtXHVBQjI2XHVBQjI4LVx1QUIyRVx1QUIzMC1cdUFCNUFcdUFCNUMtXHVBQjY5XHVBQjcwLVx1QUJFMlx1QUMwMC1cdUQ3QTNcdUQ3QjAtXHVEN0M2XHVEN0NCLVx1RDdGQlx1RjkwMC1cdUZBNkRcdUZBNzAtXHVGQUQ5XHVGQjAwLVx1RkIwNlx1RkIxMy1cdUZCMTdcdUZCMURcdUZCMUYtXHVGQjI4XHVGQjJBLVx1RkIzNlx1RkIzOC1cdUZCM0NcdUZCM0VcdUZCNDBcdUZCNDFcdUZCNDNcdUZCNDRcdUZCNDYtXHVGQkIxXHVGQkQzLVx1RkQzRFx1RkQ1MC1cdUZEOEZcdUZEOTItXHVGREM3XHVGREYwLVx1RkRGQlx1RkU3MC1cdUZFNzRcdUZFNzYtXHVGRUZDXHVGRjIxLVx1RkYzQVx1RkY0MS1cdUZGNUFcdUZGNjYtXHVGRkJFXHVGRkMyLVx1RkZDN1x1RkZDQS1cdUZGQ0ZcdUZGRDItXHVGRkQ3XHVGRkRBLVx1RkZEQ118XHVEODAwW1x1REMwMC1cdURDMEJcdURDMEQtXHVEQzI2XHVEQzI4LVx1REMzQVx1REMzQ1x1REMzRFx1REMzRi1cdURDNERcdURDNTAtXHVEQzVEXHVEQzgwLVx1RENGQVx1REU4MC1cdURFOUNcdURFQTAtXHVERUQwXHVERjAwLVx1REYxRlx1REYyRC1cdURGNDBcdURGNDItXHVERjQ5XHVERjUwLVx1REY3NVx1REY4MC1cdURGOURcdURGQTAtXHVERkMzXHVERkM4LVx1REZDRl18XHVEODAxW1x1REMwMC1cdURDOURcdURDQjAtXHVEQ0QzXHVEQ0Q4LVx1RENGQlx1REQwMC1cdUREMjdcdUREMzAtXHVERDYzXHVERDcwLVx1REQ3QVx1REQ3Qy1cdUREOEFcdUREOEMtXHVERDkyXHVERDk0XHVERDk1XHVERDk3LVx1RERBMVx1RERBMy1cdUREQjFcdUREQjMtXHVEREI5XHVEREJCXHVEREJDXHVERTAwLVx1REYzNlx1REY0MC1cdURGNTVcdURGNjAtXHVERjY3XHVERjgwLVx1REY4NVx1REY4Ny1cdURGQjBcdURGQjItXHVERkJBXXxcdUQ4MDJbXHVEQzAwLVx1REMwNVx1REMwOFx1REMwQS1cdURDMzVcdURDMzdcdURDMzhcdURDM0NcdURDM0YtXHVEQzU1XHVEQzYwLVx1REM3Nlx1REM4MC1cdURDOUVcdURDRTAtXHVEQ0YyXHVEQ0Y0XHVEQ0Y1XHVERDAwLVx1REQxNVx1REQyMC1cdUREMzlcdUREODAtXHVEREI3XHVEREJFXHVEREJGXHVERTAwXHVERTEwLVx1REUxM1x1REUxNS1cdURFMTdcdURFMTktXHVERTM1XHVERTYwLVx1REU3Q1x1REU4MC1cdURFOUNcdURFQzAtXHVERUM3XHVERUM5LVx1REVFNFx1REYwMC1cdURGMzVcdURGNDAtXHVERjU1XHVERjYwLVx1REY3Mlx1REY4MC1cdURGOTFdfFx1RDgwM1tcdURDMDAtXHVEQzQ4XHVEQzgwLVx1RENCMlx1RENDMC1cdURDRjJcdUREMDAtXHVERDIzXHVERTgwLVx1REVBOVx1REVCMFx1REVCMVx1REYwMC1cdURGMUNcdURGMjdcdURGMzAtXHVERjQ1XHVERjcwLVx1REY4MVx1REZCMC1cdURGQzRcdURGRTAtXHVERkY2XXxcdUQ4MDRbXHVEQzAzLVx1REMzN1x1REM3MVx1REM3Mlx1REM3NVx1REM4My1cdURDQUZcdURDRDAtXHVEQ0U4XHVERDAzLVx1REQyNlx1REQ0NFx1REQ0N1x1REQ1MC1cdURENzJcdURENzZcdUREODMtXHVEREIyXHVEREMxLVx1RERDNFx1REREQVx1REREQ1x1REUwMC1cdURFMTFcdURFMTMtXHVERTJCXHVERTNGXHVERTQwXHVERTgwLVx1REU4Nlx1REU4OFx1REU4QS1cdURFOERcdURFOEYtXHVERTlEXHVERTlGLVx1REVBOFx1REVCMC1cdURFREVcdURGMDUtXHVERjBDXHVERjBGXHVERjEwXHVERjEzLVx1REYyOFx1REYyQS1cdURGMzBcdURGMzJcdURGMzNcdURGMzUtXHVERjM5XHVERjNEXHVERjUwXHVERjVELVx1REY2MV18XHVEODA1W1x1REMwMC1cdURDMzRcdURDNDctXHVEQzRBXHVEQzVGLVx1REM2MVx1REM4MC1cdURDQUZcdURDQzRcdURDQzVcdURDQzdcdUREODAtXHVEREFFXHVEREQ4LVx1REREQlx1REUwMC1cdURFMkZcdURFNDRcdURFODAtXHVERUFBXHVERUI4XHVERjAwLVx1REYxQVx1REY0MC1cdURGNDZdfFx1RDgwNltcdURDMDAtXHVEQzJCXHVEQ0EwLVx1RENERlx1RENGRi1cdUREMDZcdUREMDlcdUREMEMtXHVERDEzXHVERDE1XHVERDE2XHVERDE4LVx1REQyRlx1REQzRlx1REQ0MVx1RERBMC1cdUREQTdcdUREQUEtXHVEREQwXHVEREUxXHVEREUzXHVERTAwXHVERTBCLVx1REUzMlx1REUzQVx1REU1MFx1REU1Qy1cdURFODlcdURFOURcdURFQjAtXHVERUY4XXxcdUQ4MDdbXHVEQzAwLVx1REMwOFx1REMwQS1cdURDMkVcdURDNDBcdURDNzItXHVEQzhGXHVERDAwLVx1REQwNlx1REQwOFx1REQwOVx1REQwQi1cdUREMzBcdURENDZcdURENjAtXHVERDY1XHVERDY3XHVERDY4XHVERDZBLVx1REQ4OVx1REQ5OFx1REVFMC1cdURFRjJcdURGMDJcdURGMDQtXHVERjEwXHVERjEyLVx1REYzM1x1REZCMF18XHVEODA4W1x1REMwMC1cdURGOTldfFx1RDgwOVtcdURDODAtXHVERDQzXXxcdUQ4MEJbXHVERjkwLVx1REZGMF18W1x1RDgwQ1x1RDgxQy1cdUQ4MjBcdUQ4MjJcdUQ4NDAtXHVEODY4XHVEODZBLVx1RDg2Q1x1RDg2Ri1cdUQ4NzJcdUQ4NzQtXHVEODc5XHVEODgwLVx1RDg4M1x1RDg4NS1cdUQ4ODddW1x1REMwMC1cdURGRkZdfFx1RDgwRFtcdURDMDAtXHVEQzJGXHVEQzQxLVx1REM0Nl18XHVEODExW1x1REMwMC1cdURFNDZdfFx1RDgxQVtcdURDMDAtXHVERTM4XHVERTQwLVx1REU1RVx1REU3MC1cdURFQkVcdURFRDAtXHVERUVEXHVERjAwLVx1REYyRlx1REY0MC1cdURGNDNcdURGNjMtXHVERjc3XHVERjdELVx1REY4Rl18XHVEODFCW1x1REU0MC1cdURFN0ZcdURGMDAtXHVERjRBXHVERjUwXHVERjkzLVx1REY5Rlx1REZFMFx1REZFMVx1REZFM118XHVEODIxW1x1REMwMC1cdURGRjddfFx1RDgyM1tcdURDMDAtXHVEQ0Q1XHVERDAwLVx1REQwOF18XHVEODJCW1x1REZGMC1cdURGRjNcdURGRjUtXHVERkZCXHVERkZEXHVERkZFXXxcdUQ4MkNbXHVEQzAwLVx1REQyMlx1REQzMlx1REQ1MC1cdURENTJcdURENTVcdURENjQtXHVERDY3XHVERDcwLVx1REVGQl18XHVEODJGW1x1REMwMC1cdURDNkFcdURDNzAtXHVEQzdDXHVEQzgwLVx1REM4OFx1REM5MC1cdURDOTldfFx1RDgzNVtcdURDMDAtXHVEQzU0XHVEQzU2LVx1REM5Q1x1REM5RVx1REM5Rlx1RENBMlx1RENBNVx1RENBNlx1RENBOS1cdURDQUNcdURDQUUtXHVEQ0I5XHVEQ0JCXHVEQ0JELVx1RENDM1x1RENDNS1cdUREMDVcdUREMDctXHVERDBBXHVERDBELVx1REQxNFx1REQxNi1cdUREMUNcdUREMUUtXHVERDM5XHVERDNCLVx1REQzRVx1REQ0MC1cdURENDRcdURENDZcdURENEEtXHVERDUwXHVERDUyLVx1REVBNVx1REVBOC1cdURFQzBcdURFQzItXHVERURBXHVERURDLVx1REVGQVx1REVGQy1cdURGMTRcdURGMTYtXHVERjM0XHVERjM2LVx1REY0RVx1REY1MC1cdURGNkVcdURGNzAtXHVERjg4XHVERjhBLVx1REZBOFx1REZBQS1cdURGQzJcdURGQzQtXHVERkNCXXxcdUQ4MzdbXHVERjAwLVx1REYxRVx1REYyNS1cdURGMkFdfFx1RDgzOFtcdURDMzAtXHVEQzZEXHVERDAwLVx1REQyQ1x1REQzNy1cdUREM0RcdURENEVcdURFOTAtXHVERUFEXHVERUMwLVx1REVFQl18XHVEODM5W1x1RENEMC1cdURDRUJcdURGRTAtXHVERkU2XHVERkU4LVx1REZFQlx1REZFRFx1REZFRVx1REZGMC1cdURGRkVdfFx1RDgzQVtcdURDMDAtXHVEQ0M0XHVERDAwLVx1REQ0M1x1REQ0Ql18XHVEODNCW1x1REUwMC1cdURFMDNcdURFMDUtXHVERTFGXHVERTIxXHVERTIyXHVERTI0XHVERTI3XHVERTI5LVx1REUzMlx1REUzNC1cdURFMzdcdURFMzlcdURFM0JcdURFNDJcdURFNDdcdURFNDlcdURFNEJcdURFNEQtXHVERTRGXHVERTUxXHVERTUyXHVERTU0XHVERTU3XHVERTU5XHVERTVCXHVERTVEXHVERTVGXHVERTYxXHVERTYyXHVERTY0XHVERTY3LVx1REU2QVx1REU2Qy1cdURFNzJcdURFNzQtXHVERTc3XHVERTc5LVx1REU3Q1x1REU3RVx1REU4MC1cdURFODlcdURFOEItXHVERTlCXHVERUExLVx1REVBM1x1REVBNS1cdURFQTlcdURFQUItXHVERUJCXXxcdUQ4NjlbXHVEQzAwLVx1REVERlx1REYwMC1cdURGRkZdfFx1RDg2RFtcdURDMDAtXHVERjM5XHVERjQwLVx1REZGRl18XHVEODZFW1x1REMwMC1cdURDMURcdURDMjAtXHVERkZGXXxcdUQ4NzNbXHVEQzAwLVx1REVBMVx1REVCMC1cdURGRkZdfFx1RDg3QVtcdURDMDAtXHVERkUwXXxcdUQ4N0VbXHVEQzAwLVx1REUxRF18XHVEODg0W1x1REMwMC1cdURGNEFcdURGNTAtXHVERkZGXXxcdUQ4ODhbXHVEQzAwLVx1REZBRl0pKiQvLnRlc3QodCl9LHtuYW1lOiJzdHJpbmciLHRlc3Q6UmZ9LHtuYW1lOiJDaGFpbiIsdGVzdDpncH0se25hbWU6IkFycmF5Iix0ZXN0OkJmfSx7bmFtZToiTWF0cml4Iix0ZXN0OmtmfSx7bmFtZToiRGVuc2VNYXRyaXgiLHRlc3Q6amZ9LHtuYW1lOiJTcGFyc2VNYXRyaXgiLHRlc3Q6VWZ9LHtuYW1lOiJSYW5nZSIsdGVzdDpxZn0se25hbWU6IkluZGV4Iix0ZXN0OlZmfSx7bmFtZToiYm9vbGVhbiIsdGVzdDpHZn0se25hbWU6IlJlc3VsdFNldCIsdGVzdDpZZn0se25hbWU6IkhlbHAiLHRlc3Q6WGZ9LHtuYW1lOiJmdW5jdGlvbiIsdGVzdDpXZn0se25hbWU6IkRhdGUiLHRlc3Q6SGZ9LHtuYW1lOiJSZWdFeHAiLHRlc3Q6WmZ9LHtuYW1lOiJudWxsIix0ZXN0OkpmfSx7bmFtZToidW5kZWZpbmVkIix0ZXN0OlFmfSx7bmFtZToiQWNjZXNzb3JOb2RlIix0ZXN0OiRmfSx7bmFtZToiQXJyYXlOb2RlIix0ZXN0OnRwfSx7bmFtZToiQXNzaWdubWVudE5vZGUiLHRlc3Q6ZXB9LHtuYW1lOiJCbG9ja05vZGUiLHRlc3Q6bnB9LHtuYW1lOiJDb25kaXRpb25hbE5vZGUiLHRlc3Q6cnB9LHtuYW1lOiJDb25zdGFudE5vZGUiLHRlc3Q6aXB9LHtuYW1lOiJGdW5jdGlvbk5vZGUiLHRlc3Q6c3B9LHtuYW1lOiJGdW5jdGlvbkFzc2lnbm1lbnROb2RlIix0ZXN0Om9wfSx7bmFtZToiSW5kZXhOb2RlIix0ZXN0OmFwfSx7bmFtZToiTm9kZSIsdGVzdDp1cH0se25hbWU6Ik9iamVjdE5vZGUiLHRlc3Q6Y3B9LHtuYW1lOiJPcGVyYXRvck5vZGUiLHRlc3Q6bHB9LHtuYW1lOiJQYXJlbnRoZXNpc05vZGUiLHRlc3Q6aHB9LHtuYW1lOiJSYW5nZU5vZGUiLHRlc3Q6ZnB9LHtuYW1lOiJSZWxhdGlvbmFsTm9kZSIsdGVzdDpwcH0se25hbWU6IlN5bWJvbE5vZGUiLHRlc3Q6ZHB9LHtuYW1lOiJNYXAiLHRlc3Q6Y2R9LHtuYW1lOiJPYmplY3QiLHRlc3Q6S2Z9XSksby5hZGRDb252ZXJzaW9ucyhbe2Zyb206Im51bWJlciIsdG86IkJpZ051bWJlciIsY29udmVydDpmdW5jdGlvbih0KXtpZihlfHxmZCh0KSxmdW5jdGlvbih0KXtyZXR1cm4gdC50b0V4cG9uZW50aWFsKCkucmVwbGFjZSgvZS4qJC8sIiIpLnJlcGxhY2UoL14wXC4/MCp8XC4vLCIiKS5sZW5ndGh9KHQpPjE1KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgYSBudW1iZXIgd2l0aCA+MTUgc2lnbmlmaWNhbnQgZGlnaXRzIHRvIEJpZ051bWJlciAodmFsdWU6ICIrdCsiKS4gVXNlIGZ1bmN0aW9uIGJpZ251bWJlcih4KSB0byBjb252ZXJ0IHRvIEJpZ051bWJlci4iKTtyZXR1cm4gbmV3IGUodCl9fSx7ZnJvbToibnVtYmVyIix0bzoiQ29tcGxleCIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gbnx8cGQodCksbmV3IG4odCwwKX19LHtmcm9tOiJCaWdOdW1iZXIiLHRvOiJDb21wbGV4Iixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiBufHxwZCh0KSxuZXcgbih0LnRvTnVtYmVyKCksMCl9fSx7ZnJvbToiRnJhY3Rpb24iLHRvOiJCaWdOdW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGltcGxpY2l0bHkgY29udmVydCBhIEZyYWN0aW9uIHRvIEJpZ051bWJlciBvciB2aWNlIHZlcnNhLiBVc2UgZnVuY3Rpb24gYmlnbnVtYmVyKHgpIHRvIGNvbnZlcnQgdG8gQmlnTnVtYmVyIG9yIGZyYWN0aW9uKHgpIHRvIGNvbnZlcnQgdG8gRnJhY3Rpb24uIil9fSx7ZnJvbToiRnJhY3Rpb24iLHRvOiJDb21wbGV4Iixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiBufHxwZCh0KSxuZXcgbih0LnZhbHVlT2YoKSwwKX19LHtmcm9tOiJudW1iZXIiLHRvOiJGcmFjdGlvbiIsY29udmVydDpmdW5jdGlvbih0KXtpfHxkZCh0KTt2YXIgZT1uZXcgaSh0KTtpZihlLnZhbHVlT2YoKSE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGltcGxpY2l0bHkgY29udmVydCBhIG51bWJlciB0byBhIEZyYWN0aW9uIHdoZW4gdGhlcmUgd2lsbCBiZSBhIGxvc3Mgb2YgcHJlY2lzaW9uICh2YWx1ZTogIit0KyIpLiBVc2UgZnVuY3Rpb24gZnJhY3Rpb24oeCkgdG8gY29udmVydCB0byBGcmFjdGlvbi4iKTtyZXR1cm4gZX19LHtmcm9tOiJzdHJpbmciLHRvOiJudW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7dmFyIGU9TnVtYmVyKHQpO2lmKGlzTmFOKGUpKXRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbnZlcnQgIicrdCsnIiB0byBhIG51bWJlcicpO3JldHVybiBlfX0se2Zyb206InN0cmluZyIsdG86IkJpZ051bWJlciIsY29udmVydDpmdW5jdGlvbih0KXtlfHxmZCh0KTt0cnl7cmV0dXJuIG5ldyBlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbnZlcnQgIicrdCsnIiB0byBCaWdOdW1iZXInKX19fSx7ZnJvbToic3RyaW5nIix0bzoiRnJhY3Rpb24iLGNvbnZlcnQ6ZnVuY3Rpb24odCl7aXx8ZGQodCk7dHJ5e3JldHVybiBuZXcgaSh0KX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK3QrJyIgdG8gRnJhY3Rpb24nKX19fSx7ZnJvbToic3RyaW5nIix0bzoiQ29tcGxleCIsY29udmVydDpmdW5jdGlvbih0KXtufHxwZCh0KTt0cnl7cmV0dXJuIG5ldyBuKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbnZlcnQgIicrdCsnIiB0byBDb21wbGV4Jyl9fX0se2Zyb206ImJvb2xlYW4iLHRvOiJudW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuK3R9fSx7ZnJvbToiYm9vbGVhbiIsdG86IkJpZ051bWJlciIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gZXx8ZmQodCksbmV3IGUoK3QpfX0se2Zyb206ImJvb2xlYW4iLHRvOiJGcmFjdGlvbiIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gaXx8ZGQodCksbmV3IGkoK3QpfX0se2Zyb206ImJvb2xlYW4iLHRvOiJzdHJpbmciLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KX19LHtmcm9tOiJBcnJheSIsdG86Ik1hdHJpeCIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gcnx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFycmF5IGludG8gYSBNYXRyaXg6IG5vIGNsYXNzICdEZW5zZU1hdHJpeCcgcHJvdmlkZWQiKX0oKSxuZXcgcih0KX19LHtmcm9tOiJNYXRyaXgiLHRvOiJBcnJheSIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZU9mKCl9fV0pLG8ub25NaXNtYXRjaD0odCxlLG4pPT57dmFyIHI9by5jcmVhdGVFcnJvcih0LGUsbik7aWYoWyJ3cm9uZ1R5cGUiLCJtaXNtYXRjaCJdLmluY2x1ZGVzKHIuZGF0YS5jYXRlZ29yeSkmJjE9PT1lLmxlbmd0aCYmemYoZVswXSkmJm4uc29tZSgodD0+IXQucGFyYW1zLmluY2x1ZGVzKCIsIikpKSl7dmFyIGk9bmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gJyIuY29uY2F0KHQsIicgZG9lc24ndCBhcHBseSB0byBtYXRyaWNlcy4gVG8gY2FsbCBpdCAiKSsiZWxlbWVudHdpc2Ugb24gYSBtYXRyaXggJ00nLCB0cnkgJ21hcChNLCAiLmNvbmNhdCh0LCIpJy4iKSk7dGhyb3cgaS5kYXRhPXIuZGF0YSxpfXRocm93IHJ9LG8ub25NaXNtYXRjaD0odCxlLG4pPT57dmFyIHI9by5jcmVhdGVFcnJvcih0LGUsbik7aWYoWyJ3cm9uZ1R5cGUiLCJtaXNtYXRjaCJdLmluY2x1ZGVzKHIuZGF0YS5jYXRlZ29yeSkmJjE9PT1lLmxlbmd0aCYmemYoZVswXSkmJm4uc29tZSgodD0+IXQucGFyYW1zLmluY2x1ZGVzKCIsIikpKSl7dmFyIGk9bmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gJyIuY29uY2F0KHQsIicgZG9lc24ndCBhcHBseSB0byBtYXRyaWNlcy4gVG8gY2FsbCBpdCAiKSsiZWxlbWVudHdpc2Ugb24gYSBtYXRyaXggJ00nLCB0cnkgJ21hcChNLCAiLmNvbmNhdCh0LCIpJy4iKSk7dGhyb3cgaS5kYXRhPXIuZGF0YSxpfXRocm93IHJ9LG99KSk7ZnVuY3Rpb24gZmQodCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29udmVydCB2YWx1ZSAiLmNvbmNhdCh0LCIgaW50byBhIEJpZ051bWJlcjogbm8gY2xhc3MgJ0JpZ051bWJlcicgcHJvdmlkZWQiKSl9ZnVuY3Rpb24gcGQodCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29udmVydCB2YWx1ZSAiLmNvbmNhdCh0LCIgaW50byBhIENvbXBsZXggbnVtYmVyOiBubyBjbGFzcyAnQ29tcGxleCcgcHJvdmlkZWQiKSl9ZnVuY3Rpb24gZGQodCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29udmVydCB2YWx1ZSAiLmNvbmNhdCh0LCIgaW50byBhIEZyYWN0aW9uLCBubyBjbGFzcyAnRnJhY3Rpb24nIHByb3ZpZGVkLiIpKX12YXIgZ2QseWQsbWQ9OWUxNSx2ZD0xZTksX2Q9IjAxMjM0NTY3ODlhYmNkZWYiLHhkPSIyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NDIwNzYwMTEwMTQ4ODYyODc3Mjk3NjAzMzMyNzkwMDk2NzU3MjYwOTY3NzM1MjQ4MDIzNTk5NzIwNTA4OTU5ODI5ODM0MTk2Nzc4NDA0MjI4NjI0ODYzMzQwOTUyNTQ2NTA4MjgwNjc1NjY2NjI4NzM2OTA5ODc4MTY4OTQ4MjkwNzIwODMyNTU1NDY4MDg0Mzc5OTg5NDgyNjIzMzE5ODUyODM5MzUwNTMwODk2NTM3NzczMjYyODg0NjE2MzM2NjIyMjI4NzY5ODIxOTg4Njc0NjU0MzY2NzQ3NDQwNDI0MzI3NDM2NTE1NTA0ODkzNDMxNDkzOTM5MTQ3OTYxOTQwNDQwMDIyMjEwNTEwMTcxNDE3NDgwMDM2ODgwODQwMTI2NDcwODA2ODU1Njc3NDMyMTYyMjgzNTUyMjAxMTQ4MDQ2NjM3MTU2NTkxMjEzNzM0NTA3NDc4NTY5NDc2ODM0NjM2MTY3OTIxMDE4MDY0NDUwNzA2NDgwMDAyNzc1MDI2ODQ5MTY3NDY1NTA1ODY4NTY5MzU2NzM0MjA2NzA1ODExMzY0MjkyMjQ1NTQ0MDU3NTg5MjU3MjQyMDgyNDEzMTQ2OTU2ODkwMTY3NTg5NDAyNTY3NzYzMTEzNTY5MTkyOTIwMzMzNzY1ODcxNDE2NjAyMzAxMDU3MDMwODk2MzQ1NzIwNzU0NDAzNzA4NDc0Njk5NDAxNjgyNjkyODI4MDg0ODExODQyODkzMTQ4NDg1MjQ5NDg2NDQ4NzE5Mjc4MDk2NzYyNzEyNzU3NzUzOTcwMjc2Njg2MDU5NTI0OTY3MTY2NzQxODM0ODU3MDQ0MjI1MDcxOTc5NjUwMDQ3MTQ5NTEwNTA0OTIyMTQ3NzY1Njc2MzY5Mzg2NjI5NzY5Nzk1MjIxMTA3MTgyNjQ1NDk3MzQ3NzI2NjI0MjU3MDk0MjkzMjI1ODI3OTg1MDI1ODU1MDk3ODUyNjUzODMyMDc2MDY3MjYzMTcxNjQzMDk1MDU5OTUwODc4MDc1MjM3MTAzMzMxMDExOTc4NTc1NDczMzE1NDE0MjE4MDg0Mjc1NDM4NjM1OTE3NzgxMTcwNTQzMDk4Mjc0ODIzODUwNDU2NDgwMTkwOTU2MTAyOTkyOTE4MjQzMTgyMzc1MjUzNTc3MDk3NTA1Mzk1NjUxODc2OTc1MTAzNzQ5NzA4ODg2OTIxODAyMDUxODkzMzk1MDcyMzg1MzkyMDUxNDQ2MzQxOTcyNjUyODcyODY5NjUxMTA4NjI1NzE0OTIxOTg4NDk5Nzg3NDg4NzM3NzEzNDU2ODYyMDkxNjcwNTgiLHdkPSIzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjg4NDE5NzE2OTM5OTM3NTEwNTgyMDk3NDk0NDU5MjMwNzgxNjQwNjI4NjIwODk5ODYyODAzNDgyNTM0MjExNzA2Nzk4MjE0ODA4NjUxMzI4MjMwNjY0NzA5Mzg0NDYwOTU1MDU4MjIzMTcyNTM1OTQwODEyODQ4MTExNzQ1MDI4NDEwMjcwMTkzODUyMTEwNTU1OTY0NDYyMjk0ODk1NDkzMDM4MTk2NDQyODgxMDk3NTY2NTkzMzQ0NjEyODQ3NTY0ODIzMzc4Njc4MzE2NTI3MTIwMTkwOTE0NTY0ODU2NjkyMzQ2MDM0ODYxMDQ1NDMyNjY0ODIxMzM5MzYwNzI2MDI0OTE0MTI3MzcyNDU4NzAwNjYwNjMxNTU4ODE3NDg4MTUyMDkyMDk2MjgyOTI1NDA5MTcxNTM2NDM2Nzg5MjU5MDM2MDAxMTMzMDUzMDU0ODgyMDQ2NjUyMTM4NDE0Njk1MTk0MTUxMTYwOTQzMzA1NzI3MDM2NTc1OTU5MTk1MzA5MjE4NjExNzM4MTkzMjYxMTc5MzEwNTExODU0ODA3NDQ2MjM3OTk2Mjc0OTU2NzM1MTg4NTc1MjcyNDg5MTIyNzkzODE4MzAxMTk0OTEyOTgzMzY3MzM2MjQ0MDY1NjY0MzA4NjAyMTM5NDk0NjM5NTIyNDczNzE5MDcwMjE3OTg2MDk0MzcwMjc3MDUzOTIxNzE3NjI5MzE3Njc1MjM4NDY3NDgxODQ2NzY2OTQwNTEzMjAwMDU2ODEyNzE0NTI2MzU2MDgyNzc4NTc3MTM0Mjc1Nzc4OTYwOTE3MzYzNzE3ODcyMTQ2ODQ0MDkwMTIyNDk1MzQzMDE0NjU0OTU4NTM3MTA1MDc5MjI3OTY4OTI1ODkyMzU0MjAxOTk1NjExMjEyOTAyMTk2MDg2NDAzNDQxODE1OTgxMzYyOTc3NDc3MTMwOTk2MDUxODcwNzIxMTM0OTk5OTk5ODM3Mjk3ODA0OTk1MTA1OTczMTczMjgxNjA5NjMxODU5NTAyNDQ1OTQ1NTM0NjkwODMwMjY0MjUyMjMwODI1MzM0NDY4NTAzNTI2MTkzMTE4ODE3MTAxMDAwMzEzNzgzODc1Mjg4NjU4NzUzMzIwODM4MTQyMDYxNzE3NzY2OTE0NzMwMzU5ODI1MzQ5MDQyODc1NTQ2ODczMTE1OTU2Mjg2Mzg4MjM1Mzc4NzU5Mzc1MTk1Nzc4MTg1Nzc4MDUzMjE3MTIyNjgwNjYxMzAwMTkyNzg3NjYxMTE5NTkwOTIxNjQyMDE5ODkzODA5NTI1NzIwMTA2NTQ4NTg2MzI3ODkiLGJkPXtwcmVjaXNpb246MjAscm91bmRpbmc6NCxtb2R1bG86MSx0b0V4cE5lZzotNyx0b0V4cFBvczoyMSxtaW5FOi1tZCxtYXhFOm1kLGNyeXB0bzohMX0sRGQ9ITAsRWQ9IltEZWNpbWFsRXJyb3JdICIsQ2Q9RWQrIkludmFsaWQgYXJndW1lbnQ6ICIsU2Q9RWQrIlByZWNpc2lvbiBsaW1pdCBleGNlZWRlZCIsQWQ9RWQrImNyeXB0byB1bmF2YWlsYWJsZSIsTmQ9IltvYmplY3QgRGVjaW1hbF0iLElkPU1hdGguZmxvb3IsTWQ9TWF0aC5wb3csRmQ9L14wYihbMDFdKyhcLlswMV0qKT98XC5bMDFdKykocFsrLV0/XGQrKT8kL2ksVGQ9L14weChbMC05YS1mXSsoXC5bMC05YS1mXSopP3xcLlswLTlhLWZdKykocFsrLV0/XGQrKT8kL2ksT2Q9L14wbyhbMC03XSsoXC5bMC03XSopP3xcLlswLTddKykocFsrLV0/XGQrKT8kL2ksTGQ9L14oXGQrKFwuXGQqKT98XC5cZCspKGVbKy1dP1xkKyk/JC9pLFBkPTFlNyxSZD14ZC5sZW5ndGgtMSxCZD13ZC5sZW5ndGgtMSxrZD17dG9TdHJpbmdUYWc6TmR9O2Z1bmN0aW9uIHpkKHQpe3ZhciBlLG4scixpPXQubGVuZ3RoLTEsbz0iIixzPXRbMF07aWYoaT4wKXtmb3Iobys9cyxlPTE7ZTxpO2UrKykobj03LShyPXRbZV0rIiIpLmxlbmd0aCkmJihvKz1LZChuKSksbys9cjsobj03LShyPShzPXRbZV0pKyIiKS5sZW5ndGgpJiYobys9S2QobikpfWVsc2UgaWYoMD09PXMpcmV0dXJuIjAiO2Zvcig7cyUxMD09MDspcy89MTA7cmV0dXJuIG8rc31mdW5jdGlvbiBqZCh0LGUsbil7aWYodCE9PX5+dHx8dDxlfHx0Pm4pdGhyb3cgRXJyb3IoQ2QrdCl9ZnVuY3Rpb24gVWQodCxlLG4scil7dmFyIGksbyxzLGE7Zm9yKG89dFswXTtvPj0xMDtvLz0xMCktLWU7cmV0dXJuLS1lPDA/KGUrPTcsaT0wKTooaT1NYXRoLmNlaWwoKGUrMSkvNyksZSU9Nyksbz1NZCgxMCw3LWUpLGE9dFtpXSVvfDAsbnVsbD09cj9lPDM/KDA9PWU/YT1hLzEwMHwwOjE9PWUmJihhPWEvMTB8MCkscz1uPDQmJjk5OTk5PT1hfHxuPjMmJjQ5OTk5PT1hfHw1ZTQ9PWF8fDA9PWEpOnM9KG48NCYmYSsxPT1vfHxuPjMmJmErMT09by8yKSYmKHRbaSsxXS9vLzEwMHwwKT09TWQoMTAsZS0yKS0xfHwoYT09by8yfHwwPT1hKSYmISh0W2krMV0vby8xMDB8MCk6ZTw0PygwPT1lP2E9YS8xZTN8MDoxPT1lP2E9YS8xMDB8MDoyPT1lJiYoYT1hLzEwfDApLHM9KHJ8fG48NCkmJjk5OTk9PWF8fCFyJiZuPjMmJjQ5OTk9PWEpOnM9KChyfHxuPDQpJiZhKzE9PW98fCFyJiZuPjMmJmErMT09by8yKSYmKHRbaSsxXS9vLzFlM3wwKT09TWQoMTAsZS0zKS0xLHN9ZnVuY3Rpb24gcWQodCxlLG4pe2Zvcih2YXIgcixpLG89WzBdLHM9MCxhPXQubGVuZ3RoO3M8YTspe2ZvcihpPW8ubGVuZ3RoO2ktLTspb1tpXSo9ZTtmb3Iob1swXSs9X2QuaW5kZXhPZih0LmNoYXJBdChzKyspKSxyPTA7cjxvLmxlbmd0aDtyKyspb1tyXT5uLTEmJih2b2lkIDA9PT1vW3IrMV0mJihvW3IrMV09MCksb1tyKzFdKz1vW3JdL258MCxvW3JdJT1uKX1yZXR1cm4gby5yZXZlcnNlKCl9a2QuYWJzb2x1dGVWYWx1ZT1rZC5hYnM9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKTtyZXR1cm4gdC5zPDAmJih0LnM9MSksR2QodCl9LGtkLmNlaWw9ZnVuY3Rpb24oKXtyZXR1cm4gR2QobmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyksdGhpcy5lKzEsMil9LGtkLmNsYW1wZWRUbz1rZC5jbGFtcD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1uLmNvbnN0cnVjdG9yO2lmKHQ9bmV3IHIodCksZT1uZXcgcihlKSwhdC5zfHwhZS5zKXJldHVybiBuZXcgcihOYU4pO2lmKHQuZ3QoZSkpdGhyb3cgRXJyb3IoQ2QrZSk7cmV0dXJuIG4uY21wKHQpPDA/dDpuLmNtcChlKT4wP2U6bmV3IHIobil9LGtkLmNvbXBhcmVkVG89a2QuY21wPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG89dGhpcyxzPW8uZCxhPSh0PW5ldyBvLmNvbnN0cnVjdG9yKHQpKS5kLHU9by5zLGM9dC5zO2lmKCFzfHwhYSlyZXR1cm4gdSYmYz91IT09Yz91OnM9PT1hPzA6IXNedTwwPzE6LTE6TmFOO2lmKCFzWzBdfHwhYVswXSlyZXR1cm4gc1swXT91OmFbMF0/LWM6MDtpZih1IT09YylyZXR1cm4gdTtpZihvLmUhPT10LmUpcmV0dXJuIG8uZT50LmVedTwwPzE6LTE7Zm9yKGU9MCxuPShyPXMubGVuZ3RoKTwoaT1hLmxlbmd0aCk/cjppO2U8bjsrK2UpaWYoc1tlXSE9PWFbZV0pcmV0dXJuIHNbZV0+YVtlXV51PDA/MTotMTtyZXR1cm4gcj09PWk/MDpyPmledTwwPzE6LTF9LGtkLmNvc2luZT1rZC5jb3M9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIG4uZD9uLmRbMF0/KHQ9ci5wcmVjaXNpb24sZT1yLnJvdW5kaW5nLHIucHJlY2lzaW9uPXQrTWF0aC5tYXgobi5lLG4uc2QoKSkrNyxyLnJvdW5kaW5nPTEsbj1mdW5jdGlvbih0LGUpe3ZhciBuLHIsaTtpZihlLmlzWmVybygpKXJldHVybiBlO3I9ZS5kLmxlbmd0aCxyPDMyPyhuPU1hdGguY2VpbChyLzMpLGk9KDEvb2coNCxuKSkudG9TdHJpbmcoKSk6KG49MTYsaT0iMi4zMjgzMDY0MzY1Mzg2OTYyODkwNjI1ZS0xMCIpLHQucHJlY2lzaW9uKz1uLGU9aWcodCwxLGUudGltZXMoaSksbmV3IHQoMSkpO2Zvcih2YXIgbz1uO28tLTspe3ZhciBzPWUudGltZXMoZSk7ZT1zLnRpbWVzKHMpLm1pbnVzKHMpLnRpbWVzKDgpLnBsdXMoMSl9cmV0dXJuIHQucHJlY2lzaW9uLT1uLGV9KHIsc2cocixuKSksci5wcmVjaXNpb249dCxyLnJvdW5kaW5nPWUsR2QoMj09eWR8fDM9PXlkP24ubmVnKCk6bix0LGUsITApKTpuZXcgcigxKTpuZXcgcihOYU4pfSxrZC5jdWJlUm9vdD1rZC5jYnJ0PWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaSxvLHMsYSx1LGMsbD10aGlzLGg9bC5jb25zdHJ1Y3RvcjtpZighbC5pc0Zpbml0ZSgpfHxsLmlzWmVybygpKXJldHVybiBuZXcgaChsKTtmb3IoRGQ9ITEsKG89bC5zKk1kKGwucypsLDEvMykpJiZNYXRoLmFicyhvKSE9MS8wP3I9bmV3IGgoby50b1N0cmluZygpKToobj16ZChsLmQpLChvPSgodD1sLmUpLW4ubGVuZ3RoKzEpJTMpJiYobis9MT09b3x8LTI9PW8/IjAiOiIwMCIpLG89TWQobiwxLzMpLHQ9SWQoKHQrMSkvMyktKHQlMz09KHQ8MD8tMToyKSksbz09MS8wP249IjVlIit0Om49KG49by50b0V4cG9uZW50aWFsKCkpLnNsaWNlKDAsbi5pbmRleE9mKCJlIikrMSkrdCwocj1uZXcgaChuKSkucz1sLnMpLHM9KHQ9aC5wcmVjaXNpb24pKzM7OylpZihjPSh1PShhPXIpLnRpbWVzKGEpLnRpbWVzKGEpKS5wbHVzKGwpLHI9VmQoYy5wbHVzKGwpLnRpbWVzKGEpLGMucGx1cyh1KSxzKzIsMSksemQoYS5kKS5zbGljZSgwLHMpPT09KG49emQoci5kKSkuc2xpY2UoMCxzKSl7aWYoIjk5OTkiIT0obj1uLnNsaWNlKHMtMyxzKzEpKSYmKGl8fCI0OTk5IiE9bikpeyghK258fCErbi5zbGljZSgxKSYmIjUiPT1uLmNoYXJBdCgwKSkmJihHZChyLHQrMSwxKSxlPSFyLnRpbWVzKHIpLnRpbWVzKHIpLmVxKGwpKTticmVha31pZighaSYmKEdkKGEsdCsxLDApLGEudGltZXMoYSkudGltZXMoYSkuZXEobCkpKXtyPWE7YnJlYWt9cys9NCxpPTF9cmV0dXJuIERkPSEwLEdkKHIsdCxoLnJvdW5kaW5nLGUpfSxrZC5kZWNpbWFsUGxhY2VzPWtkLmRwPWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmQsbj1OYU47aWYoZSl7aWYobj03KigodD1lLmxlbmd0aC0xKS1JZCh0aGlzLmUvNykpLHQ9ZVt0XSlmb3IoO3QlMTA9PTA7dC89MTApbi0tO248MCYmKG49MCl9cmV0dXJuIG59LGtkLmRpdmlkZWRCeT1rZC5kaXY9ZnVuY3Rpb24odCl7cmV0dXJuIFZkKHRoaXMsbmV3IHRoaXMuY29uc3RydWN0b3IodCkpfSxrZC5kaXZpZGVkVG9JbnRlZ2VyQnk9a2QuZGl2VG9JbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gR2QoVmQodGhpcyxuZXcgZSh0KSwwLDEsMSksZS5wcmVjaXNpb24sZS5yb3VuZGluZyl9LGtkLmVxdWFscz1rZC5lcT1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuY21wKHQpfSxrZC5mbG9vcj1mdW5jdGlvbigpe3JldHVybiBHZChuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKSx0aGlzLmUrMSwzKX0sa2QuZ3JlYXRlclRoYW49a2QuZ3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPjB9LGtkLmdyZWF0ZXJUaGFuT3JFcXVhbFRvPWtkLmd0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNtcCh0KTtyZXR1cm4gMT09ZXx8MD09PWV9LGtkLmh5cGVyYm9saWNDb3NpbmU9a2QuY29zaD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGksbz10aGlzLHM9by5jb25zdHJ1Y3RvcixhPW5ldyBzKDEpO2lmKCFvLmlzRmluaXRlKCkpcmV0dXJuIG5ldyBzKG8ucz8xLzA6TmFOKTtpZihvLmlzWmVybygpKXJldHVybiBhO249cy5wcmVjaXNpb24scj1zLnJvdW5kaW5nLHMucHJlY2lzaW9uPW4rTWF0aC5tYXgoby5lLG8uc2QoKSkrNCxzLnJvdW5kaW5nPTEsKGk9by5kLmxlbmd0aCk8MzI/ZT0oMS9vZyg0LHQ9TWF0aC5jZWlsKGkvMykpKS50b1N0cmluZygpOih0PTE2LGU9IjIuMzI4MzA2NDM2NTM4Njk2Mjg5MDYyNWUtMTAiKSxvPWlnKHMsMSxvLnRpbWVzKGUpLG5ldyBzKDEpLCEwKTtmb3IodmFyIHUsYz10LGw9bmV3IHMoOCk7Yy0tOyl1PW8udGltZXMobyksbz1hLm1pbnVzKHUudGltZXMobC5taW51cyh1LnRpbWVzKGwpKSkpO3JldHVybiBHZChvLHMucHJlY2lzaW9uPW4scy5yb3VuZGluZz1yLCEwKX0sa2QuaHlwZXJib2xpY1NpbmU9a2Quc2luaD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9dGhpcyxvPWkuY29uc3RydWN0b3I7aWYoIWkuaXNGaW5pdGUoKXx8aS5pc1plcm8oKSlyZXR1cm4gbmV3IG8oaSk7aWYoZT1vLnByZWNpc2lvbixuPW8ucm91bmRpbmcsby5wcmVjaXNpb249ZStNYXRoLm1heChpLmUsaS5zZCgpKSs0LG8ucm91bmRpbmc9MSwocj1pLmQubGVuZ3RoKTwzKWk9aWcobywyLGksaSwhMCk7ZWxzZXt0PSh0PTEuNCpNYXRoLnNxcnQocikpPjE2PzE2OjB8dCxpPWlnKG8sMixpPWkudGltZXMoMS9vZyg1LHQpKSxpLCEwKTtmb3IodmFyIHMsYT1uZXcgbyg1KSx1PW5ldyBvKDE2KSxjPW5ldyBvKDIwKTt0LS07KXM9aS50aW1lcyhpKSxpPWkudGltZXMoYS5wbHVzKHMudGltZXModS50aW1lcyhzKS5wbHVzKGMpKSkpfXJldHVybiBvLnByZWNpc2lvbj1lLG8ucm91bmRpbmc9bixHZChpLGUsbiwhMCl9LGtkLmh5cGVyYm9saWNUYW5nZW50PWtkLnRhbmg9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIG4uaXNGaW5pdGUoKT9uLmlzWmVybygpP25ldyByKG4pOih0PXIucHJlY2lzaW9uLGU9ci5yb3VuZGluZyxyLnByZWNpc2lvbj10Kzcsci5yb3VuZGluZz0xLFZkKG4uc2luaCgpLG4uY29zaCgpLHIucHJlY2lzaW9uPXQsci5yb3VuZGluZz1lKSk6bmV3IHIobi5zKX0sa2QuaW52ZXJzZUNvc2luZT1rZC5hY29zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQuY29uc3RydWN0b3Isbj10LmFicygpLmNtcCgxKSxyPWUucHJlY2lzaW9uLGk9ZS5yb3VuZGluZztyZXR1cm4tMSE9PW4/MD09PW4/dC5pc05lZygpP0hkKGUscixpKTpuZXcgZSgwKTpuZXcgZShOYU4pOnQuaXNaZXJvKCk/SGQoZSxyKzQsaSkudGltZXMoLjUpOihlLnByZWNpc2lvbj1yKzYsZS5yb3VuZGluZz0xLHQ9bmV3IGUoMSkubWludXModCkuZGl2KHQucGx1cygxKSkuc3FydCgpLmF0YW4oKSxlLnByZWNpc2lvbj1yLGUucm91bmRpbmc9aSx0LnRpbWVzKDIpKX0sa2QuaW52ZXJzZUh5cGVyYm9saWNDb3NpbmU9a2QuYWNvc2g9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIG4ubHRlKDEpP25ldyByKG4uZXEoMSk/MDpOYU4pOm4uaXNGaW5pdGUoKT8odD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCtNYXRoLm1heChNYXRoLmFicyhuLmUpLG4uc2QoKSkrNCxyLnJvdW5kaW5nPTEsRGQ9ITEsbj1uLnRpbWVzKG4pLm1pbnVzKDEpLnNxcnQoKS5wbHVzKG4pLERkPSEwLHIucHJlY2lzaW9uPXQsci5yb3VuZGluZz1lLG4ubG4oKSk6bmV3IHIobil9LGtkLmludmVyc2VIeXBlcmJvbGljU2luZT1rZC5hc2luaD1mdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtyZXR1cm4hbi5pc0Zpbml0ZSgpfHxuLmlzWmVybygpP25ldyByKG4pOih0PXIucHJlY2lzaW9uLGU9ci5yb3VuZGluZyxyLnByZWNpc2lvbj10KzIqTWF0aC5tYXgoTWF0aC5hYnMobi5lKSxuLnNkKCkpKzYsci5yb3VuZGluZz0xLERkPSExLG49bi50aW1lcyhuKS5wbHVzKDEpLnNxcnQoKS5wbHVzKG4pLERkPSEwLHIucHJlY2lzaW9uPXQsci5yb3VuZGluZz1lLG4ubG4oKSl9LGtkLmludmVyc2VIeXBlcmJvbGljVGFuZ2VudD1rZC5hdGFuaD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9dGhpcyxvPWkuY29uc3RydWN0b3I7cmV0dXJuIGkuaXNGaW5pdGUoKT9pLmU+PTA/bmV3IG8oaS5hYnMoKS5lcSgxKT9pLnMvMDppLmlzWmVybygpP2k6TmFOKToodD1vLnByZWNpc2lvbixlPW8ucm91bmRpbmcscj1pLnNkKCksTWF0aC5tYXgocix0KTwyKi1pLmUtMT9HZChuZXcgbyhpKSx0LGUsITApOihvLnByZWNpc2lvbj1uPXItaS5lLGk9VmQoaS5wbHVzKDEpLG5ldyBvKDEpLm1pbnVzKGkpLG4rdCwxKSxvLnByZWNpc2lvbj10KzQsby5yb3VuZGluZz0xLGk9aS5sbigpLG8ucHJlY2lzaW9uPXQsby5yb3VuZGluZz1lLGkudGltZXMoLjUpKSk6bmV3IG8oTmFOKX0sa2QuaW52ZXJzZVNpbmU9a2QuYXNpbj1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9dGhpcyxvPWkuY29uc3RydWN0b3I7cmV0dXJuIGkuaXNaZXJvKCk/bmV3IG8oaSk6KGU9aS5hYnMoKS5jbXAoMSksbj1vLnByZWNpc2lvbixyPW8ucm91bmRpbmcsLTEhPT1lPzA9PT1lPygodD1IZChvLG4rNCxyKS50aW1lcyguNSkpLnM9aS5zLHQpOm5ldyBvKE5hTik6KG8ucHJlY2lzaW9uPW4rNixvLnJvdW5kaW5nPTEsaT1pLmRpdihuZXcgbygxKS5taW51cyhpLnRpbWVzKGkpKS5zcXJ0KCkucGx1cygxKSkuYXRhbigpLG8ucHJlY2lzaW9uPW4sby5yb3VuZGluZz1yLGkudGltZXMoMikpKX0sa2QuaW52ZXJzZVRhbmdlbnQ9a2QuYXRhbj1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGksbyxzLGEsdSxjPXRoaXMsbD1jLmNvbnN0cnVjdG9yLGg9bC5wcmVjaXNpb24sZj1sLnJvdW5kaW5nO2lmKGMuaXNGaW5pdGUoKSl7aWYoYy5pc1plcm8oKSlyZXR1cm4gbmV3IGwoYyk7aWYoYy5hYnMoKS5lcSgxKSYmaCs0PD1CZClyZXR1cm4ocz1IZChsLGgrNCxmKS50aW1lcyguMjUpKS5zPWMucyxzfWVsc2V7aWYoIWMucylyZXR1cm4gbmV3IGwoTmFOKTtpZihoKzQ8PUJkKXJldHVybihzPUhkKGwsaCs0LGYpLnRpbWVzKC41KSkucz1jLnMsc31mb3IobC5wcmVjaXNpb249YT1oKzEwLGwucm91bmRpbmc9MSx0PW49TWF0aC5taW4oMjgsYS83KzJ8MCk7dDstLXQpYz1jLmRpdihjLnRpbWVzKGMpLnBsdXMoMSkuc3FydCgpLnBsdXMoMSkpO2ZvcihEZD0hMSxlPU1hdGguY2VpbChhLzcpLHI9MSx1PWMudGltZXMoYykscz1uZXcgbChjKSxpPWM7LTEhPT10OylpZihpPWkudGltZXModSksbz1zLm1pbnVzKGkuZGl2KHIrPTIpKSxpPWkudGltZXModSksdm9pZCAwIT09KHM9by5wbHVzKGkuZGl2KHIrPTIpKSkuZFtlXSlmb3IodD1lO3MuZFt0XT09PW8uZFt0XSYmdC0tOyk7cmV0dXJuIG4mJihzPXMudGltZXMoMjw8bi0xKSksRGQ9ITAsR2QocyxsLnByZWNpc2lvbj1oLGwucm91bmRpbmc9ZiwhMCl9LGtkLmlzRmluaXRlPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmR9LGtkLmlzSW50ZWdlcj1rZC5pc0ludD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5kJiZJZCh0aGlzLmUvNyk+dGhpcy5kLmxlbmd0aC0yfSxrZC5pc05hTj1mdW5jdGlvbigpe3JldHVybiF0aGlzLnN9LGtkLmlzTmVnYXRpdmU9a2QuaXNOZWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zPDB9LGtkLmlzUG9zaXRpdmU9a2QuaXNQb3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zPjB9LGtkLmlzWmVybz1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5kJiYwPT09dGhpcy5kWzBdfSxrZC5sZXNzVGhhbj1rZC5sdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXAodCk8MH0sa2QubGVzc1RoYW5PckVxdWFsVG89a2QubHRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcCh0KTwxfSxrZC5sb2dhcml0aG09a2QubG9nPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhLHUsYz10aGlzLGw9Yy5jb25zdHJ1Y3RvcixoPWwucHJlY2lzaW9uLGY9bC5yb3VuZGluZztpZihudWxsPT10KXQ9bmV3IGwoMTApLGU9ITA7ZWxzZXtpZihuPSh0PW5ldyBsKHQpKS5kLHQuczwwfHwhbnx8IW5bMF18fHQuZXEoMSkpcmV0dXJuIG5ldyBsKE5hTik7ZT10LmVxKDEwKX1pZihuPWMuZCxjLnM8MHx8IW58fCFuWzBdfHxjLmVxKDEpKXJldHVybiBuZXcgbChuJiYhblswXT8tMS8wOjEhPWMucz9OYU46bj8wOjEvMCk7aWYoZSlpZihuLmxlbmd0aD4xKW89ITA7ZWxzZXtmb3IoaT1uWzBdO2klMTA9PTA7KWkvPTEwO289MSE9PWl9aWYoRGQ9ITEscz1lZyhjLGE9aCs1KSxyPWU/V2QobCxhKzEwKTplZyh0LGEpLFVkKCh1PVZkKHMscixhLDEpKS5kLGk9aCxmKSlkb3tpZihzPWVnKGMsYSs9MTApLHI9ZT9XZChsLGErMTApOmVnKHQsYSksdT1WZChzLHIsYSwxKSwhbyl7K3pkKHUuZCkuc2xpY2UoaSsxLGkrMTUpKzE9PTFlMTQmJih1PUdkKHUsaCsxLDApKTticmVha319d2hpbGUoVWQodS5kLGkrPTEwLGYpKTtyZXR1cm4gRGQ9ITAsR2QodSxoLGYpfSxrZC5taW51cz1rZC5zdWI9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxzLGEsdSxjLGwsaCxmLHA9dGhpcyxkPXAuY29uc3RydWN0b3I7aWYodD1uZXcgZCh0KSwhcC5kfHwhdC5kKXJldHVybiBwLnMmJnQucz9wLmQ/dC5zPS10LnM6dD1uZXcgZCh0LmR8fHAucyE9PXQucz9wOk5hTik6dD1uZXcgZChOYU4pLHQ7aWYocC5zIT10LnMpcmV0dXJuIHQucz0tdC5zLHAucGx1cyh0KTtpZihjPXAuZCxmPXQuZCxhPWQucHJlY2lzaW9uLHU9ZC5yb3VuZGluZywhY1swXXx8IWZbMF0pe2lmKGZbMF0pdC5zPS10LnM7ZWxzZXtpZighY1swXSlyZXR1cm4gbmV3IGQoMz09PXU/LTA6MCk7dD1uZXcgZChwKX1yZXR1cm4gRGQ/R2QodCxhLHUpOnR9aWYobj1JZCh0LmUvNyksbD1JZChwLmUvNyksYz1jLnNsaWNlKCksbz1sLW4pe2ZvcigoaD1vPDApPyhlPWMsbz0tbyxzPWYubGVuZ3RoKTooZT1mLG49bCxzPWMubGVuZ3RoKSxvPihyPU1hdGgubWF4KE1hdGguY2VpbChhLzcpLHMpKzIpJiYobz1yLGUubGVuZ3RoPTEpLGUucmV2ZXJzZSgpLHI9bztyLS07KWUucHVzaCgwKTtlLnJldmVyc2UoKX1lbHNle2ZvcigoaD0ocj1jLmxlbmd0aCk8KHM9Zi5sZW5ndGgpKSYmKHM9cikscj0wO3I8cztyKyspaWYoY1tyXSE9ZltyXSl7aD1jW3JdPGZbcl07YnJlYWt9bz0wfWZvcihoJiYoZT1jLGM9ZixmPWUsdC5zPS10LnMpLHM9Yy5sZW5ndGgscj1mLmxlbmd0aC1zO3I+MDstLXIpY1tzKytdPTA7Zm9yKHI9Zi5sZW5ndGg7cj5vOyl7aWYoY1stLXJdPGZbcl0pe2ZvcihpPXI7aSYmMD09PWNbLS1pXTspY1tpXT1QZC0xOy0tY1tpXSxjW3JdKz1QZH1jW3JdLT1mW3JdfWZvcig7MD09PWNbLS1zXTspYy5wb3AoKTtmb3IoOzA9PT1jWzBdO2Muc2hpZnQoKSktLW47cmV0dXJuIGNbMF0/KHQuZD1jLHQuZT1YZChjLG4pLERkP0dkKHQsYSx1KTp0KTpuZXcgZCgzPT09dT8tMDowKX0sa2QubW9kdWxvPWtkLm1vZD1mdW5jdGlvbih0KXt2YXIgZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiB0PW5ldyByKHQpLCFuLmR8fCF0LnN8fHQuZCYmIXQuZFswXT9uZXcgcihOYU4pOiF0LmR8fG4uZCYmIW4uZFswXT9HZChuZXcgcihuKSxyLnByZWNpc2lvbixyLnJvdW5kaW5nKTooRGQ9ITEsOT09ci5tb2R1bG8/KGU9VmQobix0LmFicygpLDAsMywxKSkucyo9dC5zOmU9VmQobix0LDAsci5tb2R1bG8sMSksZT1lLnRpbWVzKHQpLERkPSEwLG4ubWludXMoZSkpfSxrZC5uYXR1cmFsRXhwb25lbnRpYWw9a2QuZXhwPWZ1bmN0aW9uKCl7cmV0dXJuIHRnKHRoaXMpfSxrZC5uYXR1cmFsTG9nYXJpdGhtPWtkLmxuPWZ1bmN0aW9uKCl7cmV0dXJuIGVnKHRoaXMpfSxrZC5uZWdhdGVkPWtkLm5lZz1mdW5jdGlvbigpe3ZhciB0PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpO3JldHVybiB0LnM9LXQucyxHZCh0KX0sa2QucGx1cz1rZC5hZGQ9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxzLGEsdSxjLGwsaD10aGlzLGY9aC5jb25zdHJ1Y3RvcjtpZih0PW5ldyBmKHQpLCFoLmR8fCF0LmQpcmV0dXJuIGgucyYmdC5zP2guZHx8KHQ9bmV3IGYodC5kfHxoLnM9PT10LnM/aDpOYU4pKTp0PW5ldyBmKE5hTiksdDtpZihoLnMhPXQucylyZXR1cm4gdC5zPS10LnMsaC5taW51cyh0KTtpZihjPWguZCxsPXQuZCxhPWYucHJlY2lzaW9uLHU9Zi5yb3VuZGluZywhY1swXXx8IWxbMF0pcmV0dXJuIGxbMF18fCh0PW5ldyBmKGgpKSxEZD9HZCh0LGEsdSk6dDtpZihvPUlkKGguZS83KSxyPUlkKHQuZS83KSxjPWMuc2xpY2UoKSxpPW8tcil7Zm9yKGk8MD8obj1jLGk9LWkscz1sLmxlbmd0aCk6KG49bCxyPW8scz1jLmxlbmd0aCksaT4ocz0obz1NYXRoLmNlaWwoYS83KSk+cz9vKzE6cysxKSYmKGk9cyxuLmxlbmd0aD0xKSxuLnJldmVyc2UoKTtpLS07KW4ucHVzaCgwKTtuLnJldmVyc2UoKX1mb3IoKHM9Yy5sZW5ndGgpLShpPWwubGVuZ3RoKTwwJiYoaT1zLG49bCxsPWMsYz1uKSxlPTA7aTspZT0oY1stLWldPWNbaV0rbFtpXStlKS9QZHwwLGNbaV0lPVBkO2ZvcihlJiYoYy51bnNoaWZ0KGUpLCsrcikscz1jLmxlbmd0aDswPT1jWy0tc107KWMucG9wKCk7cmV0dXJuIHQuZD1jLHQuZT1YZChjLHIpLERkP0dkKHQsYSx1KTp0fSxrZC5wcmVjaXNpb249a2Quc2Q9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO2lmKHZvaWQgMCE9PXQmJnQhPT0hIXQmJjEhPT10JiYwIT09dCl0aHJvdyBFcnJvcihDZCt0KTtyZXR1cm4gbi5kPyhlPVpkKG4uZCksdCYmbi5lKzE+ZSYmKGU9bi5lKzEpKTplPU5hTixlfSxrZC5yb3VuZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10LmNvbnN0cnVjdG9yO3JldHVybiBHZChuZXcgZSh0KSx0LmUrMSxlLnJvdW5kaW5nKX0sa2Quc2luZT1rZC5zaW49ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIG4uaXNGaW5pdGUoKT9uLmlzWmVybygpP25ldyByKG4pOih0PXIucHJlY2lzaW9uLGU9ci5yb3VuZGluZyxyLnByZWNpc2lvbj10K01hdGgubWF4KG4uZSxuLnNkKCkpKzcsci5yb3VuZGluZz0xLG49ZnVuY3Rpb24odCxlKXt2YXIgbixyPWUuZC5sZW5ndGg7aWYocjwzKXJldHVybiBlLmlzWmVybygpP2U6aWcodCwyLGUsZSk7bj0xLjQqTWF0aC5zcXJ0KHIpLG49bj4xNj8xNjowfG4sZT1lLnRpbWVzKDEvb2coNSxuKSksZT1pZyh0LDIsZSxlKTtmb3IodmFyIGksbz1uZXcgdCg1KSxzPW5ldyB0KDE2KSxhPW5ldyB0KDIwKTtuLS07KWk9ZS50aW1lcyhlKSxlPWUudGltZXMoby5wbHVzKGkudGltZXMocy50aW1lcyhpKS5taW51cyhhKSkpKTtyZXR1cm4gZX0ocixzZyhyLG4pKSxyLnByZWNpc2lvbj10LHIucm91bmRpbmc9ZSxHZCh5ZD4yP24ubmVnKCk6bix0LGUsITApKTpuZXcgcihOYU4pfSxrZC5zcXVhcmVSb290PWtkLnNxcnQ9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpLG8scz10aGlzLGE9cy5kLHU9cy5lLGM9cy5zLGw9cy5jb25zdHJ1Y3RvcjtpZigxIT09Y3x8IWF8fCFhWzBdKXJldHVybiBuZXcgbCghY3x8YzwwJiYoIWF8fGFbMF0pP05hTjphP3M6MS8wKTtmb3IoRGQ9ITEsMD09KGM9TWF0aC5zcXJ0KCtzKSl8fGM9PTEvMD8oKChlPXpkKGEpKS5sZW5ndGgrdSklMj09MCYmKGUrPSIwIiksYz1NYXRoLnNxcnQoZSksdT1JZCgodSsxKS8yKS0odTwwfHx1JTIpLGM9PTEvMD9lPSI1ZSIrdTplPShlPWMudG9FeHBvbmVudGlhbCgpKS5zbGljZSgwLGUuaW5kZXhPZigiZSIpKzEpK3Uscj1uZXcgbChlKSk6cj1uZXcgbChjLnRvU3RyaW5nKCkpLG49KHU9bC5wcmVjaXNpb24pKzM7OylpZihyPShvPXIpLnBsdXMoVmQocyxvLG4rMiwxKSkudGltZXMoLjUpLHpkKG8uZCkuc2xpY2UoMCxuKT09PShlPXpkKHIuZCkpLnNsaWNlKDAsbikpe2lmKCI5OTk5IiE9KGU9ZS5zbGljZShuLTMsbisxKSkmJihpfHwiNDk5OSIhPWUpKXsoIStlfHwhK2Uuc2xpY2UoMSkmJiI1Ij09ZS5jaGFyQXQoMCkpJiYoR2Qocix1KzEsMSksdD0hci50aW1lcyhyKS5lcShzKSk7YnJlYWt9aWYoIWkmJihHZChvLHUrMSwwKSxvLnRpbWVzKG8pLmVxKHMpKSl7cj1vO2JyZWFrfW4rPTQsaT0xfXJldHVybiBEZD0hMCxHZChyLHUsbC5yb3VuZGluZyx0KX0sa2QudGFuZ2VudD1rZC50YW49ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIG4uaXNGaW5pdGUoKT9uLmlzWmVybygpP25ldyByKG4pOih0PXIucHJlY2lzaW9uLGU9ci5yb3VuZGluZyxyLnByZWNpc2lvbj10KzEwLHIucm91bmRpbmc9MSwobj1uLnNpbigpKS5zPTEsbj1WZChuLG5ldyByKDEpLm1pbnVzKG4udGltZXMobikpLnNxcnQoKSx0KzEwLDApLHIucHJlY2lzaW9uPXQsci5yb3VuZGluZz1lLEdkKDI9PXlkfHw0PT15ZD9uLm5lZygpOm4sdCxlLCEwKSk6bmV3IHIoTmFOKX0sa2QudGltZXM9a2QubXVsPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhLHUsYyxsPXRoaXMsaD1sLmNvbnN0cnVjdG9yLGY9bC5kLHA9KHQ9bmV3IGgodCkpLmQ7aWYodC5zKj1sLnMsIShmJiZmWzBdJiZwJiZwWzBdKSlyZXR1cm4gbmV3IGgoIXQuc3x8ZiYmIWZbMF0mJiFwfHxwJiYhcFswXSYmIWY/TmFOOmYmJnA/MCp0LnM6dC5zLzApO2ZvcihuPUlkKGwuZS83KStJZCh0LmUvNyksKHU9Zi5sZW5ndGgpPChjPXAubGVuZ3RoKSYmKG89ZixmPXAscD1vLHM9dSx1PWMsYz1zKSxvPVtdLHI9cz11K2M7ci0tOylvLnB1c2goMCk7Zm9yKHI9YzstLXI+PTA7KXtmb3IoZT0wLGk9dStyO2k+cjspYT1vW2ldK3Bbcl0qZltpLXItMV0rZSxvW2ktLV09YSVQZHwwLGU9YS9QZHwwO29baV09KG9baV0rZSklUGR8MH1mb3IoOyFvWy0tc107KW8ucG9wKCk7cmV0dXJuIGU/KytuOm8uc2hpZnQoKSx0LmQ9byx0LmU9WGQobyxuKSxEZD9HZCh0LGgucHJlY2lzaW9uLGgucm91bmRpbmcpOnR9LGtkLnRvQmluYXJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFnKHRoaXMsMix0LGUpfSxrZC50b0RlY2ltYWxQbGFjZXM9a2QudG9EUD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuPW5ldyByKG4pLHZvaWQgMD09PXQ/bjooamQodCwwLHZkKSx2b2lkIDA9PT1lP2U9ci5yb3VuZGluZzpqZChlLDAsOCksR2Qobix0K24uZSsxLGUpKX0sa2QudG9FeHBvbmVudGlhbD1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dGhpcyxpPXIuY29uc3RydWN0b3I7cmV0dXJuIHZvaWQgMD09PXQ/bj1ZZChyLCEwKTooamQodCwwLHZkKSx2b2lkIDA9PT1lP2U9aS5yb3VuZGluZzpqZChlLDAsOCksbj1ZZChyPUdkKG5ldyBpKHIpLHQrMSxlKSwhMCx0KzEpKSxyLmlzTmVnKCkmJiFyLmlzWmVybygpPyItIituOm59LGtkLnRvRml4ZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk9dGhpcyxvPWkuY29uc3RydWN0b3I7cmV0dXJuIHZvaWQgMD09PXQ/bj1ZZChpKTooamQodCwwLHZkKSx2b2lkIDA9PT1lP2U9by5yb3VuZGluZzpqZChlLDAsOCksbj1ZZChyPUdkKG5ldyBvKGkpLHQraS5lKzEsZSksITEsdCtyLmUrMSkpLGkuaXNOZWcoKSYmIWkuaXNaZXJvKCk/Ii0iK246bn0sa2QudG9GcmFjdGlvbj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGMsbCxoLGYscD10aGlzLGQ9cC5kLGc9cC5jb25zdHJ1Y3RvcjtpZighZClyZXR1cm4gbmV3IGcocCk7aWYoYz1uPW5ldyBnKDEpLHI9dT1uZXcgZygwKSxzPShvPShlPW5ldyBnKHIpKS5lPVpkKGQpLXAuZS0xKSU3LGUuZFswXT1NZCgxMCxzPDA/NytzOnMpLG51bGw9PXQpdD1vPjA/ZTpjO2Vsc2V7aWYoIShhPW5ldyBnKHQpKS5pc0ludCgpfHxhLmx0KGMpKXRocm93IEVycm9yKENkK2EpO3Q9YS5ndChlKT9vPjA/ZTpjOmF9Zm9yKERkPSExLGE9bmV3IGcoemQoZCkpLGw9Zy5wcmVjaXNpb24sZy5wcmVjaXNpb249bz03KmQubGVuZ3RoKjI7aD1WZChhLGUsMCwxLDEpLDEhPShpPW4ucGx1cyhoLnRpbWVzKHIpKSkuY21wKHQpOyluPXIscj1pLGk9YyxjPXUucGx1cyhoLnRpbWVzKGkpKSx1PWksaT1lLGU9YS5taW51cyhoLnRpbWVzKGkpKSxhPWk7cmV0dXJuIGk9VmQodC5taW51cyhuKSxyLDAsMSwxKSx1PXUucGx1cyhpLnRpbWVzKGMpKSxuPW4ucGx1cyhpLnRpbWVzKHIpKSx1LnM9Yy5zPXAucyxmPVZkKGMscixvLDEpLm1pbnVzKHApLmFicygpLmNtcChWZCh1LG4sbywxKS5taW51cyhwKS5hYnMoKSk8MT9bYyxyXTpbdSxuXSxnLnByZWNpc2lvbj1sLERkPSEwLGZ9LGtkLnRvSGV4YWRlY2ltYWw9a2QudG9IZXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWcodGhpcywxNix0LGUpfSxrZC50b05lYXJlc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtpZihuPW5ldyByKG4pLG51bGw9PXQpe2lmKCFuLmQpcmV0dXJuIG47dD1uZXcgcigxKSxlPXIucm91bmRpbmd9ZWxzZXtpZih0PW5ldyByKHQpLHZvaWQgMD09PWU/ZT1yLnJvdW5kaW5nOmpkKGUsMCw4KSwhbi5kKXJldHVybiB0LnM/bjp0O2lmKCF0LmQpcmV0dXJuIHQucyYmKHQucz1uLnMpLHR9cmV0dXJuIHQuZFswXT8oRGQ9ITEsbj1WZChuLHQsMCxlLDEpLnRpbWVzKHQpLERkPSEwLEdkKG4pKToodC5zPW4ucyxuPXQpLG59LGtkLnRvTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuK3RoaXN9LGtkLnRvT2N0YWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWcodGhpcyw4LHQsZSl9LGtkLnRvUG93ZXI9a2QucG93PWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhPXRoaXMsdT1hLmNvbnN0cnVjdG9yLGM9Kyh0PW5ldyB1KHQpKTtpZighKGEuZCYmdC5kJiZhLmRbMF0mJnQuZFswXSkpcmV0dXJuIG5ldyB1KE1kKCthLGMpKTtpZigoYT1uZXcgdShhKSkuZXEoMSkpcmV0dXJuIGE7aWYocj11LnByZWNpc2lvbixvPXUucm91bmRpbmcsdC5lcSgxKSlyZXR1cm4gR2QoYSxyLG8pO2lmKChlPUlkKHQuZS83KSk+PXQuZC5sZW5ndGgtMSYmKG49YzwwPy1jOmMpPD05MDA3MTk5MjU0NzQwOTkxKXJldHVybiBpPUpkKHUsYSxuLHIpLHQuczwwP25ldyB1KDEpLmRpdihpKTpHZChpLHIsbyk7aWYoKHM9YS5zKTwwKXtpZihlPHQuZC5sZW5ndGgtMSlyZXR1cm4gbmV3IHUoTmFOKTtpZighKDEmdC5kW2VdKSYmKHM9MSksMD09YS5lJiYxPT1hLmRbMF0mJjE9PWEuZC5sZW5ndGgpcmV0dXJuIGEucz1zLGF9cmV0dXJuKGU9MCE9KG49TWQoK2EsYykpJiZpc0Zpbml0ZShuKT9uZXcgdShuKyIiKS5lOklkKGMqKE1hdGgubG9nKCIwLiIremQoYS5kKSkvTWF0aC5MTjEwK2EuZSsxKSkpPnUubWF4RSsxfHxlPHUubWluRS0xP25ldyB1KGU+MD9zLzA6MCk6KERkPSExLHUucm91bmRpbmc9YS5zPTEsbj1NYXRoLm1pbigxMiwoZSsiIikubGVuZ3RoKSwoaT10Zyh0LnRpbWVzKGVnKGEscituKSkscikpLmQmJihVZCgoaT1HZChpLHIrNSwxKSkuZCxyLG8pJiYoZT1yKzEwLCt6ZCgoaT1HZCh0Zyh0LnRpbWVzKGVnKGEsZStuKSksZSksZSs1LDEpKS5kKS5zbGljZShyKzEscisxNSkrMT09MWUxNCYmKGk9R2QoaSxyKzEsMCkpKSksaS5zPXMsRGQ9ITAsdS5yb3VuZGluZz1vLEdkKGkscixvKSl9LGtkLnRvUHJlY2lzaW9uPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj10aGlzLGk9ci5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09dD9uPVlkKHIsci5lPD1pLnRvRXhwTmVnfHxyLmU+PWkudG9FeHBQb3MpOihqZCh0LDEsdmQpLHZvaWQgMD09PWU/ZT1pLnJvdW5kaW5nOmpkKGUsMCw4KSxuPVlkKHI9R2QobmV3IGkociksdCxlKSx0PD1yLmV8fHIuZTw9aS50b0V4cE5lZyx0KSksci5pc05lZygpJiYhci5pc1plcm8oKT8iLSIrbjpufSxrZC50b1NpZ25pZmljYW50RGlnaXRzPWtkLnRvU0Q9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT10Pyh0PW4ucHJlY2lzaW9uLGU9bi5yb3VuZGluZyk6KGpkKHQsMSx2ZCksdm9pZCAwPT09ZT9lPW4ucm91bmRpbmc6amQoZSwwLDgpKSxHZChuZXcgbih0aGlzKSx0LGUpfSxrZC50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10LmNvbnN0cnVjdG9yLG49WWQodCx0LmU8PWUudG9FeHBOZWd8fHQuZT49ZS50b0V4cFBvcyk7cmV0dXJuIHQuaXNOZWcoKSYmIXQuaXNaZXJvKCk/Ii0iK246bn0sa2QudHJ1bmNhdGVkPWtkLnRydW5jPWZ1bmN0aW9uKCl7cmV0dXJuIEdkKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpLHRoaXMuZSsxLDEpfSxrZC52YWx1ZU9mPWtkLnRvSlNPTj1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10LmNvbnN0cnVjdG9yLG49WWQodCx0LmU8PWUudG9FeHBOZWd8fHQuZT49ZS50b0V4cFBvcyk7cmV0dXJuIHQuaXNOZWcoKT8iLSIrbjpufTt2YXIgVmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt2YXIgcixpPTAsbz10Lmxlbmd0aDtmb3IodD10LnNsaWNlKCk7by0tOylyPXRbb10qZStpLHRbb109ciVufDAsaT1yL258MDtyZXR1cm4gaSYmdC51bnNoaWZ0KGkpLHR9ZnVuY3Rpb24gZSh0LGUsbixyKXt2YXIgaSxvO2lmKG4hPXIpbz1uPnI/MTotMTtlbHNlIGZvcihpPW89MDtpPG47aSsrKWlmKHRbaV0hPWVbaV0pe289dFtpXT5lW2ldPzE6LTE7YnJlYWt9cmV0dXJuIG99ZnVuY3Rpb24gbih0LGUsbixyKXtmb3IodmFyIGk9MDtuLS07KXRbbl0tPWksaT10W25dPGVbbl0/MTowLHRbbl09aSpyK3Rbbl0tZVtuXTtmb3IoOyF0WzBdJiZ0Lmxlbmd0aD4xOyl0LnNoaWZ0KCl9cmV0dXJuIGZ1bmN0aW9uKHIsaSxvLHMsYSx1KXt2YXIgYyxsLGgsZixwLGQsZyx5LG0sdixfLHgsdyxiLEQsRSxDLFMsQSxOLEk9ci5jb25zdHJ1Y3RvcixNPXIucz09aS5zPzE6LTEsRj1yLmQsVD1pLmQ7aWYoIShGJiZGWzBdJiZUJiZUWzBdKSlyZXR1cm4gbmV3IEkoci5zJiZpLnMmJihGPyFUfHxGWzBdIT1UWzBdOlQpP0YmJjA9PUZbMF18fCFUPzAqTTpNLzA6TmFOKTtmb3IodT8ocD0xLGw9ci5lLWkuZSk6KHU9UGQscD03LGw9SWQoci5lL3ApLUlkKGkuZS9wKSksQT1ULmxlbmd0aCxDPUYubGVuZ3RoLHY9KG09bmV3IEkoTSkpLmQ9W10saD0wO1RbaF09PShGW2hdfHwwKTtoKyspO2lmKFRbaF0+KEZbaF18fDApJiZsLS0sbnVsbD09bz8oYj1vPUkucHJlY2lzaW9uLHM9SS5yb3VuZGluZyk6Yj1hP28rKHIuZS1pLmUpKzE6byxiPDApdi5wdXNoKDEpLGQ9ITA7ZWxzZXtpZihiPWIvcCsyfDAsaD0wLDE9PUEpe2ZvcihmPTAsVD1UWzBdLGIrKzsoaDxDfHxmKSYmYi0tO2grKylEPWYqdSsoRltoXXx8MCksdltoXT1EL1R8MCxmPUQlVHwwO2Q9Znx8aDxDfWVsc2V7Zm9yKChmPXUvKFRbMF0rMSl8MCk+MSYmKFQ9dChULGYsdSksRj10KEYsZix1KSxBPVQubGVuZ3RoLEM9Ri5sZW5ndGgpLEU9QSx4PShfPUYuc2xpY2UoMCxBKSkubGVuZ3RoO3g8QTspX1t4KytdPTA7KE49VC5zbGljZSgpKS51bnNoaWZ0KDApLFM9VFswXSxUWzFdPj11LzImJisrUztkb3tmPTAsKGM9ZShULF8sQSx4KSk8MD8odz1fWzBdLEEhPXgmJih3PXcqdSsoX1sxXXx8MCkpLChmPXcvU3wwKT4xPyhmPj11JiYoZj11LTEpLDE9PShjPWUoZz10KFQsZix1KSxfLHk9Zy5sZW5ndGgseD1fLmxlbmd0aCkpJiYoZi0tLG4oZyxBPHk/TjpULHksdSkpKTooMD09ZiYmKGM9Zj0xKSxnPVQuc2xpY2UoKSksKHk9Zy5sZW5ndGgpPHgmJmcudW5zaGlmdCgwKSxuKF8sZyx4LHUpLC0xPT1jJiYoKGM9ZShULF8sQSx4PV8ubGVuZ3RoKSk8MSYmKGYrKyxuKF8sQTx4P046VCx4LHUpKSkseD1fLmxlbmd0aCk6MD09PWMmJihmKyssXz1bMF0pLHZbaCsrXT1mLGMmJl9bMF0/X1t4KytdPUZbRV18fDA6KF89W0ZbRV1dLHg9MSl9d2hpbGUoKEUrKzxDfHx2b2lkIDAhPT1fWzBdKSYmYi0tKTtkPXZvaWQgMCE9PV9bMF19dlswXXx8di5zaGlmdCgpfWlmKDE9PXApbS5lPWwsZ2Q9ZDtlbHNle2ZvcihoPTEsZj12WzBdO2Y+PTEwO2YvPTEwKWgrKzttLmU9aCtsKnAtMSxHZChtLGE/byttLmUrMTpvLHMsZCl9cmV0dXJuIG19fSgpO2Z1bmN0aW9uIEdkKHQsZSxuLHIpe3ZhciBpLG8scyxhLHUsYyxsLGgsZixwPXQuY29uc3RydWN0b3I7dDppZihudWxsIT1lKXtpZighKGg9dC5kKSlyZXR1cm4gdDtmb3IoaT0xLGE9aFswXTthPj0xMDthLz0xMClpKys7aWYoKG89ZS1pKTwwKW8rPTcscz1lLHU9KGw9aFtmPTBdKS9NZCgxMCxpLXMtMSklMTB8MDtlbHNlIGlmKChmPU1hdGguY2VpbCgobysxKS83KSk+PShhPWgubGVuZ3RoKSl7aWYoIXIpYnJlYWsgdDtmb3IoO2ErKzw9ZjspaC5wdXNoKDApO2w9dT0wLGk9MSxzPShvJT03KS03KzF9ZWxzZXtmb3IobD1hPWhbZl0saT0xO2E+PTEwO2EvPTEwKWkrKzt1PShzPShvJT03KS03K2kpPDA/MDpsL01kKDEwLGktcy0xKSUxMHwwfWlmKHI9cnx8ZTwwfHx2b2lkIDAhPT1oW2YrMV18fChzPDA/bDpsJU1kKDEwLGktcy0xKSksYz1uPDQ/KHV8fHIpJiYoMD09bnx8bj09KHQuczwwPzM6MikpOnU+NXx8NT09dSYmKDQ9PW58fHJ8fDY9PW4mJihvPjA/cz4wP2wvTWQoMTAsaS1zKTowOmhbZi0xXSklMTAmMXx8bj09KHQuczwwPzg6NykpLGU8MXx8IWhbMF0pcmV0dXJuIGgubGVuZ3RoPTAsYz8oZS09dC5lKzEsaFswXT1NZCgxMCwoNy1lJTcpJTcpLHQuZT0tZXx8MCk6aFswXT10LmU9MCx0O2lmKDA9PW8/KGgubGVuZ3RoPWYsYT0xLGYtLSk6KGgubGVuZ3RoPWYrMSxhPU1kKDEwLDctbyksaFtmXT1zPjA/KGwvTWQoMTAsaS1zKSVNZCgxMCxzKXwwKSphOjApLGMpZm9yKDs7KXtpZigwPT1mKXtmb3Iobz0xLHM9aFswXTtzPj0xMDtzLz0xMClvKys7Zm9yKHM9aFswXSs9YSxhPTE7cz49MTA7cy89MTApYSsrO28hPWEmJih0LmUrKyxoWzBdPT1QZCYmKGhbMF09MSkpO2JyZWFrfWlmKGhbZl0rPWEsaFtmXSE9UGQpYnJlYWs7aFtmLS1dPTAsYT0xfWZvcihvPWgubGVuZ3RoOzA9PT1oWy0tb107KWgucG9wKCl9cmV0dXJuIERkJiYodC5lPnAubWF4RT8odC5kPW51bGwsdC5lPU5hTik6dC5lPHAubWluRSYmKHQuZT0wLHQuZD1bMF0pKSx0fWZ1bmN0aW9uIFlkKHQsZSxuKXtpZighdC5pc0Zpbml0ZSgpKXJldHVybiBuZyh0KTt2YXIgcixpPXQuZSxvPXpkKHQuZCkscz1vLmxlbmd0aDtyZXR1cm4gZT8obiYmKHI9bi1zKT4wP289by5jaGFyQXQoMCkrIi4iK28uc2xpY2UoMSkrS2Qocik6cz4xJiYobz1vLmNoYXJBdCgwKSsiLiIrby5zbGljZSgxKSksbz1vKyh0LmU8MD8iZSI6ImUrIikrdC5lKTppPDA/KG89IjAuIitLZCgtaS0xKStvLG4mJihyPW4tcyk+MCYmKG8rPUtkKHIpKSk6aT49cz8obys9S2QoaSsxLXMpLG4mJihyPW4taS0xKT4wJiYobz1vKyIuIitLZChyKSkpOigocj1pKzEpPHMmJihvPW8uc2xpY2UoMCxyKSsiLiIrby5zbGljZShyKSksbiYmKHI9bi1zKT4wJiYoaSsxPT09cyYmKG8rPSIuIiksbys9S2QocikpKSxvfWZ1bmN0aW9uIFhkKHQsZSl7dmFyIG49dFswXTtmb3IoZSo9NztuPj0xMDtuLz0xMCllKys7cmV0dXJuIGV9ZnVuY3Rpb24gV2QodCxlLG4pe2lmKGU+UmQpdGhyb3cgRGQ9ITAsbiYmKHQucHJlY2lzaW9uPW4pLEVycm9yKFNkKTtyZXR1cm4gR2QobmV3IHQoeGQpLGUsMSwhMCl9ZnVuY3Rpb24gSGQodCxlLG4pe2lmKGU+QmQpdGhyb3cgRXJyb3IoU2QpO3JldHVybiBHZChuZXcgdCh3ZCksZSxuLCEwKX1mdW5jdGlvbiBaZCh0KXt2YXIgZT10Lmxlbmd0aC0xLG49NyplKzE7aWYoZT10W2VdKXtmb3IoO2UlMTA9PTA7ZS89MTApbi0tO2ZvcihlPXRbMF07ZT49MTA7ZS89MTApbisrfXJldHVybiBufWZ1bmN0aW9uIEtkKHQpe2Zvcih2YXIgZT0iIjt0LS07KWUrPSIwIjtyZXR1cm4gZX1mdW5jdGlvbiBKZCh0LGUsbixyKXt2YXIgaSxvPW5ldyB0KDEpLHM9TWF0aC5jZWlsKHIvNys0KTtmb3IoRGQ9ITE7Oyl7aWYobiUyJiYodWcoKG89by50aW1lcyhlKSkuZCxzKSYmKGk9ITApKSwwPT09KG49SWQobi8yKSkpe249by5kLmxlbmd0aC0xLGkmJjA9PT1vLmRbbl0mJisrby5kW25dO2JyZWFrfXVnKChlPWUudGltZXMoZSkpLmQscyl9cmV0dXJuIERkPSEwLG99ZnVuY3Rpb24gUWQodCl7cmV0dXJuIDEmdC5kW3QuZC5sZW5ndGgtMV19ZnVuY3Rpb24gJGQodCxlLG4pe2Zvcih2YXIgcixpLG89bmV3IHQoZVswXSkscz0wOysrczxlLmxlbmd0aDspe2lmKCEoaT1uZXcgdChlW3NdKSkucyl7bz1pO2JyZWFrfSgocj1vLmNtcChpKSk9PT1ufHwwPT09ciYmby5zPT09bikmJihvPWkpfXJldHVybiBvfWZ1bmN0aW9uIHRnKHQsZSl7dmFyIG4scixpLG8scyxhLHUsYz0wLGw9MCxoPTAsZj10LmNvbnN0cnVjdG9yLHA9Zi5yb3VuZGluZyxkPWYucHJlY2lzaW9uO2lmKCF0LmR8fCF0LmRbMF18fHQuZT4xNylyZXR1cm4gbmV3IGYodC5kP3QuZFswXT90LnM8MD8wOjEvMDoxOnQucz90LnM8MD8wOnQ6TmFOKTtmb3IobnVsbD09ZT8oRGQ9ITEsdT1kKTp1PWUsYT1uZXcgZiguMDMxMjUpO3QuZT4tMjspdD10LnRpbWVzKGEpLGgrPTU7Zm9yKHUrPXI9TWF0aC5sb2coTWQoMixoKSkvTWF0aC5MTjEwKjIrNXwwLG49bz1zPW5ldyBmKDEpLGYucHJlY2lzaW9uPXU7Oyl7aWYobz1HZChvLnRpbWVzKHQpLHUsMSksbj1uLnRpbWVzKCsrbCksemQoKGE9cy5wbHVzKFZkKG8sbix1LDEpKSkuZCkuc2xpY2UoMCx1KT09PXpkKHMuZCkuc2xpY2UoMCx1KSl7Zm9yKGk9aDtpLS07KXM9R2Qocy50aW1lcyhzKSx1LDEpO2lmKG51bGwhPWUpcmV0dXJuIGYucHJlY2lzaW9uPWQscztpZighKGM8MyYmVWQocy5kLHUtcixwLGMpKSlyZXR1cm4gR2QocyxmLnByZWNpc2lvbj1kLHAsRGQ9ITApO2YucHJlY2lzaW9uPXUrPTEwLG49bz1hPW5ldyBmKDEpLGw9MCxjKyt9cz1hfX1mdW5jdGlvbiBlZyh0LGUpe3ZhciBuLHIsaSxvLHMsYSx1LGMsbCxoLGYscD0xLGQ9dCxnPWQuZCx5PWQuY29uc3RydWN0b3IsbT15LnJvdW5kaW5nLHY9eS5wcmVjaXNpb247aWYoZC5zPDB8fCFnfHwhZ1swXXx8IWQuZSYmMT09Z1swXSYmMT09Zy5sZW5ndGgpcmV0dXJuIG5ldyB5KGcmJiFnWzBdPy0xLzA6MSE9ZC5zP05hTjpnPzA6ZCk7aWYobnVsbD09ZT8oRGQ9ITEsbD12KTpsPWUseS5wcmVjaXNpb249bCs9MTAscj0obj16ZChnKSkuY2hhckF0KDApLCEoTWF0aC5hYnMobz1kLmUpPDE1ZTE0KSlyZXR1cm4gYz1XZCh5LGwrMix2KS50aW1lcyhvKyIiKSxkPWVnKG5ldyB5KHIrIi4iK24uc2xpY2UoMSkpLGwtMTApLnBsdXMoYykseS5wcmVjaXNpb249dixudWxsPT1lP0dkKGQsdixtLERkPSEwKTpkO2Zvcig7cjw3JiYxIT1yfHwxPT1yJiZuLmNoYXJBdCgxKT4zOylyPShuPXpkKChkPWQudGltZXModCkpLmQpKS5jaGFyQXQoMCkscCsrO2ZvcihvPWQuZSxyPjE/KGQ9bmV3IHkoIjAuIituKSxvKyspOmQ9bmV3IHkocisiLiIrbi5zbGljZSgxKSksaD1kLHU9cz1kPVZkKGQubWludXMoMSksZC5wbHVzKDEpLGwsMSksZj1HZChkLnRpbWVzKGQpLGwsMSksaT0zOzspe2lmKHM9R2Qocy50aW1lcyhmKSxsLDEpLHpkKChjPXUucGx1cyhWZChzLG5ldyB5KGkpLGwsMSkpKS5kKS5zbGljZSgwLGwpPT09emQodS5kKS5zbGljZSgwLGwpKXtpZih1PXUudGltZXMoMiksMCE9PW8mJih1PXUucGx1cyhXZCh5LGwrMix2KS50aW1lcyhvKyIiKSkpLHU9VmQodSxuZXcgeShwKSxsLDEpLG51bGwhPWUpcmV0dXJuIHkucHJlY2lzaW9uPXYsdTtpZighVWQodS5kLGwtMTAsbSxhKSlyZXR1cm4gR2QodSx5LnByZWNpc2lvbj12LG0sRGQ9ITApO3kucHJlY2lzaW9uPWwrPTEwLGM9cz1kPVZkKGgubWludXMoMSksaC5wbHVzKDEpLGwsMSksZj1HZChkLnRpbWVzKGQpLGwsMSksaT1hPTF9dT1jLGkrPTJ9fWZ1bmN0aW9uIG5nKHQpe3JldHVybiBTdHJpbmcodC5zKnQucy8wKX1mdW5jdGlvbiByZyh0LGUpe3ZhciBuLHIsaTtmb3IoKG49ZS5pbmRleE9mKCIuIikpPi0xJiYoZT1lLnJlcGxhY2UoIi4iLCIiKSksKHI9ZS5zZWFyY2goL2UvaSkpPjA/KG48MCYmKG49ciksbis9K2Uuc2xpY2UocisxKSxlPWUuc3Vic3RyaW5nKDAscikpOm48MCYmKG49ZS5sZW5ndGgpLHI9MDs0OD09PWUuY2hhckNvZGVBdChyKTtyKyspO2ZvcihpPWUubGVuZ3RoOzQ4PT09ZS5jaGFyQ29kZUF0KGktMSk7LS1pKTtpZihlPWUuc2xpY2UocixpKSl7aWYoaS09cix0LmU9bj1uLXItMSx0LmQ9W10scj0obisxKSU3LG48MCYmKHIrPTcpLHI8aSl7Zm9yKHImJnQuZC5wdXNoKCtlLnNsaWNlKDAscikpLGktPTc7cjxpOyl0LmQucHVzaCgrZS5zbGljZShyLHIrPTcpKTtyPTctKGU9ZS5zbGljZShyKSkubGVuZ3RofWVsc2Ugci09aTtmb3IoO3ItLTspZSs9IjAiO3QuZC5wdXNoKCtlKSxEZCYmKHQuZT50LmNvbnN0cnVjdG9yLm1heEU/KHQuZD1udWxsLHQuZT1OYU4pOnQuZTx0LmNvbnN0cnVjdG9yLm1pbkUmJih0LmU9MCx0LmQ9WzBdKSl9ZWxzZSB0LmU9MCx0LmQ9WzBdO3JldHVybiB0fWZ1bmN0aW9uIGlnKHQsZSxuLHIsaSl7dmFyIG8scyxhLHUsYz10LnByZWNpc2lvbixsPU1hdGguY2VpbChjLzcpO2ZvcihEZD0hMSx1PW4udGltZXMobiksYT1uZXcgdChyKTs7KXtpZihzPVZkKGEudGltZXModSksbmV3IHQoZSsrKmUrKyksYywxKSxhPWk/ci5wbHVzKHMpOnIubWludXMocykscj1WZChzLnRpbWVzKHUpLG5ldyB0KGUrKyplKyspLGMsMSksdm9pZCAwIT09KHM9YS5wbHVzKHIpKS5kW2xdKXtmb3Iobz1sO3MuZFtvXT09PWEuZFtvXSYmby0tOyk7aWYoLTE9PW8pYnJlYWt9bz1hLGE9cixyPXMscz1vfXJldHVybiBEZD0hMCxzLmQubGVuZ3RoPWwrMSxzfWZ1bmN0aW9uIG9nKHQsZSl7Zm9yKHZhciBuPXQ7LS1lOyluKj10O3JldHVybiBufWZ1bmN0aW9uIHNnKHQsZSl7dmFyIG4scj1lLnM8MCxpPUhkKHQsdC5wcmVjaXNpb24sMSksbz1pLnRpbWVzKC41KTtpZigoZT1lLmFicygpKS5sdGUobykpcmV0dXJuIHlkPXI/NDoxLGU7aWYoKG49ZS5kaXZUb0ludChpKSkuaXNaZXJvKCkpeWQ9cj8zOjI7ZWxzZXtpZigoZT1lLm1pbnVzKG4udGltZXMoaSkpKS5sdGUobykpcmV0dXJuIHlkPVFkKG4pP3I/MjozOnI/NDoxLGU7eWQ9UWQobik/cj8xOjQ6cj8zOjJ9cmV0dXJuIGUubWludXMoaSkuYWJzKCl9ZnVuY3Rpb24gYWcodCxlLG4scil7dmFyIGksbyxzLGEsdSxjLGwsaCxmLHA9dC5jb25zdHJ1Y3RvcixkPXZvaWQgMCE9PW47aWYoZD8oamQobiwxLHZkKSx2b2lkIDA9PT1yP3I9cC5yb3VuZGluZzpqZChyLDAsOCkpOihuPXAucHJlY2lzaW9uLHI9cC5yb3VuZGluZyksdC5pc0Zpbml0ZSgpKXtmb3IoZD8oaT0yLDE2PT1lP249NCpuLTM6OD09ZSYmKG49MypuLTIpKTppPWUsKHM9KGw9WWQodCkpLmluZGV4T2YoIi4iKSk+PTAmJihsPWwucmVwbGFjZSgiLiIsIiIpLChmPW5ldyBwKDEpKS5lPWwubGVuZ3RoLXMsZi5kPXFkKFlkKGYpLDEwLGkpLGYuZT1mLmQubGVuZ3RoKSxvPXU9KGg9cWQobCwxMCxpKSkubGVuZ3RoOzA9PWhbLS11XTspaC5wb3AoKTtpZihoWzBdKXtpZihzPDA/by0tOigodD1uZXcgcCh0KSkuZD1oLHQuZT1vLGg9KHQ9VmQodCxmLG4sciwwLGkpKS5kLG89dC5lLGM9Z2QpLHM9aFtuXSxhPWkvMixjPWN8fHZvaWQgMCE9PWhbbisxXSxjPXI8ND8odm9pZCAwIT09c3x8YykmJigwPT09cnx8cj09PSh0LnM8MD8zOjIpKTpzPmF8fHM9PT1hJiYoND09PXJ8fGN8fDY9PT1yJiYxJmhbbi0xXXx8cj09PSh0LnM8MD84OjcpKSxoLmxlbmd0aD1uLGMpZm9yKDsrK2hbLS1uXT5pLTE7KWhbbl09MCxufHwoKytvLGgudW5zaGlmdCgxKSk7Zm9yKHU9aC5sZW5ndGg7IWhbdS0xXTstLXUpO2ZvcihzPTAsbD0iIjtzPHU7cysrKWwrPV9kLmNoYXJBdChoW3NdKTtpZihkKXtpZih1PjEpaWYoMTY9PWV8fDg9PWUpe2ZvcihzPTE2PT1lPzQ6MywtLXU7dSVzO3UrKylsKz0iMCI7Zm9yKHU9KGg9cWQobCxpLGUpKS5sZW5ndGg7IWhbdS0xXTstLXUpO2ZvcihzPTEsbD0iMS4iO3M8dTtzKyspbCs9X2QuY2hhckF0KGhbc10pfWVsc2UgbD1sLmNoYXJBdCgwKSsiLiIrbC5zbGljZSgxKTtsPWwrKG88MD8icCI6InArIikrb31lbHNlIGlmKG88MCl7Zm9yKDsrK287KWw9IjAiK2w7bD0iMC4iK2x9ZWxzZSBpZigrK28+dSlmb3Ioby09dTtvLS07KWwrPSIwIjtlbHNlIG88dSYmKGw9bC5zbGljZSgwLG8pKyIuIitsLnNsaWNlKG8pKX1lbHNlIGw9ZD8iMHArMCI6IjAiO2w9KDE2PT1lPyIweCI6Mj09ZT8iMGIiOjg9PWU/IjBvIjoiIikrbH1lbHNlIGw9bmcodCk7cmV0dXJuIHQuczwwPyItIitsOmx9ZnVuY3Rpb24gdWcodCxlKXtpZih0Lmxlbmd0aD5lKXJldHVybiB0Lmxlbmd0aD1lLCEwfWZ1bmN0aW9uIGNnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hYnMoKX1mdW5jdGlvbiBsZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuYWNvcygpfWZ1bmN0aW9uIGhnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hY29zaCgpfWZ1bmN0aW9uIGZnKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLnBsdXMoZSl9ZnVuY3Rpb24gcGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmFzaW4oKX1mdW5jdGlvbiBkZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuYXNpbmgoKX1mdW5jdGlvbiBnZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuYXRhbigpfWZ1bmN0aW9uIHlnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hdGFuaCgpfWZ1bmN0aW9uIG1nKHQsZSl7dD1uZXcgdGhpcyh0KSxlPW5ldyB0aGlzKGUpO3ZhciBuLHI9dGhpcy5wcmVjaXNpb24saT10aGlzLnJvdW5kaW5nLG89cis0O3JldHVybiB0LnMmJmUucz90LmR8fGUuZD8hZS5kfHx0LmlzWmVybygpPyhuPWUuczwwP0hkKHRoaXMscixpKTpuZXcgdGhpcygwKSkucz10LnM6IXQuZHx8ZS5pc1plcm8oKT8obj1IZCh0aGlzLG8sMSkudGltZXMoLjUpKS5zPXQuczplLnM8MD8odGhpcy5wcmVjaXNpb249byx0aGlzLnJvdW5kaW5nPTEsbj10aGlzLmF0YW4oVmQodCxlLG8sMSkpLGU9SGQodGhpcyxvLDEpLHRoaXMucHJlY2lzaW9uPXIsdGhpcy5yb3VuZGluZz1pLG49dC5zPDA/bi5taW51cyhlKTpuLnBsdXMoZSkpOm49dGhpcy5hdGFuKFZkKHQsZSxvLDEpKToobj1IZCh0aGlzLG8sMSkudGltZXMoZS5zPjA/LjI1Oi43NSkpLnM9dC5zOm49bmV3IHRoaXMoTmFOKSxufWZ1bmN0aW9uIHZnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5jYnJ0KCl9ZnVuY3Rpb24gX2codCl7cmV0dXJuIEdkKHQ9bmV3IHRoaXModCksdC5lKzEsMil9ZnVuY3Rpb24geGcodCxlLG4pe3JldHVybiBuZXcgdGhpcyh0KS5jbGFtcChlLG4pfWZ1bmN0aW9uIHdnKHQpe2lmKCF0fHwib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgRXJyb3IoRWQrIk9iamVjdCBleHBlY3RlZCIpO3ZhciBlLG4scixpPSEwPT09dC5kZWZhdWx0cyxvPVsicHJlY2lzaW9uIiwxLHZkLCJyb3VuZGluZyIsMCw4LCJ0b0V4cE5lZyIsLW1kLDAsInRvRXhwUG9zIiwwLG1kLCJtYXhFIiwwLG1kLCJtaW5FIiwtbWQsMCwibW9kdWxvIiwwLDldO2ZvcihlPTA7ZTxvLmxlbmd0aDtlKz0zKWlmKG49b1tlXSxpJiYodGhpc1tuXT1iZFtuXSksdm9pZCAwIT09KHI9dFtuXSkpe2lmKCEoSWQocik9PT1yJiZyPj1vW2UrMV0mJnI8PW9bZSsyXSkpdGhyb3cgRXJyb3IoQ2QrbisiOiAiK3IpO3RoaXNbbl09cn1pZihuPSJjcnlwdG8iLGkmJih0aGlzW25dPWJkW25dKSx2b2lkIDAhPT0ocj10W25dKSl7aWYoITAhPT1yJiYhMSE9PXImJjAhPT1yJiYxIT09cil0aHJvdyBFcnJvcihDZCtuKyI6ICIrcik7aWYocil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBjcnlwdG98fCFjcnlwdG98fCFjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiYhY3J5cHRvLnJhbmRvbUJ5dGVzKXRocm93IEVycm9yKEFkKTt0aGlzW25dPSEwfWVsc2UgdGhpc1tuXT0hMX1yZXR1cm4gdGhpc31mdW5jdGlvbiBiZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuY29zKCl9ZnVuY3Rpb24gRGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmNvc2goKX1mdW5jdGlvbiBFZyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5kaXYoZSl9ZnVuY3Rpb24gQ2codCl7cmV0dXJuIG5ldyB0aGlzKHQpLmV4cCgpfWZ1bmN0aW9uIFNnKHQpe3JldHVybiBHZCh0PW5ldyB0aGlzKHQpLHQuZSsxLDMpfWZ1bmN0aW9uIEFnKCl7dmFyIHQsZSxuPW5ldyB0aGlzKDApO2ZvcihEZD0hMSx0PTA7dDxhcmd1bWVudHMubGVuZ3RoOylpZigoZT1uZXcgdGhpcyhhcmd1bWVudHNbdCsrXSkpLmQpbi5kJiYobj1uLnBsdXMoZS50aW1lcyhlKSkpO2Vsc2V7aWYoZS5zKXJldHVybiBEZD0hMCxuZXcgdGhpcygxLzApO249ZX1yZXR1cm4gRGQ9ITAsbi5zcXJ0KCl9ZnVuY3Rpb24gTmcodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBaZ3x8dCYmdC50b1N0cmluZ1RhZz09PU5kfHwhMX1mdW5jdGlvbiBJZyh0KXtyZXR1cm4gbmV3IHRoaXModCkubG4oKX1mdW5jdGlvbiBNZyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5sb2coZSl9ZnVuY3Rpb24gRmcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmxvZygyKX1mdW5jdGlvbiBUZyh0KXtyZXR1cm4gbmV3IHRoaXModCkubG9nKDEwKX1mdW5jdGlvbiBPZygpe3JldHVybiAkZCh0aGlzLGFyZ3VtZW50cywtMSl9ZnVuY3Rpb24gTGcoKXtyZXR1cm4gJGQodGhpcyxhcmd1bWVudHMsMSl9ZnVuY3Rpb24gUGcodCxlKXtyZXR1cm4gbmV3IHRoaXModCkubW9kKGUpfWZ1bmN0aW9uIFJnKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLm11bChlKX1mdW5jdGlvbiBCZyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5wb3coZSl9ZnVuY3Rpb24ga2codCl7dmFyIGUsbixyLGksbz0wLHM9bmV3IHRoaXMoMSksYT1bXTtpZih2b2lkIDA9PT10P3Q9dGhpcy5wcmVjaXNpb246amQodCwxLHZkKSxyPU1hdGguY2VpbCh0LzcpLHRoaXMuY3J5cHRvKWlmKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpZm9yKGU9Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkocikpO288cjspKGk9ZVtvXSk+PTQyOWU3P2Vbb109Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkoMSkpWzBdOmFbbysrXT1pJTFlNztlbHNle2lmKCFjcnlwdG8ucmFuZG9tQnl0ZXMpdGhyb3cgRXJyb3IoQWQpO2ZvcihlPWNyeXB0by5yYW5kb21CeXRlcyhyKj00KTtvPHI7KShpPWVbb10rKGVbbysxXTw8OCkrKGVbbysyXTw8MTYpKygoMTI3JmVbbyszXSk8PDI0KSk+PTIxNGU3P2NyeXB0by5yYW5kb21CeXRlcyg0KS5jb3B5KGUsbyk6KGEucHVzaChpJTFlNyksbys9NCk7bz1yLzR9ZWxzZSBmb3IoO288cjspYVtvKytdPTFlNypNYXRoLnJhbmRvbSgpfDA7Zm9yKHQlPTcsKHI9YVstLW9dKSYmdCYmKGk9TWQoMTAsNy10KSxhW29dPShyL2l8MCkqaSk7MD09PWFbb107by0tKWEucG9wKCk7aWYobzwwKW49MCxhPVswXTtlbHNle2ZvcihuPS0xOzA9PT1hWzBdO24tPTcpYS5zaGlmdCgpO2ZvcihyPTEsaT1hWzBdO2k+PTEwO2kvPTEwKXIrKztyPDcmJihuLT03LXIpfXJldHVybiBzLmU9bixzLmQ9YSxzfWZ1bmN0aW9uIHpnKHQpe3JldHVybiBHZCh0PW5ldyB0aGlzKHQpLHQuZSsxLHRoaXMucm91bmRpbmcpfWZ1bmN0aW9uIGpnKHQpe3JldHVybih0PW5ldyB0aGlzKHQpKS5kP3QuZFswXT90LnM6MCp0LnM6dC5zfHxOYU59ZnVuY3Rpb24gVWcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLnNpbigpfWZ1bmN0aW9uIHFnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5zaW5oKCl9ZnVuY3Rpb24gVmcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLnNxcnQoKX1mdW5jdGlvbiBHZyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5zdWIoZSl9ZnVuY3Rpb24gWWcoKXt2YXIgdD0wLGU9YXJndW1lbnRzLG49bmV3IHRoaXMoZVt0XSk7Zm9yKERkPSExO24ucyYmKyt0PGUubGVuZ3RoOyluPW4ucGx1cyhlW3RdKTtyZXR1cm4gRGQ9ITAsR2Qobix0aGlzLnByZWNpc2lvbix0aGlzLnJvdW5kaW5nKX1mdW5jdGlvbiBYZyh0KXtyZXR1cm4gbmV3IHRoaXModCkudGFuKCl9ZnVuY3Rpb24gV2codCl7cmV0dXJuIG5ldyB0aGlzKHQpLnRhbmgoKX1mdW5jdGlvbiBIZyh0KXtyZXR1cm4gR2QodD1uZXcgdGhpcyh0KSx0LmUrMSwxKX1rZFtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1rZC50b1N0cmluZyxrZFtTeW1ib2wudG9TdHJpbmdUYWddPSJEZWNpbWFsIjt2YXIgWmc9a2QuY29uc3RydWN0b3I9ZnVuY3Rpb24gdChlKXt2YXIgbixyLGk7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuLHIsaT10aGlzO2lmKCEoaSBpbnN0YW5jZW9mIG8pKXJldHVybiBuZXcgbyh0KTtpZihpLmNvbnN0cnVjdG9yPW8sTmcodCkpcmV0dXJuIGkucz10LnMsdm9pZChEZD8hdC5kfHx0LmU+by5tYXhFPyhpLmU9TmFOLGkuZD1udWxsKTp0LmU8by5taW5FPyhpLmU9MCxpLmQ9WzBdKTooaS5lPXQuZSxpLmQ9dC5kLnNsaWNlKCkpOihpLmU9dC5lLGkuZD10LmQ/dC5kLnNsaWNlKCk6dC5kKSk7aWYoIm51bWJlciI9PT0ocj10eXBlb2YgdCkpe2lmKDA9PT10KXJldHVybiBpLnM9MS90PDA/LTE6MSxpLmU9MCx2b2lkKGkuZD1bMF0pO2lmKHQ8MD8odD0tdCxpLnM9LTEpOmkucz0xLHQ9PT1+fnQmJnQ8MWU3KXtmb3IoZT0wLG49dDtuPj0xMDtuLz0xMCllKys7cmV0dXJuIHZvaWQoRGQ/ZT5vLm1heEU/KGkuZT1OYU4saS5kPW51bGwpOmU8by5taW5FPyhpLmU9MCxpLmQ9WzBdKTooaS5lPWUsaS5kPVt0XSk6KGkuZT1lLGkuZD1bdF0pKX1yZXR1cm4gMCp0IT0wPyh0fHwoaS5zPU5hTiksaS5lPU5hTix2b2lkKGkuZD1udWxsKSk6cmcoaSx0LnRvU3RyaW5nKCkpfWlmKCJzdHJpbmciPT09cilyZXR1cm4gNDU9PT0obj10LmNoYXJDb2RlQXQoMCkpPyh0PXQuc2xpY2UoMSksaS5zPS0xKTooNDM9PT1uJiYodD10LnNsaWNlKDEpKSxpLnM9MSksTGQudGVzdCh0KT9yZyhpLHQpOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixpLG8scyxhLHUsYyxsO2lmKGUuaW5kZXhPZigiXyIpPi0xKXtpZihlPWUucmVwbGFjZSgvKFxkKV8oPz1cZCkvZywiJDEiKSxMZC50ZXN0KGUpKXJldHVybiByZyh0LGUpfWVsc2UgaWYoIkluZmluaXR5Ij09PWV8fCJOYU4iPT09ZSlyZXR1cm4rZXx8KHQucz1OYU4pLHQuZT1OYU4sdC5kPW51bGwsdDtpZihUZC50ZXN0KGUpKW49MTYsZT1lLnRvTG93ZXJDYXNlKCk7ZWxzZSBpZihGZC50ZXN0KGUpKW49MjtlbHNle2lmKCFPZC50ZXN0KGUpKXRocm93IEVycm9yKENkK2UpO249OH1mb3IoKG89ZS5zZWFyY2goL3AvaSkpPjA/KHU9K2Uuc2xpY2UobysxKSxlPWUuc3Vic3RyaW5nKDIsbykpOmU9ZS5zbGljZSgyKSxzPShvPWUuaW5kZXhPZigiLiIpKT49MCxyPXQuY29uc3RydWN0b3IscyYmKG89KGE9KGU9ZS5yZXBsYWNlKCIuIiwiIikpLmxlbmd0aCktbyxpPUpkKHIsbmV3IHIobiksbywyKm8pKSxvPWw9KGM9cWQoZSxuLFBkKSkubGVuZ3RoLTE7MD09PWNbb107LS1vKWMucG9wKCk7cmV0dXJuIG88MD9uZXcgcigwKnQucyk6KHQuZT1YZChjLGwpLHQuZD1jLERkPSExLHMmJih0PVZkKHQsaSw0KmEpKSx1JiYodD10LnRpbWVzKE1hdGguYWJzKHUpPDU0P01kKDIsdSk6WmcucG93KDIsdSkpKSxEZD0hMCx0KX0oaSx0KTtpZigiYmlnaW50Ij09PXIpcmV0dXJuIHQ8MD8odD0tdCxpLnM9LTEpOmkucz0xLHJnKGksdC50b1N0cmluZygpKTt0aHJvdyBFcnJvcihDZCt0KX1pZihvLnByb3RvdHlwZT1rZCxvLlJPVU5EX1VQPTAsby5ST1VORF9ET1dOPTEsby5ST1VORF9DRUlMPTIsby5ST1VORF9GTE9PUj0zLG8uUk9VTkRfSEFMRl9VUD00LG8uUk9VTkRfSEFMRl9ET1dOPTUsby5ST1VORF9IQUxGX0VWRU49NixvLlJPVU5EX0hBTEZfQ0VJTD03LG8uUk9VTkRfSEFMRl9GTE9PUj04LG8uRVVDTElEPTksby5jb25maWc9by5zZXQ9d2csby5jbG9uZT10LG8uaXNEZWNpbWFsPU5nLG8uYWJzPWNnLG8uYWNvcz1sZyxvLmFjb3NoPWhnLG8uYWRkPWZnLG8uYXNpbj1wZyxvLmFzaW5oPWRnLG8uYXRhbj1nZyxvLmF0YW5oPXlnLG8uYXRhbjI9bWcsby5jYnJ0PXZnLG8uY2VpbD1fZyxvLmNsYW1wPXhnLG8uY29zPWJnLG8uY29zaD1EZyxvLmRpdj1FZyxvLmV4cD1DZyxvLmZsb29yPVNnLG8uaHlwb3Q9QWcsby5sbj1JZyxvLmxvZz1NZyxvLmxvZzEwPVRnLG8ubG9nMj1GZyxvLm1heD1PZyxvLm1pbj1MZyxvLm1vZD1QZyxvLm11bD1SZyxvLnBvdz1CZyxvLnJhbmRvbT1rZyxvLnJvdW5kPXpnLG8uc2lnbj1qZyxvLnNpbj1VZyxvLnNpbmg9cWcsby5zcXJ0PVZnLG8uc3ViPUdnLG8uc3VtPVlnLG8udGFuPVhnLG8udGFuaD1XZyxvLnRydW5jPUhnLHZvaWQgMD09PWUmJihlPXt9KSxlJiYhMCE9PWUuZGVmYXVsdHMpZm9yKGk9WyJwcmVjaXNpb24iLCJyb3VuZGluZyIsInRvRXhwTmVnIiwidG9FeHBQb3MiLCJtYXhFIiwibWluRSIsIm1vZHVsbyIsImNyeXB0byJdLG49MDtuPGkubGVuZ3RoOyllLmhhc093blByb3BlcnR5KHI9aVtuKytdKXx8KGVbcl09dGhpc1tyXSk7cmV0dXJuIG8uY29uZmlnKGUpLG99KGJkKTt4ZD1uZXcgWmcoeGQpLHdkPW5ldyBaZyh3ZCk7dmFyIEtnPXRkKCJCaWdOdW1iZXIiLFsiP29uIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7b246ZSxjb25maWc6bn09dCxyPVpnLmNsb25lKHtwcmVjaXNpb246bi5wcmVjaXNpb24sbW9kdWxvOlpnLkVVQ0xJRH0pO3JldHVybiByLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSxyLnByb3RvdHlwZS50eXBlPSJCaWdOdW1iZXIiLHIucHJvdG90eXBlLmlzQmlnTnVtYmVyPSEwLHIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkJpZ051bWJlciIsdmFsdWU6dGhpcy50b1N0cmluZygpfX0sci5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHIodC52YWx1ZSl9LGUmJmUoImNvbmZpZyIsKGZ1bmN0aW9uKHQsZSl7dC5wcmVjaXNpb24hPT1lLnByZWNpc2lvbiYmci5jb25maWcoe3ByZWNpc2lvbjp0LnByZWNpc2lvbn0pfSkpLHJ9KSx7aXNDbGFzczohMH0pO2NvbnN0IEpnPU1hdGguY29zaHx8ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHQpPDFlLTk/MS10Oi41KihNYXRoLmV4cCh0KStNYXRoLmV4cCgtdCkpfSxRZz1NYXRoLnNpbmh8fGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyh0KTwxZS05P3Q6LjUqKE1hdGguZXhwKHQpLU1hdGguZXhwKC10KSl9LCRnPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQ9TWF0aC5hYnModCkpPChlPU1hdGguYWJzKGUpKSYmKFt0LGVdPVtlLHRdKSx0PDFlOD9NYXRoLnNxcnQodCp0K2UqZSk6KGUvPXQsdCpNYXRoLnNxcnQoMStlKmUpKX0sdHk9ZnVuY3Rpb24oKXt0aHJvdyBTeW50YXhFcnJvcigiSW52YWxpZCBQYXJhbSIpfTtmdW5jdGlvbiBleSh0LGUpe2NvbnN0IG49TWF0aC5hYnModCkscj1NYXRoLmFicyhlKTtyZXR1cm4gMD09PXQ/TWF0aC5sb2cocik6MD09PWU/TWF0aC5sb2cobik6bjwzZTMmJnI8M2UzPy41Kk1hdGgubG9nKHQqdCtlKmUpOih0Kj0uNSxlKj0uNSwuNSpNYXRoLmxvZyh0KnQrZSplKStNYXRoLkxOMil9Y29uc3Qgbnk9e3JlOjAsaW06MH0scnk9ZnVuY3Rpb24odCxlKXtjb25zdCBuPW55O2lmKG51bGw9PXQpbi5yZT1uLmltPTA7ZWxzZSBpZih2b2lkIDAhPT1lKW4ucmU9dCxuLmltPWU7ZWxzZSBzd2l0Y2godHlwZW9mIHQpe2Nhc2Uib2JqZWN0IjppZigiaW0iaW4gdCYmInJlImluIHQpbi5yZT10LnJlLG4uaW09dC5pbTtlbHNlIGlmKCJhYnMiaW4gdCYmImFyZyJpbiB0KXtpZighaXNGaW5pdGUodC5hYnMpJiZpc0Zpbml0ZSh0LmFyZykpcmV0dXJuIGl5LklORklOSVRZO24ucmU9dC5hYnMqTWF0aC5jb3ModC5hcmcpLG4uaW09dC5hYnMqTWF0aC5zaW4odC5hcmcpfWVsc2UgaWYoInIiaW4gdCYmInBoaSJpbiB0KXtpZighaXNGaW5pdGUodC5yKSYmaXNGaW5pdGUodC5waGkpKXJldHVybiBpeS5JTkZJTklUWTtuLnJlPXQucipNYXRoLmNvcyh0LnBoaSksbi5pbT10LnIqTWF0aC5zaW4odC5waGkpfWVsc2UgMj09PXQubGVuZ3RoPyhuLnJlPXRbMF0sbi5pbT10WzFdKTp0eSgpO2JyZWFrO2Nhc2Uic3RyaW5nIjpuLmltPW4ucmU9MDtjb25zdCBlPXQucmVwbGFjZSgvXy9nLCIiKS5tYXRjaCgvXGQrXC4/XGQqZVsrLV0/XGQrfFxkK1wuP1xkKnxcLlxkK3wuL2cpO2xldCByPTEsaT0wO251bGw9PT1lJiZ0eSgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtjb25zdCBvPWVbdF07IiAiPT09b3x8Ilx0Ij09PW98fCJcbiI9PT1vfHwoIisiPT09bz9yKys6Ii0iPT09bz9pKys6ImkiPT09b3x8IkkiPT09bz8ocitpPT09MCYmdHkoKSwiICI9PT1lW3QrMV18fGlzTmFOKGVbdCsxXSk/bi5pbSs9cGFyc2VGbG9hdCgoaSUyPyItIjoiIikrIjEiKToobi5pbSs9cGFyc2VGbG9hdCgoaSUyPyItIjoiIikrZVt0KzFdKSx0KyspLHI9aT0wKTooKHIraT09PTB8fGlzTmFOKG8pKSYmdHkoKSwiaSI9PT1lW3QrMV18fCJJIj09PWVbdCsxXT8obi5pbSs9cGFyc2VGbG9hdCgoaSUyPyItIjoiIikrbyksdCsrKTpuLnJlKz1wYXJzZUZsb2F0KChpJTI/Ii0iOiIiKStvKSxyPWk9MCkpfXIraT4wJiZ0eSgpO2JyZWFrO2Nhc2UibnVtYmVyIjpuLmltPTAsbi5yZT10O2JyZWFrO2RlZmF1bHQ6dHkoKX1yZXR1cm4gaXNOYU4obi5yZSl8fGlzTmFOKG4uaW0pLG59O2Z1bmN0aW9uIGl5KHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgaXkpKXJldHVybiBuZXcgaXkodCxlKTtjb25zdCBuPXJ5KHQsZSk7dGhpcy5yZT1uLnJlLHRoaXMuaW09bi5pbX1peS5wcm90b3R5cGU9e3JlOjAsaW06MCxzaWduOmZ1bmN0aW9uKCl7Y29uc3QgdD0kZyh0aGlzLnJlLHRoaXMuaW0pO3JldHVybiBuZXcgaXkodGhpcy5yZS90LHRoaXMuaW0vdCl9LGFkZDpmdW5jdGlvbih0LGUpe2NvbnN0IG49cnkodCxlKSxyPXRoaXMuaXNJbmZpbml0ZSgpLGk9IShpc0Zpbml0ZShuLnJlKSYmaXNGaW5pdGUobi5pbSkpO3JldHVybiByfHxpP3ImJmk/aXkuTkFOOml5LklORklOSVRZOm5ldyBpeSh0aGlzLnJlK24ucmUsdGhpcy5pbStuLmltKX0sc3ViOmZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1yeSh0LGUpLHI9dGhpcy5pc0luZmluaXRlKCksaT0hKGlzRmluaXRlKG4ucmUpJiZpc0Zpbml0ZShuLmltKSk7cmV0dXJuIHJ8fGk/ciYmaT9peS5OQU46aXkuSU5GSU5JVFk6bmV3IGl5KHRoaXMucmUtbi5yZSx0aGlzLmltLW4uaW0pfSxtdWw6ZnVuY3Rpb24odCxlKXtjb25zdCBuPXJ5KHQsZSkscj10aGlzLmlzSW5maW5pdGUoKSxpPSEoaXNGaW5pdGUobi5yZSkmJmlzRmluaXRlKG4uaW0pKSxvPTA9PT10aGlzLnJlJiYwPT09dGhpcy5pbSxzPTA9PT1uLnJlJiYwPT09bi5pbTtyZXR1cm4gciYmc3x8aSYmbz9peS5OQU46cnx8aT9peS5JTkZJTklUWTowPT09bi5pbSYmMD09PXRoaXMuaW0/bmV3IGl5KHRoaXMucmUqbi5yZSwwKTpuZXcgaXkodGhpcy5yZSpuLnJlLXRoaXMuaW0qbi5pbSx0aGlzLnJlKm4uaW0rdGhpcy5pbSpuLnJlKX0sZGl2OmZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1yeSh0LGUpLHI9dGhpcy5pc0luZmluaXRlKCksaT0hKGlzRmluaXRlKG4ucmUpJiZpc0Zpbml0ZShuLmltKSksbz0wPT09dGhpcy5yZSYmMD09PXRoaXMuaW0scz0wPT09bi5yZSYmMD09PW4uaW07aWYobyYmc3x8ciYmaSlyZXR1cm4gaXkuTkFOO2lmKHN8fHIpcmV0dXJuIGl5LklORklOSVRZO2lmKG98fGkpcmV0dXJuIGl5LlpFUk87aWYoMD09PW4uaW0pcmV0dXJuIG5ldyBpeSh0aGlzLnJlL24ucmUsdGhpcy5pbS9uLnJlKTtpZihNYXRoLmFicyhuLnJlKTxNYXRoLmFicyhuLmltKSl7Y29uc3QgdD1uLnJlL24uaW0sZT1uLnJlKnQrbi5pbTtyZXR1cm4gbmV3IGl5KCh0aGlzLnJlKnQrdGhpcy5pbSkvZSwodGhpcy5pbSp0LXRoaXMucmUpL2UpfXtjb25zdCB0PW4uaW0vbi5yZSxlPW4uaW0qdCtuLnJlO3JldHVybiBuZXcgaXkoKHRoaXMucmUrdGhpcy5pbSp0KS9lLCh0aGlzLmltLXRoaXMucmUqdCkvZSl9fSxwb3c6ZnVuY3Rpb24odCxlKXtjb25zdCBuPXJ5KHQsZSkscj0wPT09dGhpcy5yZSYmMD09PXRoaXMuaW07aWYoMD09PW4ucmUmJjA9PT1uLmltKXJldHVybiBpeS5PTkU7aWYoMD09PW4uaW0pe2lmKDA9PT10aGlzLmltJiZ0aGlzLnJlPjApcmV0dXJuIG5ldyBpeShNYXRoLnBvdyh0aGlzLnJlLG4ucmUpLDApO2lmKDA9PT10aGlzLnJlKXN3aXRjaCgobi5yZSU0KzQpJTQpe2Nhc2UgMDpyZXR1cm4gbmV3IGl5KE1hdGgucG93KHRoaXMuaW0sbi5yZSksMCk7Y2FzZSAxOnJldHVybiBuZXcgaXkoMCxNYXRoLnBvdyh0aGlzLmltLG4ucmUpKTtjYXNlIDI6cmV0dXJuIG5ldyBpeSgtTWF0aC5wb3codGhpcy5pbSxuLnJlKSwwKTtjYXNlIDM6cmV0dXJuIG5ldyBpeSgwLC1NYXRoLnBvdyh0aGlzLmltLG4ucmUpKX19aWYociYmbi5yZT4wKXJldHVybiBpeS5aRVJPO2NvbnN0IGk9TWF0aC5hdGFuMih0aGlzLmltLHRoaXMucmUpLG89ZXkodGhpcy5yZSx0aGlzLmltKTtsZXQgcz1NYXRoLmV4cChuLnJlKm8tbi5pbSppKSxhPW4uaW0qbytuLnJlKmk7cmV0dXJuIG5ldyBpeShzKk1hdGguY29zKGEpLHMqTWF0aC5zaW4oYSkpfSxzcXJ0OmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09ZSlyZXR1cm4gdD49MD9uZXcgaXkoTWF0aC5zcXJ0KHQpLDApOm5ldyBpeSgwLE1hdGguc3FydCgtdCkpO2NvbnN0IG49JGcodCxlKTtsZXQgcj1NYXRoLnNxcnQoLjUqKG4rTWF0aC5hYnModCkpKSxpPU1hdGguYWJzKGUpLygyKnIpO3JldHVybiB0Pj0wP25ldyBpeShyLGU8MD8taTppKTpuZXcgaXkoaSxlPDA/LXI6cil9LGV4cDpmdW5jdGlvbigpe2NvbnN0IHQ9TWF0aC5leHAodGhpcy5yZSk7cmV0dXJuIDA9PT10aGlzLmltP25ldyBpeSh0LDApOm5ldyBpeSh0Kk1hdGguY29zKHRoaXMuaW0pLHQqTWF0aC5zaW4odGhpcy5pbSkpfSxleHBtMTpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07cmV0dXJuIG5ldyBpeShNYXRoLmV4cG0xKHQpKk1hdGguY29zKGUpK2Z1bmN0aW9uKHQpe2NvbnN0IGU9TWF0aC5QSS80O2lmKC1lPnR8fHQ+ZSlyZXR1cm4gTWF0aC5jb3ModCktMTtjb25zdCBuPXQqdDtyZXR1cm4gbioobioobioobioobioobioobioobi8yMDkyMjc4OTg4OGUzLTEvODcxNzgyOTEyMDApKzEvNDc5MDAxNjAwKS0xLzM2Mjg4MDApKzEvNDAzMjApLTEvNzIwKSsxLzI0KS0uNSl9KGUpLE1hdGguZXhwKHQpKk1hdGguc2luKGUpKX0sbG9nOmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbTtyZXR1cm4gMD09PWUmJnQ+MD9uZXcgaXkoTWF0aC5sb2codCksMCk6bmV3IGl5KGV5KHQsZSksTWF0aC5hdGFuMihlLHQpKX0sYWJzOmZ1bmN0aW9uKCl7cmV0dXJuICRnKHRoaXMucmUsdGhpcy5pbSl9LGFyZzpmdW5jdGlvbigpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMuaW0sdGhpcy5yZSl9LHNpbjpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07cmV0dXJuIG5ldyBpeShNYXRoLnNpbih0KSpKZyhlKSxNYXRoLmNvcyh0KSpRZyhlKSl9LGNvczpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07cmV0dXJuIG5ldyBpeShNYXRoLmNvcyh0KSpKZyhlKSwtTWF0aC5zaW4odCkqUWcoZSkpfSx0YW46ZnVuY3Rpb24oKXtjb25zdCB0PTIqdGhpcy5yZSxlPTIqdGhpcy5pbSxuPU1hdGguY29zKHQpK0pnKGUpO3JldHVybiBuZXcgaXkoTWF0aC5zaW4odCkvbixRZyhlKS9uKX0sY290OmZ1bmN0aW9uKCl7Y29uc3QgdD0yKnRoaXMucmUsZT0yKnRoaXMuaW0sbj1NYXRoLmNvcyh0KS1KZyhlKTtyZXR1cm4gbmV3IGl5KC1NYXRoLnNpbih0KS9uLFFnKGUpL24pfSxzZWM6ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltLG49LjUqSmcoMiplKSsuNSpNYXRoLmNvcygyKnQpO3JldHVybiBuZXcgaXkoTWF0aC5jb3ModCkqSmcoZSkvbixNYXRoLnNpbih0KSpRZyhlKS9uKX0sY3NjOmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbSxuPS41KkpnKDIqZSktLjUqTWF0aC5jb3MoMip0KTtyZXR1cm4gbmV3IGl5KE1hdGguc2luKHQpKkpnKGUpL24sLU1hdGguY29zKHQpKlFnKGUpL24pfSxhc2luOmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbSxuPW5ldyBpeShlKmUtdCp0KzEsLTIqdCplKS5zcXJ0KCkscj1uZXcgaXkobi5yZS1lLG4uaW0rdCkubG9nKCk7cmV0dXJuIG5ldyBpeShyLmltLC1yLnJlKX0sYWNvczpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj1uZXcgaXkoZSplLXQqdCsxLC0yKnQqZSkuc3FydCgpLHI9bmV3IGl5KG4ucmUtZSxuLmltK3QpLmxvZygpO3JldHVybiBuZXcgaXkoTWF0aC5QSS8yLXIuaW0sci5yZSl9LGF0YW46ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltO2lmKDA9PT10KXtpZigxPT09ZSlyZXR1cm4gbmV3IGl5KDAsMS8wKTtpZigtMT09PWUpcmV0dXJuIG5ldyBpeSgwLC0xLzApfWNvbnN0IG49dCp0KygxLWUpKigxLWUpLHI9bmV3IGl5KCgxLWUqZS10KnQpL24sLTIqdC9uKS5sb2coKTtyZXR1cm4gbmV3IGl5KC0uNSpyLmltLC41KnIucmUpfSxhY290OmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09ZSlyZXR1cm4gbmV3IGl5KE1hdGguYXRhbjIoMSx0KSwwKTtjb25zdCBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBpeSh0L24sLWUvbikuYXRhbigpOm5ldyBpeSgwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmF0YW4oKX0sYXNlYzpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PXQmJjA9PT1lKXJldHVybiBuZXcgaXkoMCwxLzApO2NvbnN0IG49dCp0K2UqZTtyZXR1cm4gMCE9PW4/bmV3IGl5KHQvbiwtZS9uKS5hY29zKCk6bmV3IGl5KDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYWNvcygpfSxhY3NjOmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09dCYmMD09PWUpcmV0dXJuIG5ldyBpeShNYXRoLlBJLzIsMS8wKTtjb25zdCBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBpeSh0L24sLWUvbikuYXNpbigpOm5ldyBpeSgwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmFzaW4oKX0sc2luaDpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07cmV0dXJuIG5ldyBpeShRZyh0KSpNYXRoLmNvcyhlKSxKZyh0KSpNYXRoLnNpbihlKSl9LGNvc2g6ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltO3JldHVybiBuZXcgaXkoSmcodCkqTWF0aC5jb3MoZSksUWcodCkqTWF0aC5zaW4oZSkpfSx0YW5oOmZ1bmN0aW9uKCl7Y29uc3QgdD0yKnRoaXMucmUsZT0yKnRoaXMuaW0sbj1KZyh0KStNYXRoLmNvcyhlKTtyZXR1cm4gbmV3IGl5KFFnKHQpL24sTWF0aC5zaW4oZSkvbil9LGNvdGg6ZnVuY3Rpb24oKXtjb25zdCB0PTIqdGhpcy5yZSxlPTIqdGhpcy5pbSxuPUpnKHQpLU1hdGguY29zKGUpO3JldHVybiBuZXcgaXkoUWcodCkvbiwtTWF0aC5zaW4oZSkvbil9LGNzY2g6ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMucmUsZT10aGlzLmltLG49TWF0aC5jb3MoMiplKS1KZygyKnQpO3JldHVybiBuZXcgaXkoLTIqUWcodCkqTWF0aC5jb3MoZSkvbiwyKkpnKHQpKk1hdGguc2luKGUpL24pfSxzZWNoOmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbSxuPU1hdGguY29zKDIqZSkrSmcoMip0KTtyZXR1cm4gbmV3IGl5KDIqSmcodCkqTWF0aC5jb3MoZSkvbiwtMipRZyh0KSpNYXRoLnNpbihlKS9uKX0sYXNpbmg6ZnVuY3Rpb24oKXtsZXQgdD10aGlzLmltO3RoaXMuaW09LXRoaXMucmUsdGhpcy5yZT10O2NvbnN0IGU9dGhpcy5hc2luKCk7cmV0dXJuIHRoaXMucmU9LXRoaXMuaW0sdGhpcy5pbT10LHQ9ZS5yZSxlLnJlPS1lLmltLGUuaW09dCxlfSxhY29zaDpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5hY29zKCk7aWYodC5pbTw9MCl7Y29uc3QgZT10LnJlO3QucmU9LXQuaW0sdC5pbT1lfWVsc2V7Y29uc3QgZT10LmltO3QuaW09LXQucmUsdC5yZT1lfXJldHVybiB0fSxhdGFuaDpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj10PjEmJjA9PT1lLHI9MS10LGk9MSt0LG89cipyK2UqZSxzPTAhPT1vP25ldyBpeSgoaSpyLWUqZSkvbywoZSpyK2kqZSkvbyk6bmV3IGl5KC0xIT09dD90LzA6MCwwIT09ZT9lLzA6MCksYT1zLnJlO3JldHVybiBzLnJlPWV5KHMucmUscy5pbSkvMixzLmltPU1hdGguYXRhbjIocy5pbSxhKS8yLG4mJihzLmltPS1zLmltKSxzfSxhY290aDpmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PXQmJjA9PT1lKXJldHVybiBuZXcgaXkoMCxNYXRoLlBJLzIpO2NvbnN0IG49dCp0K2UqZTtyZXR1cm4gMCE9PW4/bmV3IGl5KHQvbiwtZS9uKS5hdGFuaCgpOm5ldyBpeSgwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmF0YW5oKCl9LGFjc2NoOmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09ZSlyZXR1cm4gbmV3IGl5KDAhPT10P01hdGgubG9nKHQrTWF0aC5zcXJ0KHQqdCsxKSk6MS8wLDApO2NvbnN0IG49dCp0K2UqZTtyZXR1cm4gMCE9PW4/bmV3IGl5KHQvbiwtZS9uKS5hc2luaCgpOm5ldyBpeSgwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmFzaW5oKCl9LGFzZWNoOmZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbTtpZih0aGlzLmlzWmVybygpKXJldHVybiBpeS5JTkZJTklUWTtjb25zdCBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBpeSh0L24sLWUvbikuYWNvc2goKTpuZXcgaXkoMCE9PXQ/dC8wOjAsMCE9PWU/LWUvMDowKS5hY29zaCgpfSxpbnZlcnNlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gaXkuSU5GSU5JVFk7aWYodGhpcy5pc0luZmluaXRlKCkpcmV0dXJuIGl5LlpFUk87Y29uc3QgdD10aGlzLnJlLGU9dGhpcy5pbSxuPXQqdCtlKmU7cmV0dXJuIG5ldyBpeSh0L24sLWUvbil9LGNvbmp1Z2F0ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgaXkodGhpcy5yZSwtdGhpcy5pbSl9LG5lZzpmdW5jdGlvbigpe3JldHVybiBuZXcgaXkoLXRoaXMucmUsLXRoaXMuaW0pfSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLG5ldyBpeShNYXRoLmNlaWwodGhpcy5yZSp0KS90LE1hdGguY2VpbCh0aGlzLmltKnQpL3QpfSxmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdygxMCx0fHwwKSxuZXcgaXkoTWF0aC5mbG9vcih0aGlzLnJlKnQpL3QsTWF0aC5mbG9vcih0aGlzLmltKnQpL3QpfSxyb3VuZDpmdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdygxMCx0fHwwKSxuZXcgaXkoTWF0aC5yb3VuZCh0aGlzLnJlKnQpL3QsTWF0aC5yb3VuZCh0aGlzLmltKnQpL3QpfSxlcXVhbHM6ZnVuY3Rpb24odCxlKXtjb25zdCBuPXJ5KHQsZSk7cmV0dXJuIE1hdGguYWJzKG4ucmUtdGhpcy5yZSk8PWl5LkVQU0lMT04mJk1hdGguYWJzKG4uaW0tdGhpcy5pbSk8PWl5LkVQU0lMT059LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpeSh0aGlzLnJlLHRoaXMuaW0pfSx0b1N0cmluZzpmdW5jdGlvbigpe2xldCB0PXRoaXMucmUsZT10aGlzLmltLG49IiI7cmV0dXJuIHRoaXMuaXNOYU4oKT8iTmFOIjp0aGlzLmlzSW5maW5pdGUoKT8iSW5maW5pdHkiOihNYXRoLmFicyh0KTxpeS5FUFNJTE9OJiYodD0wKSxNYXRoLmFicyhlKTxpeS5FUFNJTE9OJiYoZT0wKSwwPT09ZT9uK3Q6KDAhPT10PyhuKz10LG4rPSIgIixlPDA/KGU9LWUsbis9Ii0iKTpuKz0iKyIsbis9IiAiKTplPDAmJihlPS1lLG4rPSItIiksMSE9PWUmJihuKz1lKSxuKyJpIikpfSx0b1ZlY3RvcjpmdW5jdGlvbigpe3JldHVyblt0aGlzLnJlLHRoaXMuaW1dfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmltP3RoaXMucmU6bnVsbH0saXNOYU46ZnVuY3Rpb24oKXtyZXR1cm4gaXNOYU4odGhpcy5yZSl8fGlzTmFOKHRoaXMuaW0pfSxpc1plcm86ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuaW0mJjA9PT10aGlzLnJlfSxpc0Zpbml0ZTpmdW5jdGlvbigpe3JldHVybiBpc0Zpbml0ZSh0aGlzLnJlKSYmaXNGaW5pdGUodGhpcy5pbSl9LGlzSW5maW5pdGU6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0Zpbml0ZSgpfX0saXkuWkVSTz1uZXcgaXkoMCwwKSxpeS5PTkU9bmV3IGl5KDEsMCksaXkuST1uZXcgaXkoMCwxKSxpeS5QST1uZXcgaXkoTWF0aC5QSSwwKSxpeS5FPW5ldyBpeShNYXRoLkUsMCksaXkuSU5GSU5JVFk9bmV3IGl5KDEvMCwxLzApLGl5Lk5BTj1uZXcgaXkoTmFOLE5hTiksaXkuRVBTSUxPTj0xZS0xNTt2YXIgb3k9dGQoIkNvbXBsZXgiLFtdLCgoKT0+KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpeSwibmFtZSIse3ZhbHVlOiJDb21wbGV4In0pLGl5LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1peSxpeS5wcm90b3R5cGUudHlwZT0iQ29tcGxleCIsaXkucHJvdG90eXBlLmlzQ29tcGxleD0hMCxpeS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiQ29tcGxleCIscmU6dGhpcy5yZSxpbTp0aGlzLmltfX0saXkucHJvdG90eXBlLnRvUG9sYXI9ZnVuY3Rpb24oKXtyZXR1cm57cjp0aGlzLmFicygpLHBoaTp0aGlzLmFyZygpfX0saXkucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmltLG49dGhpcy5yZSxyPU5wKHRoaXMucmUsdCksaT1OcCh0aGlzLmltLHQpLG89TWYodCk/dDp0P3QucHJlY2lzaW9uOm51bGw7aWYobnVsbCE9PW8pe3ZhciBzPU1hdGgucG93KDEwLC1vKTtNYXRoLmFicyhuL2UpPHMmJihuPTApLE1hdGguYWJzKGUvbik8cyYmKGU9MCl9cmV0dXJuIDA9PT1lP3I6MD09PW4/MT09PWU/ImkiOi0xPT09ZT8iLWkiOmkrImkiOmU8MD8tMT09PWU/cisiIC0gaSI6cisiIC0gIitpLnN1YnN0cmluZygxKSsiaSI6MT09PWU/cisiICsgaSI6cisiICsgIitpKyJpIn0saXkuZnJvbVBvbGFyPWZ1bmN0aW9uKHQpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6dmFyIGU9YXJndW1lbnRzWzBdO2lmKCJvYmplY3QiPT10eXBlb2YgZSlyZXR1cm4gaXkoZSk7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW5wdXQgaGFzIHRvIGJlIGFuIG9iamVjdCB3aXRoIHIgYW5kIHBoaSBrZXlzLiIpO2Nhc2UgMjp2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07aWYoTWYobikpe2lmKExmKHIpJiZyLmhhc0Jhc2UoIkFOR0xFIikmJihyPXIudG9OdW1iZXIoInJhZCIpKSxNZihyKSlyZXR1cm4gbmV3IGl5KHtyOm4scGhpOnJ9KTt0aHJvdyBuZXcgVHlwZUVycm9yKCJQaGkgaXMgbm90IGEgbnVtYmVyIG5vciBhbiBhbmdsZSB1bml0LiIpfXRocm93IG5ldyBUeXBlRXJyb3IoIlJhZGl1cyByIGlzIG5vdCBhIG51bWJlci4iKTtkZWZhdWx0OnRocm93IG5ldyBTeW50YXhFcnJvcigiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBmdW5jdGlvbiBmcm9tUG9sYXIiKX19LGl5LnByb3RvdHlwZS52YWx1ZU9mPWl5LnByb3RvdHlwZS50b1N0cmluZyxpeS5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGl5KHQpfSxpeS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucmU+ZS5yZT8xOnQucmU8ZS5yZT8tMTp0LmltPmUuaW0/MTp0LmltPGUuaW0/LTE6MH0saXkpKSx7aXNDbGFzczohMH0pLHN5PXtzOjEsbjowLGQ6MX07ZnVuY3Rpb24gYXkodCxlKXtpZihpc05hTih0PXBhcnNlSW50KHQsMTApKSl0aHJvdyBkeSgpO3JldHVybiB0KmV9ZnVuY3Rpb24gdXkodCxlKXtpZigwPT09ZSl0aHJvdyBweSgpO3ZhciBuPU9iamVjdC5jcmVhdGUoZnkucHJvdG90eXBlKTtuLnM9dDwwPy0xOjE7dmFyIHI9aHkodD10PDA/LXQ6dCxlKTtyZXR1cm4gbi5uPXQvcixuLmQ9ZS9yLG59ZnVuY3Rpb24gY3kodCl7Zm9yKHZhciBlPXt9LG49dCxyPTIsaT00O2k8PW47KXtmb3IoO24lcj09MDspbi89cixlW3JdPShlW3JdfHwwKSsxO2krPTErMipyKyt9cmV0dXJuIG4hPT10P24+MSYmKGVbbl09KGVbbl18fDApKzEpOmVbdF09KGVbdF18fDApKzEsZX12YXIgbHk9ZnVuY3Rpb24odCxlKXt2YXIgbixyPTAsaT0xLG89MSxzPTAsYT0wLHU9MCxjPTEsbD0xLGg9MCxmPTEscD0xLGQ9MSxnPTFlNztpZihudWxsIT10KWlmKHZvaWQgMCE9PWUpe2lmKG89KHI9dCkqKGk9ZSksciUxIT0wfHxpJTEhPTApdGhyb3cgZ3koKX1lbHNlIHN3aXRjaCh0eXBlb2YgdCl7Y2FzZSJvYmplY3QiOmlmKCJkImluIHQmJiJuImluIHQpcj10Lm4saT10LmQsInMiaW4gdCYmKHIqPXQucyk7ZWxzZXtpZighKDAgaW4gdCkpdGhyb3cgZHkoKTtyPXRbMF0sMSBpbiB0JiYoaT10WzFdKX1vPXIqaTticmVhaztjYXNlIm51bWJlciI6aWYodDwwJiYobz10LHQ9LXQpLHQlMT09MClyPXQ7ZWxzZSBpZih0PjApe2Zvcih0Pj0xJiYodC89bD1NYXRoLnBvdygxMCxNYXRoLmZsb29yKDErTWF0aC5sb2codCkvTWF0aC5MTjEwKSkpO2Y8PWcmJmQ8PWc7KXtpZih0PT09KG49KGgrcCkvKGYrZCkpKXtmK2Q8PWc/KHI9aCtwLGk9ZitkKTpkPmY/KHI9cCxpPWQpOihyPWgsaT1mKTticmVha310Pm4/KGgrPXAsZis9ZCk6KHArPWgsZCs9ZiksZj5nPyhyPXAsaT1kKToocj1oLGk9Zil9cio9bH1lbHNlKGlzTmFOKHQpfHxpc05hTihlKSkmJihpPXI9TmFOKTticmVhaztjYXNlInN0cmluZyI6aWYobnVsbD09PShmPXQubWF0Y2goL1xkK3wuL2cpKSl0aHJvdyBkeSgpO2lmKCItIj09PWZbaF0/KG89LTEsaCsrKToiKyI9PT1mW2hdJiZoKyssZi5sZW5ndGg9PT1oKzE/YT1heShmW2grK10sbyk6Ii4iPT09ZltoKzFdfHwiLiI9PT1mW2hdPygiLiIhPT1mW2hdJiYocz1heShmW2grK10sbykpLCgrK2grMT09PWYubGVuZ3RofHwiKCI9PT1mW2grMV0mJiIpIj09PWZbaCszXXx8IiciPT09ZltoKzFdJiYiJyI9PT1mW2grM10pJiYoYT1heShmW2hdLG8pLGM9TWF0aC5wb3coMTAsZltoXS5sZW5ndGgpLGgrKyksKCIoIj09PWZbaF0mJiIpIj09PWZbaCsyXXx8IiciPT09ZltoXSYmIiciPT09ZltoKzJdKSYmKHU9YXkoZltoKzFdLG8pLGw9TWF0aC5wb3coMTAsZltoKzFdLmxlbmd0aCktMSxoKz0zKSk6Ii8iPT09ZltoKzFdfHwiOiI9PT1mW2grMV0/KGE9YXkoZltoXSxvKSxjPWF5KGZbaCsyXSwxKSxoKz0zKToiLyI9PT1mW2grM10mJiIgIj09PWZbaCsxXSYmKHM9YXkoZltoXSxvKSxhPWF5KGZbaCsyXSxvKSxjPWF5KGZbaCs0XSwxKSxoKz01KSxmLmxlbmd0aDw9aCl7bz1yPXUrKGk9YypsKSpzK2wqYTticmVha31kZWZhdWx0OnRocm93IGR5KCl9aWYoMD09PWkpdGhyb3cgcHkoKTtzeS5zPW88MD8tMToxLHN5Lm49TWF0aC5hYnMociksc3kuZD1NYXRoLmFicyhpKX07ZnVuY3Rpb24gaHkodCxlKXtpZighdClyZXR1cm4gZTtpZighZSlyZXR1cm4gdDtmb3IoOzspe2lmKCEodCU9ZSkpcmV0dXJuIGU7aWYoIShlJT10KSlyZXR1cm4gdH19ZnVuY3Rpb24gZnkodCxlKXtpZihseSh0LGUpLCEodGhpcyBpbnN0YW5jZW9mIGZ5KSlyZXR1cm4gdXkoc3kucypzeS5uLHN5LmQpO3Q9aHkoc3kuZCxzeS5uKSx0aGlzLnM9c3kucyx0aGlzLm49c3kubi90LHRoaXMuZD1zeS5kL3R9dmFyIHB5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcigiRGl2aXNpb24gYnkgWmVybyIpfSxkeT1mdW5jdGlvbigpe3JldHVybiBuZXcgRXJyb3IoIkludmFsaWQgYXJndW1lbnQiKX0sZ3k9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEVycm9yKCJQYXJhbWV0ZXJzIG11c3QgYmUgaW50ZWdlciIpfTtmeS5wcm90b3R5cGU9e3M6MSxuOjAsZDoxLGFiczpmdW5jdGlvbigpe3JldHVybiB1eSh0aGlzLm4sdGhpcy5kKX0sbmVnOmZ1bmN0aW9uKCl7cmV0dXJuIHV5KC10aGlzLnMqdGhpcy5uLHRoaXMuZCl9LGFkZDpmdW5jdGlvbih0LGUpe3JldHVybiBseSh0LGUpLHV5KHRoaXMucyp0aGlzLm4qc3kuZCtzeS5zKnRoaXMuZCpzeS5uLHRoaXMuZCpzeS5kKX0sc3ViOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGx5KHQsZSksdXkodGhpcy5zKnRoaXMubipzeS5kLXN5LnMqdGhpcy5kKnN5Lm4sdGhpcy5kKnN5LmQpfSxtdWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHkodCxlKSx1eSh0aGlzLnMqc3kucyp0aGlzLm4qc3kubix0aGlzLmQqc3kuZCl9LGRpdjpmdW5jdGlvbih0LGUpe3JldHVybiBseSh0LGUpLHV5KHRoaXMucypzeS5zKnRoaXMubipzeS5kLHRoaXMuZCpzeS5uKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdXkodGhpcy5zKnRoaXMubix0aGlzLmQpfSxtb2Q6ZnVuY3Rpb24odCxlKXtpZihpc05hTih0aGlzLm4pfHxpc05hTih0aGlzLmQpKXJldHVybiBuZXcgZnkoTmFOKTtpZih2b2lkIDA9PT10KXJldHVybiB1eSh0aGlzLnMqdGhpcy5uJXRoaXMuZCwxKTtpZihseSh0LGUpLDA9PT1zeS5uJiYwPT09dGhpcy5kKXRocm93IHB5KCk7cmV0dXJuIHV5KHRoaXMucyooc3kuZCp0aGlzLm4pJShzeS5uKnRoaXMuZCksc3kuZCp0aGlzLmQpfSxnY2Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHkodCxlKSx1eShoeShzeS5uLHRoaXMubikqaHkoc3kuZCx0aGlzLmQpLHN5LmQqdGhpcy5kKX0sbGNtOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGx5KHQsZSksMD09PXN5Lm4mJjA9PT10aGlzLm4/dXkoMCwxKTp1eShzeS5uKnRoaXMubixoeShzeS5uLHRoaXMubikqaHkoc3kuZCx0aGlzLmQpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdygxMCx0fHwwKSxpc05hTih0aGlzLm4pfHxpc05hTih0aGlzLmQpP25ldyBmeShOYU4pOnV5KE1hdGguY2VpbCh0KnRoaXMucyp0aGlzLm4vdGhpcy5kKSx0KX0sZmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksaXNOYU4odGhpcy5uKXx8aXNOYU4odGhpcy5kKT9uZXcgZnkoTmFOKTp1eShNYXRoLmZsb29yKHQqdGhpcy5zKnRoaXMubi90aGlzLmQpLHQpfSxyb3VuZDpmdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdygxMCx0fHwwKSxpc05hTih0aGlzLm4pfHxpc05hTih0aGlzLmQpP25ldyBmeShOYU4pOnV5KE1hdGgucm91bmQodCp0aGlzLnMqdGhpcy5uL3RoaXMuZCksdCl9LHJvdW5kVG86ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHkodCxlKSx1eSh0aGlzLnMqTWF0aC5yb3VuZCh0aGlzLm4qc3kuZC8odGhpcy5kKnN5Lm4pKSpzeS5uLHN5LmQpfSxpbnZlcnNlOmZ1bmN0aW9uKCl7cmV0dXJuIHV5KHRoaXMucyp0aGlzLmQsdGhpcy5uKX0scG93OmZ1bmN0aW9uKHQsZSl7aWYobHkodCxlKSwxPT09c3kuZClyZXR1cm4gc3kuczwwP3V5KE1hdGgucG93KHRoaXMucyp0aGlzLmQsc3kubiksTWF0aC5wb3codGhpcy5uLHN5Lm4pKTp1eShNYXRoLnBvdyh0aGlzLnMqdGhpcy5uLHN5Lm4pLE1hdGgucG93KHRoaXMuZCxzeS5uKSk7aWYodGhpcy5zPDApcmV0dXJuIG51bGw7dmFyIG49Y3kodGhpcy5uKSxyPWN5KHRoaXMuZCksaT0xLG89MTtmb3IodmFyIHMgaW4gbilpZigiMSIhPT1zKXtpZigiMCI9PT1zKXtpPTA7YnJlYWt9aWYobltzXSo9c3kubixuW3NdJXN5LmQhPTApcmV0dXJuIG51bGw7bltzXS89c3kuZCxpKj1NYXRoLnBvdyhzLG5bc10pfWZvcih2YXIgcyBpbiByKWlmKCIxIiE9PXMpe2lmKHJbc10qPXN5Lm4scltzXSVzeS5kIT0wKXJldHVybiBudWxsO3Jbc10vPXN5LmQsbyo9TWF0aC5wb3cocyxyW3NdKX1yZXR1cm4gc3kuczwwP3V5KG8saSk6dXkoaSxvKX0sZXF1YWxzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGx5KHQsZSksdGhpcy5zKnRoaXMubipzeS5kPT1zeS5zKnN5Lm4qdGhpcy5kfSxjb21wYXJlOmZ1bmN0aW9uKHQsZSl7bHkodCxlKTt2YXIgbj10aGlzLnMqdGhpcy5uKnN5LmQtc3kucypzeS5uKnRoaXMuZDtyZXR1cm4oMDxuKS0objwwKX0sc2ltcGxpZnk6ZnVuY3Rpb24odCl7aWYoaXNOYU4odGhpcy5uKXx8aXNOYU4odGhpcy5kKSlyZXR1cm4gdGhpczt0PXR8fC4wMDE7Zm9yKHZhciBlPXRoaXMuYWJzKCksbj1lLnRvQ29udGludWVkKCkscj0xO3I8bi5sZW5ndGg7cisrKXtmb3IodmFyIGk9dXkobltyLTFdLDEpLG89ci0yO28+PTA7by0tKWk9aS5pbnZlcnNlKCkuYWRkKG5bb10pO2lmKE1hdGguYWJzKGkuc3ViKGUpLnZhbHVlT2YoKSk8dClyZXR1cm4gaS5tdWwodGhpcy5zKX1yZXR1cm4gdGhpc30sZGl2aXNpYmxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGx5KHQsZSksISghKHN5Lm4qdGhpcy5kKXx8dGhpcy5uKnN5LmQlKHN5Lm4qdGhpcy5kKSl9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zKnRoaXMubi90aGlzLmR9LHRvRnJhY3Rpb246ZnVuY3Rpb24odCl7dmFyIGUsbj0iIixyPXRoaXMubixpPXRoaXMuZDtyZXR1cm4gdGhpcy5zPDAmJihuKz0iLSIpLDE9PT1pP24rPXI6KHQmJihlPU1hdGguZmxvb3Ioci9pKSk+MCYmKG4rPWUsbis9IiAiLHIlPWkpLG4rPXIsbis9Ii8iLG4rPWkpLG59LHRvTGF0ZXg6ZnVuY3Rpb24odCl7dmFyIGUsbj0iIixyPXRoaXMubixpPXRoaXMuZDtyZXR1cm4gdGhpcy5zPDAmJihuKz0iLSIpLDE9PT1pP24rPXI6KHQmJihlPU1hdGguZmxvb3Ioci9pKSk+MCYmKG4rPWUsciU9aSksbis9IlxcZnJhY3siLG4rPXIsbis9In17IixuKz1pLG4rPSJ9Iiksbn0sdG9Db250aW51ZWQ6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMubixuPXRoaXMuZCxyPVtdO2lmKGlzTmFOKGUpfHxpc05hTihuKSlyZXR1cm4gcjtkb3tyLnB1c2goTWF0aC5mbG9vcihlL24pKSx0PWUlbixlPW4sbj10fXdoaWxlKDEhPT1lKTtyZXR1cm4gcn0sdG9TdHJpbmc6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5uLG49dGhpcy5kO2lmKGlzTmFOKGUpfHxpc05hTihuKSlyZXR1cm4iTmFOIjt0PXR8fDE1O3ZhciByPWZ1bmN0aW9uKHQsZSl7Zm9yKDtlJTI9PTA7ZS89Mik7Zm9yKDtlJTU9PTA7ZS89NSk7aWYoMT09PWUpcmV0dXJuIDA7Zm9yKHZhciBuPTEwJWUscj0xOzEhPT1uO3IrKylpZihuPTEwKm4lZSxyPjJlMylyZXR1cm4gMDtyZXR1cm4gcn0oMCxuKSxpPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MSxpPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MTtlPjA7dD10KnQlbixlPj49MSkxJmUmJihyPXIqdCVuKTtyZXR1cm4gcn0oMTAsbixlKSxvPTA7bzwzMDA7bysrKXtpZihyPT09aSlyZXR1cm4gbztyPTEwKnIlZSxpPTEwKmklZX1yZXR1cm4gMH0oMCxuLHIpLG89dGhpcy5zPDA/Ii0iOiIiO2lmKG8rPWUvbnwwLGUlPW4sKGUqPTEwKSYmKG8rPSIuIikscil7Zm9yKHZhciBzPWk7cy0tOylvKz1lL258MCxlJT1uLGUqPTEwO28rPSIoIjtmb3Iocz1yO3MtLTspbys9ZS9ufDAsZSU9bixlKj0xMDtvKz0iKSJ9ZWxzZSBmb3Iocz10O2UmJnMtLTspbys9ZS9ufDAsZSU9bixlKj0xMDtyZXR1cm4gb319O3ZhciB5eT10ZCgiRnJhY3Rpb24iLFtdLCgoKT0+KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmeSwibmFtZSIse3ZhbHVlOiJGcmFjdGlvbiJ9KSxmeS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZnksZnkucHJvdG90eXBlLnR5cGU9IkZyYWN0aW9uIixmeS5wcm90b3R5cGUuaXNGcmFjdGlvbj0hMCxmeS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiRnJhY3Rpb24iLG46dGhpcy5zKnRoaXMubixkOnRoaXMuZH19LGZ5LmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZnkodCl9LGZ5KSkse2lzQ2xhc3M6ITB9KSxteT10ZCgiTWF0cml4IixbXSwoKCk9PntmdW5jdGlvbiB0KCl7aWYoISh0aGlzIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKX1yZXR1cm4gdC5wcm90b3R5cGUudHlwZT0iTWF0cml4Iix0LnByb3RvdHlwZS5pc01hdHJpeD0hMCx0LnByb3RvdHlwZS5zdG9yYWdlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHN0b3JhZ2Ugb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmRhdGF0eXBlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGRhdGF0eXBlIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgY3JlYXRlIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5zdWJzZXQ9ZnVuY3Rpb24odCxlLG4pe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzdWJzZXQgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgZ2V0IG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzZXQgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSByZXNpemUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnJlc2hhcGU9ZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgcmVzaGFwZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgY2xvbmUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc2l6ZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIG1hcCBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgZm9yRWFjaCBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGl0ZXJhdGUgYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgdG9BcnJheSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSB2YWx1ZU9mIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5mb3JtYXQ9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGZvcm1hdCBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgdG9TdHJpbmcgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHR9KSx7aXNDbGFzczohMH0pO2Z1bmN0aW9uIHZ5KHQpe3JldHVybiBPYmplY3Qua2V5cyh0LnNpZ25hdHVyZXN8fHt9KS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7dmFyIG49KGUubWF0Y2goLywvZyl8fFtdKS5sZW5ndGgrMTtyZXR1cm4gTWF0aC5tYXgodCxuKX0pLC0xKX12YXIgX3k9dGQoIkRlbnNlTWF0cml4IixbIk1hdHJpeCJdLCh0PT57dmFye01hdHJpeDplfT10O2Z1bmN0aW9uIG4odCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO2lmKGUmJiFSZihlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0YXR5cGU6ICIrZSk7aWYoa2YodCkpIkRlbnNlTWF0cml4Ij09PXQudHlwZT8odGhpcy5fZGF0YT1tcCh0Ll9kYXRhKSx0aGlzLl9zaXplPW1wKHQuX3NpemUpLHRoaXMuX2RhdGF0eXBlPWV8fHQuX2RhdGF0eXBlKToodGhpcy5fZGF0YT10LnRvQXJyYXkoKSx0aGlzLl9zaXplPXQuc2l6ZSgpLHRoaXMuX2RhdGF0eXBlPWV8fHQuX2RhdGF0eXBlKTtlbHNlIGlmKHQmJkJmKHQuZGF0YSkmJkJmKHQuc2l6ZSkpdGhpcy5fZGF0YT10LmRhdGEsdGhpcy5fc2l6ZT10LnNpemUsR3AodGhpcy5fZGF0YSx0aGlzLl9zaXplKSx0aGlzLl9kYXRhdHlwZT1lfHx0LmRhdGF0eXBlO2Vsc2UgaWYoQmYodCkpdGhpcy5fZGF0YT1hKHQpLHRoaXMuX3NpemU9cXAodGhpcy5fZGF0YSksR3AodGhpcy5fZGF0YSx0aGlzLl9zaXplKSx0aGlzLl9kYXRhdHlwZT1lO2Vsc2V7aWYodCl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbnN1cHBvcnRlZCB0eXBlIG9mIGRhdGEgKCIreXAodCkrIikiKTt0aGlzLl9kYXRhPVtdLHRoaXMuX3NpemU9WzBdLHRoaXMuX2RhdGF0eXBlPWV9fWZ1bmN0aW9uIHIodCxlLG4saSl7dmFyIG89aT09PW4tMSxzPWUuZGltZW5zaW9uKGkpO3JldHVybiBvP3MubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gWXAoZSx0Lmxlbmd0aCksdFtlXX0pKS52YWx1ZU9mKCk6cy5tYXAoKGZ1bmN0aW9uKG8pe3JldHVybiBZcChvLHQubGVuZ3RoKSxyKHRbb10sZSxuLGkrMSl9KSkudmFsdWVPZigpfWZ1bmN0aW9uIGkodCxlLG4scixvKXt2YXIgcz1vPT09ci0xLGE9ZS5kaW1lbnNpb24obyk7cz9hLmZvckVhY2goKGZ1bmN0aW9uKGUscil7WXAoZSksdFtlXT1uW3JbMF1dfSkpOmEuZm9yRWFjaCgoZnVuY3Rpb24ocyxhKXtZcChzKSxpKHRbc10sZSxuW2FbMF1dLHIsbysxKX0pKX1mdW5jdGlvbiBvKHQsZSxuKXtpZigwPT09ZS5sZW5ndGgpe2Zvcih2YXIgcj10Ll9kYXRhO0JmKHIpOylyPXJbMF07cmV0dXJuIHJ9cmV0dXJuIHQuX3NpemU9ZS5zbGljZSgwKSx0Ll9kYXRhPVhwKHQuX2RhdGEsdC5fc2l6ZSxuKSx0fWZ1bmN0aW9uIHModCxlLG4pe2Zvcih2YXIgcj10Ll9zaXplLnNsaWNlKDApLGk9ITE7ci5sZW5ndGg8ZS5sZW5ndGg7KXIucHVzaCgwKSxpPSEwO2Zvcih2YXIgcz0wLGE9ZS5sZW5ndGg7czxhO3MrKyllW3NdPnJbc10mJihyW3NdPWVbc10saT0hMCk7aSYmbyh0LHIsbil9ZnVuY3Rpb24gYSh0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRbZV07QmYocik/dFtlXT1hKHIpOnImJiEwPT09ci5pc01hdHJpeCYmKHRbZV09YShyLnZhbHVlT2YoKSkpfXJldHVybiB0fXJldHVybiBuLnByb3RvdHlwZT1uZXcgZSxuLnByb3RvdHlwZS5jcmVhdGVEZW5zZU1hdHJpeD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgbih0LGUpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwibmFtZSIse3ZhbHVlOiJEZW5zZU1hdHJpeCJ9KSxuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1uLG4ucHJvdG90eXBlLnR5cGU9IkRlbnNlTWF0cml4IixuLnByb3RvdHlwZS5pc0RlbnNlTWF0cml4PSEwLG4ucHJvdG90eXBlLmdldERhdGFUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuICRwKHRoaXMuX2RhdGEseXApfSxuLnByb3RvdHlwZS5zdG9yYWdlPWZ1bmN0aW9uKCl7cmV0dXJuImRlbnNlIn0sbi5wcm90b3R5cGUuZGF0YXR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YXR5cGV9LG4ucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgbih0LGUpfSxuLnByb3RvdHlwZS5zdWJzZXQ9ZnVuY3Rpb24odCxlLG8pe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoIVZmKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaW5kZXgiKTt2YXIgaT1lLmlzU2NhbGFyKCk7aWYoaSlyZXR1cm4gdC5nZXQoZS5taW4oKSk7dmFyIG89ZS5zaXplKCk7aWYoby5sZW5ndGghPT10Ll9zaXplLmxlbmd0aCl0aHJvdyBuZXcganAoby5sZW5ndGgsdC5fc2l6ZS5sZW5ndGgpO2Zvcih2YXIgcz1lLm1pbigpLGE9ZS5tYXgoKSx1PTAsYz10Ll9zaXplLmxlbmd0aDt1PGM7dSsrKVlwKHNbdV0sdC5fc2l6ZVt1XSksWXAoYVt1XSx0Ll9zaXplW3VdKTtyZXR1cm4gbmV3IG4ocih0Ll9kYXRhLGUsby5sZW5ndGgsMCksdC5fZGF0YXR5cGUpfSh0aGlzLHQpO2Nhc2UgMjpjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIpe2lmKCFlfHwhMCE9PWUuaXNJbmRleCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGluZGV4Iik7dmFyIG8sYT1lLnNpemUoKSx1PWUuaXNTY2FsYXIoKTtpZihrZihuKT8obz1uLnNpemUoKSxuPW4udmFsdWVPZigpKTpvPXFwKG4pLHUpe2lmKDAhPT1vLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTY2FsYXIgZXhwZWN0ZWQiKTt0LnNldChlLm1pbigpLG4scil9ZWxzZXtpZihhLmxlbmd0aDx0Ll9zaXplLmxlbmd0aCl0aHJvdyBuZXcganAoYS5sZW5ndGgsdC5fc2l6ZS5sZW5ndGgsIjwiKTtpZihvLmxlbmd0aDxhLmxlbmd0aCl7Zm9yKHZhciBjPTAsbD0wOzE9PT1hW2NdJiYxPT09b1tjXTspYysrO2Zvcig7MT09PWFbY107KWwrKyxjKys7bj1KcChuLGEubGVuZ3RoLGwsbyl9aWYoIXZwKGEsbykpdGhyb3cgbmV3IGpwKGEsbywiPiIpO3ModCxlLm1heCgpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQrMX0pKSxyKTt2YXIgaD1hLmxlbmd0aCxmPTA7aSh0Ll9kYXRhLGUsbixoLGYpfXJldHVybiB0fSh0aGlzLHQsZSxvKTtkZWZhdWx0OnRocm93IG5ldyBTeW50YXhFcnJvcigiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyIpfX0sbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKCFCZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCIpO2lmKHQubGVuZ3RoIT09dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IGpwKHQubGVuZ3RoLHRoaXMuX3NpemUubGVuZ3RoKTtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylZcCh0W2VdLHRoaXMuX3NpemVbZV0pO2Zvcih2YXIgbj10aGlzLl9kYXRhLHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspe3ZhciBvPXRbcl07WXAobyxuLmxlbmd0aCksbj1uW29dfXJldHVybiBufSxuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe2lmKCFCZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCIpO2lmKHQubGVuZ3RoPHRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBqcCh0Lmxlbmd0aCx0aGlzLl9zaXplLmxlbmd0aCwiPCIpO3ZhciByLGksbztzKHRoaXMsdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0KzF9KSksbik7dmFyIGE9dGhpcy5fZGF0YTtmb3Iocj0wLGk9dC5sZW5ndGgtMTtyPGk7cisrKVlwKG89dFtyXSxhLmxlbmd0aCksYT1hW29dO3JldHVybiBZcChvPXRbdC5sZW5ndGgtMV0sYS5sZW5ndGgpLGFbb109ZSx0aGlzfSxuLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCxlLG4pe2lmKCF6Zih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBvciBNYXRyaXggZXhwZWN0ZWQiKTt2YXIgcj10LnZhbHVlT2YoKS5tYXAoKHQ9PkFycmF5LmlzQXJyYXkodCkmJjE9PT10Lmxlbmd0aD90WzBdOnQpKTtyZXR1cm4gbyhuP3RoaXMuY2xvbmUoKTp0aGlzLHIsZSl9LG4ucHJvdG90eXBlLnJlc2hhcGU9ZnVuY3Rpb24odCxlKXt2YXIgbj1lP3RoaXMuY2xvbmUoKTp0aGlzO24uX2RhdGE9SHAobi5fZGF0YSx0KTt2YXIgcj1uLl9zaXplLnJlZHVjZSgoKHQsZSk9PnQqZSkpO3JldHVybiBuLl9zaXplPVpwKHQsciksbn0sbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4oe2RhdGE6bXAodGhpcy5fZGF0YSksc2l6ZTptcCh0aGlzLl9zaXplKSxkYXRhdHlwZTp0aGlzLl9kYXRhdHlwZX0pfSxuLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NpemUuc2xpY2UoMCl9LG4ucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLHI9dnkodCksaT1mdW5jdGlvbiBuKGksbyl7cmV0dXJuIEJmKGkpP2kubWFwKChmdW5jdGlvbih0LGUpe3JldHVybiBuKHQsby5jb25jYXQoZSkpfSkpOjE9PT1yP3QoaSk6Mj09PXI/dChpLG8pOnQoaSxvLGUpfSh0aGlzLl9kYXRhLFtdKTtyZXR1cm4gbmV3IG4oaSx2b2lkIDAhPT10aGlzLl9kYXRhdHlwZT8kcChpLHlwKTp2b2lkIDApfSxuLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7IWZ1bmN0aW9uIG4ocixpKXtCZihyKT9yLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7bih0LGkuY29uY2F0KGUpKX0pKTp0KHIsaSxlKX0odGhpcy5fZGF0YSxbXSl9LG4ucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24qKCl7eWllbGQqZnVuY3Rpb24qdChlLG4pe2lmKEJmKGUpKWZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXlpZWxkKnQoZVtyXSxuLmNvbmNhdChyKSk7ZWxzZSB5aWVsZHt2YWx1ZTplLGluZGV4Om59fSh0aGlzLl9kYXRhLFtdKX0sbi5wcm90b3R5cGUucm93cz1mdW5jdGlvbigpe3ZhciB0PVtdO2lmKDIhPT10aGlzLnNpemUoKS5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiUm93cyBjYW4gb25seSBiZSByZXR1cm5lZCBmb3IgYSAyRCBtYXRyaXguIik7dmFyIGU9dGhpcy5fZGF0YTtmb3IodmFyIHIgb2YgZSl0LnB1c2gobmV3IG4oW3JdLHRoaXMuX2RhdGF0eXBlKSk7cmV0dXJuIHR9LG4ucHJvdG90eXBlLmNvbHVtbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9W10scj10aGlzLnNpemUoKTtpZigyIT09ci5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiUm93cyBjYW4gb25seSBiZSByZXR1cm5lZCBmb3IgYSAyRCBtYXRyaXguIik7Zm9yKHZhciBpPXRoaXMuX2RhdGEsbz1mdW5jdGlvbihyKXt2YXIgbz1pLm1hcCgodD0+W3Rbcl1dKSk7ZS5wdXNoKG5ldyBuKG8sdC5fZGF0YXR5cGUpKX0scz0wO3M8clsxXTtzKyspbyhzKTtyZXR1cm4gZX0sbi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiBtcCh0aGlzLl9kYXRhKX0sbi5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxuLnByb3RvdHlwZS5mb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGtwKHRoaXMuX2RhdGEsdCl9LG4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGtwKHRoaXMuX2RhdGEpfSxuLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJEZW5zZU1hdHJpeCIsZGF0YTp0aGlzLl9kYXRhLHNpemU6dGhpcy5fc2l6ZSxkYXRhdHlwZTp0aGlzLl9kYXRhdHlwZX19LG4ucHJvdG90eXBlLmRpYWdvbmFsPWZ1bmN0aW9uKHQpe2lmKHQpe2lmKEZmKHQpJiYodD10LnRvTnVtYmVyKCkpLCFNZih0KXx8IVNwKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXJhbWV0ZXIgayBtdXN0IGJlIGFuIGludGVnZXIgbnVtYmVyIil9ZWxzZSB0PTA7Zm9yKHZhciBlPXQ+MD90OjAscj10PDA/LXQ6MCxpPXRoaXMuX3NpemVbMF0sbz10aGlzLl9zaXplWzFdLHM9TWF0aC5taW4oaS1yLG8tZSksYT1bXSx1PTA7dTxzO3UrKylhW3VdPXRoaXMuX2RhdGFbdStyXVt1K2VdO3JldHVybiBuZXcgbih7ZGF0YTphLHNpemU6W3NdLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfSl9LG4uZGlhZ29uYWw9ZnVuY3Rpb24odCxlLHIsaSl7aWYoIUJmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkLCBzaXplIHBhcmFtZXRlciIpO2lmKDIhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgdHdvIGRpbWVuc2lvbnMgbWF0cml4IGFyZSBzdXBwb3J0ZWQiKTtpZih0PXQubWFwKChmdW5jdGlvbih0KXtpZihGZih0KSYmKHQ9dC50b051bWJlcigpKSwhTWYodCl8fCFTcCh0KXx8dDwxKXRocm93IG5ldyBFcnJvcigiU2l6ZSB2YWx1ZXMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VycyIpO3JldHVybiB0fSkpLHIpe2lmKEZmKHIpJiYocj1yLnRvTnVtYmVyKCkpLCFNZihyKXx8IVNwKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXJhbWV0ZXIgayBtdXN0IGJlIGFuIGludGVnZXIgbnVtYmVyIil9ZWxzZSByPTA7dmFyIG8scz1yPjA/cjowLGE9cjwwPy1yOjAsdT10WzBdLGM9dFsxXSxsPU1hdGgubWluKHUtYSxjLXMpO2lmKEJmKGUpKXtpZihlLmxlbmd0aCE9PWwpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHZhbHVlIGFycmF5IGxlbmd0aCIpO289ZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19fWVsc2UgaWYoa2YoZSkpe3ZhciBoPWUuc2l6ZSgpO2lmKDEhPT1oLmxlbmd0aHx8aFswXSE9PWwpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG1hdHJpeCBsZW5ndGgiKTtvPWZ1bmN0aW9uKHQpe3JldHVybiBlLmdldChbdF0pfX1lbHNlIG89ZnVuY3Rpb24oKXtyZXR1cm4gZX07aXx8KGk9RmYobygwKSk/bygwKS5tdWwoMCk6MCk7dmFyIGY9W107aWYodC5sZW5ndGg+MCl7Zj1YcChmLHQsaSk7Zm9yKHZhciBwPTA7cDxsO3ArKylmW3ArYV1bcCtzXT1vKHApfXJldHVybiBuZXcgbih7ZGF0YTpmLHNpemU6W3UsY119KX0sbi5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odCl9LG4ucHJvdG90eXBlLnN3YXBSb3dzPWZ1bmN0aW9uKHQsZSl7aWYoIShNZih0KSYmU3AodCkmJk1mKGUpJiZTcChlKSkpdGhyb3cgbmV3IEVycm9yKCJSb3cgaW5kZXggbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VycyIpO2lmKDIhPT10aGlzLl9zaXplLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgdHdvIGRpbWVuc2lvbmFsIG1hdHJpeCBpcyBzdXBwb3J0ZWQiKTtyZXR1cm4gWXAodCx0aGlzLl9zaXplWzBdKSxZcChlLHRoaXMuX3NpemVbMF0pLG4uX3N3YXBSb3dzKHQsZSx0aGlzLl9kYXRhKSx0aGlzfSxuLl9zd2FwUm93cz1mdW5jdGlvbih0LGUsbil7dmFyIHI9blt0XTtuW3RdPW5bZV0sbltlXT1yfSxufSkse2lzQ2xhc3M6ITB9KTtmdW5jdGlvbiB4eSh0LGUsbil7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm1hcD90Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHh5KHQsZSl9KSk6ZSh0KX12YXIgd3k9ImlzSW50ZWdlciIsYnk9dGQod3ksWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGUod3kse251bWJlcjpTcCxCaWdOdW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNJbnQoKX0sRnJhY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10LmQmJmlzRmluaXRlKHQubil9LCJBcnJheSB8IE1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+ZT0+eHkoZSx0KSkpfSl9KSksRHk9Im51bWJlciwgbnVtYmVyIjtmdW5jdGlvbiBFeSh0LGUpe3JldHVybiB0K2V9ZnVuY3Rpb24gQ3kodCxlKXtyZXR1cm4gdCplfWZ1bmN0aW9uIFN5KHQsZSxuKXtpZihudWxsPT1uKXJldHVybiB0LmVxKGUpO2lmKHQuZXEoZSkpcmV0dXJuITA7aWYodC5pc05hTigpfHxlLmlzTmFOKCkpcmV0dXJuITE7aWYodC5pc0Zpbml0ZSgpJiZlLmlzRmluaXRlKCkpe3ZhciByPXQubWludXMoZSkuYWJzKCk7aWYoci5pc1plcm8oKSlyZXR1cm4hMDt2YXIgaT10LmNvbnN0cnVjdG9yLm1heCh0LmFicygpLGUuYWJzKCkpO3JldHVybiByLmx0ZShpLnRpbWVzKG4pKX1yZXR1cm4hMX1FeS5zaWduYXR1cmU9RHksQ3kuc2lnbmF0dXJlPUR5O3ZhciBBeT10ZCgiY29tcGFyZVVuaXRzIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm57IlVuaXQsIFVuaXQiOmUucmVmZXJUb1NlbGYoKHQ9PihuLHIpPT57aWYoIW4uZXF1YWxCYXNlKHIpKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbXBhcmUgdW5pdHMgd2l0aCBkaWZmZXJlbnQgYmFzZSIpO3JldHVybiBlLmZpbmQodCxbbi52YWx1ZVR5cGUoKSxyLnZhbHVlVHlwZSgpXSkobi52YWx1ZSxyLnZhbHVlKX0pKX19KSksTnk9ImVxdWFsU2NhbGFyIixJeT10ZChOeSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dCxyPUF5KHt0eXBlZDplfSk7cmV0dXJuIGUoTnkseyJib29sZWFuLCBib29sZWFuIjpmdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZX0sIm51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiBMcCh0LGUsbi5lcHNpbG9uKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmVxKGUpfHxTeSh0LGUsbi5lcHNpbG9uKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5lcXVhbHMoZSl9LCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbih0LGUsbil7cmV0dXJuIExwKHQucmUsZS5yZSxuKSYmTHAodC5pbSxlLmltLG4pfSh0LGUsbi5lcHNpbG9uKX19LHIpfSkpO3RkKE55LFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10O3JldHVybiBlKE55LHsibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIExwKHQsZSxuLmVwc2lsb24pfX0pfSkpO3ZhciBNeT10ZCgiU3BhcnNlTWF0cml4IixbInR5cGVkIiwiZXF1YWxTY2FsYXIiLCJNYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm4sTWF0cml4OnJ9PXQ7ZnVuY3Rpb24gaSh0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGkpKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7aWYoZSYmIVJmKGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBkYXRhdHlwZTogIitlKTtpZihrZih0KSkhZnVuY3Rpb24odCxlLG4peyJTcGFyc2VNYXRyaXgiPT09ZS50eXBlPyh0Ll92YWx1ZXM9ZS5fdmFsdWVzP21wKGUuX3ZhbHVlcyk6dm9pZCAwLHQuX2luZGV4PW1wKGUuX2luZGV4KSx0Ll9wdHI9bXAoZS5fcHRyKSx0Ll9zaXplPW1wKGUuX3NpemUpLHQuX2RhdGF0eXBlPW58fGUuX2RhdGF0eXBlKTpvKHQsZS52YWx1ZU9mKCksbnx8ZS5fZGF0YXR5cGUpfSh0aGlzLHQsZSk7ZWxzZSBpZih0JiZCZih0LmluZGV4KSYmQmYodC5wdHIpJiZCZih0LnNpemUpKXRoaXMuX3ZhbHVlcz10LnZhbHVlcyx0aGlzLl9pbmRleD10LmluZGV4LHRoaXMuX3B0cj10LnB0cix0aGlzLl9zaXplPXQuc2l6ZSx0aGlzLl9kYXRhdHlwZT1lfHx0LmRhdGF0eXBlO2Vsc2UgaWYoQmYodCkpbyh0aGlzLHQsZSk7ZWxzZXtpZih0KXRocm93IG5ldyBUeXBlRXJyb3IoIlVuc3VwcG9ydGVkIHR5cGUgb2YgZGF0YSAoIit5cCh0KSsiKSIpO3RoaXMuX3ZhbHVlcz1bXSx0aGlzLl9pbmRleD1bXSx0aGlzLl9wdHI9WzBdLHRoaXMuX3NpemU9WzAsMF0sdGhpcy5fZGF0YXR5cGU9ZX19ZnVuY3Rpb24gbyh0LHIsaSl7dC5fdmFsdWVzPVtdLHQuX2luZGV4PVtdLHQuX3B0cj1bXSx0Ll9kYXRhdHlwZT1pO3ZhciBvPXIubGVuZ3RoLHM9MCxhPW4sdT0wO2lmKFJmKGkpJiYoYT1lLmZpbmQobixbaSxpXSl8fG4sdT1lLmNvbnZlcnQoMCxpKSksbz4wKXt2YXIgYz0wO2Rve3QuX3B0ci5wdXNoKHQuX2luZGV4Lmxlbmd0aCk7Zm9yKHZhciBsPTA7bDxvO2wrKyl7dmFyIGg9cltsXTtpZihCZihoKSl7aWYoMD09PWMmJnM8aC5sZW5ndGgmJihzPWgubGVuZ3RoKSxjPGgubGVuZ3RoKXt2YXIgZj1oW2NdO2EoZix1KXx8KHQuX3ZhbHVlcy5wdXNoKGYpLHQuX2luZGV4LnB1c2gobCkpfX1lbHNlIDA9PT1jJiZzPDEmJihzPTEpLGEoaCx1KXx8KHQuX3ZhbHVlcy5wdXNoKGgpLHQuX2luZGV4LnB1c2gobCkpfWMrK313aGlsZShjPHMpfXQuX3B0ci5wdXNoKHQuX2luZGV4Lmxlbmd0aCksdC5fc2l6ZT1bbyxzXX1mdW5jdGlvbiBzKHQsZSxuLHIpe2lmKG4tZT09MClyZXR1cm4gbjtmb3IodmFyIGk9ZTtpPG47aSsrKWlmKHJbaV09PT10KXJldHVybiBpO3JldHVybiBlfWZ1bmN0aW9uIGEodCxlLG4scixpLG8scyl7aS5zcGxpY2UodCwwLHIpLG8uc3BsaWNlKHQsMCxlKTtmb3IodmFyIGE9bisxO2E8cy5sZW5ndGg7YSsrKXNbYV0rK31mdW5jdGlvbiB1KHQscixpLG8pe3ZhciBzPW98fDAsYT1uLHU9MDtSZih0Ll9kYXRhdHlwZSkmJihhPWUuZmluZChuLFt0Ll9kYXRhdHlwZSx0Ll9kYXRhdHlwZV0pfHxuLHU9ZS5jb252ZXJ0KDAsdC5fZGF0YXR5cGUpLHM9ZS5jb252ZXJ0KHMsdC5fZGF0YXR5cGUpKTt2YXIgYyxsLGgsZj0hYShzLHUpLHA9dC5fc2l6ZVswXSxkPXQuX3NpemVbMV07aWYoaT5kKXtmb3IobD1kO2w8aTtsKyspaWYodC5fcHRyW2xdPXQuX3ZhbHVlcy5sZW5ndGgsZilmb3IoYz0wO2M8cDtjKyspdC5fdmFsdWVzLnB1c2gocyksdC5faW5kZXgucHVzaChjKTt0Ll9wdHJbaV09dC5fdmFsdWVzLmxlbmd0aH1lbHNlIGk8ZCYmKHQuX3B0ci5zcGxpY2UoaSsxLGQtaSksdC5fdmFsdWVzLnNwbGljZSh0Ll9wdHJbaV0sdC5fdmFsdWVzLmxlbmd0aCksdC5faW5kZXguc3BsaWNlKHQuX3B0cltpXSx0Ll9pbmRleC5sZW5ndGgpKTtpZihkPWkscj5wKXtpZihmKXt2YXIgZz0wO2ZvcihsPTA7bDxkO2wrKyl7dC5fcHRyW2xdPXQuX3B0cltsXStnLGg9dC5fcHRyW2wrMV0rZzt2YXIgeT0wO2ZvcihjPXA7YzxyO2MrKyx5KyspdC5fdmFsdWVzLnNwbGljZShoK3ksMCxzKSx0Ll9pbmRleC5zcGxpY2UoaCt5LDAsYyksZysrfXQuX3B0cltkXT10Ll92YWx1ZXMubGVuZ3RofX1lbHNlIGlmKHI8cCl7dmFyIG09MDtmb3IobD0wO2w8ZDtsKyspe3QuX3B0cltsXT10Ll9wdHJbbF0tbTt2YXIgdj10Ll9wdHJbbF0sXz10Ll9wdHJbbCsxXS1tO2ZvcihoPXY7aDxfO2grKykoYz10Ll9pbmRleFtoXSk+ci0xJiYodC5fdmFsdWVzLnNwbGljZShoLDEpLHQuX2luZGV4LnNwbGljZShoLDEpLG0rKyl9dC5fcHRyW2xdPXQuX3ZhbHVlcy5sZW5ndGh9cmV0dXJuIHQuX3NpemVbMF09cix0Ll9zaXplWzFdPWksdH1mdW5jdGlvbiBjKHQsZSxuLHIsaSl7dmFyIG8scyxhPXJbMF0sdT1yWzFdLGM9W107Zm9yKG89MDtvPGE7bysrKWZvcihjW29dPVtdLHM9MDtzPHU7cysrKWNbb11bc109MDtmb3Iocz0wO3M8dTtzKyspZm9yKHZhciBsPW5bc10saD1uW3MrMV0sZj1sO2Y8aDtmKyspY1tvPWVbZl1dW3NdPXQ/aT9tcCh0W2ZdKTp0W2ZdOjE7cmV0dXJuIGN9cmV0dXJuIGkucHJvdG90eXBlPW5ldyByLGkucHJvdG90eXBlLmNyZWF0ZVNwYXJzZU1hdHJpeD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgaSh0LGUpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwibmFtZSIse3ZhbHVlOiJTcGFyc2VNYXRyaXgifSksaS5wcm90b3R5cGUuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS50eXBlPSJTcGFyc2VNYXRyaXgiLGkucHJvdG90eXBlLmlzU3BhcnNlTWF0cml4PSEwLGkucHJvdG90eXBlLmdldERhdGFUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuICRwKHRoaXMuX3ZhbHVlcyx5cCl9LGkucHJvdG90eXBlLnN0b3JhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4ic3BhcnNlIn0saS5wcm90b3R5cGUuZGF0YXR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YXR5cGV9LGkucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgaSh0LGUpfSxpLnByb3RvdHlwZS5kZW5zaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc2l6ZVswXSxlPXRoaXMuX3NpemVbMV07cmV0dXJuIDAhPT10JiYwIT09ZT90aGlzLl9pbmRleC5sZW5ndGgvKHQqZSk6MH0saS5wcm90b3R5cGUuc3Vic2V0PWZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fdmFsdWVzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzdWJzZXQgb24gYSBQYXR0ZXJuIG9ubHkgbWF0cml4Iik7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighVmYoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBpbmRleCIpO3ZhciBuPWUuaXNTY2FsYXIoKTtpZihuKXJldHVybiB0LmdldChlLm1pbigpKTt2YXIgcj1lLnNpemUoKTtpZihyLmxlbmd0aCE9PXQuX3NpemUubGVuZ3RoKXRocm93IG5ldyBqcChyLmxlbmd0aCx0Ll9zaXplLmxlbmd0aCk7dmFyIG8scyxhLHUsYz1lLm1pbigpLGw9ZS5tYXgoKTtmb3Iobz0wLHM9dC5fc2l6ZS5sZW5ndGg7bzxzO28rKylZcChjW29dLHQuX3NpemVbb10pLFlwKGxbb10sdC5fc2l6ZVtvXSk7dmFyIGg9dC5fdmFsdWVzLGY9dC5faW5kZXgscD10Ll9wdHIsZD1lLmRpbWVuc2lvbigwKSxnPWUuZGltZW5zaW9uKDEpLHk9W10sbT1bXTtkLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7bVt0XT1lWzBdLHlbdF09ITB9KSk7dmFyIHY9aD9bXTp2b2lkIDAsXz1bXSx4PVtdO3JldHVybiBnLmZvckVhY2goKGZ1bmN0aW9uKHQpe2Zvcih4LnB1c2goXy5sZW5ndGgpLGE9cFt0XSx1PXBbdCsxXTthPHU7YSsrKW89ZlthXSwhMD09PXlbb10mJihfLnB1c2gobVtvXSksdiYmdi5wdXNoKGhbYV0pKX0pKSx4LnB1c2goXy5sZW5ndGgpLG5ldyBpKHt2YWx1ZXM6dixpbmRleDpfLHB0cjp4LHNpemU6cixkYXRhdHlwZTp0Ll9kYXRhdHlwZX0pfSh0aGlzLHQpO2Nhc2UgMjpjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIpe2lmKCFlfHwhMCE9PWUuaXNJbmRleCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGluZGV4Iik7dmFyIGksbz1lLnNpemUoKSxzPWUuaXNTY2FsYXIoKTtpZihrZihuKT8oaT1uLnNpemUoKSxuPW4udG9BcnJheSgpKTppPXFwKG4pLHMpe2lmKDAhPT1pLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTY2FsYXIgZXhwZWN0ZWQiKTt0LnNldChlLm1pbigpLG4scil9ZWxzZXtpZigxIT09by5sZW5ndGgmJjIhPT1vLmxlbmd0aCl0aHJvdyBuZXcganAoby5sZW5ndGgsdC5fc2l6ZS5sZW5ndGgsIjwiKTtpZihpLmxlbmd0aDxvLmxlbmd0aCl7Zm9yKHZhciBhPTAsdT0wOzE9PT1vW2FdJiYxPT09aVthXTspYSsrO2Zvcig7MT09PW9bYV07KXUrKyxhKys7bj1KcChuLG8ubGVuZ3RoLHUsaSl9aWYoIXZwKG8saSkpdGhyb3cgbmV3IGpwKG8saSwiPiIpO2lmKDE9PT1vLmxlbmd0aCl7ZS5kaW1lbnNpb24oMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSxpKXtZcChlKSx0LnNldChbZSwwXSxuW2lbMF1dLHIpfSkpfWVsc2V7dmFyIGM9ZS5kaW1lbnNpb24oMCksbD1lLmRpbWVuc2lvbigxKTtjLmZvckVhY2goKGZ1bmN0aW9uKGUsaSl7WXAoZSksbC5mb3JFYWNoKChmdW5jdGlvbihvLHMpe1lwKG8pLHQuc2V0KFtlLG9dLG5baVswXV1bc1swXV0scil9KSl9KSl9fXJldHVybiB0fSh0aGlzLHQsZSxuKTtkZWZhdWx0OnRocm93IG5ldyBTeW50YXhFcnJvcigiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyIpfX0saS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKCFCZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCIpO2lmKHQubGVuZ3RoIT09dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IGpwKHQubGVuZ3RoLHRoaXMuX3NpemUubGVuZ3RoKTtpZighdGhpcy5fdmFsdWVzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBnZXQgb24gYSBQYXR0ZXJuIG9ubHkgbWF0cml4Iik7dmFyIGU9dFswXSxuPXRbMV07WXAoZSx0aGlzLl9zaXplWzBdKSxZcChuLHRoaXMuX3NpemVbMV0pO3ZhciByPXMoZSx0aGlzLl9wdHJbbl0sdGhpcy5fcHRyW24rMV0sdGhpcy5faW5kZXgpO3JldHVybiByPHRoaXMuX3B0cltuKzFdJiZ0aGlzLl9pbmRleFtyXT09PWU/dGhpcy5fdmFsdWVzW3JdOjB9LGkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LHIsaSl7aWYoIUJmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYodC5sZW5ndGghPT10aGlzLl9zaXplLmxlbmd0aCl0aHJvdyBuZXcganAodC5sZW5ndGgsdGhpcy5fc2l6ZS5sZW5ndGgpO2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHNldCBvbiBhIFBhdHRlcm4gb25seSBtYXRyaXgiKTt2YXIgbz10WzBdLGM9dFsxXSxsPXRoaXMuX3NpemVbMF0saD10aGlzLl9zaXplWzFdLGY9bixwPTA7UmYodGhpcy5fZGF0YXR5cGUpJiYoZj1lLmZpbmQobixbdGhpcy5fZGF0YXR5cGUsdGhpcy5fZGF0YXR5cGVdKXx8bixwPWUuY29udmVydCgwLHRoaXMuX2RhdGF0eXBlKSksKG8+bC0xfHxjPmgtMSkmJih1KHRoaXMsTWF0aC5tYXgobysxLGwpLE1hdGgubWF4KGMrMSxoKSxpKSxsPXRoaXMuX3NpemVbMF0saD10aGlzLl9zaXplWzFdKSxZcChvLGwpLFlwKGMsaCk7dmFyIGQ9cyhvLHRoaXMuX3B0cltjXSx0aGlzLl9wdHJbYysxXSx0aGlzLl9pbmRleCk7cmV0dXJuIGQ8dGhpcy5fcHRyW2MrMV0mJnRoaXMuX2luZGV4W2RdPT09bz9mKHIscCk/ZnVuY3Rpb24odCxlLG4scixpKXtuLnNwbGljZSh0LDEpLHIuc3BsaWNlKHQsMSk7Zm9yKHZhciBvPWUrMTtvPGkubGVuZ3RoO28rKylpW29dLS19KGQsYyx0aGlzLl92YWx1ZXMsdGhpcy5faW5kZXgsdGhpcy5fcHRyKTp0aGlzLl92YWx1ZXNbZF09cjpmKHIscCl8fGEoZCxvLGMscix0aGlzLl92YWx1ZXMsdGhpcy5faW5kZXgsdGhpcy5fcHRyKSx0aGlzfSxpLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCxlLG4pe2lmKCF6Zih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBvciBNYXRyaXggZXhwZWN0ZWQiKTt2YXIgcj10LnZhbHVlT2YoKS5tYXAoKHQ9PkFycmF5LmlzQXJyYXkodCkmJjE9PT10Lmxlbmd0aD90WzBdOnQpKTtpZigyIT09ci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25zIG1hdHJpeCBhcmUgc3VwcG9ydGVkIik7cmV0dXJuIHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIU1mKHQpfHwhU3AodCl8fHQ8MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIHNpemUsIG11c3QgY29udGFpbiBwb3NpdGl2ZSBpbnRlZ2VycyAoc2l6ZTogIitrcChyKSsiKSIpfSkpLHUobj90aGlzLmNsb25lKCk6dGhpcyxyWzBdLHJbMV0sZSl9LGkucHJvdG90eXBlLnJlc2hhcGU9ZnVuY3Rpb24odCxlKXtpZighQmYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZigyIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJTcGFyc2UgbWF0cmljZXMgY2FuIG9ubHkgYmUgcmVzaGFwZWQgaW4gdHdvIGRpbWVuc2lvbnMiKTt0LmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCFNZihlKXx8IVNwKGUpfHxlPD0tMnx8MD09PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBzaXplLCBtdXN0IGNvbnRhaW4gcG9zaXRpdmUgaW50ZWdlcnMgb3IgLTEgKHNpemU6ICIra3AodCkrIikiKX0pKTt2YXIgbj10aGlzLl9zaXplWzBdKnRoaXMuX3NpemVbMV07aWYobiE9PSh0PVpwKHQsbikpWzBdKnRbMV0pdGhyb3cgbmV3IEVycm9yKCJSZXNoYXBpbmcgc3BhcnNlIG1hdHJpeCB3aWxsIHJlc3VsdCBpbiB0aGUgd3JvbmcgbnVtYmVyIG9mIGVsZW1lbnRzIik7dmFyIHI9ZT90aGlzLmNsb25lKCk6dGhpcztpZih0aGlzLl9zaXplWzBdPT09dFswXSYmdGhpcy5fc2l6ZVsxXT09PXRbMV0pcmV0dXJuIHI7Zm9yKHZhciBpPVtdLG89MDtvPHIuX3B0ci5sZW5ndGg7bysrKWZvcih2YXIgdT0wO3U8ci5fcHRyW28rMV0tci5fcHRyW29dO3UrKylpLnB1c2gobyk7Zm9yKHZhciBjPXIuX3ZhbHVlcy5zbGljZSgpLGw9ci5faW5kZXguc2xpY2UoKSxoPTA7aDxyLl9pbmRleC5sZW5ndGg7aCsrKXt2YXIgZj1sW2hdLHA9aVtoXSxkPWYqci5fc2l6ZVsxXStwO2lbaF09ZCV0WzFdLGxbaF09TWF0aC5mbG9vcihkL3RbMV0pfXIuX3ZhbHVlcy5sZW5ndGg9MCxyLl9pbmRleC5sZW5ndGg9MCxyLl9wdHIubGVuZ3RoPXRbMV0rMSxyLl9zaXplPXQuc2xpY2UoKTtmb3IodmFyIGc9MDtnPHIuX3B0ci5sZW5ndGg7ZysrKXIuX3B0cltnXT0wO2Zvcih2YXIgeT0wO3k8Yy5sZW5ndGg7eSsrKXt2YXIgbT1sW3ldLHY9aVt5XSxfPWNbeV07YShzKG0sci5fcHRyW3ZdLHIuX3B0clt2KzFdLHIuX2luZGV4KSxtLHYsXyxyLl92YWx1ZXMsci5faW5kZXgsci5fcHRyKX1yZXR1cm4gcn0saS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGkoe3ZhbHVlczp0aGlzLl92YWx1ZXM/bXAodGhpcy5fdmFsdWVzKTp2b2lkIDAsaW5kZXg6bXAodGhpcy5faW5kZXgpLHB0cjptcCh0aGlzLl9wdHIpLHNpemU6bXAodGhpcy5fc2l6ZSksZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9KX0saS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaXplLnNsaWNlKDApfSxpLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCxyKXtpZighdGhpcy5fdmFsdWVzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBtYXAgb24gYSBQYXR0ZXJuIG9ubHkgbWF0cml4Iik7dmFyIG89dGhpcyxzPXRoaXMuX3NpemVbMF0sYT10aGlzLl9zaXplWzFdLHU9dnkodCk7cmV0dXJuIGZ1bmN0aW9uKHQscixvLHMsYSx1LGMpe3ZhciBsPVtdLGg9W10sZj1bXSxwPW4sZD0wO1JmKHQuX2RhdGF0eXBlKSYmKHA9ZS5maW5kKG4sW3QuX2RhdGF0eXBlLHQuX2RhdGF0eXBlXSl8fG4sZD1lLmNvbnZlcnQoMCx0Ll9kYXRhdHlwZSkpO2Zvcih2YXIgZz1mdW5jdGlvbih0LGUsbil7dD11KHQsZSxuKSxwKHQsZCl8fChsLnB1c2godCksaC5wdXNoKGUpKX0seT1zO3k8PWE7eSsrKXtmLnB1c2gobC5sZW5ndGgpO3ZhciBtPXQuX3B0clt5XSx2PXQuX3B0clt5KzFdO2lmKGMpZm9yKHZhciBfPW07Xzx2O18rKyl7dmFyIHg9dC5faW5kZXhbX107eD49ciYmeDw9byYmZyh0Ll92YWx1ZXNbX10seC1yLHktcyl9ZWxzZXtmb3IodmFyIHc9e30sYj1tO2I8djtiKyspe3dbdC5faW5kZXhbYl1dPXQuX3ZhbHVlc1tiXX1mb3IodmFyIEQ9cjtEPD1vO0QrKyl7ZyhEIGluIHc/d1tEXTowLEQtcix5LXMpfX19cmV0dXJuIGYucHVzaChsLmxlbmd0aCksbmV3IGkoe3ZhbHVlczpsLGluZGV4OmgscHRyOmYsc2l6ZTpbby1yKzEsYS1zKzFdfSl9KHRoaXMsMCxzLTEsMCxhLTEsKGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gMT09PXU/dChlKToyPT09dT90KGUsW24scl0pOnQoZSxbbixyXSxvKX0pLHIpfSxpLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgZm9yRWFjaCBvbiBhIFBhdHRlcm4gb25seSBtYXRyaXgiKTtmb3IodmFyIG49dGhpcy5fc2l6ZVswXSxyPXRoaXMuX3NpemVbMV0saT0wO2k8cjtpKyspe3ZhciBvPXRoaXMuX3B0cltpXSxzPXRoaXMuX3B0cltpKzFdO2lmKGUpZm9yKHZhciBhPW87YTxzO2ErKyl7dmFyIHU9dGhpcy5faW5kZXhbYV07dCh0aGlzLl92YWx1ZXNbYV0sW3UsaV0sdGhpcyl9ZWxzZXtmb3IodmFyIGM9e30sbD1vO2w8cztsKyspe2NbdGhpcy5faW5kZXhbbF1dPXRoaXMuX3ZhbHVlc1tsXX1mb3IodmFyIGg9MDtoPG47aCsrKXt0KGggaW4gYz9jW2hdOjAsW2gsaV0sdGhpcyl9fX19LGkucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24qKCl7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpdGVyYXRlIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO2Zvcih2YXIgdD10aGlzLl9zaXplWzFdLGU9MDtlPHQ7ZSsrKWZvcih2YXIgbj10aGlzLl9wdHJbZV0scj10aGlzLl9wdHJbZSsxXSxpPW47aTxyO2krKyl7dmFyIG89dGhpcy5faW5kZXhbaV07eWllbGR7dmFsdWU6dGhpcy5fdmFsdWVzW2ldLGluZGV4OltvLGVdfX19LGkucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gYyh0aGlzLl92YWx1ZXMsdGhpcy5faW5kZXgsdGhpcy5fcHRyLHRoaXMuX3NpemUsITApfSxpLnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuIGModGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0cix0aGlzLl9zaXplLCExKX0saS5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9zaXplWzBdLG49dGhpcy5fc2l6ZVsxXSxyPXRoaXMuZGVuc2l0eSgpLGk9IlNwYXJzZSBNYXRyaXggWyIra3AoZSx0KSsiIHggIitrcChuLHQpKyJdIGRlbnNpdHk6ICIra3Aocix0KSsiXG4iLG89MDtvPG47bysrKWZvcih2YXIgcz10aGlzLl9wdHJbb10sYT10aGlzLl9wdHJbbysxXSx1PXM7dTxhO3UrKyl7aSs9IlxuICAgICgiK2twKHRoaXMuX2luZGV4W3VdLHQpKyIsICIra3Aobyx0KSsiKSA9PT4gIisodGhpcy5fdmFsdWVzP2twKHRoaXMuX3ZhbHVlc1t1XSx0KToiWCIpfXJldHVybiBpfSxpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBrcCh0aGlzLnRvQXJyYXkoKSl9LGkucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IlNwYXJzZU1hdHJpeCIsdmFsdWVzOnRoaXMuX3ZhbHVlcyxpbmRleDp0aGlzLl9pbmRleCxwdHI6dGhpcy5fcHRyLHNpemU6dGhpcy5fc2l6ZSxkYXRhdHlwZTp0aGlzLl9kYXRhdHlwZX19LGkucHJvdG90eXBlLmRpYWdvbmFsPWZ1bmN0aW9uKHQpe2lmKHQpe2lmKEZmKHQpJiYodD10LnRvTnVtYmVyKCkpLCFNZih0KXx8IVNwKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXJhbWV0ZXIgayBtdXN0IGJlIGFuIGludGVnZXIgbnVtYmVyIil9ZWxzZSB0PTA7dmFyIGU9dD4wP3Q6MCxuPXQ8MD8tdDowLHI9dGhpcy5fc2l6ZVswXSxvPXRoaXMuX3NpemVbMV0scz1NYXRoLm1pbihyLW4sby1lKSxhPVtdLHU9W10sYz1bXTtjWzBdPTA7Zm9yKHZhciBsPWU7bDxvJiZhLmxlbmd0aDxzO2wrKylmb3IodmFyIGg9dGhpcy5fcHRyW2xdLGY9dGhpcy5fcHRyW2wrMV0scD1oO3A8ZjtwKyspe3ZhciBkPXRoaXMuX2luZGV4W3BdO2lmKGQ9PT1sLWUrbil7YS5wdXNoKHRoaXMuX3ZhbHVlc1twXSksdVthLmxlbmd0aC0xXT1kLW47YnJlYWt9fXJldHVybiBjLnB1c2goYS5sZW5ndGgpLG5ldyBpKHt2YWx1ZXM6YSxpbmRleDp1LHB0cjpjLHNpemU6W3MsMV19KX0saS5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGkodCl9LGkuZGlhZ29uYWw9ZnVuY3Rpb24odCxyLG8scyxhKXtpZighQmYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQsIHNpemUgcGFyYW1ldGVyIik7aWYoMiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSB0d28gZGltZW5zaW9ucyBtYXRyaXggYXJlIHN1cHBvcnRlZCIpO2lmKHQ9dC5tYXAoKGZ1bmN0aW9uKHQpe2lmKEZmKHQpJiYodD10LnRvTnVtYmVyKCkpLCFNZih0KXx8IVNwKHQpfHx0PDEpdGhyb3cgbmV3IEVycm9yKCJTaXplIHZhbHVlcyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzIik7cmV0dXJuIHR9KSksbyl7aWYoRmYobykmJihvPW8udG9OdW1iZXIoKSksIU1mKG8pfHwhU3AobykpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHBhcmFtZXRlciBrIG11c3QgYmUgYW4gaW50ZWdlciBudW1iZXIiKX1lbHNlIG89MDt2YXIgdT1uLGM9MDtSZihhKSYmKHU9ZS5maW5kKG4sW2EsYV0pfHxuLGM9ZS5jb252ZXJ0KDAsYSkpO3ZhciBsLGg9bz4wP286MCxmPW88MD8tbzowLHA9dFswXSxkPXRbMV0sZz1NYXRoLm1pbihwLWYsZC1oKTtpZihCZihyKSl7aWYoci5sZW5ndGghPT1nKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCB2YWx1ZSBhcnJheSBsZW5ndGgiKTtsPWZ1bmN0aW9uKHQpe3JldHVybiByW3RdfX1lbHNlIGlmKGtmKHIpKXt2YXIgeT1yLnNpemUoKTtpZigxIT09eS5sZW5ndGh8fHlbMF0hPT1nKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtYXRyaXggbGVuZ3RoIik7bD1mdW5jdGlvbih0KXtyZXR1cm4gci5nZXQoW3RdKX19ZWxzZSBsPWZ1bmN0aW9uKCl7cmV0dXJuIHJ9O2Zvcih2YXIgbT1bXSx2PVtdLF89W10seD0wO3g8ZDt4Kyspe18ucHVzaChtLmxlbmd0aCk7dmFyIHc9eC1oO2lmKHc+PTAmJnc8Zyl7dmFyIGI9bCh3KTt1KGIsYyl8fCh2LnB1c2godytmKSxtLnB1c2goYikpfX1yZXR1cm4gXy5wdXNoKG0ubGVuZ3RoKSxuZXcgaSh7dmFsdWVzOm0saW5kZXg6dixwdHI6XyxzaXplOltwLGRdfSl9LGkucHJvdG90eXBlLnN3YXBSb3dzPWZ1bmN0aW9uKHQsZSl7aWYoIShNZih0KSYmU3AodCkmJk1mKGUpJiZTcChlKSkpdGhyb3cgbmV3IEVycm9yKCJSb3cgaW5kZXggbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VycyIpO2lmKDIhPT10aGlzLl9zaXplLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgdHdvIGRpbWVuc2lvbmFsIG1hdHJpeCBpcyBzdXBwb3J0ZWQiKTtyZXR1cm4gWXAodCx0aGlzLl9zaXplWzBdKSxZcChlLHRoaXMuX3NpemVbMF0pLGkuX3N3YXBSb3dzKHQsZSx0aGlzLl9zaXplWzFdLHRoaXMuX3ZhbHVlcyx0aGlzLl9pbmRleCx0aGlzLl9wdHIpLHRoaXN9LGkuX2ZvckVhY2hSb3c9ZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG89clt0XSxzPXJbdCsxXSxhPW87YTxzO2ErKylpKG5bYV0sZVthXSl9LGkuX3N3YXBSb3dzPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtmb3IodmFyIGE9MDthPG47YSsrKXt2YXIgdT1vW2FdLGM9b1thKzFdLGw9cyh0LHUsYyxpKSxoPXMoZSx1LGMsaSk7aWYobDxjJiZoPGMmJmlbbF09PT10JiZpW2hdPT09ZSl7aWYocil7dmFyIGY9cltsXTtyW2xdPXJbaF0scltoXT1mfX1lbHNlIGlmKGw8YyYmaVtsXT09PXQmJihoPj1jfHxpW2hdIT09ZSkpe3ZhciBwPXI/cltsXTp2b2lkIDA7aS5zcGxpY2UoaCwwLGUpLHImJnIuc3BsaWNlKGgsMCxwKSxpLnNwbGljZShoPD1sP2wrMTpsLDEpLHImJnIuc3BsaWNlKGg8PWw/bCsxOmwsMSl9ZWxzZSBpZihoPGMmJmlbaF09PT1lJiYobD49Y3x8aVtsXSE9PXQpKXt2YXIgZD1yP3JbaF06dm9pZCAwO2kuc3BsaWNlKGwsMCx0KSxyJiZyLnNwbGljZShsLDAsZCksaS5zcGxpY2UobDw9aD9oKzE6aCwxKSxyJiZyLnNwbGljZShsPD1oP2grMTpoLDEpfX19LGl9KSx7aXNDbGFzczohMH0pO3ZhciBGeT10ZCgibnVtYmVyIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dCxuPWUoIm51bWJlciIseyIiOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LG51bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sc3RyaW5nOmZ1bmN0aW9uKHQpe2lmKCJOYU4iPT09dClyZXR1cm4gTmFOO3ZhciBlPWZ1bmN0aW9uKHQpe3ZhciBlPXQubWF0Y2goLygwW2JveF0pKFswLTlhLWZBLUZdKilcLihbMC05YS1mQS1GXSopLyk7cmV0dXJuIGU/e2lucHV0OnQscmFkaXg6eyIwYiI6MiwiMG8iOjgsIjB4IjoxNn1bZVsxXV0saW50ZWdlclBhcnQ6ZVsyXSxmcmFjdGlvbmFsUGFydDplWzNdfTpudWxsfSh0KTtpZihlKXJldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9cGFyc2VJbnQodC5pbnRlZ2VyUGFydCx0LnJhZGl4KSxuPTAscj0wO3I8dC5mcmFjdGlvbmFsUGFydC5sZW5ndGg7cisrKW4rPXBhcnNlSW50KHQuZnJhY3Rpb25hbFBhcnRbcl0sdC5yYWRpeCkvTWF0aC5wb3codC5yYWRpeCxyKzEpO3ZhciBpPWUrbjtpZihpc05hTihpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N0cmluZyAiJyt0LmlucHV0KyciIGlzIG5vIHZhbGlkIG51bWJlcicpO3JldHVybiBpfShlKTt2YXIgbj0wLHI9dC5tYXRjaCgvKDBbYm94XVswLTlhLWZBLUZdKilpKFswLTldKikvKTtyJiYobj1OdW1iZXIoclsyXSksdD1yWzFdKTt2YXIgaT1OdW1iZXIodCk7aWYoaXNOYU4oaSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdTdHJpbmcgIicrdCsnIiBpcyBubyB2YWxpZCBudW1iZXInKTtpZihyKXtpZihpPlBmKDIsbiktMSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N0cmluZyAiJy5jb25jYXQodCwnIiBpcyBvdXQgb2YgcmFuZ2UnKSk7aT49UGYoMixuLTEpJiYoaS09UGYoMixuKSl9cmV0dXJuIGl9LEJpZ051bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gdC50b051bWJlcigpfSxGcmFjdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZU9mKCl9LFVuaXQ6ZS5yZWZlclRvU2VsZigodD0+ZT0+e3ZhciBuPWUuY2xvbmUoKTtyZXR1cm4gbi52YWx1ZT10KGUudmFsdWUpLG59KSksbnVsbDpmdW5jdGlvbih0KXtyZXR1cm4gMH0sIlVuaXQsIHN0cmluZyB8IFVuaXQiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9OdW1iZXIoZSl9LCJBcnJheSB8IE1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+ZT0+eHkoZSx0KSkpfSk7cmV0dXJuIG4uZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlRmxvYXQodC52YWx1ZSl9LG59KSksVHk9dGQoImJpZ251bWJlciIsWyJ0eXBlZCIsIkJpZ051bWJlciJdLCh0PT57dmFye3R5cGVkOmUsQmlnTnVtYmVyOm59PXQ7cmV0dXJuIGUoImJpZ251bWJlciIseyIiOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKDApfSxudW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQrIiIpfSxzdHJpbmc6ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXRjaCgvKDBbYm94XVswLTlhLWZBLUZdKilpKFswLTldKikvKTtpZihlKXt2YXIgcj1lWzJdLGk9bihlWzFdKSxvPW5ldyBuKDIpLnBvdyhOdW1iZXIocikpO2lmKGkuZ3Qoby5zdWIoMSkpKXRocm93IG5ldyBTeW50YXhFcnJvcignU3RyaW5nICInLmNvbmNhdCh0LCciIGlzIG91dCBvZiByYW5nZScpKTt2YXIgcz1uZXcgbigyKS5wb3coTnVtYmVyKHIpLTEpO3JldHVybiBpLmd0ZShzKT9pLnN1YihvKTppfXJldHVybiBuZXcgbih0KX0sQmlnTnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxVbml0OmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnt2YXIgbj1lLmNsb25lKCk7cmV0dXJuIG4udmFsdWU9dChlLnZhbHVlKSxufSkpLEZyYWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0Lm4pLmRpdih0LmQpLnRpbWVzKHQucyl9LG51bGw6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKDApfSwiQXJyYXkgfCBNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnh5KGUsdCkpKX0pfSkpLE95PXRkKCJmcmFjdGlvbiIsWyJ0eXBlZCIsIkZyYWN0aW9uIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxGcmFjdGlvbjpufT10O3JldHVybiBlKCJmcmFjdGlvbiIse251bWJlcjpmdW5jdGlvbih0KXtpZighaXNGaW5pdGUodCl8fGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcih0KyIgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIGEgZnJhY3Rpb24iKTtyZXR1cm4gbmV3IG4odCl9LHN0cmluZzpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odCl9LCJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG4odCxlKX0sbnVsbDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4oMCl9LEJpZ051bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odC50b1N0cmluZygpKX0sRnJhY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuIHR9LFVuaXQ6ZS5yZWZlclRvU2VsZigodD0+ZT0+e3ZhciBuPWUuY2xvbmUoKTtyZXR1cm4gbi52YWx1ZT10KGUudmFsdWUpLG59KSksT2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0KX0sIkFycmF5IHwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT5lPT54eShlLHQpKSl9KX0pKSxMeT0ibWF0cml4IixQeT10ZChMeSxbInR5cGVkIiwiTWF0cml4IiwiRGVuc2VNYXRyaXgiLCJTcGFyc2VNYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLE1hdHJpeDpuLERlbnNlTWF0cml4OnIsU3BhcnNlTWF0cml4Oml9PXQ7cmV0dXJuIGUoTHkseyIiOmZ1bmN0aW9uKCl7cmV0dXJuIG8oW10pfSxzdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIG8oW10sdCl9LCJzdHJpbmcsIHN0cmluZyI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbyhbXSx0LGUpfSxBcnJheTpmdW5jdGlvbih0KXtyZXR1cm4gbyh0KX0sTWF0cml4OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsdC5zdG9yYWdlKCkpfSwiQXJyYXkgfCBNYXRyaXgsIHN0cmluZyI6bywiQXJyYXkgfCBNYXRyaXgsIHN0cmluZywgc3RyaW5nIjpvfSk7ZnVuY3Rpb24gbyh0LGUsbil7aWYoImRlbnNlIj09PWV8fCJkZWZhdWx0Ij09PWV8fHZvaWQgMD09PWUpcmV0dXJuIG5ldyByKHQsbik7aWYoInNwYXJzZSI9PT1lKXJldHVybiBuZXcgaSh0LG4pO3Rocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gbWF0cml4IHR5cGUgIitKU09OLnN0cmluZ2lmeShlKSsiLiIpfX0pKSxSeT0iYWRkU2NhbGFyIixCeT10ZChSeSxbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZShSeSx7Im51bWJlciwgbnVtYmVyIjpFeSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5hZGQoZSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5wbHVzKGUpfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmFkZChlKX0sIlVuaXQsIFVuaXQiOmUucmVmZXJUb1NlbGYoKHQ9PihuLHIpPT57aWYobnVsbD09PW4udmFsdWV8fHZvaWQgMD09PW4udmFsdWUpdGhyb3cgbmV3IEVycm9yKCJQYXJhbWV0ZXIgeCBjb250YWlucyBhIHVuaXQgd2l0aCB1bmRlZmluZWQgdmFsdWUiKTtpZihudWxsPT09ci52YWx1ZXx8dm9pZCAwPT09ci52YWx1ZSl0aHJvdyBuZXcgRXJyb3IoIlBhcmFtZXRlciB5IGNvbnRhaW5zIGEgdW5pdCB3aXRoIHVuZGVmaW5lZCB2YWx1ZSIpO2lmKCFuLmVxdWFsQmFzZShyKSl0aHJvdyBuZXcgRXJyb3IoIlVuaXRzIGRvIG5vdCBtYXRjaCIpO3ZhciBpPW4uY2xvbmUoKTtyZXR1cm4gaS52YWx1ZT1lLmZpbmQodCxbaS52YWx1ZVR5cGUoKSxyLnZhbHVlVHlwZSgpXSkoaS52YWx1ZSxyLnZhbHVlKSxpLmZpeFByZWZpeD0hMSxpfSkpfSl9KSksa3k9dGQoIm1hdEFsZ28xMXhTMHMiLFsidHlwZWQiLCJlcXVhbFNjYWxhciJdLCh0PT57dmFye3R5cGVkOmUsZXF1YWxTY2FsYXI6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGksbyl7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9zaXplLGw9dC5fZGF0YXR5cGU7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gUGF0dGVybiBTcGFyc2UgTWF0cml4IGFuZCBTY2FsYXIgdmFsdWUiKTt2YXIgaCxmPWNbMF0scD1jWzFdLGQ9bixnPTAseT1pOyJzdHJpbmciPT10eXBlb2YgbCYmKGg9bCxkPWUuZmluZChuLFtoLGhdKSxnPWUuY29udmVydCgwLGgpLHI9ZS5jb252ZXJ0KHIsaCkseT1lLmZpbmQoaSxbaCxoXSkpO2Zvcih2YXIgbT1bXSx2PVtdLF89W10seD0wO3g8cDt4Kyspe19beF09di5sZW5ndGg7Zm9yKHZhciB3PXVbeF0sYj11W3grMV0sRD13O0Q8YjtEKyspe3ZhciBFPWFbRF0sQz1vP3kocixzW0RdKTp5KHNbRF0scik7ZChDLGcpfHwodi5wdXNoKEUpLG0ucHVzaChDKSl9fXJldHVybiBfW3BdPXYubGVuZ3RoLHQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6bSxpbmRleDp2LHB0cjpfLHNpemU6W2YscF0sZGF0YXR5cGU6aH0pfX0pKSx6eT10ZCgibWF0QWxnbzEyeFNmcyIsWyJ0eXBlZCIsIkRlbnNlTWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxEZW5zZU1hdHJpeDpufT10O3JldHVybiBmdW5jdGlvbih0LHIsaSxvKXt2YXIgcz10Ll92YWx1ZXMsYT10Ll9pbmRleCx1PXQuX3B0cixjPXQuX3NpemUsbD10Ll9kYXRhdHlwZTtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiBQYXR0ZXJuIFNwYXJzZSBNYXRyaXggYW5kIFNjYWxhciB2YWx1ZSIpO3ZhciBoLGY9Y1swXSxwPWNbMV0sZD1pOyJzdHJpbmciPT10eXBlb2YgbCYmKGg9bCxyPWUuY29udmVydChyLGgpLGQ9ZS5maW5kKGksW2gsaF0pKTtmb3IodmFyIGc9W10seT1bXSxtPVtdLHY9MDt2PHA7disrKXtmb3IodmFyIF89disxLHg9dVt2XSx3PXVbdisxXSxiPXg7Yjx3O2IrKyl7dmFyIEQ9YVtiXTt5W0RdPXNbYl0sbVtEXT1ffWZvcih2YXIgRT0wO0U8ZjtFKyspMD09PXYmJihnW0VdPVtdKSxtW0VdPT09Xz9nW0VdW3ZdPW8/ZChyLHlbRV0pOmQoeVtFXSxyKTpnW0VdW3ZdPW8/ZChyLDApOmQoMCxyKX1yZXR1cm4gbmV3IG4oe2RhdGE6ZyxzaXplOltmLHBdLGRhdGF0eXBlOmh9KX19KSksank9dGQoIm1hdEFsZ28xNHhEcyIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpLG8pe3ZhciBzLGE9dC5fZGF0YSx1PXQuX3NpemUsYz10Ll9kYXRhdHlwZSxsPWk7InN0cmluZyI9PXR5cGVvZiBjJiYocz1jLHI9ZS5jb252ZXJ0KHIscyksbD1lLmZpbmQoaSxbcyxzXSkpO3ZhciBoPXUubGVuZ3RoPjA/bihsLDAsdSx1WzBdLGEscixvKTpbXTtyZXR1cm4gdC5jcmVhdGVEZW5zZU1hdHJpeCh7ZGF0YTpoLHNpemU6bXAodSksZGF0YXR5cGU6c30pfTtmdW5jdGlvbiBuKHQsZSxyLGksbyxzLGEpe3ZhciB1PVtdO2lmKGU9PT1yLmxlbmd0aC0xKWZvcih2YXIgYz0wO2M8aTtjKyspdVtjXT1hP3QocyxvW2NdKTp0KG9bY10scyk7ZWxzZSBmb3IodmFyIGw9MDtsPGk7bCsrKXVbbF09bih0LGUrMSxyLHJbZSsxXSxvW2xdLHMsYSk7cmV0dXJuIHV9fSkpLFV5PXRkKCJtYXRBbGdvMDF4RFNpZCIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPXQuX2RhdGEscz10Ll9zaXplLGE9dC5fZGF0YXR5cGUsdT1uLl92YWx1ZXMsYz1uLl9pbmRleCxsPW4uX3B0cixoPW4uX3NpemUsZj1uLl9kYXRhdHlwZTtpZihzLmxlbmd0aCE9PWgubGVuZ3RoKXRocm93IG5ldyBqcChzLmxlbmd0aCxoLmxlbmd0aCk7aWYoc1swXSE9PWhbMF18fHNbMV0hPT1oWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK3MrIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIitoKyIpIik7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gRGVuc2UgTWF0cml4IGFuZCBQYXR0ZXJuIFNwYXJzZSBNYXRyaXgiKTt2YXIgcCxkLGc9c1swXSx5PXNbMV0sbT0ic3RyaW5nIj09dHlwZW9mIGEmJmE9PT1mP2E6dm9pZCAwLHY9bT9lLmZpbmQocixbbSxtXSk6cixfPVtdO2ZvcihwPTA7cDxnO3ArKylfW3BdPVtdO3ZhciB4PVtdLHc9W107Zm9yKGQ9MDtkPHk7ZCsrKXtmb3IodmFyIGI9ZCsxLEQ9bFtkXSxFPWxbZCsxXSxDPUQ7QzxFO0MrKyl4W3A9Y1tDXV09aT92KHVbQ10sb1twXVtkXSk6dihvW3BdW2RdLHVbQ10pLHdbcF09Yjtmb3IocD0wO3A8ZztwKyspd1twXT09PWI/X1twXVtkXT14W3BdOl9bcF1bZF09b1twXVtkXX1yZXR1cm4gdC5jcmVhdGVEZW5zZU1hdHJpeCh7ZGF0YTpfLHNpemU6W2cseV0sZGF0YXR5cGU6bX0pfX0pKSxxeT10ZCgibWF0QWxnbzA0eFNpZFNpZCIsWyJ0eXBlZCIsImVxdWFsU2NhbGFyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpufT10O3JldHVybiBmdW5jdGlvbih0LHIsaSl7dmFyIG89dC5fdmFsdWVzLHM9dC5faW5kZXgsYT10Ll9wdHIsdT10Ll9zaXplLGM9dC5fZGF0YXR5cGUsbD1yLl92YWx1ZXMsaD1yLl9pbmRleCxmPXIuX3B0cixwPXIuX3NpemUsZD1yLl9kYXRhdHlwZTtpZih1Lmxlbmd0aCE9PXAubGVuZ3RoKXRocm93IG5ldyBqcCh1Lmxlbmd0aCxwLmxlbmd0aCk7aWYodVswXSE9PXBbMF18fHVbMV0hPT1wWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK3UrIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIitwKyIpIik7dmFyIGcseT11WzBdLG09dVsxXSx2PW4sXz0wLHg9aTsic3RyaW5nIj09dHlwZW9mIGMmJmM9PT1kJiYoZz1jLHY9ZS5maW5kKG4sW2csZ10pLF89ZS5jb252ZXJ0KDAsZykseD1lLmZpbmQoaSxbZyxnXSkpO3ZhciB3LGIsRCxFLEMsUz1vJiZsP1tdOnZvaWQgMCxBPVtdLE49W10sST1vJiZsP1tdOnZvaWQgMCxNPW8mJmw/W106dm9pZCAwLEY9W10sVD1bXTtmb3IoYj0wO2I8bTtiKyspe05bYl09QS5sZW5ndGg7dmFyIE89YisxO2ZvcihFPWFbYl0sQz1hW2IrMV0sRD1FO0Q8QztEKyspdz1zW0RdLEEucHVzaCh3KSxGW3ddPU8sSSYmKElbd109b1tEXSk7Zm9yKEU9ZltiXSxDPWZbYisxXSxEPUU7RDxDO0QrKylpZihGW3c9aFtEXV09PT1PKXtpZihJKXt2YXIgTD14KElbd10sbFtEXSk7dihMLF8pP0Zbd109bnVsbDpJW3ddPUx9fWVsc2UgQS5wdXNoKHcpLFRbd109TyxNJiYoTVt3XT1sW0RdKTtpZihJJiZNKWZvcihEPU5bYl07RDxBLmxlbmd0aDspRlt3PUFbRF1dPT09Tz8oU1tEXT1JW3ddLEQrKyk6VFt3XT09PU8/KFNbRF09TVt3XSxEKyspOkEuc3BsaWNlKEQsMSl9cmV0dXJuIE5bbV09QS5sZW5ndGgsdC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczpTLGluZGV4OkEscHRyOk4sc2l6ZTpbeSxtXSxkYXRhdHlwZTpnfSl9fSkpLFZ5PXRkKCJtYXRBbGdvMTB4U2lkcyIsWyJ0eXBlZCIsIkRlbnNlTWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxEZW5zZU1hdHJpeDpufT10O3JldHVybiBmdW5jdGlvbih0LHIsaSxvKXt2YXIgcz10Ll92YWx1ZXMsYT10Ll9pbmRleCx1PXQuX3B0cixjPXQuX3NpemUsbD10Ll9kYXRhdHlwZTtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiBQYXR0ZXJuIFNwYXJzZSBNYXRyaXggYW5kIFNjYWxhciB2YWx1ZSIpO3ZhciBoLGY9Y1swXSxwPWNbMV0sZD1pOyJzdHJpbmciPT10eXBlb2YgbCYmKGg9bCxyPWUuY29udmVydChyLGgpLGQ9ZS5maW5kKGksW2gsaF0pKTtmb3IodmFyIGc9W10seT1bXSxtPVtdLHY9MDt2PHA7disrKXtmb3IodmFyIF89disxLHg9dVt2XSx3PXVbdisxXSxiPXg7Yjx3O2IrKyl7dmFyIEQ9YVtiXTt5W0RdPXNbYl0sbVtEXT1ffWZvcih2YXIgRT0wO0U8ZjtFKyspMD09PXYmJihnW0VdPVtdKSxtW0VdPT09Xz9nW0VdW3ZdPW8/ZChyLHlbRV0pOmQoeVtFXSxyKTpnW0VdW3ZdPXJ9cmV0dXJuIG5ldyBuKHtkYXRhOmcsc2l6ZTpbZixwXSxkYXRhdHlwZTpofSl9fSkpLEd5PXRkKCJtYXRBbGdvMTN4REQiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBmdW5jdGlvbih0LHIsaSl7dmFyIG89dC5fZGF0YSxzPXQuX3NpemUsYT10Ll9kYXRhdHlwZSx1PXIuX2RhdGEsYz1yLl9zaXplLGw9ci5fZGF0YXR5cGUsaD1bXTtpZihzLmxlbmd0aCE9PWMubGVuZ3RoKXRocm93IG5ldyBqcChzLmxlbmd0aCxjLmxlbmd0aCk7Zm9yKHZhciBmPTA7ZjxzLmxlbmd0aDtmKyspe2lmKHNbZl0hPT1jW2ZdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK3MrIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIitjKyIpIik7aFtmXT1zW2ZdfXZhciBwLGQ9aTsic3RyaW5nIj09dHlwZW9mIGEmJmE9PT1sJiYocD1hLGQ9ZS5maW5kKGksW3AscF0pKTt2YXIgZz1oLmxlbmd0aD4wP24oZCwwLGgsaFswXSxvLHUpOltdO3JldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOmcsc2l6ZTpoLGRhdGF0eXBlOnB9KX07ZnVuY3Rpb24gbih0LGUscixpLG8scyl7dmFyIGE9W107aWYoZT09PXIubGVuZ3RoLTEpZm9yKHZhciB1PTA7dTxpO3UrKylhW3VdPXQob1t1XSxzW3VdKTtlbHNlIGZvcih2YXIgYz0wO2M8aTtjKyspYVtjXT1uKHQsZSsxLHIscltlKzFdLG9bY10sc1tjXSk7cmV0dXJuIGF9fSkpLFl5PXRkKCJicm9hZGNhc3QiLFsiY29uY2F0Il0sKHQ9Pnt2YXJ7Y29uY2F0OmV9PXQ7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG89TWF0aC5tYXgodC5fc2l6ZS5sZW5ndGgsZS5fc2l6ZS5sZW5ndGgpO2lmKHQuX3NpemUubGVuZ3RoPT09ZS5fc2l6ZS5sZW5ndGgmJnQuX3NpemUuZXZlcnkoKCh0LG4pPT50PT09ZS5fc2l6ZVtuXSkpKXJldHVyblt0LGVdO2Zvcih2YXIgcz1uKHQuX3NpemUsbywwKSxhPW4oZS5fc2l6ZSxvLDApLHU9W10sYz0wO2M8bztjKyspdVtjXT1NYXRoLm1heChzW2NdLGFbY10pO2Zvcih2YXIgbD0wO2w8bztsKyspaShzLHUsbCksaShhLHUsbCk7dmFyIGg9dC5jbG9uZSgpLGY9ZS5jbG9uZSgpO2guX3NpemUubGVuZ3RoPG8/aC5yZXNoYXBlKG4oaC5fc2l6ZSxvLDEpKTpmLl9zaXplLmxlbmd0aDxvJiZmLnJlc2hhcGUobihmLl9zaXplLG8sMSkpO2Zvcih2YXIgcD0wO3A8bztwKyspaC5fc2l6ZVtwXTx1W3BdJiYoaD1yKGgsdVtwXSxwKSksZi5fc2l6ZVtwXTx1W3BdJiYoZj1yKGYsdVtwXSxwKSk7cmV0dXJuW2gsZl19O2Z1bmN0aW9uIG4odCxlLG4pe3JldHVyblsuLi5BcnJheShlLXQubGVuZ3RoKS5maWxsKG4pLC4uLnRdfWZ1bmN0aW9uIHIodCxuLHIpe3JldHVybiBlKC4uLkFycmF5KG4pLmZpbGwodCkscil9ZnVuY3Rpb24gaSh0LGUsbil7aWYodFtuXTxlW25dJnRbbl0+MSl0aHJvdyBuZXcgRXJyb3IoInNoYXBlIG1pc3NtYXRjaDogbWlzc21hdGNoIGlzIGZvdW5kIGluIGFyZyB3aXRoIHNoYXBlICgiLmNvbmNhdCh0LCIpIG5vdCBwb3NzaWJsZSB0byBicm9hZGNhc3QgZGltZW5zaW9uICIpLmNvbmNhdChuLCIgd2l0aCBzaXplICIpLmNvbmNhdCh0W25dLCIgdG8gc2l6ZSAiKS5jb25jYXQoZVtuXSkpfX0pKSxYeT10ZCgibWF0cml4QWxnb3JpdGhtU3VpdGUiLFsidHlwZWQiLCJtYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpuLGNvbmNhdDpyfT10LGk9R3koe3R5cGVkOmV9KSxvPWp5KHt0eXBlZDplfSkscz1ZeSh7Y29uY2F0OnJ9KTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHIsYT10LmVsb3AsdT10LlNEfHx0LkRTO2E/KHI9eyJEZW5zZU1hdHJpeCwgRGVuc2VNYXRyaXgiOih0LGUpPT5pKC4uLnModCxlKSxhKSwiQXJyYXksIEFycmF5IjoodCxlKT0+aSguLi5zKG4odCksbihlKSksYSkudmFsdWVPZigpLCJBcnJheSwgRGVuc2VNYXRyaXgiOih0LGUpPT5pKC4uLnMobih0KSxlKSxhKSwiRGVuc2VNYXRyaXgsIEFycmF5IjoodCxlKT0+aSguLi5zKHQsbihlKSksYSl9LHQuU1MmJihyWyJTcGFyc2VNYXRyaXgsIFNwYXJzZU1hdHJpeCJdPShlLG4pPT50LlNTKC4uLnMoZSxuKSxhLCExKSksdC5EUyYmKHJbIkRlbnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiXT0oZSxuKT0+dC5EUyguLi5zKGUsbiksYSwhMSksclsiQXJyYXksIFNwYXJzZU1hdHJpeCJdPShlLHIpPT50LkRTKC4uLnMobihlKSxyKSxhLCExKSksdSYmKHJbIlNwYXJzZU1hdHJpeCwgRGVuc2VNYXRyaXgiXT0odCxlKT0+dSguLi5zKGUsdCksYSwhMCksclsiU3BhcnNlTWF0cml4LCBBcnJheSJdPSh0LGUpPT51KC4uLnMobihlKSx0KSxhLCEwKSkpOihyPXsiRGVuc2VNYXRyaXgsIERlbnNlTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT4oZSxuKT0+aSguLi5zKGUsbiksdCkpKSwiQXJyYXksIEFycmF5IjplLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+aSguLi5zKG4oZSksbihyKSksdCkudmFsdWVPZigpKSksIkFycmF5LCBEZW5zZU1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+KGUscik9PmkoLi4ucyhuKGUpLHIpLHQpKSksIkRlbnNlTWF0cml4LCBBcnJheSI6ZS5yZWZlclRvU2VsZigodD0+KGUscik9PmkoLi4ucyhlLG4ocikpLHQpKSl9LHQuU1MmJihyWyJTcGFyc2VNYXRyaXgsIFNwYXJzZU1hdHJpeCJdPWUucmVmZXJUb1NlbGYoKGU9PihuLHIpPT50LlNTKC4uLnMobixyKSxlLCExKSkpKSx0LkRTJiYoclsiRGVuc2VNYXRyaXgsIFNwYXJzZU1hdHJpeCJdPWUucmVmZXJUb1NlbGYoKGU9PihuLHIpPT50LkRTKC4uLnMobixyKSxlLCExKSkpLHJbIkFycmF5LCBTcGFyc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKChlPT4ocixpKT0+dC5EUyguLi5zKG4ociksaSksZSwhMSkpKSksdSYmKHJbIlNwYXJzZU1hdHJpeCwgRGVuc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxuKT0+dSguLi5zKG4sZSksdCwhMCkpKSxyWyJTcGFyc2VNYXRyaXgsIEFycmF5Il09ZS5yZWZlclRvU2VsZigodD0+KGUscik9PnUoLi4ucyhuKHIpLGUpLHQsITApKSkpKTt2YXIgYz10LnNjYWxhcnx8ImFueSI7KHQuRHN8fHQuU3MpJiYoYT8oclsiRGVuc2VNYXRyaXgsIitjXT0odCxlKT0+byh0LGUsYSwhMSkscltjKyIsIERlbnNlTWF0cml4Il09KHQsZSk9Pm8oZSx0LGEsITApLHJbIkFycmF5LCIrY109KHQsZSk9Pm8obih0KSxlLGEsITEpLnZhbHVlT2YoKSxyW2MrIiwgQXJyYXkiXT0odCxlKT0+byhuKGUpLHQsYSwhMCkudmFsdWVPZigpKTooclsiRGVuc2VNYXRyaXgsIitjXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxuKT0+byhlLG4sdCwhMSkpKSxyW2MrIiwgRGVuc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxuKT0+byhuLGUsdCwhMCkpKSxyWyJBcnJheSwiK2NdPWUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT5vKG4oZSkscix0LCExKS52YWx1ZU9mKCkpKSxyW2MrIiwgQXJyYXkiXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+byhuKHIpLGUsdCwhMCkudmFsdWVPZigpKSkpKTt2YXIgbD12b2lkIDAhPT10LnNTP3Quc1M6dC5TcztyZXR1cm4gYT8odC5TcyYmKHJbIlNwYXJzZU1hdHJpeCwiK2NdPShlLG4pPT50LlNzKGUsbixhLCExKSksbCYmKHJbYysiLCBTcGFyc2VNYXRyaXgiXT0odCxlKT0+bChlLHQsYSwhMCkpKToodC5TcyYmKHJbIlNwYXJzZU1hdHJpeCwiK2NdPWUucmVmZXJUb1NlbGYoKGU9PihuLHIpPT50LlNzKG4scixlLCExKSkpKSxsJiYocltjKyIsIFNwYXJzZU1hdHJpeCJdPWUucmVmZXJUb1NlbGYoKHQ9PihlLG4pPT5sKG4sZSx0LCEwKSkpKSksYSYmYS5zaWduYXR1cmVzJiZmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKV9wKGUsbikmJih0W25dPWVbbl0pfShyLGEuc2lnbmF0dXJlcykscn19KSksV3k9dGQoIm1hdEFsZ28wMnhEUzAiLFsidHlwZWQiLCJlcXVhbFNjYWxhciJdLCh0PT57dmFye3R5cGVkOmUsZXF1YWxTY2FsYXI6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGksbyl7dmFyIHM9dC5fZGF0YSxhPXQuX3NpemUsdT10Ll9kYXRhdHlwZSxjPXIuX3ZhbHVlcyxsPXIuX2luZGV4LGg9ci5fcHRyLGY9ci5fc2l6ZSxwPXIuX2RhdGF0eXBlO2lmKGEubGVuZ3RoIT09Zi5sZW5ndGgpdGhyb3cgbmV3IGpwKGEubGVuZ3RoLGYubGVuZ3RoKTtpZihhWzBdIT09ZlswXXx8YVsxXSE9PWZbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrYSsiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK2YrIikiKTtpZighYyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiBEZW5zZSBNYXRyaXggYW5kIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCIpO3ZhciBkLGc9YVswXSx5PWFbMV0sbT1uLHY9MCxfPWk7InN0cmluZyI9PXR5cGVvZiB1JiZ1PT09cCYmKGQ9dSxtPWUuZmluZChuLFtkLGRdKSx2PWUuY29udmVydCgwLGQpLF89ZS5maW5kKGksW2QsZF0pKTtmb3IodmFyIHg9W10sdz1bXSxiPVtdLEQ9MDtEPHk7RCsrKXtiW0RdPXcubGVuZ3RoO2Zvcih2YXIgRT1oW0RdLEM9aFtEKzFdLFM9RTtTPEM7UysrKXt2YXIgQT1sW1NdLE49bz9fKGNbU10sc1tBXVtEXSk6XyhzW0FdW0RdLGNbU10pO20oTix2KXx8KHcucHVzaChBKSx4LnB1c2goTikpfX1yZXR1cm4gYlt5XT13Lmxlbmd0aCxyLmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOngsaW5kZXg6dyxwdHI6YixzaXplOltnLHldLGRhdGF0eXBlOmR9KX19KSksSHk9dGQoIm1hdEFsZ28wM3hEU2YiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBmdW5jdGlvbih0LG4scixpKXt2YXIgbz10Ll9kYXRhLHM9dC5fc2l6ZSxhPXQuX2RhdGF0eXBlLHU9bi5fdmFsdWVzLGM9bi5faW5kZXgsbD1uLl9wdHIsaD1uLl9zaXplLGY9bi5fZGF0YXR5cGU7aWYocy5sZW5ndGghPT1oLmxlbmd0aCl0aHJvdyBuZXcganAocy5sZW5ndGgsaC5sZW5ndGgpO2lmKHNbMF0hPT1oWzBdfHxzWzFdIT09aFsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIitzKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIraCsiKSIpO2lmKCF1KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIERlbnNlIE1hdHJpeCBhbmQgUGF0dGVybiBTcGFyc2UgTWF0cml4Iik7dmFyIHAsZD1zWzBdLGc9c1sxXSx5PTAsbT1yOyJzdHJpbmciPT10eXBlb2YgYSYmYT09PWYmJihwPWEseT1lLmNvbnZlcnQoMCxwKSxtPWUuZmluZChyLFtwLHBdKSk7Zm9yKHZhciB2PVtdLF89MDtfPGQ7XysrKXZbX109W107Zm9yKHZhciB4PVtdLHc9W10sYj0wO2I8ZztiKyspe2Zvcih2YXIgRD1iKzEsRT1sW2JdLEM9bFtiKzFdLFM9RTtTPEM7UysrKXt2YXIgQT1jW1NdO3hbQV09aT9tKHVbU10sb1tBXVtiXSk6bShvW0FdW2JdLHVbU10pLHdbQV09RH1mb3IodmFyIE49MDtOPGQ7TisrKXdbTl09PT1EP3ZbTl1bYl09eFtOXTp2W05dW2JdPWk/bSh5LG9bTl1bYl0pOm0ob1tOXVtiXSx5KX1yZXR1cm4gdC5jcmVhdGVEZW5zZU1hdHJpeCh7ZGF0YTp2LHNpemU6W2QsZ10sZGF0YXR5cGU6cH0pfX0pKSxaeT10ZCgibXVsdGlwbHlTY2FsYXIiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBlKCJtdWx0aXBseVNjYWxhciIseyJudW1iZXIsIG51bWJlciI6Q3ksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubXVsKGUpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudGltZXMoZSl9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubXVsKGUpfSwibnVtYmVyIHwgRnJhY3Rpb24gfCBCaWdOdW1iZXIgfCBDb21wbGV4LCBVbml0IjoodCxlKT0+ZS5tdWx0aXBseSh0KSwiVW5pdCwgbnVtYmVyIHwgRnJhY3Rpb24gfCBCaWdOdW1iZXIgfCBDb21wbGV4IHwgVW5pdCI6KHQsZSk9PnQubXVsdGlwbHkoZSl9KX0pKSxLeT0ibXVsdGlwbHkiLEp5PXRkKEt5LFsidHlwZWQiLCJtYXRyaXgiLCJhZGRTY2FsYXIiLCJtdWx0aXBseVNjYWxhciIsImVxdWFsU2NhbGFyIiwiZG90Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixhZGRTY2FsYXI6cixtdWx0aXBseVNjYWxhcjppLGVxdWFsU2NhbGFyOm8sZG90OnN9PXQsYT1reSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpvfSksdT1qeSh7dHlwZWQ6ZX0pO2Z1bmN0aW9uIGModCxlKXtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTpzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMTppZih0WzBdIT09ZVswXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoIGluIG11bHRpcGxpY2F0aW9uLiBWZWN0b3JzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgiKTticmVhaztjYXNlIDI6aWYodFswXSE9PWVbMF0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaCBpbiBtdWx0aXBsaWNhdGlvbi4gVmVjdG9yIGxlbmd0aCAoIit0WzBdKyIpIG11c3QgbWF0Y2ggTWF0cml4IHJvd3MgKCIrZVswXSsiKSIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJDYW4gb25seSBtdWx0aXBseSBhIDEgb3IgMiBkaW1lbnNpb25hbCBtYXRyaXggKE1hdHJpeCBCIGhhcyAiK2UubGVuZ3RoKyIgZGltZW5zaW9ucykiKX1icmVhaztjYXNlIDI6c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDE6aWYodFsxXSE9PWVbMF0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaCBpbiBtdWx0aXBsaWNhdGlvbi4gTWF0cml4IGNvbHVtbnMgKCIrdFsxXSsiKSBtdXN0IG1hdGNoIFZlY3RvciBsZW5ndGggKCIrZVswXSsiKSIpO2JyZWFrO2Nhc2UgMjppZih0WzFdIT09ZVswXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoIGluIG11bHRpcGxpY2F0aW9uLiBNYXRyaXggQSBjb2x1bW5zICgiK3RbMV0rIikgbXVzdCBtYXRjaCBNYXRyaXggQiByb3dzICgiK2VbMF0rIikiKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQ2FuIG9ubHkgbXVsdGlwbHkgYSAxIG9yIDIgZGltZW5zaW9uYWwgbWF0cml4IChNYXRyaXggQiBoYXMgIitlLmxlbmd0aCsiIGRpbWVuc2lvbnMpIil9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkNhbiBvbmx5IG11bHRpcGx5IGEgMSBvciAyIGRpbWVuc2lvbmFsIG1hdHJpeCAoTWF0cml4IEEgaGFzICIrdC5sZW5ndGgrIiBkaW1lbnNpb25zKSIpfX1mdW5jdGlvbiBsKHQsbil7aWYoImRlbnNlIiE9PW4uc3RvcmFnZSgpKXRocm93IG5ldyBFcnJvcigiU3VwcG9ydCBmb3IgU3BhcnNlTWF0cml4IG5vdCBpbXBsZW1lbnRlZCIpO3JldHVybiBmdW5jdGlvbih0LG4pe3ZhciBvLHM9dC5fZGF0YSxhPXQuX3NpemUsdT10Ll9kYXRhdHlwZSxjPW4uX2RhdGEsbD1uLl9zaXplLGg9bi5fZGF0YXR5cGUsZj1hWzBdLHA9bFsxXSxkPXIsZz1pO3UmJmgmJnU9PT1oJiYic3RyaW5nIj09dHlwZW9mIHUmJihvPXUsZD1lLmZpbmQocixbbyxvXSksZz1lLmZpbmQoaSxbbyxvXSkpO2Zvcih2YXIgeT1bXSxtPTA7bTxwO20rKyl7Zm9yKHZhciB2PWcoc1swXSxjWzBdW21dKSxfPTE7XzxmO18rKyl2PWQodixnKHNbX10sY1tfXVttXSkpO3lbbV09dn1yZXR1cm4gdC5jcmVhdGVEZW5zZU1hdHJpeCh7ZGF0YTp5LHNpemU6W3BdLGRhdGF0eXBlOm99KX0odCxuKX12YXIgaD1lKCJfbXVsdGlwbHlNYXRyaXhWZWN0b3IiLHsiRGVuc2VNYXRyaXgsIGFueSI6ZnVuY3Rpb24odCxuKXt2YXIgbyxzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1uLl9kYXRhLGw9bi5fZGF0YXR5cGUsaD1hWzBdLGY9YVsxXSxwPXIsZD1pO3UmJmwmJnU9PT1sJiYic3RyaW5nIj09dHlwZW9mIHUmJihvPXUscD1lLmZpbmQocixbbyxvXSksZD1lLmZpbmQoaSxbbyxvXSkpO2Zvcih2YXIgZz1bXSx5PTA7eTxoO3krKyl7Zm9yKHZhciBtPXNbeV0sdj1kKG1bMF0sY1swXSksXz0xO188ZjtfKyspdj1wKHYsZChtW19dLGNbX10pKTtnW3ldPXZ9cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6ZyxzaXplOltoXSxkYXRhdHlwZTpvfSl9LCJTcGFyc2VNYXRyaXgsIGFueSI6ZnVuY3Rpb24odCxuKXt2YXIgcz10Ll92YWx1ZXMsYT10Ll9pbmRleCx1PXQuX3B0cixjPXQuX2RhdGF0eXBlO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG11bHRpcGx5IFBhdHRlcm4gb25seSBNYXRyaXggdGltZXMgRGVuc2UgTWF0cml4Iik7dmFyIGwsaD1uLl9kYXRhLGY9bi5fZGF0YXR5cGUscD10Ll9zaXplWzBdLGQ9bi5fc2l6ZVswXSxnPVtdLHk9W10sbT1bXSx2PXIsXz1pLHg9byx3PTA7YyYmZiYmYz09PWYmJiJzdHJpbmciPT10eXBlb2YgYyYmKGw9Yyx2PWUuZmluZChyLFtsLGxdKSxfPWUuZmluZChpLFtsLGxdKSx4PWUuZmluZChvLFtsLGxdKSx3PWUuY29udmVydCgwLGwpKTt2YXIgYj1bXSxEPVtdO21bMF09MDtmb3IodmFyIEU9MDtFPGQ7RSsrKXt2YXIgQz1oW0VdO2lmKCF4KEMsdykpZm9yKHZhciBTPXVbRV0sQT11W0UrMV0sTj1TO048QTtOKyspe3ZhciBJPWFbTl07RFtJXT9iW0ldPXYoYltJXSxfKEMsc1tOXSkpOihEW0ldPSEwLHkucHVzaChJKSxiW0ldPV8oQyxzW05dKSl9fWZvcih2YXIgTT15Lmxlbmd0aCxGPTA7RjxNO0YrKyl7dmFyIFQ9eVtGXTtnW0ZdPWJbVF19cmV0dXJuIG1bMV09eS5sZW5ndGgsdC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczpnLGluZGV4OnkscHRyOm0sc2l6ZTpbcCwxXSxkYXRhdHlwZTpsfSl9fSksZj1lKCJfbXVsdGlwbHlNYXRyaXhNYXRyaXgiLHsiRGVuc2VNYXRyaXgsIERlbnNlTWF0cml4IjpmdW5jdGlvbih0LG4pe3ZhciBvLHM9dC5fZGF0YSxhPXQuX3NpemUsdT10Ll9kYXRhdHlwZSxjPW4uX2RhdGEsbD1uLl9zaXplLGg9bi5fZGF0YXR5cGUsZj1hWzBdLHA9YVsxXSxkPWxbMV0sZz1yLHk9aTt1JiZoJiZ1PT09aCYmInN0cmluZyI9PXR5cGVvZiB1JiYobz11LGc9ZS5maW5kKHIsW28sb10pLHk9ZS5maW5kKGksW28sb10pKTtmb3IodmFyIG09W10sdj0wO3Y8Zjt2Kyspe3ZhciBfPXNbdl07bVt2XT1bXTtmb3IodmFyIHg9MDt4PGQ7eCsrKXtmb3IodmFyIHc9eShfWzBdLGNbMF1beF0pLGI9MTtiPHA7YisrKXc9Zyh3LHkoX1tiXSxjW2JdW3hdKSk7bVt2XVt4XT13fX1yZXR1cm4gdC5jcmVhdGVEZW5zZU1hdHJpeCh7ZGF0YTptLHNpemU6W2YsZF0sZGF0YXR5cGU6b30pfSwiRGVuc2VNYXRyaXgsIFNwYXJzZU1hdHJpeCI6ZnVuY3Rpb24odCxuKXt2YXIgcz10Ll9kYXRhLGE9dC5fc2l6ZSx1PXQuX2RhdGF0eXBlLGM9bi5fdmFsdWVzLGw9bi5faW5kZXgsaD1uLl9wdHIsZj1uLl9zaXplLHA9bi5fZGF0YXR5cGU7aWYoIWMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbXVsdGlwbHkgRGVuc2UgTWF0cml4IHRpbWVzIFBhdHRlcm4gb25seSBNYXRyaXgiKTt2YXIgZCxnPWFbMF0seT1mWzFdLG09cix2PWksXz1vLHg9MDt1JiZwJiZ1PT09cCYmInN0cmluZyI9PXR5cGVvZiB1JiYoZD11LG09ZS5maW5kKHIsW2QsZF0pLHY9ZS5maW5kKGksW2QsZF0pLF89ZS5maW5kKG8sW2QsZF0pLHg9ZS5jb252ZXJ0KDAsZCkpO2Zvcih2YXIgdz1bXSxiPVtdLEQ9W10sRT1uLmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOncsaW5kZXg6YixwdHI6RCxzaXplOltnLHldLGRhdGF0eXBlOmR9KSxDPTA7Qzx5O0MrKyl7RFtDXT1iLmxlbmd0aDt2YXIgUz1oW0NdLEE9aFtDKzFdO2lmKEE+Uylmb3IodmFyIE49MCxJPTA7STxnO0krKyl7Zm9yKHZhciBNPUkrMSxGPXZvaWQgMCxUPVM7VDxBO1QrKyl7dmFyIE89bFtUXTtOIT09TT8oRj12KHNbSV1bT10sY1tUXSksTj1NKTpGPW0oRix2KHNbSV1bT10sY1tUXSkpfU49PT1NJiYhXyhGLHgpJiYoYi5wdXNoKEkpLHcucHVzaChGKSl9fXJldHVybiBEW3ldPWIubGVuZ3RoLEV9LCJTcGFyc2VNYXRyaXgsIERlbnNlTWF0cml4IjpmdW5jdGlvbih0LG4pe3ZhciBzPXQuX3ZhbHVlcyxhPXQuX2luZGV4LHU9dC5fcHRyLGM9dC5fZGF0YXR5cGU7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbXVsdGlwbHkgUGF0dGVybiBvbmx5IE1hdHJpeCB0aW1lcyBEZW5zZSBNYXRyaXgiKTt2YXIgbCxoPW4uX2RhdGEsZj1uLl9kYXRhdHlwZSxwPXQuX3NpemVbMF0sZD1uLl9zaXplWzBdLGc9bi5fc2l6ZVsxXSx5PXIsbT1pLHY9byxfPTA7YyYmZiYmYz09PWYmJiJzdHJpbmciPT10eXBlb2YgYyYmKGw9Yyx5PWUuZmluZChyLFtsLGxdKSxtPWUuZmluZChpLFtsLGxdKSx2PWUuZmluZChvLFtsLGxdKSxfPWUuY29udmVydCgwLGwpKTtmb3IodmFyIHg9W10sdz1bXSxiPVtdLEQ9dC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczp4LGluZGV4OncscHRyOmIsc2l6ZTpbcCxnXSxkYXRhdHlwZTpsfSksRT1bXSxDPVtdLFM9MDtTPGc7UysrKXtiW1NdPXcubGVuZ3RoO2Zvcih2YXIgQT1TKzEsTj0wO048ZDtOKyspe3ZhciBJPWhbTl1bU107aWYoIXYoSSxfKSlmb3IodmFyIE09dVtOXSxGPXVbTisxXSxUPU07VDxGO1QrKyl7dmFyIE89YVtUXTtDW09dIT09QT8oQ1tPXT1BLHcucHVzaChPKSxFW09dPW0oSSxzW1RdKSk6RVtPXT15KEVbT10sbShJLHNbVF0pKX19Zm9yKHZhciBMPWJbU10sUD13Lmxlbmd0aCxSPUw7UjxQO1IrKyl7dmFyIEI9d1tSXTt4W1JdPUVbQl19fXJldHVybiBiW2ddPXcubGVuZ3RoLER9LCJTcGFyc2VNYXRyaXgsIFNwYXJzZU1hdHJpeCI6ZnVuY3Rpb24odCxuKXt2YXIgbyxzPXQuX3ZhbHVlcyxhPXQuX2luZGV4LHU9dC5fcHRyLGM9dC5fZGF0YXR5cGUsbD1uLl92YWx1ZXMsaD1uLl9pbmRleCxmPW4uX3B0cixwPW4uX2RhdGF0eXBlLGQ9dC5fc2l6ZVswXSxnPW4uX3NpemVbMV0seT1zJiZsLG09cix2PWk7YyYmcCYmYz09PXAmJiJzdHJpbmciPT10eXBlb2YgYyYmKG89YyxtPWUuZmluZChyLFtvLG9dKSx2PWUuZmluZChpLFtvLG9dKSk7Zm9yKHZhciBfLHgsdyxiLEQsRSxDLFMsQT15P1tdOnZvaWQgMCxOPVtdLEk9W10sTT10LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOkEsaW5kZXg6TixwdHI6SSxzaXplOltkLGddLGRhdGF0eXBlOm99KSxGPXk/W106dm9pZCAwLFQ9W10sTz0wO088ZztPKyspe0lbT109Ti5sZW5ndGg7dmFyIEw9TysxO2ZvcihEPWZbT10sRT1mW08rMV0sYj1EO2I8RTtiKyspaWYoUz1oW2JdLHkpZm9yKHg9dVtTXSx3PXVbUysxXSxfPXg7Xzx3O18rKylUW0M9YVtfXV0hPT1MPyhUW0NdPUwsTi5wdXNoKEMpLEZbQ109dihsW2JdLHNbX10pKTpGW0NdPW0oRltDXSx2KGxbYl0sc1tfXSkpO2Vsc2UgZm9yKHg9dVtTXSx3PXVbUysxXSxfPXg7Xzx3O18rKylUW0M9YVtfXV0hPT1MJiYoVFtDXT1MLE4ucHVzaChDKSk7aWYoeSlmb3IodmFyIFA9SVtPXSxSPU4ubGVuZ3RoLEI9UDtCPFI7QisrKXt2YXIgaz1OW0JdO0FbQl09RltrXX19cmV0dXJuIElbZ109Ti5sZW5ndGgsTX19KTtyZXR1cm4gZShLeSxpLHsiQXJyYXksIEFycmF5IjplLnJlZmVyVG8oIk1hdHJpeCwgTWF0cml4IiwodD0+KGUscik9PntjKHFwKGUpLHFwKHIpKTt2YXIgaT10KG4oZSksbihyKSk7cmV0dXJuIGtmKGkpP2kudmFsdWVPZigpOml9KSksIk1hdHJpeCwgTWF0cml4IjpmdW5jdGlvbih0LGUpe3ZhciBuPXQuc2l6ZSgpLHI9ZS5zaXplKCk7cmV0dXJuIGMobixyKSwxPT09bi5sZW5ndGg/MT09PXIubGVuZ3RoP2Z1bmN0aW9uKHQsZSxuKXtpZigwPT09bil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBtdWx0aXBseSB0d28gZW1wdHkgdmVjdG9ycyIpO3JldHVybiBzKHQsZSl9KHQsZSxuWzBdKTpsKHQsZSk6MT09PXIubGVuZ3RoP2godCxlKTpmKHQsZSl9LCJNYXRyaXgsIEFycmF5IjplLnJlZmVyVG8oIk1hdHJpeCxNYXRyaXgiLCh0PT4oZSxyKT0+dChlLG4ocikpKSksIkFycmF5LCBNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT50KG4oZSxyLnN0b3JhZ2UoKSkscikpKSwiU3BhcnNlTWF0cml4LCBhbnkiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGEodCxlLGksITEpfSwiRGVuc2VNYXRyaXgsIGFueSI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdSh0LGUsaSwhMSl9LCJhbnksIFNwYXJzZU1hdHJpeCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYShlLHQsaSwhMCl9LCJhbnksIERlbnNlTWF0cml4IjpmdW5jdGlvbih0LGUpe3JldHVybiB1KGUsdCxpLCEwKX0sIkFycmF5LCBhbnkiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUobih0KSxlLGksITEpLnZhbHVlT2YoKX0sImFueSwgQXJyYXkiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUobihlKSx0LGksITApLnZhbHVlT2YoKX0sImFueSwgYW55IjppLCJhbnksIGFueSwgLi4uYW55IjplLnJlZmVyVG9TZWxmKCh0PT4oZSxuLHIpPT57Zm9yKHZhciBpPXQoZSxuKSxvPTA7bzxyLmxlbmd0aDtvKyspaT10KGkscltvXSk7cmV0dXJuIGl9KSl9KX0pKSxReT10ZCgibWF0QWxnbzA5eFMwU2YiLFsidHlwZWQiLCJlcXVhbFNjYWxhciJdLCh0PT57dmFye3R5cGVkOmUsZXF1YWxTY2FsYXI6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGkpe3ZhciBvPXQuX3ZhbHVlcyxzPXQuX2luZGV4LGE9dC5fcHRyLHU9dC5fc2l6ZSxjPXQuX2RhdGF0eXBlLGw9ci5fdmFsdWVzLGg9ci5faW5kZXgsZj1yLl9wdHIscD1yLl9zaXplLGQ9ci5fZGF0YXR5cGU7aWYodS5sZW5ndGghPT1wLmxlbmd0aCl0aHJvdyBuZXcganAodS5sZW5ndGgscC5sZW5ndGgpO2lmKHVbMF0hPT1wWzBdfHx1WzFdIT09cFsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIit1KyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIrcCsiKSIpO3ZhciBnLHk9dVswXSxtPXVbMV0sdj1uLF89MCx4PWk7InN0cmluZyI9PXR5cGVvZiBjJiZjPT09ZCYmKGc9Yyx2PWUuZmluZChuLFtnLGddKSxfPWUuY29udmVydCgwLGcpLHg9ZS5maW5kKGksW2csZ10pKTt2YXIgdyxiLEQsRSxDLFM9byYmbD9bXTp2b2lkIDAsQT1bXSxOPVtdLEk9Uz9bXTp2b2lkIDAsTT1bXTtmb3IoYj0wO2I8bTtiKyspe05bYl09QS5sZW5ndGg7dmFyIEY9YisxO2lmKEkpZm9yKEU9ZltiXSxDPWZbYisxXSxEPUU7RDxDO0QrKylNW3c9aFtEXV09RixJW3ddPWxbRF07Zm9yKEU9YVtiXSxDPWFbYisxXSxEPUU7RDxDO0QrKylpZih3PXNbRF0sSSl7dmFyIFQ9TVt3XT09PUY/SVt3XTpfLE89eChvW0RdLFQpO3YoTyxfKXx8KEEucHVzaCh3KSxTLnB1c2goTykpfWVsc2UgQS5wdXNoKHcpfXJldHVybiBOW21dPUEubGVuZ3RoLHQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6UyxpbmRleDpBLHB0cjpOLHNpemU6W3ksbV0sZGF0YXR5cGU6Z30pfX0pKSwkeT10ZCgibWF0QWxnbzA3eFNTZiIsWyJ0eXBlZCIsIkRlbnNlTWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxEZW5zZU1hdHJpeDpufT10O3JldHVybiBmdW5jdGlvbih0LGksbyl7dmFyIHM9dC5fc2l6ZSxhPXQuX2RhdGF0eXBlLHU9aS5fc2l6ZSxjPWkuX2RhdGF0eXBlO2lmKHMubGVuZ3RoIT09dS5sZW5ndGgpdGhyb3cgbmV3IGpwKHMubGVuZ3RoLHUubGVuZ3RoKTtpZihzWzBdIT09dVswXXx8c1sxXSE9PXVbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrcysiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK3UrIikiKTt2YXIgbCxoPXNbMF0sZj1zWzFdLHA9MCxkPW87InN0cmluZyI9PXR5cGVvZiBhJiZhPT09YyYmKGw9YSxwPWUuY29udmVydCgwLGwpLGQ9ZS5maW5kKG8sW2wsbF0pKTt2YXIgZyx5LG09W107Zm9yKGc9MDtnPGg7ZysrKW1bZ109W107dmFyIHY9W10sXz1bXSx4PVtdLHc9W107Zm9yKHk9MDt5PGY7eSsrKXt2YXIgYj15KzE7Zm9yKHIodCx5LHgsdixiKSxyKGkseSx3LF8sYiksZz0wO2c8aDtnKyspe3ZhciBEPXhbZ109PT1iP3ZbZ106cCxFPXdbZ109PT1iP19bZ106cDttW2ddW3ldPWQoRCxFKX19cmV0dXJuIG5ldyBuKHtkYXRhOm0sc2l6ZTpbaCxmXSxkYXRhdHlwZTpsfSl9O2Z1bmN0aW9uIHIodCxlLG4scixpKXtmb3IodmFyIG89dC5fdmFsdWVzLHM9dC5faW5kZXgsYT10Ll9wdHIsdT1hW2VdLGM9YVtlKzFdO3U8Yzt1Kyspe3ZhciBsPXNbdV07bltsXT1pLHJbbF09b1t1XX19fSkpLHRtPSJjb25qIixlbT10ZCh0bSxbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZSh0bSx7Im51bWJlciB8IEJpZ051bWJlciB8IEZyYWN0aW9uIjp0PT50LENvbXBsZXg6dD0+dC5jb25qdWdhdGUoKSwiQXJyYXkgfCBNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnh5KGUsdCkpKX0pfSkpLG5tPSJjb25jYXQiLHJtPXRkKG5tLFsidHlwZWQiLCJtYXRyaXgiLCJpc0ludGVnZXIiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpuLGlzSW50ZWdlcjpyfT10O3JldHVybiBlKG5tLHsiLi4uQXJyYXkgfCBNYXRyaXggfCBudW1iZXIgfCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQpe3ZhciBlLGksbz10Lmxlbmd0aCxzPS0xLGE9ITEsdT1bXTtmb3IoZT0wO2U8bztlKyspe3ZhciBjPXRbZV07aWYoa2YoYykmJihhPSEwKSxNZihjKXx8RmYoYykpe2lmKGUhPT1vLTEpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb24gbXVzdCBiZSBzcGVjaWZpZWQgYXMgbGFzdCBhcmd1bWVudCIpO2lmKGk9cyxzPWMudmFsdWVPZigpLCFyKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoIkludGVnZXIgbnVtYmVyIGV4cGVjdGVkIGZvciBkaW1lbnNpb24iKTtpZihzPDB8fGU+MCYmcz5pKXRocm93IG5ldyBVcChzLGkrMSl9ZWxzZXt2YXIgbD1tcChjKS52YWx1ZU9mKCksaD1xcChsKTtpZih1W2VdPWwsaT1zLHM9aC5sZW5ndGgtMSxlPjAmJnMhPT1pKXRocm93IG5ldyBqcChpKzEscysxKX19aWYoMD09PXUubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiQXQgbGVhc3Qgb25lIG1hdHJpeCBleHBlY3RlZCIpO2Zvcih2YXIgZj11LnNoaWZ0KCk7dS5sZW5ndGg7KWY9aW0oZix1LnNoaWZ0KCkscywwKTtyZXR1cm4gYT9uKGYpOmZ9LCIuLi5zdHJpbmciOmZ1bmN0aW9uKHQpe3JldHVybiB0LmpvaW4oIiIpfX0pfSkpO2Z1bmN0aW9uIGltKHQsZSxuLHIpe2lmKHI8bil7aWYodC5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcganAodC5sZW5ndGgsZS5sZW5ndGgpO2Zvcih2YXIgaT1bXSxvPTA7bzx0Lmxlbmd0aDtvKyspaVtvXT1pbSh0W29dLGVbb10sbixyKzEpO3JldHVybiBpfXJldHVybiB0LmNvbmNhdChlKX12YXIgb209dGQoIm9uZXMiLFsidHlwZWQiLCJjb25maWciLCJtYXRyaXgiLCJCaWdOdW1iZXIiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyLEJpZ051bWJlcjppfT10O3JldHVybiBlKCJvbmVzIix7IiI6ZnVuY3Rpb24oKXtyZXR1cm4iQXJyYXkiPT09bi5tYXRyaXg/byhbXSk6byhbXSwiZGVmYXVsdCIpfSwiLi4ubnVtYmVyIHwgQmlnTnVtYmVyIHwgc3RyaW5nIjpmdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHRbdC5sZW5ndGgtMV0pe3ZhciBlPXQucG9wKCk7cmV0dXJuIG8odCxlKX1yZXR1cm4iQXJyYXkiPT09bi5tYXRyaXg/byh0KTpvKHQsImRlZmF1bHQiKX0sQXJyYXk6byxNYXRyaXg6ZnVuY3Rpb24odCl7dmFyIGU9dC5zdG9yYWdlKCk7cmV0dXJuIG8odC52YWx1ZU9mKCksZSl9LCJBcnJheSB8IE1hdHJpeCwgc3RyaW5nIjpmdW5jdGlvbih0LGUpe3JldHVybiBvKHQudmFsdWVPZigpLGUpfX0pO2Z1bmN0aW9uIG8odCxlKXt2YXIgbj1mdW5jdGlvbih0KXt2YXIgZT0hMTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LG4scil7RmYodCkmJihlPSEwLHJbbl09dC50b051bWJlcigpKX0pKSxlfSh0KSxvPW4/bmV3IGkoMSk6MTtpZihmdW5jdGlvbih0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdHx8IVNwKHQpfHx0PDApdGhyb3cgbmV3IEVycm9yKCJQYXJhbWV0ZXJzIGluIGZ1bmN0aW9uIG9uZXMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VycyIpfSkpfSh0KSxlKXt2YXIgcz1yKGUpO3JldHVybiB0Lmxlbmd0aD4wP3MucmVzaXplKHQsbyk6c312YXIgYT1bXTtyZXR1cm4gdC5sZW5ndGg+MD9YcChhLHQsbyk6YX19KSk7ZnVuY3Rpb24gc20oKXt0aHJvdyBuZXcgRXJyb3IoJ05vICJiaWdudW1iZXIiIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZScpfWZ1bmN0aW9uIGFtKCl7dGhyb3cgbmV3IEVycm9yKCdObyAiZnJhY3Rpb24iIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZScpfWZ1bmN0aW9uIHVtKCl7dGhyb3cgbmV3IEVycm9yKCdObyAibWF0cml4IiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUnKX12YXIgY209InJhbmdlIixsbT10ZChjbSxbInR5cGVkIiwiY29uZmlnIiwiP21hdHJpeCIsIj9iaWdudW1iZXIiLCJzbWFsbGVyIiwic21hbGxlckVxIiwibGFyZ2VyIiwibGFyZ2VyRXEiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyLGJpZ251bWJlcjppLHNtYWxsZXI6byxzbWFsbGVyRXE6cyxsYXJnZXI6YSxsYXJnZXJFcTp1fT10O3JldHVybiBlKGNtLHtzdHJpbmc6bCwic3RyaW5nLCBib29sZWFuIjpsLCJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYyhoKHQsZSwxKSl9LCJudW1iZXIsIG51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGMoaCh0LGUsbikpfSwibnVtYmVyLCBudW1iZXIsIGJvb2xlYW4iOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYyhuP2YodCxlLDEpOmgodCxlLDEpKX0sIm51bWJlciwgbnVtYmVyLCBudW1iZXIsIGJvb2xlYW4iOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBjKHI/Zih0LGUsbik6aCh0LGUsbikpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGMocCh0LGUsbmV3KDAsdC5jb25zdHJ1Y3RvcikoMSkpKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYyhwKHQsZSxuKSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciwgYm9vbGVhbiI6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuY29uc3RydWN0b3I7cmV0dXJuIGMobj9kKHQsZSxuZXcgcigxKSk6cCh0LGUsbmV3IHIoMSkpKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyLCBCaWdOdW1iZXIsIGJvb2xlYW4iOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBjKHI/ZCh0LGUsbik6cCh0LGUsbikpfX0pO2Z1bmN0aW9uIGModCl7cmV0dXJuIk1hdHJpeCI9PT1uLm1hdHJpeD9yP3IodCk6dW0oKTp0fWZ1bmN0aW9uIGwodCxlKXt2YXIgcj1mdW5jdGlvbih0KXt2YXIgZT10LnNwbGl0KCI6Iiksbj1lLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0KX0pKSxyPW4uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGlzTmFOKHQpfSkpO2lmKHIpcmV0dXJuIG51bGw7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDI6cmV0dXJue3N0YXJ0Om5bMF0sZW5kOm5bMV0sc3RlcDoxfTtjYXNlIDM6cmV0dXJue3N0YXJ0Om5bMF0sZW5kOm5bMl0sc3RlcDpuWzFdfTtkZWZhdWx0OnJldHVybiBudWxsfX0odCk7aWYoIXIpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdTdHJpbmcgIicrdCsnIiBpcyBubyB2YWxpZCByYW5nZScpO3JldHVybiJCaWdOdW1iZXIiPT09bi5udW1iZXI/KHZvaWQgMD09PWkmJnNtKCksYygoZT9kOnApKGkoci5zdGFydCksaShyLmVuZCksaShyLnN0ZXApKSkpOmMoKGU/ZjpoKShyLnN0YXJ0LHIuZW5kLHIuc3RlcCkpfWZ1bmN0aW9uIGgodCxlLG4pe3ZhciByPVtdLGk9dDtpZihuPjApZm9yKDtvKGksZSk7KXIucHVzaChpKSxpKz1uO2Vsc2UgaWYobjwwKWZvcig7YShpLGUpOylyLnB1c2goaSksaSs9bjtyZXR1cm4gcn1mdW5jdGlvbiBmKHQsZSxuKXt2YXIgcj1bXSxpPXQ7aWYobj4wKWZvcig7cyhpLGUpOylyLnB1c2goaSksaSs9bjtlbHNlIGlmKG48MClmb3IoO3UoaSxlKTspci5wdXNoKGkpLGkrPW47cmV0dXJuIHJ9ZnVuY3Rpb24gcCh0LGUsbil7dmFyIHI9aSgwKSxzPVtdLHU9dDtpZihuLmd0KHIpKWZvcig7byh1LGUpOylzLnB1c2godSksdT11LnBsdXMobik7ZWxzZSBpZihuLmx0KHIpKWZvcig7YSh1LGUpOylzLnB1c2godSksdT11LnBsdXMobik7cmV0dXJuIHN9ZnVuY3Rpb24gZCh0LGUsbil7dmFyIHI9aSgwKSxvPVtdLGE9dDtpZihuLmd0KHIpKWZvcig7cyhhLGUpOylvLnB1c2goYSksYT1hLnBsdXMobik7ZWxzZSBpZihuLmx0KHIpKWZvcig7dShhLGUpOylvLnB1c2goYSksYT1hLnBsdXMobik7cmV0dXJuIG99fSkpLGhtPSJzaXplIixmbT10ZChobSxbInR5cGVkIiwiY29uZmlnIiwiP21hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnJ9PXQ7cmV0dXJuIGUoaG0se01hdHJpeDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jcmVhdGUodC5zaXplKCkpfSxBcnJheTpxcCxzdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIkFycmF5Ij09PW4ubWF0cml4P1t0Lmxlbmd0aF06cihbdC5sZW5ndGhdKX0sIm51bWJlciB8IENvbXBsZXggfCBCaWdOdW1iZXIgfCBVbml0IHwgYm9vbGVhbiB8IG51bGwiOmZ1bmN0aW9uKHQpe3JldHVybiJBcnJheSI9PT1uLm1hdHJpeD9bXTpyP3IoW10pOnVtKCl9fSl9KSkscG09InN1YnNldCIsZG09dGQocG0sWyJ0eXBlZCIsIm1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om59PXQ7cmV0dXJuIGUocG0seyJBcnJheSwgSW5kZXgiOmZ1bmN0aW9uKHQsZSl7dmFyIHI9bih0KS5zdWJzZXQoZSk7cmV0dXJuIGUuaXNTY2FsYXIoKT9yOnIudmFsdWVPZigpfSwiTWF0cml4LCBJbmRleCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zdWJzZXQoZSl9LCJPYmplY3QsIEluZGV4IjptbSwic3RyaW5nLCBJbmRleCI6Z20sIkFycmF5LCBJbmRleCwgYW55IjpmdW5jdGlvbih0LGUscil7cmV0dXJuIG4obXAodCkpLnN1YnNldChlLHIsdm9pZCAwKS52YWx1ZU9mKCl9LCJBcnJheSwgSW5kZXgsIGFueSwgYW55IjpmdW5jdGlvbih0LGUscixpKXtyZXR1cm4gbihtcCh0KSkuc3Vic2V0KGUscixpKS52YWx1ZU9mKCl9LCJNYXRyaXgsIEluZGV4LCBhbnkiOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC5jbG9uZSgpLnN1YnNldChlLG4pfSwiTWF0cml4LCBJbmRleCwgYW55LCBhbnkiOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0LmNsb25lKCkuc3Vic2V0KGUsbixyKX0sInN0cmluZywgSW5kZXgsIHN0cmluZyI6eW0sInN0cmluZywgSW5kZXgsIHN0cmluZywgc3RyaW5nIjp5bSwiT2JqZWN0LCBJbmRleCwgYW55Ijp2bX0pfSkpO2Z1bmN0aW9uIGdtKHQsZSl7aWYoIVZmKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkluZGV4IGV4cGVjdGVkIik7aWYoMSE9PWUuc2l6ZSgpLmxlbmd0aCl0aHJvdyBuZXcganAoZS5zaXplKCkubGVuZ3RoLDEpO3ZhciBuPXQubGVuZ3RoO1lwKGUubWluKClbMF0sbiksWXAoZS5tYXgoKVswXSxuKTt2YXIgcj1lLmRpbWVuc2lvbigwKSxpPSIiO3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKGUpe2krPXQuY2hhckF0KGUpfSkpLGl9ZnVuY3Rpb24geW0odCxlLG4scil7aWYoIWV8fCEwIT09ZS5pc0luZGV4KXRocm93IG5ldyBUeXBlRXJyb3IoIkluZGV4IGV4cGVjdGVkIik7aWYoMSE9PWUuc2l6ZSgpLmxlbmd0aCl0aHJvdyBuZXcganAoZS5zaXplKCkubGVuZ3RoLDEpO2lmKHZvaWQgMCE9PXIpe2lmKCJzdHJpbmciIT10eXBlb2Ygcnx8MSE9PXIubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlNpbmdsZSBjaGFyYWN0ZXIgZXhwZWN0ZWQgYXMgZGVmYXVsdFZhbHVlIil9ZWxzZSByPSIgIjt2YXIgaT1lLmRpbWVuc2lvbigwKTtpZihpLnNpemUoKVswXSE9PW4ubGVuZ3RoKXRocm93IG5ldyBqcChpLnNpemUoKVswXSxuLmxlbmd0aCk7dmFyIG89dC5sZW5ndGg7WXAoZS5taW4oKVswXSksWXAoZS5tYXgoKVswXSk7Zm9yKHZhciBzPVtdLGE9MDthPG87YSsrKXNbYV09dC5jaGFyQXQoYSk7aWYoaS5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3NbdF09bi5jaGFyQXQoZVswXSl9KSkscy5sZW5ndGg+bylmb3IodmFyIHU9by0xLGM9cy5sZW5ndGg7dTxjO3UrKylzW3VdfHwoc1t1XT1yKTtyZXR1cm4gcy5qb2luKCIiKX1mdW5jdGlvbiBtbSh0LGUpe2lmKDEhPT1lLnNpemUoKS5sZW5ndGgpdGhyb3cgbmV3IGpwKGUuc2l6ZSgpLDEpO3ZhciBuPWUuZGltZW5zaW9uKDApO2lmKCJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdHJpbmcgZXhwZWN0ZWQgYXMgaW5kZXggdG8gcmV0cmlldmUgYW4gb2JqZWN0IHByb3BlcnR5Iik7cmV0dXJuIG5kKHQsbil9ZnVuY3Rpb24gdm0odCxlLG4pe2lmKDEhPT1lLnNpemUoKS5sZW5ndGgpdGhyb3cgbmV3IGpwKGUuc2l6ZSgpLDEpO3ZhciByPWUuZGltZW5zaW9uKDApO2lmKCJzdHJpbmciIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdHJpbmcgZXhwZWN0ZWQgYXMgaW5kZXggdG8gcmV0cmlldmUgYW4gb2JqZWN0IHByb3BlcnR5Iik7dmFyIGk9bXAodCk7cmV0dXJuIHJkKGkscixuKSxpfXZhciBfbT0idHJhbnNwb3NlIix4bT10ZChfbSxbInR5cGVkIiwibWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bn09dDtyZXR1cm4gZShfbSx7QXJyYXk6dD0+cihuKHQpKS52YWx1ZU9mKCksTWF0cml4OnIsYW55Om1wfSk7ZnVuY3Rpb24gcih0KXt2YXIgZSxuPXQuc2l6ZSgpO3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAxOmU9dC5jbG9uZSgpO2JyZWFrO2Nhc2UgMjp2YXIgcj1uWzBdLGk9blsxXTtpZigwPT09aSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ2Fubm90IHRyYW5zcG9zZSBhIDJEIG1hdHJpeCB3aXRoIG5vIGNvbHVtbnMgKHNpemU6ICIra3AobikrIikiKTtzd2l0Y2godC5zdG9yYWdlKCkpe2Nhc2UiZGVuc2UiOmU9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcixpPXQuX2RhdGEsbz1bXSxzPTA7czxuO3MrKyl7cj1vW3NdPVtdO2Zvcih2YXIgYT0wO2E8ZTthKyspclthXT1tcChpW2FdW3NdKX1yZXR1cm4gdC5jcmVhdGVEZW5zZU1hdHJpeCh7ZGF0YTpvLHNpemU6W24sZV0sZGF0YXR5cGU6dC5fZGF0YXR5cGV9KX0odCxyLGkpO2JyZWFrO2Nhc2Uic3BhcnNlIjplPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9dC5fdmFsdWVzLGk9dC5faW5kZXgsbz10Ll9wdHIscz1yP1tdOnZvaWQgMCxhPVtdLHU9W10sYz1bXSxsPTA7bDxlO2wrKyljW2xdPTA7dmFyIGgsZixwO2ZvcihoPTAsZj1pLmxlbmd0aDtoPGY7aCsrKWNbaVtoXV0rKztmb3IodmFyIGQ9MCxnPTA7ZzxlO2crKyl1LnB1c2goZCksZCs9Y1tnXSxjW2ddPXVbZ107Zm9yKHUucHVzaChkKSxwPTA7cDxuO3ArKylmb3IodmFyIHk9b1twXSxtPW9bcCsxXSx2PXk7djxtO3YrKyl7dmFyIF89Y1tpW3ZdXSsrO2FbX109cCxyJiYoc1tfXT1tcChyW3ZdKSl9cmV0dXJuIHQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6cyxpbmRleDphLHB0cjp1LHNpemU6W24sZV0sZGF0YXR5cGU6dC5fZGF0YXR5cGV9KX0odCxyLGkpfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpeCBtdXN0IGJlIGEgdmVjdG9yIG9yIHR3byBkaW1lbnNpb25hbCAoc2l6ZTogIitrcChuKSsiKSIpfXJldHVybiBlfX0pKSx3bT10ZCgibnVtZXJpYyIsWyJudW1iZXIiLCI/YmlnbnVtYmVyIiwiP2ZyYWN0aW9uIl0sKHQ9Pnt2YXJ7bnVtYmVyOmUsYmlnbnVtYmVyOm4sZnJhY3Rpb246cn09dCxpPXtzdHJpbmc6ITAsbnVtYmVyOiEwLEJpZ051bWJlcjohMCxGcmFjdGlvbjohMH0sbz17bnVtYmVyOnQ9PmUodCksQmlnTnVtYmVyOm4/dD0+bih0KTpzbSxGcmFjdGlvbjpyP3Q9PnIodCk6YW19O3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06Im51bWJlciI7aWYodm9pZCAwIT09KGFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIm51bWVyaWMoKSB0YWtlcyBvbmUgb3IgdHdvIGFyZ3VtZW50cyIpO3ZhciBuPXlwKHQpO2lmKCEobiBpbiBpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCAiK3QrJyBvZiB0eXBlICInK24rJyI7IHZhbGlkIGlucHV0IHR5cGVzIGFyZSAnK09iamVjdC5rZXlzKGkpLmpvaW4oIiwgIikpO2lmKCEoZSBpbiBvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCAiK3QrJyB0byB0eXBlICInK2UrJyI7IHZhbGlkIG91dHB1dCB0eXBlcyBhcmUgJytPYmplY3Qua2V5cyhvKS5qb2luKCIsICIpKTtyZXR1cm4gZT09PW4/dDpvW2VdKHQpfX0pKSxibT0iZGl2aWRlU2NhbGFyIixEbT10ZChibSxbInR5cGVkIiwibnVtZXJpYyJdLCh0PT57dmFye3R5cGVkOmUsbnVtZXJpYzpufT10O3JldHVybiBlKGJtLHsibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQvZX0sIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZGl2KGUpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZGl2KGUpfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmRpdihlKX0sIlVuaXQsIG51bWJlciB8IENvbXBsZXggfCBGcmFjdGlvbiB8IEJpZ051bWJlciB8IFVuaXQiOih0LGUpPT50LmRpdmlkZShlKSwibnVtYmVyIHwgRnJhY3Rpb24gfCBDb21wbGV4IHwgQmlnTnVtYmVyLCBVbml0IjoodCxlKT0+ZS5kaXZpZGVJbnRvKHQpfSl9KSksRW09ImRvdERpdmlkZSIsQ209dGQoRW0sWyJ0eXBlZCIsIm1hdHJpeCIsImVxdWFsU2NhbGFyIiwiZGl2aWRlU2NhbGFyIiwiRGVuc2VNYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpuLGVxdWFsU2NhbGFyOnIsZGl2aWRlU2NhbGFyOmksRGVuc2VNYXRyaXg6byxjb25jYXQ6c309dCxhPVd5KHt0eXBlZDplLGVxdWFsU2NhbGFyOnJ9KSx1PUh5KHt0eXBlZDplfSksYz0keSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDpvfSksbD1reSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpyfSksaD16eSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDpvfSksZj1YeSh7dHlwZWQ6ZSxtYXRyaXg6bixjb25jYXQ6c30pO3JldHVybiBlKEVtLGYoe2Vsb3A6aSxTUzpjLERTOnUsU0Q6YSxTczpsLHNTOmh9KSl9KSksU209InNtYWxsZXIiLEFtPXRkKFNtLFsidHlwZWQiLCJjb25maWciLCJtYXRyaXgiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsRGVuc2VNYXRyaXg6aSxjb25jYXQ6b309dCxzPUh5KHt0eXBlZDplfSksYT0keSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksdT16eSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksYz1YeSh7dHlwZWQ6ZSxtYXRyaXg6cixjb25jYXQ6b30pLGw9QXkoe3R5cGVkOmV9KTtyZXR1cm4gZShTbSxObSh7dHlwZWQ6ZSxjb25maWc6bn0pLHsiYm9vbGVhbiwgYm9vbGVhbiI6KHQsZSk9PnQ8ZSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubHQoZSkmJiFTeSh0LGUsbi5lcHNpbG9uKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6KHQsZSk9Pi0xPT09dC5jb21wYXJlKGUpLCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbih0LGUpe3Rocm93IG5ldyBUeXBlRXJyb3IoIk5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycyIpfX0sbCxjKHtTUzphLERTOnMsU3M6dX0pKX0pKSxObT10ZChTbSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dDtyZXR1cm4gZShTbSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0PGUmJiFMcCh0LGUsbi5lcHNpbG9uKX19KX0pKSxJbT0ic21hbGxlckVxIixNbT10ZChJbSxbInR5cGVkIiwiY29uZmlnIiwibWF0cml4IiwiRGVuc2VNYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyLERlbnNlTWF0cml4OmksY29uY2F0Om99PXQscz1IeSh7dHlwZWQ6ZX0pLGE9JHkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLHU9enkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLGM9WHkoe3R5cGVkOmUsbWF0cml4OnIsY29uY2F0Om99KSxsPUF5KHt0eXBlZDplfSk7cmV0dXJuIGUoSW0sRm0oe3R5cGVkOmUsY29uZmlnOm59KSx7ImJvb2xlYW4sIGJvb2xlYW4iOih0LGUpPT50PD1lLCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5sdGUoZSl8fFN5KHQsZSxuLmVwc2lsb24pfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjoodCxlKT0+MSE9PXQuY29tcGFyZShlKSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJObyBvcmRlcmluZyByZWxhdGlvbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMiKX19LGwsYyh7U1M6YSxEUzpzLFNzOnV9KSl9KSksRm09dGQoSW0sWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQ7cmV0dXJuIGUoSW0seyJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDw9ZXx8THAodCxlLG4uZXBzaWxvbil9fSl9KSksVG09ImxhcmdlciIsT209dGQoVG0sWyJ0eXBlZCIsImNvbmZpZyIsIm1hdHJpeCIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixEZW5zZU1hdHJpeDppLGNvbmNhdDpvfT10LHM9SHkoe3R5cGVkOmV9KSxhPSR5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSx1PXp5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSxjPVh5KHt0eXBlZDplLG1hdHJpeDpyLGNvbmNhdDpvfSksbD1BeSh7dHlwZWQ6ZX0pO3JldHVybiBlKFRtLExtKHt0eXBlZDplLGNvbmZpZzpufSkseyJib29sZWFuLCBib29sZWFuIjoodCxlKT0+dD5lLCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5ndChlKSYmIVN5KHQsZSxuLmVwc2lsb24pfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjoodCxlKT0+MT09PXQuY29tcGFyZShlKSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJObyBvcmRlcmluZyByZWxhdGlvbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMiKX19LGwsYyh7U1M6YSxEUzpzLFNzOnV9KSl9KSksTG09dGQoVG0sWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQ7cmV0dXJuIGUoVG0seyJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD5lJiYhTHAodCxlLG4uZXBzaWxvbil9fSl9KSksUG09ImxhcmdlckVxIixSbT10ZChQbSxbInR5cGVkIiwiY29uZmlnIiwibWF0cml4IiwiRGVuc2VNYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyLERlbnNlTWF0cml4OmksY29uY2F0Om99PXQscz1IeSh7dHlwZWQ6ZX0pLGE9JHkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLHU9enkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLGM9WHkoe3R5cGVkOmUsbWF0cml4OnIsY29uY2F0Om99KSxsPUF5KHt0eXBlZDplfSk7cmV0dXJuIGUoUG0sQm0oe3R5cGVkOmUsY29uZmlnOm59KSx7ImJvb2xlYW4sIGJvb2xlYW4iOih0LGUpPT50Pj1lLCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5ndGUoZSl8fFN5KHQsZSxuLmVwc2lsb24pfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjoodCxlKT0+LTEhPT10LmNvbXBhcmUoZSksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzIil9fSxsLGMoe1NTOmEsRFM6cyxTczp1fSkpfSkpLEJtPXRkKFBtLFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10O3JldHVybiBlKFBtLHsibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+PWV8fExwKHQsZSxuLmVwc2lsb24pfX0pfSkpLGttPXRkKCJJbW11dGFibGVEZW5zZU1hdHJpeCIsWyJzbWFsbGVyIiwiRGVuc2VNYXRyaXgiXSwodD0+e3ZhcntzbWFsbGVyOmUsRGVuc2VNYXRyaXg6bn09dDtmdW5jdGlvbiByKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKTtpZihlJiYhUmYoZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGF0eXBlOiAiK2UpO2lmKGtmKHQpfHxCZih0KSl7dmFyIGk9bmV3IG4odCxlKTt0aGlzLl9kYXRhPWkuX2RhdGEsdGhpcy5fc2l6ZT1pLl9zaXplLHRoaXMuX2RhdGF0eXBlPWkuX2RhdGF0eXBlLHRoaXMuX21pbj1udWxsLHRoaXMuX21heD1udWxsfWVsc2UgaWYodCYmQmYodC5kYXRhKSYmQmYodC5zaXplKSl0aGlzLl9kYXRhPXQuZGF0YSx0aGlzLl9zaXplPXQuc2l6ZSx0aGlzLl9kYXRhdHlwZT10LmRhdGF0eXBlLHRoaXMuX21pbj12b2lkIDAhPT10Lm1pbj90Lm1pbjpudWxsLHRoaXMuX21heD12b2lkIDAhPT10Lm1heD90Lm1heDpudWxsO2Vsc2V7aWYodCl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbnN1cHBvcnRlZCB0eXBlIG9mIGRhdGEgKCIreXAodCkrIikiKTt0aGlzLl9kYXRhPVtdLHRoaXMuX3NpemU9WzBdLHRoaXMuX2RhdGF0eXBlPWUsdGhpcy5fbWluPW51bGwsdGhpcy5fbWF4PW51bGx9fXJldHVybiByLnByb3RvdHlwZT1uZXcgbixyLnByb3RvdHlwZS50eXBlPSJJbW11dGFibGVEZW5zZU1hdHJpeCIsci5wcm90b3R5cGUuaXNJbW11dGFibGVEZW5zZU1hdHJpeD0hMCxyLnByb3RvdHlwZS5zdWJzZXQ9ZnVuY3Rpb24odCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTp2YXIgZT1uLnByb3RvdHlwZS5zdWJzZXQuY2FsbCh0aGlzLHQpO3JldHVybiBrZihlKT9uZXcgcih7ZGF0YTplLl9kYXRhLHNpemU6ZS5fc2l6ZSxkYXRhdHlwZTplLl9kYXRhdHlwZX0pOmU7Y2FzZSAyOmNhc2UgMzp0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc2V0IHN1YnNldCBvbiBhbiBJbW11dGFibGUgTWF0cml4IGluc3RhbmNlIik7ZGVmYXVsdDp0aHJvdyBuZXcgU3ludGF4RXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKX19LHIucHJvdG90eXBlLnNldD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzZXQgb24gYW4gSW1tdXRhYmxlIE1hdHJpeCBpbnN0YW5jZSIpfSxyLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgcmVzaXplIG9uIGFuIEltbXV0YWJsZSBNYXRyaXggaW5zdGFuY2UiKX0sci5wcm90b3R5cGUucmVzaGFwZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSByZXNoYXBlIG9uIGFuIEltbXV0YWJsZSBNYXRyaXggaW5zdGFuY2UiKX0sci5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIoe2RhdGE6bXAodGhpcy5fZGF0YSksc2l6ZTptcCh0aGlzLl9zaXplKSxkYXRhdHlwZTp0aGlzLl9kYXRhdHlwZX0pfSxyLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJJbW11dGFibGVEZW5zZU1hdHJpeCIsZGF0YTp0aGlzLl9kYXRhLHNpemU6dGhpcy5fc2l6ZSxkYXRhdHlwZTp0aGlzLl9kYXRhdHlwZX19LHIuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByKHQpfSxyLnByb3RvdHlwZS5zd2FwUm93cz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzd2FwUm93cyBvbiBhbiBJbW11dGFibGUgTWF0cml4IGluc3RhbmNlIil9LHIucHJvdG90eXBlLm1pbj1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9taW4pe3ZhciB0PW51bGw7dGhpcy5mb3JFYWNoKChmdW5jdGlvbihuKXsobnVsbD09PXR8fGUobix0KSkmJih0PW4pfSkpLHRoaXMuX21pbj1udWxsIT09dD90OnZvaWQgMH1yZXR1cm4gdGhpcy5fbWlufSxyLnByb3RvdHlwZS5tYXg9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fbWF4KXt2YXIgdD1udWxsO3RoaXMuZm9yRWFjaCgoZnVuY3Rpb24obil7KG51bGw9PT10fHxlKHQsbikpJiYodD1uKX0pKSx0aGlzLl9tYXg9bnVsbCE9PXQ/dDp2b2lkIDB9cmV0dXJuIHRoaXMuX21heH0scn0pLHtpc0NsYXNzOiEwfSksem09dGQoIkluZGV4IixbIkltbXV0YWJsZURlbnNlTWF0cml4Il0sKHQ9Pnt2YXJ7SW1tdXRhYmxlRGVuc2VNYXRyaXg6ZX09dDtmdW5jdGlvbiBuKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG4pKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7dGhpcy5fZGltZW5zaW9ucz1bXSx0aGlzLl9pc1NjYWxhcj0hMDtmb3IodmFyIGU9MCxpPWFyZ3VtZW50cy5sZW5ndGg7ZTxpO2UrKyl7dmFyIG89YXJndW1lbnRzW2VdO2lmKHFmKG8pKXRoaXMuX2RpbWVuc2lvbnMucHVzaChvKSx0aGlzLl9pc1NjYWxhcj0hMTtlbHNlIGlmKEFycmF5LmlzQXJyYXkobyl8fGtmKG8pKXt2YXIgcz1yKG8udmFsdWVPZigpKTt0aGlzLl9kaW1lbnNpb25zLnB1c2gocyk7dmFyIGE9cy5zaXplKCk7KDEhPT1hLmxlbmd0aHx8MSE9PWFbMF0pJiYodGhpcy5faXNTY2FsYXI9ITEpfWVsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBvKXRoaXMuX2RpbWVuc2lvbnMucHVzaChyKFtvXSkpO2Vsc2V7aWYoInN0cmluZyIhPXR5cGVvZiBvKXRocm93IG5ldyBUeXBlRXJyb3IoIkRpbWVuc2lvbiBtdXN0IGJlIGFuIEFycmF5LCBNYXRyaXgsIG51bWJlciwgc3RyaW5nLCBvciBSYW5nZSIpO3RoaXMuX2RpbWVuc2lvbnMucHVzaChvKX19fWZ1bmN0aW9uIHIodCl7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKCJudW1iZXIiIT10eXBlb2YgdFtuXXx8IVNwKHRbbl0pKXRocm93IG5ldyBUeXBlRXJyb3IoIkluZGV4IHBhcmFtZXRlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyIG51bWJlcnMiKTtyZXR1cm4gbmV3IGUodCl9cmV0dXJuIG4ucHJvdG90eXBlLnR5cGU9IkluZGV4IixuLnByb3RvdHlwZS5pc0luZGV4PSEwLG4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG47cmV0dXJuIHQuX2RpbWVuc2lvbnM9bXAodGhpcy5fZGltZW5zaW9ucyksdC5faXNTY2FsYXI9dGhpcy5faXNTY2FsYXIsdH0sbi5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IG47cmV0dXJuIG4uYXBwbHkoZSx0KSxlfSxuLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX2RpbWVuc2lvbnNbZV07dFtlXT0ic3RyaW5nIj09dHlwZW9mIHI/MTpyLnNpemUoKVswXX1yZXR1cm4gdH0sbi5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX2RpbWVuc2lvbnNbZV07dFtlXT0ic3RyaW5nIj09dHlwZW9mIHI/cjpyLm1heCgpfXJldHVybiB0fSxuLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5fZGltZW5zaW9ucy5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dGhpcy5fZGltZW5zaW9uc1tlXTt0W2VdPSJzdHJpbmciPT10eXBlb2Ygcj9yOnIubWluKCl9cmV0dXJuIHR9LG4ucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXQodGhpcy5fZGltZW5zaW9uc1tlXSxlLHRoaXMpfSxuLnByb3RvdHlwZS5kaW1lbnNpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RpbWVuc2lvbnNbdF18fG51bGx9LG4ucHJvdG90eXBlLmlzT2JqZWN0UHJvcGVydHk9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoJiYic3RyaW5nIj09dHlwZW9mIHRoaXMuX2RpbWVuc2lvbnNbMF19LG4ucHJvdG90eXBlLmdldE9iamVjdFByb3BlcnR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNPYmplY3RQcm9wZXJ0eSgpP3RoaXMuX2RpbWVuc2lvbnNbMF06bnVsbH0sbi5wcm90b3R5cGUuaXNTY2FsYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNTY2FsYXJ9LG4ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5fZGltZW5zaW9ucy5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dGhpcy5fZGltZW5zaW9uc1tlXTt0LnB1c2goInN0cmluZyI9PXR5cGVvZiByP3I6ci50b0FycmF5KCkpfXJldHVybiB0fSxuLnByb3RvdHlwZS52YWx1ZU9mPW4ucHJvdG90eXBlLnRvQXJyYXksbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5fZGltZW5zaW9ucy5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dGhpcy5fZGltZW5zaW9uc1tlXTsic3RyaW5nIj09dHlwZW9mIHI/dC5wdXNoKEpTT04uc3RyaW5naWZ5KHIpKTp0LnB1c2goci50b1N0cmluZygpKX1yZXR1cm4iWyIrdC5qb2luKCIsICIpKyJdIn0sbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiSW5kZXgiLGRpbWVuc2lvbnM6dGhpcy5fZGltZW5zaW9uc319LG4uZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG4uY3JlYXRlKHQuZGltZW5zaW9ucyl9LG59KSx7aXNDbGFzczohMH0pLGptPSJhdGFuMiIsVW09dGQoam0sWyJ0eXBlZCIsIm1hdHJpeCIsImVxdWFsU2NhbGFyIiwiQmlnTnVtYmVyIiwiRGVuc2VNYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpuLGVxdWFsU2NhbGFyOnIsQmlnTnVtYmVyOmksRGVuc2VNYXRyaXg6byxjb25jYXQ6c309dCxhPVd5KHt0eXBlZDplLGVxdWFsU2NhbGFyOnJ9KSx1PUh5KHt0eXBlZDplfSksYz1ReSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpyfSksbD1reSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpyfSksaD16eSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDpvfSksZj1YeSh7dHlwZWQ6ZSxtYXRyaXg6bixjb25jYXQ6c30pO3JldHVybiBlKGptLHsibnVtYmVyLCBudW1iZXIiOk1hdGguYXRhbjIsIkJpZ051bWJlciwgQmlnTnVtYmVyIjoodCxlKT0+aS5hdGFuMih0LGUpfSxmKHtzY2FsYXI6Im51bWJlciB8IEJpZ051bWJlciIsU1M6YyxEUzp1LFNEOmEsU3M6bCxzUzpofSkpfSkpLHFtPXRkKCJhZGQiLFsidHlwZWQiLCJtYXRyaXgiLCJhZGRTY2FsYXIiLCJlcXVhbFNjYWxhciIsIkRlbnNlTWF0cml4IiwiU3BhcnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixhZGRTY2FsYXI6cixlcXVhbFNjYWxhcjppLERlbnNlTWF0cml4Om8sU3BhcnNlTWF0cml4OnMsY29uY2F0OmF9PXQsdT1VeSh7dHlwZWQ6ZX0pLGM9cXkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6aX0pLGw9Vnkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6b30pLGg9WHkoe3R5cGVkOmUsbWF0cml4Om4sY29uY2F0OmF9KTtyZXR1cm4gZSgiYWRkIix7ImFueSwgYW55IjpyLCJhbnksIGFueSwgLi4uYW55IjplLnJlZmVyVG9TZWxmKCh0PT4oZSxuLHIpPT57Zm9yKHZhciBpPXQoZSxuKSxvPTA7bzxyLmxlbmd0aDtvKyspaT10KGkscltvXSk7cmV0dXJuIGl9KSl9LGgoe2Vsb3A6cixEUzp1LFNTOmMsU3M6bH0pKX0pKSxWbT10ZCgiZG90IixbInR5cGVkIiwiYWRkU2NhbGFyIiwibXVsdGlwbHlTY2FsYXIiLCJjb25qIiwic2l6ZSJdLCh0PT57dmFye3R5cGVkOmUsYWRkU2NhbGFyOm4sbXVsdGlwbHlTY2FsYXI6cixjb25qOmksc2l6ZTpvfT10O3JldHVybiBlKCJkb3QiLHsiQXJyYXkgfCBEZW5zZU1hdHJpeCwgQXJyYXkgfCBEZW5zZU1hdHJpeCI6ZnVuY3Rpb24odCxvKXt2YXIgdT1zKHQsbyksYz1rZih0KT90Ll9kYXRhOnQsbD1rZih0KT90Ll9kYXRhdHlwZTp2b2lkIDAsaD1rZihvKT9vLl9kYXRhOm8sZj1rZihvKT9vLl9kYXRhdHlwZTp2b2lkIDAscD0yPT09YSh0KS5sZW5ndGgsZD0yPT09YShvKS5sZW5ndGgsZz1uLHk9cjtpZihsJiZmJiZsPT09ZiYmInN0cmluZyI9PXR5cGVvZiBsKXt2YXIgbT1sO2c9ZS5maW5kKG4sW20sbV0pLHk9ZS5maW5kKHIsW20sbV0pfWlmKCFwJiYhZCl7Zm9yKHZhciB2PXkoaShjWzBdKSxoWzBdKSxfPTE7Xzx1O18rKyl2PWcodix5KGkoY1tfXSksaFtfXSkpO3JldHVybiB2fWlmKCFwJiZkKXtmb3IodmFyIHg9eShpKGNbMF0pLGhbMF1bMF0pLHc9MTt3PHU7dysrKXg9Zyh4LHkoaShjW3ddKSxoW3ddWzBdKSk7cmV0dXJuIHh9aWYocCYmIWQpe2Zvcih2YXIgYj15KGkoY1swXVswXSksaFswXSksRD0xO0Q8dTtEKyspYj1nKGIseShpKGNbRF1bMF0pLGhbRF0pKTtyZXR1cm4gYn1pZihwJiZkKXtmb3IodmFyIEU9eShpKGNbMF1bMF0pLGhbMF1bMF0pLEM9MTtDPHU7QysrKUU9ZyhFLHkoaShjW0NdWzBdKSxoW0NdWzBdKSk7cmV0dXJuIEV9fSwiU3BhcnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiOmZ1bmN0aW9uKHQsZSl7cyh0LGUpO2Zvcih2YXIgaT10Ll9pbmRleCxvPXQuX3ZhbHVlcyxhPWUuX2luZGV4LHU9ZS5fdmFsdWVzLGM9MCxsPW4saD1yLGY9MCxwPTA7ZjxpLmxlbmd0aCYmcDxhLmxlbmd0aDspe3ZhciBkPWlbZl0sZz1hW3BdO2Q8Zz9mKys6ZD5nP3ArKzpkPT09ZyYmKGM9bChjLGgob1tmXSx1W3BdKSksZisrLHArKyl9cmV0dXJuIGN9fSk7ZnVuY3Rpb24gcyh0LGUpe3ZhciBuLHIsaT1hKHQpLG89YShlKTtpZigxPT09aS5sZW5ndGgpbj1pWzBdO2Vsc2V7aWYoMiE9PWkubGVuZ3RofHwxIT09aVsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRXhwZWN0ZWQgYSBjb2x1bW4gdmVjdG9yLCBpbnN0ZWFkIGdvdCBhIG1hdHJpeCBvZiBzaXplICgiK2kuam9pbigiLCAiKSsiKSIpO249aVswXX1pZigxPT09by5sZW5ndGgpcj1vWzBdO2Vsc2V7aWYoMiE9PW8ubGVuZ3RofHwxIT09b1sxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRXhwZWN0ZWQgYSBjb2x1bW4gdmVjdG9yLCBpbnN0ZWFkIGdvdCBhIG1hdHJpeCBvZiBzaXplICgiK28uam9pbigiLCAiKSsiKSIpO3I9b1swXX1pZihuIT09cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVmVjdG9ycyBtdXN0IGhhdmUgZXF1YWwgbGVuZ3RoICgiK24rIiAhPSAiK3IrIikiKTtpZigwPT09bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ2Fubm90IGNhbGN1bGF0ZSB0aGUgZG90IHByb2R1Y3Qgb2YgZW1wdHkgdmVjdG9ycyIpO3JldHVybiBufWZ1bmN0aW9uIGEodCl7cmV0dXJuIGtmKHQpP3Quc2l6ZSgpOm8odCl9fSkpLEdtPSJpbmRleCIsWW09dGQoR20sWyJ0eXBlZCIsIkluZGV4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxJbmRleDpufT10O3JldHVybiBlKEdtLHsiLi4ubnVtYmVyIHwgc3RyaW5nIHwgQmlnTnVtYmVyIHwgUmFuZ2UgfCBBcnJheSB8IE1hdHJpeCI6ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBGZih0KT90LnRvTnVtYmVyKCk6QXJyYXkuaXNBcnJheSh0KXx8a2YodCk/dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBGZih0KT90LnRvTnVtYmVyKCk6dH0pKTp0fSkpLHI9bmV3IG47cmV0dXJuIG4uYXBwbHkocixlKSxyfX0pfSkpLFhtPUtnKHtjb25maWc6eHB9KSxXbT1veSh7fSksSG09eXkoe30pLFptPW15KHt9KSxLbT1feSh7TWF0cml4OlptfSksSm09aGQoe0JpZ051bWJlcjpYbSxDb21wbGV4OldtLERlbnNlTWF0cml4OkttLEZyYWN0aW9uOkhtfSksUW09Qnkoe3R5cGVkOkptfSksJG09VHkoe0JpZ051bWJlcjpYbSx0eXBlZDpKbX0pLHR2PWVtKHt0eXBlZDpKbX0pLGV2PUl5KHtjb25maWc6eHAsdHlwZWQ6Sm19KSxudj1ieSh7dHlwZWQ6Sm19KSxydj1aeSh7dHlwZWQ6Sm19KSxpdj1GeSh7dHlwZWQ6Sm19KSxvdj1NeSh7TWF0cml4OlptLGVxdWFsU2NhbGFyOmV2LHR5cGVkOkptfSksc3Y9T3koe0ZyYWN0aW9uOkhtLHR5cGVkOkptfSksYXY9UHkoe0RlbnNlTWF0cml4OkttLE1hdHJpeDpabSxTcGFyc2VNYXRyaXg6b3YsdHlwZWQ6Sm19KSx1dj13bSh7YmlnbnVtYmVyOiRtLGZyYWN0aW9uOnN2LG51bWJlcjppdn0pLGN2PWZtKHttYXRyaXg6YXYsY29uZmlnOnhwLHR5cGVkOkptfSksbHY9ZG0oe21hdHJpeDphdix0eXBlZDpKbX0pLGh2PXhtKHttYXRyaXg6YXYsdHlwZWQ6Sm19KSxmdj1ybSh7aXNJbnRlZ2VyOm52LG1hdHJpeDphdix0eXBlZDpKbX0pLHB2PUNtKHtEZW5zZU1hdHJpeDpLbSxjb25jYXQ6ZnYsZGl2aWRlU2NhbGFyOkRtKHtudW1lcmljOnV2LHR5cGVkOkptfSksZXF1YWxTY2FsYXI6ZXYsbWF0cml4OmF2LHR5cGVkOkptfSksZHY9Um0oe0RlbnNlTWF0cml4OkttLGNvbmNhdDpmdixjb25maWc6eHAsbWF0cml4OmF2LHR5cGVkOkptfSksZ3Y9b20oe0JpZ051bWJlcjpYbSxjb25maWc6eHAsbWF0cml4OmF2LHR5cGVkOkptfSkseXY9QW0oe0RlbnNlTWF0cml4OkttLGNvbmNhdDpmdixjb25maWc6eHAsbWF0cml4OmF2LHR5cGVkOkptfSksbXY9cW0oe0RlbnNlTWF0cml4OkttLFNwYXJzZU1hdHJpeDpvdixhZGRTY2FsYXI6UW0sY29uY2F0OmZ2LGVxdWFsU2NhbGFyOmV2LG1hdHJpeDphdix0eXBlZDpKbX0pLHZ2PVZtKHthZGRTY2FsYXI6UW0sY29uajp0dixtdWx0aXBseVNjYWxhcjpydixzaXplOmN2LHR5cGVkOkptfSksX3Y9em0oe0ltbXV0YWJsZURlbnNlTWF0cml4OmttKHtEZW5zZU1hdHJpeDpLbSxzbWFsbGVyOnl2fSl9KSx4dj1PbSh7RGVuc2VNYXRyaXg6S20sY29uY2F0OmZ2LGNvbmZpZzp4cCxtYXRyaXg6YXYsdHlwZWQ6Sm19KSx3dj1KeSh7YWRkU2NhbGFyOlFtLGRvdDp2dixlcXVhbFNjYWxhcjpldixtYXRyaXg6YXYsbXVsdGlwbHlTY2FsYXI6cnYsdHlwZWQ6Sm19KSxidj1NbSh7RGVuc2VNYXRyaXg6S20sY29uY2F0OmZ2LGNvbmZpZzp4cCxtYXRyaXg6YXYsdHlwZWQ6Sm19KSxEdj1ZbSh7SW5kZXg6X3YsdHlwZWQ6Sm19KSxFdj1sbSh7YmlnbnVtYmVyOiRtLG1hdHJpeDphdixjb25maWc6eHAsbGFyZ2VyOnh2LGxhcmdlckVxOmR2LHNtYWxsZXI6eXYsc21hbGxlckVxOmJ2LHR5cGVkOkptfSksQ3Y9VW0oe0JpZ051bWJlcjpYbSxEZW5zZU1hdHJpeDpLbSxjb25jYXQ6ZnYsZXF1YWxTY2FsYXI6ZXYsbWF0cml4OmF2LHR5cGVkOkptfSk7ZnVuY3Rpb24gU3YodCxlLG4pe2NvbnN0IHI9YXYoW1tlWzBdWzBdLGVbMF1bMV1dLFtlWzFdWzBdLGVbMV1bMV1dXSksaT1lWzBdWzJdLG89ZVsxXVsyXSxzPW4sYT1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCByPXRbbl0saT1yWzBdKnJbMF0rclsxXSpyWzFdLG89TWF0aC5zcXJ0KGkpO2UucHVzaChvKX1yZXR1cm4gZX0odC50b0FycmF5KCkubWFwKCh0PT50LnNsaWNlKDAsMikpKSksdT1wdihndihhdihhKS5zaXplKCkpLGEpLGM9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXQubGVuZ3RoLHI9W107Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspe2xldCBvPTA7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspbz10W24tci0xXStvKmVbaV07ci5wdXNoKG8pfXJldHVybiByfShzLEN2KHd2KC0xLHQuc3Vic2V0KER2KEV2KDAsYXYodCkuc2l6ZSgpWzBdKSwyKSkpLGEpKTtsZXQgbD1ndigyLHQuc2l6ZSgpWzBdKTtjb25zdCBoPXd2KHQuc3Vic2V0KER2KEV2KDAsdC5zaXplKClbMF0pLDApKSx1KmMpLGY9d3YodC5zdWJzZXQoRHYoRXYoMCx0LnNpemUoKVswXSksMSkpLHUqYykscD1hdihbW2gsMF0sW2YsMF1dKTtsPWx2KHAsRHYoRXYoMCxwLnNpemUoKVswXSksMCkpO2NvbnN0IGQ9YXYoW2ksb10pLGc9d3YocixsKSx5PWQucmVzaGFwZShbMiwxXSk7cmV0dXJuIGh2KG12KGcseSkpLnRvQXJyYXkoKX1mdW5jdGlvbiBBdih0PVtdLGUsbixyKXtjb25zdCBpPWF2KGZ1bmN0aW9uKHQpe2lmKDEhPT10Lmxlbmd0aHx8MyE9PXRbMF0ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW5wdXQgbWF0cml4IG11c3QgYmUgYSAxeDMgb3IgM3gxIG1hdHJpeCIpO3JldHVybltbdFswXVswXV0sW3RbMF1bMV1dLFt0WzBdWzJdXSxbMV1dfSh0KSksbz1hdihlKSxzPXd2KG8saSk7cmV0dXJuIFN2KGh2KHMpLG4scil9dmFyIE52PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxJdj1PYmplY3QuZGVmaW5lUHJvcGVydGllcyxNdj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxGdj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFR2PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksT3Y9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxMdj1NYXRoLnBvdyxQdj0odCxlLG4pPT5lIGluIHQ/TnYodCxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSk6dFtlXT1uO2Z1bmN0aW9uIFJ2KHQpe3JldHVybihuZXcgWWgpLnNldCguLi50KX1mdW5jdGlvbiBCdih0LGUsbil7dHJ5e2NvbnN0IHI9VnQudHJhbnNmZXJNYXRyaXgzNEZyb21LaXR0aTJUaHJlZSh0KSxpPVZ0LnRyYW5zZmVyTWF0cml4MzNGcm9tS2l0dGkyVGhyZWUoZSksbz1WdC50cmFuc2Zlck1hdHJpeDM0RnJvbUtpdHRpMlRocmVlKG4pLHM9UnYociksYT1SdihpKSx1PVJ2KG8pO3JldHVybntjb21wb3NlTWF0cml4NDp1LmNsb25lKCkucHJlbXVsdGlwbHkoYSkucHJlbXVsdGlwbHkocyksUE06cyxSTTphLFRNOnV9fWNhdGNoKHQpe319Y29uc3Qga3Y9KHQsZSk9PmUuc29tZSgoZT0+ZnVuY3Rpb24odCxlLG4pe3JldHVybiEodC5sZW5ndGghPT1lfHx0LnNvbWUoKHQ9PnQubGVuZ3RoIT09bikpKX0odCxlWzBdLGVbMV0pKSksenY9dD0+e3ZhciBlO3JldHVybiEhKChudWxsPT0oZT10LmZpc2hleWVEaXN0b3J0aW9uKT92b2lkIDA6ZS5sZW5ndGgpPjAmJmt2KHQuUCxbWzMsNF0sWzQsNF1dKSYma3YodC5ULFtbMyw0XSxbNCw0XV0pKX0sanY9KHQsZSk9PntpZighMSE9PXp2KGUpKXJldHVybihudWxsPT1lP3ZvaWQgMDplLmNhbWVyYVR5cGUpPT09SnQuT21uaUNhbWVyYT8oKHQsZSk9PntpZighMT09PXp2KGUpKXJldHVybjtjb25zdHtQOm4sZmlzaGV5ZURpc3RvcnRpb246cixUOml9PWUsbz1uZXcgZGgodC54LHQueSx0LnopLHM9UnYoVnQudHJhbnNmZXJNYXRyaXgzNEZyb21LaXR0aTJUaHJlZShpKSksYT1SdihWdC50cmFuc2Zlck1hdHJpeDM0RnJvbUtpdHRpMlRocmVlKG4pKSx1PW8uYXBwbHlNYXRyaXg0KHMpLGM9THYoTHYodS54LDIpK0x2KHUueSwyKSwuNSksbD1NYXRoLmF0YW4odS56L2MpLGg9ci5yZWR1Y2UoKCh0LGUsbik9PnQrZSpMdihsLG4pKSwwKTtyZXR1cm4gdS54PXUueC9jKmgsdS55PXUueS9jKmgsdS56PTEsdS5hcHBseU1hdHJpeDQoYSl9KSh0LGUpOihudWxsPT1lP3ZvaWQgMDplLmNhbWVyYVR5cGUpPT09SnQuS2FubmFsYUJyYW5kdD8oKHQsZSk9Pntjb25zdHtQOm4sVDpyLGZpc2hleWVEaXN0b3J0aW9uOml9PWUsbz1bdC54LHQueSx0LnosMV0scz1yLm1hcCgodD0+dC5yZWR1Y2UoKCh0LGUsbik9PnQrZSpvW25dKSwwKSkpLGE9c1swXSx1PXNbMV0sYz1zWzJdO2lmKCEoYz49LjAxJiZpc0Zpbml0ZShjKSkpcmV0dXJuO2NvbnN0IGw9W1tuWzBdWzBdLG5bMF1bMV1dLFtuWzFdWzBdLG5bMV1bMV1dXSxoPW5bMF1bMl0sZj1uWzFdWzJdLHA9TWF0aC5zcXJ0KGEqYSt1KnUpLGQ9TWF0aC5hdGFuMihwLGMpLGc9ZCtpLnJlZHVjZSgoKHQsZSxuKT0+dCtlKk1hdGgucG93KGQsMipuKzMpKSwwKTtsZXQgeSxtO3JldHVybiAwIT09cD8oeT1hKmcvcCxtPXUqZy9wKTooeT0wLG09MCkse3g6bFswXVswXSp5K2xbMF1bMV0qbStoLHk6bFsxXVswXSp5K2xbMV1bMV0qbStmfX0pKHQsZSk6KG51bGw9PWU/dm9pZCAwOmUuY2FtZXJhVHlwZSk9PT1KdC5PbW5pQ2FtZXJhMTFWPygodCxlKT0+e2lmKCExPT09enYoZSkpcmV0dXJuO2NvbnN0e1A6bixmaXNoZXllRGlzdG9ydGlvbjpyLFQ6aX09ZSxvPUF2KFtbdC54LHQueSx0LnpdXSxpLG4scik7cmV0dXJuIG5ldyBkaChvWzBdWzBdLG9bMF1bMV0sMSl9KSh0LGUpOnZvaWQgMH07ZnVuY3Rpb24gVXYodCxlKXtjb25zdCBuPW5ldyBkaCh0LngsdC55LHQueikuYXBwbHlNYXRyaXg0KGUpO2lmKG4uejwwKXJldHVybjtjb25zdCByPTEvbi56LGk9KG5ldyBZaCkuc2V0KHIsMCwwLDAsMCxyLDAsMCwwLDAsciwwLDAsMCwwLDEpO3JldHVybiBuLmFwcGx5TWF0cml4NChpKX1mdW5jdGlvbiBxdih0LGUsbil7Y29uc3Qgcj1lLngtdC54LGk9ZS55LXQueSxvPW4ueC10Lng7cmV0dXJuIHIqKG4ueS10LnkpLW8qaX1mdW5jdGlvbiBWdih0LGUsbj17Y3JlYXRlUmFuZ2U6ITF9KXt2YXIgcjtpZighZSlyZXR1cm57dHJhbnNmZXJWaWV3RGF0YTpbXSx2aWV3UmFuZ2VQb2ludExpc3Q6W119O2NvbnN0e2NyZWF0ZVJhbmdlOml9PW4sbz1VdC5nZXRBbGxWaWV3RGF0YSh0KSxzPXp2KGUpLHtQOmEsUjp1LFQ6Y309ZTtsZXQgbDtpZighMT09PXMpe2NvbnN0IHQ9YS5tYXAoKHQ9PlsuLi50XSkpO2lmKDMhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgUCBtYXRyaXg6IEV4cGVjdGVkIDMgcm93cywgZ290ICR7dC5sZW5ndGh9YCk7aWYoMSE9PW5ldyBTZXQodC5tYXAoKHQ9PnQubGVuZ3RoKSkpLnNpemUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFAgbWF0cml4OiBJbmNvbnNpc3RlbnQgY29sdW1uIGNvdW50cyBiZXR3ZWVuIHJvd3MiKTtjb25zdCBlPXRbMF0ubGVuZ3RoO2lmKDMhPT1lJiY0IT09ZSl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgUCBtYXRyaXg6IEV4cGVjdGVkIDMgb3IgNCBjb2x1bW5zLCBnb3QgJHtlfWApO2xldCBuPXQ7Mz09PWUmJihuPXQubWFwKCh0PT5bLi4udC5tYXAoTnVtYmVyKSwwXSkpKTtjb25zdCBpPW4se2NvbXBvc2VNYXRyaXg0Om99PW51bGwhPShyPUJ2KGksdSxjKSk/cjp7fTtpZighbylyZXR1cm47bD1vfWNvbnN0IGg9by5tYXAoKG49Pih7dHlwZTpuLnR5cGUscG9pbnRMaXN0Om4ucG9pbnRMaXN0Lm1hcCgoZT0+ZnVuY3Rpb24odCxlLG4pe3ZhciByO2NvbnN0IGk9bmV3IHloKHQueCx0LnksbnVsbCE9KHI9bnVsbD09dD92b2lkIDA6dC56KT9yOjEpLG89KG5ldyBZaCkubWFrZVJvdGF0aW9uWihuKSxzPShuZXcgWWgpLm1ha2VUcmFuc2xhdGlvbihlLngsZS55LGUueiksYT0obmV3IFloKS5tYWtlVHJhbnNsYXRpb24oLWUueCwtZS55LC1lLnopO3JldHVybiBpLmNsb25lKCkuYXBwbHlNYXRyaXg0KGEpLmFwcGx5TWF0cml4NChvKS5hcHBseU1hdHJpeDQocyl9KGUsdC5jZW50ZXIsdC5yb3RhdGlvbikpKS5tYXAoKHQ9PnM/anYodCxlKTpsJiZVdih0LGwpKSkubWFwKCh0PT57aWYodClyZXR1cm57aWQ6amwoKSx4Om51bGw9PXQ/dm9pZCAwOnQueCx5Om51bGw9PXQ/dm9pZCAwOnQueX19KSkuZmlsdGVyKCh0PT52b2lkIDAhPT10KSl9KSkpLmZpbHRlcigodD0+MCE9PXQucG9pbnRMaXN0Lmxlbmd0aCkpO2hbMF0mJmhbMF0ucG9pbnRMaXN0JiYoaFswXS5wb2ludExpc3Q9aFswXS5wb2ludExpc3QubWFwKCh0PT4oKHQsZSk9Pkl2KHQsTXYoZSkpKSgoKHQsZSk9Pntmb3IodmFyIG4gaW4gZXx8KGU9e30pKVR2LmNhbGwoZSxuKSYmUHYodCxuLGVbbl0pO2lmKEZ2KWZvcih2YXIgbiBvZiBGdihlKSlPdi5jYWxsKGUsbikmJlB2KHQsbixlW25dKTtyZXR1cm4gdH0pKHt9LHQpLHtzcGVjaWFsRWRnZTohMH0pKSkpO2xldCBmPVtdO2lmKDY9PT1oLmxlbmd0aCYmITA9PT1pKXtmPWZ1bmN0aW9uKHQpe2NvbnN0IGU9ZnVuY3Rpb24odCl7Y29uc3QgZT10LnNsaWNlKCk7cmV0dXJuIGUuc29ydCgoKHQsZSk9PnQueD09PWUueD9lLnktdC55OnQueC1lLngpKSxlfSh0KSxuPVtdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtmb3IoO24ubGVuZ3RoPj0yJiZxdihuW24ubGVuZ3RoLTJdLG5bbi5sZW5ndGgtMV0sZVt0XSk8PTA7KW4ucG9wKCk7bi5wdXNoKGVbdF0pfWNvbnN0IHI9W107Zm9yKGxldCB0PWUubGVuZ3RoLTE7dD49MDt0LS0pe2Zvcig7ci5sZW5ndGg+PTImJnF2KHJbci5sZW5ndGgtMl0scltyLmxlbmd0aC0xXSxlW3RdKTw9MDspci5wb3AoKTtyLnB1c2goZVt0XSl9cmV0dXJuIG4ucG9wKCksci5wb3AoKSxuLmNvbmNhdChyKX0oWy4uLmhbMF0ucG9pbnRMaXN0LC4uLmhbMV0ucG9pbnRMaXN0XSl9cmV0dXJue3RyYW5zZmVyVmlld0RhdGE6aCx2aWV3UmFuZ2VQb2ludExpc3Q6Zn19dmFyIEd2LFl2OyFmdW5jdGlvbih0KXt0W3QuVXBsb2FkPTBdPSJVcGxvYWQiLHRbdC5VcGxvYWRSZXRyeT0xXT0iVXBsb2FkUmV0cnkiLHRbdC5VcGxvYWRGYWlsPTJdPSJVcGxvYWRGYWlsIix0W3QuQW5ub3RhdGlvbj0zXT0iQW5ub3RhdGlvbiIsdFt0LlRlcm1pbmF0ZWQ9NF09IlRlcm1pbmF0ZWQiLHRbdC5GaW5pc2g9NV09IkZpbmlzaCIsdFt0LlB1Ymxpc2g9Nl09IlB1Ymxpc2gifShHdnx8KEd2PXt9KSksZnVuY3Rpb24odCl7dFt0LlJlYWR5PTFdPSJSZWFkeSIsdFt0LkZpcnN0UG9pbnQ9Ml09IkZpcnN0UG9pbnQiLHRbdC5DdWJvaWQ9M109IkN1Ym9pZCJ9KFl2fHwoWXY9e30pKTt2YXIgWHY9ZnVuY3Rpb24odCxlLG4pe3ZhciByO3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gcj1yfHx6bCh0LGUsbiksbmV3IFdvcmtlcihyLGkpfX0oIkx5b2djbTlzYkhWd0xYQnNkV2RwYmkxM1pXSXRkMjl5YTJWeUxXeHZZV1JsY2lBcUx3cDJZWElnZDI5eWEyVnlYMk52WkdVOVpuVnVZM1JwYjI0b2NDbDdJblZ6WlNCemRISnBZM1FpTzJOdmJuTjBJSFk5V3kweExDMHhMQzB4WFR0c1pYUWdTVDBoTVR0bWRXNWpkR2x2YmlCQ0tHVXBlMk52Ym5OMElIUTlMVGNzYnowekxHNDlieTEwTzNKbGRIVnliaUJsUEhRbUppaGxQWFFwTEdVK2J5WW1LR1U5Ynlrc1RXRjBhQzVtYkc5dmNpZ29aUzEwS1M5dUtqSTFOU2w5Wm5WdVkzUnBiMjRnUlNncGUyeGxkQ0JsTzJOdmJuTjBJSFE5Ym1WM0lFRnljbUY1S0RJMU5pa3VabWxzYkNnaUlpa3ViV0Z3S0NncFBUNXVaWGNnUVhKeVlYa29NeWt1Wm1sc2JDZ2lJaWtwTzJadmNpaHNaWFFnYnowd08yODhNakE3YnlzcktYdG1iM0lvWlQwd08yVThNekk3WlNzcktYUmJaVjFiTUYwOU1USTRLelFxWlN4MFcyVmRXekZkUFRBc2RGdGxYVnN5WFQwd08yWnZjaWgwV3pNeVhWc3dYVDB5TlRVc2RGc3pNbDFiTVYwOU1DeDBXek15WFZzeVhUMHdMR1U5TUR0bFBEWXpPMlVyS3lsMFd6TXpLMlZkV3pCZFBUSTFOU3gwV3pNeksyVmRXekZkUFRRck5DcGxMSFJiTXpNclpWMWJNbDA5TUR0bWIzSW9kRnM1TmwxYk1GMDlNalUwTEhSYk9UWmRXekZkUFRJMU5TeDBXemsyWFZzeVhUMHlMR1U5TUR0bFBEWXlPMlVyS3lsMFd6azNLMlZkV3pCZFBUSTFNQzAwS21Vc2RGczVOeXRsWFZzeFhUMHlOVFVzZEZzNU55dGxYVnN5WFQwMkt6UXFaVHRtYjNJb2RGc3hOVGxkV3pCZFBURXNkRnN4TlRsZFd6RmRQVEkxTlN4MFd6RTFPVjFiTWwwOU1qVTBMR1U5TUR0bFBEWTBPMlVyS3lsMFd6RTJNQ3RsWFZzd1hUMHdMSFJiTVRZd0syVmRXekZkUFRJMU1pMWxLalFzZEZzeE5qQXJaVjFiTWwwOU1qVTFPMlp2Y2lobFBUQTdaVHd6TWp0bEt5c3BkRnN5TWpRclpWMWJNRjA5TUN4MFd6SXlOQ3RsWFZzeFhUMHdMSFJiTWpJMEsyVmRXekpkUFRJMU1pMDBLbVY5Y21WMGRYSnVJSFI5WTI5dWMzUWdVajFGS0NrN1puVnVZM1JwYjI0Z2FDaGxMSFFzYnowd0tYdHNaWFFnYmowd0xHRXNlQ3hwTEd3N2REMWJMaTR1ZEYwc2J6MDlQVEVtSmloMFBXTnlaV0YwWlZOdGIyOTBhRU4xY25abFVHOXBiblJ6S0hRdWNtVmtkV05sS0NoNUxHTXBQVDViTGk0dWVTeGpMbmdzWXk1NVhTeGJYU2tzTGpVc0lUQXNVMFZIVFVWT1ZGOU9WVTFDUlZJcEtTeGJhVjA5ZER0amIyNXpkQ0IxUFhRdWJHVnVaM1JvTzJadmNpaGhQVEU3WVR3OWRUdGhLeXNwYkQxMFcyRWxkVjBzWlM1NFBrMWhkR2d1YldsdUtHa3VlQ3hzTG5ncEppWmxMbmc4UFUxaGRHZ3ViV0Y0S0drdWVDeHNMbmdwSmlabExuazhQVTFoZEdndWJXRjRLR2t1ZVN4c0xua3BKaVpwTG5naFBUMXNMbmdtSmloNFBTaGxMbmd0YVM1NEtTb29iQzU1TFdrdWVTa3ZLR3d1ZUMxcExuZ3BLMmt1ZVN3b2FTNTVQVDA5YkM1NWZIeGxMbms4UFhncEppWnVLeXNwTEdrOWJEdHlaWFIxY200Z2JpVXlJVDB3ZldaMWJtTjBhVzl1SUU4b2UzcE5hVzQ2WlN4NlRXRjRPblFzY0c5c2VXZHZibEJ2YVc1MFRHbHpkRHB2TEdGMGRISnBZblYwWlRwdUxIZzZZU3g1T25nc2VqcHBMR052Ykc5eVRHbHpkRHBzTEhaaGJHbGtPblY5S1h0cFppaG9LSHQ0T21Fc2VUcDRmU3h2S1NZbWFUNDlaU1ltYVR3OWRDbHlaWFIxY200Z2RUMDlQU0V4UDFzeExERXdNeTh5TlRVc01UQXlMekkxTlYwNmJGdHVYVDlzVzI1ZExuSm5ZbUV1YzJ4cFkyVW9NQ3d6S1M1dFlYQW9ZejArWXk4eU5UVXBPbHN4TERBc01GMTlablZ1WTNScGIyNGdiU2hsS1h0amIyNXpkQ0IwUFVJb1pTa3NiejFTVzNSZExGdHVMR0VzZUYwOWJ6dHlaWFIxY201YmJpOHlOVFVzWVM4eU5UVXNlQzh5TlRWZGZYSmxkSFZ5YmlCdmJtMWxjM05oWjJVOVpuVnVZM1JwYjI0b2RDbDdZMjl1YzNSN2NHOXphWFJwYjI0NmJ5eGpiMnh2Y2pwdUxHTjFZbTlwWkV4cGMzUTZZU3hqYjJ4dmNreHBjM1E2ZUN4b2FXZG9iR2xuYUhSSmJtUmxlRHBwZlQxMExtUmhkR0U3YkdWMGUyMXZaR2xtYVdWa1FtOTRTV1J6T213OVcxMHNjbVZ6WlhSQmNtVmhjenAxUFZ0ZGZUMTBMbVJoZEdFc2VUMHdPMloxYm1OMGFXOXVJR01vS1h0NUt6MHhmV2xtS0NGdktYSmxkSFZ5Ymp0amIyNXpkQ0JmUFNFaEtHazlQVzUxYkd3L2RtOXBaQ0F3T21rdWJHVnVaM1JvS1Rzb1gzeDhTU2ttSmloc1BWdGRMSFU5VzEwcE8yTnZibk4wSUhjOWJDNXNaVzVuZEdnL1lTNW1hV3gwWlhJb2NqMCtiQzVwYm1Oc2RXUmxjeWh5TG1sa0tTazZZVHRtYjNJb2JHVjBJSEk5TUR0eVBHOHViR1Z1WjNSb08zSXJQVE1wZTJOdmJuTjBJRU05YjF0eVhTeE1QVzliY2lzeFhTeGtQVzliY2lzeVhUdHNaWFFnWnp0cFppaDFMbXhsYm1kMGFEMDlQVEVtSmlGc0xteGxibWQwYUNsb0tIdDRPa01zZVRwTWZTeDFXekJkS1Q5blBXMG9aQ2s2WnoxMk8yVnNjMlVnYVdZb2RTNXNaVzVuZEdoOGZHd3ViR1Z1WjNSb0tYdHNaWFFnY3owaE1UdDNMbk52YldVb1pqMCtlMk52Ym5OMElFMDlUeWg3Y0c5c2VXZHZibEJ2YVc1MFRHbHpkRHBtTG5CdmJIbG5iMjVRYjJsdWRFeHBjM1FzZWsxcGJqcG1MbnBOYVc0c2VrMWhlRHBtTG5wTllYZ3NlRHBETEhrNlRDeDZPbVFzWVhSMGNtbGlkWFJsT21ZdVlYUjBjbWxpZFhSbExHTnZiRzl5VEdsemREcDRMSFpoYkdsa09tWXVkbUZzYVdSOUtUdHlaWFIxY200Z1RUOG9ZeWdwTEdjOVRTeHpQU0V3TENFd0tUb2hNWDBwTENGekppWjFMbXhsYm1kMGFDWW1LSE05ZFM1emIyMWxLR1k5UG1nb2UzZzZReXg1T2t4OUxHWXBQeWhuUFcwb1pDa3NJVEFwT2lFeEtTa3NJWE1tSmlGZkppWW9TVDluUFcwb1pDazZaejEyS1gxbGJITmxJSGN1YzI5dFpTaHpQVDU3WTI5dWMzUWdaajFQS0h0d2IyeDVaMjl1VUc5cGJuUk1hWE4wT25NdWNHOXNlV2R2YmxCdmFXNTBUR2x6ZEN4NlRXbHVPbk11ZWsxcGJpeDZUV0Y0T25NdWVrMWhlQ3g0T2tNc2VUcE1MSG82WkN4aGRIUnlhV0oxZEdVNmN5NWhkSFJ5YVdKMWRHVXNZMjlzYjNKTWFYTjBPbmdzZG1Gc2FXUTZjeTUyWVd4cFpIMHBPM0psZEhWeWJpQm1QeWhqS0Nrc1p6MW1MQ0V3S1RvaE1YMHBPMk52Ym5OMElFRTljejArZTJOdmJuTjBJR1k5VFdGMGFDNW1iRzl2Y2loekx6TXBPM0psZEhWeWJpQnBKaVpwVzJaZFBUMDlNWDA3YVdZb1p5bHBaaWhuV3pCZFBUMDlkbHN3WFNZbVFTaHlLU2x1VzNKZFBUQXNibHR5S3pGZFBUQXNibHR5S3pKZFBUQTdaV3h6Wlh0amIyNXpkRnR6TEdZc1RWMDlaenR1VzNKZFBYTXNibHR5S3pGZFBXWXNibHR5S3pKZFBVMTlaV3h6WlNCcFppaEJLSElwS1c1YmNsMDlNQ3h1VzNJck1WMDlNQ3h1VzNJck1sMDlNRHRsYkhObGUyTnZibk4wVzNNc1ppeE5YVDF0S0dRcE8yNWJjbDA5Y3l4dVczSXJNVjA5Wml4dVczSXJNbDA5VFgxOVNUMWZMSEJ2YzNSTlpYTnpZV2RsS0h0d2IybHVkSE02Ynl4amIyeHZjanB1TEc1MWJUcDVmU2w5TEhBdWFYTkpibEJ2YkhsbmIyNDlhQ3hQWW1wbFkzUXVaR1ZtYVc1bFVISnZjR1Z5ZEhrb2NDd2lYMTlsYzAxdlpIVnNaU0lzZTNaaGJIVmxPaUV3ZlNrc2NIMG9lMzBwT3dvSyIsbnVsbCwhMSk7T2JqZWN0LmRlZmluZVByb3BlcnR5O25ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuc2VnbWVudFN0YXR1cz1LdC5SZWFkeX1zdGF0dXNUb2dnbGUoKXtzd2l0Y2godGhpcy5zZWdtZW50U3RhdHVzKXtjYXNlIEt0LlJlYWR5OnRoaXMuc2VnbWVudFN0YXR1cz1LdC5DaGVjazticmVhaztjYXNlIEt0LkNoZWNrOnRoaXMuc2VnbWVudFN0YXR1cz1LdC5FZGl0O2JyZWFrO2Nhc2UgS3QuRWRpdDp0aGlzLnNlZ21lbnRTdGF0dXM9S3QuUmVhZHl9fXVwZGF0ZVN0YXR1czJFZGl0KCl7dGhpcy5zZWdtZW50U3RhdHVzPUt0LkVkaXR9dXBkYXRlU3RhdHVzMkNoZWNrKCl7dGhpcy5zZWdtZW50U3RhdHVzPUt0LkNoZWNrfXVwZGF0ZVN0YXR1czJSZWFkeSgpe3RoaXMuc2VnbWVudFN0YXR1cz1LdC5SZWFkeX1nZXQgaXNSZWFkeVN0YXR1cygpe3JldHVybiB0aGlzLnNlZ21lbnRTdGF0dXM9PT1LdC5SZWFkeX1nZXQgaXNDaGVja1N0YXR1cygpe3JldHVybiB0aGlzLnNlZ21lbnRTdGF0dXM9PT1LdC5DaGVja31nZXQgaXNFZGl0U3RhdHVzKCl7cmV0dXJuIHRoaXMuc2VnbWVudFN0YXR1cz09PUt0LkVkaXR9fSxuZXcgWHYoe3R5cGU6Im1vZHVsZSJ9KTt2YXIgV3Y9ZWUoKGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKCl7dmFyIG4scj0iRXhwZWN0ZWQgYSBmdW5jdGlvbiIsaT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIsbz0iX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyIscz0xNixhPTMyLHU9NjQsYz0xMjgsbD0yNTYsaD0xLzAsZj05MDA3MTk5MjU0NzQwOTkxLHA9TmFOLGQ9NDI5NDk2NzI5NSxnPWQtMSx5PWQ+Pj4xLG09W1siYXJ5IixjXSxbImJpbmQiLDFdLFsiYmluZEtleSIsMl0sWyJjdXJyeSIsOF0sWyJjdXJyeVJpZ2h0IixzXSxbImZsaXAiLDUxMl0sWyJwYXJ0aWFsIixhXSxbInBhcnRpYWxSaWdodCIsdV0sWyJyZWFyZyIsbF1dLHY9IltvYmplY3QgQXJndW1lbnRzXSIsXz0iW29iamVjdCBBcnJheV0iLHg9IltvYmplY3QgQm9vbGVhbl0iLHc9IltvYmplY3QgRGF0ZV0iLGI9IltvYmplY3QgRXJyb3JdIixEPSJbb2JqZWN0IEZ1bmN0aW9uXSIsRT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLEM9IltvYmplY3QgTWFwXSIsUz0iW29iamVjdCBOdW1iZXJdIixBPSJbb2JqZWN0IE9iamVjdF0iLE49IltvYmplY3QgUHJvbWlzZV0iLEk9IltvYmplY3QgUmVnRXhwXSIsTT0iW29iamVjdCBTZXRdIixGPSJbb2JqZWN0IFN0cmluZ10iLFQ9IltvYmplY3QgU3ltYm9sXSIsTz0iW29iamVjdCBXZWFrTWFwXSIsTD0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLFA9IltvYmplY3QgRGF0YVZpZXddIixSPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLEI9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsaz0iW29iamVjdCBJbnQ4QXJyYXldIix6PSJbb2JqZWN0IEludDE2QXJyYXldIixqPSJbb2JqZWN0IEludDMyQXJyYXldIixVPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixxPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsVj0iW29iamVjdCBVaW50MTZBcnJheV0iLEc9IltvYmplY3QgVWludDMyQXJyYXldIixZPS9cYl9fcCBcKz0gJyc7L2csWD0vXGIoX19wIFwrPSkgJycgXCsvZyxXPS8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2csSD0vJig/OmFtcHxsdHxndHxxdW90fCMzOSk7L2csWj0vWyY8PiInXS9nLEs9UmVnRXhwKEguc291cmNlKSxKPVJlZ0V4cChaLnNvdXJjZSksUT0vPCUtKFtcc1xTXSs/KSU+L2csJD0vPCUoW1xzXFNdKz8pJT4vZyx0dD0vPCU9KFtcc1xTXSs/KSU+L2csZXQ9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sbnQ9L15cdyokLyxydD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxpdD0vW1xcXiQuKis/KClbXF17fXxdL2csb3Q9UmVnRXhwKGl0LnNvdXJjZSksc3Q9L15ccysvLGF0PS9ccy8sdXQ9L1x7KD86XG5cL1wqIFxbd3JhcHBlZCB3aXRoIC4rXF0gXCpcLyk/XG4/LyxjdD0vXHtcblwvXCogXFt3cmFwcGVkIHdpdGggKC4rKVxdIFwqLyxsdD0vLD8gJiAvLGh0PS9bXlx4MDAtXHgyZlx4M2EtXHg0MFx4NWItXHg2MFx4N2ItXHg3Zl0rL2csZnQ9L1soKT0se31cW1xdXC9cc10vLHB0PS9cXChcXCk/L2csZHQ9L1wkXHsoW15cXH1dKig/OlxcLlteXFx9XSopKilcfS9nLGd0PS9cdyokLyx5dD0vXlstK10weFswLTlhLWZdKyQvaSxtdD0vXjBiWzAxXSskL2ksdnQ9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sX3Q9L14wb1swLTddKyQvaSx4dD0vXig/OjB8WzEtOV1cZCopJC8sd3Q9L1tceGMwLVx4ZDZceGQ4LVx4ZjZceGY4LVx4ZmZcdTAxMDAtXHUwMTdmXS9nLGJ0PS8oJF4pLyxEdD0vWydcblxyXHUyMDI4XHUyMDI5XFxdL2csRXQ9IlxcdWQ4MDAtXFx1ZGZmZiIsQ3Q9IlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZiIsU3Q9IlxcdTI3MDAtXFx1MjdiZiIsQXQ9ImEtelxceGRmLVxceGY2XFx4ZjgtXFx4ZmYiLE50PSJBLVpcXHhjMC1cXHhkNlxceGQ4LVxceGRlIixJdD0iXFx1ZmUwZVxcdWZlMGYiLE10PSJcXHhhY1xceGIxXFx4ZDdcXHhmN1xceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmXFx1MjAwMC1cXHUyMDZmIFxcdFxceDBiXFxmXFx4YTBcXHVmZWZmXFxuXFxyXFx1MjAyOFxcdTIwMjlcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwIixGdD0iWyfigJldIixUdD0iWyIrRXQrIl0iLE90PSJbIitNdCsiXSIsTHQ9IlsiK0N0KyJdIixQdD0iXFxkKyIsUnQ9IlsiK1N0KyJdIixCdD0iWyIrQXQrIl0iLGt0PSJbXiIrRXQrTXQrUHQrU3QrQXQrTnQrIl0iLHp0PSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLGp0PSJbXiIrRXQrIl0iLFV0PSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9IixxdD0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsVnQ9IlsiK050KyJdIixHdD0iXFx1MjAwZCIsWXQ9Iig/OiIrQnQrInwiK2t0KyIpIixYdD0iKD86IitWdCsifCIra3QrIikiLFd0PSIoPzpbJ+KAmV0oPzpkfGxsfG18cmV8c3x0fHZlKSk/IixIdD0iKD86WyfigJldKD86RHxMTHxNfFJFfFN8VHxWRSkpPyIsWnQ9Iig/OiIrTHQrInwiK3p0KyIpIisiPyIsS3Q9IlsiK0l0KyJdPyIsSnQ9S3QrWnQrKCIoPzoiK0d0KyIoPzoiK1tqdCxVdCxxdF0uam9pbigifCIpKyIpIitLdCtadCsiKSoiKSxRdD0iKD86IitbUnQsVXQscXRdLmpvaW4oInwiKSsiKSIrSnQsJHQ9Iig/OiIrW2p0K0x0KyI/IixMdCxVdCxxdCxUdF0uam9pbigifCIpKyIpIixlZT1SZWdFeHAoRnQsImciKSxuZT1SZWdFeHAoTHQsImciKSxyZT1SZWdFeHAoenQrIig/PSIrenQrIil8IiskdCtKdCwiZyIpLGllPVJlZ0V4cChbVnQrIj8iK0J0KyIrIitXdCsiKD89IitbT3QsVnQsIiQiXS5qb2luKCJ8IikrIikiLFh0KyIrIitIdCsiKD89IitbT3QsVnQrWXQsIiQiXS5qb2luKCJ8IikrIikiLFZ0KyI/IitZdCsiKyIrV3QsVnQrIisiK0h0LCJcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxkVEgpKD89XFxifFthLXpfXSkiLCJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD89XFxifFtBLVpfXSkiLFB0LFF0XS5qb2luKCJ8IiksImciKSxvZT1SZWdFeHAoIlsiK0d0K0V0K0N0K0l0KyJdIiksc2U9L1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS8sYWU9WyJBcnJheSIsIkJ1ZmZlciIsIkRhdGFWaWV3IiwiRGF0ZSIsIkVycm9yIiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiRnVuY3Rpb24iLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIk1hcCIsIk1hdGgiLCJPYmplY3QiLCJQcm9taXNlIiwiUmVnRXhwIiwiU2V0IiwiU3RyaW5nIiwiU3ltYm9sIiwiVHlwZUVycm9yIiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIldlYWtNYXAiLCJfIiwiY2xlYXJUaW1lb3V0IiwiaXNGaW5pdGUiLCJwYXJzZUludCIsInNldFRpbWVvdXQiXSx1ZT0tMSxjZT17fTtjZVtSXT1jZVtCXT1jZVtrXT1jZVt6XT1jZVtqXT1jZVtVXT1jZVtxXT1jZVtWXT1jZVtHXT0hMCxjZVt2XT1jZVtfXT1jZVtMXT1jZVt4XT1jZVtQXT1jZVt3XT1jZVtiXT1jZVtEXT1jZVtDXT1jZVtTXT1jZVtBXT1jZVtJXT1jZVtNXT1jZVtGXT1jZVtPXT0hMTt2YXIgbGU9e307bGVbdl09bGVbX109bGVbTF09bGVbUF09bGVbeF09bGVbd109bGVbUl09bGVbQl09bGVba109bGVbel09bGVbal09bGVbQ109bGVbU109bGVbQV09bGVbSV09bGVbTV09bGVbRl09bGVbVF09bGVbVV09bGVbcV09bGVbVl09bGVbR109ITAsbGVbYl09bGVbRF09bGVbT109ITE7dmFyIGhlPXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9LGZlPXBhcnNlRmxvYXQscGU9cGFyc2VJbnQsZGU9Im9iamVjdCI9PXR5cGVvZiB0ZSYmdGUmJnRlLk9iamVjdD09PU9iamVjdCYmdGUsZ2U9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZix5ZT1kZXx8Z2V8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksbWU9ZSYmIWUubm9kZVR5cGUmJmUsdmU9bWUmJnQmJiF0Lm5vZGVUeXBlJiZ0LF9lPXZlJiZ2ZS5leHBvcnRzPT09bWUseGU9X2UmJmRlLnByb2Nlc3Msd2U9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHZlJiZ2ZS5yZXF1aXJlJiZ2ZS5yZXF1aXJlKCJ1dGlsIikudHlwZXN8fHhlJiZ4ZS5iaW5kaW5nJiZ4ZS5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKSxiZT13ZSYmd2UuaXNBcnJheUJ1ZmZlcixEZT13ZSYmd2UuaXNEYXRlLEVlPXdlJiZ3ZS5pc01hcCxDZT13ZSYmd2UuaXNSZWdFeHAsU2U9d2UmJndlLmlzU2V0LEFlPXdlJiZ3ZS5pc1R5cGVkQXJyYXk7ZnVuY3Rpb24gTmUodCxlLG4pe3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOnJldHVybiB0LmNhbGwoZSk7Y2FzZSAxOnJldHVybiB0LmNhbGwoZSxuWzBdKTtjYXNlIDI6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSk7Y2FzZSAzOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0sblsyXSl9cmV0dXJuIHQuYXBwbHkoZSxuKX1mdW5jdGlvbiBJZSh0LGUsbixyKXtmb3IodmFyIGk9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7KytpPG87KXt2YXIgcz10W2ldO2UocixzLG4ocyksdCl9cmV0dXJuIHJ9ZnVuY3Rpb24gTWUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHImJiExIT09ZSh0W25dLG4sdCk7KTtyZXR1cm4gdH1mdW5jdGlvbiBGZSh0LGUpe2Zvcih2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7bi0tJiYhMSE9PWUodFtuXSxuLHQpOyk7cmV0dXJuIHR9ZnVuY3Rpb24gVGUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHI7KWlmKCFlKHRbbl0sbix0KSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBPZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBzPXRbbl07ZShzLG4sdCkmJihvW2krK109cyl9cmV0dXJuIG99ZnVuY3Rpb24gTGUodCxlKXtyZXR1cm4hIShudWxsPT10PzA6dC5sZW5ndGgpJiZHZSh0LGUsMCk+LTF9ZnVuY3Rpb24gUGUodCxlLG4pe2Zvcih2YXIgcj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8aTspaWYobihlLHRbcl0pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIFJlKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoLGk9QXJyYXkocik7KytuPHI7KWlbbl09ZSh0W25dLG4sdCk7cmV0dXJuIGl9ZnVuY3Rpb24gQmUodCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBrZSh0LGUsbixyKXt2YXIgaT0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IociYmbyYmKG49dFsrK2ldKTsrK2k8bzspbj1lKG4sdFtpXSxpLHQpO3JldHVybiBufWZ1bmN0aW9uIHplKHQsZSxuLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IociYmaSYmKG49dFstLWldKTtpLS07KW49ZShuLHRbaV0saSx0KTtyZXR1cm4gbn1mdW5jdGlvbiBqZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248cjspaWYoZSh0W25dLG4sdCkpcmV0dXJuITA7cmV0dXJuITF9dmFyIFVlPUhlKCJsZW5ndGgiKTtmdW5jdGlvbiBxZSh0LGUsbil7dmFyIHI7cmV0dXJuIG4odCwoZnVuY3Rpb24odCxuLGkpe2lmKGUodCxuLGkpKXJldHVybiByPW4sITF9KSkscn1mdW5jdGlvbiBWZSh0LGUsbixyKXtmb3IodmFyIGk9dC5sZW5ndGgsbz1uKyhyPzE6LTEpO3I/by0tOisrbzxpOylpZihlKHRbb10sbyx0KSlyZXR1cm4gbztyZXR1cm4tMX1mdW5jdGlvbiBHZSh0LGUsbil7cmV0dXJuIGU9PWU/ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uLTEsaT10Lmxlbmd0aDsrK3I8aTspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9KHQsZSxuKTpWZSh0LFhlLG4pfWZ1bmN0aW9uIFllKHQsZSxuLHIpe2Zvcih2YXIgaT1uLTEsbz10Lmxlbmd0aDsrK2k8bzspaWYocih0W2ldLGUpKXJldHVybiBpO3JldHVybi0xfWZ1bmN0aW9uIFhlKHQpe3JldHVybiB0IT10fWZ1bmN0aW9uIFdlKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBuP0plKHQsZSkvbjpwfWZ1bmN0aW9uIEhlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9uOmVbdF19fWZ1bmN0aW9uIFplKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09dD9uOnRbZV19fWZ1bmN0aW9uIEtlKHQsZSxuLHIsaSl7cmV0dXJuIGkodCwoZnVuY3Rpb24odCxpLG8pe249cj8ocj0hMSx0KTplKG4sdCxpLG8pfSkpLG59ZnVuY3Rpb24gSmUodCxlKXtmb3IodmFyIHIsaT0tMSxvPXQubGVuZ3RoOysraTxvOyl7dmFyIHM9ZSh0W2ldKTtzIT09biYmKHI9cj09PW4/czpyK3MpfXJldHVybiByfWZ1bmN0aW9uIFFlKHQsZSl7Zm9yKHZhciBuPS0xLHI9QXJyYXkodCk7KytuPHQ7KXJbbl09ZShuKTtyZXR1cm4gcn1mdW5jdGlvbiAkZSh0KXtyZXR1cm4gdCYmdC5zbGljZSgwLHluKHQpKzEpLnJlcGxhY2Uoc3QsIiIpfWZ1bmN0aW9uIHRuKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19ZnVuY3Rpb24gZW4odCxlKXtyZXR1cm4gUmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9ZnVuY3Rpb24gbm4odCxlKXtyZXR1cm4gdC5oYXMoZSl9ZnVuY3Rpb24gcm4odCxlKXtmb3IodmFyIG49LTEscj10Lmxlbmd0aDsrK248ciYmR2UoZSx0W25dLDApPi0xOyk7cmV0dXJuIG59ZnVuY3Rpb24gb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tJiZHZShlLHRbbl0sMCk+LTE7KTtyZXR1cm4gbn12YXIgc249WmUoeyLDgCI6IkEiLCLDgSI6IkEiLCLDgiI6IkEiLCLDgyI6IkEiLCLDhCI6IkEiLCLDhSI6IkEiLCLDoCI6ImEiLCLDoSI6ImEiLCLDoiI6ImEiLCLDoyI6ImEiLCLDpCI6ImEiLCLDpSI6ImEiLCLDhyI6IkMiLCLDpyI6ImMiLCLDkCI6IkQiLCLDsCI6ImQiLCLDiCI6IkUiLCLDiSI6IkUiLCLDiiI6IkUiLCLDiyI6IkUiLCLDqCI6ImUiLCLDqSI6ImUiLCLDqiI6ImUiLCLDqyI6ImUiLCLDjCI6IkkiLCLDjSI6IkkiLCLDjiI6IkkiLCLDjyI6IkkiLCLDrCI6ImkiLCLDrSI6ImkiLCLDriI6ImkiLCLDryI6ImkiLCLDkSI6Ik4iLCLDsSI6Im4iLCLDkiI6Ik8iLCLDkyI6Ik8iLCLDlCI6Ik8iLCLDlSI6Ik8iLCLDliI6Ik8iLCLDmCI6Ik8iLCLDsiI6Im8iLCLDsyI6Im8iLCLDtCI6Im8iLCLDtSI6Im8iLCLDtiI6Im8iLCLDuCI6Im8iLCLDmSI6IlUiLCLDmiI6IlUiLCLDmyI6IlUiLCLDnCI6IlUiLCLDuSI6InUiLCLDuiI6InUiLCLDuyI6InUiLCLDvCI6InUiLCLDnSI6IlkiLCLDvSI6InkiLCLDvyI6InkiLCLDhiI6IkFlIiwiw6YiOiJhZSIsIsOeIjoiVGgiLCLDviI6InRoIiwiw58iOiJzcyIsIsSAIjoiQSIsIsSCIjoiQSIsIsSEIjoiQSIsIsSBIjoiYSIsIsSDIjoiYSIsIsSFIjoiYSIsIsSGIjoiQyIsIsSIIjoiQyIsIsSKIjoiQyIsIsSMIjoiQyIsIsSHIjoiYyIsIsSJIjoiYyIsIsSLIjoiYyIsIsSNIjoiYyIsIsSOIjoiRCIsIsSQIjoiRCIsIsSPIjoiZCIsIsSRIjoiZCIsIsSSIjoiRSIsIsSUIjoiRSIsIsSWIjoiRSIsIsSYIjoiRSIsIsSaIjoiRSIsIsSTIjoiZSIsIsSVIjoiZSIsIsSXIjoiZSIsIsSZIjoiZSIsIsSbIjoiZSIsIsScIjoiRyIsIsSeIjoiRyIsIsSgIjoiRyIsIsSiIjoiRyIsIsSdIjoiZyIsIsSfIjoiZyIsIsShIjoiZyIsIsSjIjoiZyIsIsSkIjoiSCIsIsSmIjoiSCIsIsSlIjoiaCIsIsSnIjoiaCIsIsSoIjoiSSIsIsSqIjoiSSIsIsSsIjoiSSIsIsSuIjoiSSIsIsSwIjoiSSIsIsSpIjoiaSIsIsSrIjoiaSIsIsStIjoiaSIsIsSvIjoiaSIsIsSxIjoiaSIsIsS0IjoiSiIsIsS1IjoiaiIsIsS2IjoiSyIsIsS3IjoiayIsIsS4IjoiayIsIsS5IjoiTCIsIsS7IjoiTCIsIsS9IjoiTCIsIsS/IjoiTCIsIsWBIjoiTCIsIsS6IjoibCIsIsS8IjoibCIsIsS+IjoibCIsIsWAIjoibCIsIsWCIjoibCIsIsWDIjoiTiIsIsWFIjoiTiIsIsWHIjoiTiIsIsWKIjoiTiIsIsWEIjoibiIsIsWGIjoibiIsIsWIIjoibiIsIsWLIjoibiIsIsWMIjoiTyIsIsWOIjoiTyIsIsWQIjoiTyIsIsWNIjoibyIsIsWPIjoibyIsIsWRIjoibyIsIsWUIjoiUiIsIsWWIjoiUiIsIsWYIjoiUiIsIsWVIjoiciIsIsWXIjoiciIsIsWZIjoiciIsIsWaIjoiUyIsIsWcIjoiUyIsIsWeIjoiUyIsIsWgIjoiUyIsIsWbIjoicyIsIsWdIjoicyIsIsWfIjoicyIsIsWhIjoicyIsIsWiIjoiVCIsIsWkIjoiVCIsIsWmIjoiVCIsIsWjIjoidCIsIsWlIjoidCIsIsWnIjoidCIsIsWoIjoiVSIsIsWqIjoiVSIsIsWsIjoiVSIsIsWuIjoiVSIsIsWwIjoiVSIsIsWyIjoiVSIsIsWpIjoidSIsIsWrIjoidSIsIsWtIjoidSIsIsWvIjoidSIsIsWxIjoidSIsIsWzIjoidSIsIsW0IjoiVyIsIsW1IjoidyIsIsW2IjoiWSIsIsW3IjoieSIsIsW4IjoiWSIsIsW5IjoiWiIsIsW7IjoiWiIsIsW9IjoiWiIsIsW6IjoieiIsIsW8IjoieiIsIsW+IjoieiIsIsSyIjoiSUoiLCLEsyI6ImlqIiwixZIiOiJPZSIsIsWTIjoib2UiLCLFiSI6IiduIiwixb8iOiJzIn0pLGFuPVplKHsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiMzOTsifSk7ZnVuY3Rpb24gdW4odCl7cmV0dXJuIlxcIitoZVt0XX1mdW5jdGlvbiBjbih0KXtyZXR1cm4gb2UudGVzdCh0KX1mdW5jdGlvbiBsbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtuWysrZV09W3IsdF19KSksbn1mdW5jdGlvbiBobih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19ZnVuY3Rpb24gZm4odCxlKXtmb3IodmFyIG49LTEscj10Lmxlbmd0aCxpPTAscz1bXTsrK248cjspe3ZhciBhPXRbbl07KGE9PT1lfHxhPT09bykmJih0W25dPW8sc1tpKytdPW4pfXJldHVybiBzfWZ1bmN0aW9uIHBuKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtuWysrZV09dH0pKSxufWZ1bmN0aW9uIGRuKHQpe3JldHVybiBjbih0KT9mdW5jdGlvbih0KXtmb3IodmFyIGU9cmUubGFzdEluZGV4PTA7cmUudGVzdCh0KTspKytlO3JldHVybiBlfSh0KTpVZSh0KX1mdW5jdGlvbiBnbih0KXtyZXR1cm4gY24odCk/ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2gocmUpfHxbXX0odCk6ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3BsaXQoIiIpfSh0KX1mdW5jdGlvbiB5bih0KXtmb3IodmFyIGU9dC5sZW5ndGg7ZS0tJiZhdC50ZXN0KHQuY2hhckF0KGUpKTspO3JldHVybiBlfXZhciBtbj1aZSh7IiZhbXA7IjoiJiIsIiZsdDsiOiI8IiwiJmd0OyI6Ij4iLCImcXVvdDsiOiciJywiJiMzOTsiOiInIn0pO3ZhciB2bj1mdW5jdGlvbiB0KGUpe3ZhciBhdCxFdD0oZT1udWxsPT1lP3llOnZuLmRlZmF1bHRzKHllLk9iamVjdCgpLGUsdm4ucGljayh5ZSxhZSkpKS5BcnJheSxDdD1lLkRhdGUsU3Q9ZS5FcnJvcixBdD1lLkZ1bmN0aW9uLE50PWUuTWF0aCxJdD1lLk9iamVjdCxNdD1lLlJlZ0V4cCxGdD1lLlN0cmluZyxUdD1lLlR5cGVFcnJvcixPdD1FdC5wcm90b3R5cGUsTHQ9QXQucHJvdG90eXBlLFB0PUl0LnByb3RvdHlwZSxSdD1lWyJfX2NvcmUtanNfc2hhcmVkX18iXSxCdD1MdC50b1N0cmluZyxrdD1QdC5oYXNPd25Qcm9wZXJ0eSx6dD0wLGp0PShhdD0vW14uXSskLy5leGVjKFJ0JiZSdC5rZXlzJiZSdC5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrYXQ6IiIsVXQ9UHQudG9TdHJpbmcscXQ9QnQuY2FsbChJdCksVnQ9eWUuXyxHdD1NdCgiXiIrQnQuY2FsbChrdCkucmVwbGFjZShpdCwiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKSxZdD1fZT9lLkJ1ZmZlcjpuLFh0PWUuU3ltYm9sLFd0PWUuVWludDhBcnJheSxIdD1ZdD9ZdC5hbGxvY1Vuc2FmZTpuLFp0PWhuKEl0LmdldFByb3RvdHlwZU9mLEl0KSxLdD1JdC5jcmVhdGUsSnQ9UHQucHJvcGVydHlJc0VudW1lcmFibGUsUXQ9T3Quc3BsaWNlLCR0PVh0P1h0LmlzQ29uY2F0U3ByZWFkYWJsZTpuLHRlPVh0P1h0Lml0ZXJhdG9yOm4scmU9WHQ/WHQudG9TdHJpbmdUYWc6bixvZT1mdW5jdGlvbigpe3RyeXt2YXIgdD1wbyhJdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaCh0KXt9fSgpLGhlPWUuY2xlYXJUaW1lb3V0IT09eWUuY2xlYXJUaW1lb3V0JiZlLmNsZWFyVGltZW91dCxkZT1DdCYmQ3Qubm93IT09eWUuRGF0ZS5ub3cmJkN0Lm5vdyxnZT1lLnNldFRpbWVvdXQhPT15ZS5zZXRUaW1lb3V0JiZlLnNldFRpbWVvdXQsbWU9TnQuY2VpbCx2ZT1OdC5mbG9vcix4ZT1JdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsd2U9WXQ/WXQuaXNCdWZmZXI6bixVZT1lLmlzRmluaXRlLFplPU90LmpvaW4sX249aG4oSXQua2V5cyxJdCkseG49TnQubWF4LHduPU50Lm1pbixibj1DdC5ub3csRG49ZS5wYXJzZUludCxFbj1OdC5yYW5kb20sQ249T3QucmV2ZXJzZSxTbj1wbyhlLCJEYXRhVmlldyIpLEFuPXBvKGUsIk1hcCIpLE5uPXBvKGUsIlByb21pc2UiKSxJbj1wbyhlLCJTZXQiKSxNbj1wbyhlLCJXZWFrTWFwIiksRm49cG8oSXQsImNyZWF0ZSIpLFRuPU1uJiZuZXcgTW4sT249e30sTG49am8oU24pLFBuPWpvKEFuKSxSbj1qbyhObiksQm49am8oSW4pLGtuPWpvKE1uKSx6bj1YdD9YdC5wcm90b3R5cGU6bixqbj16bj96bi52YWx1ZU9mOm4sVW49em4/em4udG9TdHJpbmc6bjtmdW5jdGlvbiBxbih0KXtpZihyYSh0KSYmIVhzKHQpJiYhKHQgaW5zdGFuY2VvZiBYbikpe2lmKHQgaW5zdGFuY2VvZiBZbilyZXR1cm4gdDtpZihrdC5jYWxsKHQsIl9fd3JhcHBlZF9fIikpcmV0dXJuIFVvKHQpfXJldHVybiBuZXcgWW4odCl9dmFyIFZuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gZnVuY3Rpb24oZSl7aWYoIW5hKGUpKXJldHVybnt9O2lmKEt0KXJldHVybiBLdChlKTt0LnByb3RvdHlwZT1lO3ZhciByPW5ldyB0O3JldHVybiB0LnByb3RvdHlwZT1uLHJ9fSgpO2Z1bmN0aW9uIEduKCl7fWZ1bmN0aW9uIFluKHQsZSl7dGhpcy5fX3dyYXBwZWRfXz10LHRoaXMuX19hY3Rpb25zX189W10sdGhpcy5fX2NoYWluX189ISFlLHRoaXMuX19pbmRleF9fPTAsdGhpcy5fX3ZhbHVlc19fPW59ZnVuY3Rpb24gWG4odCl7dGhpcy5fX3dyYXBwZWRfXz10LHRoaXMuX19hY3Rpb25zX189W10sdGhpcy5fX2Rpcl9fPTEsdGhpcy5fX2ZpbHRlcmVkX189ITEsdGhpcy5fX2l0ZXJhdGVlc19fPVtdLHRoaXMuX190YWtlQ291bnRfXz1kLHRoaXMuX192aWV3c19fPVtdfWZ1bmN0aW9uIFduKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWZ1bmN0aW9uIEhuKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWZ1bmN0aW9uIFpuKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWZ1bmN0aW9uIEtuKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBabjsrK2U8bjspdGhpcy5hZGQodFtlXSl9ZnVuY3Rpb24gSm4odCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgSG4odCk7dGhpcy5zaXplPWUuc2l6ZX1mdW5jdGlvbiBRbih0LGUpe3ZhciBuPVhzKHQpLHI9IW4mJllzKHQpLGk9IW4mJiFyJiZLcyh0KSxvPSFuJiYhciYmIWkmJmhhKHQpLHM9bnx8cnx8aXx8byxhPXM/UWUodC5sZW5ndGgsRnQpOltdLHU9YS5sZW5ndGg7Zm9yKHZhciBjIGluIHQpKGV8fGt0LmNhbGwodCxjKSkmJighc3x8ISgibGVuZ3RoIj09Y3x8aSYmKCJvZmZzZXQiPT1jfHwicGFyZW50Ij09Yyl8fG8mJigiYnVmZmVyIj09Y3x8ImJ5dGVMZW5ndGgiPT1jfHwiYnl0ZU9mZnNldCI9PWMpfHx3byhjLHUpKSkmJmEucHVzaChjKTtyZXR1cm4gYX1mdW5jdGlvbiAkbih0KXt2YXIgZT10Lmxlbmd0aDtyZXR1cm4gZT90W0tyKDAsZS0xKV06bn1mdW5jdGlvbiB0cih0LGUpe3JldHVybiBCbyhGaSh0KSxjcihlLDAsdC5sZW5ndGgpKX1mdW5jdGlvbiBlcih0KXtyZXR1cm4gQm8oRmkodCkpfWZ1bmN0aW9uIG5yKHQsZSxyKXsociE9PW4mJiFxcyh0W2VdLHIpfHxyPT09biYmIShlIGluIHQpKSYmYXIodCxlLHIpfWZ1bmN0aW9uIHJyKHQsZSxyKXt2YXIgaT10W2VdOygha3QuY2FsbCh0LGUpfHwhcXMoaSxyKXx8cj09PW4mJiEoZSBpbiB0KSkmJmFyKHQsZSxyKX1mdW5jdGlvbiBpcih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKHFzKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gb3IodCxlLG4scil7cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQsaSxvKXtlKHIsdCxuKHQpLG8pfSkpLHJ9ZnVuY3Rpb24gc3IodCxlKXtyZXR1cm4gdCYmVGkoZSxPYShlKSx0KX1mdW5jdGlvbiBhcih0LGUsbil7Il9fcHJvdG9fXyI9PWUmJm9lP29lKHQsZSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH0pOnRbZV09bn1mdW5jdGlvbiB1cih0LGUpe2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89RXQoaSkscz1udWxsPT10OysrcjxpOylvW3JdPXM/bjpOYSh0LGVbcl0pO3JldHVybiBvfWZ1bmN0aW9uIGNyKHQsZSxyKXtyZXR1cm4gdD09dCYmKHIhPT1uJiYodD10PD1yP3Q6ciksZSE9PW4mJih0PXQ+PWU/dDplKSksdH1mdW5jdGlvbiBscih0LGUscixpLG8scyl7dmFyIGEsdT0xJmUsYz0yJmUsbD00JmU7aWYociYmKGE9bz9yKHQsaSxvLHMpOnIodCkpLGEhPT1uKXJldHVybiBhO2lmKCFuYSh0KSlyZXR1cm4gdDt2YXIgaD1Ycyh0KTtpZihoKXtpZihhPWZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJiJzdHJpbmciPT10eXBlb2YgdFswXSYma3QuY2FsbCh0LCJpbmRleCIpJiYobi5pbmRleD10LmluZGV4LG4uaW5wdXQ9dC5pbnB1dCksbn0odCksIXUpcmV0dXJuIEZpKHQsYSl9ZWxzZXt2YXIgZj1tbyh0KSxwPWY9PUR8fGY9PUU7aWYoS3ModCkpcmV0dXJuIENpKHQsdSk7aWYoZj09QXx8Zj09dnx8cCYmIW8pe2lmKGE9Y3x8cD97fTpfbyh0KSwhdSlyZXR1cm4gYz9mdW5jdGlvbih0LGUpe3JldHVybiBUaSh0LHlvKHQpLGUpfSh0LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJlRpKGUsTGEoZSksdCl9KGEsdCkpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFRpKHQsZ28odCksZSl9KHQsc3IoYSx0KSl9ZWxzZXtpZighbGVbZl0pcmV0dXJuIG8/dDp7fTthPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3N3aXRjaChlKXtjYXNlIEw6cmV0dXJuIFNpKHQpO2Nhc2UgeDpjYXNlIHc6cmV0dXJuIG5ldyByKCt0KTtjYXNlIFA6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49ZT9TaSh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKG4sdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9KHQsbik7Y2FzZSBSOmNhc2UgQjpjYXNlIGs6Y2FzZSB6OmNhc2UgajpjYXNlIFU6Y2FzZSBxOmNhc2UgVjpjYXNlIEc6cmV0dXJuIEFpKHQsbik7Y2FzZSBDOnJldHVybiBuZXcgcjtjYXNlIFM6Y2FzZSBGOnJldHVybiBuZXcgcih0KTtjYXNlIEk6cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuc291cmNlLGd0LmV4ZWModCkpO3JldHVybiBlLmxhc3RJbmRleD10Lmxhc3RJbmRleCxlfSh0KTtjYXNlIE06cmV0dXJuIG5ldyByO2Nhc2UgVDpyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGpuP0l0KGpuLmNhbGwodCkpOnt9fSh0KX19KHQsZix1KX19c3x8KHM9bmV3IEpuKTt2YXIgZD1zLmdldCh0KTtpZihkKXJldHVybiBkO3Muc2V0KHQsYSksdWEodCk/dC5mb3JFYWNoKChmdW5jdGlvbihuKXthLmFkZChscihuLGUscixuLHQscykpfSkpOmlhKHQpJiZ0LmZvckVhY2goKGZ1bmN0aW9uKG4saSl7YS5zZXQoaSxscihuLGUscixpLHQscykpfSkpO3ZhciBnPWg/bjoobD9jP3NvOm9vOmM/TGE6T2EpKHQpO3JldHVybiBNZShnfHx0LChmdW5jdGlvbihuLGkpe2cmJihuPXRbaT1uXSkscnIoYSxpLGxyKG4sZSxyLGksdCxzKSl9KSksYX1mdW5jdGlvbiBocih0LGUscil7dmFyIGk9ci5sZW5ndGg7aWYobnVsbD09dClyZXR1cm4haTtmb3IodD1JdCh0KTtpLS07KXt2YXIgbz1yW2ldLHM9ZVtvXSxhPXRbb107aWYoYT09PW4mJiEobyBpbiB0KXx8IXMoYSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gZnIodCxlLGkpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gT28oKGZ1bmN0aW9uKCl7dC5hcHBseShuLGkpfSksZSl9ZnVuY3Rpb24gcHIodCxlLG4scil7dmFyIGk9LTEsbz1MZSxzPSEwLGE9dC5sZW5ndGgsdT1bXSxjPWUubGVuZ3RoO2lmKCFhKXJldHVybiB1O24mJihlPVJlKGUsdG4obikpKSxyPyhvPVBlLHM9ITEpOmUubGVuZ3RoPj0yMDAmJihvPW5uLHM9ITEsZT1uZXcgS24oZSkpO3Q6Zm9yKDsrK2k8YTspe3ZhciBsPXRbaV0saD1udWxsPT1uP2w6bihsKTtpZihsPXJ8fDAhPT1sP2w6MCxzJiZoPT1oKXtmb3IodmFyIGY9YztmLS07KWlmKGVbZl09PT1oKWNvbnRpbnVlIHQ7dS5wdXNoKGwpfWVsc2UgbyhlLGgscil8fHUucHVzaChsKX1yZXR1cm4gdX1xbi50ZW1wbGF0ZVNldHRpbmdzPXtlc2NhcGU6USxldmFsdWF0ZTokLGludGVycG9sYXRlOnR0LHZhcmlhYmxlOiIiLGltcG9ydHM6e186cW59fSxxbi5wcm90b3R5cGU9R24ucHJvdG90eXBlLHFuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1xbixZbi5wcm90b3R5cGU9Vm4oR24ucHJvdG90eXBlKSxZbi5wcm90b3R5cGUuY29uc3RydWN0b3I9WW4sWG4ucHJvdG90eXBlPVZuKEduLnByb3RvdHlwZSksWG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhuLFduLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189Rm4/Rm4obnVsbCk6e30sdGhpcy5zaXplPTB9LFduLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFduLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihGbil7dmFyIHI9ZVt0XTtyZXR1cm4gcj09PWk/bjpyfXJldHVybiBrdC5jYWxsKGUsdCk/ZVt0XTpufSxXbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIEZuP2VbdF0hPT1uOmt0LmNhbGwoZSx0KX0sV24ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09Rm4mJmU9PT1uP2k6ZSx0aGlzfSxIbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfSxIbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1pcihlLHQpO3JldHVybiEobjwwKSYmKG49PWUubGVuZ3RoLTE/ZS5wb3AoKTpRdC5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMCl9LEhuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPWlyKGUsdCk7cmV0dXJuIHI8MD9uOmVbcl1bMV19LEhuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIGlyKHRoaXMuX19kYXRhX18sdCk+LTF9LEhuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fLHI9aXIobix0KTtyZXR1cm4gcjwwPygrK3RoaXMuc2l6ZSxuLnB1c2goW3QsZV0pKTpuW3JdWzFdPWUsdGhpc30sWm4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgV24sbWFwOm5ldyhBbnx8SG4pLHN0cmluZzpuZXcgV259fSxabi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPWhvKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFpuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGhvKHRoaXMsdCkuZ2V0KHQpfSxabi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiBobyh0aGlzLHQpLmhhcyh0KX0sWm4ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPWhvKHRoaXMsdCkscj1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PXI/MDoxLHRoaXN9LEtuLnByb3RvdHlwZS5hZGQ9S24ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsaSksdGhpc30sS24ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9LEpuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IEhuLHRoaXMuc2l6ZT0wfSxKbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxufSxKbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX0sSm4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9LEpuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBIbil7dmFyIHI9bi5fX2RhdGFfXztpZighQW58fHIubGVuZ3RoPDE5OSlyZXR1cm4gci5wdXNoKFt0LGVdKSx0aGlzLnNpemU9KytuLnNpemUsdGhpcztuPXRoaXMuX19kYXRhX189bmV3IFpuKHIpfXJldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZT1uLnNpemUsdGhpc307dmFyIGRyPVBpKGJyKSxncj1QaShEciwhMCk7ZnVuY3Rpb24geXIodCxlKXt2YXIgbj0hMDtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxyLGkpe3JldHVybiBuPSEhZSh0LHIsaSl9KSksbn1mdW5jdGlvbiBtcih0LGUscil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGg7KytpPG87KXt2YXIgcz10W2ldLGE9ZShzKTtpZihudWxsIT1hJiYodT09PW4/YT09YSYmIWxhKGEpOnIoYSx1KSkpdmFyIHU9YSxjPXN9cmV0dXJuIGN9ZnVuY3Rpb24gdnIodCxlKXt2YXIgbj1bXTtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxyLGkpe2UodCxyLGkpJiZuLnB1c2godCl9KSksbn1mdW5jdGlvbiBfcih0LGUsbixyLGkpe3ZhciBvPS0xLHM9dC5sZW5ndGg7Zm9yKG58fChuPXhvKSxpfHwoaT1bXSk7KytvPHM7KXt2YXIgYT10W29dO2U+MCYmbihhKT9lPjE/X3IoYSxlLTEsbixyLGkpOkJlKGksYSk6cnx8KGlbaS5sZW5ndGhdPWEpfXJldHVybiBpfXZhciB4cj1SaSgpLHdyPVJpKCEwKTtmdW5jdGlvbiBicih0LGUpe3JldHVybiB0JiZ4cih0LGUsT2EpfWZ1bmN0aW9uIERyKHQsZSl7cmV0dXJuIHQmJndyKHQsZSxPYSl9ZnVuY3Rpb24gRXIodCxlKXtyZXR1cm4gT2UoZSwoZnVuY3Rpb24oZSl7cmV0dXJuICRzKHRbZV0pfSkpfWZ1bmN0aW9uIENyKHQsZSl7Zm9yKHZhciByPTAsaT0oZT13aShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxpOyl0PXRbem8oZVtyKytdKV07cmV0dXJuIHImJnI9PWk/dDpufWZ1bmN0aW9uIFNyKHQsZSxuKXt2YXIgcj1lKHQpO3JldHVybiBYcyh0KT9yOkJlKHIsbih0KSl9ZnVuY3Rpb24gQXIodCl7cmV0dXJuIG51bGw9PXQ/dD09PW4/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOnJlJiZyZSBpbiBJdCh0KT9mdW5jdGlvbih0KXt2YXIgZT1rdC5jYWxsKHQscmUpLHI9dFtyZV07dHJ5e3RbcmVdPW47dmFyIGk9ITB9Y2F0Y2godCl7fXZhciBvPVV0LmNhbGwodCk7cmV0dXJuIGkmJihlP3RbcmVdPXI6ZGVsZXRlIHRbcmVdKSxvfSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gVXQuY2FsbCh0KX0odCl9ZnVuY3Rpb24gTnIodCxlKXtyZXR1cm4gdD5lfWZ1bmN0aW9uIElyKHQsZSl7cmV0dXJuIG51bGwhPXQmJmt0LmNhbGwodCxlKX1mdW5jdGlvbiBNcih0LGUpe3JldHVybiBudWxsIT10JiZlIGluIEl0KHQpfWZ1bmN0aW9uIEZyKHQsZSxyKXtmb3IodmFyIGk9cj9QZTpMZSxvPXRbMF0ubGVuZ3RoLHM9dC5sZW5ndGgsYT1zLHU9RXQocyksYz0xLzAsbD1bXTthLS07KXt2YXIgaD10W2FdO2EmJmUmJihoPVJlKGgsdG4oZSkpKSxjPXduKGgubGVuZ3RoLGMpLHVbYV09IXImJihlfHxvPj0xMjAmJmgubGVuZ3RoPj0xMjApP25ldyBLbihhJiZoKTpufWg9dFswXTt2YXIgZj0tMSxwPXVbMF07dDpmb3IoOysrZjxvJiZsLmxlbmd0aDxjOyl7dmFyIGQ9aFtmXSxnPWU/ZShkKTpkO2lmKGQ9cnx8MCE9PWQ/ZDowLCEocD9ubihwLGcpOmkobCxnLHIpKSl7Zm9yKGE9czstLWE7KXt2YXIgeT11W2FdO2lmKCEoeT9ubih5LGcpOmkodFthXSxnLHIpKSljb250aW51ZSB0fXAmJnAucHVzaChnKSxsLnB1c2goZCl9fXJldHVybiBsfWZ1bmN0aW9uIFRyKHQsZSxyKXt2YXIgaT1udWxsPT0odD1Nbyh0LGU9d2koZSx0KSkpP3Q6dFt6byhRbyhlKSldO3JldHVybiBudWxsPT1pP246TmUoaSx0LHIpfWZ1bmN0aW9uIE9yKHQpe3JldHVybiByYSh0KSYmQXIodCk9PXZ9ZnVuY3Rpb24gTHIodCxlLHIsaSxvKXtyZXR1cm4gdD09PWV8fChudWxsPT10fHxudWxsPT1lfHwhcmEodCkmJiFyYShlKT90IT10JiZlIT1lOmZ1bmN0aW9uKHQsZSxyLGksbyxzKXt2YXIgYT1Ycyh0KSx1PVhzKGUpLGM9YT9fOm1vKHQpLGw9dT9fOm1vKGUpLGg9KGM9Yz09dj9BOmMpPT1BLGY9KGw9bD09dj9BOmwpPT1BLHA9Yz09bDtpZihwJiZLcyh0KSl7aWYoIUtzKGUpKXJldHVybiExO2E9ITAsaD0hMX1pZihwJiYhaClyZXR1cm4gc3x8KHM9bmV3IEpuKSxhfHxoYSh0KT9ybyh0LGUscixpLG8scyk6ZnVuY3Rpb24odCxlLG4scixpLG8scyl7c3dpdGNoKG4pe2Nhc2UgUDppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UgTDpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhbyhuZXcgV3QodCksbmV3IFd0KGUpKSk7Y2FzZSB4OmNhc2UgdzpjYXNlIFM6cmV0dXJuIHFzKCt0LCtlKTtjYXNlIGI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIEk6Y2FzZSBGOnJldHVybiB0PT1lKyIiO2Nhc2UgQzp2YXIgYT1sbjtjYXNlIE06dmFyIHU9MSZyO2lmKGF8fChhPXBuKSx0LnNpemUhPWUuc2l6ZSYmIXUpcmV0dXJuITE7dmFyIGM9cy5nZXQodCk7aWYoYylyZXR1cm4gYz09ZTtyfD0yLHMuc2V0KHQsZSk7dmFyIGw9cm8oYSh0KSxhKGUpLHIsaSxvLHMpO3JldHVybiBzLmRlbGV0ZSh0KSxsO2Nhc2UgVDppZihqbilyZXR1cm4gam4uY2FsbCh0KT09am4uY2FsbChlKX1yZXR1cm4hMX0odCxlLGMscixpLG8scyk7aWYoISgxJnIpKXt2YXIgZD1oJiZrdC5jYWxsKHQsIl9fd3JhcHBlZF9fIiksZz1mJiZrdC5jYWxsKGUsIl9fd3JhcHBlZF9fIik7aWYoZHx8Zyl7dmFyIHk9ZD90LnZhbHVlKCk6dCxtPWc/ZS52YWx1ZSgpOmU7cmV0dXJuIHN8fChzPW5ldyBKbiksbyh5LG0scixpLHMpfX1yZXR1cm4hIXAmJihzfHwocz1uZXcgSm4pLGZ1bmN0aW9uKHQsZSxyLGksbyxzKXt2YXIgYT0xJnIsdT1vbyh0KSxjPXUubGVuZ3RoLGw9b28oZSksaD1sLmxlbmd0aDtpZihjIT1oJiYhYSlyZXR1cm4hMTtmb3IodmFyIGY9YztmLS07KXt2YXIgcD11W2ZdO2lmKCEoYT9wIGluIGU6a3QuY2FsbChlLHApKSlyZXR1cm4hMX12YXIgZD1zLmdldCh0KSxnPXMuZ2V0KGUpO2lmKGQmJmcpcmV0dXJuIGQ9PWUmJmc9PXQ7dmFyIHk9ITA7cy5zZXQodCxlKSxzLnNldChlLHQpO2Zvcih2YXIgbT1hOysrZjxjOyl7dmFyIHY9dFtwPXVbZl1dLF89ZVtwXTtpZihpKXZhciB4PWE/aShfLHYscCxlLHQscyk6aSh2LF8scCx0LGUscyk7aWYoISh4PT09bj92PT09X3x8byh2LF8scixpLHMpOngpKXt5PSExO2JyZWFrfW18fChtPSJjb25zdHJ1Y3RvciI9PXApfWlmKHkmJiFtKXt2YXIgdz10LmNvbnN0cnVjdG9yLGI9ZS5jb25zdHJ1Y3Rvcjt3IT1iJiYiY29uc3RydWN0b3IiaW4gdCYmImNvbnN0cnVjdG9yImluIGUmJiEoImZ1bmN0aW9uIj09dHlwZW9mIHcmJncgaW5zdGFuY2VvZiB3JiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYiBpbnN0YW5jZW9mIGIpJiYoeT0hMSl9cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLHl9KHQsZSxyLGksbyxzKSl9KHQsZSxyLGksTHIsbykpfWZ1bmN0aW9uIFByKHQsZSxyLGkpe3ZhciBvPXIubGVuZ3RoLHM9byxhPSFpO2lmKG51bGw9PXQpcmV0dXJuIXM7Zm9yKHQ9SXQodCk7by0tOyl7dmFyIHU9cltvXTtpZihhJiZ1WzJdP3VbMV0hPT10W3VbMF1dOiEodVswXWluIHQpKXJldHVybiExfWZvcig7KytvPHM7KXt2YXIgYz0odT1yW29dKVswXSxsPXRbY10saD11WzFdO2lmKGEmJnVbMl0pe2lmKGw9PT1uJiYhKGMgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgZj1uZXcgSm47aWYoaSl2YXIgcD1pKGwsaCxjLHQsZSxmKTtpZighKHA9PT1uP0xyKGgsbCwzLGksZik6cCkpcmV0dXJuITF9fXJldHVybiEwfWZ1bmN0aW9uIFJyKHQpe3JldHVybiEoIW5hKHQpfHxmdW5jdGlvbih0KXtyZXR1cm4hIWp0JiZqdCBpbiB0fSh0KSkmJigkcyh0KT9HdDp2dCkudGVzdChqbyh0KSl9ZnVuY3Rpb24gQnIodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpudWxsPT10P291OiJvYmplY3QiPT10eXBlb2YgdD9Ycyh0KT9Wcih0WzBdLHRbMV0pOnFyKHQpOmR1KHQpfWZ1bmN0aW9uIGtyKHQpe2lmKCFTbyh0KSlyZXR1cm4gX24odCk7dmFyIGU9W107Zm9yKHZhciBuIGluIEl0KHQpKWt0LmNhbGwodCxuKSYmImNvbnN0cnVjdG9yIiE9biYmZS5wdXNoKG4pO3JldHVybiBlfWZ1bmN0aW9uIHpyKHQpe2lmKCFuYSh0KSlyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9W107aWYobnVsbCE9dClmb3IodmFyIG4gaW4gSXQodCkpZS5wdXNoKG4pO3JldHVybiBlfSh0KTt2YXIgZT1Tbyh0KSxuPVtdO2Zvcih2YXIgciBpbiB0KSJjb25zdHJ1Y3RvciI9PXImJihlfHwha3QuY2FsbCh0LHIpKXx8bi5wdXNoKHIpO3JldHVybiBufWZ1bmN0aW9uIGpyKHQsZSl7cmV0dXJuIHQ8ZX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuPS0xLHI9SHModCk/RXQodC5sZW5ndGgpOltdO3JldHVybiBkcih0LChmdW5jdGlvbih0LGksbyl7clsrK25dPWUodCxpLG8pfSkpLHJ9ZnVuY3Rpb24gcXIodCl7dmFyIGU9Zm8odCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP05vKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24obil7cmV0dXJuIG49PT10fHxQcihuLHQsZSl9fWZ1bmN0aW9uIFZyKHQsZSl7cmV0dXJuIERvKHQpJiZBbyhlKT9Obyh6byh0KSxlKTpmdW5jdGlvbihyKXt2YXIgaT1OYShyLHQpO3JldHVybiBpPT09biYmaT09PWU/SWEocix0KTpMcihlLGksMyl9fWZ1bmN0aW9uIEdyKHQsZSxyLGksbyl7dCE9PWUmJnhyKGUsKGZ1bmN0aW9uKHMsYSl7aWYob3x8KG89bmV3IEpuKSxuYShzKSkhZnVuY3Rpb24odCxlLHIsaSxvLHMsYSl7dmFyIHU9Rm8odCxyKSxjPUZvKGUsciksbD1hLmdldChjKTtpZihsKXJldHVybiB2b2lkIG5yKHQscixsKTt2YXIgaD1zP3ModSxjLHIrIiIsdCxlLGEpOm4sZj1oPT09bjtpZihmKXt2YXIgcD1YcyhjKSxkPSFwJiZLcyhjKSxnPSFwJiYhZCYmaGEoYyk7aD1jLHB8fGR8fGc/WHModSk/aD11OlpzKHUpP2g9RmkodSk6ZD8oZj0hMSxoPUNpKGMsITApKTpnPyhmPSExLGg9QWkoYywhMCkpOmg9W106c2EoYyl8fFlzKGMpPyhoPXUsWXModSk/aD1fYSh1KTooIW5hKHUpfHwkcyh1KSkmJihoPV9vKGMpKSk6Zj0hMX1mJiYoYS5zZXQoYyxoKSxvKGgsYyxpLHMsYSksYS5kZWxldGUoYykpLG5yKHQscixoKX0odCxlLGEscixHcixpLG8pO2Vsc2V7dmFyIHU9aT9pKEZvKHQsYSkscyxhKyIiLHQsZSxvKTpuO3U9PT1uJiYodT1zKSxucih0LGEsdSl9fSksTGEpfWZ1bmN0aW9uIFlyKHQsZSl7dmFyIHI9dC5sZW5ndGg7aWYocilyZXR1cm4gd28oZSs9ZTwwP3I6MCxyKT90W2VdOm59ZnVuY3Rpb24gWHIodCxlLG4pe2U9ZS5sZW5ndGg/UmUoZSwoZnVuY3Rpb24odCl7cmV0dXJuIFhzKHQpP2Z1bmN0aW9uKGUpe3JldHVybiBDcihlLDE9PT10Lmxlbmd0aD90WzBdOnQpfTp0fSkpOltvdV07dmFyIHI9LTE7cmV0dXJuIGU9UmUoZSx0bihsbygpKSksZnVuY3Rpb24odCxlKXt2YXIgbj10Lmxlbmd0aDtmb3IodC5zb3J0KGUpO24tLTspdFtuXT10W25dLnZhbHVlO3JldHVybiB0fShVcih0LChmdW5jdGlvbih0LG4saSl7cmV0dXJue2NyaXRlcmlhOlJlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlKHQpfSkpLGluZGV4Oisrcix2YWx1ZTp0fX0pKSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0tMSxpPXQuY3JpdGVyaWEsbz1lLmNyaXRlcmlhLHM9aS5sZW5ndGgsYT1uLmxlbmd0aDsrK3I8czspe3ZhciB1PU5pKGlbcl0sb1tyXSk7aWYodSlyZXR1cm4gcj49YT91OnUqKCJkZXNjIj09bltyXT8tMToxKX1yZXR1cm4gdC5pbmRleC1lLmluZGV4fSh0LGUsbil9KSl9ZnVuY3Rpb24gV3IodCxlLG4pe2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89e307KytyPGk7KXt2YXIgcz1lW3JdLGE9Q3IodCxzKTtuKGEscykmJmVpKG8sd2kocyx0KSxhKX1yZXR1cm4gb31mdW5jdGlvbiBIcih0LGUsbixyKXt2YXIgaT1yP1llOkdlLG89LTEscz1lLmxlbmd0aCxhPXQ7Zm9yKHQ9PT1lJiYoZT1GaShlKSksbiYmKGE9UmUodCx0bihuKSkpOysrbzxzOylmb3IodmFyIHU9MCxjPWVbb10sbD1uP24oYyk6YzsodT1pKGEsbCx1LHIpKT4tMTspYSE9PXQmJlF0LmNhbGwoYSx1LDEpLFF0LmNhbGwodCx1LDEpO3JldHVybiB0fWZ1bmN0aW9uIFpyKHQsZSl7Zm9yKHZhciBuPXQ/ZS5sZW5ndGg6MCxyPW4tMTtuLS07KXt2YXIgaT1lW25dO2lmKG49PXJ8fGkhPT1vKXt2YXIgbz1pO3dvKGkpP1F0LmNhbGwodCxpLDEpOnBpKHQsaSl9fXJldHVybiB0fWZ1bmN0aW9uIEtyKHQsZSl7cmV0dXJuIHQrdmUoRW4oKSooZS10KzEpKX1mdW5jdGlvbiBKcih0LGUpe3ZhciBuPSIiO2lmKCF0fHxlPDF8fGU+ZilyZXR1cm4gbjtkb3tlJTImJihuKz10KSwoZT12ZShlLzIpKSYmKHQrPXQpfXdoaWxlKGUpO3JldHVybiBufWZ1bmN0aW9uIFFyKHQsZSl7cmV0dXJuIExvKElvKHQsZSxvdSksdCsiIil9ZnVuY3Rpb24gJHIodCl7cmV0dXJuICRuKHFhKHQpKX1mdW5jdGlvbiB0aSh0LGUpe3ZhciBuPXFhKHQpO3JldHVybiBCbyhuLGNyKGUsMCxuLmxlbmd0aCkpfWZ1bmN0aW9uIGVpKHQsZSxyLGkpe2lmKCFuYSh0KSlyZXR1cm4gdDtmb3IodmFyIG89LTEscz0oZT13aShlLHQpKS5sZW5ndGgsYT1zLTEsdT10O251bGwhPXUmJisrbzxzOyl7dmFyIGM9em8oZVtvXSksbD1yO2lmKCJfX3Byb3RvX18iPT09Y3x8ImNvbnN0cnVjdG9yIj09PWN8fCJwcm90b3R5cGUiPT09YylyZXR1cm4gdDtpZihvIT1hKXt2YXIgaD11W2NdOyhsPWk/aShoLGMsdSk6bik9PT1uJiYobD1uYShoKT9oOndvKGVbbysxXSk/W106e30pfXJyKHUsYyxsKSx1PXVbY119cmV0dXJuIHR9dmFyIG5pPVRuP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIFRuLnNldCh0LGUpLHR9Om91LHJpPW9lP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIG9lKHQsInRvU3RyaW5nIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6bnUoZSksd3JpdGFibGU6ITB9KX06b3U7ZnVuY3Rpb24gaWkodCl7cmV0dXJuIEJvKHFhKHQpKX1mdW5jdGlvbiBvaSh0LGUsbil7dmFyIHI9LTEsaT10Lmxlbmd0aDtlPDAmJihlPS1lPmk/MDppK2UpLChuPW4+aT9pOm4pPDAmJihuKz1pKSxpPWU+bj8wOm4tZT4+PjAsZT4+Pj0wO2Zvcih2YXIgbz1FdChpKTsrK3I8aTspb1tyXT10W3IrZV07cmV0dXJuIG99ZnVuY3Rpb24gc2kodCxlKXt2YXIgbjtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxyLGkpe3JldHVybiEobj1lKHQscixpKSl9KSksISFufWZ1bmN0aW9uIGFpKHQsZSxuKXt2YXIgcj0wLGk9bnVsbD09dD9yOnQubGVuZ3RoO2lmKCJudW1iZXIiPT10eXBlb2YgZSYmZT09ZSYmaTw9eSl7Zm9yKDtyPGk7KXt2YXIgbz1yK2k+Pj4xLHM9dFtvXTtudWxsIT09cyYmIWxhKHMpJiYobj9zPD1lOnM8ZSk/cj1vKzE6aT1vfXJldHVybiBpfXJldHVybiB1aSh0LGUsb3Usbil9ZnVuY3Rpb24gdWkodCxlLHIsaSl7dmFyIG89MCxzPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZigwPT09cylyZXR1cm4gMDtmb3IodmFyIGE9KGU9cihlKSkhPWUsdT1udWxsPT09ZSxjPWxhKGUpLGw9ZT09PW47bzxzOyl7dmFyIGg9dmUoKG8rcykvMiksZj1yKHRbaF0pLHA9ZiE9PW4sZD1udWxsPT09Zix5PWY9PWYsbT1sYShmKTtpZihhKXZhciB2PWl8fHk7ZWxzZSB2PWw/eSYmKGl8fHApOnU/eSYmcCYmKGl8fCFkKTpjP3kmJnAmJiFkJiYoaXx8IW0pOiFkJiYhbSYmKGk/Zjw9ZTpmPGUpO3Y/bz1oKzE6cz1ofXJldHVybiB3bihzLGcpfWZ1bmN0aW9uIGNpKHQsZSl7Zm9yKHZhciBuPS0xLHI9dC5sZW5ndGgsaT0wLG89W107KytuPHI7KXt2YXIgcz10W25dLGE9ZT9lKHMpOnM7aWYoIW58fCFxcyhhLHUpKXt2YXIgdT1hO29baSsrXT0wPT09cz8wOnN9fXJldHVybiBvfWZ1bmN0aW9uIGxpKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90OmxhKHQpP3A6K3R9ZnVuY3Rpb24gaGkodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiB0O2lmKFhzKHQpKXJldHVybiBSZSh0LGhpKSsiIjtpZihsYSh0KSlyZXR1cm4gVW4/VW4uY2FsbCh0KToiIjt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0taD8iLTAiOmV9ZnVuY3Rpb24gZmkodCxlLG4pe3ZhciByPS0xLGk9TGUsbz10Lmxlbmd0aCxzPSEwLGE9W10sdT1hO2lmKG4pcz0hMSxpPVBlO2Vsc2UgaWYobz49MjAwKXt2YXIgYz1lP251bGw6SmkodCk7aWYoYylyZXR1cm4gcG4oYyk7cz0hMSxpPW5uLHU9bmV3IEtufWVsc2UgdT1lP1tdOmE7dDpmb3IoOysrcjxvOyl7dmFyIGw9dFtyXSxoPWU/ZShsKTpsO2lmKGw9bnx8MCE9PWw/bDowLHMmJmg9PWgpe2Zvcih2YXIgZj11Lmxlbmd0aDtmLS07KWlmKHVbZl09PT1oKWNvbnRpbnVlIHQ7ZSYmdS5wdXNoKGgpLGEucHVzaChsKX1lbHNlIGkodSxoLG4pfHwodSE9PWEmJnUucHVzaChoKSxhLnB1c2gobCkpfXJldHVybiBhfWZ1bmN0aW9uIHBpKHQsZSl7cmV0dXJuIG51bGw9PSh0PU1vKHQsZT13aShlLHQpKSl8fGRlbGV0ZSB0W3pvKFFvKGUpKV19ZnVuY3Rpb24gZGkodCxlLG4scil7cmV0dXJuIGVpKHQsZSxuKENyKHQsZSkpLHIpfWZ1bmN0aW9uIGdpKHQsZSxuLHIpe2Zvcih2YXIgaT10Lmxlbmd0aCxvPXI/aTotMTsocj9vLS06KytvPGkpJiZlKHRbb10sbyx0KTspO3JldHVybiBuP29pKHQscj8wOm8scj9vKzE6aSk6b2kodCxyP28rMTowLHI/aTpvKX1mdW5jdGlvbiB5aSh0LGUpe3ZhciBuPXQ7cmV0dXJuIG4gaW5zdGFuY2VvZiBYbiYmKG49bi52YWx1ZSgpKSxrZShlLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmZ1bmMuYXBwbHkoZS50aGlzQXJnLEJlKFt0XSxlLmFyZ3MpKX0pLG4pfWZ1bmN0aW9uIG1pKHQsZSxuKXt2YXIgcj10Lmxlbmd0aDtpZihyPDIpcmV0dXJuIHI/ZmkodFswXSk6W107Zm9yKHZhciBpPS0xLG89RXQocik7KytpPHI7KWZvcih2YXIgcz10W2ldLGE9LTE7KythPHI7KWEhPWkmJihvW2ldPXByKG9baV18fHMsdFthXSxlLG4pKTtyZXR1cm4gZmkoX3IobywxKSxlLG4pfWZ1bmN0aW9uIHZpKHQsZSxyKXtmb3IodmFyIGk9LTEsbz10Lmxlbmd0aCxzPWUubGVuZ3RoLGE9e307KytpPG87KXt2YXIgdT1pPHM/ZVtpXTpuO3IoYSx0W2ldLHUpfXJldHVybiBhfWZ1bmN0aW9uIF9pKHQpe3JldHVybiBacyh0KT90OltdfWZ1bmN0aW9uIHhpKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6b3V9ZnVuY3Rpb24gd2kodCxlKXtyZXR1cm4gWHModCk/dDpEbyh0LGUpP1t0XTprbyh4YSh0KSl9dmFyIGJpPVFyO2Z1bmN0aW9uIERpKHQsZSxyKXt2YXIgaT10Lmxlbmd0aDtyZXR1cm4gcj1yPT09bj9pOnIsIWUmJnI+PWk/dDpvaSh0LGUscil9dmFyIEVpPWhlfHxmdW5jdGlvbih0KXtyZXR1cm4geWUuY2xlYXJUaW1lb3V0KHQpfTtmdW5jdGlvbiBDaSh0LGUpe2lmKGUpcmV0dXJuIHQuc2xpY2UoKTt2YXIgbj10Lmxlbmd0aCxyPUh0P0h0KG4pOm5ldyB0LmNvbnN0cnVjdG9yKG4pO3JldHVybiB0LmNvcHkocikscn1mdW5jdGlvbiBTaSh0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgV3QoZSkuc2V0KG5ldyBXdCh0KSksZX1mdW5jdGlvbiBBaSh0LGUpe3ZhciBuPWU/U2kodC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0Lmxlbmd0aCl9ZnVuY3Rpb24gTmkodCxlKXtpZih0IT09ZSl7dmFyIHI9dCE9PW4saT1udWxsPT09dCxvPXQ9PXQscz1sYSh0KSxhPWUhPT1uLHU9bnVsbD09PWUsYz1lPT1lLGw9bGEoZSk7aWYoIXUmJiFsJiYhcyYmdD5lfHxzJiZhJiZjJiYhdSYmIWx8fGkmJmEmJmN8fCFyJiZjfHwhbylyZXR1cm4gMTtpZighaSYmIXMmJiFsJiZ0PGV8fGwmJnImJm8mJiFpJiYhc3x8dSYmciYmb3x8IWEmJm98fCFjKXJldHVybi0xfXJldHVybiAwfWZ1bmN0aW9uIElpKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPXQubGVuZ3RoLHM9bi5sZW5ndGgsYT0tMSx1PWUubGVuZ3RoLGM9eG4oby1zLDApLGw9RXQodStjKSxoPSFyOysrYTx1OylsW2FdPWVbYV07Zm9yKDsrK2k8czspKGh8fGk8bykmJihsW25baV1dPXRbaV0pO2Zvcig7Yy0tOylsW2ErK109dFtpKytdO3JldHVybiBsfWZ1bmN0aW9uIE1pKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPXQubGVuZ3RoLHM9LTEsYT1uLmxlbmd0aCx1PS0xLGM9ZS5sZW5ndGgsbD14bihvLWEsMCksaD1FdChsK2MpLGY9IXI7KytpPGw7KWhbaV09dFtpXTtmb3IodmFyIHA9aTsrK3U8YzspaFtwK3VdPWVbdV07Zm9yKDsrK3M8YTspKGZ8fGk8bykmJihoW3ArbltzXV09dFtpKytdKTtyZXR1cm4gaH1mdW5jdGlvbiBGaSh0LGUpe3ZhciBuPS0xLHI9dC5sZW5ndGg7Zm9yKGV8fChlPUV0KHIpKTsrK248cjspZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIFRpKHQsZSxyLGkpe3ZhciBvPSFyO3J8fChyPXt9KTtmb3IodmFyIHM9LTEsYT1lLmxlbmd0aDsrK3M8YTspe3ZhciB1PWVbc10sYz1pP2koclt1XSx0W3VdLHUscix0KTpuO2M9PT1uJiYoYz10W3VdKSxvP2FyKHIsdSxjKTpycihyLHUsYyl9cmV0dXJuIHJ9ZnVuY3Rpb24gT2kodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyKXt2YXIgaT1YcyhuKT9JZTpvcixvPWU/ZSgpOnt9O3JldHVybiBpKG4sdCxsbyhyLDIpLG8pfX1mdW5jdGlvbiBMaSh0KXtyZXR1cm4gUXIoKGZ1bmN0aW9uKGUscil7dmFyIGk9LTEsbz1yLmxlbmd0aCxzPW8+MT9yW28tMV06bixhPW8+Mj9yWzJdOm47Zm9yKHM9dC5sZW5ndGg+MyYmImZ1bmN0aW9uIj09dHlwZW9mIHM/KG8tLSxzKTpuLGEmJmJvKHJbMF0sclsxXSxhKSYmKHM9bzwzP246cyxvPTEpLGU9SXQoZSk7KytpPG87KXt2YXIgdT1yW2ldO3UmJnQoZSx1LGkscyl9cmV0dXJuIGV9KSl9ZnVuY3Rpb24gUGkodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtpZihudWxsPT1uKXJldHVybiBuO2lmKCFIcyhuKSlyZXR1cm4gdChuLHIpO2Zvcih2YXIgaT1uLmxlbmd0aCxvPWU/aTotMSxzPUl0KG4pOyhlP28tLTorK288aSkmJiExIT09cihzW29dLG8scyk7KTtyZXR1cm4gbn19ZnVuY3Rpb24gUmkodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtmb3IodmFyIGk9LTEsbz1JdChlKSxzPXIoZSksYT1zLmxlbmd0aDthLS07KXt2YXIgdT1zW3Q/YTorK2ldO2lmKCExPT09bihvW3VdLHUsbykpYnJlYWt9cmV0dXJuIGV9fWZ1bmN0aW9uIEJpKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1jbihlPXhhKGUpKT9nbihlKTpuLGk9cj9yWzBdOmUuY2hhckF0KDApLG89cj9EaShyLDEpLmpvaW4oIiIpOmUuc2xpY2UoMSk7cmV0dXJuIGlbdF0oKStvfX1mdW5jdGlvbiBraSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGtlKCRhKFlhKGUpLnJlcGxhY2UoZWUsIiIpKSx0LCIiKX19ZnVuY3Rpb24gemkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgdDtjYXNlIDE6cmV0dXJuIG5ldyB0KGVbMF0pO2Nhc2UgMjpyZXR1cm4gbmV3IHQoZVswXSxlWzFdKTtjYXNlIDM6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdKTtjYXNlIDQ6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10pO2Nhc2UgNTpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdKTtjYXNlIDY6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdKTtjYXNlIDc6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0pfXZhciBuPVZuKHQucHJvdG90eXBlKSxyPXQuYXBwbHkobixlKTtyZXR1cm4gbmEocik/cjpufX1mdW5jdGlvbiBqaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe3ZhciBvPUl0KGUpO2lmKCFIcyhlKSl7dmFyIHM9bG8ociwzKTtlPU9hKGUpLHI9ZnVuY3Rpb24odCl7cmV0dXJuIHMob1t0XSx0LG8pfX12YXIgYT10KGUscixpKTtyZXR1cm4gYT4tMT9vW3M/ZVthXTphXTpufX1mdW5jdGlvbiBVaSh0KXtyZXR1cm4gaW8oKGZ1bmN0aW9uKGUpe3ZhciBpPWUubGVuZ3RoLG89aSxzPVluLnByb3RvdHlwZS50aHJ1O2Zvcih0JiZlLnJldmVyc2UoKTtvLS07KXt2YXIgYT1lW29dO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBhKXRocm93IG5ldyBUdChyKTtpZihzJiYhdSYmIndyYXBwZXIiPT11byhhKSl2YXIgdT1uZXcgWW4oW10sITApfWZvcihvPXU/bzppOysrbzxpOyl7dmFyIGM9dW8oYT1lW29dKSxsPSJ3cmFwcGVyIj09Yz9hbyhhKTpuO3U9bCYmRW8obFswXSkmJjQyND09bFsxXSYmIWxbNF0ubGVuZ3RoJiYxPT1sWzldP3VbdW8obFswXSldLmFwcGx5KHUsbFszXSk6MT09YS5sZW5ndGgmJkVvKGEpP3VbY10oKTp1LnRocnUoYSl9cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLG49dFswXTtpZih1JiYxPT10Lmxlbmd0aCYmWHMobikpcmV0dXJuIHUucGxhbnQobikudmFsdWUoKTtmb3IodmFyIHI9MCxvPWk/ZVtyXS5hcHBseSh0aGlzLHQpOm47KytyPGk7KW89ZVtyXS5jYWxsKHRoaXMsbyk7cmV0dXJuIG99fSkpfWZ1bmN0aW9uIHFpKHQsZSxyLGksbyxzLGEsdSxsLGgpe3ZhciBmPWUmYyxwPTEmZSxkPTImZSxnPTI0JmUseT01MTImZSxtPWQ/bjp6aSh0KTtyZXR1cm4gZnVuY3Rpb24gYygpe2Zvcih2YXIgdj1hcmd1bWVudHMubGVuZ3RoLF89RXQodikseD12O3gtLTspX1t4XT1hcmd1bWVudHNbeF07aWYoZyl2YXIgdz1jbyhjKSxiPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLHI9MDtuLS07KXRbbl09PT1lJiYrK3I7cmV0dXJuIHJ9KF8sdyk7aWYoaSYmKF89SWkoXyxpLG8sZykpLHMmJihfPU1pKF8scyxhLGcpKSx2LT1iLGcmJnY8aCl7dmFyIEQ9Zm4oXyx3KTtyZXR1cm4gWmkodCxlLHFpLGMucGxhY2Vob2xkZXIscixfLEQsdSxsLGgtdil9dmFyIEU9cD9yOnRoaXMsQz1kP0VbdF06dDtyZXR1cm4gdj1fLmxlbmd0aCx1P189ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5sZW5ndGgsaT13bihlLmxlbmd0aCxyKSxvPUZpKHQpO2ktLTspe3ZhciBzPWVbaV07dFtpXT13byhzLHIpP29bc106bn1yZXR1cm4gdH0oXyx1KTp5JiZ2PjEmJl8ucmV2ZXJzZSgpLGYmJmw8diYmKF8ubGVuZ3RoPWwpLHRoaXMmJnRoaXMhPT15ZSYmdGhpcyBpbnN0YW5jZW9mIGMmJihDPW18fHppKEMpKSxDLmFwcGx5KEUsXyl9fWZ1bmN0aW9uIFZpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBicih0LChmdW5jdGlvbih0LGksbyl7ZShyLG4odCksaSxvKX0pKSxyfShuLHQsZShyKSx7fSl9fWZ1bmN0aW9uIEdpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7dmFyIG87aWYocj09PW4mJmk9PT1uKXJldHVybiBlO2lmKHIhPT1uJiYobz1yKSxpIT09bil7aWYobz09PW4pcmV0dXJuIGk7InN0cmluZyI9PXR5cGVvZiByfHwic3RyaW5nIj09dHlwZW9mIGk/KHI9aGkociksaT1oaShpKSk6KHI9bGkociksaT1saShpKSksbz10KHIsaSl9cmV0dXJuIG99fWZ1bmN0aW9uIFlpKHQpe3JldHVybiBpbygoZnVuY3Rpb24oZSl7cmV0dXJuIGU9UmUoZSx0bihsbygpKSksUXIoKGZ1bmN0aW9uKG4pe3ZhciByPXRoaXM7cmV0dXJuIHQoZSwoZnVuY3Rpb24odCl7cmV0dXJuIE5lKHQscixuKX0pKX0pKX0pKX1mdW5jdGlvbiBYaSh0LGUpe3ZhciByPShlPWU9PT1uPyIgIjpoaShlKSkubGVuZ3RoO2lmKHI8MilyZXR1cm4gcj9KcihlLHQpOmU7dmFyIGk9SnIoZSxtZSh0L2RuKGUpKSk7cmV0dXJuIGNuKGUpP0RpKGduKGkpLDAsdCkuam9pbigiIik6aS5zbGljZSgwLHQpfWZ1bmN0aW9uIFdpKHQpe3JldHVybiBmdW5jdGlvbihlLHIsaSl7cmV0dXJuIGkmJiJudW1iZXIiIT10eXBlb2YgaSYmYm8oZSxyLGkpJiYocj1pPW4pLGU9Z2EoZSkscj09PW4/KHI9ZSxlPTApOnI9Z2EociksZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPS0xLG89eG4obWUoKGUtdCkvKG58fDEpKSwwKSxzPUV0KG8pO28tLTspc1tyP286KytpXT10LHQrPW47cmV0dXJuIHN9KGUscixpPWk9PT1uP2U8cj8xOi0xOmdhKGkpLHQpfX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJiJzdHJpbmciPT10eXBlb2Ygbnx8KGU9dmEoZSksbj12YShuKSksdChlLG4pfX1mdW5jdGlvbiBaaSh0LGUscixpLG8scyxjLGwsaCxmKXt2YXIgcD04JmU7ZXw9cD9hOnUsNCYoZSY9fihwP3U6YSkpfHwoZSY9LTQpO3ZhciBkPVt0LGUsbyxwP3M6bixwP2M6bixwP246cyxwP246YyxsLGgsZl0sZz1yLmFwcGx5KG4sZCk7cmV0dXJuIEVvKHQpJiZUbyhnLGQpLGcucGxhY2Vob2xkZXI9aSxQbyhnLHQsZSl9ZnVuY3Rpb24gS2kodCl7dmFyIGU9TnRbdF07cmV0dXJuIGZ1bmN0aW9uKHQsbil7aWYodD12YSh0KSwobj1udWxsPT1uPzA6d24oeWEobiksMjkyKSkmJlVlKHQpKXt2YXIgcj0oeGEodCkrImUiKS5zcGxpdCgiZSIpO3JldHVybisoKHI9KHhhKGUoclswXSsiZSIrKCtyWzFdK24pKSkrImUiKS5zcGxpdCgiZSIpKVswXSsiZSIrKCtyWzFdLW4pKX1yZXR1cm4gZSh0KX19dmFyIEppPUluJiYxL3BuKG5ldyBJbihbLC0wXSkpWzFdPT1oP2Z1bmN0aW9uKHQpe3JldHVybiBuZXcgSW4odCl9Omx1O2Z1bmN0aW9uIFFpKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1tbyhlKTtyZXR1cm4gbj09Qz9sbihlKTpuPT1NP2Z1bmN0aW9uKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtuWysrZV09W3QsdF19KSksbn0oZSk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuW2UsdFtlXV19KSl9KGUsdChlKSl9fWZ1bmN0aW9uICRpKHQsZSxpLGgsZixwLGQsZyl7dmFyIHk9MiZlO2lmKCF5JiYiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7dmFyIG09aD9oLmxlbmd0aDowO2lmKG18fChlJj0tOTcsaD1mPW4pLGQ9ZD09PW4/ZDp4bih5YShkKSwwKSxnPWc9PT1uP2c6eWEoZyksbS09Zj9mLmxlbmd0aDowLGUmdSl7dmFyIHY9aCxfPWY7aD1mPW59dmFyIHg9eT9uOmFvKHQpLHc9W3QsZSxpLGgsZix2LF8scCxkLGddO2lmKHgmJmZ1bmN0aW9uKHQsZSl7dmFyIG49dFsxXSxyPWVbMV0saT1ufHIscz1pPDEzMSxhPXI9PWMmJjg9PW58fHI9PWMmJm49PWwmJnRbN10ubGVuZ3RoPD1lWzhdfHwzODQ9PXImJmVbN10ubGVuZ3RoPD1lWzhdJiY4PT1uO2lmKCFzJiYhYSlyZXR1cm4gdDsxJnImJih0WzJdPWVbMl0saXw9MSZuPzA6NCk7dmFyIHU9ZVszXTtpZih1KXt2YXIgaD10WzNdO3RbM109aD9JaShoLHUsZVs0XSk6dSx0WzRdPWg/Zm4odFszXSxvKTplWzRdfXU9ZVs1XSx1JiYoaD10WzVdLHRbNV09aD9NaShoLHUsZVs2XSk6dSx0WzZdPWg/Zm4odFs1XSxvKTplWzZdKSx1PWVbN10sdSYmKHRbN109dSksciZjJiYodFs4XT1udWxsPT10WzhdP2VbOF06d24odFs4XSxlWzhdKSksbnVsbD09dFs5XSYmKHRbOV09ZVs5XSksdFswXT1lWzBdLHRbMV09aX0odyx4KSx0PXdbMF0sZT13WzFdLGk9d1syXSxoPXdbM10sZj13WzRdLCEoZz13WzldPXdbOV09PT1uP3k/MDp0Lmxlbmd0aDp4bih3WzldLW0sMCkpJiYyNCZlJiYoZSY9LTI1KSxlJiYxIT1lKWI9OD09ZXx8ZT09cz9mdW5jdGlvbih0LGUscil7dmFyIGk9emkodCk7cmV0dXJuIGZ1bmN0aW9uIG8oKXtmb3IodmFyIHM9YXJndW1lbnRzLmxlbmd0aCxhPUV0KHMpLHU9cyxjPWNvKG8pO3UtLTspYVt1XT1hcmd1bWVudHNbdV07dmFyIGw9czwzJiZhWzBdIT09YyYmYVtzLTFdIT09Yz9bXTpmbihhLGMpO3JldHVybihzLT1sLmxlbmd0aCk8cj9aaSh0LGUscWksby5wbGFjZWhvbGRlcixuLGEsbCxuLG4sci1zKTpOZSh0aGlzJiZ0aGlzIT09eWUmJnRoaXMgaW5zdGFuY2VvZiBvP2k6dCx0aGlzLGEpfX0odCxlLGcpOmUhPWEmJjMzIT1lfHxmLmxlbmd0aD9xaS5hcHBseShuLHcpOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPTEmZSxvPXppKHQpO3JldHVybiBmdW5jdGlvbiBlKCl7Zm9yKHZhciBzPS0xLGE9YXJndW1lbnRzLmxlbmd0aCx1PS0xLGM9ci5sZW5ndGgsbD1FdChjK2EpLGg9dGhpcyYmdGhpcyE9PXllJiZ0aGlzIGluc3RhbmNlb2YgZT9vOnQ7Kyt1PGM7KWxbdV09clt1XTtmb3IoO2EtLTspbFt1KytdPWFyZ3VtZW50c1srK3NdO3JldHVybiBOZShoLGk/bjp0aGlzLGwpfX0odCxlLGksaCk7ZWxzZSB2YXIgYj1mdW5jdGlvbih0LGUsbil7dmFyIHI9MSZlLGk9emkodCk7cmV0dXJuIGZ1bmN0aW9uIGUoKXtyZXR1cm4odGhpcyYmdGhpcyE9PXllJiZ0aGlzIGluc3RhbmNlb2YgZT9pOnQpLmFwcGx5KHI/bjp0aGlzLGFyZ3VtZW50cyl9fSh0LGUsaSk7cmV0dXJuIFBvKCh4P25pOlRvKShiLHcpLHQsZSl9ZnVuY3Rpb24gdG8odCxlLHIsaSl7cmV0dXJuIHQ9PT1ufHxxcyh0LFB0W3JdKSYmIWt0LmNhbGwoaSxyKT9lOnR9ZnVuY3Rpb24gZW8odCxlLHIsaSxvLHMpe3JldHVybiBuYSh0KSYmbmEoZSkmJihzLnNldChlLHQpLEdyKHQsZSxuLGVvLHMpLHMuZGVsZXRlKGUpKSx0fWZ1bmN0aW9uIG5vKHQpe3JldHVybiBzYSh0KT9uOnR9ZnVuY3Rpb24gcm8odCxlLHIsaSxvLHMpe3ZhciBhPTEmcix1PXQubGVuZ3RoLGM9ZS5sZW5ndGg7aWYodSE9YyYmIShhJiZjPnUpKXJldHVybiExO3ZhciBsPXMuZ2V0KHQpLGg9cy5nZXQoZSk7aWYobCYmaClyZXR1cm4gbD09ZSYmaD09dDt2YXIgZj0tMSxwPSEwLGQ9MiZyP25ldyBLbjpuO2ZvcihzLnNldCh0LGUpLHMuc2V0KGUsdCk7KytmPHU7KXt2YXIgZz10W2ZdLHk9ZVtmXTtpZihpKXZhciBtPWE/aSh5LGcsZixlLHQscyk6aShnLHksZix0LGUscyk7aWYobSE9PW4pe2lmKG0pY29udGludWU7cD0hMTticmVha31pZihkKXtpZighamUoZSwoZnVuY3Rpb24odCxlKXtpZighbm4oZCxlKSYmKGc9PT10fHxvKGcsdCxyLGkscykpKXJldHVybiBkLnB1c2goZSl9KSkpe3A9ITE7YnJlYWt9fWVsc2UgaWYoZyE9PXkmJiFvKGcseSxyLGkscykpe3A9ITE7YnJlYWt9fXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSxwfWZ1bmN0aW9uIGlvKHQpe3JldHVybiBMbyhJbyh0LG4sV28pLHQrIiIpfWZ1bmN0aW9uIG9vKHQpe3JldHVybiBTcih0LE9hLGdvKX1mdW5jdGlvbiBzbyh0KXtyZXR1cm4gU3IodCxMYSx5byl9dmFyIGFvPVRuP2Z1bmN0aW9uKHQpe3JldHVybiBUbi5nZXQodCl9Omx1O2Z1bmN0aW9uIHVvKHQpe2Zvcih2YXIgZT10Lm5hbWUrIiIsbj1PbltlXSxyPWt0LmNhbGwoT24sZSk/bi5sZW5ndGg6MDtyLS07KXt2YXIgaT1uW3JdLG89aS5mdW5jO2lmKG51bGw9PW98fG89PXQpcmV0dXJuIGkubmFtZX1yZXR1cm4gZX1mdW5jdGlvbiBjbyh0KXtyZXR1cm4oa3QuY2FsbChxbiwicGxhY2Vob2xkZXIiKT9xbjp0KS5wbGFjZWhvbGRlcn1mdW5jdGlvbiBsbygpe3ZhciB0PXFuLml0ZXJhdGVlfHxzdTtyZXR1cm4gdD10PT09c3U/QnI6dCxhcmd1bWVudHMubGVuZ3RoP3QoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6dH1mdW5jdGlvbiBobyh0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9KGUpP25bInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gZm8odCl7Zm9yKHZhciBlPU9hKHQpLG49ZS5sZW5ndGg7bi0tOyl7dmFyIHI9ZVtuXSxpPXRbcl07ZVtuXT1bcixpLEFvKGkpXX1yZXR1cm4gZX1mdW5jdGlvbiBwbyh0LGUpe3ZhciByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/bjp0W2VdfSh0LGUpO3JldHVybiBScihyKT9yOm59dmFyIGdvPXhlP2Z1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOih0PUl0KHQpLE9lKHhlKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gSnQuY2FsbCh0LGUpfSkpKX06bXUseW89eGU/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KUJlKGUsZ28odCkpLHQ9WnQodCk7cmV0dXJuIGV9Om11LG1vPUFyO2Z1bmN0aW9uIHZvKHQsZSxuKXtmb3IodmFyIHI9LTEsaT0oZT13aShlLHQpKS5sZW5ndGgsbz0hMTsrK3I8aTspe3ZhciBzPXpvKGVbcl0pO2lmKCEobz1udWxsIT10JiZuKHQscykpKWJyZWFrO3Q9dFtzXX1yZXR1cm4gb3x8KytyIT1pP286ISEoaT1udWxsPT10PzA6dC5sZW5ndGgpJiZlYShpKSYmd28ocyxpKSYmKFhzKHQpfHxZcyh0KSl9ZnVuY3Rpb24gX28odCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29uc3RydWN0b3J8fFNvKHQpP3t9OlZuKFp0KHQpKX1mdW5jdGlvbiB4byh0KXtyZXR1cm4gWHModCl8fFlzKHQpfHwhISgkdCYmdCYmdFskdF0pfWZ1bmN0aW9uIHdvKHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lP2Y6ZSkmJigibnVtYmVyIj09bnx8InN5bWJvbCIhPW4mJnh0LnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX1mdW5jdGlvbiBibyh0LGUsbil7aWYoIW5hKG4pKXJldHVybiExO3ZhciByPXR5cGVvZiBlO3JldHVybiEhKCJudW1iZXIiPT1yP0hzKG4pJiZ3byhlLG4ubGVuZ3RoKToic3RyaW5nIj09ciYmZSBpbiBuKSYmcXMobltlXSx0KX1mdW5jdGlvbiBEbyh0LGUpe2lmKFhzKHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPW4mJiJzeW1ib2wiIT1uJiYiYm9vbGVhbiIhPW4mJm51bGwhPXQmJiFsYSh0KSl8fChudC50ZXN0KHQpfHwhZXQudGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBJdChlKSl9ZnVuY3Rpb24gRW8odCl7dmFyIGU9dW8odCksbj1xbltlXTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbnx8IShlIGluIFhuLnByb3RvdHlwZSkpcmV0dXJuITE7aWYodD09PW4pcmV0dXJuITA7dmFyIHI9YW8obik7cmV0dXJuISFyJiZ0PT09clswXX0oU24mJm1vKG5ldyBTbihuZXcgQXJyYXlCdWZmZXIoMSkpKSE9UHx8QW4mJm1vKG5ldyBBbikhPUN8fE5uJiZtbyhObi5yZXNvbHZlKCkpIT1OfHxJbiYmbW8obmV3IEluKSE9TXx8TW4mJm1vKG5ldyBNbikhPU8pJiYobW89ZnVuY3Rpb24odCl7dmFyIGU9QXIodCkscj1lPT1BP3QuY29uc3RydWN0b3I6bixpPXI/am8ocik6IiI7aWYoaSlzd2l0Y2goaSl7Y2FzZSBMbjpyZXR1cm4gUDtjYXNlIFBuOnJldHVybiBDO2Nhc2UgUm46cmV0dXJuIE47Y2FzZSBCbjpyZXR1cm4gTTtjYXNlIGtuOnJldHVybiBPfXJldHVybiBlfSk7dmFyIENvPVJ0PyRzOnZ1O2Z1bmN0aW9uIFNvKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxQdCl9ZnVuY3Rpb24gQW8odCl7cmV0dXJuIHQ9PXQmJiFuYSh0KX1mdW5jdGlvbiBObyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gbnVsbCE9ciYmKHJbdF09PT1lJiYoZSE9PW58fHQgaW4gSXQocikpKX19ZnVuY3Rpb24gSW8odCxlLHIpe3JldHVybiBlPXhuKGU9PT1uP3QubGVuZ3RoLTE6ZSwwKSxmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMsaT0tMSxvPXhuKG4ubGVuZ3RoLWUsMCkscz1FdChvKTsrK2k8bzspc1tpXT1uW2UraV07aT0tMTtmb3IodmFyIGE9RXQoZSsxKTsrK2k8ZTspYVtpXT1uW2ldO3JldHVybiBhW2VdPXIocyksTmUodCx0aGlzLGEpfX1mdW5jdGlvbiBNbyh0LGUpe3JldHVybiBlLmxlbmd0aDwyP3Q6Q3IodCxvaShlLDAsLTEpKX1mdW5jdGlvbiBGbyh0LGUpe2lmKCgiY29uc3RydWN0b3IiIT09ZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbZV0pJiYiX19wcm90b19fIiE9ZSlyZXR1cm4gdFtlXX12YXIgVG89Um8obmkpLE9vPWdlfHxmdW5jdGlvbih0LGUpe3JldHVybiB5ZS5zZXRUaW1lb3V0KHQsZSl9LExvPVJvKHJpKTtmdW5jdGlvbiBQbyh0LGUsbil7dmFyIHI9ZSsiIjtyZXR1cm4gTG8odCxmdW5jdGlvbih0LGUpe3ZhciBuPWUubGVuZ3RoO2lmKCFuKXJldHVybiB0O3ZhciByPW4tMTtyZXR1cm4gZVtyXT0obj4xPyImICI6IiIpK2Vbcl0sZT1lLmpvaW4obj4yPyIsICI6IiAiKSx0LnJlcGxhY2UodXQsIntcbi8qIFt3cmFwcGVkIHdpdGggIitlKyJdICovXG4iKX0ocixmdW5jdGlvbih0LGUpe3JldHVybiBNZShtLChmdW5jdGlvbihuKXt2YXIgcj0iXy4iK25bMF07ZSZuWzFdJiYhTGUodCxyKSYmdC5wdXNoKHIpfSkpLHQuc29ydCgpfShmdW5jdGlvbih0KXt2YXIgZT10Lm1hdGNoKGN0KTtyZXR1cm4gZT9lWzFdLnNwbGl0KGx0KTpbXX0ociksbikpKX1mdW5jdGlvbiBSbyh0KXt2YXIgZT0wLHI9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1ibigpLG89MTYtKGktcik7aWYocj1pLG8+MCl7aWYoKytlPj04MDApcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIGU9MDtyZXR1cm4gdC5hcHBseShuLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIEJvKHQsZSl7dmFyIHI9LTEsaT10Lmxlbmd0aCxvPWktMTtmb3IoZT1lPT09bj9pOmU7KytyPGU7KXt2YXIgcz1LcihyLG8pLGE9dFtzXTt0W3NdPXRbcl0sdFtyXT1hfXJldHVybiB0Lmxlbmd0aD1lLHR9dmFyIGtvPWZ1bmN0aW9uKHQpe3ZhciBlPVJzKHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1uLnNpemUmJm4uY2xlYXIoKSx0fSkpLG49ZS5jYWNoZTtyZXR1cm4gZX0oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UocnQsKGZ1bmN0aW9uKHQsbixyLGkpe2UucHVzaChyP2kucmVwbGFjZShwdCwiJDEiKTpufHx0KX0pKSxlfSkpO2Z1bmN0aW9uIHpvKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8bGEodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LWg/Ii0wIjplfWZ1bmN0aW9uIGpvKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gQnQuY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9ZnVuY3Rpb24gVW8odCl7aWYodCBpbnN0YW5jZW9mIFhuKXJldHVybiB0LmNsb25lKCk7dmFyIGU9bmV3IFluKHQuX193cmFwcGVkX18sdC5fX2NoYWluX18pO3JldHVybiBlLl9fYWN0aW9uc19fPUZpKHQuX19hY3Rpb25zX18pLGUuX19pbmRleF9fPXQuX19pbmRleF9fLGUuX192YWx1ZXNfXz10Ll9fdmFsdWVzX18sZX12YXIgcW89UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFpzKHQpP3ByKHQsX3IoZSwxLFpzLCEwKSk6W119KSksVm89UXIoKGZ1bmN0aW9uKHQsZSl7dmFyIHI9UW8oZSk7cmV0dXJuIFpzKHIpJiYocj1uKSxacyh0KT9wcih0LF9yKGUsMSxacywhMCksbG8ociwyKSk6W119KSksR289UXIoKGZ1bmN0aW9uKHQsZSl7dmFyIHI9UW8oZSk7cmV0dXJuIFpzKHIpJiYocj1uKSxacyh0KT9wcih0LF9yKGUsMSxacywhMCksbixyKTpbXX0pKTtmdW5jdGlvbiBZbyh0LGUsbil7dmFyIHI9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFyKXJldHVybi0xO3ZhciBpPW51bGw9PW4/MDp5YShuKTtyZXR1cm4gaTwwJiYoaT14bihyK2ksMCkpLFZlKHQsbG8oZSwzKSxpKX1mdW5jdGlvbiBYbyh0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFpKXJldHVybi0xO3ZhciBvPWktMTtyZXR1cm4gciE9PW4mJihvPXlhKHIpLG89cjwwP3huKGkrbywwKTp3bihvLGktMSkpLFZlKHQsbG8oZSwzKSxvLCEwKX1mdW5jdGlvbiBXbyh0KXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9fcih0LDEpOltdfWZ1bmN0aW9uIEhvKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD90WzBdOm59dmFyIFpvPVFyKChmdW5jdGlvbih0KXt2YXIgZT1SZSh0LF9pKTtyZXR1cm4gZS5sZW5ndGgmJmVbMF09PT10WzBdP0ZyKGUpOltdfSkpLEtvPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KSxyPVJlKHQsX2kpO3JldHVybiBlPT09UW8ocik/ZT1uOnIucG9wKCksci5sZW5ndGgmJnJbMF09PT10WzBdP0ZyKHIsbG8oZSwyKSk6W119KSksSm89UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpLHI9UmUodCxfaSk7cmV0dXJuKGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuKSYmci5wb3AoKSxyLmxlbmd0aCYmclswXT09PXRbMF0/RnIocixuLGUpOltdfSkpO2Z1bmN0aW9uIFFvKHQpe3ZhciBlPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gZT90W2UtMV06bn12YXIgJG89UXIodHMpO2Z1bmN0aW9uIHRzKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoJiZlJiZlLmxlbmd0aD9Icih0LGUpOnR9dmFyIGVzPWlvKChmdW5jdGlvbih0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPXVyKHQsZSk7cmV0dXJuIFpyKHQsUmUoZSwoZnVuY3Rpb24odCl7cmV0dXJuIHdvKHQsbik/K3Q6dH0pKS5zb3J0KE5pKSkscn0pKTtmdW5jdGlvbiBucyh0KXtyZXR1cm4gbnVsbD09dD90OkNuLmNhbGwodCl9dmFyIHJzPVFyKChmdW5jdGlvbih0KXtyZXR1cm4gZmkoX3IodCwxLFpzLCEwKSl9KSksaXM9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpO3JldHVybiBacyhlKSYmKGU9biksZmkoX3IodCwxLFpzLCEwKSxsbyhlLDIpKX0pKSxvcz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCk7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuLGZpKF9yKHQsMSxacywhMCksbixlKX0pKTtmdW5jdGlvbiBzcyh0KXtpZighdHx8IXQubGVuZ3RoKXJldHVybltdO3ZhciBlPTA7cmV0dXJuIHQ9T2UodCwoZnVuY3Rpb24odCl7aWYoWnModCkpcmV0dXJuIGU9eG4odC5sZW5ndGgsZSksITB9KSksUWUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIFJlKHQsSGUoZSkpfSkpfWZ1bmN0aW9uIGFzKHQsZSl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm5bXTt2YXIgcj1zcyh0KTtyZXR1cm4gbnVsbD09ZT9yOlJlKHIsKGZ1bmN0aW9uKHQpe3JldHVybiBOZShlLG4sdCl9KSl9dmFyIHVzPVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBacyh0KT9wcih0LGUpOltdfSkpLGNzPVFyKChmdW5jdGlvbih0KXtyZXR1cm4gbWkoT2UodCxacykpfSkpLGxzPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KTtyZXR1cm4gWnMoZSkmJihlPW4pLG1pKE9lKHQsWnMpLGxvKGUsMikpfSkpLGhzPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KTtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4sbWkoT2UodCxacyksbixlKX0pKSxmcz1Rcihzcyk7dmFyIHBzPVFyKChmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aCxyPWU+MT90W2UtMV06bjtyZXR1cm4gcj0iZnVuY3Rpb24iPT10eXBlb2Ygcj8odC5wb3AoKSxyKTpuLGFzKHQscil9KSk7ZnVuY3Rpb24gZHModCl7dmFyIGU9cW4odCk7cmV0dXJuIGUuX19jaGFpbl9fPSEwLGV9ZnVuY3Rpb24gZ3ModCxlKXtyZXR1cm4gZSh0KX12YXIgeXM9aW8oKGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoLHI9ZT90WzBdOjAsaT10aGlzLl9fd3JhcHBlZF9fLG89ZnVuY3Rpb24oZSl7cmV0dXJuIHVyKGUsdCl9O3JldHVybiEoZT4xfHx0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCkmJmkgaW5zdGFuY2VvZiBYbiYmd28ocik/KChpPWkuc2xpY2UociwrcisoZT8xOjApKSkuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpncyxhcmdzOltvXSx0aGlzQXJnOm59KSxuZXcgWW4oaSx0aGlzLl9fY2hhaW5fXykudGhydSgoZnVuY3Rpb24odCl7cmV0dXJuIGUmJiF0Lmxlbmd0aCYmdC5wdXNoKG4pLHR9KSkpOnRoaXMudGhydShvKX0pKTt2YXIgbXM9T2koKGZ1bmN0aW9uKHQsZSxuKXtrdC5jYWxsKHQsbik/Kyt0W25dOmFyKHQsbiwxKX0pKTt2YXIgdnM9amkoWW8pLF9zPWppKFhvKTtmdW5jdGlvbiB4cyh0LGUpe3JldHVybihYcyh0KT9NZTpkcikodCxsbyhlLDMpKX1mdW5jdGlvbiB3cyh0LGUpe3JldHVybihYcyh0KT9GZTpncikodCxsbyhlLDMpKX12YXIgYnM9T2koKGZ1bmN0aW9uKHQsZSxuKXtrdC5jYWxsKHQsbik/dFtuXS5wdXNoKGUpOmFyKHQsbixbZV0pfSkpO3ZhciBEcz1RcigoZnVuY3Rpb24odCxlLG4pe3ZhciByPS0xLGk9ImZ1bmN0aW9uIj09dHlwZW9mIGUsbz1Icyh0KT9FdCh0Lmxlbmd0aCk6W107cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQpe29bKytyXT1pP05lKGUsdCxuKTpUcih0LGUsbil9KSksb30pKSxFcz1PaSgoZnVuY3Rpb24odCxlLG4pe2FyKHQsbixlKX0pKTtmdW5jdGlvbiBDcyh0LGUpe3JldHVybihYcyh0KT9SZTpVcikodCxsbyhlLDMpKX12YXIgU3M9T2koKGZ1bmN0aW9uKHQsZSxuKXt0W24/MDoxXS5wdXNoKGUpfSksKGZ1bmN0aW9uKCl7cmV0dXJuW1tdLFtdXX0pKTt2YXIgQXM9UXIoKGZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dClyZXR1cm5bXTt2YXIgbj1lLmxlbmd0aDtyZXR1cm4gbj4xJiZibyh0LGVbMF0sZVsxXSk/ZT1bXTpuPjImJmJvKGVbMF0sZVsxXSxlWzJdKSYmKGU9W2VbMF1dKSxYcih0LF9yKGUsMSksW10pfSkpLE5zPWRlfHxmdW5jdGlvbigpe3JldHVybiB5ZS5EYXRlLm5vdygpfTtmdW5jdGlvbiBJcyh0LGUscil7cmV0dXJuIGU9cj9uOmUsZT10JiZudWxsPT1lP3QubGVuZ3RoOmUsJGkodCxjLG4sbixuLG4sZSl9ZnVuY3Rpb24gTXModCxlKXt2YXIgaTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHQocik7cmV0dXJuIHQ9eWEodCksZnVuY3Rpb24oKXtyZXR1cm4tLXQ+MCYmKGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLHQ8PTEmJihlPW4pLGl9fXZhciBGcz1RcigoZnVuY3Rpb24odCxlLG4pe3ZhciByPTE7aWYobi5sZW5ndGgpe3ZhciBpPWZuKG4sY28oRnMpKTtyfD1hfXJldHVybiAkaSh0LHIsZSxuLGkpfSkpLFRzPVFyKChmdW5jdGlvbih0LGUsbil7dmFyIHI9MztpZihuLmxlbmd0aCl7dmFyIGk9Zm4obixjbyhUcykpO3J8PWF9cmV0dXJuICRpKGUscix0LG4saSl9KSk7ZnVuY3Rpb24gT3ModCxlLGkpe3ZhciBvLHMsYSx1LGMsbCxoPTAsZj0hMSxwPSExLGQ9ITA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO2Z1bmN0aW9uIGcoZSl7dmFyIHI9byxpPXM7cmV0dXJuIG89cz1uLGg9ZSx1PXQuYXBwbHkoaSxyKX1mdW5jdGlvbiB5KHQpe3ZhciByPXQtbDtyZXR1cm4gbD09PW58fHI+PWV8fHI8MHx8cCYmdC1oPj1hfWZ1bmN0aW9uIG0oKXt2YXIgdD1OcygpO2lmKHkodCkpcmV0dXJuIHYodCk7Yz1PbyhtLGZ1bmN0aW9uKHQpe3ZhciBuPWUtKHQtbCk7cmV0dXJuIHA/d24obixhLSh0LWgpKTpufSh0KSl9ZnVuY3Rpb24gdih0KXtyZXR1cm4gYz1uLGQmJm8/Zyh0KToobz1zPW4sdSl9ZnVuY3Rpb24gXygpe3ZhciB0PU5zKCkscj15KHQpO2lmKG89YXJndW1lbnRzLHM9dGhpcyxsPXQscil7aWYoYz09PW4pcmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBoPXQsYz1PbyhtLGUpLGY/Zyh0KTp1fShsKTtpZihwKXJldHVybiBFaShjKSxjPU9vKG0sZSksZyhsKX1yZXR1cm4gYz09PW4mJihjPU9vKG0sZSkpLHV9cmV0dXJuIGU9dmEoZSl8fDAsbmEoaSkmJihmPSEhaS5sZWFkaW5nLGE9KHA9Im1heFdhaXQiaW4gaSk/eG4odmEoaS5tYXhXYWl0KXx8MCxlKTphLGQ9InRyYWlsaW5nImluIGk/ISFpLnRyYWlsaW5nOmQpLF8uY2FuY2VsPWZ1bmN0aW9uKCl7YyE9PW4mJkVpKGMpLGg9MCxvPWw9cz1jPW59LF8uZmx1c2g9ZnVuY3Rpb24oKXtyZXR1cm4gYz09PW4/dTp2KE5zKCkpfSxffXZhciBMcz1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gZnIodCwxLGUpfSkpLFBzPVFyKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIGZyKHQsdmEoZSl8fDAsbil9KSk7ZnVuY3Rpb24gUnModCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR0KHIpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBzPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLHMpfHxvLHN9O3JldHVybiBuLmNhY2hlPW5ldyhScy5DYWNoZXx8Wm4pLG59ZnVuY3Rpb24gQnModCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4hdC5jYWxsKHRoaXMpO2Nhc2UgMTpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSk7Y2FzZSAyOnJldHVybiF0LmNhbGwodGhpcyxlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSxlWzFdLGVbMl0pfXJldHVybiF0LmFwcGx5KHRoaXMsZSl9fVJzLkNhY2hlPVpuO3ZhciBrcz1iaSgoZnVuY3Rpb24odCxlKXt2YXIgbj0oZT0xPT1lLmxlbmd0aCYmWHMoZVswXSk/UmUoZVswXSx0bihsbygpKSk6UmUoX3IoZSwxKSx0bihsbygpKSkpLmxlbmd0aDtyZXR1cm4gUXIoKGZ1bmN0aW9uKHIpe2Zvcih2YXIgaT0tMSxvPXduKHIubGVuZ3RoLG4pOysraTxvOylyW2ldPWVbaV0uY2FsbCh0aGlzLHJbaV0pO3JldHVybiBOZSh0LHRoaXMscil9KSl9KSksenM9UXIoKGZ1bmN0aW9uKHQsZSl7dmFyIHI9Zm4oZSxjbyh6cykpO3JldHVybiAkaSh0LGEsbixlLHIpfSkpLGpzPVFyKChmdW5jdGlvbih0LGUpe3ZhciByPWZuKGUsY28oanMpKTtyZXR1cm4gJGkodCx1LG4sZSxyKX0pKSxVcz1pbygoZnVuY3Rpb24odCxlKXtyZXR1cm4gJGkodCxsLG4sbixuLGUpfSkpO2Z1bmN0aW9uIHFzKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfXZhciBWcz1IaShOciksR3M9SGkoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+PWV9KSksWXM9T3IoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9PcjpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJmt0LmNhbGwodCwiY2FsbGVlIikmJiFKdC5jYWxsKHQsImNhbGxlZSIpfSxYcz1FdC5pc0FycmF5LFdzPWJlP3RuKGJlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJkFyKHQpPT1MfTtmdW5jdGlvbiBIcyh0KXtyZXR1cm4gbnVsbCE9dCYmZWEodC5sZW5ndGgpJiYhJHModCl9ZnVuY3Rpb24gWnModCl7cmV0dXJuIHJhKHQpJiZIcyh0KX12YXIgS3M9d2V8fHZ1LEpzPURlP3RuKERlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJkFyKHQpPT13fTtmdW5jdGlvbiBRcyh0KXtpZighcmEodCkpcmV0dXJuITE7dmFyIGU9QXIodCk7cmV0dXJuIGU9PWJ8fCJbb2JqZWN0IERPTUV4Y2VwdGlvbl0iPT1lfHwic3RyaW5nIj09dHlwZW9mIHQubWVzc2FnZSYmInN0cmluZyI9PXR5cGVvZiB0Lm5hbWUmJiFzYSh0KX1mdW5jdGlvbiAkcyh0KXtpZighbmEodCkpcmV0dXJuITE7dmFyIGU9QXIodCk7cmV0dXJuIGU9PUR8fGU9PUV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgUHJveHldIj09ZX1mdW5jdGlvbiB0YSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ9PXlhKHQpfWZ1bmN0aW9uIGVhKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD1mfWZ1bmN0aW9uIG5hKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfWZ1bmN0aW9uIHJhKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9dmFyIGlhPUVlP3RuKEVlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJm1vKHQpPT1DfTtmdW5jdGlvbiBvYSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fHJhKHQpJiZBcih0KT09U31mdW5jdGlvbiBzYSh0KXtpZighcmEodCl8fEFyKHQpIT1BKXJldHVybiExO3ZhciBlPVp0KHQpO2lmKG51bGw9PT1lKXJldHVybiEwO3ZhciBuPWt0LmNhbGwoZSwiY29uc3RydWN0b3IiKSYmZS5jb25zdHJ1Y3RvcjtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgbiYmbiBpbnN0YW5jZW9mIG4mJkJ0LmNhbGwobik9PXF0fXZhciBhYT1DZT90bihDZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZBcih0KT09SX07dmFyIHVhPVNlP3RuKFNlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJm1vKHQpPT1NfTtmdW5jdGlvbiBjYSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fCFYcyh0KSYmcmEodCkmJkFyKHQpPT1GfWZ1bmN0aW9uIGxhKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8cmEodCkmJkFyKHQpPT1UfXZhciBoYT1BZT90bihBZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZlYSh0Lmxlbmd0aCkmJiEhY2VbQXIodCldfTt2YXIgZmE9SGkoanIpLHBhPUhpKChmdW5jdGlvbih0LGUpe3JldHVybiB0PD1lfSkpO2Z1bmN0aW9uIGRhKHQpe2lmKCF0KXJldHVybltdO2lmKEhzKHQpKXJldHVybiBjYSh0KT9nbih0KTpGaSh0KTtpZih0ZSYmdFt0ZV0pcmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPVtdOyEoZT10Lm5leHQoKSkuZG9uZTspbi5wdXNoKGUudmFsdWUpO3JldHVybiBufSh0W3RlXSgpKTt2YXIgZT1tbyh0KTtyZXR1cm4oZT09Qz9sbjplPT1NP3BuOnFhKSh0KX1mdW5jdGlvbiBnYSh0KXtyZXR1cm4gdD8odD12YSh0KSk9PT1ofHx0PT09LWg/MTc5NzY5MzEzNDg2MjMxNTdlMjkyKih0PDA/LTE6MSk6dD09dD90OjA6MD09PXQ/dDowfWZ1bmN0aW9uIHlhKHQpe3ZhciBlPWdhKHQpLG49ZSUxO3JldHVybiBlPT1lP24/ZS1uOmU6MH1mdW5jdGlvbiBtYSh0KXtyZXR1cm4gdD9jcih5YSh0KSwwLGQpOjB9ZnVuY3Rpb24gdmEodCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0O2lmKGxhKHQpKXJldHVybiBwO2lmKG5hKHQpKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdC52YWx1ZU9mP3QudmFsdWVPZigpOnQ7dD1uYShlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9JGUodCk7dmFyIG49bXQudGVzdCh0KTtyZXR1cm4gbnx8X3QudGVzdCh0KT9wZSh0LnNsaWNlKDIpLG4/Mjo4KTp5dC50ZXN0KHQpP3A6K3R9ZnVuY3Rpb24gX2EodCl7cmV0dXJuIFRpKHQsTGEodCkpfWZ1bmN0aW9uIHhhKHQpe3JldHVybiBudWxsPT10PyIiOmhpKHQpfXZhciB3YT1MaSgoZnVuY3Rpb24odCxlKXtpZihTbyhlKXx8SHMoZSkpVGkoZSxPYShlKSx0KTtlbHNlIGZvcih2YXIgbiBpbiBlKWt0LmNhbGwoZSxuKSYmcnIodCxuLGVbbl0pfSkpLGJhPUxpKChmdW5jdGlvbih0LGUpe1RpKGUsTGEoZSksdCl9KSksRGE9TGkoKGZ1bmN0aW9uKHQsZSxuLHIpe1RpKGUsTGEoZSksdCxyKX0pKSxFYT1MaSgoZnVuY3Rpb24odCxlLG4scil7VGkoZSxPYShlKSx0LHIpfSkpLENhPWlvKHVyKTt2YXIgU2E9UXIoKGZ1bmN0aW9uKHQsZSl7dD1JdCh0KTt2YXIgcj0tMSxpPWUubGVuZ3RoLG89aT4yP2VbMl06bjtmb3IobyYmYm8oZVswXSxlWzFdLG8pJiYoaT0xKTsrK3I8aTspZm9yKHZhciBzPWVbcl0sYT1MYShzKSx1PS0xLGM9YS5sZW5ndGg7Kyt1PGM7KXt2YXIgbD1hW3VdLGg9dFtsXTsoaD09PW58fHFzKGgsUHRbbF0pJiYha3QuY2FsbCh0LGwpKSYmKHRbbF09c1tsXSl9cmV0dXJuIHR9KSksQWE9UXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnB1c2gobixlbyksTmUoUmEsbix0KX0pKTtmdW5jdGlvbiBOYSh0LGUscil7dmFyIGk9bnVsbD09dD9uOkNyKHQsZSk7cmV0dXJuIGk9PT1uP3I6aX1mdW5jdGlvbiBJYSh0LGUpe3JldHVybiBudWxsIT10JiZ2byh0LGUsTXIpfXZhciBNYT1WaSgoZnVuY3Rpb24odCxlLG4pe251bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nJiYoZT1VdC5jYWxsKGUpKSx0W2VdPW59KSxudShvdSkpLEZhPVZpKChmdW5jdGlvbih0LGUsbil7bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUudG9TdHJpbmcmJihlPVV0LmNhbGwoZSkpLGt0LmNhbGwodCxlKT90W2VdLnB1c2gobik6dFtlXT1bbl19KSxsbyksVGE9UXIoVHIpO2Z1bmN0aW9uIE9hKHQpe3JldHVybiBIcyh0KT9Rbih0KTprcih0KX1mdW5jdGlvbiBMYSh0KXtyZXR1cm4gSHModCk/UW4odCwhMCk6enIodCl9dmFyIFBhPUxpKChmdW5jdGlvbih0LGUsbil7R3IodCxlLG4pfSkpLFJhPUxpKChmdW5jdGlvbih0LGUsbixyKXtHcih0LGUsbixyKX0pKSxCYT1pbygoZnVuY3Rpb24odCxlKXt2YXIgbj17fTtpZihudWxsPT10KXJldHVybiBuO3ZhciByPSExO2U9UmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGU9d2koZSx0KSxyfHwocj1lLmxlbmd0aD4xKSxlfSkpLFRpKHQsc28odCksbiksciYmKG49bHIobiw3LG5vKSk7Zm9yKHZhciBpPWUubGVuZ3RoO2ktLTspcGkobixlW2ldKTtyZXR1cm4gbn0pKTt2YXIga2E9aW8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/e306ZnVuY3Rpb24odCxlKXtyZXR1cm4gV3IodCxlLChmdW5jdGlvbihlLG4pe3JldHVybiBJYSh0LG4pfSkpfSh0LGUpfSkpO2Z1bmN0aW9uIHphKHQsZSl7aWYobnVsbD09dClyZXR1cm57fTt2YXIgbj1SZShzbyh0KSwoZnVuY3Rpb24odCl7cmV0dXJuW3RdfSkpO3JldHVybiBlPWxvKGUpLFdyKHQsbiwoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh0LG5bMF0pfSkpfXZhciBqYT1RaShPYSksVWE9UWkoTGEpO2Z1bmN0aW9uIHFhKHQpe3JldHVybiBudWxsPT10P1tdOmVuKHQsT2EodCkpfXZhciBWYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiBlPWUudG9Mb3dlckNhc2UoKSx0KyhuP0dhKGUpOmUpfSkpO2Z1bmN0aW9uIEdhKHQpe3JldHVybiBRYSh4YSh0KS50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiBZYSh0KXtyZXR1cm4odD14YSh0KSkmJnQucmVwbGFjZSh3dCxzbikucmVwbGFjZShuZSwiIil9dmFyIFhhPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/Ii0iOiIiKStlLnRvTG93ZXJDYXNlKCl9KSksV2E9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iICI6IiIpK2UudG9Mb3dlckNhc2UoKX0pKSxIYT1CaSgidG9Mb3dlckNhc2UiKTt2YXIgWmE9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iXyI6IiIpK2UudG9Mb3dlckNhc2UoKX0pKTt2YXIgS2E9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iICI6IiIpK1FhKGUpfSkpO3ZhciBKYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyIgIjoiIikrZS50b1VwcGVyQ2FzZSgpfSkpLFFhPUJpKCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uICRhKHQsZSxyKXtyZXR1cm4gdD14YSh0KSwoZT1yP246ZSk9PT1uP2Z1bmN0aW9uKHQpe3JldHVybiBzZS50ZXN0KHQpfSh0KT9mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaChpZSl8fFtdfSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaChodCl8fFtdfSh0KTp0Lm1hdGNoKGUpfHxbXX12YXIgdHU9UXIoKGZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiBOZSh0LG4sZSl9Y2F0Y2godCl7cmV0dXJuIFFzKHQpP3Q6bmV3IFN0KHQpfX0pKSxldT1pbygoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWUoZSwoZnVuY3Rpb24oZSl7ZT16byhlKSxhcih0LGUsRnModFtlXSx0KSl9KSksdH0pKTtmdW5jdGlvbiBudSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIHJ1PVVpKCksaXU9VWkoITApO2Z1bmN0aW9uIG91KHQpe3JldHVybiB0fWZ1bmN0aW9uIHN1KHQpe3JldHVybiBCcigiZnVuY3Rpb24iPT10eXBlb2YgdD90OmxyKHQsMSkpfXZhciBhdT1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIFRyKG4sdCxlKX19KSksdXU9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBUcih0LG4sZSl9fSkpO2Z1bmN0aW9uIGN1KHQsZSxuKXt2YXIgcj1PYShlKSxpPUVyKGUscik7bnVsbD09biYmKCFuYShlKXx8IWkubGVuZ3RoJiZyLmxlbmd0aCkmJihuPWUsZT10LHQ9dGhpcyxpPUVyKGUsT2EoZSkpKTt2YXIgbz0hKG5hKG4pJiYiY2hhaW4iaW4gbiYmIW4uY2hhaW4pLHM9JHModCk7cmV0dXJuIE1lKGksKGZ1bmN0aW9uKG4pe3ZhciByPWVbbl07dFtuXT1yLHMmJih0LnByb3RvdHlwZVtuXT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX19jaGFpbl9fO2lmKG98fGUpe3ZhciBuPXQodGhpcy5fX3dyYXBwZWRfXyk7cmV0dXJuKG4uX19hY3Rpb25zX189RmkodGhpcy5fX2FjdGlvbnNfXykpLnB1c2goe2Z1bmM6cixhcmdzOmFyZ3VtZW50cyx0aGlzQXJnOnR9KSxuLl9fY2hhaW5fXz1lLG59cmV0dXJuIHIuYXBwbHkodCxCZShbdGhpcy52YWx1ZSgpXSxhcmd1bWVudHMpKX0pfSkpLHR9ZnVuY3Rpb24gbHUoKXt9dmFyIGh1PVlpKFJlKSxmdT1ZaShUZSkscHU9WWkoamUpO2Z1bmN0aW9uIGR1KHQpe3JldHVybiBEbyh0KT9IZSh6byh0KSk6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBDcihlLHQpfX0odCl9dmFyIGd1PVdpKCkseXU9V2koITApO2Z1bmN0aW9uIG11KCl7cmV0dXJuW119ZnVuY3Rpb24gdnUoKXtyZXR1cm4hMX12YXIgX3U9R2koKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0pLDApLHh1PUtpKCJjZWlsIiksd3U9R2koKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQvZX0pLDEpLGJ1PUtpKCJmbG9vciIpO3ZhciBEdT1HaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCplfSksMSksRXU9S2koInJvdW5kIiksQ3U9R2koKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pLDApO3JldHVybiBxbi5hZnRlcj1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUdChyKTtyZXR1cm4gdD15YSh0KSxmdW5jdGlvbigpe2lmKC0tdDwxKXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LHFuLmFyeT1Jcyxxbi5hc3NpZ249d2EscW4uYXNzaWduSW49YmEscW4uYXNzaWduSW5XaXRoPURhLHFuLmFzc2lnbldpdGg9RWEscW4uYXQ9Q2EscW4uYmVmb3JlPU1zLHFuLmJpbmQ9RnMscW4uYmluZEFsbD1ldSxxbi5iaW5kS2V5PVRzLHFuLmNhc3RBcnJheT1mdW5jdGlvbigpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltdO3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gWHModCk/dDpbdF19LHFuLmNoYWluPWRzLHFuLmNodW5rPWZ1bmN0aW9uKHQsZSxyKXtlPShyP2JvKHQsZSxyKTplPT09bik/MTp4bih5YShlKSwwKTt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7aWYoIWl8fGU8MSlyZXR1cm5bXTtmb3IodmFyIG89MCxzPTAsYT1FdChtZShpL2UpKTtvPGk7KWFbcysrXT1vaSh0LG8sbys9ZSk7cmV0dXJuIGF9LHFuLmNvbXBhY3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLHI9MCxpPVtdOysrZTxuOyl7dmFyIG89dFtlXTtvJiYoaVtyKytdPW8pfXJldHVybiBpfSxxbi5jb25jYXQ9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO2lmKCF0KXJldHVybltdO2Zvcih2YXIgZT1FdCh0LTEpLG49YXJndW1lbnRzWzBdLHI9dDtyLS07KWVbci0xXT1hcmd1bWVudHNbcl07cmV0dXJuIEJlKFhzKG4pP0ZpKG4pOltuXSxfcihlLDEpKX0scW4uY29uZD1mdW5jdGlvbih0KXt2YXIgZT1udWxsPT10PzA6dC5sZW5ndGgsbj1sbygpO3JldHVybiB0PWU/UmUodCwoZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHRbMV0pdGhyb3cgbmV3IFR0KHIpO3JldHVybltuKHRbMF0pLHRbMV1dfSkpOltdLFFyKChmdW5jdGlvbihuKXtmb3IodmFyIHI9LTE7KytyPGU7KXt2YXIgaT10W3JdO2lmKE5lKGlbMF0sdGhpcyxuKSlyZXR1cm4gTmUoaVsxXSx0aGlzLG4pfX0pKX0scW4uY29uZm9ybXM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPU9hKHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gaHIobix0LGUpfX0obHIodCwxKSl9LHFuLmNvbnN0YW50PW51LHFuLmNvdW50Qnk9bXMscW4uY3JlYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49Vm4odCk7cmV0dXJuIG51bGw9PWU/bjpzcihuLGUpfSxxbi5jdXJyeT1mdW5jdGlvbiB0KGUscixpKXt2YXIgbz0kaShlLDgsbixuLG4sbixuLHI9aT9uOnIpO3JldHVybiBvLnBsYWNlaG9sZGVyPXQucGxhY2Vob2xkZXIsb30scW4uY3VycnlSaWdodD1mdW5jdGlvbiB0KGUscixpKXt2YXIgbz0kaShlLHMsbixuLG4sbixuLHI9aT9uOnIpO3JldHVybiBvLnBsYWNlaG9sZGVyPXQucGxhY2Vob2xkZXIsb30scW4uZGVib3VuY2U9T3MscW4uZGVmYXVsdHM9U2EscW4uZGVmYXVsdHNEZWVwPUFhLHFuLmRlZmVyPUxzLHFuLmRlbGF5PVBzLHFuLmRpZmZlcmVuY2U9cW8scW4uZGlmZmVyZW5jZUJ5PVZvLHFuLmRpZmZlcmVuY2VXaXRoPUdvLHFuLmRyb3A9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gaT9vaSh0LChlPXJ8fGU9PT1uPzE6eWEoZSkpPDA/MDplLGkpOltdfSxxbi5kcm9wUmlnaHQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gaT9vaSh0LDAsKGU9aS0oZT1yfHxlPT09bj8xOnlhKGUpKSk8MD8wOmUpOltdfSxxbi5kcm9wUmlnaHRXaGlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9naSh0LGxvKGUsMyksITAsITApOltdfSxxbi5kcm9wV2hpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Z2kodCxsbyhlLDMpLCEwKTpbXX0scW4uZmlsbD1mdW5jdGlvbih0LGUscixpKXt2YXIgbz1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIG8/KHImJiJudW1iZXIiIT10eXBlb2YgciYmYm8odCxlLHIpJiYocj0wLGk9byksZnVuY3Rpb24odCxlLHIsaSl7dmFyIG89dC5sZW5ndGg7Zm9yKChyPXlhKHIpKTwwJiYocj0tcj5vPzA6bytyKSwoaT1pPT09bnx8aT5vP286eWEoaSkpPDAmJihpKz1vKSxpPXI+aT8wOm1hKGkpO3I8aTspdFtyKytdPWU7cmV0dXJuIHR9KHQsZSxyLGkpKTpbXX0scW4uZmlsdGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKFhzKHQpP09lOnZyKSh0LGxvKGUsMykpfSxxbi5mbGF0TWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIF9yKENzKHQsZSksMSl9LHFuLmZsYXRNYXBEZWVwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIF9yKENzKHQsZSksaCl9LHFuLmZsYXRNYXBEZXB0aD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHI9cj09PW4/MTp5YShyKSxfcihDcyh0LGUpLHIpfSxxbi5mbGF0dGVuPVdvLHFuLmZsYXR0ZW5EZWVwPWZ1bmN0aW9uKHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP19yKHQsaCk6W119LHFuLmZsYXR0ZW5EZXB0aD1mdW5jdGlvbih0LGUpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP19yKHQsZT1lPT09bj8xOnlhKGUpKTpbXX0scW4uZmxpcD1mdW5jdGlvbih0KXtyZXR1cm4gJGkodCw1MTIpfSxxbi5mbG93PXJ1LHFuLmZsb3dSaWdodD1pdSxxbi5mcm9tUGFpcnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLHI9e307KytlPG47KXt2YXIgaT10W2VdO3JbaVswXV09aVsxXX1yZXR1cm4gcn0scW4uZnVuY3Rpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOkVyKHQsT2EodCkpfSxxbi5mdW5jdGlvbnNJbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXTpFcih0LExhKHQpKX0scW4uZ3JvdXBCeT1icyxxbi5pbml0aWFsPWZ1bmN0aW9uKHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP29pKHQsMCwtMSk6W119LHFuLmludGVyc2VjdGlvbj1abyxxbi5pbnRlcnNlY3Rpb25CeT1Lbyxxbi5pbnRlcnNlY3Rpb25XaXRoPUpvLHFuLmludmVydD1NYSxxbi5pbnZlcnRCeT1GYSxxbi5pbnZva2VNYXA9RHMscW4uaXRlcmF0ZWU9c3UscW4ua2V5Qnk9RXMscW4ua2V5cz1PYSxxbi5rZXlzSW49TGEscW4ubWFwPUNzLHFuLm1hcEtleXM9ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtyZXR1cm4gZT1sbyhlLDMpLGJyKHQsKGZ1bmN0aW9uKHQscixpKXthcihuLGUodCxyLGkpLHQpfSkpLG59LHFuLm1hcFZhbHVlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXt9O3JldHVybiBlPWxvKGUsMyksYnIodCwoZnVuY3Rpb24odCxyLGkpe2FyKG4scixlKHQscixpKSl9KSksbn0scW4ubWF0Y2hlcz1mdW5jdGlvbih0KXtyZXR1cm4gcXIobHIodCwxKSl9LHFuLm1hdGNoZXNQcm9wZXJ0eT1mdW5jdGlvbih0LGUpe3JldHVybiBWcih0LGxyKGUsMSkpfSxxbi5tZW1vaXplPVJzLHFuLm1lcmdlPVBhLHFuLm1lcmdlV2l0aD1SYSxxbi5tZXRob2Q9YXUscW4ubWV0aG9kT2Y9dXUscW4ubWl4aW49Y3UscW4ubmVnYXRlPUJzLHFuLm50aEFyZz1mdW5jdGlvbih0KXtyZXR1cm4gdD15YSh0KSxRcigoZnVuY3Rpb24oZSl7cmV0dXJuIFlyKGUsdCl9KSl9LHFuLm9taXQ9QmEscW4ub21pdEJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHphKHQsQnMobG8oZSkpKX0scW4ub25jZT1mdW5jdGlvbih0KXtyZXR1cm4gTXMoMix0KX0scW4ub3JkZXJCeT1mdW5jdGlvbih0LGUscixpKXtyZXR1cm4gbnVsbD09dD9bXTooWHMoZSl8fChlPW51bGw9PWU/W106W2VdKSxYcyhyPWk/bjpyKXx8KHI9bnVsbD09cj9bXTpbcl0pLFhyKHQsZSxyKSl9LHFuLm92ZXI9aHUscW4ub3ZlckFyZ3M9a3MscW4ub3ZlckV2ZXJ5PWZ1LHFuLm92ZXJTb21lPXB1LHFuLnBhcnRpYWw9enMscW4ucGFydGlhbFJpZ2h0PWpzLHFuLnBhcnRpdGlvbj1Tcyxxbi5waWNrPWthLHFuLnBpY2tCeT16YSxxbi5wcm9wZXJ0eT1kdSxxbi5wcm9wZXJ0eU9mPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09dD9uOkNyKHQsZSl9fSxxbi5wdWxsPSRvLHFuLnB1bGxBbGw9dHMscW4ucHVsbEFsbEJ5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCYmdC5sZW5ndGgmJmUmJmUubGVuZ3RoP0hyKHQsZSxsbyhuLDIpKTp0fSxxbi5wdWxsQWxsV2l0aD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQmJnQubGVuZ3RoJiZlJiZlLmxlbmd0aD9Icih0LGUsbixyKTp0fSxxbi5wdWxsQXQ9ZXMscW4ucmFuZ2U9Z3UscW4ucmFuZ2VSaWdodD15dSxxbi5yZWFyZz1Vcyxxbi5yZWplY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4oWHModCk/T2U6dnIpKHQsQnMobG8oZSwzKSkpfSxxbi5yZW1vdmU9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXTtpZighdHx8IXQubGVuZ3RoKXJldHVybiBuO3ZhciByPS0xLGk9W10sbz10Lmxlbmd0aDtmb3IoZT1sbyhlLDMpOysrcjxvOyl7dmFyIHM9dFtyXTtlKHMscix0KSYmKG4ucHVzaChzKSxpLnB1c2gocikpfXJldHVybiBacih0LGkpLG59LHFuLnJlc3Q9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIFFyKHQsZT1lPT09bj9lOnlhKGUpKX0scW4ucmV2ZXJzZT1ucyxxbi5zYW1wbGVTaXplPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZT0ocj9ibyh0LGUscik6ZT09PW4pPzE6eWEoZSksKFhzKHQpP3RyOnRpKSh0LGUpfSxxbi5zZXQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT10P3Q6ZWkodCxlLG4pfSxxbi5zZXRXaXRoPWZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiBpP2k6bixudWxsPT10P3Q6ZWkodCxlLHIsaSl9LHFuLnNodWZmbGU9ZnVuY3Rpb24odCl7cmV0dXJuKFhzKHQpP2VyOmlpKSh0KX0scW4uc2xpY2U9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gaT8ociYmIm51bWJlciIhPXR5cGVvZiByJiZibyh0LGUscik/KGU9MCxyPWkpOihlPW51bGw9PWU/MDp5YShlKSxyPXI9PT1uP2k6eWEocikpLG9pKHQsZSxyKSk6W119LHFuLnNvcnRCeT1Bcyxxbi5zb3J0ZWRVbmlxPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9jaSh0KTpbXX0scW4uc29ydGVkVW5pcUJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2NpKHQsbG8oZSwyKSk6W119LHFuLnNwbGl0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gciYmIm51bWJlciIhPXR5cGVvZiByJiZibyh0LGUscikmJihlPXI9biksKHI9cj09PW4/ZDpyPj4+MCk/KHQ9eGEodCkpJiYoInN0cmluZyI9PXR5cGVvZiBlfHxudWxsIT1lJiYhYWEoZSkpJiYoIShlPWhpKGUpKSYmY24odCkpP0RpKGduKHQpLDAscik6dC5zcGxpdChlLHIpOltdfSxxbi5zcHJlYWQ9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIGU9bnVsbD09ZT8wOnhuKHlhKGUpLDApLFFyKChmdW5jdGlvbihuKXt2YXIgcj1uW2VdLGk9RGkobiwwLGUpO3JldHVybiByJiZCZShpLHIpLE5lKHQsdGhpcyxpKX0pKX0scW4udGFpbD1mdW5jdGlvbih0KXt2YXIgZT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGU/b2kodCwxLGUpOltdfSxxbi50YWtlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdCYmdC5sZW5ndGg/b2kodCwwLChlPXJ8fGU9PT1uPzE6eWEoZSkpPDA/MDplKTpbXX0scW4udGFrZVJpZ2h0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGk/b2kodCwoZT1pLShlPXJ8fGU9PT1uPzE6eWEoZSkpKTwwPzA6ZSxpKTpbXX0scW4udGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Z2kodCxsbyhlLDMpLCExLCEwKTpbXX0scW4udGFrZVdoaWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2dpKHQsbG8oZSwzKSk6W119LHFuLnRhcD1mdW5jdGlvbih0LGUpe3JldHVybiBlKHQpLHR9LHFuLnRocm90dGxlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0hMCxvPSEwO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gbmEobikmJihpPSJsZWFkaW5nImluIG4/ISFuLmxlYWRpbmc6aSxvPSJ0cmFpbGluZyJpbiBuPyEhbi50cmFpbGluZzpvKSxPcyh0LGUse2xlYWRpbmc6aSxtYXhXYWl0OmUsdHJhaWxpbmc6b30pfSxxbi50aHJ1PWdzLHFuLnRvQXJyYXk9ZGEscW4udG9QYWlycz1qYSxxbi50b1BhaXJzSW49VWEscW4udG9QYXRoPWZ1bmN0aW9uKHQpe3JldHVybiBYcyh0KT9SZSh0LHpvKTpsYSh0KT9bdF06Rmkoa28oeGEodCkpKX0scW4udG9QbGFpbk9iamVjdD1fYSxxbi50cmFuc2Zvcm09ZnVuY3Rpb24odCxlLG4pe3ZhciByPVhzKHQpLGk9cnx8S3ModCl8fGhhKHQpO2lmKGU9bG8oZSw0KSxudWxsPT1uKXt2YXIgbz10JiZ0LmNvbnN0cnVjdG9yO249aT9yP25ldyBvOltdOm5hKHQpJiYkcyhvKT9WbihadCh0KSk6e319cmV0dXJuKGk/TWU6YnIpKHQsKGZ1bmN0aW9uKHQscixpKXtyZXR1cm4gZShuLHQscixpKX0pKSxufSxxbi51bmFyeT1mdW5jdGlvbih0KXtyZXR1cm4gSXModCwxKX0scW4udW5pb249cnMscW4udW5pb25CeT1pcyxxbi51bmlvbldpdGg9b3MscW4udW5pcT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/ZmkodCk6W119LHFuLnVuaXFCeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9maSh0LGxvKGUsMikpOltdfSxxbi51bmlxV2l0aD1mdW5jdGlvbih0LGUpe3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bix0JiZ0Lmxlbmd0aD9maSh0LG4sZSk6W119LHFuLnVuc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXR8fHBpKHQsZSl9LHFuLnVuemlwPXNzLHFuLnVuemlwV2l0aD1hcyxxbi51cGRhdGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT10P3Q6ZGkodCxlLHhpKG4pKX0scW4udXBkYXRlV2l0aD1mdW5jdGlvbih0LGUscixpKXtyZXR1cm4gaT0iZnVuY3Rpb24iPT10eXBlb2YgaT9pOm4sbnVsbD09dD90OmRpKHQsZSx4aShyKSxpKX0scW4udmFsdWVzPXFhLHFuLnZhbHVlc0luPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOmVuKHQsTGEodCkpfSxxbi53aXRob3V0PXVzLHFuLndvcmRzPSRhLHFuLndyYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4genMoeGkoZSksdCl9LHFuLnhvcj1jcyxxbi54b3JCeT1scyxxbi54b3JXaXRoPWhzLHFuLnppcD1mcyxxbi56aXBPYmplY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdmkodHx8W10sZXx8W10scnIpfSxxbi56aXBPYmplY3REZWVwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZpKHR8fFtdLGV8fFtdLGVpKX0scW4uemlwV2l0aD1wcyxxbi5lbnRyaWVzPWphLHFuLmVudHJpZXNJbj1VYSxxbi5leHRlbmQ9YmEscW4uZXh0ZW5kV2l0aD1EYSxjdShxbixxbikscW4uYWRkPV91LHFuLmF0dGVtcHQ9dHUscW4uY2FtZWxDYXNlPVZhLHFuLmNhcGl0YWxpemU9R2EscW4uY2VpbD14dSxxbi5jbGFtcD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHI9PT1uJiYocj1lLGU9biksciE9PW4mJihyPShyPXZhKHIpKT09cj9yOjApLGUhPT1uJiYoZT0oZT12YShlKSk9PWU/ZTowKSxjcih2YSh0KSxlLHIpfSxxbi5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gbHIodCw0KX0scW4uY2xvbmVEZWVwPWZ1bmN0aW9uKHQpe3JldHVybiBscih0LDUpfSxxbi5jbG9uZURlZXBXaXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGxyKHQsNSxlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bil9LHFuLmNsb25lV2l0aD1mdW5jdGlvbih0LGUpe3JldHVybiBscih0LDQsZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4pfSxxbi5jb25mb3Jtc1RvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PWV8fGhyKHQsZSxPYShlKSl9LHFuLmRlYnVycj1ZYSxxbi5kZWZhdWx0VG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dHx8dCE9dD9lOnR9LHFuLmRpdmlkZT13dSxxbi5lbmRzV2l0aD1mdW5jdGlvbih0LGUscil7dD14YSh0KSxlPWhpKGUpO3ZhciBpPXQubGVuZ3RoLG89cj1yPT09bj9pOmNyKHlhKHIpLDAsaSk7cmV0dXJuKHItPWUubGVuZ3RoKT49MCYmdC5zbGljZShyLG8pPT1lfSxxbi5lcT1xcyxxbi5lc2NhcGU9ZnVuY3Rpb24odCl7cmV0dXJuKHQ9eGEodCkpJiZKLnRlc3QodCk/dC5yZXBsYWNlKFosYW4pOnR9LHFuLmVzY2FwZVJlZ0V4cD1mdW5jdGlvbih0KXtyZXR1cm4odD14YSh0KSkmJm90LnRlc3QodCk/dC5yZXBsYWNlKGl0LCJcXCQmIik6dH0scW4uZXZlcnk9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPVhzKHQpP1RlOnlyO3JldHVybiByJiZibyh0LGUscikmJihlPW4pLGkodCxsbyhlLDMpKX0scW4uZmluZD12cyxxbi5maW5kSW5kZXg9WW8scW4uZmluZEtleT1mdW5jdGlvbih0LGUpe3JldHVybiBxZSh0LGxvKGUsMyksYnIpfSxxbi5maW5kTGFzdD1fcyxxbi5maW5kTGFzdEluZGV4PVhvLHFuLmZpbmRMYXN0S2V5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHFlKHQsbG8oZSwzKSxEcil9LHFuLmZsb29yPWJ1LHFuLmZvckVhY2g9eHMscW4uZm9yRWFjaFJpZ2h0PXdzLHFuLmZvckluPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dDp4cih0LGxvKGUsMyksTGEpfSxxbi5mb3JJblJpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dDp3cih0LGxvKGUsMyksTGEpfSxxbi5mb3JPd249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmYnIodCxsbyhlLDMpKX0scW4uZm9yT3duUmlnaHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmRHIodCxsbyhlLDMpKX0scW4uZ2V0PU5hLHFuLmd0PVZzLHFuLmd0ZT1Hcyxxbi5oYXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmdm8odCxlLElyKX0scW4uaGFzSW49SWEscW4uaGVhZD1Ibyxxbi5pZGVudGl0eT1vdSxxbi5pbmNsdWRlcz1mdW5jdGlvbih0LGUsbixyKXt0PUhzKHQpP3Q6cWEodCksbj1uJiYhcj95YShuKTowO3ZhciBpPXQubGVuZ3RoO3JldHVybiBuPDAmJihuPXhuKGkrbiwwKSksY2EodCk/bjw9aSYmdC5pbmRleE9mKGUsbik+LTE6ISFpJiZHZSh0LGUsbik+LTF9LHFuLmluZGV4T2Y9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgaT1udWxsPT1uPzA6eWEobik7cmV0dXJuIGk8MCYmKGk9eG4ocitpLDApKSxHZSh0LGUsaSl9LHFuLmluUmFuZ2U9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPWdhKGUpLHI9PT1uPyhyPWUsZT0wKTpyPWdhKHIpLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD49d24oZSxuKSYmdDx4bihlLG4pfSh0PXZhKHQpLGUscil9LHFuLmludm9rZT1UYSxxbi5pc0FyZ3VtZW50cz1Zcyxxbi5pc0FycmF5PVhzLHFuLmlzQXJyYXlCdWZmZXI9V3MscW4uaXNBcnJheUxpa2U9SHMscW4uaXNBcnJheUxpa2VPYmplY3Q9WnMscW4uaXNCb29sZWFuPWZ1bmN0aW9uKHQpe3JldHVybiEwPT09dHx8ITE9PT10fHxyYSh0KSYmQXIodCk9PXh9LHFuLmlzQnVmZmVyPUtzLHFuLmlzRGF0ZT1Kcyxxbi5pc0VsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiYxPT09dC5ub2RlVHlwZSYmIXNhKHQpfSxxbi5pc0VtcHR5PWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuITA7aWYoSHModCkmJihYcyh0KXx8InN0cmluZyI9PXR5cGVvZiB0fHwiZnVuY3Rpb24iPT10eXBlb2YgdC5zcGxpY2V8fEtzKHQpfHxoYSh0KXx8WXModCkpKXJldHVybiF0Lmxlbmd0aDt2YXIgZT1tbyh0KTtpZihlPT1DfHxlPT1NKXJldHVybiF0LnNpemU7aWYoU28odCkpcmV0dXJuIWtyKHQpLmxlbmd0aDtmb3IodmFyIG4gaW4gdClpZihrdC5jYWxsKHQsbikpcmV0dXJuITE7cmV0dXJuITB9LHFuLmlzRXF1YWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTHIodCxlKX0scW4uaXNFcXVhbFdpdGg9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPShyPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6bik/cih0LGUpOm47cmV0dXJuIGk9PT1uP0xyKHQsZSxuLHIpOiEhaX0scW4uaXNFcnJvcj1Rcyxxbi5pc0Zpbml0ZT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJlVlKHQpfSxxbi5pc0Z1bmN0aW9uPSRzLHFuLmlzSW50ZWdlcj10YSxxbi5pc0xlbmd0aD1lYSxxbi5pc01hcD1pYSxxbi5pc01hdGNoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxQcih0LGUsZm8oZSkpfSxxbi5pc01hdGNoV2l0aD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHI9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpuLFByKHQsZSxmbyhlKSxyKX0scW4uaXNOYU49ZnVuY3Rpb24odCl7cmV0dXJuIG9hKHQpJiZ0IT0rdH0scW4uaXNOYXRpdmU9ZnVuY3Rpb24odCl7aWYoQ28odCkpdGhyb3cgbmV3IFN0KCJVbnN1cHBvcnRlZCBjb3JlLWpzIHVzZS4gVHJ5IGh0dHBzOi8vbnBtcy5pby9zZWFyY2g/cT1wb255ZmlsbC4iKTtyZXR1cm4gUnIodCl9LHFuLmlzTmlsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fSxxbi5pc051bGw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10fSxxbi5pc051bWJlcj1vYSxxbi5pc09iamVjdD1uYSxxbi5pc09iamVjdExpa2U9cmEscW4uaXNQbGFpbk9iamVjdD1zYSxxbi5pc1JlZ0V4cD1hYSxxbi5pc1NhZmVJbnRlZ2VyPWZ1bmN0aW9uKHQpe3JldHVybiB0YSh0KSYmdD49LWYmJnQ8PWZ9LHFuLmlzU2V0PXVhLHFuLmlzU3RyaW5nPWNhLHFuLmlzU3ltYm9sPWxhLHFuLmlzVHlwZWRBcnJheT1oYSxxbi5pc1VuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PW59LHFuLmlzV2Vha01hcD1mdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJm1vKHQpPT1PfSxxbi5pc1dlYWtTZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiYiW29iamVjdCBXZWFrU2V0XSI9PUFyKHQpfSxxbi5qb2luPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/IiI6WmUuY2FsbCh0LGUpfSxxbi5rZWJhYkNhc2U9WGEscW4ubGFzdD1Rbyxxbi5sYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFpKXJldHVybi0xO3ZhciBvPWk7cmV0dXJuIHIhPT1uJiYobz0obz15YShyKSk8MD94bihpK28sMCk6d24obyxpLTEpKSxlPT1lP2Z1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bisxO3ItLTspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuIHJ9KHQsZSxvKTpWZSh0LFhlLG8sITApfSxxbi5sb3dlckNhc2U9V2EscW4ubG93ZXJGaXJzdD1IYSxxbi5sdD1mYSxxbi5sdGU9cGEscW4ubWF4PWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9tcih0LG91LE5yKTpufSxxbi5tYXhCeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9tcih0LGxvKGUsMiksTnIpOm59LHFuLm1lYW49ZnVuY3Rpb24odCl7cmV0dXJuIFdlKHQsb3UpfSxxbi5tZWFuQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gV2UodCxsbyhlLDIpKX0scW4ubWluPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9tcih0LG91LGpyKTpufSxxbi5taW5CeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9tcih0LGxvKGUsMiksanIpOm59LHFuLnN0dWJBcnJheT1tdSxxbi5zdHViRmFsc2U9dnUscW4uc3R1Yk9iamVjdD1mdW5jdGlvbigpe3JldHVybnt9fSxxbi5zdHViU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIiJ9LHFuLnN0dWJUcnVlPWZ1bmN0aW9uKCl7cmV0dXJuITB9LHFuLm11bHRpcGx5PUR1LHFuLm50aD1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9Zcih0LHlhKGUpKTpufSxxbi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHllLl89PT10aGlzJiYoeWUuXz1WdCksdGhpc30scW4ubm9vcD1sdSxxbi5ub3c9TnMscW4ucGFkPWZ1bmN0aW9uKHQsZSxuKXt0PXhhKHQpO3ZhciByPShlPXlhKGUpKT9kbih0KTowO2lmKCFlfHxyPj1lKXJldHVybiB0O3ZhciBpPShlLXIpLzI7cmV0dXJuIFhpKHZlKGkpLG4pK3QrWGkobWUoaSksbil9LHFuLnBhZEVuZD1mdW5jdGlvbih0LGUsbil7dD14YSh0KTt2YXIgcj0oZT15YShlKSk/ZG4odCk6MDtyZXR1cm4gZSYmcjxlP3QrWGkoZS1yLG4pOnR9LHFuLnBhZFN0YXJ0PWZ1bmN0aW9uKHQsZSxuKXt0PXhhKHQpO3ZhciByPShlPXlhKGUpKT9kbih0KTowO3JldHVybiBlJiZyPGU/WGkoZS1yLG4pK3Q6dH0scW4ucGFyc2VJbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBufHxudWxsPT1lP2U9MDplJiYoZT0rZSksRG4oeGEodCkucmVwbGFjZShzdCwiIiksZXx8MCl9LHFuLnJhbmRvbT1mdW5jdGlvbih0LGUscil7aWYociYmImJvb2xlYW4iIT10eXBlb2YgciYmYm8odCxlLHIpJiYoZT1yPW4pLHI9PT1uJiYoImJvb2xlYW4iPT10eXBlb2YgZT8ocj1lLGU9bik6ImJvb2xlYW4iPT10eXBlb2YgdCYmKHI9dCx0PW4pKSx0PT09biYmZT09PW4/KHQ9MCxlPTEpOih0PWdhKHQpLGU9PT1uPyhlPXQsdD0wKTplPWdhKGUpKSx0PmUpe3ZhciBpPXQ7dD1lLGU9aX1pZihyfHx0JTF8fGUlMSl7dmFyIG89RW4oKTtyZXR1cm4gd24odCtvKihlLXQrZmUoIjFlLSIrKChvKyIiKS5sZW5ndGgtMSkpKSxlKX1yZXR1cm4gS3IodCxlKX0scW4ucmVkdWNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1Ycyh0KT9rZTpLZSxpPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gcih0LGxvKGUsNCksbixpLGRyKX0scW4ucmVkdWNlUmlnaHQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVhzKHQpP3plOktlLGk9YXJndW1lbnRzLmxlbmd0aDwzO3JldHVybiByKHQsbG8oZSw0KSxuLGksZ3IpfSxxbi5yZXBlYXQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPShyP2JvKHQsZSxyKTplPT09bik/MTp5YShlKSxKcih4YSh0KSxlKX0scW4ucmVwbGFjZT1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxlPXhhKHRbMF0pO3JldHVybiB0Lmxlbmd0aDwzP2U6ZS5yZXBsYWNlKHRbMV0sdFsyXSl9LHFuLnJlc3VsdD1mdW5jdGlvbih0LGUscil7dmFyIGk9LTEsbz0oZT13aShlLHQpKS5sZW5ndGg7Zm9yKG98fChvPTEsdD1uKTsrK2k8bzspe3ZhciBzPW51bGw9PXQ/bjp0W3pvKGVbaV0pXTtzPT09biYmKGk9byxzPXIpLHQ9JHMocyk/cy5jYWxsKHQpOnN9cmV0dXJuIHR9LHFuLnJvdW5kPUV1LHFuLnJ1bkluQ29udGV4dD10LHFuLnNhbXBsZT1mdW5jdGlvbih0KXtyZXR1cm4oWHModCk/JG46JHIpKHQpfSxxbi5zaXplPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIDA7aWYoSHModCkpcmV0dXJuIGNhKHQpP2RuKHQpOnQubGVuZ3RoO3ZhciBlPW1vKHQpO3JldHVybiBlPT1DfHxlPT1NP3Quc2l6ZTprcih0KS5sZW5ndGh9LHFuLnNuYWtlQ2FzZT1aYSxxbi5zb21lPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1Ycyh0KT9qZTpzaTtyZXR1cm4gciYmYm8odCxlLHIpJiYoZT1uKSxpKHQsbG8oZSwzKSl9LHFuLnNvcnRlZEluZGV4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFpKHQsZSl9LHFuLnNvcnRlZEluZGV4Qnk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1aSh0LGUsbG8obiwyKSl9LHFuLnNvcnRlZEluZGV4T2Y9ZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7aWYobil7dmFyIHI9YWkodCxlKTtpZihyPG4mJnFzKHRbcl0sZSkpcmV0dXJuIHJ9cmV0dXJuLTF9LHFuLnNvcnRlZExhc3RJbmRleD1mdW5jdGlvbih0LGUpe3JldHVybiBhaSh0LGUsITApfSxxbi5zb3J0ZWRMYXN0SW5kZXhCeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHVpKHQsZSxsbyhuLDIpLCEwKX0scW4uc29ydGVkTGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlKXtpZihudWxsPT10PzA6dC5sZW5ndGgpe3ZhciBuPWFpKHQsZSwhMCktMTtpZihxcyh0W25dLGUpKXJldHVybiBufXJldHVybi0xfSxxbi5zdGFydENhc2U9S2EscW4uc3RhcnRzV2l0aD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9eGEodCksbj1udWxsPT1uPzA6Y3IoeWEobiksMCx0Lmxlbmd0aCksZT1oaShlKSx0LnNsaWNlKG4sbitlLmxlbmd0aCk9PWV9LHFuLnN1YnRyYWN0PUN1LHFuLnN1bT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/SmUodCxvdSk6MH0scW4uc3VtQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/SmUodCxsbyhlLDIpKTowfSxxbi50ZW1wbGF0ZT1mdW5jdGlvbih0LGUscil7dmFyIGk9cW4udGVtcGxhdGVTZXR0aW5ncztyJiZibyh0LGUscikmJihlPW4pLHQ9eGEodCksZT1EYSh7fSxlLGksdG8pO3ZhciBvLHMsYT1EYSh7fSxlLmltcG9ydHMsaS5pbXBvcnRzLHRvKSx1PU9hKGEpLGM9ZW4oYSx1KSxsPTAsaD1lLmludGVycG9sYXRlfHxidCxmPSJfX3AgKz0gJyIscD1NdCgoZS5lc2NhcGV8fGJ0KS5zb3VyY2UrInwiK2guc291cmNlKyJ8IisoaD09PXR0P2R0OmJ0KS5zb3VyY2UrInwiKyhlLmV2YWx1YXRlfHxidCkuc291cmNlKyJ8JCIsImciKSxkPSIvLyMgc291cmNlVVJMPSIrKGt0LmNhbGwoZSwic291cmNlVVJMIik/KGUuc291cmNlVVJMKyIiKS5yZXBsYWNlKC9ccy9nLCIgIik6ImxvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbIisgKyt1ZSsiXSIpKyJcbiI7dC5yZXBsYWNlKHAsKGZ1bmN0aW9uKGUsbixyLGksYSx1KXtyZXR1cm4gcnx8KHI9aSksZis9dC5zbGljZShsLHUpLnJlcGxhY2UoRHQsdW4pLG4mJihvPSEwLGYrPSInICtcbl9fZSgiK24rIikgK1xuJyIpLGEmJihzPSEwLGYrPSInO1xuIithKyI7XG5fX3AgKz0gJyIpLHImJihmKz0iJyArXG4oKF9fdCA9ICgiK3IrIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xuJyIpLGw9dStlLmxlbmd0aCxlfSkpLGYrPSInO1xuIjt2YXIgZz1rdC5jYWxsKGUsInZhcmlhYmxlIikmJmUudmFyaWFibGU7aWYoZyl7aWYoZnQudGVzdChnKSl0aHJvdyBuZXcgU3QoIkludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgIil9ZWxzZSBmPSJ3aXRoIChvYmopIHtcbiIrZisiXG59XG4iO2Y9KHM/Zi5yZXBsYWNlKFksIiIpOmYpLnJlcGxhY2UoWCwiJDEiKS5yZXBsYWNlKFcsIiQxOyIpLGY9ImZ1bmN0aW9uKCIrKGd8fCJvYmoiKSsiKSB7XG4iKyhnPyIiOiJvYmogfHwgKG9iaiA9IHt9KTtcbiIpKyJ2YXIgX190LCBfX3AgPSAnJyIrKG8/IiwgX19lID0gXy5lc2NhcGUiOiIiKSsocz8iLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbmZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrZisicmV0dXJuIF9fcFxufSI7dmFyIHk9dHUoKGZ1bmN0aW9uKCl7cmV0dXJuIEF0KHUsZCsicmV0dXJuICIrZikuYXBwbHkobixjKX0pKTtpZih5LnNvdXJjZT1mLFFzKHkpKXRocm93IHk7cmV0dXJuIHl9LHFuLnRpbWVzPWZ1bmN0aW9uKHQsZSl7aWYoKHQ9eWEodCkpPDF8fHQ+ZilyZXR1cm5bXTt2YXIgbj1kLHI9d24odCxkKTtlPWxvKGUpLHQtPWQ7Zm9yKHZhciBpPVFlKHIsZSk7KytuPHQ7KWUobik7cmV0dXJuIGl9LHFuLnRvRmluaXRlPWdhLHFuLnRvSW50ZWdlcj15YSxxbi50b0xlbmd0aD1tYSxxbi50b0xvd2VyPWZ1bmN0aW9uKHQpe3JldHVybiB4YSh0KS50b0xvd2VyQ2FzZSgpfSxxbi50b051bWJlcj12YSxxbi50b1NhZmVJbnRlZ2VyPWZ1bmN0aW9uKHQpe3JldHVybiB0P2NyKHlhKHQpLC1mLGYpOjA9PT10P3Q6MH0scW4udG9TdHJpbmc9eGEscW4udG9VcHBlcj1mdW5jdGlvbih0KXtyZXR1cm4geGEodCkudG9VcHBlckNhc2UoKX0scW4udHJpbT1mdW5jdGlvbih0LGUscil7aWYoKHQ9eGEodCkpJiYocnx8ZT09PW4pKXJldHVybiAkZSh0KTtpZighdHx8IShlPWhpKGUpKSlyZXR1cm4gdDt2YXIgaT1nbih0KSxvPWduKGUpO3JldHVybiBEaShpLHJuKGksbyksb24oaSxvKSsxKS5qb2luKCIiKX0scW4udHJpbUVuZD1mdW5jdGlvbih0LGUscil7aWYoKHQ9eGEodCkpJiYocnx8ZT09PW4pKXJldHVybiB0LnNsaWNlKDAseW4odCkrMSk7aWYoIXR8fCEoZT1oaShlKSkpcmV0dXJuIHQ7dmFyIGk9Z24odCk7cmV0dXJuIERpKGksMCxvbihpLGduKGUpKSsxKS5qb2luKCIiKX0scW4udHJpbVN0YXJ0PWZ1bmN0aW9uKHQsZSxyKXtpZigodD14YSh0KSkmJihyfHxlPT09bikpcmV0dXJuIHQucmVwbGFjZShzdCwiIik7aWYoIXR8fCEoZT1oaShlKSkpcmV0dXJuIHQ7dmFyIGk9Z24odCk7cmV0dXJuIERpKGkscm4oaSxnbihlKSkpLmpvaW4oIiIpfSxxbi50cnVuY2F0ZT1mdW5jdGlvbih0LGUpe3ZhciByPTMwLGk9Ii4uLiI7aWYobmEoZSkpe3ZhciBvPSJzZXBhcmF0b3IiaW4gZT9lLnNlcGFyYXRvcjpvO3I9Imxlbmd0aCJpbiBlP3lhKGUubGVuZ3RoKTpyLGk9Im9taXNzaW9uImluIGU/aGkoZS5vbWlzc2lvbik6aX12YXIgcz0odD14YSh0KSkubGVuZ3RoO2lmKGNuKHQpKXt2YXIgYT1nbih0KTtzPWEubGVuZ3RofWlmKHI+PXMpcmV0dXJuIHQ7dmFyIHU9ci1kbihpKTtpZih1PDEpcmV0dXJuIGk7dmFyIGM9YT9EaShhLDAsdSkuam9pbigiIik6dC5zbGljZSgwLHUpO2lmKG89PT1uKXJldHVybiBjK2k7aWYoYSYmKHUrPWMubGVuZ3RoLXUpLGFhKG8pKXtpZih0LnNsaWNlKHUpLnNlYXJjaChvKSl7dmFyIGwsaD1jO2ZvcihvLmdsb2JhbHx8KG89TXQoby5zb3VyY2UseGEoZ3QuZXhlYyhvKSkrImciKSksby5sYXN0SW5kZXg9MDtsPW8uZXhlYyhoKTspdmFyIGY9bC5pbmRleDtjPWMuc2xpY2UoMCxmPT09bj91OmYpfX1lbHNlIGlmKHQuaW5kZXhPZihoaShvKSx1KSE9dSl7dmFyIHA9Yy5sYXN0SW5kZXhPZihvKTtwPi0xJiYoYz1jLnNsaWNlKDAscCkpfXJldHVybiBjK2l9LHFuLnVuZXNjYXBlPWZ1bmN0aW9uKHQpe3JldHVybih0PXhhKHQpKSYmSy50ZXN0KHQpP3QucmVwbGFjZShILG1uKTp0fSxxbi51bmlxdWVJZD1mdW5jdGlvbih0KXt2YXIgZT0rK3p0O3JldHVybiB4YSh0KStlfSxxbi51cHBlckNhc2U9SmEscW4udXBwZXJGaXJzdD1RYSxxbi5lYWNoPXhzLHFuLmVhY2hSaWdodD13cyxxbi5maXJzdD1IbyxjdShxbixmdW5jdGlvbigpe3ZhciB0PXt9O3JldHVybiBicihxbiwoZnVuY3Rpb24oZSxuKXtrdC5jYWxsKHFuLnByb3RvdHlwZSxuKXx8KHRbbl09ZSl9KSksdH0oKSx7Y2hhaW46ITF9KSxxbi5WRVJTSU9OPSI0LjE3LjIxIixNZShbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLChmdW5jdGlvbih0KXtxblt0XS5wbGFjZWhvbGRlcj1xbn0pKSxNZShbImRyb3AiLCJ0YWtlIl0sKGZ1bmN0aW9uKHQsZSl7WG4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKHIpe3I9cj09PW4/MTp4bih5YShyKSwwKTt2YXIgaT10aGlzLl9fZmlsdGVyZWRfXyYmIWU/bmV3IFhuKHRoaXMpOnRoaXMuY2xvbmUoKTtyZXR1cm4gaS5fX2ZpbHRlcmVkX18/aS5fX3Rha2VDb3VudF9fPXduKHIsaS5fX3Rha2VDb3VudF9fKTppLl9fdmlld3NfXy5wdXNoKHtzaXplOnduKHIsZCksdHlwZTp0KyhpLl9fZGlyX188MD8iUmlnaHQiOiIiKX0pLGl9LFhuLnByb3RvdHlwZVt0KyJSaWdodCJdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJldmVyc2UoKVt0XShlKS5yZXZlcnNlKCl9fSkpLE1lKFsiZmlsdGVyIiwibWFwIiwidGFrZVdoaWxlIl0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZSsxLHI9MT09bnx8Mz09bjtYbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLl9faXRlcmF0ZWVzX18ucHVzaCh7aXRlcmF0ZWU6bG8odCwzKSx0eXBlOm59KSxlLl9fZmlsdGVyZWRfXz1lLl9fZmlsdGVyZWRfX3x8cixlfX0pKSxNZShbImhlYWQiLCJsYXN0Il0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49InRha2UiKyhlPyJSaWdodCI6IiIpO1huLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiB0aGlzW25dKDEpLnZhbHVlKClbMF19fSkpLE1lKFsiaW5pdGlhbCIsInRhaWwiXSwoZnVuY3Rpb24odCxlKXt2YXIgbj0iZHJvcCIrKGU/IiI6IlJpZ2h0Iik7WG4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fP25ldyBYbih0aGlzKTp0aGlzW25dKDEpfX0pKSxYbi5wcm90b3R5cGUuY29tcGFjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcihvdSl9LFhuLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbHRlcih0KS5oZWFkKCl9LFhuLnByb3RvdHlwZS5maW5kTGFzdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZCh0KX0sWG4ucHJvdG90eXBlLmludm9rZU1hcD1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9uZXcgWG4odGhpcyk6dGhpcy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBUcihuLHQsZSl9KSl9KSksWG4ucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maWx0ZXIoQnMobG8odCkpKX0sWG4ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dD15YSh0KTt2YXIgcj10aGlzO3JldHVybiByLl9fZmlsdGVyZWRfXyYmKHQ+MHx8ZTwwKT9uZXcgWG4ocik6KHQ8MD9yPXIudGFrZVJpZ2h0KC10KTp0JiYocj1yLmRyb3AodCkpLGUhPT1uJiYocj0oZT15YShlKSk8MD9yLmRyb3BSaWdodCgtZSk6ci50YWtlKGUtdCkpLHIpfSxYbi5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLnRha2VXaGlsZSh0KS5yZXZlcnNlKCl9LFhuLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFrZShkKX0sYnIoWG4ucHJvdG90eXBlLChmdW5jdGlvbih0LGUpe3ZhciByPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KGUpLGk9L14oPzpoZWFkfGxhc3QpJC8udGVzdChlKSxvPXFuW2k/InRha2UiKygibGFzdCI9PWU/IlJpZ2h0IjoiIik6ZV0scz1pfHwvXmZpbmQvLnRlc3QoZSk7IW98fChxbi5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fd3JhcHBlZF9fLGE9aT9bMV06YXJndW1lbnRzLHU9ZSBpbnN0YW5jZW9mIFhuLGM9YVswXSxsPXV8fFhzKGUpLGg9ZnVuY3Rpb24odCl7dmFyIGU9by5hcHBseShxbixCZShbdF0sYSkpO3JldHVybiBpJiZmP2VbMF06ZX07bCYmciYmImZ1bmN0aW9uIj09dHlwZW9mIGMmJjEhPWMubGVuZ3RoJiYodT1sPSExKTt2YXIgZj10aGlzLl9fY2hhaW5fXyxwPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsZD1zJiYhZixnPXUmJiFwO2lmKCFzJiZsKXtlPWc/ZTpuZXcgWG4odGhpcyk7dmFyIHk9dC5hcHBseShlLGEpO3JldHVybiB5Ll9fYWN0aW9uc19fLnB1c2goe2Z1bmM6Z3MsYXJnczpbaF0sdGhpc0FyZzpufSksbmV3IFluKHksZil9cmV0dXJuIGQmJmc/dC5hcHBseSh0aGlzLGEpOih5PXRoaXMudGhydShoKSxkP2k/eS52YWx1ZSgpWzBdOnkudmFsdWUoKTp5KX0pfSkpLE1lKFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSwoZnVuY3Rpb24odCl7dmFyIGU9T3RbdF0sbj0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QodCk/InRhcCI6InRocnUiLHI9L14oPzpwb3B8c2hpZnQpJC8udGVzdCh0KTtxbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHM7aWYociYmIXRoaXMuX19jaGFpbl9fKXt2YXIgaT10aGlzLnZhbHVlKCk7cmV0dXJuIGUuYXBwbHkoWHMoaSk/aTpbXSx0KX1yZXR1cm4gdGhpc1tuXSgoZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkoWHMobik/bjpbXSx0KX0pKX19KSksYnIoWG4ucHJvdG90eXBlLChmdW5jdGlvbih0LGUpe3ZhciBuPXFuW2VdO2lmKG4pe3ZhciByPW4ubmFtZSsiIjtrdC5jYWxsKE9uLHIpfHwoT25bcl09W10pLE9uW3JdLnB1c2goe25hbWU6ZSxmdW5jOm59KX19KSksT25bcWkobiwyKS5uYW1lXT1be25hbWU6IndyYXBwZXIiLGZ1bmM6bn1dLFhuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBYbih0aGlzLl9fd3JhcHBlZF9fKTtyZXR1cm4gdC5fX2FjdGlvbnNfXz1GaSh0aGlzLl9fYWN0aW9uc19fKSx0Ll9fZGlyX189dGhpcy5fX2Rpcl9fLHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fLHQuX19pdGVyYXRlZXNfXz1GaSh0aGlzLl9faXRlcmF0ZWVzX18pLHQuX190YWtlQ291bnRfXz10aGlzLl9fdGFrZUNvdW50X18sdC5fX3ZpZXdzX189RmkodGhpcy5fX3ZpZXdzX18pLHR9LFhuLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7aWYodGhpcy5fX2ZpbHRlcmVkX18pe3ZhciB0PW5ldyBYbih0aGlzKTt0Ll9fZGlyX189LTEsdC5fX2ZpbHRlcmVkX189ITB9ZWxzZSh0PXRoaXMuY2xvbmUoKSkuX19kaXJfXyo9LTE7cmV0dXJuIHR9LFhuLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX193cmFwcGVkX18udmFsdWUoKSxlPXRoaXMuX19kaXJfXyxuPVhzKHQpLHI9ZTwwLGk9bj90Lmxlbmd0aDowLG89ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0tMSxpPW4ubGVuZ3RoOysrcjxpOyl7dmFyIG89bltyXSxzPW8uc2l6ZTtzd2l0Y2goby50eXBlKXtjYXNlImRyb3AiOnQrPXM7YnJlYWs7Y2FzZSJkcm9wUmlnaHQiOmUtPXM7YnJlYWs7Y2FzZSJ0YWtlIjplPXduKGUsdCtzKTticmVhaztjYXNlInRha2VSaWdodCI6dD14bih0LGUtcyl9fXJldHVybntzdGFydDp0LGVuZDplfX0oMCxpLHRoaXMuX192aWV3c19fKSxzPW8uc3RhcnQsYT1vLmVuZCx1PWEtcyxjPXI/YTpzLTEsbD10aGlzLl9faXRlcmF0ZWVzX18saD1sLmxlbmd0aCxmPTAscD13bih1LHRoaXMuX190YWtlQ291bnRfXyk7aWYoIW58fCFyJiZpPT11JiZwPT11KXJldHVybiB5aSh0LHRoaXMuX19hY3Rpb25zX18pO3ZhciBkPVtdO3Q6Zm9yKDt1LS0mJmY8cDspe2Zvcih2YXIgZz0tMSx5PXRbYys9ZV07KytnPGg7KXt2YXIgbT1sW2ddLHY9bS5pdGVyYXRlZSxfPW0udHlwZSx4PXYoeSk7aWYoMj09Xyl5PXg7ZWxzZSBpZigheCl7aWYoMT09Xyljb250aW51ZSB0O2JyZWFrIHR9fWRbZisrXT15fXJldHVybiBkfSxxbi5wcm90b3R5cGUuYXQ9eXMscW4ucHJvdG90eXBlLmNoYWluPWZ1bmN0aW9uKCl7cmV0dXJuIGRzKHRoaXMpfSxxbi5wcm90b3R5cGUuY29tbWl0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBZbih0aGlzLnZhbHVlKCksdGhpcy5fX2NoYWluX18pfSxxbi5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3RoaXMuX192YWx1ZXNfXz09PW4mJih0aGlzLl9fdmFsdWVzX189ZGEodGhpcy52YWx1ZSgpKSk7dmFyIHQ9dGhpcy5fX2luZGV4X18+PXRoaXMuX192YWx1ZXNfXy5sZW5ndGg7cmV0dXJue2RvbmU6dCx2YWx1ZTp0P246dGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdfX0scW4ucHJvdG90eXBlLnBsYW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPXRoaXM7ciBpbnN0YW5jZW9mIEduOyl7dmFyIGk9VW8ocik7aS5fX2luZGV4X189MCxpLl9fdmFsdWVzX189bixlP28uX193cmFwcGVkX189aTplPWk7dmFyIG89aTtyPXIuX193cmFwcGVkX199cmV0dXJuIG8uX193cmFwcGVkX189dCxlfSxxbi5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX193cmFwcGVkX187aWYodCBpbnN0YW5jZW9mIFhuKXt2YXIgZT10O3JldHVybiB0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCYmKGU9bmV3IFhuKHRoaXMpKSwoZT1lLnJldmVyc2UoKSkuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpncyxhcmdzOltuc10sdGhpc0FyZzpufSksbmV3IFluKGUsdGhpcy5fX2NoYWluX18pfXJldHVybiB0aGlzLnRocnUobnMpfSxxbi5wcm90b3R5cGUudG9KU09OPXFuLnByb3RvdHlwZS52YWx1ZU9mPXFuLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbigpe3JldHVybiB5aSh0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfSxxbi5wcm90b3R5cGUuZmlyc3Q9cW4ucHJvdG90eXBlLmhlYWQsdGUmJihxbi5wcm90b3R5cGVbdGVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxxbn0oKTt2ZT8oKHZlLmV4cG9ydHM9dm4pLl89dm4sbWUuXz12bik6eWUuXz12bn0pLmNhbGwodGUpfSkpO2NvbnN0IEh2PSh0LGUsbik9PntpZihuW2VdKXJldHVybiBudWxsIT09KCh0LGUpPT57Y29uc3Qgbj1NYXRoLm1heCh0LngsZS54KSxyPU1hdGgubWF4KHQueSxlLnkpLGk9TWF0aC5taW4odC54K3Qud2lkdGgsZS54K2Uud2lkdGgpLW4sbz1NYXRoLm1pbih0LnkrdC5oZWlnaHQsZS55K2UuaGVpZ2h0KS1yO3JldHVybiBpPj0wJiZvPj0wP3t4Om4seTpyLHdpZHRoOmksaGVpZ2h0Om99Om51bGx9KSh0LHt4OjAseTowLHdpZHRoOm5bZV0ud2lkdGgsaGVpZ2h0Om5bZV0uaGVpZ2h0fSk7cmV0dXJuITF9O3ZhciBadj1PYmplY3QuZGVmaW5lUHJvcGVydHksS3Y9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsSnY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsUXY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scywkdj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHRfPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsZV89KHQsZSxuKT0+ZSBpbiB0P1p2KHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOnRbZV09bixuXz0odCxlKT0+e2Zvcih2YXIgbiBpbiBlfHwoZT17fSkpJHYuY2FsbChlLG4pJiZlXyh0LG4sZVtuXSk7aWYoUXYpZm9yKHZhciBuIG9mIFF2KGUpKXRfLmNhbGwoZSxuKSYmZV8odCxuLGVbbl0pO3JldHVybiB0fSxyXz0odCxlKT0+S3YodCxKdihlKSk7ZnVuY3Rpb24gaV8odCl7dmFyIGU7Y29uc3R7Y3VycmVudERhdGE6bixkaXNwbGF5UG9pbnRDbG91ZExpc3Q6cixzZWxlY3RlZElEOmksaGlnaGxpZ2h0QXR0cmlidXRlOm8saW1hZ2VTaXplczpzLGNvbmZpZzphLHBvbHlnb25MaXN0OnUsc2VsZWN0ZWRJRHM6Y309dCxsPXtmaWxsOiJ0cmFuc3BhcmVudCIsY29sb3I6ImdyZWVuIn07bGV0IGg9W107cmV0dXJuIG51bGw9PShlPW51bGw9PW4/dm9pZCAwOm4ubWFwcGluZ0ltZ0xpc3QpfHxlLmZvckVhY2goKHQ9Pnt2YXIgZSxuLGYscDtjb25zdCBkPXIucmVkdWNlKCgoZSxuKT0+e3ZhciByLHU7Y29uc3QgYz1uLmlkPT09aXx8bz09PW4uYXR0cmlidXRlLHt0cmFuc2ZlclZpZXdEYXRhOmgsdmlld1JhbmdlUG9pbnRMaXN0OmZ9PW51bGwhPShyPVZ2KG4sdC5jYWxpYix7Y3JlYXRlUmFuZ2U6Y30pKT9yOnt9O2lmKCFofHwhZilyZXR1cm5bXTtjb25zdCBwPWgucmVkdWNlKCgodCxlKT0+ImxpbmUiPT09ZS50eXBlP1suLi50LC4uLmUucG9pbnRMaXN0XTp0KSxbXSksZD1yXyhuXyh7fSwodD0+e2xldCBlPTEvMCxuPTEvMCxyPS0xLzAsaT0tMS8wO2Zvcihjb25zdCBvIG9mIHQpZT1NYXRoLm1pbihlLG8ueCksbj1NYXRoLm1pbihuLG8ueSkscj1NYXRoLm1heChyLG8ueCksaT1NYXRoLm1heChpLG8ueSk7cmV0dXJue3g6ZSx5Om4sd2lkdGg6ci1lLGhlaWdodDppLW59fSkocCkpLHtpbWFnZU5hbWU6dC5wYXRofSk7aWYoIUh2KGQsdC5wYXRoLHMpKXJldHVybiBlO2NvbnN0IGc9bnVsbD09KHU9RnQuZ2V0Q29sb3JGcm9tQ29uZmlnKHthdHRyaWJ1dGU6bi5hdHRyaWJ1dGV9LHJfKG5fKHt9LGEpLHthdHRyaWJ1dGVDb25maWd1cmFibGU6ITB9KSx7fSkpP3ZvaWQgMDp1LnN0cm9rZSx5PSgoe3ZpZXdEYXRhUG9pbnRMaXN0OnQscG9pbnRDbG91ZEJveDplLGRlZmF1bHRWaWV3U3R5bGU6bixzdHJva2U6cn0pPT50P3QubWFwKCh0PT4oe3R5cGU6dC50eXBlLGFubm90YXRpb246cl8obl8oe2lkOmUuaWQscG9pbnRMaXN0OnQucG9pbnRMaXN0fSxuKSx7c3Ryb2tlOnJ9KX0pKSk6W10pKHt2aWV3RGF0YVBvaW50TGlzdDpoLHBvaW50Q2xvdWRCb3g6bixkZWZhdWx0Vmlld1N0eWxlOmwsc3Ryb2tlOmd9KSxtPVsuLi5lLC4uLnldO3JldHVybihudWxsPT1mP3ZvaWQgMDpmLmxlbmd0aCk+MCYmbS51bnNoaWZ0KHt0eXBlOiJwb2x5Z29uIixhbm5vdGF0aW9uOnJfKG5fKHtpZDppLHBvaW50TGlzdDpmfSxsKSx7c3Ryb2tlOmcsZmlsbDoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpIn0pfSksbX0pLFtdKSxnPXNbbnVsbCE9KGU9bnVsbD09dD92b2lkIDA6dC5wYXRoKT9lOiIiXTtnJiZXdi5pc051bWJlcihudWxsPT0obj1udWxsPT10P3ZvaWQgMDp0LmNhbGliKT92b2lkIDA6bi5ncm91bmRIZWlnaHQpJiZ1LmZvckVhY2goKGU9Pntjb25zdCBuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpZighZXx8IW4pcmV0dXJuO2NvbnN0IGk9enYoZSkse1A6byxSOnMsVDphfT1lO2xldCB1O2lmKCExPT09aSl7Y29uc3R7Y29tcG9zZU1hdHJpeDQ6dH09bnVsbCE9KHI9QnYobyxzLGEpKT9yOnt9O2lmKCF0KXJldHVybjt1PXR9Y29uc3QgYz1bXTtyZXR1cm4gdC5mb3JFYWNoKCh0PT57bGV0IG47aWYobj1pP2p2KHQsZSk6dSYmVXYodCx1KSxuKXtjb25zdHt4OnQseTplfT1uO2MucHVzaCh7eDp0LHk6ZX0pfX0pKSxjLnNvbWUoKHQ9PnQueD4wJiZ0Lng8bi53aWR0aCYmdC55PjAmJnQueTxuLmhlaWdodCkpP2M6dm9pZCAwfShlLnBvaW50TGlzdC5tYXAoKGU9Pnt2YXIgbjtyZXR1cm4gcl8obl8oe30sZSkse3o6bnVsbD09KG49bnVsbD09dD92b2lkIDA6dC5jYWxpYik/dm9pZCAwOm4uZ3JvdW5kSGVpZ2h0fSl9KSksbnVsbD09dD92b2lkIDA6dC5jYWxpYixnKTtpZihuKXtjb25zdCB0PUZ0LmdldENvbG9yRnJvbUNvbmZpZyh7YXR0cmlidXRlOmUuYXR0cmlidXRlfSxyXyhuXyh7fSxhKSx7YXR0cmlidXRlQ29uZmlndXJhYmxlOiEwfSkse30pO2QucHVzaCh7dHlwZToicG9seWdvbiIsYW5ub3RhdGlvbjpyXyhuXyh7aWQ6ZS5pZCxwb2ludExpc3Q6bn0sbCkse3N0cm9rZTpudWxsPT10P3ZvaWQgMDp0LnN0cm9rZSxmaWxsOmMuaW5jbHVkZXMoZS5pZCk/bnVsbD09dD92b2lkIDA6dC5maWxsOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNikifSl9KX19KSksaC5wdXNoKHthbm5vdGF0aW9uczpkLHVybDpudWxsPT10P3ZvaWQgMDp0LnVybCxmYWxsYmFja1VybDpudWxsIT0oZj1udWxsPT10P3ZvaWQgMDp0LmZhbGxiYWNrVXJsKT9mOiIiLGNhbE5hbWU6bnVsbD09KHA9bnVsbD09dD92b2lkIDA6dC5jYWxpYik/dm9pZCAwOnAuY2FsTmFtZSxjYWxpYjpudWxsPT10P3ZvaWQgMDp0LmNhbGliLHBhdGg6bnVsbD09dD92b2lkIDA6dC5wYXRofSl9KSksaH1vbm1lc3NhZ2U9dD0+e2NvbnN0e2N1cnJlbnREYXRhOmUsZGlzcGxheVBvaW50Q2xvdWRMaXN0Om4sc2VsZWN0ZWRJRDpyLGhpZ2hsaWdodEF0dHJpYnV0ZTppLGltYWdlU2l6ZXM6byxjb25maWc6cyxwb2x5Z29uTGlzdDphLHNlbGVjdGVkSURzOnV9PXQuZGF0YSxjPWlfKHtjdXJyZW50RGF0YTplLGRpc3BsYXlQb2ludENsb3VkTGlzdDpuLHNlbGVjdGVkSUQ6cixoaWdobGlnaHRBdHRyaWJ1dGU6aSxpbWFnZVNpemVzOm8sY29uZmlnOnMscG9seWdvbkxpc3Q6YSxzZWxlY3RlZElEczp1fSk7cG9zdE1lc3NhZ2UoYyl9fSgpOwoK",null,!1);export{l as default};
|